opencandle 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/README.md +20 -24
  2. package/dist/analysts/contracts.js +0 -1
  3. package/dist/analysts/orchestrator.js +0 -1
  4. package/dist/cli-main.js +13 -7
  5. package/dist/cli-options.d.ts +4 -0
  6. package/dist/cli-options.js +33 -0
  7. package/dist/cli.js +8 -3
  8. package/dist/config.js +0 -1
  9. package/dist/doctor/cli-command.js +2 -1
  10. package/dist/doctor/render.js +0 -1
  11. package/dist/doctor/report.js +40 -11
  12. package/dist/gui/server/ask-user-bridge.d.ts +19 -0
  13. package/dist/gui/server/ask-user-bridge.js +55 -0
  14. package/dist/gui/server/automation-heartbeat.d.ts +25 -0
  15. package/dist/gui/server/automation-heartbeat.js +61 -0
  16. package/dist/gui/server/background-quotes.d.ts +39 -0
  17. package/dist/gui/server/background-quotes.js +71 -0
  18. package/dist/gui/server/chat-event-adapter.d.ts +16 -0
  19. package/dist/gui/server/chat-event-adapter.js +263 -0
  20. package/dist/gui/server/gui-session-manager.d.ts +2 -0
  21. package/dist/gui/server/gui-session-manager.js +4 -0
  22. package/dist/gui/server/http-routes.d.ts +69 -0
  23. package/dist/gui/server/http-routes.js +1008 -0
  24. package/dist/gui/server/invoke-tool.d.ts +47 -0
  25. package/dist/gui/server/invoke-tool.js +373 -0
  26. package/dist/gui/server/live-chat-event-adapter.d.ts +19 -0
  27. package/dist/gui/server/live-chat-event-adapter.js +206 -0
  28. package/dist/gui/server/local-session-coordinator.d.ts +26 -0
  29. package/dist/gui/server/local-session-coordinator.js +53 -0
  30. package/dist/gui/server/market-state-api.d.ts +138 -0
  31. package/dist/gui/server/market-state-api.js +355 -0
  32. package/dist/gui/server/model-setup.d.ts +64 -0
  33. package/dist/gui/server/model-setup.js +150 -0
  34. package/dist/gui/server/private-api-access.d.ts +6 -0
  35. package/dist/gui/server/private-api-access.js +53 -0
  36. package/dist/gui/server/projector.d.ts +49 -0
  37. package/dist/gui/server/projector.js +296 -0
  38. package/dist/gui/server/prompt-observation.d.ts +8 -0
  39. package/dist/gui/server/prompt-observation.js +43 -0
  40. package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
  41. package/dist/gui/server/quote-snapshot-store.js +49 -0
  42. package/dist/gui/server/server.d.ts +1 -0
  43. package/dist/gui/server/server.js +259 -0
  44. package/dist/gui/server/session-actions.d.ts +60 -0
  45. package/dist/gui/server/session-actions.js +218 -0
  46. package/dist/gui/server/session-entry-wait.d.ts +27 -0
  47. package/dist/gui/server/session-entry-wait.js +129 -0
  48. package/dist/gui/server/session-list.d.ts +2 -0
  49. package/dist/gui/server/session-list.js +11 -0
  50. package/dist/gui/server/shutdown.d.ts +10 -0
  51. package/dist/gui/server/shutdown.js +29 -0
  52. package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
  53. package/dist/gui/server/tool-invoke-ack.js +26 -0
  54. package/dist/gui/server/tool-metadata.d.ts +93 -0
  55. package/dist/gui/server/tool-metadata.js +148 -0
  56. package/dist/gui/server/websocket.d.ts +9 -0
  57. package/dist/gui/server/websocket.js +124 -0
  58. package/dist/gui/server/writer-lock.d.ts +1 -0
  59. package/dist/gui/server/writer-lock.js +1 -0
  60. package/dist/gui/server/ws-hub.d.ts +50 -0
  61. package/dist/gui/server/ws-hub.js +284 -0
  62. package/dist/gui/shared/chat-events.d.ts +174 -0
  63. package/dist/gui/shared/chat-events.js +13 -0
  64. package/dist/gui/shared/event-reducer.d.ts +3 -0
  65. package/dist/gui/shared/event-reducer.js +187 -0
  66. package/dist/index.js +0 -1
  67. package/dist/infra/cache.js +0 -1
  68. package/dist/infra/freshness.js +0 -1
  69. package/dist/infra/http-client.js +1 -2
  70. package/dist/infra/index.js +0 -1
  71. package/dist/infra/market-calendar.js +0 -1
  72. package/dist/infra/native-dependencies.js +0 -1
  73. package/dist/infra/node-version.js +0 -1
  74. package/dist/infra/open-url.js +0 -1
  75. package/dist/infra/opencandle-paths.js +0 -1
  76. package/dist/infra/rate-limiter.js +0 -1
  77. package/dist/market-state/alert-conditions.js +0 -1
  78. package/dist/market-state/alert-runner.d.ts +1 -0
  79. package/dist/market-state/alert-runner.js +5 -4
  80. package/dist/market-state/daily-report.js +0 -1
  81. package/dist/market-state/local-automation-service.js +0 -1
  82. package/dist/market-state/notification-delivery.js +0 -1
  83. package/dist/market-state/resolve-for-mutation.js +0 -1
  84. package/dist/market-state/resolve.js +0 -1
  85. package/dist/market-state/service.d.ts +26 -21
  86. package/dist/market-state/service.js +175 -36
  87. package/dist/market-state/summaries.js +1 -13
  88. package/dist/memory/index.js +0 -1
  89. package/dist/memory/manager.js +0 -1
  90. package/dist/memory/preference-extractor.js +0 -1
  91. package/dist/memory/retrieval.js +0 -1
  92. package/dist/memory/sqlite.js +60 -11
  93. package/dist/memory/storage.js +0 -1
  94. package/dist/memory/tool-defaults.js +0 -1
  95. package/dist/memory/types.js +0 -1
  96. package/dist/monitor.js +0 -1
  97. package/dist/onboarding/connect.js +0 -1
  98. package/dist/onboarding/credential-interceptor.js +0 -1
  99. package/dist/onboarding/degradation-accumulator.js +0 -1
  100. package/dist/onboarding/prompt-user.d.ts +1 -1
  101. package/dist/onboarding/prompt-user.js +0 -1
  102. package/dist/onboarding/provider-status.js +0 -1
  103. package/dist/onboarding/providers.js +0 -1
  104. package/dist/onboarding/state.js +0 -1
  105. package/dist/onboarding/tool-helpers.js +0 -1
  106. package/dist/onboarding/tool-tags.js +0 -1
  107. package/dist/onboarding/validate-model-key.d.ts +17 -0
  108. package/dist/onboarding/validate-model-key.js +54 -0
  109. package/dist/onboarding/validation.js +0 -1
  110. package/dist/pi/opencandle-extension.js +2 -2
  111. package/dist/pi/session-action-dedupe.js +0 -1
  112. package/dist/pi/session-storage.js +0 -1
  113. package/dist/pi/session-writer-lock.js +0 -1
  114. package/dist/pi/session.js +0 -1
  115. package/dist/pi/setup.d.ts +2 -0
  116. package/dist/pi/setup.js +10 -3
  117. package/dist/pi/tool-adapter.js +0 -1
  118. package/dist/pi/tui-session-coordinator.js +0 -1
  119. package/dist/prompts/context-builder.js +1 -2
  120. package/dist/prompts/disclaimer.js +0 -1
  121. package/dist/prompts/policy-cards.js +0 -1
  122. package/dist/prompts/sections.js +0 -1
  123. package/dist/prompts/symbol-preflight.js +0 -1
  124. package/dist/prompts/workflow-prompts.js +0 -1
  125. package/dist/providers/alpha-vantage.js +2 -3
  126. package/dist/providers/coingecko.js +0 -1
  127. package/dist/providers/errors.js +0 -1
  128. package/dist/providers/exa-search.js +11 -10
  129. package/dist/providers/external-tool-command.js +0 -1
  130. package/dist/providers/external-tool-error.js +0 -1
  131. package/dist/providers/fear-greed.js +0 -1
  132. package/dist/providers/finnhub.js +0 -1
  133. package/dist/providers/fred.js +0 -1
  134. package/dist/providers/index.js +0 -1
  135. package/dist/providers/polymarket.js +0 -1
  136. package/dist/providers/provider-credential-error.js +0 -1
  137. package/dist/providers/reddit-cli.js +0 -1
  138. package/dist/providers/reddit.js +0 -1
  139. package/dist/providers/sec-edgar.js +0 -1
  140. package/dist/providers/tradingview.js +1 -2
  141. package/dist/providers/twitter-cli.js +0 -1
  142. package/dist/providers/twitter.js +0 -1
  143. package/dist/providers/web-search.js +15 -12
  144. package/dist/providers/with-fallback.js +0 -1
  145. package/dist/providers/wrap-provider.js +0 -1
  146. package/dist/providers/yahoo-finance.js +67 -4
  147. package/dist/routing/classify-intent.js +0 -1
  148. package/dist/routing/defaults.js +0 -1
  149. package/dist/routing/entity-extractor.js +2 -3
  150. package/dist/routing/fund-symbols.js +0 -1
  151. package/dist/routing/horizon.js +0 -1
  152. package/dist/routing/index.js +0 -1
  153. package/dist/routing/legacy-rule-router.js +0 -1
  154. package/dist/routing/planning.js +0 -1
  155. package/dist/routing/route-manifest.js +0 -1
  156. package/dist/routing/router-llm-client.d.ts +2 -2
  157. package/dist/routing/router-llm-client.js +0 -1
  158. package/dist/routing/router-prompt.js +0 -1
  159. package/dist/routing/router-types.js +0 -1
  160. package/dist/routing/router.js +1 -2
  161. package/dist/routing/slot-resolver.js +0 -1
  162. package/dist/routing/symbol-disambiguator.js +0 -1
  163. package/dist/routing/turn-context.js +0 -1
  164. package/dist/routing/types.js +0 -1
  165. package/dist/runtime/answer-contracts.js +0 -1
  166. package/dist/runtime/artifact-contracts.js +0 -1
  167. package/dist/runtime/evidence.js +0 -1
  168. package/dist/runtime/numeric-claims.js +0 -1
  169. package/dist/runtime/planning-evidence.js +0 -1
  170. package/dist/runtime/prompt-step.js +0 -1
  171. package/dist/runtime/provider-tracker.js +0 -1
  172. package/dist/runtime/run-context.js +0 -1
  173. package/dist/runtime/session-coordinator.js +0 -1
  174. package/dist/runtime/session-title.js +0 -1
  175. package/dist/runtime/tool-defaults-wrapper.js +0 -1
  176. package/dist/runtime/validation.js +0 -1
  177. package/dist/runtime/workflow-events.js +0 -1
  178. package/dist/runtime/workflow-runner.d.ts +1 -0
  179. package/dist/runtime/workflow-runner.js +8 -3
  180. package/dist/runtime/workflow-types.js +0 -1
  181. package/dist/sentiment/adapters/finnhub.js +0 -1
  182. package/dist/sentiment/adapters/reddit.js +0 -1
  183. package/dist/sentiment/adapters/twitter.js +0 -1
  184. package/dist/sentiment/adapters/web.js +0 -1
  185. package/dist/sentiment/index.js +4 -2
  186. package/dist/sentiment/insights.js +0 -1
  187. package/dist/sentiment/keywords.js +0 -1
  188. package/dist/sentiment/pipeline.js +0 -1
  189. package/dist/sentiment/scorer.js +0 -1
  190. package/dist/sentiment/store.js +0 -1
  191. package/dist/sentiment/trends.js +0 -1
  192. package/dist/sentiment/types.js +0 -1
  193. package/dist/system-prompt.js +0 -1
  194. package/dist/tool-kit.js +0 -1
  195. package/dist/tools/fundamentals/company-overview.d.ts +1 -1
  196. package/dist/tools/fundamentals/company-overview.js +2 -1
  197. package/dist/tools/fundamentals/comps.js +6 -4
  198. package/dist/tools/fundamentals/dcf.js +0 -1
  199. package/dist/tools/fundamentals/earnings.d.ts +1 -1
  200. package/dist/tools/fundamentals/earnings.js +2 -1
  201. package/dist/tools/fundamentals/financials.js +2 -1
  202. package/dist/tools/fundamentals/sec-filings.js +0 -1
  203. package/dist/tools/index.d.ts +116 -2
  204. package/dist/tools/index.js +0 -1
  205. package/dist/tools/interaction/ask-user.js +11 -1
  206. package/dist/tools/macro/event-probabilities.js +0 -1
  207. package/dist/tools/macro/fear-greed.d.ts +1 -1
  208. package/dist/tools/macro/fear-greed.js +0 -1
  209. package/dist/tools/macro/fred-data.d.ts +1 -1
  210. package/dist/tools/macro/fred-data.js +2 -1
  211. package/dist/tools/market/crypto-history.js +0 -1
  212. package/dist/tools/market/crypto-price.d.ts +2 -2
  213. package/dist/tools/market/crypto-price.js +0 -1
  214. package/dist/tools/market/screen-stocks.js +0 -1
  215. package/dist/tools/market/search-ticker.js +1 -2
  216. package/dist/tools/market/stock-history.js +0 -1
  217. package/dist/tools/market/stock-quote.d.ts +2 -2
  218. package/dist/tools/market/stock-quote.js +0 -1
  219. package/dist/tools/options/greeks.js +0 -1
  220. package/dist/tools/options/option-chain.d.ts +2 -2
  221. package/dist/tools/options/option-chain.js +0 -1
  222. package/dist/tools/portfolio/alerts.d.ts +2 -1
  223. package/dist/tools/portfolio/alerts.js +228 -2
  224. package/dist/tools/portfolio/correlation.js +23 -5
  225. package/dist/tools/portfolio/daily-report.js +0 -1
  226. package/dist/tools/portfolio/holdings-overlap.js +0 -1
  227. package/dist/tools/portfolio/notifications.js +0 -1
  228. package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
  229. package/dist/tools/portfolio/risk-analysis.js +0 -1
  230. package/dist/tools/portfolio/tracker.d.ts +3 -1
  231. package/dist/tools/portfolio/tracker.js +57 -10
  232. package/dist/tools/portfolio/watchlist.d.ts +3 -6
  233. package/dist/tools/portfolio/watchlist.js +101 -110
  234. package/dist/tools/sentiment/insight-format.js +0 -1
  235. package/dist/tools/sentiment/query-match.js +0 -1
  236. package/dist/tools/sentiment/reddit-sentiment.js +0 -1
  237. package/dist/tools/sentiment/sentiment-summary.js +8 -4
  238. package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
  239. package/dist/tools/sentiment/sentiment-trend.js +6 -2
  240. package/dist/tools/sentiment/twitter-sentiment.js +0 -1
  241. package/dist/tools/sentiment/untrusted-text.js +0 -1
  242. package/dist/tools/sentiment/web-search.d.ts +1 -1
  243. package/dist/tools/sentiment/web-search.js +0 -1
  244. package/dist/tools/sentiment/web-sentiment.js +0 -1
  245. package/dist/tools/technical/backtest.js +0 -1
  246. package/dist/tools/technical/indicators.js +0 -1
  247. package/dist/types/fundamentals.js +0 -1
  248. package/dist/types/index.js +0 -1
  249. package/dist/types/macro.js +0 -1
  250. package/dist/types/market.d.ts +6 -0
  251. package/dist/types/market.js +0 -1
  252. package/dist/types/options.js +0 -1
  253. package/dist/types/portfolio.js +0 -1
  254. package/dist/types/prediction-markets.js +0 -1
  255. package/dist/types/sentiment.js +0 -1
  256. package/dist/workflows/compare-assets.js +0 -1
  257. package/dist/workflows/index.js +0 -1
  258. package/dist/workflows/options-screener.js +0 -1
  259. package/dist/workflows/portfolio-builder.js +0 -1
  260. package/gui/web/dist/assets/CatalogOverlay-CAc7e3Pf.js +1 -0
  261. package/gui/web/dist/assets/index-BOEKd9wT.css +2 -0
  262. package/gui/web/dist/assets/index-C-H05cQ2.js +65 -0
  263. package/gui/web/dist/index.html +2 -2
  264. package/package.json +11 -12
  265. package/dist/analysts/contracts.js.map +0 -1
  266. package/dist/analysts/orchestrator.js.map +0 -1
  267. package/dist/cli-main.js.map +0 -1
  268. package/dist/cli.js.map +0 -1
  269. package/dist/config.js.map +0 -1
  270. package/dist/doctor/cli-command.js.map +0 -1
  271. package/dist/doctor/render.js.map +0 -1
  272. package/dist/doctor/report.js.map +0 -1
  273. package/dist/index.js.map +0 -1
  274. package/dist/infra/cache.js.map +0 -1
  275. package/dist/infra/freshness.js.map +0 -1
  276. package/dist/infra/http-client.js.map +0 -1
  277. package/dist/infra/index.js.map +0 -1
  278. package/dist/infra/market-calendar.js.map +0 -1
  279. package/dist/infra/native-dependencies.js.map +0 -1
  280. package/dist/infra/node-version.js.map +0 -1
  281. package/dist/infra/open-url.js.map +0 -1
  282. package/dist/infra/opencandle-paths.js.map +0 -1
  283. package/dist/infra/rate-limiter.js.map +0 -1
  284. package/dist/market-state/alert-conditions.js.map +0 -1
  285. package/dist/market-state/alert-runner.js.map +0 -1
  286. package/dist/market-state/daily-report.js.map +0 -1
  287. package/dist/market-state/local-automation-service.js.map +0 -1
  288. package/dist/market-state/notification-delivery.js.map +0 -1
  289. package/dist/market-state/resolve-for-mutation.js.map +0 -1
  290. package/dist/market-state/resolve.js.map +0 -1
  291. package/dist/market-state/service.js.map +0 -1
  292. package/dist/market-state/summaries.js.map +0 -1
  293. package/dist/memory/index.js.map +0 -1
  294. package/dist/memory/manager.js.map +0 -1
  295. package/dist/memory/preference-extractor.js.map +0 -1
  296. package/dist/memory/retrieval.js.map +0 -1
  297. package/dist/memory/sqlite.js.map +0 -1
  298. package/dist/memory/storage.js.map +0 -1
  299. package/dist/memory/tool-defaults.js.map +0 -1
  300. package/dist/memory/types.js.map +0 -1
  301. package/dist/monitor.js.map +0 -1
  302. package/dist/onboarding/connect.js.map +0 -1
  303. package/dist/onboarding/credential-interceptor.js.map +0 -1
  304. package/dist/onboarding/degradation-accumulator.js.map +0 -1
  305. package/dist/onboarding/prompt-user.js.map +0 -1
  306. package/dist/onboarding/provider-status.js.map +0 -1
  307. package/dist/onboarding/providers.js.map +0 -1
  308. package/dist/onboarding/state.js.map +0 -1
  309. package/dist/onboarding/tool-helpers.js.map +0 -1
  310. package/dist/onboarding/tool-tags.js.map +0 -1
  311. package/dist/onboarding/validation.js.map +0 -1
  312. package/dist/pi/opencandle-extension.js.map +0 -1
  313. package/dist/pi/session-action-dedupe.js.map +0 -1
  314. package/dist/pi/session-storage.js.map +0 -1
  315. package/dist/pi/session-writer-lock.js.map +0 -1
  316. package/dist/pi/session.js.map +0 -1
  317. package/dist/pi/setup.js.map +0 -1
  318. package/dist/pi/tool-adapter.js.map +0 -1
  319. package/dist/pi/tui-session-coordinator.js.map +0 -1
  320. package/dist/prompts/context-builder.js.map +0 -1
  321. package/dist/prompts/disclaimer.js.map +0 -1
  322. package/dist/prompts/policy-cards.js.map +0 -1
  323. package/dist/prompts/sections.js.map +0 -1
  324. package/dist/prompts/symbol-preflight.js.map +0 -1
  325. package/dist/prompts/workflow-prompts.js.map +0 -1
  326. package/dist/providers/alpha-vantage.js.map +0 -1
  327. package/dist/providers/coingecko.js.map +0 -1
  328. package/dist/providers/errors.js.map +0 -1
  329. package/dist/providers/exa-search.js.map +0 -1
  330. package/dist/providers/external-tool-command.js.map +0 -1
  331. package/dist/providers/external-tool-error.js.map +0 -1
  332. package/dist/providers/fear-greed.js.map +0 -1
  333. package/dist/providers/finnhub.js.map +0 -1
  334. package/dist/providers/fred.js.map +0 -1
  335. package/dist/providers/index.js.map +0 -1
  336. package/dist/providers/polymarket.js.map +0 -1
  337. package/dist/providers/provider-credential-error.js.map +0 -1
  338. package/dist/providers/reddit-cli.js.map +0 -1
  339. package/dist/providers/reddit.js.map +0 -1
  340. package/dist/providers/sec-edgar.js.map +0 -1
  341. package/dist/providers/tradingview.js.map +0 -1
  342. package/dist/providers/twitter-cli.js.map +0 -1
  343. package/dist/providers/twitter.js.map +0 -1
  344. package/dist/providers/web-search.js.map +0 -1
  345. package/dist/providers/with-fallback.js.map +0 -1
  346. package/dist/providers/wrap-provider.js.map +0 -1
  347. package/dist/providers/yahoo-finance.js.map +0 -1
  348. package/dist/routing/classify-intent.js.map +0 -1
  349. package/dist/routing/defaults.js.map +0 -1
  350. package/dist/routing/entity-extractor.js.map +0 -1
  351. package/dist/routing/fund-symbols.js.map +0 -1
  352. package/dist/routing/horizon.js.map +0 -1
  353. package/dist/routing/index.js.map +0 -1
  354. package/dist/routing/legacy-rule-router.js.map +0 -1
  355. package/dist/routing/planning.js.map +0 -1
  356. package/dist/routing/route-manifest.js.map +0 -1
  357. package/dist/routing/router-llm-client.js.map +0 -1
  358. package/dist/routing/router-prompt.js.map +0 -1
  359. package/dist/routing/router-types.js.map +0 -1
  360. package/dist/routing/router.js.map +0 -1
  361. package/dist/routing/slot-resolver.js.map +0 -1
  362. package/dist/routing/symbol-disambiguator.js.map +0 -1
  363. package/dist/routing/turn-context.js.map +0 -1
  364. package/dist/routing/types.js.map +0 -1
  365. package/dist/runtime/answer-contracts.js.map +0 -1
  366. package/dist/runtime/artifact-contracts.js.map +0 -1
  367. package/dist/runtime/evidence.js.map +0 -1
  368. package/dist/runtime/numeric-claims.js.map +0 -1
  369. package/dist/runtime/planning-evidence.js.map +0 -1
  370. package/dist/runtime/prompt-step.js.map +0 -1
  371. package/dist/runtime/provider-tracker.js.map +0 -1
  372. package/dist/runtime/run-context.js.map +0 -1
  373. package/dist/runtime/session-coordinator.js.map +0 -1
  374. package/dist/runtime/session-title.js.map +0 -1
  375. package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
  376. package/dist/runtime/validation.js.map +0 -1
  377. package/dist/runtime/workflow-events.js.map +0 -1
  378. package/dist/runtime/workflow-runner.js.map +0 -1
  379. package/dist/runtime/workflow-types.js.map +0 -1
  380. package/dist/sentiment/adapters/finnhub.js.map +0 -1
  381. package/dist/sentiment/adapters/reddit.js.map +0 -1
  382. package/dist/sentiment/adapters/twitter.js.map +0 -1
  383. package/dist/sentiment/adapters/web.js.map +0 -1
  384. package/dist/sentiment/index.js.map +0 -1
  385. package/dist/sentiment/insights.js.map +0 -1
  386. package/dist/sentiment/keywords.js.map +0 -1
  387. package/dist/sentiment/pipeline.js.map +0 -1
  388. package/dist/sentiment/scorer.js.map +0 -1
  389. package/dist/sentiment/store.js.map +0 -1
  390. package/dist/sentiment/trends.js.map +0 -1
  391. package/dist/sentiment/types.js.map +0 -1
  392. package/dist/system-prompt.js.map +0 -1
  393. package/dist/tool-kit.js.map +0 -1
  394. package/dist/tools/fundamentals/company-overview.js.map +0 -1
  395. package/dist/tools/fundamentals/comps.js.map +0 -1
  396. package/dist/tools/fundamentals/dcf.js.map +0 -1
  397. package/dist/tools/fundamentals/earnings.js.map +0 -1
  398. package/dist/tools/fundamentals/financials.js.map +0 -1
  399. package/dist/tools/fundamentals/sec-filings.js.map +0 -1
  400. package/dist/tools/index.js.map +0 -1
  401. package/dist/tools/interaction/ask-user.js.map +0 -1
  402. package/dist/tools/macro/event-probabilities.js.map +0 -1
  403. package/dist/tools/macro/fear-greed.js.map +0 -1
  404. package/dist/tools/macro/fred-data.js.map +0 -1
  405. package/dist/tools/market/crypto-history.js.map +0 -1
  406. package/dist/tools/market/crypto-price.js.map +0 -1
  407. package/dist/tools/market/screen-stocks.js.map +0 -1
  408. package/dist/tools/market/search-ticker.js.map +0 -1
  409. package/dist/tools/market/stock-history.js.map +0 -1
  410. package/dist/tools/market/stock-quote.js.map +0 -1
  411. package/dist/tools/options/greeks.js.map +0 -1
  412. package/dist/tools/options/option-chain.js.map +0 -1
  413. package/dist/tools/portfolio/alerts.js.map +0 -1
  414. package/dist/tools/portfolio/correlation.js.map +0 -1
  415. package/dist/tools/portfolio/daily-report.js.map +0 -1
  416. package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
  417. package/dist/tools/portfolio/notifications.js.map +0 -1
  418. package/dist/tools/portfolio/risk-analysis.js.map +0 -1
  419. package/dist/tools/portfolio/tracker.js.map +0 -1
  420. package/dist/tools/portfolio/watchlist.js.map +0 -1
  421. package/dist/tools/sentiment/insight-format.js.map +0 -1
  422. package/dist/tools/sentiment/query-match.js.map +0 -1
  423. package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
  424. package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
  425. package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
  426. package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
  427. package/dist/tools/sentiment/untrusted-text.js.map +0 -1
  428. package/dist/tools/sentiment/web-search.js.map +0 -1
  429. package/dist/tools/sentiment/web-sentiment.js.map +0 -1
  430. package/dist/tools/technical/backtest.js.map +0 -1
  431. package/dist/tools/technical/indicators.js.map +0 -1
  432. package/dist/types/fundamentals.js.map +0 -1
  433. package/dist/types/index.js.map +0 -1
  434. package/dist/types/macro.js.map +0 -1
  435. package/dist/types/market.js.map +0 -1
  436. package/dist/types/options.js.map +0 -1
  437. package/dist/types/portfolio.js.map +0 -1
  438. package/dist/types/prediction-markets.js.map +0 -1
  439. package/dist/types/sentiment.js.map +0 -1
  440. package/dist/workflows/compare-assets.js.map +0 -1
  441. package/dist/workflows/index.js.map +0 -1
  442. package/dist/workflows/options-screener.js.map +0 -1
  443. package/dist/workflows/portfolio-builder.js.map +0 -1
  444. package/gui/server/ask-user-bridge.ts +0 -89
  445. package/gui/server/automation-heartbeat.ts +0 -97
  446. package/gui/server/background-quotes.ts +0 -127
  447. package/gui/server/chat-event-adapter.ts +0 -294
  448. package/gui/server/gui-session-manager.ts +0 -5
  449. package/gui/server/http-routes.ts +0 -1201
  450. package/gui/server/invoke-tool.ts +0 -490
  451. package/gui/server/live-chat-event-adapter.ts +0 -243
  452. package/gui/server/local-session-coordinator.ts +0 -97
  453. package/gui/server/market-state-api.ts +0 -331
  454. package/gui/server/model-setup.ts +0 -254
  455. package/gui/server/package.json +0 -5
  456. package/gui/server/private-api-access.ts +0 -62
  457. package/gui/server/projector.ts +0 -392
  458. package/gui/server/prompt-observation.ts +0 -58
  459. package/gui/server/quote-snapshot-store.ts +0 -50
  460. package/gui/server/server.ts +0 -289
  461. package/gui/server/session-actions.ts +0 -323
  462. package/gui/server/session-entry-wait.ts +0 -179
  463. package/gui/server/shutdown.ts +0 -47
  464. package/gui/server/tool-invoke-ack.ts +0 -49
  465. package/gui/server/tool-metadata.ts +0 -167
  466. package/gui/server/websocket.ts +0 -138
  467. package/gui/server/writer-lock.ts +0 -1
  468. package/gui/server/ws-hub.ts +0 -403
  469. package/gui/shared/chat-events.ts +0 -165
  470. package/gui/shared/event-reducer.ts +0 -220
  471. package/gui/web/dist/assets/CatalogOverlay-DZ1niyQm.js +0 -1
  472. package/gui/web/dist/assets/index-D4F9AJnn.css +0 -2
  473. package/gui/web/dist/assets/index-DtqMMBTr.js +0 -65
  474. package/src/analysts/contracts.ts +0 -176
  475. package/src/analysts/orchestrator.ts +0 -244
  476. package/src/cli-main.ts +0 -510
  477. package/src/cli.ts +0 -17
  478. package/src/config.ts +0 -272
  479. package/src/doctor/cli-command.ts +0 -83
  480. package/src/doctor/render.ts +0 -37
  481. package/src/doctor/report.ts +0 -638
  482. package/src/index.ts +0 -5
  483. package/src/infra/cache.ts +0 -127
  484. package/src/infra/freshness.ts +0 -165
  485. package/src/infra/http-client.ts +0 -134
  486. package/src/infra/index.ts +0 -14
  487. package/src/infra/market-calendar.ts +0 -193
  488. package/src/infra/native-dependencies.ts +0 -84
  489. package/src/infra/node-version.ts +0 -23
  490. package/src/infra/open-url.ts +0 -28
  491. package/src/infra/opencandle-paths.ts +0 -53
  492. package/src/infra/rate-limiter.ts +0 -77
  493. package/src/market-state/alert-conditions.ts +0 -82
  494. package/src/market-state/alert-runner.ts +0 -863
  495. package/src/market-state/daily-report.ts +0 -237
  496. package/src/market-state/local-automation-service.ts +0 -162
  497. package/src/market-state/notification-delivery.ts +0 -158
  498. package/src/market-state/resolve-for-mutation.ts +0 -24
  499. package/src/market-state/resolve.ts +0 -112
  500. package/src/market-state/service.ts +0 -2208
  501. package/src/market-state/summaries.ts +0 -75
  502. package/src/memory/index.ts +0 -10
  503. package/src/memory/manager.ts +0 -190
  504. package/src/memory/preference-extractor.ts +0 -106
  505. package/src/memory/retrieval.ts +0 -71
  506. package/src/memory/sqlite.ts +0 -577
  507. package/src/memory/storage.ts +0 -195
  508. package/src/memory/tool-defaults.ts +0 -108
  509. package/src/memory/types.ts +0 -71
  510. package/src/monitor.ts +0 -123
  511. package/src/onboarding/connect.ts +0 -177
  512. package/src/onboarding/credential-interceptor.ts +0 -122
  513. package/src/onboarding/degradation-accumulator.ts +0 -77
  514. package/src/onboarding/prompt-user.ts +0 -85
  515. package/src/onboarding/provider-status.ts +0 -382
  516. package/src/onboarding/providers.ts +0 -442
  517. package/src/onboarding/state.ts +0 -216
  518. package/src/onboarding/tool-helpers.ts +0 -104
  519. package/src/onboarding/tool-tags.ts +0 -244
  520. package/src/onboarding/validation.ts +0 -152
  521. package/src/pi/opencandle-extension.ts +0 -1294
  522. package/src/pi/session-action-dedupe.ts +0 -155
  523. package/src/pi/session-storage.ts +0 -5
  524. package/src/pi/session-writer-lock.ts +0 -426
  525. package/src/pi/session.ts +0 -84
  526. package/src/pi/setup.ts +0 -399
  527. package/src/pi/tool-adapter.ts +0 -49
  528. package/src/pi/tui-session-coordinator.ts +0 -351
  529. package/src/prompts/context-builder.ts +0 -326
  530. package/src/prompts/disclaimer.ts +0 -9
  531. package/src/prompts/policy-cards.ts +0 -228
  532. package/src/prompts/sections.ts +0 -46
  533. package/src/prompts/symbol-preflight.ts +0 -80
  534. package/src/prompts/workflow-prompts.ts +0 -504
  535. package/src/providers/alpha-vantage.ts +0 -340
  536. package/src/providers/coingecko.ts +0 -95
  537. package/src/providers/errors.ts +0 -9
  538. package/src/providers/exa-search.ts +0 -375
  539. package/src/providers/external-tool-command.ts +0 -164
  540. package/src/providers/external-tool-error.ts +0 -20
  541. package/src/providers/fear-greed.ts +0 -45
  542. package/src/providers/finnhub.ts +0 -125
  543. package/src/providers/fred.ts +0 -83
  544. package/src/providers/index.ts +0 -17
  545. package/src/providers/polymarket.ts +0 -214
  546. package/src/providers/provider-credential-error.ts +0 -23
  547. package/src/providers/reddit-cli.ts +0 -286
  548. package/src/providers/reddit.ts +0 -106
  549. package/src/providers/sec-edgar.ts +0 -326
  550. package/src/providers/tradingview.ts +0 -399
  551. package/src/providers/twitter-cli.ts +0 -202
  552. package/src/providers/twitter.ts +0 -102
  553. package/src/providers/web-search.ts +0 -303
  554. package/src/providers/with-fallback.ts +0 -42
  555. package/src/providers/wrap-provider.ts +0 -105
  556. package/src/providers/yahoo-finance.ts +0 -984
  557. package/src/routing/classify-intent.ts +0 -380
  558. package/src/routing/defaults.ts +0 -29
  559. package/src/routing/entity-extractor.ts +0 -557
  560. package/src/routing/fund-symbols.ts +0 -58
  561. package/src/routing/horizon.ts +0 -7
  562. package/src/routing/index.ts +0 -70
  563. package/src/routing/legacy-rule-router.ts +0 -13
  564. package/src/routing/planning.ts +0 -829
  565. package/src/routing/route-manifest.ts +0 -308
  566. package/src/routing/router-llm-client.ts +0 -64
  567. package/src/routing/router-prompt.ts +0 -159
  568. package/src/routing/router-types.ts +0 -84
  569. package/src/routing/router.ts +0 -1332
  570. package/src/routing/slot-resolver.ts +0 -213
  571. package/src/routing/symbol-disambiguator.ts +0 -72
  572. package/src/routing/turn-context.ts +0 -108
  573. package/src/routing/types.ts +0 -77
  574. package/src/runtime/answer-contracts.ts +0 -693
  575. package/src/runtime/artifact-contracts.ts +0 -77
  576. package/src/runtime/evidence.ts +0 -78
  577. package/src/runtime/numeric-claims.ts +0 -108
  578. package/src/runtime/planning-evidence.ts +0 -597
  579. package/src/runtime/prompt-step.ts +0 -185
  580. package/src/runtime/provider-tracker.ts +0 -40
  581. package/src/runtime/run-context.ts +0 -32
  582. package/src/runtime/session-coordinator.ts +0 -1037
  583. package/src/runtime/session-title.ts +0 -60
  584. package/src/runtime/tool-defaults-wrapper.ts +0 -43
  585. package/src/runtime/validation.ts +0 -211
  586. package/src/runtime/workflow-events.ts +0 -77
  587. package/src/runtime/workflow-runner.ts +0 -182
  588. package/src/runtime/workflow-types.ts +0 -105
  589. package/src/sentiment/adapters/finnhub.ts +0 -49
  590. package/src/sentiment/adapters/reddit.ts +0 -65
  591. package/src/sentiment/adapters/twitter.ts +0 -36
  592. package/src/sentiment/adapters/web.ts +0 -44
  593. package/src/sentiment/index.ts +0 -49
  594. package/src/sentiment/insights.ts +0 -269
  595. package/src/sentiment/keywords.ts +0 -31
  596. package/src/sentiment/pipeline.ts +0 -91
  597. package/src/sentiment/scorer.ts +0 -89
  598. package/src/sentiment/store.ts +0 -260
  599. package/src/sentiment/trends.ts +0 -96
  600. package/src/sentiment/types.ts +0 -112
  601. package/src/system-prompt.ts +0 -115
  602. package/src/tool-kit.ts +0 -69
  603. package/src/tools/AGENTS.md +0 -36
  604. package/src/tools/fundamentals/company-overview.ts +0 -64
  605. package/src/tools/fundamentals/comps.ts +0 -180
  606. package/src/tools/fundamentals/dcf.ts +0 -447
  607. package/src/tools/fundamentals/earnings.ts +0 -57
  608. package/src/tools/fundamentals/financials.ts +0 -63
  609. package/src/tools/fundamentals/sec-filings.ts +0 -105
  610. package/src/tools/index.ts +0 -104
  611. package/src/tools/interaction/ask-user.ts +0 -93
  612. package/src/tools/macro/event-probabilities.ts +0 -141
  613. package/src/tools/macro/fear-greed.ts +0 -41
  614. package/src/tools/macro/fred-data.ts +0 -92
  615. package/src/tools/market/crypto-history.ts +0 -72
  616. package/src/tools/market/crypto-price.ts +0 -65
  617. package/src/tools/market/screen-stocks.ts +0 -290
  618. package/src/tools/market/search-ticker.ts +0 -254
  619. package/src/tools/market/stock-history.ts +0 -104
  620. package/src/tools/market/stock-quote.ts +0 -73
  621. package/src/tools/options/greeks.ts +0 -81
  622. package/src/tools/options/option-chain.ts +0 -134
  623. package/src/tools/portfolio/alerts.ts +0 -457
  624. package/src/tools/portfolio/correlation.ts +0 -189
  625. package/src/tools/portfolio/daily-report.ts +0 -107
  626. package/src/tools/portfolio/holdings-overlap.ts +0 -139
  627. package/src/tools/portfolio/notifications.ts +0 -45
  628. package/src/tools/portfolio/risk-analysis.ts +0 -173
  629. package/src/tools/portfolio/tracker.ts +0 -308
  630. package/src/tools/portfolio/watchlist.ts +0 -288
  631. package/src/tools/sentiment/insight-format.ts +0 -50
  632. package/src/tools/sentiment/query-match.ts +0 -117
  633. package/src/tools/sentiment/reddit-sentiment.ts +0 -403
  634. package/src/tools/sentiment/sentiment-summary.ts +0 -383
  635. package/src/tools/sentiment/sentiment-trend.ts +0 -75
  636. package/src/tools/sentiment/twitter-sentiment.ts +0 -287
  637. package/src/tools/sentiment/untrusted-text.ts +0 -21
  638. package/src/tools/sentiment/web-search.ts +0 -186
  639. package/src/tools/sentiment/web-sentiment.ts +0 -96
  640. package/src/tools/technical/backtest.ts +0 -336
  641. package/src/tools/technical/indicators.ts +0 -281
  642. package/src/types/fundamentals.ts +0 -47
  643. package/src/types/index.ts +0 -26
  644. package/src/types/macro.ts +0 -27
  645. package/src/types/market.ts +0 -46
  646. package/src/types/options.ts +0 -53
  647. package/src/types/portfolio.ts +0 -83
  648. package/src/types/prediction-markets.ts +0 -13
  649. package/src/types/sentiment.ts +0 -129
  650. package/src/workflows/compare-assets.ts +0 -89
  651. package/src/workflows/index.ts +0 -3
  652. package/src/workflows/options-screener.ts +0 -125
  653. package/src/workflows/portfolio-builder.ts +0 -63
