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
@@ -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
- }