opencandle 0.11.0 → 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 (663) hide show
  1. package/README.md +25 -28
  2. package/dist/analysts/contracts.js +0 -1
  3. package/dist/analysts/orchestrator.d.ts +2 -0
  4. package/dist/analysts/orchestrator.js +19 -1
  5. package/dist/cli-main.js +13 -7
  6. package/dist/cli-options.d.ts +4 -0
  7. package/dist/cli-options.js +33 -0
  8. package/dist/cli.js +8 -3
  9. package/dist/config.js +0 -1
  10. package/dist/doctor/cli-command.js +2 -1
  11. package/dist/doctor/render.js +0 -1
  12. package/dist/doctor/report.js +41 -12
  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 +263 -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/http-routes.d.ts +69 -0
  24. package/dist/gui/server/http-routes.js +1008 -0
  25. package/dist/gui/server/invoke-tool.d.ts +47 -0
  26. package/dist/gui/server/invoke-tool.js +373 -0
  27. package/dist/gui/server/live-chat-event-adapter.d.ts +19 -0
  28. package/dist/gui/server/live-chat-event-adapter.js +206 -0
  29. package/dist/gui/server/local-session-coordinator.d.ts +26 -0
  30. package/dist/gui/server/local-session-coordinator.js +53 -0
  31. package/dist/gui/server/market-state-api.d.ts +138 -0
  32. package/dist/gui/server/market-state-api.js +355 -0
  33. package/dist/gui/server/model-setup.d.ts +64 -0
  34. package/dist/gui/server/model-setup.js +150 -0
  35. package/dist/gui/server/private-api-access.d.ts +6 -0
  36. package/dist/gui/server/private-api-access.js +53 -0
  37. package/dist/gui/server/projector.d.ts +49 -0
  38. package/dist/gui/server/projector.js +296 -0
  39. package/dist/gui/server/prompt-observation.d.ts +8 -0
  40. package/dist/gui/server/prompt-observation.js +43 -0
  41. package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
  42. package/dist/gui/server/quote-snapshot-store.js +49 -0
  43. package/dist/gui/server/server.d.ts +1 -0
  44. package/dist/gui/server/server.js +259 -0
  45. package/dist/gui/server/session-actions.d.ts +60 -0
  46. package/dist/gui/server/session-actions.js +218 -0
  47. package/dist/gui/server/session-entry-wait.d.ts +27 -0
  48. package/dist/gui/server/session-entry-wait.js +129 -0
  49. package/dist/gui/server/session-list.d.ts +2 -0
  50. package/dist/gui/server/session-list.js +11 -0
  51. package/dist/gui/server/shutdown.d.ts +10 -0
  52. package/dist/gui/server/shutdown.js +29 -0
  53. package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
  54. package/dist/gui/server/tool-invoke-ack.js +26 -0
  55. package/dist/gui/server/tool-metadata.d.ts +93 -0
  56. package/dist/gui/server/tool-metadata.js +148 -0
  57. package/dist/gui/server/websocket.d.ts +9 -0
  58. package/dist/gui/server/websocket.js +124 -0
  59. package/dist/gui/server/writer-lock.d.ts +1 -0
  60. package/dist/gui/server/writer-lock.js +1 -0
  61. package/dist/gui/server/ws-hub.d.ts +50 -0
  62. package/dist/gui/server/ws-hub.js +284 -0
  63. package/dist/gui/shared/chat-events.d.ts +174 -0
  64. package/dist/gui/shared/chat-events.js +13 -0
  65. package/dist/gui/shared/event-reducer.d.ts +3 -0
  66. package/dist/gui/shared/event-reducer.js +187 -0
  67. package/dist/index.js +0 -1
  68. package/dist/infra/cache.d.ts +6 -0
  69. package/dist/infra/cache.js +16 -7
  70. package/dist/infra/freshness.d.ts +21 -0
  71. package/dist/infra/freshness.js +118 -0
  72. package/dist/infra/http-client.js +1 -2
  73. package/dist/infra/index.js +0 -1
  74. package/dist/infra/market-calendar.d.ts +14 -0
  75. package/dist/infra/market-calendar.js +136 -0
  76. package/dist/infra/native-dependencies.js +0 -1
  77. package/dist/infra/node-version.js +0 -1
  78. package/dist/infra/open-url.js +0 -1
  79. package/dist/infra/opencandle-paths.js +0 -1
  80. package/dist/infra/rate-limiter.js +1 -1
  81. package/dist/market-state/alert-conditions.js +0 -1
  82. package/dist/market-state/alert-runner.d.ts +1 -0
  83. package/dist/market-state/alert-runner.js +5 -4
  84. package/dist/market-state/daily-report.js +0 -1
  85. package/dist/market-state/local-automation-service.js +0 -1
  86. package/dist/market-state/notification-delivery.js +0 -1
  87. package/dist/market-state/resolve-for-mutation.js +0 -1
  88. package/dist/market-state/resolve.js +0 -1
  89. package/dist/market-state/service.d.ts +26 -21
  90. package/dist/market-state/service.js +175 -36
  91. package/dist/market-state/summaries.d.ts +8 -0
  92. package/dist/market-state/summaries.js +58 -0
  93. package/dist/memory/index.js +0 -1
  94. package/dist/memory/manager.js +0 -1
  95. package/dist/memory/preference-extractor.js +0 -1
  96. package/dist/memory/retrieval.js +0 -1
  97. package/dist/memory/sqlite.js +60 -11
  98. package/dist/memory/storage.js +0 -1
  99. package/dist/memory/tool-defaults.js +0 -1
  100. package/dist/memory/types.js +0 -1
  101. package/dist/monitor.js +0 -1
  102. package/dist/onboarding/connect.js +0 -1
  103. package/dist/onboarding/credential-interceptor.js +0 -1
  104. package/dist/onboarding/degradation-accumulator.js +0 -1
  105. package/dist/onboarding/prompt-user.d.ts +1 -1
  106. package/dist/onboarding/prompt-user.js +0 -1
  107. package/dist/onboarding/provider-status.js +0 -1
  108. package/dist/onboarding/providers.d.ts +25 -1
  109. package/dist/onboarding/providers.js +26 -1
  110. package/dist/onboarding/state.js +0 -1
  111. package/dist/onboarding/tool-helpers.js +0 -1
  112. package/dist/onboarding/tool-tags.js +0 -1
  113. package/dist/onboarding/validate-model-key.d.ts +17 -0
  114. package/dist/onboarding/validate-model-key.js +54 -0
  115. package/dist/onboarding/validation.js +0 -1
  116. package/dist/pi/opencandle-extension.js +46 -7
  117. package/dist/pi/session-action-dedupe.js +0 -1
  118. package/dist/pi/session-storage.js +0 -1
  119. package/dist/pi/session-writer-lock.js +0 -1
  120. package/dist/pi/session.js +0 -1
  121. package/dist/pi/setup.d.ts +2 -0
  122. package/dist/pi/setup.js +10 -3
  123. package/dist/pi/tool-adapter.js +0 -1
  124. package/dist/pi/tui-session-coordinator.js +0 -1
  125. package/dist/prompts/context-builder.js +1 -2
  126. package/dist/prompts/disclaimer.js +0 -1
  127. package/dist/prompts/policy-cards.js +0 -1
  128. package/dist/prompts/sections.js +0 -1
  129. package/dist/prompts/symbol-preflight.js +0 -1
  130. package/dist/prompts/workflow-prompts.js +0 -1
  131. package/dist/providers/alpha-vantage.js +8 -3
  132. package/dist/providers/coingecko.js +1 -1
  133. package/dist/providers/errors.js +0 -1
  134. package/dist/providers/exa-search.js +11 -10
  135. package/dist/providers/external-tool-command.js +0 -1
  136. package/dist/providers/external-tool-error.js +0 -1
  137. package/dist/providers/fear-greed.js +0 -1
  138. package/dist/providers/finnhub.js +0 -1
  139. package/dist/providers/fred.js +0 -1
  140. package/dist/providers/index.js +0 -1
  141. package/dist/providers/polymarket.d.ts +2 -0
  142. package/dist/providers/polymarket.js +162 -0
  143. package/dist/providers/provider-credential-error.js +0 -1
  144. package/dist/providers/reddit-cli.js +0 -1
  145. package/dist/providers/reddit.js +0 -1
  146. package/dist/providers/sec-edgar.js +0 -1
  147. package/dist/providers/tradingview.js +1 -2
  148. package/dist/providers/twitter-cli.js +0 -1
  149. package/dist/providers/twitter.js +0 -1
  150. package/dist/providers/web-search.js +15 -12
  151. package/dist/providers/with-fallback.js +0 -1
  152. package/dist/providers/wrap-provider.js +5 -4
  153. package/dist/providers/yahoo-finance.d.ts +3 -0
  154. package/dist/providers/yahoo-finance.js +272 -13
  155. package/dist/routing/classify-intent.js +0 -1
  156. package/dist/routing/defaults.js +0 -1
  157. package/dist/routing/entity-extractor.js +18 -3
  158. package/dist/routing/fund-symbols.js +0 -1
  159. package/dist/routing/horizon.js +0 -1
  160. package/dist/routing/index.js +0 -1
  161. package/dist/routing/legacy-rule-router.js +0 -1
  162. package/dist/routing/planning.js +0 -1
  163. package/dist/routing/route-manifest.js +1 -2
  164. package/dist/routing/router-llm-client.d.ts +2 -2
  165. package/dist/routing/router-llm-client.js +18 -4
  166. package/dist/routing/router-prompt.js +0 -1
  167. package/dist/routing/router-types.js +0 -1
  168. package/dist/routing/router.d.ts +1 -1
  169. package/dist/routing/router.js +274 -6
  170. package/dist/routing/slot-resolver.d.ts +1 -0
  171. package/dist/routing/slot-resolver.js +1 -2
  172. package/dist/routing/symbol-disambiguator.js +0 -1
  173. package/dist/routing/turn-context.js +0 -1
  174. package/dist/routing/types.js +0 -1
  175. package/dist/runtime/answer-contracts.js +0 -1
  176. package/dist/runtime/artifact-contracts.js +0 -1
  177. package/dist/runtime/evidence.d.ts +1 -0
  178. package/dist/runtime/evidence.js +0 -1
  179. package/dist/runtime/numeric-claims.d.ts +23 -0
  180. package/dist/runtime/numeric-claims.js +99 -0
  181. package/dist/runtime/planning-evidence.js +1 -77
  182. package/dist/runtime/prompt-step.d.ts +10 -1
  183. package/dist/runtime/prompt-step.js +116 -3
  184. package/dist/runtime/provider-tracker.js +0 -1
  185. package/dist/runtime/run-context.js +0 -1
  186. package/dist/runtime/session-coordinator.d.ts +11 -1
  187. package/dist/runtime/session-coordinator.js +352 -50
  188. package/dist/runtime/session-title.js +0 -1
  189. package/dist/runtime/tool-defaults-wrapper.js +0 -1
  190. package/dist/runtime/validation.d.ts +3 -1
  191. package/dist/runtime/validation.js +0 -1
  192. package/dist/runtime/workflow-events.d.ts +1 -1
  193. package/dist/runtime/workflow-events.js +0 -1
  194. package/dist/runtime/workflow-runner.d.ts +1 -0
  195. package/dist/runtime/workflow-runner.js +8 -3
  196. package/dist/runtime/workflow-types.d.ts +3 -0
  197. package/dist/runtime/workflow-types.js +0 -1
  198. package/dist/sentiment/adapters/finnhub.js +0 -1
  199. package/dist/sentiment/adapters/reddit.js +0 -1
  200. package/dist/sentiment/adapters/twitter.js +0 -1
  201. package/dist/sentiment/adapters/web.js +0 -1
  202. package/dist/sentiment/index.js +4 -2
  203. package/dist/sentiment/insights.js +0 -1
  204. package/dist/sentiment/keywords.js +0 -1
  205. package/dist/sentiment/pipeline.js +0 -1
  206. package/dist/sentiment/scorer.js +0 -1
  207. package/dist/sentiment/store.js +0 -1
  208. package/dist/sentiment/trends.js +0 -1
  209. package/dist/sentiment/types.js +0 -1
  210. package/dist/system-prompt.js +0 -1
  211. package/dist/tool-kit.js +0 -1
  212. package/dist/tools/fundamentals/company-overview.d.ts +1 -1
  213. package/dist/tools/fundamentals/company-overview.js +2 -1
  214. package/dist/tools/fundamentals/comps.d.ts +1 -0
  215. package/dist/tools/fundamentals/comps.js +25 -12
  216. package/dist/tools/fundamentals/dcf.js +183 -113
  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 +2 -1
  220. package/dist/tools/fundamentals/sec-filings.js +0 -1
  221. package/dist/tools/index.d.ts +117 -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.d.ts +8 -0
  225. package/dist/tools/macro/event-probabilities.js +120 -0
  226. package/dist/tools/macro/fear-greed.d.ts +1 -1
  227. package/dist/tools/macro/fear-greed.js +0 -1
  228. package/dist/tools/macro/fred-data.d.ts +1 -1
  229. package/dist/tools/macro/fred-data.js +2 -1
  230. package/dist/tools/market/crypto-history.js +0 -1
  231. package/dist/tools/market/crypto-price.d.ts +4 -1
  232. package/dist/tools/market/crypto-price.js +10 -2
  233. package/dist/tools/market/screen-stocks.js +14 -4
  234. package/dist/tools/market/search-ticker.js +1 -2
  235. package/dist/tools/market/stock-history.js +0 -1
  236. package/dist/tools/market/stock-quote.d.ts +4 -1
  237. package/dist/tools/market/stock-quote.js +9 -5
  238. package/dist/tools/options/greeks.js +0 -1
  239. package/dist/tools/options/option-chain.d.ts +4 -1
  240. package/dist/tools/options/option-chain.js +12 -2
  241. package/dist/tools/portfolio/alerts.d.ts +2 -1
  242. package/dist/tools/portfolio/alerts.js +228 -2
  243. package/dist/tools/portfolio/correlation.js +23 -5
  244. package/dist/tools/portfolio/daily-report.js +0 -1
  245. package/dist/tools/portfolio/holdings-overlap.js +0 -1
  246. package/dist/tools/portfolio/notifications.js +0 -1
  247. package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
  248. package/dist/tools/portfolio/risk-analysis.js +1 -2
  249. package/dist/tools/portfolio/tracker.d.ts +3 -1
  250. package/dist/tools/portfolio/tracker.js +57 -10
  251. package/dist/tools/portfolio/watchlist.d.ts +3 -6
  252. package/dist/tools/portfolio/watchlist.js +101 -110
  253. package/dist/tools/sentiment/insight-format.js +0 -1
  254. package/dist/tools/sentiment/query-match.js +0 -1
  255. package/dist/tools/sentiment/reddit-sentiment.js +0 -1
  256. package/dist/tools/sentiment/sentiment-summary.js +8 -4
  257. package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
  258. package/dist/tools/sentiment/sentiment-trend.js +6 -2
  259. package/dist/tools/sentiment/twitter-sentiment.js +0 -1
  260. package/dist/tools/sentiment/untrusted-text.js +0 -1
  261. package/dist/tools/sentiment/web-search.d.ts +1 -1
  262. package/dist/tools/sentiment/web-search.js +0 -1
  263. package/dist/tools/sentiment/web-sentiment.js +0 -1
  264. package/dist/tools/technical/backtest.js +0 -1
  265. package/dist/tools/technical/indicators.js +1 -2
  266. package/dist/types/fundamentals.d.ts +1 -0
  267. package/dist/types/fundamentals.js +0 -1
  268. package/dist/types/index.d.ts +1 -0
  269. package/dist/types/index.js +0 -1
  270. package/dist/types/macro.js +0 -1
  271. package/dist/types/market.d.ts +8 -0
  272. package/dist/types/market.js +0 -1
  273. package/dist/types/options.d.ts +1 -0
  274. package/dist/types/options.js +0 -1
  275. package/dist/types/portfolio.js +0 -1
  276. package/dist/types/prediction-markets.d.ts +13 -0
  277. package/dist/types/prediction-markets.js +1 -0
  278. package/dist/types/sentiment.js +0 -1
  279. package/dist/workflows/compare-assets.js +0 -1
  280. package/dist/workflows/index.js +0 -1
  281. package/dist/workflows/options-screener.js +0 -1
  282. package/dist/workflows/portfolio-builder.js +0 -1
  283. package/gui/web/dist/assets/CatalogOverlay-CAc7e3Pf.js +1 -0
  284. package/gui/web/dist/assets/index-BOEKd9wT.css +2 -0
  285. package/gui/web/dist/assets/index-C-H05cQ2.js +65 -0
  286. package/gui/web/dist/index.html +2 -2
  287. package/package.json +16 -22
  288. package/dist/analysts/contracts.js.map +0 -1
  289. package/dist/analysts/orchestrator.js.map +0 -1
  290. package/dist/cli-main.js.map +0 -1
  291. package/dist/cli.js.map +0 -1
  292. package/dist/config.js.map +0 -1
  293. package/dist/doctor/cli-command.js.map +0 -1
  294. package/dist/doctor/render.js.map +0 -1
  295. package/dist/doctor/report.js.map +0 -1
  296. package/dist/index.js.map +0 -1
  297. package/dist/infra/cache.js.map +0 -1
  298. package/dist/infra/http-client.js.map +0 -1
  299. package/dist/infra/index.js.map +0 -1
  300. package/dist/infra/native-dependencies.js.map +0 -1
  301. package/dist/infra/node-version.js.map +0 -1
  302. package/dist/infra/open-url.js.map +0 -1
  303. package/dist/infra/opencandle-paths.js.map +0 -1
  304. package/dist/infra/rate-limiter.js.map +0 -1
  305. package/dist/market-state/alert-conditions.js.map +0 -1
  306. package/dist/market-state/alert-runner.js.map +0 -1
  307. package/dist/market-state/daily-report.js.map +0 -1
  308. package/dist/market-state/local-automation-service.js.map +0 -1
  309. package/dist/market-state/notification-delivery.js.map +0 -1
  310. package/dist/market-state/resolve-for-mutation.js.map +0 -1
  311. package/dist/market-state/resolve.js.map +0 -1
  312. package/dist/market-state/service.js.map +0 -1
  313. package/dist/memory/index.js.map +0 -1
  314. package/dist/memory/manager.js.map +0 -1
  315. package/dist/memory/preference-extractor.js.map +0 -1
  316. package/dist/memory/retrieval.js.map +0 -1
  317. package/dist/memory/sqlite.js.map +0 -1
  318. package/dist/memory/storage.js.map +0 -1
  319. package/dist/memory/tool-defaults.js.map +0 -1
  320. package/dist/memory/types.js.map +0 -1
  321. package/dist/monitor.js.map +0 -1
  322. package/dist/onboarding/connect.js.map +0 -1
  323. package/dist/onboarding/credential-interceptor.js.map +0 -1
  324. package/dist/onboarding/degradation-accumulator.js.map +0 -1
  325. package/dist/onboarding/prompt-user.js.map +0 -1
  326. package/dist/onboarding/provider-status.js.map +0 -1
  327. package/dist/onboarding/providers.js.map +0 -1
  328. package/dist/onboarding/state.js.map +0 -1
  329. package/dist/onboarding/tool-helpers.js.map +0 -1
  330. package/dist/onboarding/tool-tags.js.map +0 -1
  331. package/dist/onboarding/validation.js.map +0 -1
  332. package/dist/pi/opencandle-extension.js.map +0 -1
  333. package/dist/pi/session-action-dedupe.js.map +0 -1
  334. package/dist/pi/session-storage.js.map +0 -1
  335. package/dist/pi/session-writer-lock.js.map +0 -1
  336. package/dist/pi/session.js.map +0 -1
  337. package/dist/pi/setup.js.map +0 -1
  338. package/dist/pi/tool-adapter.js.map +0 -1
  339. package/dist/pi/tui-session-coordinator.js.map +0 -1
  340. package/dist/prompts/context-builder.js.map +0 -1
  341. package/dist/prompts/disclaimer.js.map +0 -1
  342. package/dist/prompts/policy-cards.js.map +0 -1
  343. package/dist/prompts/sections.js.map +0 -1
  344. package/dist/prompts/symbol-preflight.js.map +0 -1
  345. package/dist/prompts/workflow-prompts.js.map +0 -1
  346. package/dist/providers/alpha-vantage.js.map +0 -1
  347. package/dist/providers/coingecko.js.map +0 -1
  348. package/dist/providers/errors.js.map +0 -1
  349. package/dist/providers/exa-search.js.map +0 -1
  350. package/dist/providers/external-tool-command.js.map +0 -1
  351. package/dist/providers/external-tool-error.js.map +0 -1
  352. package/dist/providers/fear-greed.js.map +0 -1
  353. package/dist/providers/finnhub.js.map +0 -1
  354. package/dist/providers/fred.js.map +0 -1
  355. package/dist/providers/index.js.map +0 -1
  356. package/dist/providers/provider-credential-error.js.map +0 -1
  357. package/dist/providers/reddit-cli.js.map +0 -1
  358. package/dist/providers/reddit.js.map +0 -1
  359. package/dist/providers/sec-edgar.js.map +0 -1
  360. package/dist/providers/tradingview.js.map +0 -1
  361. package/dist/providers/twitter-cli.js.map +0 -1
  362. package/dist/providers/twitter.js.map +0 -1
  363. package/dist/providers/web-search.js.map +0 -1
  364. package/dist/providers/with-fallback.js.map +0 -1
  365. package/dist/providers/wrap-provider.js.map +0 -1
  366. package/dist/providers/yahoo-finance.js.map +0 -1
  367. package/dist/routing/classify-intent.js.map +0 -1
  368. package/dist/routing/defaults.js.map +0 -1
  369. package/dist/routing/entity-extractor.js.map +0 -1
  370. package/dist/routing/fund-symbols.js.map +0 -1
  371. package/dist/routing/horizon.js.map +0 -1
  372. package/dist/routing/index.js.map +0 -1
  373. package/dist/routing/legacy-rule-router.js.map +0 -1
  374. package/dist/routing/planning.js.map +0 -1
  375. package/dist/routing/route-manifest.js.map +0 -1
  376. package/dist/routing/router-llm-client.js.map +0 -1
  377. package/dist/routing/router-prompt.js.map +0 -1
  378. package/dist/routing/router-types.js.map +0 -1
  379. package/dist/routing/router.js.map +0 -1
  380. package/dist/routing/slot-resolver.js.map +0 -1
  381. package/dist/routing/symbol-disambiguator.js.map +0 -1
  382. package/dist/routing/turn-context.js.map +0 -1
  383. package/dist/routing/types.js.map +0 -1
  384. package/dist/runtime/answer-contracts.js.map +0 -1
  385. package/dist/runtime/artifact-contracts.js.map +0 -1
  386. package/dist/runtime/evidence.js.map +0 -1
  387. package/dist/runtime/planning-evidence.js.map +0 -1
  388. package/dist/runtime/prompt-step.js.map +0 -1
  389. package/dist/runtime/provider-tracker.js.map +0 -1
  390. package/dist/runtime/run-context.js.map +0 -1
  391. package/dist/runtime/session-coordinator.js.map +0 -1
  392. package/dist/runtime/session-title.js.map +0 -1
  393. package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
  394. package/dist/runtime/validation.js.map +0 -1
  395. package/dist/runtime/workflow-events.js.map +0 -1
  396. package/dist/runtime/workflow-runner.js.map +0 -1
  397. package/dist/runtime/workflow-types.js.map +0 -1
  398. package/dist/sentiment/adapters/finnhub.js.map +0 -1
  399. package/dist/sentiment/adapters/reddit.js.map +0 -1
  400. package/dist/sentiment/adapters/twitter.js.map +0 -1
  401. package/dist/sentiment/adapters/web.js.map +0 -1
  402. package/dist/sentiment/index.js.map +0 -1
  403. package/dist/sentiment/insights.js.map +0 -1
  404. package/dist/sentiment/keywords.js.map +0 -1
  405. package/dist/sentiment/pipeline.js.map +0 -1
  406. package/dist/sentiment/scorer.js.map +0 -1
  407. package/dist/sentiment/store.js.map +0 -1
  408. package/dist/sentiment/trends.js.map +0 -1
  409. package/dist/sentiment/types.js.map +0 -1
  410. package/dist/system-prompt.js.map +0 -1
  411. package/dist/tool-kit.js.map +0 -1
  412. package/dist/tools/fundamentals/company-overview.js.map +0 -1
  413. package/dist/tools/fundamentals/comps.js.map +0 -1
  414. package/dist/tools/fundamentals/dcf.js.map +0 -1
  415. package/dist/tools/fundamentals/earnings.js.map +0 -1
  416. package/dist/tools/fundamentals/financials.js.map +0 -1
  417. package/dist/tools/fundamentals/sec-filings.js.map +0 -1
  418. package/dist/tools/index.js.map +0 -1
  419. package/dist/tools/interaction/ask-user.js.map +0 -1
  420. package/dist/tools/macro/fear-greed.js.map +0 -1
  421. package/dist/tools/macro/fred-data.js.map +0 -1
  422. package/dist/tools/market/crypto-history.js.map +0 -1
  423. package/dist/tools/market/crypto-price.js.map +0 -1
  424. package/dist/tools/market/screen-stocks.js.map +0 -1
  425. package/dist/tools/market/search-ticker.js.map +0 -1
  426. package/dist/tools/market/stock-history.js.map +0 -1
  427. package/dist/tools/market/stock-quote.js.map +0 -1
  428. package/dist/tools/options/greeks.js.map +0 -1
  429. package/dist/tools/options/option-chain.js.map +0 -1
  430. package/dist/tools/portfolio/alerts.js.map +0 -1
  431. package/dist/tools/portfolio/correlation.js.map +0 -1
  432. package/dist/tools/portfolio/daily-report.js.map +0 -1
  433. package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
  434. package/dist/tools/portfolio/notifications.js.map +0 -1
  435. package/dist/tools/portfolio/risk-analysis.js.map +0 -1
  436. package/dist/tools/portfolio/tracker.js.map +0 -1
  437. package/dist/tools/portfolio/watchlist.js.map +0 -1
  438. package/dist/tools/sentiment/insight-format.js.map +0 -1
  439. package/dist/tools/sentiment/query-match.js.map +0 -1
  440. package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
  441. package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
  442. package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
  443. package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
  444. package/dist/tools/sentiment/untrusted-text.js.map +0 -1
  445. package/dist/tools/sentiment/web-search.js.map +0 -1
  446. package/dist/tools/sentiment/web-sentiment.js.map +0 -1
  447. package/dist/tools/technical/backtest.js.map +0 -1
  448. package/dist/tools/technical/indicators.js.map +0 -1
  449. package/dist/types/fundamentals.js.map +0 -1
  450. package/dist/types/index.js.map +0 -1
  451. package/dist/types/macro.js.map +0 -1
  452. package/dist/types/market.js.map +0 -1
  453. package/dist/types/options.js.map +0 -1
  454. package/dist/types/portfolio.js.map +0 -1
  455. package/dist/types/sentiment.js.map +0 -1
  456. package/dist/workflows/compare-assets.js.map +0 -1
  457. package/dist/workflows/index.js.map +0 -1
  458. package/dist/workflows/options-screener.js.map +0 -1
  459. package/dist/workflows/portfolio-builder.js.map +0 -1
  460. package/gui/server/ask-user-bridge.ts +0 -89
  461. package/gui/server/automation-heartbeat.ts +0 -97
  462. package/gui/server/background-quotes.ts +0 -127
  463. package/gui/server/chat-event-adapter.ts +0 -210
  464. package/gui/server/chat-run-session.ts +0 -16
  465. package/gui/server/gui-session-manager.ts +0 -5
  466. package/gui/server/http-routes.ts +0 -953
  467. package/gui/server/invoke-tool.ts +0 -489
  468. package/gui/server/live-chat-event-adapter.ts +0 -208
  469. package/gui/server/local-session-coordinator.ts +0 -97
  470. package/gui/server/market-state-api.ts +0 -273
  471. package/gui/server/model-setup.ts +0 -254
  472. package/gui/server/package.json +0 -5
  473. package/gui/server/private-api-access.ts +0 -62
  474. package/gui/server/projector.ts +0 -263
  475. package/gui/server/prompt-observation.ts +0 -58
  476. package/gui/server/quote-snapshot-store.ts +0 -50
  477. package/gui/server/server.ts +0 -289
  478. package/gui/server/session-actions.ts +0 -331
  479. package/gui/server/session-entry-wait.ts +0 -160
  480. package/gui/server/shutdown.ts +0 -47
  481. package/gui/server/tool-invoke-ack.ts +0 -49
  482. package/gui/server/tool-metadata.ts +0 -167
  483. package/gui/server/websocket.ts +0 -138
  484. package/gui/server/writer-lock.ts +0 -1
  485. package/gui/server/ws-hub.ts +0 -391
  486. package/gui/shared/chat-events.ts +0 -156
  487. package/gui/shared/event-reducer.ts +0 -219
  488. package/gui/web/dist/assets/CatalogOverlay-ChRTKNlf.js +0 -1
  489. package/gui/web/dist/assets/index-BzyqyVnd.css +0 -2
  490. package/gui/web/dist/assets/index-DvMjkOP9.js +0 -65
  491. package/src/analysts/contracts.ts +0 -176
  492. package/src/analysts/orchestrator.ts +0 -224
  493. package/src/cli-main.ts +0 -510
  494. package/src/cli.ts +0 -17
  495. package/src/config.ts +0 -272
  496. package/src/doctor/cli-command.ts +0 -83
  497. package/src/doctor/render.ts +0 -37
  498. package/src/doctor/report.ts +0 -638
  499. package/src/index.ts +0 -5
  500. package/src/infra/cache.ts +0 -114
  501. package/src/infra/http-client.ts +0 -134
  502. package/src/infra/index.ts +0 -14
  503. package/src/infra/native-dependencies.ts +0 -84
  504. package/src/infra/node-version.ts +0 -23
  505. package/src/infra/open-url.ts +0 -28
  506. package/src/infra/opencandle-paths.ts +0 -53
  507. package/src/infra/rate-limiter.ts +0 -76
  508. package/src/market-state/alert-conditions.ts +0 -82
  509. package/src/market-state/alert-runner.ts +0 -863
  510. package/src/market-state/daily-report.ts +0 -237
  511. package/src/market-state/local-automation-service.ts +0 -162
  512. package/src/market-state/notification-delivery.ts +0 -158
  513. package/src/market-state/resolve-for-mutation.ts +0 -24
  514. package/src/market-state/resolve.ts +0 -112
  515. package/src/market-state/service.ts +0 -2208
  516. package/src/memory/index.ts +0 -10
  517. package/src/memory/manager.ts +0 -190
  518. package/src/memory/preference-extractor.ts +0 -106
  519. package/src/memory/retrieval.ts +0 -71
  520. package/src/memory/sqlite.ts +0 -577
  521. package/src/memory/storage.ts +0 -195
  522. package/src/memory/tool-defaults.ts +0 -108
  523. package/src/memory/types.ts +0 -71
  524. package/src/monitor.ts +0 -123
  525. package/src/onboarding/connect.ts +0 -177
  526. package/src/onboarding/credential-interceptor.ts +0 -122
  527. package/src/onboarding/degradation-accumulator.ts +0 -77
  528. package/src/onboarding/prompt-user.ts +0 -85
  529. package/src/onboarding/provider-status.ts +0 -382
  530. package/src/onboarding/providers.ts +0 -414
  531. package/src/onboarding/state.ts +0 -216
  532. package/src/onboarding/tool-helpers.ts +0 -104
  533. package/src/onboarding/tool-tags.ts +0 -244
  534. package/src/onboarding/validation.ts +0 -152
  535. package/src/pi/opencandle-extension.ts +0 -1244
  536. package/src/pi/session-action-dedupe.ts +0 -155
  537. package/src/pi/session-storage.ts +0 -5
  538. package/src/pi/session-writer-lock.ts +0 -426
  539. package/src/pi/session.ts +0 -84
  540. package/src/pi/setup.ts +0 -399
  541. package/src/pi/tool-adapter.ts +0 -49
  542. package/src/pi/tui-session-coordinator.ts +0 -351
  543. package/src/prompts/context-builder.ts +0 -326
  544. package/src/prompts/disclaimer.ts +0 -9
  545. package/src/prompts/policy-cards.ts +0 -228
  546. package/src/prompts/sections.ts +0 -46
  547. package/src/prompts/symbol-preflight.ts +0 -80
  548. package/src/prompts/workflow-prompts.ts +0 -504
  549. package/src/providers/alpha-vantage.ts +0 -334
  550. package/src/providers/coingecko.ts +0 -93
  551. package/src/providers/errors.ts +0 -9
  552. package/src/providers/exa-search.ts +0 -375
  553. package/src/providers/external-tool-command.ts +0 -164
  554. package/src/providers/external-tool-error.ts +0 -20
  555. package/src/providers/fear-greed.ts +0 -45
  556. package/src/providers/finnhub.ts +0 -125
  557. package/src/providers/fred.ts +0 -83
  558. package/src/providers/index.ts +0 -17
  559. package/src/providers/provider-credential-error.ts +0 -23
  560. package/src/providers/reddit-cli.ts +0 -286
  561. package/src/providers/reddit.ts +0 -106
  562. package/src/providers/sec-edgar.ts +0 -326
  563. package/src/providers/tradingview.ts +0 -399
  564. package/src/providers/twitter-cli.ts +0 -202
  565. package/src/providers/twitter.ts +0 -102
  566. package/src/providers/web-search.ts +0 -303
  567. package/src/providers/with-fallback.ts +0 -42
  568. package/src/providers/wrap-provider.ts +0 -103
  569. package/src/providers/yahoo-finance.ts +0 -672
  570. package/src/routing/classify-intent.ts +0 -380
  571. package/src/routing/defaults.ts +0 -29
  572. package/src/routing/entity-extractor.ts +0 -540
  573. package/src/routing/fund-symbols.ts +0 -58
  574. package/src/routing/horizon.ts +0 -7
  575. package/src/routing/index.ts +0 -70
  576. package/src/routing/legacy-rule-router.ts +0 -13
  577. package/src/routing/planning.ts +0 -829
  578. package/src/routing/route-manifest.ts +0 -308
  579. package/src/routing/router-llm-client.ts +0 -52
  580. package/src/routing/router-prompt.ts +0 -159
  581. package/src/routing/router-types.ts +0 -84
  582. package/src/routing/router.ts +0 -997
  583. package/src/routing/slot-resolver.ts +0 -213
  584. package/src/routing/symbol-disambiguator.ts +0 -72
  585. package/src/routing/turn-context.ts +0 -108
  586. package/src/routing/types.ts +0 -77
  587. package/src/runtime/answer-contracts.ts +0 -693
  588. package/src/runtime/artifact-contracts.ts +0 -77
  589. package/src/runtime/evidence.ts +0 -77
  590. package/src/runtime/planning-evidence.ts +0 -682
  591. package/src/runtime/prompt-step.ts +0 -60
  592. package/src/runtime/provider-tracker.ts +0 -40
  593. package/src/runtime/run-context.ts +0 -32
  594. package/src/runtime/session-coordinator.ts +0 -632
  595. package/src/runtime/session-title.ts +0 -60
  596. package/src/runtime/tool-defaults-wrapper.ts +0 -43
  597. package/src/runtime/validation.ts +0 -211
  598. package/src/runtime/workflow-events.ts +0 -75
  599. package/src/runtime/workflow-runner.ts +0 -182
  600. package/src/runtime/workflow-types.ts +0 -102
  601. package/src/sentiment/adapters/finnhub.ts +0 -49
  602. package/src/sentiment/adapters/reddit.ts +0 -65
  603. package/src/sentiment/adapters/twitter.ts +0 -36
  604. package/src/sentiment/adapters/web.ts +0 -44
  605. package/src/sentiment/index.ts +0 -49
  606. package/src/sentiment/insights.ts +0 -269
  607. package/src/sentiment/keywords.ts +0 -31
  608. package/src/sentiment/pipeline.ts +0 -91
  609. package/src/sentiment/scorer.ts +0 -89
  610. package/src/sentiment/store.ts +0 -260
  611. package/src/sentiment/trends.ts +0 -96
  612. package/src/sentiment/types.ts +0 -112
  613. package/src/system-prompt.ts +0 -115
  614. package/src/tool-kit.ts +0 -69
  615. package/src/tools/AGENTS.md +0 -36
  616. package/src/tools/fundamentals/company-overview.ts +0 -64
  617. package/src/tools/fundamentals/comps.ts +0 -169
  618. package/src/tools/fundamentals/dcf.ts +0 -367
  619. package/src/tools/fundamentals/earnings.ts +0 -57
  620. package/src/tools/fundamentals/financials.ts +0 -63
  621. package/src/tools/fundamentals/sec-filings.ts +0 -105
  622. package/src/tools/index.ts +0 -101
  623. package/src/tools/interaction/ask-user.ts +0 -93
  624. package/src/tools/macro/fear-greed.ts +0 -41
  625. package/src/tools/macro/fred-data.ts +0 -92
  626. package/src/tools/market/crypto-history.ts +0 -72
  627. package/src/tools/market/crypto-price.ts +0 -53
  628. package/src/tools/market/screen-stocks.ts +0 -279
  629. package/src/tools/market/search-ticker.ts +0 -254
  630. package/src/tools/market/stock-history.ts +0 -104
  631. package/src/tools/market/stock-quote.ts +0 -67
  632. package/src/tools/options/greeks.ts +0 -81
  633. package/src/tools/options/option-chain.ts +0 -120
  634. package/src/tools/portfolio/alerts.ts +0 -457
  635. package/src/tools/portfolio/correlation.ts +0 -189
  636. package/src/tools/portfolio/daily-report.ts +0 -107
  637. package/src/tools/portfolio/holdings-overlap.ts +0 -139
  638. package/src/tools/portfolio/notifications.ts +0 -45
  639. package/src/tools/portfolio/risk-analysis.ts +0 -173
  640. package/src/tools/portfolio/tracker.ts +0 -308
  641. package/src/tools/portfolio/watchlist.ts +0 -288
  642. package/src/tools/sentiment/insight-format.ts +0 -50
  643. package/src/tools/sentiment/query-match.ts +0 -117
  644. package/src/tools/sentiment/reddit-sentiment.ts +0 -403
  645. package/src/tools/sentiment/sentiment-summary.ts +0 -383
  646. package/src/tools/sentiment/sentiment-trend.ts +0 -75
  647. package/src/tools/sentiment/twitter-sentiment.ts +0 -287
  648. package/src/tools/sentiment/untrusted-text.ts +0 -21
  649. package/src/tools/sentiment/web-search.ts +0 -186
  650. package/src/tools/sentiment/web-sentiment.ts +0 -96
  651. package/src/tools/technical/backtest.ts +0 -336
  652. package/src/tools/technical/indicators.ts +0 -281
  653. package/src/types/fundamentals.ts +0 -46
  654. package/src/types/index.ts +0 -25
  655. package/src/types/macro.ts +0 -27
  656. package/src/types/market.ts +0 -44
  657. package/src/types/options.ts +0 -52
  658. package/src/types/portfolio.ts +0 -83
  659. package/src/types/sentiment.ts +0 -129
  660. package/src/workflows/compare-assets.ts +0 -89
  661. package/src/workflows/index.ts +0 -3
  662. package/src/workflows/options-screener.ts +0 -125
  663. package/src/workflows/portfolio-builder.ts +0 -63