@@ -2,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
@@ -327,4 +327,3 @@ export function resolveProviderFromArgument(arg) {
327
327
  }
328
328
  return undefined;
329
329
  }
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,54 @@
1
+ const VALIDATION_TIMEOUT_MS = 5_000;
2
+ const MODEL_KEY_PROBES = {
3
+ google: {
4
+ label: "Google Gemini",
5
+ url: "https://generativelanguage.googleapis.com/v1beta/models",
6
+ headers: (key) => ({ "x-goog-api-key": key }),
7
+ },
8
+ openai: {
9
+ label: "OpenAI",
10
+ url: "https://api.openai.com/v1/models",
11
+ headers: (key) => ({ Authorization: `Bearer ${key}` }),
12
+ },
13
+ anthropic: {
14
+ label: "Anthropic",
15
+ url: "https://api.anthropic.com/v1/models",
16
+ headers: (key) => ({ "x-api-key": key, "anthropic-version": "2023-06-01" }),
17
+ },
18
+ };
19
+ /**
20
+ * Checks whether an API key is accepted by a model provider without saving it.
21
+ * Transient failures deliberately permit saving so offline setup remains usable.
22
+ */
23
+ export async function validateModelKey(providerId, key) {
24
+ const probe = MODEL_KEY_PROBES[providerId];
25
+ try {
26
+ const response = await fetch(probe.url, {
27
+ method: "GET",
28
+ headers: probe.headers(key),
29
+ signal: AbortSignal.timeout(VALIDATION_TIMEOUT_MS),
30
+ });
31
+ if (response.status === 401 || response.status === 403) {
32
+ return { status: "invalid", providerLabel: probe.label };
33
+ }
34
+ if (!response.ok) {
35
+ // Google reports bad keys as 400 INVALID_ARGUMENT / API_KEY_INVALID
36
+ // rather than 401.
37
+ if (response.status === 400) {
38
+ const body = await response.text().catch(() => "");
39
+ if (/API_KEY_INVALID|API key not valid/i.test(body)) {
40
+ return { status: "invalid", providerLabel: probe.label };
41
+ }
42
+ }
43
+ return { status: "transient", providerLabel: probe.label, reason: `HTTP ${response.status}` };
44
+ }
45
+ return { status: "valid", providerLabel: probe.label };
46
+ }
47
+ catch (error) {
48
+ return {
49
+ status: "transient",
50
+ providerLabel: probe.label,
51
+ reason: error instanceof Error ? error.message : String(error),
52
+ };
53
+ }
54
+ }
@@ -114,4 +114,3 @@ export async function validateCredential(providerId, key) {
114
114
  });
