opencandle 0.11.1 → 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 (653) hide show
  1. package/README.md +20 -24
  2. package/dist/analysts/contracts.js +0 -1
  3. package/dist/analysts/orchestrator.js +0 -1
  4. package/dist/cli-main.js +13 -7
  5. package/dist/cli-options.d.ts +4 -0
  6. package/dist/cli-options.js +33 -0
  7. package/dist/cli.js +8 -3
  8. package/dist/config.js +0 -1
  9. package/dist/doctor/cli-command.js +2 -1
  10. package/dist/doctor/render.js +0 -1
  11. package/dist/doctor/report.js +40 -11
  12. package/dist/gui/server/ask-user-bridge.d.ts +19 -0
  13. package/dist/gui/server/ask-user-bridge.js +55 -0
  14. package/dist/gui/server/automation-heartbeat.d.ts +25 -0
  15. package/dist/gui/server/automation-heartbeat.js +61 -0
  16. package/dist/gui/server/background-quotes.d.ts +39 -0
  17. package/dist/gui/server/background-quotes.js +71 -0
  18. package/dist/gui/server/chat-event-adapter.d.ts +16 -0
  19. package/dist/gui/server/chat-event-adapter.js +263 -0
  20. package/dist/gui/server/gui-session-manager.d.ts +2 -0
  21. package/dist/gui/server/gui-session-manager.js +4 -0
  22. package/dist/gui/server/http-routes.d.ts +69 -0
  23. package/dist/gui/server/http-routes.js +1008 -0
  24. package/dist/gui/server/invoke-tool.d.ts +47 -0
  25. package/dist/gui/server/invoke-tool.js +373 -0
  26. package/dist/gui/server/live-chat-event-adapter.d.ts +19 -0
  27. package/dist/gui/server/live-chat-event-adapter.js +206 -0
  28. package/dist/gui/server/local-session-coordinator.d.ts +26 -0
  29. package/dist/gui/server/local-session-coordinator.js +53 -0
  30. package/dist/gui/server/market-state-api.d.ts +138 -0
  31. package/dist/gui/server/market-state-api.js +355 -0
  32. package/dist/gui/server/model-setup.d.ts +64 -0
  33. package/dist/gui/server/model-setup.js +150 -0
  34. package/dist/gui/server/private-api-access.d.ts +6 -0
  35. package/dist/gui/server/private-api-access.js +53 -0
  36. package/dist/gui/server/projector.d.ts +49 -0
  37. package/dist/gui/server/projector.js +296 -0
  38. package/dist/gui/server/prompt-observation.d.ts +8 -0
  39. package/dist/gui/server/prompt-observation.js +43 -0
  40. package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
  41. package/dist/gui/server/quote-snapshot-store.js +49 -0
  42. package/dist/gui/server/server.d.ts +1 -0
  43. package/dist/gui/server/server.js +259 -0
  44. package/dist/gui/server/session-actions.d.ts +60 -0
  45. package/dist/gui/server/session-actions.js +218 -0
  46. package/dist/gui/server/session-entry-wait.d.ts +27 -0
  47. package/dist/gui/server/session-entry-wait.js +129 -0
  48. package/dist/gui/server/session-list.d.ts +2 -0
  49. package/dist/gui/server/session-list.js +11 -0
  50. package/dist/gui/server/shutdown.d.ts +10 -0
  51. package/dist/gui/server/shutdown.js +29 -0
  52. package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
  53. package/dist/gui/server/tool-invoke-ack.js +26 -0
  54. package/dist/gui/server/tool-metadata.d.ts +93 -0
  55. package/dist/gui/server/tool-metadata.js +148 -0
  56. package/dist/gui/server/websocket.d.ts +9 -0
  57. package/dist/gui/server/websocket.js +124 -0
  58. package/dist/gui/server/writer-lock.d.ts +1 -0
  59. package/dist/gui/server/writer-lock.js +1 -0
  60. package/dist/gui/server/ws-hub.d.ts +50 -0
  61. package/dist/gui/server/ws-hub.js +284 -0
  62. package/dist/gui/shared/chat-events.d.ts +174 -0
  63. package/dist/gui/shared/chat-events.js +13 -0
  64. package/dist/gui/shared/event-reducer.d.ts +3 -0
  65. package/dist/gui/shared/event-reducer.js +187 -0
  66. package/dist/index.js +0 -1
  67. package/dist/infra/cache.js +0 -1
  68. package/dist/infra/freshness.js +0 -1
  69. package/dist/infra/http-client.js +1 -2
  70. package/dist/infra/index.js +0 -1
  71. package/dist/infra/market-calendar.js +0 -1
  72. package/dist/infra/native-dependencies.js +0 -1
  73. package/dist/infra/node-version.js +0 -1
  74. package/dist/infra/open-url.js +0 -1
  75. package/dist/infra/opencandle-paths.js +0 -1
  76. package/dist/infra/rate-limiter.js +0 -1
  77. package/dist/market-state/alert-conditions.js +0 -1
  78. package/dist/market-state/alert-runner.d.ts +1 -0
  79. package/dist/market-state/alert-runner.js +5 -4
  80. package/dist/market-state/daily-report.js +0 -1
  81. package/dist/market-state/local-automation-service.js +0 -1
  82. package/dist/market-state/notification-delivery.js +0 -1
  83. package/dist/market-state/resolve-for-mutation.js +0 -1
  84. package/dist/market-state/resolve.js +0 -1
  85. package/dist/market-state/service.d.ts +26 -21
  86. package/dist/market-state/service.js +175 -36
  87. package/dist/market-state/summaries.js +1 -13
  88. package/dist/memory/index.js +0 -1
  89. package/dist/memory/manager.js +0 -1
  90. package/dist/memory/preference-extractor.js +0 -1
  91. package/dist/memory/retrieval.js +0 -1
  92. package/dist/memory/sqlite.js +60 -11
  93. package/dist/memory/storage.js +0 -1
  94. package/dist/memory/tool-defaults.js +0 -1
  95. package/dist/memory/types.js +0 -1
  96. package/dist/monitor.js +0 -1
  97. package/dist/onboarding/connect.js +0 -1
  98. package/dist/onboarding/credential-interceptor.js +0 -1
  99. package/dist/onboarding/degradation-accumulator.js +0 -1
  100. package/dist/onboarding/prompt-user.d.ts +1 -1
  101. package/dist/onboarding/prompt-user.js +0 -1
  102. package/dist/onboarding/provider-status.js +0 -1
  103. package/dist/onboarding/providers.js +0 -1
  104. package/dist/onboarding/state.js +0 -1
  105. package/dist/onboarding/tool-helpers.js +0 -1
  106. package/dist/onboarding/tool-tags.js +0 -1
  107. package/dist/onboarding/validate-model-key.d.ts +17 -0
  108. package/dist/onboarding/validate-model-key.js +54 -0
  109. package/dist/onboarding/validation.js +0 -1
  110. package/dist/pi/opencandle-extension.js +2 -2
  111. package/dist/pi/session-action-dedupe.js +0 -1
  112. package/dist/pi/session-storage.js +0 -1
  113. package/dist/pi/session-writer-lock.js +0 -1
  114. package/dist/pi/session.js +0 -1
  115. package/dist/pi/setup.d.ts +2 -0
  116. package/dist/pi/setup.js +10 -3
  117. package/dist/pi/tool-adapter.js +0 -1
  118. package/dist/pi/tui-session-coordinator.js +0 -1
  119. package/dist/prompts/context-builder.js +1 -2
  120. package/dist/prompts/disclaimer.js +0 -1
  121. package/dist/prompts/policy-cards.js +0 -1
  122. package/dist/prompts/sections.js +0 -1
  123. package/dist/prompts/symbol-preflight.js +0 -1
  124. package/dist/prompts/workflow-prompts.js +0 -1
  125. package/dist/providers/alpha-vantage.js +2 -3
  126. package/dist/providers/coingecko.js +0 -1
  127. package/dist/providers/errors.js +0 -1
  128. package/dist/providers/exa-search.js +11 -10
  129. package/dist/providers/external-tool-command.js +0 -1
  130. package/dist/providers/external-tool-error.js +0 -1
  131. package/dist/providers/fear-greed.js +0 -1
  132. package/dist/providers/finnhub.js +0 -1
  133. package/dist/providers/fred.js +0 -1
  134. package/dist/providers/index.js +0 -1
  135. package/dist/providers/polymarket.js +0 -1
  136. package/dist/providers/provider-credential-error.js +0 -1
  137. package/dist/providers/reddit-cli.js +0 -1
  138. package/dist/providers/reddit.js +0 -1
  139. package/dist/providers/sec-edgar.js +0 -1
  140. package/dist/providers/tradingview.js +1 -2
  141. package/dist/providers/twitter-cli.js +0 -1
  142. package/dist/providers/twitter.js +0 -1
  143. package/dist/providers/web-search.js +15 -12
  144. package/dist/providers/with-fallback.js +0 -1
  145. package/dist/providers/wrap-provider.js +0 -1
  146. package/dist/providers/yahoo-finance.js +67 -4
  147. package/dist/routing/classify-intent.js +0 -1
  148. package/dist/routing/defaults.js +0 -1
  149. package/dist/routing/entity-extractor.js +2 -3
  150. package/dist/routing/fund-symbols.js +0 -1
  151. package/dist/routing/horizon.js +0 -1
  152. package/dist/routing/index.js +0 -1
  153. package/dist/routing/legacy-rule-router.js +0 -1
  154. package/dist/routing/planning.js +0 -1
  155. package/dist/routing/route-manifest.js +0 -1
  156. package/dist/routing/router-llm-client.d.ts +2 -2
  157. package/dist/routing/router-llm-client.js +0 -1
  158. package/dist/routing/router-prompt.js +0 -1
  159. package/dist/routing/router-types.js +0 -1
  160. package/dist/routing/router.js +1 -2
  161. package/dist/routing/slot-resolver.js +0 -1
  162. package/dist/routing/symbol-disambiguator.js +0 -1
  163. package/dist/routing/turn-context.js +0 -1
  164. package/dist/routing/types.js +0 -1
  165. package/dist/runtime/answer-contracts.js +0 -1
  166. package/dist/runtime/artifact-contracts.js +0 -1
  167. package/dist/runtime/evidence.js +0 -1
  168. package/dist/runtime/numeric-claims.js +0 -1
  169. package/dist/runtime/planning-evidence.js +0 -1
  170. package/dist/runtime/prompt-step.js +0 -1
  171. package/dist/runtime/provider-tracker.js +0 -1
  172. package/dist/runtime/run-context.js +0 -1
  173. package/dist/runtime/session-coordinator.js +0 -1
  174. package/dist/runtime/session-title.js +0 -1
  175. package/dist/runtime/tool-defaults-wrapper.js +0 -1
  176. package/dist/runtime/validation.js +0 -1
  177. package/dist/runtime/workflow-events.js +0 -1
  178. package/dist/runtime/workflow-runner.d.ts +1 -0
  179. package/dist/runtime/workflow-runner.js +8 -3
  180. package/dist/runtime/workflow-types.js +0 -1
  181. package/dist/sentiment/adapters/finnhub.js +0 -1
  182. package/dist/sentiment/adapters/reddit.js +0 -1
  183. package/dist/sentiment/adapters/twitter.js +0 -1
  184. package/dist/sentiment/adapters/web.js +0 -1
  185. package/dist/sentiment/index.js +4 -2
  186. package/dist/sentiment/insights.js +0 -1
  187. package/dist/sentiment/keywords.js +0 -1
  188. package/dist/sentiment/pipeline.js +0 -1
  189. package/dist/sentiment/scorer.js +0 -1
  190. package/dist/sentiment/store.js +0 -1
  191. package/dist/sentiment/trends.js +0 -1
  192. package/dist/sentiment/types.js +0 -1
  193. package/dist/system-prompt.js +0 -1
  194. package/dist/tool-kit.js +0 -1
  195. package/dist/tools/fundamentals/company-overview.d.ts +1 -1
  196. package/dist/tools/fundamentals/company-overview.js +2 -1
  197. package/dist/tools/fundamentals/comps.js +6 -4
  198. package/dist/tools/fundamentals/dcf.js +0 -1
  199. package/dist/tools/fundamentals/earnings.d.ts +1 -1
  200. package/dist/tools/fundamentals/earnings.js +2 -1
  201. package/dist/tools/fundamentals/financials.js +2 -1
  202. package/dist/tools/fundamentals/sec-filings.js +0 -1
  203. package/dist/tools/index.d.ts +116 -2
  204. package/dist/tools/index.js +0 -1
  205. package/dist/tools/interaction/ask-user.js +11 -1
  206. package/dist/tools/macro/event-probabilities.js +0 -1
  207. package/dist/tools/macro/fear-greed.d.ts +1 -1
  208. package/dist/tools/macro/fear-greed.js +0 -1
  209. package/dist/tools/macro/fred-data.d.ts +1 -1
  210. package/dist/tools/macro/fred-data.js +2 -1
  211. package/dist/tools/market/crypto-history.js +0 -1
  212. package/dist/tools/market/crypto-price.d.ts +2 -2
  213. package/dist/tools/market/crypto-price.js +0 -1
  214. package/dist/tools/market/screen-stocks.js +0 -1
  215. package/dist/tools/market/search-ticker.js +1 -2
  216. package/dist/tools/market/stock-history.js +0 -1
  217. package/dist/tools/market/stock-quote.d.ts +2 -2
  218. package/dist/tools/market/stock-quote.js +0 -1
  219. package/dist/tools/options/greeks.js +0 -1
  220. package/dist/tools/options/option-chain.d.ts +2 -2
  221. package/dist/tools/options/option-chain.js +0 -1
  222. package/dist/tools/portfolio/alerts.d.ts +2 -1
  223. package/dist/tools/portfolio/alerts.js +228 -2
  224. package/dist/tools/portfolio/correlation.js +23 -5
  225. package/dist/tools/portfolio/daily-report.js +0 -1
  226. package/dist/tools/portfolio/holdings-overlap.js +0 -1
  227. package/dist/tools/portfolio/notifications.js +0 -1
  228. package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
  229. package/dist/tools/portfolio/risk-analysis.js +0 -1
  230. package/dist/tools/portfolio/tracker.d.ts +3 -1
  231. package/dist/tools/portfolio/tracker.js +57 -10
  232. package/dist/tools/portfolio/watchlist.d.ts +3 -6
  233. package/dist/tools/portfolio/watchlist.js +101 -110
  234. package/dist/tools/sentiment/insight-format.js +0 -1
  235. package/dist/tools/sentiment/query-match.js +0 -1
  236. package/dist/tools/sentiment/reddit-sentiment.js +0 -1
  237. package/dist/tools/sentiment/sentiment-summary.js +8 -4
  238. package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
  239. package/dist/tools/sentiment/sentiment-trend.js +6 -2
  240. package/dist/tools/sentiment/twitter-sentiment.js +0 -1
  241. package/dist/tools/sentiment/untrusted-text.js +0 -1
  242. package/dist/tools/sentiment/web-search.d.ts +1 -1
  243. package/dist/tools/sentiment/web-search.js +0 -1
  244. package/dist/tools/sentiment/web-sentiment.js +0 -1
  245. package/dist/tools/technical/backtest.js +0 -1
  246. package/dist/tools/technical/indicators.js +0 -1
  247. package/dist/types/fundamentals.js +0 -1
  248. package/dist/types/index.js +0 -1
  249. package/dist/types/macro.js +0 -1
  250. package/dist/types/market.d.ts +6 -0
  251. package/dist/types/market.js +0 -1
  252. package/dist/types/options.js +0 -1
  253. package/dist/types/portfolio.js +0 -1
  254. package/dist/types/prediction-markets.js +0 -1
  255. package/dist/types/sentiment.js +0 -1
  256. package/dist/workflows/compare-assets.js +0 -1
  257. package/dist/workflows/index.js +0 -1
  258. package/dist/workflows/options-screener.js +0 -1
  259. package/dist/workflows/portfolio-builder.js +0 -1
  260. package/gui/web/dist/assets/CatalogOverlay-CAc7e3Pf.js +1 -0
  261. package/gui/web/dist/assets/index-BOEKd9wT.css +2 -0
  262. package/gui/web/dist/assets/index-C-H05cQ2.js +65 -0
  263. package/gui/web/dist/index.html +2 -2
  264. package/package.json +11 -12
  265. package/dist/analysts/contracts.js.map +0 -1
  266. package/dist/analysts/orchestrator.js.map +0 -1
  267. package/dist/cli-main.js.map +0 -1
  268. package/dist/cli.js.map +0 -1
  269. package/dist/config.js.map +0 -1
  270. package/dist/doctor/cli-command.js.map +0 -1
  271. package/dist/doctor/render.js.map +0 -1
  272. package/dist/doctor/report.js.map +0 -1
  273. package/dist/index.js.map +0 -1
  274. package/dist/infra/cache.js.map +0 -1
  275. package/dist/infra/freshness.js.map +0 -1
  276. package/dist/infra/http-client.js.map +0 -1
  277. package/dist/infra/index.js.map +0 -1
  278. package/dist/infra/market-calendar.js.map +0 -1
  279. package/dist/infra/native-dependencies.js.map +0 -1
  280. package/dist/infra/node-version.js.map +0 -1
  281. package/dist/infra/open-url.js.map +0 -1
  282. package/dist/infra/opencandle-paths.js.map +0 -1
  283. package/dist/infra/rate-limiter.js.map +0 -1
  284. package/dist/market-state/alert-conditions.js.map +0 -1
  285. package/dist/market-state/alert-runner.js.map +0 -1
  286. package/dist/market-state/daily-report.js.map +0 -1
  287. package/dist/market-state/local-automation-service.js.map +0 -1
  288. package/dist/market-state/notification-delivery.js.map +0 -1
  289. package/dist/market-state/resolve-for-mutation.js.map +0 -1
  290. package/dist/market-state/resolve.js.map +0 -1
  291. package/dist/market-state/service.js.map +0 -1
  292. package/dist/market-state/summaries.js.map +0 -1
  293. package/dist/memory/index.js.map +0 -1
  294. package/dist/memory/manager.js.map +0 -1
  295. package/dist/memory/preference-extractor.js.map +0 -1
  296. package/dist/memory/retrieval.js.map +0 -1
  297. package/dist/memory/sqlite.js.map +0 -1
  298. package/dist/memory/storage.js.map +0 -1
  299. package/dist/memory/tool-defaults.js.map +0 -1
  300. package/dist/memory/types.js.map +0 -1
  301. package/dist/monitor.js.map +0 -1
  302. package/dist/onboarding/connect.js.map +0 -1
  303. package/dist/onboarding/credential-interceptor.js.map +0 -1
  304. package/dist/onboarding/degradation-accumulator.js.map +0 -1
  305. package/dist/onboarding/prompt-user.js.map +0 -1
  306. package/dist/onboarding/provider-status.js.map +0 -1
  307. package/dist/onboarding/providers.js.map +0 -1
  308. package/dist/onboarding/state.js.map +0 -1
  309. package/dist/onboarding/tool-helpers.js.map +0 -1
  310. package/dist/onboarding/tool-tags.js.map +0 -1
  311. package/dist/onboarding/validation.js.map +0 -1
  312. package/dist/pi/opencandle-extension.js.map +0 -1
  313. package/dist/pi/session-action-dedupe.js.map +0 -1
  314. package/dist/pi/session-storage.js.map +0 -1
  315. package/dist/pi/session-writer-lock.js.map +0 -1
  316. package/dist/pi/session.js.map +0 -1
  317. package/dist/pi/setup.js.map +0 -1
  318. package/dist/pi/tool-adapter.js.map +0 -1
  319. package/dist/pi/tui-session-coordinator.js.map +0 -1
  320. package/dist/prompts/context-builder.js.map +0 -1
  321. package/dist/prompts/disclaimer.js.map +0 -1
  322. package/dist/prompts/policy-cards.js.map +0 -1
  323. package/dist/prompts/sections.js.map +0 -1
  324. package/dist/prompts/symbol-preflight.js.map +0 -1
  325. package/dist/prompts/workflow-prompts.js.map +0 -1
  326. package/dist/providers/alpha-vantage.js.map +0 -1
  327. package/dist/providers/coingecko.js.map +0 -1
  328. package/dist/providers/errors.js.map +0 -1
  329. package/dist/providers/exa-search.js.map +0 -1
  330. package/dist/providers/external-tool-command.js.map +0 -1
  331. package/dist/providers/external-tool-error.js.map +0 -1
  332. package/dist/providers/fear-greed.js.map +0 -1
  333. package/dist/providers/finnhub.js.map +0 -1
  334. package/dist/providers/fred.js.map +0 -1
  335. package/dist/providers/index.js.map +0 -1
  336. package/dist/providers/polymarket.js.map +0 -1
  337. package/dist/providers/provider-credential-error.js.map +0 -1
  338. package/dist/providers/reddit-cli.js.map +0 -1
  339. package/dist/providers/reddit.js.map +0 -1
  340. package/dist/providers/sec-edgar.js.map +0 -1
  341. package/dist/providers/tradingview.js.map +0 -1
  342. package/dist/providers/twitter-cli.js.map +0 -1
  343. package/dist/providers/twitter.js.map +0 -1
  344. package/dist/providers/web-search.js.map +0 -1
  345. package/dist/providers/with-fallback.js.map +0 -1
  346. package/dist/providers/wrap-provider.js.map +0 -1
  347. package/dist/providers/yahoo-finance.js.map +0 -1
  348. package/dist/routing/classify-intent.js.map +0 -1
  349. package/dist/routing/defaults.js.map +0 -1
  350. package/dist/routing/entity-extractor.js.map +0 -1
  351. package/dist/routing/fund-symbols.js.map +0 -1
  352. package/dist/routing/horizon.js.map +0 -1
  353. package/dist/routing/index.js.map +0 -1
  354. package/dist/routing/legacy-rule-router.js.map +0 -1
  355. package/dist/routing/planning.js.map +0 -1
  356. package/dist/routing/route-manifest.js.map +0 -1
  357. package/dist/routing/router-llm-client.js.map +0 -1
  358. package/dist/routing/router-prompt.js.map +0 -1
  359. package/dist/routing/router-types.js.map +0 -1
  360. package/dist/routing/router.js.map +0 -1
  361. package/dist/routing/slot-resolver.js.map +0 -1
  362. package/dist/routing/symbol-disambiguator.js.map +0 -1
  363. package/dist/routing/turn-context.js.map +0 -1
  364. package/dist/routing/types.js.map +0 -1
  365. package/dist/runtime/answer-contracts.js.map +0 -1
  366. package/dist/runtime/artifact-contracts.js.map +0 -1
  367. package/dist/runtime/evidence.js.map +0 -1
  368. package/dist/runtime/numeric-claims.js.map +0 -1
  369. package/dist/runtime/planning-evidence.js.map +0 -1
  370. package/dist/runtime/prompt-step.js.map +0 -1
  371. package/dist/runtime/provider-tracker.js.map +0 -1
  372. package/dist/runtime/run-context.js.map +0 -1
  373. package/dist/runtime/session-coordinator.js.map +0 -1
  374. package/dist/runtime/session-title.js.map +0 -1
  375. package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
  376. package/dist/runtime/validation.js.map +0 -1
  377. package/dist/runtime/workflow-events.js.map +0 -1
  378. package/dist/runtime/workflow-runner.js.map +0 -1
  379. package/dist/runtime/workflow-types.js.map +0 -1
  380. package/dist/sentiment/adapters/finnhub.js.map +0 -1
  381. package/dist/sentiment/adapters/reddit.js.map +0 -1
  382. package/dist/sentiment/adapters/twitter.js.map +0 -1
  383. package/dist/sentiment/adapters/web.js.map +0 -1
  384. package/dist/sentiment/index.js.map +0 -1
  385. package/dist/sentiment/insights.js.map +0 -1
  386. package/dist/sentiment/keywords.js.map +0 -1
  387. package/dist/sentiment/pipeline.js.map +0 -1
  388. package/dist/sentiment/scorer.js.map +0 -1
  389. package/dist/sentiment/store.js.map +0 -1
  390. package/dist/sentiment/trends.js.map +0 -1
  391. package/dist/sentiment/types.js.map +0 -1
  392. package/dist/system-prompt.js.map +0 -1
  393. package/dist/tool-kit.js.map +0 -1
  394. package/dist/tools/fundamentals/company-overview.js.map +0 -1
  395. package/dist/tools/fundamentals/comps.js.map +0 -1
  396. package/dist/tools/fundamentals/dcf.js.map +0 -1
  397. package/dist/tools/fundamentals/earnings.js.map +0 -1
  398. package/dist/tools/fundamentals/financials.js.map +0 -1
  399. package/dist/tools/fundamentals/sec-filings.js.map +0 -1
  400. package/dist/tools/index.js.map +0 -1
  401. package/dist/tools/interaction/ask-user.js.map +0 -1
  402. package/dist/tools/macro/event-probabilities.js.map +0 -1
  403. package/dist/tools/macro/fear-greed.js.map +0 -1
  404. package/dist/tools/macro/fred-data.js.map +0 -1
  405. package/dist/tools/market/crypto-history.js.map +0 -1
  406. package/dist/tools/market/crypto-price.js.map +0 -1
  407. package/dist/tools/market/screen-stocks.js.map +0 -1
  408. package/dist/tools/market/search-ticker.js.map +0 -1
  409. package/dist/tools/market/stock-history.js.map +0 -1
  410. package/dist/tools/market/stock-quote.js.map +0 -1
  411. package/dist/tools/options/greeks.js.map +0 -1
  412. package/dist/tools/options/option-chain.js.map +0 -1
  413. package/dist/tools/portfolio/alerts.js.map +0 -1
  414. package/dist/tools/portfolio/correlation.js.map +0 -1
  415. package/dist/tools/portfolio/daily-report.js.map +0 -1
  416. package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
  417. package/dist/tools/portfolio/notifications.js.map +0 -1
  418. package/dist/tools/portfolio/risk-analysis.js.map +0 -1
  419. package/dist/tools/portfolio/tracker.js.map +0 -1
  420. package/dist/tools/portfolio/watchlist.js.map +0 -1
  421. package/dist/tools/sentiment/insight-format.js.map +0 -1
  422. package/dist/tools/sentiment/query-match.js.map +0 -1
  423. package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
  424. package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
  425. package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
  426. package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
  427. package/dist/tools/sentiment/untrusted-text.js.map +0 -1
  428. package/dist/tools/sentiment/web-search.js.map +0 -1
  429. package/dist/tools/sentiment/web-sentiment.js.map +0 -1
  430. package/dist/tools/technical/backtest.js.map +0 -1
  431. package/dist/tools/technical/indicators.js.map +0 -1
  432. package/dist/types/fundamentals.js.map +0 -1
  433. package/dist/types/index.js.map +0 -1
  434. package/dist/types/macro.js.map +0 -1
  435. package/dist/types/market.js.map +0 -1
  436. package/dist/types/options.js.map +0 -1
  437. package/dist/types/portfolio.js.map +0 -1
  438. package/dist/types/prediction-markets.js.map +0 -1
  439. package/dist/types/sentiment.js.map +0 -1
  440. package/dist/workflows/compare-assets.js.map +0 -1
  441. package/dist/workflows/index.js.map +0 -1
  442. package/dist/workflows/options-screener.js.map +0 -1
  443. package/dist/workflows/portfolio-builder.js.map +0 -1
  444. package/gui/server/ask-user-bridge.ts +0 -89
  445. package/gui/server/automation-heartbeat.ts +0 -97
  446. package/gui/server/background-quotes.ts +0 -127
  447. package/gui/server/chat-event-adapter.ts +0 -294
  448. package/gui/server/gui-session-manager.ts +0 -5
  449. package/gui/server/http-routes.ts +0 -1201
  450. package/gui/server/invoke-tool.ts +0 -490
  451. package/gui/server/live-chat-event-adapter.ts +0 -243
  452. package/gui/server/local-session-coordinator.ts +0 -97
  453. package/gui/server/market-state-api.ts +0 -331
  454. package/gui/server/model-setup.ts +0 -254
  455. package/gui/server/package.json +0 -5
  456. package/gui/server/private-api-access.ts +0 -62
  457. package/gui/server/projector.ts +0 -392
  458. package/gui/server/prompt-observation.ts +0 -58
  459. package/gui/server/quote-snapshot-store.ts +0 -50
  460. package/gui/server/server.ts +0 -289
  461. package/gui/server/session-actions.ts +0 -323
  462. package/gui/server/session-entry-wait.ts +0 -179
  463. package/gui/server/shutdown.ts +0 -47
  464. package/gui/server/tool-invoke-ack.ts +0 -49
  465. package/gui/server/tool-metadata.ts +0 -167
  466. package/gui/server/websocket.ts +0 -138
  467. package/gui/server/writer-lock.ts +0 -1
  468. package/gui/server/ws-hub.ts +0 -403
  469. package/gui/shared/chat-events.ts +0 -165
  470. package/gui/shared/event-reducer.ts +0 -220
  471. package/gui/web/dist/assets/CatalogOverlay-DZ1niyQm.js +0 -1
  472. package/gui/web/dist/assets/index-D4F9AJnn.css +0 -2
  473. package/gui/web/dist/assets/index-DtqMMBTr.js +0 -65
  474. package/src/analysts/contracts.ts +0 -176
  475. package/src/analysts/orchestrator.ts +0 -244
  476. package/src/cli-main.ts +0 -510
  477. package/src/cli.ts +0 -17
  478. package/src/config.ts +0 -272
  479. package/src/doctor/cli-command.ts +0 -83
  480. package/src/doctor/render.ts +0 -37
  481. package/src/doctor/report.ts +0 -638
  482. package/src/index.ts +0 -5
  483. package/src/infra/cache.ts +0 -127
  484. package/src/infra/freshness.ts +0 -165
  485. package/src/infra/http-client.ts +0 -134
  486. package/src/infra/index.ts +0 -14
  487. package/src/infra/market-calendar.ts +0 -193
  488. package/src/infra/native-dependencies.ts +0 -84
  489. package/src/infra/node-version.ts +0 -23
  490. package/src/infra/open-url.ts +0 -28
  491. package/src/infra/opencandle-paths.ts +0 -53
  492. package/src/infra/rate-limiter.ts +0 -77
  493. package/src/market-state/alert-conditions.ts +0 -82
  494. package/src/market-state/alert-runner.ts +0 -863
  495. package/src/market-state/daily-report.ts +0 -237
  496. package/src/market-state/local-automation-service.ts +0 -162
  497. package/src/market-state/notification-delivery.ts +0 -158
  498. package/src/market-state/resolve-for-mutation.ts +0 -24
  499. package/src/market-state/resolve.ts +0 -112
  500. package/src/market-state/service.ts +0 -2208
  501. package/src/market-state/summaries.ts +0 -75
  502. package/src/memory/index.ts +0 -10
  503. package/src/memory/manager.ts +0 -190
  504. package/src/memory/preference-extractor.ts +0 -106
  505. package/src/memory/retrieval.ts +0 -71
  506. package/src/memory/sqlite.ts +0 -577
  507. package/src/memory/storage.ts +0 -195
  508. package/src/memory/tool-defaults.ts +0 -108
  509. package/src/memory/types.ts +0 -71
  510. package/src/monitor.ts +0 -123
  511. package/src/onboarding/connect.ts +0 -177
  512. package/src/onboarding/credential-interceptor.ts +0 -122
  513. package/src/onboarding/degradation-accumulator.ts +0 -77
  514. package/src/onboarding/prompt-user.ts +0 -85
  515. package/src/onboarding/provider-status.ts +0 -382
  516. package/src/onboarding/providers.ts +0 -442
  517. package/src/onboarding/state.ts +0 -216
  518. package/src/onboarding/tool-helpers.ts +0 -104
  519. package/src/onboarding/tool-tags.ts +0 -244
  520. package/src/onboarding/validation.ts +0 -152
  521. package/src/pi/opencandle-extension.ts +0 -1294
  522. package/src/pi/session-action-dedupe.ts +0 -155
  523. package/src/pi/session-storage.ts +0 -5
  524. package/src/pi/session-writer-lock.ts +0 -426
  525. package/src/pi/session.ts +0 -84
  526. package/src/pi/setup.ts +0 -399
  527. package/src/pi/tool-adapter.ts +0 -49
  528. package/src/pi/tui-session-coordinator.ts +0 -351
  529. package/src/prompts/context-builder.ts +0 -326
  530. package/src/prompts/disclaimer.ts +0 -9
  531. package/src/prompts/policy-cards.ts +0 -228
  532. package/src/prompts/sections.ts +0 -46
  533. package/src/prompts/symbol-preflight.ts +0 -80
  534. package/src/prompts/workflow-prompts.ts +0 -504
  535. package/src/providers/alpha-vantage.ts +0 -340
  536. package/src/providers/coingecko.ts +0 -95
  537. package/src/providers/errors.ts +0 -9
  538. package/src/providers/exa-search.ts +0 -375
  539. package/src/providers/external-tool-command.ts +0 -164
  540. package/src/providers/external-tool-error.ts +0 -20
  541. package/src/providers/fear-greed.ts +0 -45
  542. package/src/providers/finnhub.ts +0 -125
  543. package/src/providers/fred.ts +0 -83
  544. package/src/providers/index.ts +0 -17
  545. package/src/providers/polymarket.ts +0 -214
  546. package/src/providers/provider-credential-error.ts +0 -23
  547. package/src/providers/reddit-cli.ts +0 -286
  548. package/src/providers/reddit.ts +0 -106
  549. package/src/providers/sec-edgar.ts +0 -326
  550. package/src/providers/tradingview.ts +0 -399
  551. package/src/providers/twitter-cli.ts +0 -202
  552. package/src/providers/twitter.ts +0 -102
  553. package/src/providers/web-search.ts +0 -303
  554. package/src/providers/with-fallback.ts +0 -42
  555. package/src/providers/wrap-provider.ts +0 -105
  556. package/src/providers/yahoo-finance.ts +0 -984
  557. package/src/routing/classify-intent.ts +0 -380
  558. package/src/routing/defaults.ts +0 -29
  559. package/src/routing/entity-extractor.ts +0 -557
  560. package/src/routing/fund-symbols.ts +0 -58
  561. package/src/routing/horizon.ts +0 -7
  562. package/src/routing/index.ts +0 -70
  563. package/src/routing/legacy-rule-router.ts +0 -13
  564. package/src/routing/planning.ts +0 -829
  565. package/src/routing/route-manifest.ts +0 -308
  566. package/src/routing/router-llm-client.ts +0 -64
  567. package/src/routing/router-prompt.ts +0 -159
  568. package/src/routing/router-types.ts +0 -84
  569. package/src/routing/router.ts +0 -1332
  570. package/src/routing/slot-resolver.ts +0 -213
  571. package/src/routing/symbol-disambiguator.ts +0 -72
  572. package/src/routing/turn-context.ts +0 -108
  573. package/src/routing/types.ts +0 -77
  574. package/src/runtime/answer-contracts.ts +0 -693
  575. package/src/runtime/artifact-contracts.ts +0 -77
  576. package/src/runtime/evidence.ts +0 -78
  577. package/src/runtime/numeric-claims.ts +0 -108
  578. package/src/runtime/planning-evidence.ts +0 -597
  579. package/src/runtime/prompt-step.ts +0 -185
  580. package/src/runtime/provider-tracker.ts +0 -40
  581. package/src/runtime/run-context.ts +0 -32
  582. package/src/runtime/session-coordinator.ts +0 -1037
  583. package/src/runtime/session-title.ts +0 -60
  584. package/src/runtime/tool-defaults-wrapper.ts +0 -43
  585. package/src/runtime/validation.ts +0 -211
  586. package/src/runtime/workflow-events.ts +0 -77
  587. package/src/runtime/workflow-runner.ts +0 -182
  588. package/src/runtime/workflow-types.ts +0 -105
  589. package/src/sentiment/adapters/finnhub.ts +0 -49
  590. package/src/sentiment/adapters/reddit.ts +0 -65
  591. package/src/sentiment/adapters/twitter.ts +0 -36
  592. package/src/sentiment/adapters/web.ts +0 -44
  593. package/src/sentiment/index.ts +0 -49
  594. package/src/sentiment/insights.ts +0 -269
  595. package/src/sentiment/keywords.ts +0 -31
  596. package/src/sentiment/pipeline.ts +0 -91
  597. package/src/sentiment/scorer.ts +0 -89
  598. package/src/sentiment/store.ts +0 -260
  599. package/src/sentiment/trends.ts +0 -96
  600. package/src/sentiment/types.ts +0 -112
  601. package/src/system-prompt.ts +0 -115
  602. package/src/tool-kit.ts +0 -69
  603. package/src/tools/AGENTS.md +0 -36
  604. package/src/tools/fundamentals/company-overview.ts +0 -64
  605. package/src/tools/fundamentals/comps.ts +0 -180
  606. package/src/tools/fundamentals/dcf.ts +0 -447
  607. package/src/tools/fundamentals/earnings.ts +0 -57
  608. package/src/tools/fundamentals/financials.ts +0 -63
  609. package/src/tools/fundamentals/sec-filings.ts +0 -105
  610. package/src/tools/index.ts +0 -104
  611. package/src/tools/interaction/ask-user.ts +0 -93
  612. package/src/tools/macro/event-probabilities.ts +0 -141
  613. package/src/tools/macro/fear-greed.ts +0 -41
  614. package/src/tools/macro/fred-data.ts +0 -92
  615. package/src/tools/market/crypto-history.ts +0 -72
  616. package/src/tools/market/crypto-price.ts +0 -65
  617. package/src/tools/market/screen-stocks.ts +0 -290
  618. package/src/tools/market/search-ticker.ts +0 -254
  619. package/src/tools/market/stock-history.ts +0 -104
  620. package/src/tools/market/stock-quote.ts +0 -73
  621. package/src/tools/options/greeks.ts +0 -81
  622. package/src/tools/options/option-chain.ts +0 -134
  623. package/src/tools/portfolio/alerts.ts +0 -457
  624. package/src/tools/portfolio/correlation.ts +0 -189
  625. package/src/tools/portfolio/daily-report.ts +0 -107
  626. package/src/tools/portfolio/holdings-overlap.ts +0 -139
  627. package/src/tools/portfolio/notifications.ts +0 -45
  628. package/src/tools/portfolio/risk-analysis.ts +0 -173
  629. package/src/tools/portfolio/tracker.ts +0 -308
  630. package/src/tools/portfolio/watchlist.ts +0 -288
  631. package/src/tools/sentiment/insight-format.ts +0 -50
  632. package/src/tools/sentiment/query-match.ts +0 -117
  633. package/src/tools/sentiment/reddit-sentiment.ts +0 -403
  634. package/src/tools/sentiment/sentiment-summary.ts +0 -383
  635. package/src/tools/sentiment/sentiment-trend.ts +0 -75
  636. package/src/tools/sentiment/twitter-sentiment.ts +0 -287
  637. package/src/tools/sentiment/untrusted-text.ts +0 -21
  638. package/src/tools/sentiment/web-search.ts +0 -186
  639. package/src/tools/sentiment/web-sentiment.ts +0 -96
  640. package/src/tools/technical/backtest.ts +0 -336
  641. package/src/tools/technical/indicators.ts +0 -281
  642. package/src/types/fundamentals.ts +0 -47
  643. package/src/types/index.ts +0 -26
  644. package/src/types/macro.ts +0 -27
  645. package/src/types/market.ts +0 -46
  646. package/src/types/options.ts +0 -53
  647. package/src/types/portfolio.ts +0 -83
  648. package/src/types/prediction-markets.ts +0 -13
  649. package/src/types/sentiment.ts +0 -129
  650. package/src/workflows/compare-assets.ts +0 -89
  651. package/src/workflows/index.ts +0 -3
  652. package/src/workflows/options-screener.ts +0 -125
  653. package/src/workflows/portfolio-builder.ts +0 -63