@@ -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
@@ -20,9 +20,18 @@ export default function openCandleExtension(pi, options) {
20
20
  const coordinator = new SessionCoordinator();
21
21
  // Workflow transforms replace the user's turn with the expanded prompt; this
22
22
  // marker lets the GUI render the user's original words instead.
23
- const markOriginalInput = (original) => {
23
+ const markOriginalInput = (original, ctx) => {
24
+ if (hasUnconsumedOriginalInputMarker(ctx))
25
+ return;
24
26
  pi.appendEntry("opencandle-user-input", { original });
25
27
  };
28
+ const appendComprehensiveAnalysisWorkflowEntry = (symbol, definition) => {
29
+ pi.appendEntry("opencandle-workflow", {
30
+ workflow: "comprehensive_analysis",
31
+ resolvedSlots: { symbol },
32
+ analystsTotal: definition.steps.filter((step) => step.stepType.startsWith("analyst_")).length,
33
+ });
34
+ };
26
35
  // Credential-interception state. Lifetime:
27
36
  // `sessionPromptedSet` — cleared on session_start, persists across turns
28
37
  // within a session so users don't get re-prompted after picking
@@ -60,6 +69,7 @@ export default function openCandleExtension(pi, options) {
60
69
  return;
61
70
  }
62
71
  const definition = buildComprehensiveAnalysisDefinition(symbol);
72
+ appendComprehensiveAnalysisWorkflowEntry(symbol, definition);
63
73
  coordinator.executeWorkflow(pi, definition, ctx);
64
74
  },
65
75
  });