115
115
  }
116
116
  }
117
- //# sourceMappingURL=validation.js.map
@@ -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
@@ -50,4 +50,3 @@ async function applySavedDefaultModel(result) {
50
50
  return;
51
51
  await result.session.setModel(savedDefault);
52
52
  }
53
- //# sourceMappingURL=session.js.map
@@ -1,8 +1,10 @@
1
1
  import { type ExtensionAPI, type ExtensionContext } 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): Promise<boolean>;
6
8
  export declare function runOpenCandleSetup(api: ExtensionAPI, ctx: ExtensionContext, options?: {
7
9
  mode: SetupMode;
8
10
  }): Promise<SetupResult>;
package/dist/pi/setup.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { LoginDialogComponent, } from "@earendil-works/pi-coding-agent";
2
+ import { validateModelKey } from "../onboarding/validate-model-key.js";
2
3
  /**
3
4
  * Registry of "fast default" models for each LLM auth provider. After a fresh
4
5
  * sign-in we try to activate the default without opening a picker, falling back
@@ -174,7 +175,7 @@ async function runLoginDialog(ctx, providerId) {
174
175
  }
175
176
  return false;
176
177
  }
177
- async function runApiKeySetup(ctx, provider) {
178
+ export async function runApiKeySetup(ctx, provider) {
178
179
  const label = API_KEY_PROVIDER_LABELS[provider];
179
180
  ctx.ui.notify(`OpenCandle stores your ${label} API key locally. After saving it, OpenCandle will select a fast default model when one is available.`, "info");
180
181
  const key = await ctx.ui.input(`Paste your ${label} API key`, "API key");
@@ -183,9 +184,16 @@ async function runApiKeySetup(ctx, provider) {
183
184
  ctx.ui.notify("No API key entered.", "warning");
184
185
  return false;
185
186
  }
187
+ const validation = await validateModelKey(provider, trimmed);
188
+ if (validation.status === "invalid") {
189
+ ctx.ui.notify(`Key was rejected by ${validation.providerLabel}. Paste a different key.`, "error");
190
+ return false;
191
+ }
186
192
  ctx.modelRegistry.authStorage.set(provider, { type: "api_key", key: trimmed });
187
193
  ctx.modelRegistry.refresh();
188
- ctx.ui.notify(`${label} API key saved to OpenCandle.`, "info");
194
+ ctx.ui.notify(validation.status === "transient"
195
+ ? `Saved — couldn't verify (network issue). ${label} API key saved to OpenCandle.`
196
+ : `${label} API key saved to OpenCandle.`, "info");
189
197
  return true;
190
198
  }
191
199
  /**
@@ -316,4 +324,3 @@ export async function runOpenCandleSetup(api, ctx, options = { mode: "startup" }
316
324
  }
317
325
  return "ready";
318
326
  }
319
- //# sourceMappingURL=setup.js.map
@@ -31,4 +31,3 @@ function safeGetDefaults(toolName) {
31
31
  return {};
32
32
  }
33
33
  }
34
- //# sourceMappingURL=tool-adapter.js.map
@@ -280,4 +280,3 @@ function asRecord(value) {
280
280
  ? value
281
281
  : {};
282
282
  }
283
- //# sourceMappingURL=tui-session-coordinator.js.map
@@ -33,7 +33,7 @@ export class PromptContextBuilder {
33
33
  let truncationMarkers = 0;
34
34
  for (const name of SECTION_ORDER) {
35
35
  const section = this.sections.get(name);
36
- if (!section.content)
36
+ if (!section?.content)
37
37
  continue;
38
38
  const truncated = truncateTobudget(section.content, section.characterBudget);
39
39
  const wasTruncated = truncated.includes("[...truncated]");
@@ -258,4 +258,3 @@ Every committal response MUST carry four elements:
258
258
 
259
259
  ## Assumption Disclosure
260
260
  Structured workflow prompts may include a pre-rendered "Assumptions" block with correct source attribution (user-specified, saved preference, or default). Start with that block only when the workflow instructions explicitly say to. Fallback prompts include "Assumptions Context" only for internal routing context; do not reproduce that context unless the user explicitly asks for assumptions. Do NOT independently relabel any value's source anywhere in your response. When an assumptions block is shown, it is the single authoritative provenance representation.`;
261
- //# sourceMappingURL=context-builder.js.map
@@ -6,4 +6,3 @@
6
6
  export const DISCLAIMER_TEXT = "OpenCandle is a research and analysis tool, not financial advice or a fiduciary financial advisor. " +
7
7
  "Views, targets, and allocations are informational analyst output — not personalized recommendations. " +
8
8
  "Verify independently before acting.";
9
- //# sourceMappingURL=disclaimer.js.map
@@ -198,4 +198,3 @@ function placeholder(id, taskFamily, capabilityGapIds) {
198
198
  content: "",
199
199
  };
200
200
  }
201
- //# sourceMappingURL=policy-cards.js.map
@@ -32,4 +32,3 @@ export const DEFAULT_BUDGETS = {
32
32
  "provider-status": 500,
33
33
  "output-format": 2500,
34
34
  };
35
- //# sourceMappingURL=sections.js.map
@@ -46,4 +46,3 @@ function validateSymbol(symbol, search) {
46
46
  checkedAt: Date.now(),
47
47
  }));
48
48
  }
49
- //# sourceMappingURL=symbol-preflight.js.map
@@ -442,4 +442,3 @@ ${tableInstruction}
442
442
  ${actionPlanResponse}
443
443
  - Note any caveats (different sectors, concentration, market cap disparity, unavailable fundamentals, unavailable forward-looking estimates, etc.).${horizonResponse}`;
444
444
  }
445
- //# sourceMappingURL=workflow-prompts.js.map
@@ -182,7 +182,7 @@ export async function getGlobalQuote(symbol, apiKey) {
182
182
  const data = await httpGet(url);
183
183
  throwIfApiMessage(data);
184
184
  const gq = data["Global Quote"];
185
- if (!gq || !gq["05. price"]) {
185
+ if (!gq?.["05. price"]) {
186
186
  throw new Error(`Alpha Vantage: No quote data for ${symbol}`);
187
187
  }
188
188
  const price = parseFloat(gq["05. price"]) || 0;
@@ -291,6 +291,5 @@ function parseNullableNum(s) {
291
291
  if (!s || s === "None" || s === "-")
292
292
  return null;
293
293
  const n = parseFloat(s);
294
- return isNaN(n) ? null : n;
294
+ return Number.isNaN(n) ? null : n;
295
295
  }
296
- //# sourceMappingURL=alpha-vantage.js.map
@@ -67,4 +67,3 @@ export async function getCryptoHistory(id, days = 180) {
67
67
  throw error;
68
68
  }
69
69
  }
70
- //# sourceMappingURL=coingecko.js.map
@@ -8,4 +8,3 @@ export class InvalidSymbolError extends Error {
8
8
  this.name = "InvalidSymbolError";
9
9
  }
10
10
  }
11
- //# sourceMappingURL=errors.js.map
@@ -90,14 +90,16 @@ function parseMcpResultBlocks(text) {
90
90
  return results;
91
91
  }
92
92
  function mapApiResults(results) {
93
- return results
94
- .filter((r) => r.url)
95
- .map((r) => ({
96
- title: r.title ?? "",
97
- url: r.url,
98
- published: r.publishedDate ?? null,
99
- snippet: (r.highlights?.join(" ") || r.text || "").slice(0, SNIPPET_MAX_CHARS),
100
- }));
93
+ return results.flatMap((r) => {
94
+ if (!r.url)
95
+ return [];
96
+ return {
97
+ title: r.title ?? "",
98
+ url: r.url,
99
+ published: r.publishedDate ?? null,
100
+ snippet: (r.highlights?.join(" ") || r.text || "").slice(0, SNIPPET_MAX_CHARS),
101
+ };
102
+ });
101
103
  }
102
104
  // ---------------------------------------------------------------------------
103
105
  // Freshness post-filter
@@ -108,7 +110,7 @@ function filterByFreshness(results, freshness) {
108
110
  if (!r.published)
109
111
  return true; // benefit of the doubt
110
112
  const pubTime = new Date(r.published).getTime();
111
- return !isNaN(pubTime) && pubTime >= cutoff;
113
+ return !Number.isNaN(pubTime) && pubTime >= cutoff;
112
114
  });
113
115
  }
114
116
  // ---------------------------------------------------------------------------
@@ -281,4 +283,3 @@ export async function exaSearch(query, opts) {
281
283
  }
282
284
  // Exported for testing
283
285
  export { enrichQueryForMcp, extractJsonRpcPayload, filterByFreshness, mapApiResults, parseMcpResultBlocks, };
284
- //# sourceMappingURL=exa-search.js.map
@@ -111,4 +111,3 @@ function commandNames(command, platform) {
111
111
  }
112
112
  return names;
113
113
  }
114
- //# sourceMappingURL=external-tool-command.js.map
@@ -18,4 +18,3 @@ export class ExternalToolNotInstalled extends Error {
18
18
  this.name = "ExternalToolNotInstalled";
19
19
  }
20
20
  }
21
- //# sourceMappingURL=external-tool-error.js.map
@@ -31,4 +31,3 @@ export async function getFearGreedIndex() {
31
31
  throw error;
32
32
  }
33
33
  }
34
- //# sourceMappingURL=fear-greed.js.map
@@ -89,4 +89,3 @@ export async function getCompanyNews(symbol, from, to, apiKey) {
89
89
  throw error;
90
90
  }
91
91
  }
92
- //# sourceMappingURL=finnhub.js.map
@@ -54,4 +54,3 @@ export async function getSeries(seriesId, apiKey, limit = 60) {
54
54
  throw error;
55
55
  }
56
56
  }
57
- //# sourceMappingURL=fred.js.map
@@ -7,4 +7,3 @@ export { searchFilings } from "./sec-edgar.js";
7
7
  export { getQuotes, screenStocks } from "./tradingview.js";
8
8
  export { braveSearch, ddgSearch, normalizeFinancialQuery, searchWeb } from "./web-search.js";
9
9
  export { clearCrumbCache, computeTimeToExpiry, getHistory, getOptionsChain, getQuote, getYahooCrumb, } from "./yahoo-finance.js";
10
- //# sourceMappingURL=index.js.map
@@ -160,4 +160,3 @@ function marketUrl(market, event) {
160
160
  return `${POLYMARKET_URL}/event/${encodeURIComponent(marketSlug)}`;
161
161
  return POLYMARKET_URL;
162
162
  }
163
- //# sourceMappingURL=polymarket.js.map
@@ -19,4 +19,3 @@ export class ProviderCredentialError extends Error {
19
19
  this.httpStatus = httpStatus;
20
20
  }
21
21
  }
22
- //# sourceMappingURL=provider-credential-error.js.map
@@ -169,4 +169,3 @@ function runCommand(command, args) {
169
169
  maxOutputChars: MAX_OUTPUT_CHARS,
170
170
  });
171
171
  }
172
- //# sourceMappingURL=reddit-cli.js.map
@@ -73,4 +73,3 @@ export function scoreSentiment(posts) {
73
73
  bearish,
74
74
  };
75
75
  }
76
- //# sourceMappingURL=reddit.js.map
@@ -231,4 +231,3 @@ function isLikelyTableOfContentsSnippet(snippet) {
231
231
  const itemHeadingCount = lower.match(/\bitem\s+\d+[a-z]?\b/g)?.length ?? 0;
232
232
  return lower.includes("table of contents") && itemHeadingCount >= 2;
233
233
  }
234
- //# sourceMappingURL=sec-edgar.js.map
@@ -252,7 +252,7 @@ export function canUseTradingViewQuote(symbol) {
252
252
  (isTradingViewQualified(normalized) || !shouldSkipTradingView(normalized)));
253
253
  }
254
254
  function symbolFromTvSymbol(tvSymbol) {
255
- return tvSymbol.includes(":") ? tvSymbol.split(":").at(-1) : tvSymbol;
255
+ return tvSymbol.includes(":") ? (tvSymbol.split(":").at(-1) ?? tvSymbol) : tvSymbol;
256
256
  }
257
257
  function stringValue(value) {
258
258
  return typeof value === "string" ? value : undefined;
@@ -272,4 +272,3 @@ function sortObjectKeys(value) {
272
272
  .sort(([a], [b]) => a.localeCompare(b))
273
273
  .map(([key, nested]) => [key, sortObjectKeys(nested)]));
274
274
  }
275
- //# sourceMappingURL=tradingview.js.map
@@ -121,4 +121,3 @@ function runCommand(command, args) {
121
121
  maxOutputChars: MAX_OUTPUT_CHARS,
122
122
  });
123
123
  }
124
- //# sourceMappingURL=twitter-cli.js.map
@@ -82,4 +82,3 @@ export async function getTwitterSentiment(query, limit = 50, hours = 24) {
82
82
  throw error;
83
83
  }
84
84
  }
85
- //# sourceMappingURL=twitter.js.map