opencandle 0.11.1 → 0.13.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 (678) hide show
  1. package/README.md +50 -186
  2. package/dist/analysts/contracts.js +0 -1
  3. package/dist/analysts/orchestrator.js +0 -1
  4. package/dist/cli-main.js +22 -15
  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.d.ts +4 -0
  9. package/dist/config.js +1 -1
  10. package/dist/doctor/cli-command.js +9 -5
  11. package/dist/doctor/render.js +0 -1
  12. package/dist/doctor/report.js +53 -11
  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 +388 -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/history-snapshot-store.d.ts +8 -0
  24. package/dist/gui/server/history-snapshot-store.js +43 -0
  25. package/dist/gui/server/http-routes.d.ts +71 -0
  26. package/dist/gui/server/http-routes.js +1033 -0
  27. package/dist/gui/server/invoke-tool.d.ts +47 -0
  28. package/dist/gui/server/invoke-tool.js +373 -0
  29. package/dist/gui/server/live-chat-event-adapter.d.ts +21 -0
  30. package/dist/gui/server/live-chat-event-adapter.js +224 -0
  31. package/dist/gui/server/local-session-coordinator.d.ts +26 -0
  32. package/dist/gui/server/local-session-coordinator.js +53 -0
  33. package/dist/gui/server/market-indices-api.d.ts +21 -0
  34. package/dist/gui/server/market-indices-api.js +26 -0
  35. package/dist/gui/server/market-indices-snapshot-store.d.ts +12 -0
  36. package/dist/gui/server/market-indices-snapshot-store.js +56 -0
  37. package/dist/gui/server/market-state-api.d.ts +250 -0
  38. package/dist/gui/server/market-state-api.js +597 -0
  39. package/dist/gui/server/model-setup.d.ts +55 -0
  40. package/dist/gui/server/model-setup.js +154 -0
  41. package/dist/gui/server/private-api-access.d.ts +6 -0
  42. package/dist/gui/server/private-api-access.js +53 -0
  43. package/dist/gui/server/projector.d.ts +49 -0
  44. package/dist/gui/server/projector.js +296 -0
  45. package/dist/gui/server/prompt-observation.d.ts +8 -0
  46. package/dist/gui/server/prompt-observation.js +43 -0
  47. package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
  48. package/dist/gui/server/quote-snapshot-store.js +49 -0
  49. package/dist/gui/server/server.d.ts +1 -0
  50. package/dist/gui/server/server.js +262 -0
  51. package/dist/gui/server/session-actions.d.ts +60 -0
  52. package/dist/gui/server/session-actions.js +218 -0
  53. package/dist/gui/server/session-entry-wait.d.ts +27 -0
  54. package/dist/gui/server/session-entry-wait.js +129 -0
  55. package/dist/gui/server/session-list.d.ts +2 -0
  56. package/dist/gui/server/session-list.js +11 -0
  57. package/dist/gui/server/shutdown.d.ts +10 -0
  58. package/dist/gui/server/shutdown.js +29 -0
  59. package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
  60. package/dist/gui/server/tool-invoke-ack.js +26 -0
  61. package/dist/gui/server/tool-metadata.d.ts +93 -0
  62. package/dist/gui/server/tool-metadata.js +148 -0
  63. package/dist/gui/server/websocket.d.ts +9 -0
  64. package/dist/gui/server/websocket.js +124 -0
  65. package/dist/gui/server/writer-lock.d.ts +1 -0
  66. package/dist/gui/server/writer-lock.js +1 -0
  67. package/dist/gui/server/ws-hub.d.ts +50 -0
  68. package/dist/gui/server/ws-hub.js +284 -0
  69. package/dist/gui/shared/chat-events.d.ts +174 -0
  70. package/dist/gui/shared/chat-events.js +13 -0
  71. package/dist/gui/shared/event-reducer.d.ts +3 -0
  72. package/dist/gui/shared/event-reducer.js +187 -0
  73. package/dist/index.js +0 -1
  74. package/dist/infra/cache.d.ts +4 -0
  75. package/dist/infra/cache.js +4 -1
  76. package/dist/infra/freshness.js +0 -1
  77. package/dist/infra/http-client.js +1 -2
  78. package/dist/infra/index.js +0 -1
  79. package/dist/infra/lse-byte-budget.d.ts +10 -0
  80. package/dist/infra/lse-byte-budget.js +47 -0
  81. package/dist/infra/market-calendar.js +0 -1
  82. package/dist/infra/native-dependencies.js +0 -1
  83. package/dist/infra/node-version.js +0 -1
  84. package/dist/infra/open-url.js +0 -1
  85. package/dist/infra/opencandle-paths.js +0 -1
  86. package/dist/infra/rate-limiter.js +1 -1
  87. package/dist/market-state/alert-conditions.js +0 -1
  88. package/dist/market-state/alert-runner.d.ts +1 -0
  89. package/dist/market-state/alert-runner.js +5 -4
  90. package/dist/market-state/daily-report.js +0 -1
  91. package/dist/market-state/local-automation-service.js +0 -1
  92. package/dist/market-state/notification-delivery.js +0 -1
  93. package/dist/market-state/resolve-for-mutation.js +0 -1
  94. package/dist/market-state/resolve.js +0 -1
  95. package/dist/market-state/service.d.ts +26 -21
  96. package/dist/market-state/service.js +175 -36
  97. package/dist/market-state/summaries.js +1 -13
  98. package/dist/memory/index.js +0 -1
  99. package/dist/memory/manager.js +0 -1
  100. package/dist/memory/preference-extractor.js +0 -1
  101. package/dist/memory/retrieval.js +0 -1
  102. package/dist/memory/sqlite.js +60 -11
  103. package/dist/memory/storage.js +0 -1
  104. package/dist/memory/tool-defaults.js +0 -1
  105. package/dist/memory/types.js +0 -1
  106. package/dist/monitor.js +0 -1
  107. package/dist/onboarding/connect.js +0 -1
  108. package/dist/onboarding/credential-interceptor.js +0 -1
  109. package/dist/onboarding/degradation-accumulator.js +0 -1
  110. package/dist/onboarding/prompt-user.d.ts +1 -1
  111. package/dist/onboarding/prompt-user.js +0 -1
  112. package/dist/onboarding/provider-status.js +0 -1
  113. package/dist/onboarding/providers.d.ts +16 -1
  114. package/dist/onboarding/providers.js +20 -1
  115. package/dist/onboarding/state.js +0 -1
  116. package/dist/onboarding/tool-helpers.js +0 -1
  117. package/dist/onboarding/tool-tags.js +0 -1
  118. package/dist/onboarding/validate-model-key.d.ts +17 -0
  119. package/dist/onboarding/validate-model-key.js +86 -0
  120. package/dist/onboarding/validation.js +8 -1
  121. package/dist/pi/opencandle-extension.d.ts +2 -1
  122. package/dist/pi/opencandle-extension.js +4 -4
  123. package/dist/pi/session-action-dedupe.js +0 -1
  124. package/dist/pi/session-storage.js +0 -1
  125. package/dist/pi/session-writer-lock.js +0 -1
  126. package/dist/pi/session.d.ts +2 -3
  127. package/dist/pi/session.js +7 -6
  128. package/dist/pi/setup.d.ts +4 -2
  129. package/dist/pi/setup.js +60 -61
  130. package/dist/pi/tool-adapter.js +0 -1
  131. package/dist/pi/tui-session-coordinator.js +0 -1
  132. package/dist/prompts/context-builder.js +1 -2
  133. package/dist/prompts/disclaimer.js +0 -1
  134. package/dist/prompts/policy-cards.js +0 -1
  135. package/dist/prompts/sections.js +0 -1
  136. package/dist/prompts/symbol-preflight.js +0 -1
  137. package/dist/prompts/workflow-prompts.js +16 -15
  138. package/dist/providers/alpha-vantage.js +2 -3
  139. package/dist/providers/coingecko.js +0 -1
  140. package/dist/providers/errors.js +0 -1
  141. package/dist/providers/exa-search.js +11 -10
  142. package/dist/providers/external-tool-command.js +0 -1
  143. package/dist/providers/external-tool-error.js +0 -1
  144. package/dist/providers/fear-greed.js +0 -1
  145. package/dist/providers/finnhub.js +0 -1
  146. package/dist/providers/fred.js +0 -1
  147. package/dist/providers/index.d.ts +1 -0
  148. package/dist/providers/index.js +1 -1
  149. package/dist/providers/lse.d.ts +35 -0
  150. package/dist/providers/lse.js +284 -0
  151. package/dist/providers/polymarket.js +22 -6
  152. package/dist/providers/provider-credential-error.js +0 -1
  153. package/dist/providers/reddit-cli.js +0 -1
  154. package/dist/providers/reddit.js +0 -1
  155. package/dist/providers/sec-edgar.js +0 -1
  156. package/dist/providers/tradingview.js +1 -2
  157. package/dist/providers/twitter-cli.js +0 -1
  158. package/dist/providers/twitter.js +0 -1
  159. package/dist/providers/web-search.js +15 -12
  160. package/dist/providers/with-fallback.js +0 -1
  161. package/dist/providers/wrap-provider.js +1 -1
  162. package/dist/providers/yahoo-finance.js +68 -4
  163. package/dist/routing/classify-intent.js +0 -1
  164. package/dist/routing/defaults.js +0 -1
  165. package/dist/routing/entity-extractor.js +2 -3
  166. package/dist/routing/fund-symbols.js +0 -1
  167. package/dist/routing/horizon.js +0 -1
  168. package/dist/routing/index.js +0 -1
  169. package/dist/routing/legacy-rule-router.js +0 -1
  170. package/dist/routing/planning.js +0 -1
  171. package/dist/routing/route-manifest.js +1 -1
  172. package/dist/routing/router-llm-client.d.ts +2 -2
  173. package/dist/routing/router-llm-client.js +0 -1
  174. package/dist/routing/router-prompt.js +0 -1
  175. package/dist/routing/router-types.js +0 -1
  176. package/dist/routing/router.js +9 -3
  177. package/dist/routing/slot-resolver.js +0 -1
  178. package/dist/routing/symbol-disambiguator.js +0 -1
  179. package/dist/routing/turn-context.js +0 -1
  180. package/dist/routing/types.js +0 -1
  181. package/dist/runtime/answer-contracts.js +0 -1
  182. package/dist/runtime/artifact-contracts.js +0 -1
  183. package/dist/runtime/evidence.d.ts +1 -0
  184. package/dist/runtime/evidence.js +1 -2
  185. package/dist/runtime/numeric-claims.js +0 -1
  186. package/dist/runtime/planning-evidence.js +0 -1
  187. package/dist/runtime/prompt-step.js +0 -1
  188. package/dist/runtime/provider-tracker.js +0 -1
  189. package/dist/runtime/run-context.js +0 -1
  190. package/dist/runtime/session-coordinator.d.ts +2 -2
  191. package/dist/runtime/session-coordinator.js +2 -3
  192. package/dist/runtime/session-title.js +0 -1
  193. package/dist/runtime/tool-defaults-wrapper.js +0 -1
  194. package/dist/runtime/validation.js +0 -1
  195. package/dist/runtime/workflow-events.js +0 -1
  196. package/dist/runtime/workflow-runner.d.ts +1 -0
  197. package/dist/runtime/workflow-runner.js +8 -3
  198. package/dist/runtime/workflow-types.js +0 -1
  199. package/dist/sentiment/adapters/finnhub.js +0 -1
  200. package/dist/sentiment/adapters/reddit.js +0 -1
  201. package/dist/sentiment/adapters/twitter.js +0 -1
  202. package/dist/sentiment/adapters/web.js +0 -1
  203. package/dist/sentiment/index.js +4 -2
  204. package/dist/sentiment/insights.js +0 -1
  205. package/dist/sentiment/keywords.js +0 -1
  206. package/dist/sentiment/pipeline.js +0 -1
  207. package/dist/sentiment/scorer.js +0 -1
  208. package/dist/sentiment/store.js +0 -1
  209. package/dist/sentiment/trends.js +0 -1
  210. package/dist/sentiment/types.js +0 -1
  211. package/dist/system-prompt.js +0 -1
  212. package/dist/tool-kit.js +0 -1
  213. package/dist/tools/fundamentals/company-overview.d.ts +1 -1
  214. package/dist/tools/fundamentals/company-overview.js +2 -1
  215. package/dist/tools/fundamentals/comps.js +6 -4
  216. package/dist/tools/fundamentals/dcf.js +37 -9
  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 +88 -9
  220. package/dist/tools/fundamentals/sec-filings.js +0 -1
  221. package/dist/tools/index.d.ts +121 -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.js +0 -1
  225. package/dist/tools/macro/fear-greed.d.ts +1 -1
  226. package/dist/tools/macro/fear-greed.js +0 -1
  227. package/dist/tools/macro/fred-data.d.ts +1 -1
  228. package/dist/tools/macro/fred-data.js +2 -1
  229. package/dist/tools/market/crypto-history.js +0 -1
  230. package/dist/tools/market/crypto-price.d.ts +2 -2
  231. package/dist/tools/market/crypto-price.js +0 -1
  232. package/dist/tools/market/price-comparison.d.ts +30 -0
  233. package/dist/tools/market/price-comparison.js +202 -0
  234. package/dist/tools/market/screen-stocks.js +0 -1
  235. package/dist/tools/market/search-ticker.js +1 -2
  236. package/dist/tools/market/stock-history.d.ts +18 -3
  237. package/dist/tools/market/stock-history.js +132 -18
  238. package/dist/tools/market/stock-quote.d.ts +2 -2
  239. package/dist/tools/market/stock-quote.js +0 -1
  240. package/dist/tools/options/greeks.js +0 -1
  241. package/dist/tools/options/option-chain.d.ts +2 -2
  242. package/dist/tools/options/option-chain.js +0 -1
  243. package/dist/tools/portfolio/alerts.d.ts +2 -1
  244. package/dist/tools/portfolio/alerts.js +228 -2
  245. package/dist/tools/portfolio/correlation.d.ts +1 -1
  246. package/dist/tools/portfolio/correlation.js +23 -5
  247. package/dist/tools/portfolio/daily-report.js +0 -1
  248. package/dist/tools/portfolio/holdings-overlap.js +0 -1
  249. package/dist/tools/portfolio/notifications.js +0 -1
  250. package/dist/tools/portfolio/risk-analysis.d.ts +2 -2
  251. package/dist/tools/portfolio/risk-analysis.js +0 -1
  252. package/dist/tools/portfolio/tracker.d.ts +3 -1
  253. package/dist/tools/portfolio/tracker.js +57 -10
  254. package/dist/tools/portfolio/watchlist.d.ts +3 -6
  255. package/dist/tools/portfolio/watchlist.js +101 -110
  256. package/dist/tools/sentiment/insight-format.js +0 -1
  257. package/dist/tools/sentiment/query-match.js +0 -1
  258. package/dist/tools/sentiment/reddit-sentiment.js +0 -1
  259. package/dist/tools/sentiment/sentiment-summary.js +8 -4
  260. package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
  261. package/dist/tools/sentiment/sentiment-trend.js +6 -2
  262. package/dist/tools/sentiment/twitter-sentiment.js +0 -1
  263. package/dist/tools/sentiment/untrusted-text.js +0 -1
  264. package/dist/tools/sentiment/web-search.d.ts +1 -1
  265. package/dist/tools/sentiment/web-search.js +0 -1
  266. package/dist/tools/sentiment/web-sentiment.js +0 -1
  267. package/dist/tools/technical/backtest.js +0 -1
  268. package/dist/tools/technical/indicators.js +0 -1
  269. package/dist/types/fundamentals.js +0 -1
  270. package/dist/types/index.js +0 -1
  271. package/dist/types/macro.js +0 -1
  272. package/dist/types/market.d.ts +8 -0
  273. package/dist/types/market.js +0 -1
  274. package/dist/types/options.js +0 -1
  275. package/dist/types/portfolio.js +0 -1
  276. package/dist/types/prediction-markets.js +0 -1
  277. package/dist/types/sentiment.js +0 -1
  278. package/dist/workflows/compare-assets.js +0 -1
  279. package/dist/workflows/index.js +0 -1
  280. package/dist/workflows/options-screener.js +0 -1
  281. package/dist/workflows/portfolio-builder.js +0 -1
  282. package/gui/web/dist/assets/CatalogOverlay-Cy8Fq0fn.js +1 -0
  283. package/gui/web/dist/assets/allocation-donut-DgBRIKCk.js +52 -0
  284. package/gui/web/dist/assets/index-DIlFyIOO.js +66 -0
  285. package/gui/web/dist/assets/index-DS4jESOB.css +2 -0
  286. package/gui/web/dist/assets/market-chart-DammaCjH.js +1 -0
  287. package/gui/web/dist/assets/utils-CnADgYgh.js +1 -0
  288. package/gui/web/dist/index.html +3 -2
  289. package/package.json +23 -26
  290. package/dist/analysts/contracts.js.map +0 -1
  291. package/dist/analysts/orchestrator.js.map +0 -1
  292. package/dist/cli-main.js.map +0 -1
  293. package/dist/cli.js.map +0 -1
  294. package/dist/config.js.map +0 -1
  295. package/dist/doctor/cli-command.js.map +0 -1
  296. package/dist/doctor/render.js.map +0 -1
  297. package/dist/doctor/report.js.map +0 -1
  298. package/dist/index.js.map +0 -1
  299. package/dist/infra/cache.js.map +0 -1
  300. package/dist/infra/freshness.js.map +0 -1
  301. package/dist/infra/http-client.js.map +0 -1
  302. package/dist/infra/index.js.map +0 -1
  303. package/dist/infra/market-calendar.js.map +0 -1
  304. package/dist/infra/native-dependencies.js.map +0 -1
  305. package/dist/infra/node-version.js.map +0 -1
  306. package/dist/infra/open-url.js.map +0 -1
  307. package/dist/infra/opencandle-paths.js.map +0 -1
  308. package/dist/infra/rate-limiter.js.map +0 -1
  309. package/dist/market-state/alert-conditions.js.map +0 -1
  310. package/dist/market-state/alert-runner.js.map +0 -1
  311. package/dist/market-state/daily-report.js.map +0 -1
  312. package/dist/market-state/local-automation-service.js.map +0 -1
  313. package/dist/market-state/notification-delivery.js.map +0 -1
  314. package/dist/market-state/resolve-for-mutation.js.map +0 -1
  315. package/dist/market-state/resolve.js.map +0 -1
  316. package/dist/market-state/service.js.map +0 -1
  317. package/dist/market-state/summaries.js.map +0 -1
  318. package/dist/memory/index.js.map +0 -1
  319. package/dist/memory/manager.js.map +0 -1
  320. package/dist/memory/preference-extractor.js.map +0 -1
  321. package/dist/memory/retrieval.js.map +0 -1
  322. package/dist/memory/sqlite.js.map +0 -1
  323. package/dist/memory/storage.js.map +0 -1
  324. package/dist/memory/tool-defaults.js.map +0 -1
  325. package/dist/memory/types.js.map +0 -1
  326. package/dist/monitor.js.map +0 -1
  327. package/dist/onboarding/connect.js.map +0 -1
  328. package/dist/onboarding/credential-interceptor.js.map +0 -1
  329. package/dist/onboarding/degradation-accumulator.js.map +0 -1
  330. package/dist/onboarding/prompt-user.js.map +0 -1
  331. package/dist/onboarding/provider-status.js.map +0 -1
  332. package/dist/onboarding/providers.js.map +0 -1
  333. package/dist/onboarding/state.js.map +0 -1
  334. package/dist/onboarding/tool-helpers.js.map +0 -1
  335. package/dist/onboarding/tool-tags.js.map +0 -1
  336. package/dist/onboarding/validation.js.map +0 -1
  337. package/dist/pi/opencandle-extension.js.map +0 -1
  338. package/dist/pi/session-action-dedupe.js.map +0 -1
  339. package/dist/pi/session-storage.js.map +0 -1
  340. package/dist/pi/session-writer-lock.js.map +0 -1
  341. package/dist/pi/session.js.map +0 -1
  342. package/dist/pi/setup.js.map +0 -1
  343. package/dist/pi/tool-adapter.js.map +0 -1
  344. package/dist/pi/tui-session-coordinator.js.map +0 -1
  345. package/dist/prompts/context-builder.js.map +0 -1
  346. package/dist/prompts/disclaimer.js.map +0 -1
  347. package/dist/prompts/policy-cards.js.map +0 -1
  348. package/dist/prompts/sections.js.map +0 -1
  349. package/dist/prompts/symbol-preflight.js.map +0 -1
  350. package/dist/prompts/workflow-prompts.js.map +0 -1
  351. package/dist/providers/alpha-vantage.js.map +0 -1
  352. package/dist/providers/coingecko.js.map +0 -1
  353. package/dist/providers/errors.js.map +0 -1
  354. package/dist/providers/exa-search.js.map +0 -1
  355. package/dist/providers/external-tool-command.js.map +0 -1
  356. package/dist/providers/external-tool-error.js.map +0 -1
  357. package/dist/providers/fear-greed.js.map +0 -1
  358. package/dist/providers/finnhub.js.map +0 -1
  359. package/dist/providers/fred.js.map +0 -1
  360. package/dist/providers/index.js.map +0 -1
  361. package/dist/providers/polymarket.js.map +0 -1
  362. package/dist/providers/provider-credential-error.js.map +0 -1
  363. package/dist/providers/reddit-cli.js.map +0 -1
  364. package/dist/providers/reddit.js.map +0 -1
  365. package/dist/providers/sec-edgar.js.map +0 -1
  366. package/dist/providers/tradingview.js.map +0 -1
  367. package/dist/providers/twitter-cli.js.map +0 -1
  368. package/dist/providers/twitter.js.map +0 -1
  369. package/dist/providers/web-search.js.map +0 -1
  370. package/dist/providers/with-fallback.js.map +0 -1
  371. package/dist/providers/wrap-provider.js.map +0 -1
  372. package/dist/providers/yahoo-finance.js.map +0 -1
  373. package/dist/routing/classify-intent.js.map +0 -1
  374. package/dist/routing/defaults.js.map +0 -1
  375. package/dist/routing/entity-extractor.js.map +0 -1
  376. package/dist/routing/fund-symbols.js.map +0 -1
  377. package/dist/routing/horizon.js.map +0 -1
  378. package/dist/routing/index.js.map +0 -1
  379. package/dist/routing/legacy-rule-router.js.map +0 -1
  380. package/dist/routing/planning.js.map +0 -1
  381. package/dist/routing/route-manifest.js.map +0 -1
  382. package/dist/routing/router-llm-client.js.map +0 -1
  383. package/dist/routing/router-prompt.js.map +0 -1
  384. package/dist/routing/router-types.js.map +0 -1
  385. package/dist/routing/router.js.map +0 -1
  386. package/dist/routing/slot-resolver.js.map +0 -1
  387. package/dist/routing/symbol-disambiguator.js.map +0 -1
  388. package/dist/routing/turn-context.js.map +0 -1
  389. package/dist/routing/types.js.map +0 -1
  390. package/dist/runtime/answer-contracts.js.map +0 -1
  391. package/dist/runtime/artifact-contracts.js.map +0 -1
  392. package/dist/runtime/evidence.js.map +0 -1
  393. package/dist/runtime/numeric-claims.js.map +0 -1
  394. package/dist/runtime/planning-evidence.js.map +0 -1
  395. package/dist/runtime/prompt-step.js.map +0 -1
  396. package/dist/runtime/provider-tracker.js.map +0 -1
  397. package/dist/runtime/run-context.js.map +0 -1
  398. package/dist/runtime/session-coordinator.js.map +0 -1
  399. package/dist/runtime/session-title.js.map +0 -1
  400. package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
  401. package/dist/runtime/validation.js.map +0 -1
  402. package/dist/runtime/workflow-events.js.map +0 -1
  403. package/dist/runtime/workflow-runner.js.map +0 -1
  404. package/dist/runtime/workflow-types.js.map +0 -1
  405. package/dist/sentiment/adapters/finnhub.js.map +0 -1
  406. package/dist/sentiment/adapters/reddit.js.map +0 -1
  407. package/dist/sentiment/adapters/twitter.js.map +0 -1
  408. package/dist/sentiment/adapters/web.js.map +0 -1
  409. package/dist/sentiment/index.js.map +0 -1
  410. package/dist/sentiment/insights.js.map +0 -1
  411. package/dist/sentiment/keywords.js.map +0 -1
  412. package/dist/sentiment/pipeline.js.map +0 -1
  413. package/dist/sentiment/scorer.js.map +0 -1
  414. package/dist/sentiment/store.js.map +0 -1
  415. package/dist/sentiment/trends.js.map +0 -1
  416. package/dist/sentiment/types.js.map +0 -1
  417. package/dist/system-prompt.js.map +0 -1
  418. package/dist/tool-kit.js.map +0 -1
  419. package/dist/tools/fundamentals/company-overview.js.map +0 -1
  420. package/dist/tools/fundamentals/comps.js.map +0 -1
  421. package/dist/tools/fundamentals/dcf.js.map +0 -1
  422. package/dist/tools/fundamentals/earnings.js.map +0 -1
  423. package/dist/tools/fundamentals/financials.js.map +0 -1
  424. package/dist/tools/fundamentals/sec-filings.js.map +0 -1
  425. package/dist/tools/index.js.map +0 -1
  426. package/dist/tools/interaction/ask-user.js.map +0 -1
  427. package/dist/tools/macro/event-probabilities.js.map +0 -1
  428. package/dist/tools/macro/fear-greed.js.map +0 -1
  429. package/dist/tools/macro/fred-data.js.map +0 -1
  430. package/dist/tools/market/crypto-history.js.map +0 -1
  431. package/dist/tools/market/crypto-price.js.map +0 -1
  432. package/dist/tools/market/screen-stocks.js.map +0 -1
  433. package/dist/tools/market/search-ticker.js.map +0 -1
  434. package/dist/tools/market/stock-history.js.map +0 -1
  435. package/dist/tools/market/stock-quote.js.map +0 -1
  436. package/dist/tools/options/greeks.js.map +0 -1
  437. package/dist/tools/options/option-chain.js.map +0 -1
  438. package/dist/tools/portfolio/alerts.js.map +0 -1
  439. package/dist/tools/portfolio/correlation.js.map +0 -1
  440. package/dist/tools/portfolio/daily-report.js.map +0 -1
  441. package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
  442. package/dist/tools/portfolio/notifications.js.map +0 -1
  443. package/dist/tools/portfolio/risk-analysis.js.map +0 -1
  444. package/dist/tools/portfolio/tracker.js.map +0 -1
  445. package/dist/tools/portfolio/watchlist.js.map +0 -1
  446. package/dist/tools/sentiment/insight-format.js.map +0 -1
  447. package/dist/tools/sentiment/query-match.js.map +0 -1
  448. package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
  449. package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
  450. package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
  451. package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
  452. package/dist/tools/sentiment/untrusted-text.js.map +0 -1
  453. package/dist/tools/sentiment/web-search.js.map +0 -1
  454. package/dist/tools/sentiment/web-sentiment.js.map +0 -1
  455. package/dist/tools/technical/backtest.js.map +0 -1
  456. package/dist/tools/technical/indicators.js.map +0 -1
  457. package/dist/types/fundamentals.js.map +0 -1
  458. package/dist/types/index.js.map +0 -1
  459. package/dist/types/macro.js.map +0 -1
  460. package/dist/types/market.js.map +0 -1
  461. package/dist/types/options.js.map +0 -1
  462. package/dist/types/portfolio.js.map +0 -1
  463. package/dist/types/prediction-markets.js.map +0 -1
  464. package/dist/types/sentiment.js.map +0 -1
  465. package/dist/workflows/compare-assets.js.map +0 -1
  466. package/dist/workflows/index.js.map +0 -1
  467. package/dist/workflows/options-screener.js.map +0 -1
  468. package/dist/workflows/portfolio-builder.js.map +0 -1
  469. package/gui/server/ask-user-bridge.ts +0 -89
  470. package/gui/server/automation-heartbeat.ts +0 -97
  471. package/gui/server/background-quotes.ts +0 -127
  472. package/gui/server/chat-event-adapter.ts +0 -294
  473. package/gui/server/gui-session-manager.ts +0 -5
  474. package/gui/server/http-routes.ts +0 -1201
  475. package/gui/server/invoke-tool.ts +0 -490
  476. package/gui/server/live-chat-event-adapter.ts +0 -243
  477. package/gui/server/local-session-coordinator.ts +0 -97
  478. package/gui/server/market-state-api.ts +0 -331
  479. package/gui/server/model-setup.ts +0 -254
  480. package/gui/server/package.json +0 -5
  481. package/gui/server/private-api-access.ts +0 -62
  482. package/gui/server/projector.ts +0 -392
  483. package/gui/server/prompt-observation.ts +0 -58
  484. package/gui/server/quote-snapshot-store.ts +0 -50
  485. package/gui/server/server.ts +0 -289
  486. package/gui/server/session-actions.ts +0 -323
  487. package/gui/server/session-entry-wait.ts +0 -179
  488. package/gui/server/shutdown.ts +0 -47
  489. package/gui/server/tool-invoke-ack.ts +0 -49
  490. package/gui/server/tool-metadata.ts +0 -167
  491. package/gui/server/websocket.ts +0 -138
  492. package/gui/server/writer-lock.ts +0 -1
  493. package/gui/server/ws-hub.ts +0 -403
  494. package/gui/shared/chat-events.ts +0 -165
  495. package/gui/shared/event-reducer.ts +0 -220
  496. package/gui/web/dist/assets/CatalogOverlay-DZ1niyQm.js +0 -1
  497. package/gui/web/dist/assets/index-D4F9AJnn.css +0 -2
  498. package/gui/web/dist/assets/index-DtqMMBTr.js +0 -65
  499. package/src/analysts/contracts.ts +0 -176
  500. package/src/analysts/orchestrator.ts +0 -244
  501. package/src/cli-main.ts +0 -510
  502. package/src/cli.ts +0 -17
  503. package/src/config.ts +0 -272
  504. package/src/doctor/cli-command.ts +0 -83
  505. package/src/doctor/render.ts +0 -37
  506. package/src/doctor/report.ts +0 -638
  507. package/src/index.ts +0 -5
  508. package/src/infra/cache.ts +0 -127
  509. package/src/infra/freshness.ts +0 -165
  510. package/src/infra/http-client.ts +0 -134
  511. package/src/infra/index.ts +0 -14
  512. package/src/infra/market-calendar.ts +0 -193
  513. package/src/infra/native-dependencies.ts +0 -84
  514. package/src/infra/node-version.ts +0 -23
  515. package/src/infra/open-url.ts +0 -28
  516. package/src/infra/opencandle-paths.ts +0 -53
  517. package/src/infra/rate-limiter.ts +0 -77
  518. package/src/market-state/alert-conditions.ts +0 -82
  519. package/src/market-state/alert-runner.ts +0 -863
  520. package/src/market-state/daily-report.ts +0 -237
  521. package/src/market-state/local-automation-service.ts +0 -162
  522. package/src/market-state/notification-delivery.ts +0 -158
  523. package/src/market-state/resolve-for-mutation.ts +0 -24
  524. package/src/market-state/resolve.ts +0 -112
  525. package/src/market-state/service.ts +0 -2208
  526. package/src/market-state/summaries.ts +0 -75
  527. package/src/memory/index.ts +0 -10
  528. package/src/memory/manager.ts +0 -190
  529. package/src/memory/preference-extractor.ts +0 -106
  530. package/src/memory/retrieval.ts +0 -71
  531. package/src/memory/sqlite.ts +0 -577
  532. package/src/memory/storage.ts +0 -195
  533. package/src/memory/tool-defaults.ts +0 -108
  534. package/src/memory/types.ts +0 -71
  535. package/src/monitor.ts +0 -123
  536. package/src/onboarding/connect.ts +0 -177
  537. package/src/onboarding/credential-interceptor.ts +0 -122
  538. package/src/onboarding/degradation-accumulator.ts +0 -77
  539. package/src/onboarding/prompt-user.ts +0 -85
  540. package/src/onboarding/provider-status.ts +0 -382
  541. package/src/onboarding/providers.ts +0 -442
  542. package/src/onboarding/state.ts +0 -216
  543. package/src/onboarding/tool-helpers.ts +0 -104
  544. package/src/onboarding/tool-tags.ts +0 -244
  545. package/src/onboarding/validation.ts +0 -152
  546. package/src/pi/opencandle-extension.ts +0 -1294
  547. package/src/pi/session-action-dedupe.ts +0 -155
  548. package/src/pi/session-storage.ts +0 -5
  549. package/src/pi/session-writer-lock.ts +0 -426
  550. package/src/pi/session.ts +0 -84
  551. package/src/pi/setup.ts +0 -399
  552. package/src/pi/tool-adapter.ts +0 -49
  553. package/src/pi/tui-session-coordinator.ts +0 -351
  554. package/src/prompts/context-builder.ts +0 -326
  555. package/src/prompts/disclaimer.ts +0 -9
  556. package/src/prompts/policy-cards.ts +0 -228
  557. package/src/prompts/sections.ts +0 -46
  558. package/src/prompts/symbol-preflight.ts +0 -80
  559. package/src/prompts/workflow-prompts.ts +0 -504
  560. package/src/providers/alpha-vantage.ts +0 -340
  561. package/src/providers/coingecko.ts +0 -95
  562. package/src/providers/errors.ts +0 -9
  563. package/src/providers/exa-search.ts +0 -375
  564. package/src/providers/external-tool-command.ts +0 -164
  565. package/src/providers/external-tool-error.ts +0 -20
  566. package/src/providers/fear-greed.ts +0 -45
  567. package/src/providers/finnhub.ts +0 -125
  568. package/src/providers/fred.ts +0 -83
  569. package/src/providers/index.ts +0 -17
  570. package/src/providers/polymarket.ts +0 -214
  571. package/src/providers/provider-credential-error.ts +0 -23
  572. package/src/providers/reddit-cli.ts +0 -286
  573. package/src/providers/reddit.ts +0 -106
  574. package/src/providers/sec-edgar.ts +0 -326
  575. package/src/providers/tradingview.ts +0 -399
  576. package/src/providers/twitter-cli.ts +0 -202
  577. package/src/providers/twitter.ts +0 -102
  578. package/src/providers/web-search.ts +0 -303
  579. package/src/providers/with-fallback.ts +0 -42
  580. package/src/providers/wrap-provider.ts +0 -105
  581. package/src/providers/yahoo-finance.ts +0 -984
  582. package/src/routing/classify-intent.ts +0 -380
  583. package/src/routing/defaults.ts +0 -29
  584. package/src/routing/entity-extractor.ts +0 -557
  585. package/src/routing/fund-symbols.ts +0 -58
  586. package/src/routing/horizon.ts +0 -7
  587. package/src/routing/index.ts +0 -70
  588. package/src/routing/legacy-rule-router.ts +0 -13
  589. package/src/routing/planning.ts +0 -829
  590. package/src/routing/route-manifest.ts +0 -308
  591. package/src/routing/router-llm-client.ts +0 -64
  592. package/src/routing/router-prompt.ts +0 -159
  593. package/src/routing/router-types.ts +0 -84
  594. package/src/routing/router.ts +0 -1332
  595. package/src/routing/slot-resolver.ts +0 -213
  596. package/src/routing/symbol-disambiguator.ts +0 -72
  597. package/src/routing/turn-context.ts +0 -108
  598. package/src/routing/types.ts +0 -77
  599. package/src/runtime/answer-contracts.ts +0 -693
  600. package/src/runtime/artifact-contracts.ts +0 -77
  601. package/src/runtime/evidence.ts +0 -78
  602. package/src/runtime/numeric-claims.ts +0 -108
  603. package/src/runtime/planning-evidence.ts +0 -597
  604. package/src/runtime/prompt-step.ts +0 -185
  605. package/src/runtime/provider-tracker.ts +0 -40
  606. package/src/runtime/run-context.ts +0 -32
  607. package/src/runtime/session-coordinator.ts +0 -1037
  608. package/src/runtime/session-title.ts +0 -60
  609. package/src/runtime/tool-defaults-wrapper.ts +0 -43
  610. package/src/runtime/validation.ts +0 -211
  611. package/src/runtime/workflow-events.ts +0 -77
  612. package/src/runtime/workflow-runner.ts +0 -182
  613. package/src/runtime/workflow-types.ts +0 -105
  614. package/src/sentiment/adapters/finnhub.ts +0 -49
  615. package/src/sentiment/adapters/reddit.ts +0 -65
  616. package/src/sentiment/adapters/twitter.ts +0 -36
  617. package/src/sentiment/adapters/web.ts +0 -44
  618. package/src/sentiment/index.ts +0 -49
  619. package/src/sentiment/insights.ts +0 -269
  620. package/src/sentiment/keywords.ts +0 -31
  621. package/src/sentiment/pipeline.ts +0 -91
  622. package/src/sentiment/scorer.ts +0 -89
  623. package/src/sentiment/store.ts +0 -260
  624. package/src/sentiment/trends.ts +0 -96
  625. package/src/sentiment/types.ts +0 -112
  626. package/src/system-prompt.ts +0 -115
  627. package/src/tool-kit.ts +0 -69
  628. package/src/tools/AGENTS.md +0 -36
  629. package/src/tools/fundamentals/company-overview.ts +0 -64
  630. package/src/tools/fundamentals/comps.ts +0 -180
  631. package/src/tools/fundamentals/dcf.ts +0 -447
  632. package/src/tools/fundamentals/earnings.ts +0 -57
  633. package/src/tools/fundamentals/financials.ts +0 -63
  634. package/src/tools/fundamentals/sec-filings.ts +0 -105
  635. package/src/tools/index.ts +0 -104
  636. package/src/tools/interaction/ask-user.ts +0 -93
  637. package/src/tools/macro/event-probabilities.ts +0 -141
  638. package/src/tools/macro/fear-greed.ts +0 -41
  639. package/src/tools/macro/fred-data.ts +0 -92
  640. package/src/tools/market/crypto-history.ts +0 -72
  641. package/src/tools/market/crypto-price.ts +0 -65
  642. package/src/tools/market/screen-stocks.ts +0 -290
  643. package/src/tools/market/search-ticker.ts +0 -254
  644. package/src/tools/market/stock-history.ts +0 -104
  645. package/src/tools/market/stock-quote.ts +0 -73
  646. package/src/tools/options/greeks.ts +0 -81
  647. package/src/tools/options/option-chain.ts +0 -134
  648. package/src/tools/portfolio/alerts.ts +0 -457
  649. package/src/tools/portfolio/correlation.ts +0 -189
  650. package/src/tools/portfolio/daily-report.ts +0 -107
  651. package/src/tools/portfolio/holdings-overlap.ts +0 -139
  652. package/src/tools/portfolio/notifications.ts +0 -45
  653. package/src/tools/portfolio/risk-analysis.ts +0 -173
  654. package/src/tools/portfolio/tracker.ts +0 -308
  655. package/src/tools/portfolio/watchlist.ts +0 -288
  656. package/src/tools/sentiment/insight-format.ts +0 -50
  657. package/src/tools/sentiment/query-match.ts +0 -117
  658. package/src/tools/sentiment/reddit-sentiment.ts +0 -403
  659. package/src/tools/sentiment/sentiment-summary.ts +0 -383
  660. package/src/tools/sentiment/sentiment-trend.ts +0 -75
  661. package/src/tools/sentiment/twitter-sentiment.ts +0 -287
  662. package/src/tools/sentiment/untrusted-text.ts +0 -21
  663. package/src/tools/sentiment/web-search.ts +0 -186
  664. package/src/tools/sentiment/web-sentiment.ts +0 -96
  665. package/src/tools/technical/backtest.ts +0 -336
  666. package/src/tools/technical/indicators.ts +0 -281
  667. package/src/types/fundamentals.ts +0 -47
  668. package/src/types/index.ts +0 -26
  669. package/src/types/macro.ts +0 -27
  670. package/src/types/market.ts +0 -46
  671. package/src/types/options.ts +0 -53
  672. package/src/types/portfolio.ts +0 -83
  673. package/src/types/prediction-markets.ts +0 -13
  674. package/src/types/sentiment.ts +0 -129
  675. package/src/workflows/compare-assets.ts +0 -89
  676. package/src/workflows/index.ts +0 -3
  677. package/src/workflows/options-screener.ts +0 -125
  678. package/src/workflows/portfolio-builder.ts +0 -63