@@ -2,4 +2,3 @@ export { Cache, cache, TTL } from "./cache.js";
2
2
  export { HttpError, httpGet } from "./http-client.js";
3
3
  export { ensureOpenCandleHomeDir, ensureParentDir, getBrowserProfileDir, getConfigPath, getLogsDir, getOnboardingPath, getOpenCandleHomeDir, getStateDbPath, resolveOpenCandlePath, } from "./opencandle-paths.js";
4
4
  export { RateLimiter, rateLimiter } from "./rate-limiter.js";
5
- //# sourceMappingURL=index.js.map
@@ -134,4 +134,3 @@ function dateKey(date) {
134
134
  const day = String(date.getUTCDate()).padStart(2, "0");
135
135
  return `${year}-${month}-${day}`;
136
136
  }
137
- //# sourceMappingURL=market-calendar.js.map
@@ -56,4 +56,3 @@ export async function ensureOpenCandleNativeDependencies() {
56
56
  },
57
57
  });
58
58
  }
59
- //# sourceMappingURL=native-dependencies.js.map
@@ -17,4 +17,3 @@ export function assertSupportedNodeVersion(version) {
17
17
  if (message)
18
18
  throw new Error(message);
19
19
  }
20
- //# sourceMappingURL=node-version.js.map
@@ -26,4 +26,3 @@ export function openInBrowser(url) {
26
26
  child.unref();
27
27
  });