@@ -565,9 +575,10 @@ export default function openCandleExtension(pi, options) {
565
575
  const analysis = isAnalysisRequest(event.text);
566
576
  if (analysis.match && analysis.symbol) {
567
577
  const definition = buildComprehensiveAnalysisDefinition(analysis.symbol);
578
+ appendComprehensiveAnalysisWorkflowEntry(analysis.symbol, definition);
568
579
  const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
569
580
  if (prompt)
570
- markOriginalInput(event.text);
581
+ markOriginalInput(event.text, ctx);
571
582
  return prompt ? { action: "transform", text: prompt } : { action: "handled" };
572
583
  }
573
584
  const dispatched = await handleLlmRouterTurn(event.text, ctx);
@@ -679,6 +690,8 @@ export default function openCandleExtension(pi, options) {
679
690
  }
680
691
  async function dispatchRouterWorkflow(output, ctx, originalText) {
681
692
  const workflow = output.workflow;
693
+ if (!workflow)
694
+ return false;
682
695
  const storage = coordinator.getStorage();
683
696
  const workflowPrefs = storage?.getWorkflowPreferences("global") ?? {};
684
697
  const entities = mergeRouterSlotsIntoEntities(output);
@@ -693,7 +706,7 @@ export default function openCandleExtension(pi, options) {
693
706
  const definition = buildPortfolioWorkflowDefinition(resolution);
694
707
  const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
695
708
  if (prompt)
696
- markOriginalInput(originalText);
709
+ markOriginalInput(originalText, ctx);
697
710
  return prompt ? { action: "transform", text: prompt } : false;
698
711
  }
699
712
  if (workflow === "options_screener") {
@@ -710,7 +723,7 @@ export default function openCandleExtension(pi, options) {
710
723
  const definition = buildOptionsScreenerWorkflowDefinition(resolution);
711
724
  const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
712
725
  if (prompt)
713
- markOriginalInput(originalText);
726
+ markOriginalInput(originalText, ctx);
714
727
  return prompt ? { action: "transform", text: prompt } : false;
715
728
  }
716
729
  // Missing required symbol — treat as fallback with ask_user directive.
@@ -756,7 +769,7 @@ export default function openCandleExtension(pi, options) {
756
769
  applyPreflightAnnotation(definition, preflight.dropped);
757
770
  const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
758
771
  if (prompt)
759
- markOriginalInput(originalText);
772
+ markOriginalInput(originalText, ctx);
760
773
  return prompt ? { action: "transform", text: prompt } : false;
761
774
  }
762
775
  // single_asset_analysis / watchlist / general_qa + any workflow with
@@ -977,7 +990,6 @@ export default function openCandleExtension(pi, options) {
977
990
  const model = ctx.model;
978
991
  if (!model)
979
992
  return null;
980
- // biome-ignore lint/suspicious/noExplicitAny: Pi typings keep Model generic
981
993
  return createPiAiRouterClient(model);
982
994
  }
983
995
  // System prompt assembly — delegate to coordinator. When a fallback context
@@ -990,6 +1002,34 @@ export default function openCandleExtension(pi, options) {
990
1002
  };
991
1003
  });
992
1004
  }