@@ -1,577 +0,0 @@
1
- import { mkdirSync } from "node:fs";
2
- import { dirname } from "node:path";
3
- import Database from "better-sqlite3";
4
- import { ensureOpenCandleHomeDir, getStateDbPath } from "../infra/opencandle-paths.js";
5
-
6
- const CURRENT_SCHEMA_VERSION = 8;
7
-
8
- const CURRENT_SCHEMA = `
9
- CREATE TABLE IF NOT EXISTS schema_version (
10
- version INTEGER NOT NULL
11
- );
12
-
13
- CREATE TABLE IF NOT EXISTS user_preferences (
14
- id INTEGER PRIMARY KEY AUTOINCREMENT,
15
- namespace TEXT NOT NULL DEFAULT 'global',
16
- key TEXT NOT NULL,
17
- value_json TEXT NOT NULL,
18
- confidence TEXT DEFAULT 'medium',
19
- source TEXT DEFAULT 'explicit',
20
- created_at TEXT NOT NULL,
21
- updated_at TEXT NOT NULL,
22
- UNIQUE(namespace, key)
23
- );
24
-
25
- CREATE TABLE IF NOT EXISTS workflow_runs (
26
- id INTEGER PRIMARY KEY AUTOINCREMENT,
27
- session_id TEXT NOT NULL,
28
- workflow_type TEXT NOT NULL,
29
- input_slots_json TEXT,
30
- resolved_slots_json TEXT,
31
- defaults_used_json TEXT,
32
- output_summary TEXT,
33
- created_at TEXT NOT NULL,
34
- turn_type TEXT NOT NULL DEFAULT 'workflow'
35
- );
36
-
37
- CREATE TABLE IF NOT EXISTS recommendations (
38
- id INTEGER PRIMARY KEY AUTOINCREMENT,
39
- workflow_run_id INTEGER NOT NULL,
40
- recommendation_type TEXT NOT NULL,
41
- symbol TEXT,
42
- payload_json TEXT,
43
- created_at TEXT NOT NULL,
44
- FOREIGN KEY (workflow_run_id) REFERENCES workflow_runs(id)
45
- );
46
-
47
- CREATE TABLE IF NOT EXISTS workflow_events (
48
- id INTEGER PRIMARY KEY AUTOINCREMENT,
49
- run_id TEXT NOT NULL,
50
- step_index INTEGER NOT NULL,
51
- event_type TEXT NOT NULL,
52
- payload_json TEXT,
53
- timestamp TEXT NOT NULL
54
- );
55
-
56
- CREATE INDEX IF NOT EXISTS idx_workflow_events_run_id ON workflow_events(run_id);
57
-
58
- CREATE TABLE IF NOT EXISTS tool_defaults (
59
- tool_name TEXT NOT NULL,
60
- param_path TEXT NOT NULL,
61
- value_json TEXT NOT NULL,
62
- set_at TEXT NOT NULL,
63
- PRIMARY KEY (tool_name, param_path)
64
- );
65
-
66
- CREATE TABLE IF NOT EXISTS instruments (
67
- id INTEGER PRIMARY KEY AUTOINCREMENT,
68
- symbol TEXT NOT NULL,
69
- asset_type TEXT NOT NULL,
70
- name TEXT,
71
- exchange TEXT,
72
- currency TEXT,
73
- provider TEXT NOT NULL,
74
- provider_metadata_json TEXT,
75
- last_resolved_at TEXT NOT NULL,
76
- created_at TEXT NOT NULL,
77
- updated_at TEXT NOT NULL
78
- );
79
-
80
- CREATE INDEX IF NOT EXISTS idx_instruments_symbol ON instruments(symbol);
81
- CREATE UNIQUE INDEX IF NOT EXISTS idx_instruments_provider_identity
82
- ON instruments(provider, symbol, asset_type, IFNULL(exchange, ''));
83
-
84
- CREATE TABLE IF NOT EXISTS instrument_aliases (
85
- id INTEGER PRIMARY KEY AUTOINCREMENT,
86
- instrument_id INTEGER NOT NULL,
87
- source TEXT NOT NULL,
88
- source_symbol TEXT NOT NULL,
89
- source_exchange TEXT,
90
- source_asset_type TEXT,
91
- source_id TEXT,
92
- raw_json TEXT,
93
- created_at TEXT NOT NULL,
94
- updated_at TEXT NOT NULL,
95
- FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
96
- );
97
-
98
- CREATE UNIQUE INDEX IF NOT EXISTS idx_instrument_aliases_source_id
99
- ON instrument_aliases(source, source_id)
100
- WHERE source_id IS NOT NULL;
101
- CREATE UNIQUE INDEX IF NOT EXISTS idx_instrument_aliases_source_symbol
102
- ON instrument_aliases(source, source_symbol, IFNULL(source_exchange, ''), IFNULL(source_asset_type, ''))
103
- WHERE source_id IS NULL;
104
-
105
- CREATE TABLE IF NOT EXISTS watchlists (
106
- id INTEGER PRIMARY KEY AUTOINCREMENT,
107
- name TEXT NOT NULL,
108
- is_default INTEGER NOT NULL DEFAULT 0,
109
- created_at TEXT NOT NULL,
110
- updated_at TEXT NOT NULL
111
- );
112
-
113
- CREATE UNIQUE INDEX IF NOT EXISTS idx_watchlists_one_default
114
- ON watchlists(is_default)
115
- WHERE is_default = 1;
116
-
117
- CREATE TABLE IF NOT EXISTS watchlist_items (
118
- id INTEGER PRIMARY KEY AUTOINCREMENT,
119
- watchlist_id INTEGER NOT NULL,
120
- instrument_id INTEGER NOT NULL,
121
- thesis TEXT,
122
- notes TEXT,
123
- tags_json TEXT,
124
- target_price REAL,
125
- stop_price REAL,
126
- price_currency TEXT,
127
- source TEXT,
128
- source_row_id TEXT,
129
- source_metadata_json TEXT,
130
- created_at TEXT NOT NULL,
131
- updated_at TEXT NOT NULL,
132
- UNIQUE(watchlist_id, instrument_id),
133
- FOREIGN KEY (watchlist_id) REFERENCES watchlists(id) ON DELETE CASCADE,
134
- FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
135
- );
136
-
137
- CREATE INDEX IF NOT EXISTS idx_watchlist_items_source_row
138
- ON watchlist_items(source, source_row_id)
139
- WHERE source IS NOT NULL AND source_row_id IS NOT NULL;
140
-
141
- CREATE TABLE IF NOT EXISTS portfolios (
142
- id INTEGER PRIMARY KEY AUTOINCREMENT,
143
- name TEXT NOT NULL,
144
- base_currency TEXT NOT NULL DEFAULT 'USD',
145
- is_default INTEGER NOT NULL DEFAULT 0,
146
- created_at TEXT NOT NULL,
147
- updated_at TEXT NOT NULL
148
- );
149
-
150
- CREATE UNIQUE INDEX IF NOT EXISTS idx_portfolios_one_default
151
- ON portfolios(is_default)
152
- WHERE is_default = 1;
153
-
154
- CREATE TABLE IF NOT EXISTS portfolio_lots (
155
- id INTEGER PRIMARY KEY AUTOINCREMENT,
156
- portfolio_id INTEGER NOT NULL,
157
- instrument_id INTEGER NOT NULL,
158
- quantity REAL NOT NULL,
159
- avg_cost REAL NOT NULL,
160
- currency TEXT NOT NULL,
161
- opened_at TEXT,
162
- notes TEXT,
163
- source TEXT,
164
- source_account_ref TEXT,
165
- source_lot_id TEXT,
166
- source_row_id TEXT,
167
- source_metadata_json TEXT,
168
- created_at TEXT NOT NULL,
169
- updated_at TEXT NOT NULL,
170
- FOREIGN KEY (portfolio_id) REFERENCES portfolios(id) ON DELETE CASCADE,
171
- FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
172
- );
173
-
174
- CREATE INDEX IF NOT EXISTS idx_portfolio_lots_source_row
175
- ON portfolio_lots(source, source_row_id)
176
- WHERE source IS NOT NULL AND source_row_id IS NOT NULL;
177
- CREATE INDEX IF NOT EXISTS idx_portfolio_lots_source_lot
178
- ON portfolio_lots(source, source_lot_id)
179
- WHERE source IS NOT NULL AND source_lot_id IS NOT NULL;
180
-
181
- CREATE TABLE IF NOT EXISTS alert_rules (
182
- id INTEGER PRIMARY KEY AUTOINCREMENT,
183
- scope_type TEXT NOT NULL,
184
- scope_id INTEGER,
185
- instrument_id INTEGER,
186
- condition_type TEXT NOT NULL,
187
- condition_version INTEGER NOT NULL,
188
- condition_json TEXT NOT NULL,
189
- timeframe TEXT NOT NULL,
190
- enabled INTEGER NOT NULL DEFAULT 1,
191
- check_interval_seconds INTEGER,
192
- next_check_at TEXT,
193
- last_checked_at TEXT,
194
- last_observed_json TEXT,
195
- status TEXT NOT NULL DEFAULT 'active',
196
- retrigger_mode TEXT NOT NULL DEFAULT 'recurring',
197
- last_condition_state TEXT NOT NULL DEFAULT 'unknown',
198
- rule_revision INTEGER NOT NULL DEFAULT 1,
199
- arm_cycle_id INTEGER NOT NULL DEFAULT 1,
200
- cooldown_seconds INTEGER,
201
- last_triggered_at TEXT,
202
- created_at TEXT NOT NULL,
203
- updated_at TEXT NOT NULL,
204
- FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
205
- );
206
-
207
- CREATE TABLE IF NOT EXISTS alert_events (
208
- id INTEGER PRIMARY KEY AUTOINCREMENT,
209
- alert_rule_id INTEGER NOT NULL,
210
- instrument_id INTEGER,
211
- observed_value_json TEXT,
212
- triggered_at TEXT NOT NULL,
213
- observed_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
214
- provider_data_at TEXT,
215
- source_provider TEXT,
216
- cache_status TEXT NOT NULL DEFAULT 'live',
217
- data_delay_ms INTEGER,
218
- trigger_source TEXT NOT NULL DEFAULT 'manual',
219
- dedupe_key TEXT,
220
- status TEXT NOT NULL,
221
- message TEXT,
222
- FOREIGN KEY (alert_rule_id) REFERENCES alert_rules(id) ON DELETE CASCADE,
223
- FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
224
- );
225
-
226
- CREATE UNIQUE INDEX IF NOT EXISTS idx_alert_events_dedupe
227
- ON alert_events(dedupe_key)
228
- WHERE dedupe_key IS NOT NULL;
229
-
230
- CREATE TABLE IF NOT EXISTS alert_check_runs (
231
- id INTEGER PRIMARY KEY AUTOINCREMENT,
232
- started_at TEXT NOT NULL,
233
- completed_at TEXT,
234
- status TEXT NOT NULL,
235
- trigger_type TEXT NOT NULL,
236
- checked_count INTEGER NOT NULL DEFAULT 0,
237
- triggered_count INTEGER NOT NULL DEFAULT 0,
238
- unavailable_count INTEGER NOT NULL DEFAULT 0,
239
- owner_id TEXT,
240
- error_json TEXT,
241
- provider_status_json TEXT
242
- );
243
-
244
- CREATE TABLE IF NOT EXISTS report_templates (
245
- id INTEGER PRIMARY KEY AUTOINCREMENT,
246
- name TEXT NOT NULL,
247
- report_type TEXT NOT NULL,
248
- cadence TEXT NOT NULL,
249
- timezone TEXT NOT NULL,
250
- local_time TEXT NOT NULL,
251
- config_json TEXT NOT NULL,
252
- enabled INTEGER NOT NULL DEFAULT 1,
253
- last_run_at TEXT,
254
- next_run_at TEXT,
255
- created_at TEXT NOT NULL,
256
- updated_at TEXT NOT NULL
257
- );
258
-
259
- CREATE TABLE IF NOT EXISTS report_runs (
260
- id INTEGER PRIMARY KEY AUTOINCREMENT,
261
- template_id INTEGER,
262
- started_at TEXT NOT NULL,
263
- completed_at TEXT,
264
- status TEXT NOT NULL,
265
- trigger_type TEXT NOT NULL DEFAULT 'manual',
266
- scheduled_for TEXT,
267
- owner_id TEXT,
268
- artifact_path TEXT,
269
- summary_json TEXT,
270
- errors_json TEXT,
271
- FOREIGN KEY (template_id) REFERENCES report_templates(id) ON DELETE SET NULL
272
- );
273
-
274
- CREATE TABLE IF NOT EXISTS automation_runner_leases (
275
- id INTEGER PRIMARY KEY CHECK (id = 1),
276
- owner_id TEXT NOT NULL,
277
- owner_kind TEXT NOT NULL,
278
- acquired_at TEXT NOT NULL,
279
- heartbeat_at TEXT NOT NULL,
280
- expires_at TEXT NOT NULL
281
- );
282
-
283
- CREATE TABLE IF NOT EXISTS notification_events (
284
- id INTEGER PRIMARY KEY AUTOINCREMENT,
285
- source_type TEXT NOT NULL,
286
- source_id INTEGER,
287
- severity TEXT NOT NULL,
288
- title TEXT NOT NULL,
289
- body TEXT NOT NULL,
290
- payload_json TEXT,
291
- status TEXT NOT NULL,
292
- created_at TEXT NOT NULL,
293
- acknowledged_at TEXT
294
- );
295
-
296
- CREATE TABLE IF NOT EXISTS notification_delivery_attempts (
297
- id INTEGER PRIMARY KEY AUTOINCREMENT,
298
- notification_event_id INTEGER NOT NULL,
299
- channel TEXT NOT NULL,
300
- status TEXT NOT NULL,
301
- attempted_at TEXT NOT NULL,
302
- completed_at TEXT,
303
- response_json TEXT,
304
- error TEXT,
305
- FOREIGN KEY (notification_event_id) REFERENCES notification_events(id) ON DELETE CASCADE
306
- );
307
-
308
- CREATE TABLE IF NOT EXISTS import_batches (
309
- id INTEGER PRIMARY KEY AUTOINCREMENT,
310
- source TEXT NOT NULL,
311
- source_label TEXT,
312
- imported_at TEXT NOT NULL,
313
- status TEXT NOT NULL,
314
- raw_metadata_json TEXT
315
- );
316
-
317
- CREATE TABLE IF NOT EXISTS import_rows (
318
- id INTEGER PRIMARY KEY AUTOINCREMENT,
319
- batch_id INTEGER NOT NULL,
320
- row_type TEXT NOT NULL,
321
- source_symbol TEXT,
322
- source_row_id TEXT,
323
- source_account_ref TEXT,
324
- normalized_instrument_id INTEGER,
325
- status TEXT NOT NULL,
326
- error TEXT,
327
- source_metadata_json TEXT,
328
- raw_json TEXT,
329
- FOREIGN KEY (batch_id) REFERENCES import_batches(id) ON DELETE CASCADE,
330
- FOREIGN KEY (normalized_instrument_id) REFERENCES instruments(id) ON DELETE SET NULL
331
- );
332
-
333
- CREATE UNIQUE INDEX IF NOT EXISTS idx_import_rows_batch_source_row
334
- ON import_rows(batch_id, source_row_id)
335
- WHERE source_row_id IS NOT NULL;
336
- `;
337
-
338
- export function initDatabase(path: string): Database.Database {
339
- if (path !== ":memory:") {
340
- mkdirSync(dirname(path), { recursive: true });
341
- }
342
- const db = new Database(path);
343
- db.pragma("journal_mode = WAL");
344
- db.pragma("busy_timeout = 5000");
345
- db.pragma("foreign_keys = ON");
346
- ensureCurrentSchema(db);
347
-
348
- return db;
349
- }
350
-
351
- export function initDefaultDatabase(): Database.Database {
352
- ensureOpenCandleHomeDir();
353
- return initDatabase(getStateDbPath());
354
- }
355
-
356
- function ensureCurrentSchema(db: Database.Database): void {
357
- const currentVersion = readSchemaVersion(db);
358
-
359
- if (currentVersion === CURRENT_SCHEMA_VERSION) {
360
- // Up to date — still run CREATE TABLE IF NOT EXISTS for any missing auxiliary
361
- // tables (e.g. workflow_events added out-of-band).
362
- db.exec(CURRENT_SCHEMA);
363
- return;
364
- }
365
-
366
- if (currentVersion === 7) {
367
- migrateV7ToV8(db);
368
- return;
369
- }
370
-
371
- if (currentVersion === 6) {
372
- migrateV6ToV7(db);
373
- migrateV7ToV8(db);
374
- return;
375
- }
376
-
377
- if (currentVersion === 5) {
378
- migrateV5ToV6(db);
379
- migrateV6ToV7(db);
380
- migrateV7ToV8(db);
381
- return;
382
- }
383
-
384
- if (currentVersion === 4) {
385
- migrateV4ToV5(db);
386
- migrateV5ToV6(db);
387
- migrateV6ToV7(db);
388
- migrateV7ToV8(db);
389
- return;
390
- }
391
-
392
- if (currentVersion === 3) {
393
- migrateV3ToV4(db);
394
- migrateV4ToV5(db);
395
- migrateV5ToV6(db);
396
- migrateV6ToV7(db);
397
- migrateV7ToV8(db);
398
- return;
399
- }
400
-
401
- // Additive v2 → v3 → ... → v7 migration without dropping data (v8 drops
402
- // prediction_records as the explicit removal of the predictions feature).
403
- if (currentVersion === 2) {
404
- migrateV2ToV3(db);
405
- migrateV3ToV4(db);
406
- migrateV4ToV5(db);
407
- migrateV5ToV6(db);
408
- migrateV6ToV7(db);
409
- migrateV7ToV8(db);
410
- return;
411
- }
412
-
413
- // Any other mismatch (null first-run, or a foreign schema): reset.
414
- resetSchema(db);
415
- }
416
-
417
- function migrateV2ToV3(db: Database.Database): void {
418
- const cols = (db.pragma("table_info(workflow_runs)") as Array<{ name: string }>).map(
419
- (c) => c.name,
420
- );
421
-
422
- if (!cols.includes("turn_type")) {
423
- db.exec(`ALTER TABLE workflow_runs ADD COLUMN turn_type TEXT NOT NULL DEFAULT 'workflow'`);
424
- }
425
-
426
- // Ensure any tables or indexes added between versions are present.
427
- db.exec(CURRENT_SCHEMA);
428
-
429
- db.prepare("DELETE FROM schema_version").run();
430
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(3);
431
- }
432
-
433
- function migrateV3ToV4(db: Database.Database): void {
434
- // CURRENT_SCHEMA indexes alert_events(dedupe_key); pre-v7 tables lack the column.
435
- addColumnIfMissing(db, "alert_events", "dedupe_key", "TEXT");
436
- db.exec(CURRENT_SCHEMA);
437
-
438
- db.prepare("DELETE FROM schema_version").run();
439
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(4);
440
- }
441
-
442
- function migrateV4ToV5(db: Database.Database): void {
443
- addColumnIfMissing(db, "alert_events", "dedupe_key", "TEXT");
444
- db.exec(CURRENT_SCHEMA);
445
-
446
- db.prepare("DELETE FROM schema_version").run();
447
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(5);
448
- }
449
-
450
- function migrateV5ToV6(db: Database.Database): void {
451
- addColumnIfMissing(db, "import_rows", "source_row_id", "TEXT");
452
- addColumnIfMissing(db, "import_rows", "source_account_ref", "TEXT");
453
- addColumnIfMissing(db, "import_rows", "source_metadata_json", "TEXT");
454
-
455
- db.prepare("DELETE FROM schema_version").run();
456
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(6);
457
- }
458
-
459
- function migrateV6ToV7(db: Database.Database): void {
460
- addColumnIfMissing(db, "alert_rules", "status", "TEXT NOT NULL DEFAULT 'active'");
461
- addColumnIfMissing(db, "alert_rules", "retrigger_mode", "TEXT NOT NULL DEFAULT 'recurring'");
462
- addColumnIfMissing(db, "alert_rules", "last_condition_state", "TEXT NOT NULL DEFAULT 'unknown'");
463
- addColumnIfMissing(db, "alert_rules", "rule_revision", "INTEGER NOT NULL DEFAULT 1");
464
- addColumnIfMissing(db, "alert_rules", "arm_cycle_id", "INTEGER NOT NULL DEFAULT 1");
465
-
466
- addColumnIfMissing(db, "alert_events", "observed_at", "TEXT");
467
- addColumnIfMissing(db, "alert_events", "provider_data_at", "TEXT");
468
- addColumnIfMissing(db, "alert_events", "source_provider", "TEXT");
469
- addColumnIfMissing(db, "alert_events", "cache_status", "TEXT NOT NULL DEFAULT 'live'");
470
- addColumnIfMissing(db, "alert_events", "data_delay_ms", "INTEGER");
471
- addColumnIfMissing(db, "alert_events", "trigger_source", "TEXT NOT NULL DEFAULT 'manual'");
472
- addColumnIfMissing(db, "alert_events", "dedupe_key", "TEXT");
473
-
474
- addColumnIfMissing(db, "report_runs", "trigger_type", "TEXT NOT NULL DEFAULT 'manual'");
475
- addColumnIfMissing(db, "report_runs", "scheduled_for", "TEXT");
476
- addColumnIfMissing(db, "report_runs", "owner_id", "TEXT");
477
-
478
- if (tableExists(db, "alert_events")) {
479
- db.exec("UPDATE alert_events SET observed_at = triggered_at WHERE observed_at IS NULL");
480
- }
481
-
482
- db.exec(CURRENT_SCHEMA);
483
-
484
- db.prepare("DELETE FROM schema_version").run();
485
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(7);
486
- }
487
-
488
- function migrateV7ToV8(db: Database.Database): void {
489
- // Predictions feature removal: dropping prediction_records is the explicit,
490
- // documented destructive step for this table; all other rows are preserved.
491
- db.exec("DROP TABLE IF EXISTS prediction_records");
492
- db.exec(CURRENT_SCHEMA);
493
-
494
- db.prepare("DELETE FROM schema_version").run();
495
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(CURRENT_SCHEMA_VERSION);
496
- }
497
-
498
- function addColumnIfMissing(
499
- db: Database.Database,
500
- tableName: string,
501
- columnName: string,
502
- definition: string,
503
- ): void {
504
- const cols = (db.pragma(`table_info(${tableName})`) as Array<{ name: string }>).map(
505
- (c) => c.name,
506
- );
507
- if (cols.length === 0) {
508
- if (!tableExists(db, tableName)) return;
509
- }
510
- if (!cols.includes(columnName)) {
511
- db.exec(`ALTER TABLE ${tableName} ADD COLUMN ${columnName} ${definition}`);
512
- }
513
- }
514
-
515
- function tableExists(db: Database.Database, tableName: string): boolean {
516
- const table = db
517
- .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?")
518
- .get(tableName) as { name: string } | undefined;
519
- return table != null;
520
- }
521
-
522
- function readSchemaVersion(db: Database.Database): number | null {
523
- const table = db
524
- .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'schema_version'")
525
- .get() as { name: string } | undefined;
526
- if (!table) {
527
- return null;
528
- }
529
-
530
- const row = db.prepare("SELECT version FROM schema_version LIMIT 1").get() as
531
- | { version: number }
532
- | undefined;
533
- return row?.version ?? null;
534
- }
535
-
536
- function resetSchema(db: Database.Database): void {
537
- db.exec(`
538
- DROP TABLE IF EXISTS import_rows;
539
- DROP TABLE IF EXISTS import_batches;
540
- DROP TABLE IF EXISTS notification_delivery_attempts;
541
- DROP TABLE IF EXISTS notification_events;
542
- DROP TABLE IF EXISTS automation_runner_leases;
543
- DROP TABLE IF EXISTS alert_check_runs;
544
- DROP TABLE IF EXISTS report_runs;
545
- DROP TABLE IF EXISTS report_templates;
546
- DROP TABLE IF EXISTS alert_events;
547
- DROP TABLE IF EXISTS alert_rules;
548
- DROP TABLE IF EXISTS prediction_records;
549
- DROP TABLE IF EXISTS portfolio_lots;
550
- DROP TABLE IF EXISTS portfolios;
551
- DROP TABLE IF EXISTS watchlist_items;
552
- DROP TABLE IF EXISTS watchlists;
553
- DROP TABLE IF EXISTS instrument_aliases;
554
- DROP TABLE IF EXISTS instruments;
555
- DROP TABLE IF EXISTS recommendations;
556
- DROP TABLE IF EXISTS workflow_runs;
557
- DROP TABLE IF EXISTS user_preferences;
558
- DROP TABLE IF EXISTS tool_defaults;
559
- DROP TABLE IF EXISTS schema_version;
560
- `);
561
- db.exec(CURRENT_SCHEMA);
562
- db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(CURRENT_SCHEMA_VERSION);
563
- }
564
-
565
- export function getTableNames(db: Database.Database): string[] {
566
- const rows = db
567
- .prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
568
- .all() as Array<{ name: string }>;
569
- return rows.map((r) => r.name);
570
- }
571
-
572
- export function getSchemaVersion(db: Database.Database): number {
573
- const row = db.prepare("SELECT version FROM schema_version LIMIT 1").get() as
574
- | { version: number }
575
- | undefined;
576
- return row?.version ?? 0;
577
- }