28
28
  }
29
- //# sourceMappingURL=open-url.js.map
@@ -41,4 +41,3 @@ export function getLogsDir() {
41
41
  export function getBrowserProfileDir() {
42
42
  return resolveOpenCandlePath("browser-profile");
43
43
  }
44
- //# sourceMappingURL=opencandle-paths.js.map
@@ -50,4 +50,3 @@ rateLimiter.configure("tradingview", 5, 1); // 5 burst, 1 req/s sustained
50
50
  rateLimiter.configure("polymarket", 10, 5); // 10 burst, 5 req/s sustained
51
51
  // SEC EDGAR fair-access guideline is 10 req/s; stay below it.
52
52
  rateLimiter.configure("sec_edgar", 5, 5); // 5 burst, 5 req/s sustained
53
- //# sourceMappingURL=rate-limiter.js.map
@@ -20,4 +20,3 @@ export function rsiThreshold(period, threshold, direction) {
20
20
  export function volumeSpike(lookbackPeriod, multiplier) {
21
21
  return { lookback_period: lookbackPeriod, multiplier };
22
22
  }
23
- //# sourceMappingURL=alert-conditions.js.map
@@ -3,6 +3,7 @@ import type { MarketStateService } from "./service.js";
3
3
  export interface AlertQuoteObservation {
4
4
  symbol: string;
5
5
  value: number;
6
+ observationDetails?: Record<string, number>;
6
7
  sourceProvider: string;
7
8
  observedAt: string;
8
9
  providerDataAt?: string | null;
@@ -161,6 +161,7 @@ export async function runAlertChecks(service, options) {
161
161
  const observed = {
162
162
  value: observation.value,
163
163
  field: observationField(item.rule),
164
+ ...observation.observationDetails,
164
165
  at: now,
165
166
  observedAt: now,
166
167
  providerDataAt: observation.providerDataAt ?? null,
@@ -324,7 +325,7 @@ async function loadHistoricalObservation(item, providers, providerBudget, histor
324
325
  const latestSma = sma.at(-1);
325
326
  if (latestClose == null || latestSma == null)
326
327
  return null;
327
- return historicalObservation(item.instrument.symbol, latestClose - latestSma, bars.at(-1)?.date ?? null, now);
328
+ return historicalObservation(item.instrument.symbol, latestClose - latestSma, bars.at(-1)?.date ?? null, now, { price: latestClose, sma: latestSma });
328
329
  }
329
330
  if (item.rule.conditionType === "percent_move") {
330
331
  const bars = await loadHistory(item.instrument.symbol, "5d", "1d", providers, providerBudget, historyCache, now);
@@ -345,7 +346,7 @@ async function loadHistoricalObservation(item, providers, providerBudget, histor
345
346
  const slow = computeSMA(closes, slowPeriod).at(-1);
346
347
  if (fast == null || slow == null)
347
348
  return null;
348
- return historicalObservation(item.instrument.symbol, roundObservation(fast - slow), bars.at(-1)?.date ?? null, now);
349
+ return historicalObservation(item.instrument.symbol, roundObservation(fast - slow), bars.at(-1)?.date ?? null, now, { fast_sma: fast, slow_sma: slow });
349
350
  }
350
351
  if (item.rule.conditionType === "rsi_threshold") {
351
352
  const condition = item.rule.conditionJson;
@@ -412,10 +413,11 @@ function isProviderWideFailure(reason) {
412
413
  normalized.includes("econn") ||
413
414
  normalized.includes("enotfound"));
414
415
  }
415
- function historicalObservation(symbol, value, providerDataAt, now) {
416
+ function historicalObservation(symbol, value, providerDataAt, now, observationDetails) {
416
417
  return {
417
418
  symbol,
418
419
  value,
420
+ observationDetails,
419
421
  sourceProvider: "yahoo",
420
422
  observedAt: now,
421
423
  providerDataAt,
@@ -631,4 +633,3 @@ function alertDedupeKey(rule, observation, triggerType) {
631
633
  observation.value,
632
634
  ].join(":");
633
635
  }
634
- //# sourceMappingURL=alert-runner.js.map
@@ -165,4 +165,3 @@ function numberPart(parts, type) {
165
165
  throw new Error(`Missing ${type} in formatted date`);
166
166
  return Number(value);
167
167
  }
168
- //# sourceMappingURL=daily-report.js.map
@@ -116,4 +116,3 @@ async function runDueReports(service, params) {
116
116
  }
117
117
  return runs;
118
118
  }
119
- //# sourceMappingURL=local-automation-service.js.map
@@ -136,4 +136,3 @@ function webhookUrlHost(raw) {
136
136
  return "(invalid URL)";
137
137
  }
138
138
  }
139
- //# sourceMappingURL=notification-delivery.js.map
@@ -12,4 +12,3 @@ export async function resolveInstrumentForMutation(symbol) {
12
12
  throw error;
13
13
  }
14
14
  }
15
- //# sourceMappingURL=resolve-for-mutation.js.map
@@ -86,4 +86,3 @@ function assetTypeFromQuoteType(quoteType, symbol) {
86
86
  return "equity";
87
87
  return inferAssetType(symbol.toUpperCase());
88
88
  }
89
- //# sourceMappingURL=resolve.js.map
@@ -55,12 +55,6 @@ export interface WatchlistItemRecord {
55
55
  assetType: string;
56
56
  exchange: string | null;
57
57
  currency: string | null;
58
- targetPrice: number | null;
59
- stopPrice: number | null;
60
- priceCurrency: string | null;
61
- thesis: string | null;
62
- notes: string | null;
63
- tags: string[] | null;
64
58
  source: string | null;
65
59
  sourceRowId: string | null;
66
60
  sourceMetadata: unknown;
@@ -226,32 +220,28 @@ export declare class MarketStateService {
226
220
  private readonly db;
227
221
  constructor(db: Database.Database);
228
222
  getDefaultWatchlist(): CollectionRecord;
223
+ listWatchlists(): CollectionRecord[];
224
+ createWatchlist(name: string): CollectionRecord;
225
+ getWatchlistByName(name: string): CollectionRecord | null;
226
+ renameWatchlist(currentName: string, nextName: string): CollectionRecord;
227
+ deleteWatchlist(name: string): CollectionRecord;
228
+ getOrCreateWatchlist(name?: string | null): CollectionRecord;
229
229
  getDefaultPortfolio(): CollectionRecord;
230
+ listPortfolios(): CollectionRecord[];
231
+ createPortfolio(name: string, baseCurrency?: string): CollectionRecord;
232
+ getPortfolioByName(name: string): CollectionRecord | null;
233
+ renamePortfolio(currentName: string, nextName: string): CollectionRecord;
234
+ getOrCreatePortfolio(name?: string | null): CollectionRecord;
230
235
  findInstrumentByAlias(lookup: InstrumentAliasLookup): InstrumentRecord | null;
231
236
  addWatchlistItem(params: {
232
237
  instrument: InstrumentInput;
233
238
  watchlistId?: number;
234
- targetPrice?: number | null;
235
- stopPrice?: number | null;
236
- priceCurrency?: string | null;
237
- thesis?: string | null;
238
- notes?: string | null;
239
- tags?: string[];
240
239
  source?: string;
241
240
  sourceRowId?: string;
242
241
  sourceMetadata?: unknown;
243
242
  }): WatchlistItemRecord;
244
243
  listWatchlistItems(watchlistId?: number): WatchlistItemRecord[];
245
244
  removeWatchlistItemBySymbol(symbol: string, watchlistId?: number): boolean;
246
- updateWatchlistItemBySymbol(symbol: string, params: {
247
- watchlistId?: number;
248
- targetPrice?: number | null;
249
- stopPrice?: number | null;
250
- priceCurrency?: string | null;
251
- thesis?: string | null;
252
- notes?: string | null;
253
- tags?: string[];
254
- }): WatchlistItemRecord | null;
255
245
  addPortfolioLot(params: {
256
246
  instrument: InstrumentInput;
257
247
  portfolioId?: number;
@@ -300,6 +290,21 @@ export declare class MarketStateService {
300
290
  }): AlertRuleRecord;
301
291
  listAlertRules(): AlertRuleRecord[];
302
292
  setAlertRuleEnabled(id: number, enabled: boolean): AlertRuleRecord | null;
293
+ updateAlertRule(id: number, params: {
294
+ scopeType?: AlertScopeType;
295
+ scopeId?: number | null;
296
+ instrumentId?: number | null;
297
+ conditionType?: string;
298
+ conditionVersion?: number;
299
+ condition?: unknown;
300
+ timeframe?: string;
301
+ enabled?: boolean;
302
+ checkIntervalSeconds?: number | null;
303
+ nextCheckAt?: string | null;
304
+ cooldownSeconds?: number | null;
305
+ retriggerMode?: string;
306
+ }): AlertRuleRecord | null;
307
+ deleteAlertRule(id: number): AlertRuleRecord | null;
303
308
  getInstrument(id: number): InstrumentRecord | null;
304
309
  upsertInstrumentRecord(input: InstrumentInput): InstrumentRecord;
305
310
  acquireAutomationRunnerLease(params: {
@@ -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
@@ -14,18 +14,7 @@ export function formatWatchlistSummary(items, limit = 8) {
14
14
  return [];
15
15
  const lines = ["Watchlist:"];
16
16
  for (const item of items.slice(0, limit)) {
17
- const parts = [
18
- item.targetPrice == null
19
- ? null
20
- : `target ${formatMoney(item.targetPrice, item.priceCurrency ?? item.currency ?? "USD")}`,
21
- item.stopPrice == null
22
- ? null
23
- : `stop ${formatMoney(item.stopPrice, item.priceCurrency ?? item.currency ?? "USD")}`,
24
- item.thesis ? `thesis: ${item.thesis}` : null,
25
- item.tags && item.tags.length > 0 ? `tags: ${item.tags.join(", ")}` : null,
26
- item.notes ? `notes: ${item.notes}` : null,
27
- ].filter((part) => part != null);
28
- lines.push(`- ${item.symbol}${item.name ? ` (${item.name})` : ""}${parts.length > 0 ? ` — ${parts.join("; ")}` : ""}`);
17
+ lines.push(`- ${item.symbol}${item.name ? ` (${item.name})` : ""}`);
29
18
  }
30
19
  return lines;
31
20
  }
@@ -67,4 +56,3 @@ function truncateText(value, maxLength) {
67
56
  return value;
68
57
  return `${value.slice(0, maxLength - 3)}...`;
69
58
  }
70
- //# sourceMappingURL=summaries.js.map
@@ -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