1005
+ function hasUnconsumedOriginalInputMarker(ctx) {
1006
+ const manager = ctx?.sessionManager;
1007
+ const entries = typeof manager?.getBranch === "function"
1008
+ ? manager.getBranch()
1009
+ : typeof manager?.getEntries === "function"
1010
+ ? manager.getEntries()
1011
+ : [];
1012
+ let markerAfterLastUser = false;
1013
+ for (const entry of entries) {
1014
+ if (!isSessionEntryRecord(entry))
1015
+ continue;
1016
+ if (entry.type === "message" && entry.message?.role === "user") {
1017
+ markerAfterLastUser = false;
1018
+ continue;
1019
+ }
1020
+ if (entry.type === "custom" && entry.customType === "opencandle-user-input") {
1021
+ markerAfterLastUser = true;
1022
+ continue;
1023
+ }
1024
+ if (markerAfterLastUser) {
1025
+ markerAfterLastUser = false;
1026
+ }
1027
+ }
1028
+ return markerAfterLastUser;
1029
+ }
1030
+ function isSessionEntryRecord(entry) {
1031
+ return typeof entry === "object" && entry !== null;
1032
+ }
993
1033
  /** Concatenate text from a Pi message `content` (plain string or block array). */
994
1034
  function extractMessageText(content) {
995
1035
  if (typeof content === "string")
@@ -1026,4 +1066,3 @@ function isPlaceholderSessionName(name, candidates) {
1026
1066
  }
1027
1067
  return false;
1028
1068
  }
