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
@@ -2,7 +2,7 @@ import { mkdirSync } from "node:fs";
2
2
  import { dirname } from "node:path";
3
3
  import Database from "better-sqlite3";
4
4
  import { ensureOpenCandleHomeDir, getStateDbPath } from "../infra/opencandle-paths.js";
5
- const CURRENT_SCHEMA_VERSION = 8;
5
+ const CURRENT_SCHEMA_VERSION = 9;
6
6
  const CURRENT_SCHEMA = `
7
7
  CREATE TABLE IF NOT EXISTS schema_version (
8
8
  version INTEGER NOT NULL
@@ -105,7 +105,8 @@ const CURRENT_SCHEMA = `
105
105
  name TEXT NOT NULL,
106
106
  is_default INTEGER NOT NULL DEFAULT 0,
107
107
  created_at TEXT NOT NULL,
108
- updated_at TEXT NOT NULL
108
+ updated_at TEXT NOT NULL,
109
+ UNIQUE(name)
109
110
  );
110
111
 
111
112
  CREATE UNIQUE INDEX IF NOT EXISTS idx_watchlists_one_default
@@ -116,12 +117,6 @@ const CURRENT_SCHEMA = `
116
117
  id INTEGER PRIMARY KEY AUTOINCREMENT,
117
118
  watchlist_id INTEGER NOT NULL,
118
119
  instrument_id INTEGER NOT NULL,
119
- thesis TEXT,
120
- notes TEXT,
121
- tags_json TEXT,
122
- target_price REAL,
123
- stop_price REAL,
124
- price_currency TEXT,
125
120
  source TEXT,
126
121
  source_row_id TEXT,
127
122
  source_metadata_json TEXT,
@@ -355,19 +350,26 @@ function ensureCurrentSchema(db) {
355
350
  db.exec(CURRENT_SCHEMA);
356
351
  return;
357
352
  }
353
+ if (currentVersion === 8) {
354
+ migrateV8ToV9(db);
355
+ return;
356
+ }
358
357
  if (currentVersion === 7) {
359
358
  migrateV7ToV8(db);
359
+ migrateV8ToV9(db);
360
360
  return;
361
361
  }
362
362
  if (currentVersion === 6) {
363
363
  migrateV6ToV7(db);
364
364
  migrateV7ToV8(db);
365
+ migrateV8ToV9(db);
365
366
  return;
366
367
  }
367
368
  if (currentVersion === 5) {
368
369
  migrateV5ToV6(db);
369
370
  migrateV6ToV7(db);
370
371
  migrateV7ToV8(db);
372
+ migrateV8ToV9(db);
371
373
  return;
372
374
  }
373
375
  if (currentVersion === 4) {
@@ -375,6 +377,7 @@ function ensureCurrentSchema(db) {
375
377
  migrateV5ToV6(db);
376
378
  migrateV6ToV7(db);
377
379
  migrateV7ToV8(db);
380
+ migrateV8ToV9(db);
378
381
  return;
379
382
  }
380
383
  if (currentVersion === 3) {
@@ -383,10 +386,12 @@ function ensureCurrentSchema(db) {
383
386
  migrateV5ToV6(db);
384
387
  migrateV6ToV7(db);
385
388
  migrateV7ToV8(db);
389
+ migrateV8ToV9(db);
386
390
  return;
387
391
  }
388
- // Additive v2 → v3 → ... → v7 migration without dropping data (v8 drops
389
- // prediction_records as the explicit removal of the predictions feature).
392
+ // Additive v2 → v3 → ... migration without dropping data (v8 drops
393
+ // prediction_records and v9 drops watchlist item annotation columns as
394
+ // explicit feature removals).
390
395
  if (currentVersion === 2) {
391
396
  migrateV2ToV3(db);
392
397
  migrateV3ToV4(db);
@@ -394,6 +399,7 @@ function ensureCurrentSchema(db) {
394
399
  migrateV5ToV6(db);
395
400
  migrateV6ToV7(db);
396
401
  migrateV7ToV8(db);
402
+ migrateV8ToV9(db);
397
403
  return;
398
404
  }
399
405
  // Any other mismatch (null first-run, or a foreign schema): reset.
@@ -456,6 +462,50 @@ function migrateV7ToV8(db) {
456
462
  // Predictions feature removal: dropping prediction_records is the explicit,
457
463
  // documented destructive step for this table; all other rows are preserved.
458
464
  db.exec("DROP TABLE IF EXISTS prediction_records");
465
+ db.exec(CURRENT_SCHEMA);
466
+ db.prepare("DELETE FROM schema_version").run();
467
+ db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(8);
468
+ }
469
+ function migrateV8ToV9(db) {
470
+ db.exec(`
471
+ CREATE TABLE IF NOT EXISTS watchlists_v9 (
472
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
473
+ name TEXT NOT NULL,
474
+ is_default INTEGER NOT NULL DEFAULT 0,
475
+ created_at TEXT NOT NULL,
476
+ updated_at TEXT NOT NULL,
477
+ UNIQUE(name)
478
+ );
479
+
480
+ INSERT OR IGNORE INTO watchlists_v9 (id, name, is_default, created_at, updated_at)
481
+ SELECT id, name, is_default, created_at, updated_at FROM watchlists;
482
+
483
+ DROP TABLE IF EXISTS watchlist_items_v9;
484
+ CREATE TABLE watchlist_items_v9 (
485
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
486
+ watchlist_id INTEGER NOT NULL,
487
+ instrument_id INTEGER NOT NULL,
488
+ source TEXT,
489
+ source_row_id TEXT,
490
+ source_metadata_json TEXT,
491
+ created_at TEXT NOT NULL,
492
+ updated_at TEXT NOT NULL,
493
+ UNIQUE(watchlist_id, instrument_id),
494
+ FOREIGN KEY (watchlist_id) REFERENCES watchlists_v9(id) ON DELETE CASCADE,
495
+ FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
496
+ );
497
+
498
+ INSERT OR IGNORE INTO watchlist_items_v9 (
499
+ id, watchlist_id, instrument_id, source, source_row_id, source_metadata_json, created_at, updated_at
500
+ )
501
+ SELECT id, watchlist_id, instrument_id, source, source_row_id, source_metadata_json, created_at, updated_at
502
+ FROM watchlist_items;
503
+
504
+ DROP TABLE watchlist_items;
505
+ DROP TABLE watchlists;
506
+ ALTER TABLE watchlists_v9 RENAME TO watchlists;
507
+ ALTER TABLE watchlist_items_v9 RENAME TO watchlist_items;
508
+ `);
459
509
  db.exec(CURRENT_SCHEMA);
460
510
  db.prepare("DELETE FROM schema_version").run();
461
511
  db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(CURRENT_SCHEMA_VERSION);
@@ -524,4 +574,3 @@ export function getSchemaVersion(db) {
524
574
  const row = db.prepare("SELECT version FROM schema_version LIMIT 1").get();
525
575
  return row?.version ?? 0;
526
576
  }
527
- //# sourceMappingURL=sqlite.js.map
@@ -120,4 +120,3 @@ function safeParseJson(json) {
120
120
  return json;
121
121
  }
122
122
  }
123
- //# sourceMappingURL=storage.js.map
@@ -92,4 +92,3 @@ function setPath(target, path, value) {
92
92
  function isPlainObject(value) {
93
93
  return typeof value === "object" && value !== null && !Array.isArray(value);
94
94
  }
95
- //# sourceMappingURL=tool-defaults.js.map
@@ -48,4 +48,3 @@ export const NEVER_TRUST_FROM_MEMORY = new Set([
48
48
  "entry_price",
49
49
  "stop_loss",
50
50
  ]);
51
- //# sourceMappingURL=types.js.map
package/dist/monitor.js CHANGED
@@ -102,4 +102,3 @@ async function main() {
102
102
  process.once("SIGTERM", stop);
103
103
  }
104
104
  await main();
105
- //# sourceMappingURL=monitor.js.map
@@ -120,4 +120,3 @@ export async function runProviderConnect(ctx, providerId) {
120
120
  ctx.ui.notify(`${descriptor.displayName} connected. Your key has been saved.`, "info");
121
121
  return { status: "connected" };
122
122
  }
123
- //# sourceMappingURL=connect.js.map
@@ -69,4 +69,3 @@ export function resolveCredentialRequired(input) {
69
69
  // 7. Default: prompt.
70
70
  return { action: "prompt", provider, reason };
71
71
  }
72
- //# sourceMappingURL=credential-interceptor.js.map
@@ -50,4 +50,3 @@ export function createDegradationAccumulator() {
50
50
  },
51
51
  };
52
52
  }
53
- //# sourceMappingURL=degradation-accumulator.js.map
@@ -20,4 +20,4 @@ export interface PromptResult {
20
20
  *
21
21
  * When neither a handler nor a UI is available, returns `{answer: null, cancelled: true}`.
22
22
  */
23
- export declare function promptUser(ctx: ExtensionContext, opts: PromptOptions, handler?: AskUserHandler): Promise<PromptResult>;
23
+ export declare function promptUser(ctx: ExtensionContext | undefined, opts: PromptOptions, handler?: AskUserHandler): Promise<PromptResult>;
@@ -58,4 +58,3 @@ export async function promptUser(ctx, opts, handler) {
58
58
  }
59
59
  }
60
60
  }
61
- //# sourceMappingURL=prompt-user.js.map
@@ -253,4 +253,3 @@ export const runCommand = (command, args, options) => runExternalToolCommand(com
253
253
  timeoutMs: options?.timeoutMs ?? COMMAND_TIMEOUT_MS,
254
254
  maxOutputChars: MAX_OUTPUT_CHARS,
255
255
  });
256
- //# sourceMappingURL=provider-status.js.map
@@ -1,4 +1,4 @@
1
- export type ApiKeyProviderId = "alpha_vantage" | "fred" | "finnhub" | "brave" | "exa";
1
+ export type ApiKeyProviderId = "alpha_vantage" | "fred" | "finnhub" | "brave" | "exa" | "lse";
2
2
  export type ExternalToolProviderId = "twitter" | "reddit";
3
3
  export type PublicHttpProviderId = "polymarket" | "tradingview" | "yahoo";
4
4
  export type ProviderId = ApiKeyProviderId | ExternalToolProviderId | PublicHttpProviderId;
@@ -127,6 +127,21 @@ export declare const PROVIDERS: readonly [{
127
127
  readonly fallbackDescription: "Exa search continues to work via the keyless Exa MCP endpoint, which has lower rate limits but similar quality";
128
128
  readonly snoozeDurationDays: 7;
129
129
  readonly instructionsHint: "Paid with free tier, signup opens in your browser";
130
+ }, {
131
+ readonly id: "lse";
132
+ readonly kind: "api-key";
133
+ readonly displayName: "London Strategic Edge";
134
+ readonly category: "market";
135
+ readonly tier: "soft";
136
+ readonly aliases: readonly ["lse", "london strategic edge", "londonstrategicedge"];
137
+ readonly signupUrl: "https://londonstrategicedge.com/databank";
138
+ readonly freeTier: true;
139
+ readonly envVar: "LSE_API_KEY";
140
+ readonly configPath: readonly ["providers", "lse", "apiKey"];
141
+ readonly unlocks: readonly ["financial statements (income, balance sheet, and cash flow)", "deep split-adjusted intraday history back to 2003"];
142
+ readonly fallbackDescription: "Market data continues through Yahoo Finance and Alpha Vantage when London Strategic Edge is unavailable";
143
+ readonly snoozeDurationDays: 7;
144
+ readonly instructionsHint: "Free, about 30 seconds, signup opens in your browser";
130
145
  }, {
131
146
  readonly id: "yahoo";
132
147
  readonly kind: "public-http";
@@ -112,6 +112,25 @@ export const PROVIDERS = [
112
112
  snoozeDurationDays: 7,
113
113
  instructionsHint: "Paid with free tier, signup opens in your browser",
114
114
  },
115
+ {
116
+ id: "lse",
117
+ kind: "api-key",
118
+ displayName: "London Strategic Edge",
119
+ category: "market",
120
+ tier: "soft",
121
+ aliases: ["lse", "london strategic edge", "londonstrategicedge"],
122
+ signupUrl: "https://londonstrategicedge.com/databank",
123
+ freeTier: true,
124
+ envVar: "LSE_API_KEY",
125
+ configPath: ["providers", "lse", "apiKey"],
126
+ unlocks: [
127
+ "financial statements (income, balance sheet, and cash flow)",
128
+ "deep split-adjusted intraday history back to 2003",
129
+ ],
130
+ fallbackDescription: "Market data continues through Yahoo Finance and Alpha Vantage when London Strategic Edge is unavailable",
131
+ snoozeDurationDays: 7,
132
+ instructionsHint: "Free, about 30 seconds, signup opens in your browser",
133
+ },
115
134
  {
116
135
  id: "yahoo",
117
136
  kind: "public-http",
@@ -255,6 +274,7 @@ const CONFIG_FIELD_BY_ID = {
255
274
  finnhub: "finnhubApiKey",
256
275
  brave: "braveApiKey",
257
276
  exa: "exaApiKey",
277
+ lse: "lseApiKey",
258
278
  };
259
279
  export function hasCredential(id) {
260
280
  const descriptor = getProvider(id);
@@ -327,4 +347,3 @@ export function resolveProviderFromArgument(arg) {
327
347
  }
328
348
  return undefined;
329
349
  }
330
- //# sourceMappingURL=providers.js.map
@@ -161,4 +161,3 @@ export function shouldShowWelcome(state, hasUI) {
161
161
  return false;
162
162
  return state.welcomeShownAt === undefined;
163
163
  }
164
- //# sourceMappingURL=state.js.map
@@ -77,4 +77,3 @@ export async function withCredentialCheck(providerId, fn) {
77
77
  throw error;
78
78
  }
79
79
  }
80
- //# sourceMappingURL=tool-helpers.js.map
@@ -178,4 +178,3 @@ export function parseToolTag(text) {
178
178
  return undefined;
179
179
  }
180
180
  }
181
- //# sourceMappingURL=tool-tags.js.map
@@ -0,0 +1,17 @@
1
+ export type ModelKeyProviderId = "google" | "openai" | "anthropic";
2
+ export type ModelKeyValidationResult = {
3
+ status: "valid";
4
+ providerLabel: string;
5
+ } | {
6
+ status: "invalid";
7
+ providerLabel: string;
8
+ } | {
9
+ status: "transient";
10
+ providerLabel: string;
11
+ reason: string;
12
+ };
13
+ /**
14
+ * Checks whether an API key is accepted by a model provider without saving it.
15
+ * Transient failures deliberately permit saving so offline setup remains usable.
16
+ */
17
+ export declare function validateModelKey(providerId: ModelKeyProviderId, key: string): Promise<ModelKeyValidationResult>;
@@ -0,0 +1,86 @@
1
+ const VALIDATION_TIMEOUT_MS = 5_000;
2
+ const MODEL_KEY_PROBE_BASE_URL_ENV = "OPENCANDLE_MODEL_KEY_PROBE_BASE_URL";
3
+ const MODEL_KEY_PROBES = {
4
+ google: {
5
+ label: "Google Gemini",
6
+ url: "https://generativelanguage.googleapis.com/v1beta/models",
7
+ headers: (key) => ({ "x-goog-api-key": key }),
8
+ },
9
+ openai: {
10
+ label: "OpenAI",
11
+ url: "https://api.openai.com/v1/models",
12
+ headers: (key) => ({ Authorization: `Bearer ${key}` }),
13
+ },
14
+ anthropic: {
15
+ label: "Anthropic",
16
+ url: "https://api.anthropic.com/v1/models",
17
+ headers: (key) => ({ "x-api-key": key, "anthropic-version": "2023-06-01" }),
18
+ },
19
+ };
20
+ /**
21
+ * Checks whether an API key is accepted by a model provider without saving it.
22
+ * Transient failures deliberately permit saving so offline setup remains usable.
23
+ */
24
+ export async function validateModelKey(providerId, key) {
25
+ const probe = MODEL_KEY_PROBES[providerId];
26
+ try {
27
+ const response = await fetch(resolveProbeUrl(probe.url), {
28
+ method: "GET",
29
+ headers: probe.headers(key),
30
+ signal: AbortSignal.timeout(VALIDATION_TIMEOUT_MS),
31
+ // Probes carry the typed key in headers that survive cross-origin
32
+ // redirects (x-goog-api-key, x-api-key); provider probe endpoints do
33
+ // not redirect, so any redirect is treated as a transient failure
34
+ // rather than followed.
35
+ redirect: "error",
36
+ });
37
+ if (response.status === 401 || response.status === 403) {
38
+ return { status: "invalid", providerLabel: probe.label };
39
+ }
40
+ if (!response.ok) {
41
+ // Google reports bad keys as 400 INVALID_ARGUMENT / API_KEY_INVALID
42
+ // rather than 401.
43
+ if (response.status === 400) {
44
+ const body = await response.text().catch(() => "");
45
+ if (/API_KEY_INVALID|API key not valid/i.test(body)) {
46
+ return { status: "invalid", providerLabel: probe.label };
47
+ }
48
+ }
49
+ return { status: "transient", providerLabel: probe.label, reason: `HTTP ${response.status}` };
50
+ }
51
+ return { status: "valid", providerLabel: probe.label };
52
+ }
53
+ catch (error) {
54
+ return {
55
+ status: "transient",
56
+ providerLabel: probe.label,
57
+ reason: error instanceof Error ? error.message : String(error),
58
+ };
59
+ }
60
+ }
61
+ function resolveProbeUrl(probeUrl) {
62
+ const override = process.env[MODEL_KEY_PROBE_BASE_URL_ENV]?.trim();
63
+ if (!override)
64
+ return probeUrl;
65
+ // Test-support hook only. Overrides are limited to loopback hosts because
66
+ // the probe request carries the typed API key in its headers; honoring an
67
+ // arbitrary origin (for example from a poisoned .env) would forward that
68
+ // key to a foreign host.
69
+ let baseUrl;
70
+ try {
71
+ baseUrl = new URL(override);
72
+ }
73
+ catch {
74
+ return probeUrl;
75
+ }
76
+ if (!isLoopbackHostname(baseUrl.hostname))
77
+ return probeUrl;
78
+ const url = new URL(probeUrl);
79
+ url.protocol = baseUrl.protocol;
80
+ url.host = baseUrl.host;
81
+ return url.toString();
82
+ }
83
+ function isLoopbackHostname(hostname) {
84
+ const host = hostname.toLowerCase();
85
+ return (host === "localhost" || host === "::1" || host === "[::1]" || /^127(\.\d{1,3}){3}$/.test(host));
86
+ }
@@ -112,6 +112,13 @@ export async function validateCredential(providerId, key) {
112
112
  },
113
113
  body: JSON.stringify({ query: "test", numResults: 1 }),
114
114
  });
115
+ case "lse":
116
+ return validateWithFetch("https://api.londonstrategicedge.com/vault/candles?symbol=AAPL&timeframe=1d&limit=1", {
117
+ method: "GET",
118
+ headers: {
119
+ "x-api-key": key,
120
+ Accept: "application/json",
121
+ },
122
+ });
115
123
  }
116
124
  }
117
- //# sourceMappingURL=validation.js.map
@@ -1,8 +1,9 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
1
+ import type { ExtensionAPI, ModelRuntime } from "@earendil-works/pi-coding-agent";
2
2
  import type { InstrumentCandidate } from "../market-state/resolve.js";
3
3
  import type { RouterLlmClient } from "../routing/router-types.js";
4
4
  import type { AskUserHandler } from "../types/index.js";
5
5
  export interface OpenCandleExtensionOptions {
6
+ modelRuntime?: ModelRuntime;
6
7
  askUserHandler?: AskUserHandler;
7
8
  /**
8
9
  * Optional router LLM client. When provided, this instance is used instead
@@ -78,7 +78,7 @@ export default function openCandleExtension(pi, options) {
78
78
  pi.registerCommand("setup", {
79
79
  description: "Reconfigure the OpenCandle AI model (sign-in or API key)",
80
80
  handler: async (_args, ctx) => {
81
- const result = await coordinator.runSetup(pi, ctx, { mode: "manual" });
81
+ const result = await coordinator.runSetup(pi, ctx, { mode: "manual" }, options?.modelRuntime);
82
82
  if (result === "ready") {
83
83
  ctx.ui.notify("OpenCandle setup complete.", "info");
84
84
  }
@@ -173,7 +173,7 @@ export default function openCandleExtension(pi, options) {
173
173
  // entering the LLM's conversation context (unlike `sendMessage`, which Pi
174
174
  // reinjects as a `role:"user"` message every turn).
175
175
  ctx.ui.setStatus("opencandle-disclaimer", DISCLAIMER_TEXT);
176
- const result = await coordinator.runSetup(pi, ctx, { mode: "startup" });
176
+ const result = await coordinator.runSetup(pi, ctx, { mode: "startup" }, options?.modelRuntime);
177
177
  if (result === "shutdown") {
178
178
  return;
179
179
  }
@@ -690,6 +690,8 @@ export default function openCandleExtension(pi, options) {
690
690
  }
691
691
  async function dispatchRouterWorkflow(output, ctx, originalText) {
692
692
  const workflow = output.workflow;
693
+ if (!workflow)
694
+ return false;
693
695
  const storage = coordinator.getStorage();
694
696
  const workflowPrefs = storage?.getWorkflowPreferences("global") ?? {};
695
697
  const entities = mergeRouterSlotsIntoEntities(output);
@@ -988,7 +990,6 @@ export default function openCandleExtension(pi, options) {
988
990
  const model = ctx.model;
989
991
  if (!model)
990
992
  return null;
991
- // biome-ignore lint/suspicious/noExplicitAny: Pi typings keep Model generic
992
993
  return createPiAiRouterClient(model);
993
994
  }
994
995
  // System prompt assembly — delegate to coordinator. When a fallback context
@@ -1065,4 +1066,3 @@ function isPlaceholderSessionName(name, candidates) {
1065
1066
  }
1066
1067
  return false;
1067
1068
  }
1068
- //# sourceMappingURL=opencandle-extension.js.map
@@ -123,4 +123,3 @@ function acceptedActionStorePath(sessionManager) {
123
123
  ? `${scope}.accepted-actions.json`
124
124
  : join(scope, "accepted-actions.json");
125
125
  }
126
- //# sourceMappingURL=session-action-dedupe.js.map
@@ -2,4 +2,3 @@ import { SessionManager } from "@earendil-works/pi-coding-agent";
2
2
  export function continueOpenCandleSession(cwd, sessionDir) {
3
3
  return SessionManager.continueRecent(cwd, sessionDir);
4
4
  }
5
- //# sourceMappingURL=session-storage.js.map
@@ -320,4 +320,3 @@ function isFileScope(scopePath) {
320
320
  function sleep(ms) {
321
321
  return new Promise((resolve) => setTimeout(resolve, ms));
322
322
  }
323
- //# sourceMappingURL=session-writer-lock.js.map
@@ -1,10 +1,9 @@
1
- import { type AuthStorage, type CreateAgentSessionResult, type ModelRegistry, type SessionManager, type SettingsManager } from "@earendil-works/pi-coding-agent";
1
+ import { type CreateAgentSessionResult, type ModelRuntime, type SessionManager, type SettingsManager } from "@earendil-works/pi-coding-agent";
2
2
  import type { AskUserHandler } from "../types/index.js";
3
3
  export interface CreateOpenCandleSessionOptions {
4
4
  cwd?: string;
5
5
  agentDir?: string;
6
- authStorage?: AuthStorage;
7
- modelRegistry?: ModelRegistry;
6
+ modelRuntime?: ModelRuntime;
8
7
  settingsManager?: SettingsManager;
9
8
  sessionManager?: SessionManager;
10
9
  useInlineExtension?: boolean;
@@ -14,7 +14,10 @@ export async function createOpenCandleSession(options = {}) {
14
14
  agentDir,
15
15
  settingsManager: options.settingsManager,
16
16
  extensionFactories: [
17
- (pi) => openCandleExtension(pi, { askUserHandler: options.askUserHandler }),
17
+ (pi) => openCandleExtension(pi, {
18
+ askUserHandler: options.askUserHandler,
19
+ modelRuntime: options.modelRuntime,
20
+ }),
18
21
  ],
19
22
  })
20
23
  : undefined;
@@ -24,8 +27,7 @@ export async function createOpenCandleSession(options = {}) {
24
27
  const result = await createAgentSession({
25
28
  cwd,
26
29
  agentDir,
27
- authStorage: options.authStorage,
28
- modelRegistry: options.modelRegistry,
30
+ modelRuntime: options.modelRuntime,
29
31
  sessionManager: options.sessionManager,
30
32
  settingsManager: options.settingsManager,
31
33
  resourceLoader,
@@ -42,12 +44,11 @@ async function applySavedDefaultModel(result) {
42
44
  const modelId = result.session.settingsManager.getDefaultModel();
43
45
  if (!provider || !modelId)
44
46
  return;
45
- const savedDefault = result.session.modelRegistry.find(provider, modelId);
46
- if (!savedDefault || !result.session.modelRegistry.hasConfiguredAuth(savedDefault))
47
+ const savedDefault = result.session.modelRuntime.getModel(provider, modelId);
48
+ if (!savedDefault || !result.session.modelRuntime.hasConfiguredAuth(savedDefault.provider))
47
49
  return;
48
50
  const current = result.session.model;
49
51
  if (current?.provider === savedDefault.provider && current.id === savedDefault.id)
50
52
  return;
51
53
  await result.session.setModel(savedDefault);
52
54
  }
53
- //# sourceMappingURL=session.js.map
@@ -1,9 +1,11 @@
1
- import { type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
1
+ import { type ExtensionAPI, type ExtensionContext, type ModelRuntime } from "@earendil-works/pi-coding-agent";
2
2
  type SetupMode = "startup" | "manual";
3
3
  type SetupRequirement = "ready" | "select_model" | "connect_auth";
4
+ type ApiKeyProviderId = "google" | "openai" | "anthropic";
4
5
  type SetupResult = "ready" | "shutdown" | "cancelled";
5
6
  export declare function getLlmSetupRequirement(ctx: Pick<ExtensionContext, "model" | "modelRegistry">): SetupRequirement;
7
+ export declare function runApiKeySetup(ctx: ExtensionContext, provider: ApiKeyProviderId, modelRuntime: ModelRuntime): Promise<boolean>;
6
8
  export declare function runOpenCandleSetup(api: ExtensionAPI, ctx: ExtensionContext, options?: {
7
9
  mode: SetupMode;
8
- }): Promise<SetupResult>;
10
+ }, modelRuntime?: ModelRuntime): Promise<SetupResult>;
9
11
  export {};