1029
- //# 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;
@@ -201,6 +201,7 @@ export async function getGlobalQuote(symbol, apiKey) {
201
201
  week52High: 0, // Not available from GLOBAL_QUOTE
202
202
  week52Low: 0, // Not available from GLOBAL_QUOTE
203
203
  timestamp: Date.now(),
204
+ asOf: dateOnlyValue(gq["07. latest trading day"]),
204
205
  };
205
206
  cache.set(cacheKey, result, TTL.QUOTE);
206
207
  return result;
@@ -213,6 +214,11 @@ export async function getGlobalQuote(symbol, apiKey) {
213
214
  throw error;
214
215
  }
215
216
  }
217
+ function dateOnlyValue(value) {
218
+ if (!value || !/^\d{4}-\d{2}-\d{2}$/.test(value))
219
+ return undefined;
220
+ return value;
221
+ }
216
222
  export async function getDailyHistory(symbol, apiKey, range = "6mo") {
217
223
  const cacheKey = `av:daily:${symbol}:${range}`;
218
224
  const cached = cache.get(cacheKey);
@@ -285,6 +291,5 @@ function parseNullableNum(s) {
285
291
  if (!s || s === "None" || s === "-")
286
292
  return null;
287
293
  const n = parseFloat(s);
288
- return isNaN(n) ? null : n;
294
+ return Number.isNaN(n) ? null : n;
289
295
  }
290
- //# sourceMappingURL=alpha-vantage.js.map
@@ -28,6 +28,7 @@ export async function getCryptoPrice(id) {
28
28
  circulatingSupply: md.circulating_supply,
29
29
  totalSupply: md.total_supply,
30
30
  timestamp: Date.now(),
31
+ asOf: md.last_updated,
31
32
  };
32
33
  cache.set(cacheKey, result, TTL.QUOTE);
33
34
  return result;
@@ -66,4 +67,3 @@ export async function getCryptoHistory(id, days = 180) {
66
67
  throw error;
67
68
  }
68
69
  }
69
- //# 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
@@ -0,0 +1,2 @@
1
+ import type { PredictionMarketQuote } from "../types/prediction-markets.js";
2
+ export declare function searchPredictionMarkets(query: string, limit?: number): Promise<PredictionMarketQuote[]>;
@@ -0,0 +1,162 @@
1
+ import { cache, STALE_LIMIT, TTL } from "../infra/cache.js";
2
+ import { httpGet } from "../infra/http-client.js";
3
+ import { rateLimiter } from "../infra/rate-limiter.js";
4
+ const BASE_URL = "https://gamma-api.polymarket.com";
5
+ const POLYMARKET_URL = "https://polymarket.com";
6
+ export async function searchPredictionMarkets(query, limit = 8) {
7
+ const normalizedQuery = query.trim();
8
+ const normalizedLimit = normalizeLimit(limit);
9
+ if (!normalizedQuery)
10
+ return [];
11
+ const cacheKey = `polymarket:search:${normalizedQuery.toLowerCase()}:${normalizedLimit}`;
12
+ const cached = cache.get(cacheKey);
13
+ if (cached)
14
+ return cached;
15
+ try {
16
+ await rateLimiter.acquire("polymarket");
17
+ const url = `${BASE_URL}/public-search?q=${encodeURIComponent(normalizedQuery)}&limit=${normalizedLimit}`;
18
+ const response = await httpGet(url, {
19
+ headers: { Accept: "application/json" },
20
+ maxRetries: 0,
21
+ });
22
+ const quotes = decodeSearchResponse(response).slice(0, normalizedLimit);
23
+ cache.set(cacheKey, quotes, TTL.PREDICTION_MARKETS);
24
+ return quotes;
25
+ }
26
+ catch (error) {
27
+ const stale = cache.getStale(cacheKey, STALE_LIMIT.PREDICTION_MARKETS);
28
+ if (stale)
29
+ return stale.value;
30
+ throw error;
31
+ }
32
+ }
33
+ function decodeSearchResponse(response) {
34
+ const markets = [
35
+ ...(response.events ?? []).flatMap((event) => (event.markets ?? []).map((market) => ({ event, market }))),
36
+ ...(response.markets ?? []).map((market) => ({ market })),
37
+ ];
38
+ return markets.flatMap(({ event, market }) => isOpenMarket(market) ? marketToQuotes(market, event) : []);
39
+ }
40
+ function marketToQuotes(market, event) {
41
+ const marketId = market.id === undefined ? undefined : String(market.id);
42
+ const title = stringValue(market.question) ?? stringValue(event?.title);
43
+ if (!marketId || !title)
44
+ return [];
45
+ const outcomes = parseStringArray(market.outcomes);
46
+ const prices = parseNumberArray(market.outcomePrices);
47
+ if (outcomes.length === 0 || prices.length === 0)
48
+ return [];
49
+ const resolutionCriteria = firstNonEmpty(market.description, market.resolutionSource);
50
+ const volumeUsd = numberValue(market.volumeNum) ?? numberValue(market.volume) ?? numberValue(event?.volume);
51
+ const liquidityUsd = numberValue(market.liquidityNum) ??
52
+ numberValue(market.liquidity) ??
53
+ numberValue(event?.liquidity);
54
+ const closeDate = stringValue(market.endDate) ?? normalizeDateOnly(market.endDateIso ?? event?.endDate);
55
+ const url = marketUrl(market, event);
56
+ const asOf = stringValue(market.updatedAt) ?? stringValue(event?.updatedAt);
57
+ return outcomes.flatMap((outcome, index) => {
58
+ const probability = prices[index];
59
+ if (probability === undefined || probability < 0 || probability > 1)
60
+ return [];
61
+ return [
62
+ {
63
+ source: "polymarket",
64
+ marketId,
65
+ title,
66
+ outcome,
67
+ probability,
68
+ ...(volumeUsd !== undefined && { volumeUsd }),
69
+ ...(liquidityUsd !== undefined && { liquidityUsd }),
70
+ ...(closeDate && { closeDate }),
71
+ ...(resolutionCriteria && { resolutionCriteria }),
72
+ url,
73
+ ...(asOf && { asOf }),
74
+ },
75
+ ];
76
+ });
77
+ }
78
+ function isOpenMarket(market) {
79
+ if (booleanValue(market.closed) === true)
80
+ return false;
81
+ if (booleanValue(market.active) === false)
82
+ return false;
83
+ const endDate = stringValue(market.endDate) ?? stringValue(market.endDateIso);
84
+ if (!endDate)
85
+ return true;
86
+ const parsed = new Date(endDate);
87
+ return Number.isNaN(parsed.getTime()) || parsed.getTime() > Date.now();
88
+ }
89
+ function normalizeLimit(limit) {
90
+ if (!Number.isFinite(limit))
91
+ return 8;
92
+ return Math.min(50, Math.max(1, Math.floor(limit)));
93
+ }
94
+ function parseStringArray(value) {
95
+ const parsed = parseJsonArray(value);
96
+ return parsed.flatMap((item) => {
97
+ const text = stringValue(item);
98
+ return text ? [text] : [];
99
+ });
100
+ }
101
+ function parseNumberArray(value) {
102
+ const parsed = parseJsonArray(value);
103
+ return parsed.map((item) => numberValue(item));
104
+ }
105
+ function parseJsonArray(value) {
106
+ if (Array.isArray(value))
107
+ return value;
108
+ if (typeof value !== "string")
109
+ return [];
110
+ try {
111
+ const parsed = JSON.parse(value);
112
+ return Array.isArray(parsed) ? parsed : [];
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ }
118
+ function numberValue(value) {
119
+ const number = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
120
+ return Number.isFinite(number) ? number : undefined;
121
+ }
122
+ function stringValue(value) {
123
+ if (typeof value !== "string")
124
+ return undefined;
125
+ const trimmed = value.trim();
126
+ return trimmed.length > 0 ? trimmed : undefined;
127
+ }
128
+ function booleanValue(value) {
129
+ if (typeof value === "boolean")
130
+ return value;
131
+ if (typeof value !== "string")
132
+ return undefined;
133
+ const normalized = value.trim().toLowerCase();
134
+ if (normalized === "true")
135
+ return true;
136
+ if (normalized === "false")
137
+ return false;
138
+ return undefined;
139
+ }
140
+ function firstNonEmpty(...values) {
141
+ for (const value of values) {
142
+ const text = stringValue(value);
143
+ if (text)
144
+ return text;
145
+ }
146
+ return undefined;
147
+ }
148
+ function normalizeDateOnly(value) {
149
+ if (!value)
150
+ return undefined;
151
+ return /^\d{4}-\d{2}-\d{2}$/.test(value) ? `${value}T00:00:00Z` : value;
152
+ }
153
+ function marketUrl(market, event) {
154
+ const marketSlug = stringValue(market.slug);
155
+ const eventSlug = stringValue(event?.slug);
156
+ if (eventSlug && marketSlug) {
157
+ return `${POLYMARKET_URL}/event/${encodeURIComponent(eventSlug)}/${encodeURIComponent(marketSlug)}`;
158
+ }
159
+ if (marketSlug)
160
+ return `${POLYMARKET_URL}/event/${encodeURIComponent(marketSlug)}`;
161
+ return POLYMARKET_URL;
162
+ }
@@ -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