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
@@ -15,13 +15,95 @@ export function promptStep(stepType, description, prompt, options = {}) {
15
15
  * Create a StepOutput for a prompt-based step (no structured evidence yet).
16
16
  * Evidence will be captured separately via tool call hooks.
17
17
  */
18
- export function promptStepOutput(stepIndex, stepType) {
18
+ export function promptStepOutput(stepIndex, stepType, options = {}) {
19
19
  return {
20
20
  stepIndex,
21
21
  stepType,
22
- evidence: [],
22
+ evidence: options.evidence ?? [],
23
+ ...(options.rawText ? { rawText: options.rawText } : {}),
23
24
  };
24
25
  }
26
+ /** Capture compact evidence records from session entries produced by one step. */
27
+ export function captureToolEvidence(entries) {
28
+ const calls = new Map();
29
+ const evidence = [];
30
+ for (const entry of entries) {
31
+ if (entry.type !== "message")
32
+ continue;
33
+ const message = entry.message;
34
+ if (message.role === "assistant") {
35
+ for (const part of Array.isArray(message.content) ? message.content : []) {
36
+ const record = asRecord(part);
37
+ if (record.type !== "toolCall")
38
+ continue;
39
+ const id = stringValue(record.id);
40
+ const tool = stringValue(record.name);
41
+ if (!id || !tool)
42
+ continue;
43
+ calls.set(id, {
44
+ tool,
45
+ args: record.arguments ?? record.args ?? {},
46
+ startedAt: entry.timestamp,
47
+ });
48
+ }
49
+ continue;
50
+ }
51
+ if (message.role !== "toolResult")
52
+ continue;
53
+ const toolCallId = stringValue(message.toolCallId);
54
+ const pending = toolCallId ? calls.get(toolCallId) : undefined;
55
+ const tool = pending?.tool ?? stringValue(message.toolName);
56
+ if (!tool)
57
+ continue;
58
+ const resultValue = message.details ?? message.content ?? "";
59
+ const freshness = extractFreshness(resultValue);
60
+ const serializedResult = serialize(resultValue);
61
+ evidence.push({
62
+ label: `tool:${tool}`,
63
+ value: {
64
+ tool,
65
+ args: truncate(serialize(pending?.args ?? {}), 500),
66
+ ...(freshness ? { freshness } : {}),
67
+ resultDigest: {
68
+ preview: truncate(serializedResult, 500),
69
+ totalLength: serializedResult.length,
70
+ },
71
+ startedAt: pending?.startedAt ?? entry.timestamp,
72
+ completedAt: entry.timestamp,
73
+ },
74
+ provenance: {
75
+ source: "computed",
76
+ timestamp: freshness?.providerDataAt ?? freshness?.fetchedAt ?? entry.timestamp,
77
+ provider: tool,
78
+ confidence: message.isError === true ? 0.5 : undefined,
79
+ },
80
+ });
81
+ }
82
+ return evidence;
83
+ }
84
+ /** Extract assistant text emitted during a step, preserving final response order. */
85
+ export function extractAssistantText(entries) {
86
+ return entries
87
+ .filter((entry) => entry.type === "message")
88
+ .flatMap((entry) => {
89
+ const message = entry
90
+ .message;
91
+ if (message.role !== "assistant")
92
+ return [];
93
+ const content = message.content;
94
+ if (typeof content === "string")
95
+ return [content];
96
+ if (!Array.isArray(content))
97
+ return [];
98
+ return content
99
+ .map((part) => asRecord(part))
100
+ .filter((part) => part.type === "text")
101
+ .map((part) => stringValue(part.text) ?? "")
102
+ .filter(Boolean);
103
+ })
104
+ .join("\n")
105
+ .trim();
106
+ }
25
107
  /**
26
108
  * Extract just the WorkflowStep metadata from PromptStep definitions
27
109
  * (dropping the prompt field) for passing to WorkflowRunner.
@@ -29,4 +111,35 @@ export function promptStepOutput(stepIndex, stepType) {
29
111
  export function toStepDefinitions(steps) {
30
112
  return steps.map(({ prompt: _prompt, ...step }) => step);
31
113
  }
32
- //# sourceMappingURL=prompt-step.js.map
114
+ function serialize(value) {
115
+ if (typeof value === "string")
116
+ return value;
117
+ try {
118
+ return JSON.stringify(value);
119
+ }
120
+ catch {
121
+ return String(value);
122
+ }
123
+ }
124
+ function truncate(value, maxLength) {
125
+ return value.length > maxLength ? value.slice(0, maxLength) : value;
126
+ }
127
+ function asRecord(value) {
128
+ return typeof value === "object" && value !== null && !Array.isArray(value)
129
+ ? value
130
+ : {};
131
+ }
132
+ function stringValue(value) {
133
+ return typeof value === "string" && value.length > 0 ? value : undefined;
134
+ }
135
+ function extractFreshness(value) {
136
+ const record = asRecord(value);
137
+ return isFreshnessStamp(record.freshness) ? record.freshness : undefined;
138
+ }
139
+ function isFreshnessStamp(value) {
140
+ const record = asRecord(value);
141
+ return (typeof record.fetchedAt === "string" &&
142
+ typeof record.cacheStatus === "string" &&
143
+ typeof record.marketSession === "string" &&
144
+ typeof record.isStaleForSession === "boolean");
145
+ }
@@ -33,4 +33,3 @@ export class ProviderTracker {
33
33
  this.failures.clear();
34
34
  }
35
35
  }
36
- //# sourceMappingURL=provider-tracker.js.map
@@ -18,4 +18,3 @@ export function clearRunContext(token) {
18
18
  export function getProviderTracker() {
19
19
  return activeContext?.providerTracker;
20
20
  }
21
- //# sourceMappingURL=run-context.js.map
@@ -1,4 +1,4 @@
1
- import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
1
+ import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, SessionEntry } from "@earendil-works/pi-coding-agent";
2
2
  import { MemoryStorage } from "../memory/index.js";
3
3
  /**
4
4
  * Alias for the session-manager handle extensions receive via
@@ -21,6 +21,9 @@ type QueueContext = ExtensionCommandContext | {
21
21
  ui?: {
22
22
  notify(message: string, level?: string): void;
23
23
  };
24
+ sessionManager?: {
25
+ getEntries(): SessionEntry[];
26
+ };
24
27
  };
25
28
  /**
26
29
  * Coordinates session lifecycle, memory, workflow execution,
@@ -35,6 +38,8 @@ export declare class SessionCoordinator {
35
38
  private providerTracker;
36
39
  private activeWorkflowRunRef;
37
40
  private activeWorkflowType;
41
+ private activeStepCapture;
42
+ private workflowEventCaptureInstalled;
38
43
  private tickerValidationCache;
39
44
  private sessionId;
40
45
  constructor();
@@ -129,5 +134,10 @@ export declare class SessionCoordinator {
129
134
  private startWorkflowRun;
130
135
  /** Cancel any active workflow. */
131
136
  cancelActiveWorkflow(): void;
137
+ private startStepCapture;
138
+ private installWorkflowEventCapture;
139
+ private prepareWorkflowPrompt;
140
+ private emitSynthesisValidation;
141
+ private appendWorkflowEvent;
132
142
  }
133
143
  export {};
@@ -1,13 +1,18 @@
1
- import { getAllDefaults, initDefaultDatabase, MemoryStorage } from "../memory/index.js";
1
+ import { isAnalystSplit, parseAnalystOutput, parseDebateOutput } from "../analysts/contracts.js";
2
+ import { buildAnalystVoteTallyBlock } from "../analysts/orchestrator.js";
2
3
  import { MarketStateService } from "../market-state/service.js";
4
+ import { formatJsonSummary, formatLatestReportSummary, formatPortfolioSummary, formatWatchlistSummary, } from "../market-state/summaries.js";
5
+ import { getAllDefaults, initDefaultDatabase, MemoryStorage } from "../memory/index.js";
3
6
  import { MemoryManager } from "../memory/manager.js";
4
7
  import { extractPreferences } from "../memory/preference-extractor.js";
5
8
  import { runOpenCandleSetup } from "../pi/setup.js";
6
9
  import { PromptContextBuilder } from "../prompts/context-builder.js";
7
10
  import { getAddonToolDescriptions } from "../tool-kit.js";
8
- import { promptStepOutput, toStepDefinitions } from "./prompt-step.js";
11
+ import { collectToolNumbers, extractNumericClaims } from "./numeric-claims.js";
12
+ import { captureToolEvidence, extractAssistantText, promptStepOutput, toStepDefinitions, } from "./prompt-step.js";
9
13
  import { ProviderTracker } from "./provider-tracker.js";
10
14
  import { clearRunContext, setRunContext } from "./run-context.js";
15
+ import { checkNumberMatch } from "./validation.js";
11
16
  import { WorkflowEventLogger } from "./workflow-events.js";
12
17
  import { WorkflowRunner } from "./workflow-runner.js";
13
18
  const PROMPT_SETTLE_POLL_MS = 25;
@@ -31,6 +36,10 @@ function hasPendingMessages(ctx) {
31
36
  function isReadyForNextPrompt(ctx) {
32
37
  return ctx.isIdle() && !hasPendingMessages(ctx);
33
38
  }
39
+ function readSessionEntries(ctx) {
40
+ const manager = "sessionManager" in ctx ? ctx.sessionManager : undefined;
41
+ return manager?.getEntries?.() ?? [];
42
+ }
34
43
  function sleep(ms) {
35
44
  return new Promise((resolve) => setTimeout(resolve, ms));
36
45
  }
@@ -68,6 +77,8 @@ export class SessionCoordinator {
68
77
  providerTracker;
69
78
  activeWorkflowRunRef = null;
70
79
  activeWorkflowType;
80
+ activeStepCapture = null;
81
+ workflowEventCaptureInstalled = false;
71
82
  tickerValidationCache = new Map();
72
83
  sessionId = "unknown";
73
84
  constructor() {
@@ -297,6 +308,7 @@ export class SessionCoordinator {
297
308
  startWorkflowRun(pi, definition, ctx, firstPromptMode) {
298
309
  if (definition.steps.length === 0)
299
310
  return;
311
+ this.installWorkflowEventCapture(pi);
300
312
  const runner = this.runner;
301
313
  if (this.activeWorkflowRunRef) {
302
314
  this.activeWorkflowRunRef.active = false;
@@ -321,27 +333,74 @@ export class SessionCoordinator {
321
333
  // Start the runner in the background for state tracking
322
334
  const stepDefs = toStepDefinitions(definition.steps);
323
335
  void runner
324
- .start(definition.workflowType, stepDefs, async (step, stepIndex) => {
325
- // First step was already sent above — just wait for settlement
336
+ .start(definition.workflowType, stepDefs, async (step, stepIndex, _priorEvidence, context) => {
337
+ let entriesBeforeStep = readSessionEntries(ctx).length;
338
+ const eventCapture = this.startStepCapture();
339
+ // First step was already sent above — later steps are sent here.
326
340
  if (stepIndex > 0) {
327
341
  const settled = await waitForPromptSettlement(ctx, () => runRef.active);
328
342
  if (!settled || !runRef.active) {
329
343
  throw new Error("run_cancelled");
330
344
  }
331
- pi.sendUserMessage(definition.steps[stepIndex].prompt);
345
+ if (shouldSkipRebuttal(runner.getActiveRun(), step.stepType)) {
346
+ this.appendWorkflowEvent(pi, "step_skipped", {
347
+ stepType: step.stepType,
348
+ reason: "analyst_consensus",
349
+ });
350
+ throw new Error("analyst_consensus");
351
+ }
352
+ entriesBeforeStep = readSessionEntries(ctx).length;
353
+ const prompt = this.prepareWorkflowPrompt(pi, definition.steps[stepIndex].prompt, step.stepType, runner.getActiveRun());
354
+ pi.sendUserMessage(prompt);
332
355
  }
333
- else {
334
- // For the first step, just wait for it to settle
335
- const settled = await waitForPromptSettlement(ctx, () => runRef.active, {
336
- requireActivity: firstPromptMode === "transform",
337
- });
338
- if (!settled || !runRef.active) {
356
+ const settled = await waitForPromptSettlement(ctx, () => runRef.active, {
357
+ requireActivity: stepIndex === 0 && firstPromptMode === "transform",
358
+ });
359
+ if (!settled || !runRef.active) {
360
+ throw new Error("run_cancelled");
361
+ }
362
+ let stepEntries = readSessionEntries(ctx).slice(entriesBeforeStep);
363
+ let rawText = capturedText(eventCapture, stepEntries);
364
+ let output = promptStepOutput(stepIndex, step.stepType, {
365
+ evidence: capturedEvidence(eventCapture, stepEntries),
366
+ rawText,
367
+ });
368
+ if (isStructuredAnalystStep(step.stepType) &&
369
+ !hasStructuredContract(step.stepType, rawText)) {
370
+ pi.sendUserMessage("Please revise your previous response to include the exact required final output format from the stage prompt. Do not add new tool calls.");
371
+ const retrySettled = await waitForPromptSettlement(ctx, () => runRef.active);
372
+ if (!retrySettled || !runRef.active) {
339
373
  throw new Error("run_cancelled");
340
374
  }
375
+ stepEntries = readSessionEntries(ctx).slice(entriesBeforeStep);
376
+ rawText = capturedText(eventCapture, stepEntries);
377
+ output = promptStepOutput(stepIndex, step.stepType, {
378
+ evidence: capturedEvidence(eventCapture, stepEntries),
379
+ rawText,
380
+ });
381
+ }
382
+ for (const record of output.evidence) {
383
+ const value = isPlainObject(record.value) ? record.value : {};
384
+ this.eventLogger?.log(context.runId, stepIndex, "tool_called", {
385
+ stepType: step.stepType,
386
+ tool: value.tool,
387
+ args: value.args,
388
+ resultDigest: value.resultDigest,
389
+ });
390
+ }
391
+ if (this.activeStepCapture === eventCapture) {
392
+ this.activeStepCapture = null;
393
+ }
394
+ const structuredOutput = attachStructuredOutput(pi, output);
395
+ if (step.stepType === "synthesis") {
396
+ this.emitSynthesisValidation(pi, context.runId, stepIndex, runner.getActiveRun(), structuredOutput);
341
397
  }
342
- return promptStepOutput(stepIndex, step.stepType);
398
+ return structuredOutput;
343
399
  })
344
400
  .finally(() => {
401
+ if (this.activeWorkflowRunRef === runRef) {
402
+ this.activeStepCapture = null;
403
+ }
345
404
  clearRunContext(runRef.contextToken);
346
405
  if (this.activeWorkflowRunRef === runRef) {
347
406
  this.activeWorkflowRunRef = null;
@@ -356,8 +415,216 @@ export class SessionCoordinator {
356
415
  clearRunContext(activeRef.contextToken);
357
416
  this.activeWorkflowRunRef = null;
358
417
  }
418
+ this.activeStepCapture = null;
359
419
  this.runner?.cancel();
360
420
  }
421
+ startStepCapture() {
422
+ const capture = {
423
+ evidence: [],
424
+ pendingTools: new Map(),
425
+ rawText: "",
426
+ };
427
+ this.activeStepCapture = capture;
428
+ return capture;
429
+ }
430
+ installWorkflowEventCapture(pi) {
431
+ const on = pi.on;
432
+ if (this.workflowEventCaptureInstalled || typeof on !== "function")
433
+ return;
434
+ this.workflowEventCaptureInstalled = true;
435
+ pi.on("message_update", (event) => {
436
+ const capture = this.activeStepCapture;
437
+ if (!capture || event.assistantMessageEvent.type !== "text_delta")
438
+ return;
439
+ capture.rawText += event.assistantMessageEvent.delta;
440
+ });
441
+ pi.on("tool_execution_start", (event) => {
442
+ const capture = this.activeStepCapture;
443
+ if (!capture)
444
+ return;
445
+ capture.pendingTools.set(event.toolCallId, {
446
+ tool: event.toolName,
447
+ args: event.args ?? {},
448
+ startedAt: new Date().toISOString(),
449
+ });
450
+ });
451
+ pi.on("tool_execution_end", (event) => {
452
+ const capture = this.activeStepCapture;
453
+ if (!capture)
454
+ return;
455
+ const completedAt = new Date().toISOString();
456
+ const pending = capture.pendingTools.get(event.toolCallId);
457
+ capture.pendingTools.delete(event.toolCallId);
458
+ const tool = pending?.tool ?? event.toolName;
459
+ if (!tool)
460
+ return;
461
+ capture.evidence.push(toolEvidenceRecord({
462
+ tool,
463
+ args: pending?.args ?? {},
464
+ result: event.result,
465
+ startedAt: pending?.startedAt ?? completedAt,
466
+ completedAt,
467
+ isError: event.isError === true,
468
+ }));
469
+ });
470
+ }
471
+ prepareWorkflowPrompt(pi, prompt, stepType, run) {
472
+ if (stepType !== "synthesis")
473
+ return prompt;
474
+ const parsedAnalysts = collectParsedAnalystOutputs(run);
475
+ const tallyBlock = buildAnalystVoteTallyBlock(parsedAnalysts);
476
+ if (!tallyBlock) {
477
+ this.eventLogger?.log(run?.runId ?? "unknown", run?.currentStepIndex ?? 0, "tally_skipped", {
478
+ reason: "tally_skipped",
479
+ parsedAnalystCount: parsedAnalysts.length,
480
+ });
481
+ this.appendWorkflowEvent(pi, "tally_skipped", {
482
+ reason: "fewer_than_2_parsed_analysts",
483
+ parsedAnalystCount: parsedAnalysts.length,
484
+ });
485
+ return prompt;
486
+ }
487
+ this.eventLogger?.log(run?.runId ?? "unknown", run?.currentStepIndex ?? 0, "tally_injected", {
488
+ tallyBlock,
489
+ parsedAnalystCount: parsedAnalysts.length,
490
+ });
491
+ this.appendWorkflowEvent(pi, "tally_injected", {
492
+ tallyBlock,
493
+ parsedAnalystCount: parsedAnalysts.length,
494
+ });
495
+ return `${tallyBlock}\n\n${prompt}`;
496
+ }
497
+ emitSynthesisValidation(pi, runId, stepIndex, run, currentOutput) {
498
+ const validationInput = collectValidationInput(run, currentOutput);
499
+ const mismatches = checkNumberMatch(validationInput.evidence, validationInput.toolResults).filter((entry) => entry.type === "failure");
500
+ const passed = mismatches.length === 0;
501
+ const payload = {
502
+ passed,
503
+ mismatches,
504
+ skipped_unparsed: validationInput.skippedUnparsed,
505
+ };
506
+ this.eventLogger?.log(runId, stepIndex, passed ? "validation_passed" : "validation_failed", {
507
+ mismatches,
508
+ skipped_unparsed: validationInput.skippedUnparsed,
509
+ });
510
+ pi.appendEntry("opencandle-validation", payload);
511
+ this.appendWorkflowEvent(pi, passed ? "validation_passed" : "validation_failed", {
512
+ mismatches,
513
+ skipped_unparsed: validationInput.skippedUnparsed,
514
+ });
515
+ }
516
+ appendWorkflowEvent(pi, eventType, payload) {
517
+ pi.appendEntry("opencandle-workflow-event", {
518
+ eventType,
519
+ ...payload,
520
+ });
521
+ }
522
+ }
523
+ function capturedText(capture, entries) {
524
+ return capture.rawText.trim() || extractAssistantText(entries);
525
+ }
526
+ function capturedEvidence(capture, entries) {
527
+ return capture.evidence.length > 0 ? [...capture.evidence] : captureToolEvidence(entries);
528
+ }
529
+ function collectParsedAnalystOutputs(run) {
530
+ if (!run)
531
+ return [];
532
+ const outputs = [];
533
+ for (const output of run.stepOutputs.values()) {
534
+ if (output.parsed === true && output.analystOutput) {
535
+ outputs.push(output.analystOutput);
536
+ }
537
+ }
538
+ return outputs;
539
+ }
540
+ function shouldSkipRebuttal(run, stepType) {
541
+ if (stepType !== "debate_rebuttal")
542
+ return false;
543
+ const parsedAnalysts = collectParsedAnalystOutputs(run);
544
+ // Degradation rule: with fewer than two parsed analyst outputs there is no
545
+ // trustworthy consensus signal to gate on — run the rebuttal exactly as the
546
+ // status quo instead of skipping because isAnalystSplit([]) is false.
547
+ if (parsedAnalysts.length < 2)
548
+ return false;
549
+ return !isAnalystSplit(parsedAnalysts);
550
+ }
551
+ function collectValidationInput(run, currentOutput) {
552
+ const evidence = [];
553
+ const toolResults = new Map();
554
+ const skippedUnparsed = [];
555
+ const outputs = run ? [...run.stepOutputs.values()] : [];
556
+ if (currentOutput) {
557
+ outputs.push(currentOutput);
558
+ }
559
+ for (const output of outputs) {
560
+ if (output.stepType.startsWith("analyst_") && output.parsed === false) {
561
+ skippedUnparsed.push(output.stepType);
562
+ }
563
+ for (const record of output.evidence) {
564
+ collectToolNumbers(record, toolResults);
565
+ }
566
+ }
567
+ for (const output of outputs) {
568
+ if (!output.rawText)
569
+ continue;
570
+ evidence.push(...extractNumericClaims(output.rawText, toolResults));
571
+ }
572
+ return { evidence, toolResults, skippedUnparsed };
573
+ }
574
+ function toolEvidenceRecord(input) {
575
+ const serializedResult = serialize(input.result);
576
+ const freshness = extractFreshness(input.result);
577
+ return {
578
+ label: `tool:${input.tool}`,
579
+ value: {
580
+ tool: input.tool,
581
+ args: truncate(serialize(input.args), 500),
582
+ ...(freshness ? { freshness } : {}),
583
+ resultDigest: {
584
+ preview: truncate(serializedResult, 500),
585
+ totalLength: serializedResult.length,
586
+ },
587
+ startedAt: input.startedAt,
588
+ completedAt: input.completedAt,
589
+ },
590
+ provenance: {
591
+ source: "computed",
592
+ timestamp: freshness?.providerDataAt ?? freshness?.fetchedAt ?? input.completedAt,
593
+ provider: input.tool,
594
+ confidence: input.isError ? 0.5 : undefined,
595
+ },
596
+ };
597
+ }
598
+ function summarizeStepEvidence(evidence) {
599
+ return evidence.map((record) => (isPlainObject(record.value) ? record.value : record));
600
+ }
601
+ function serialize(value) {
602
+ if (typeof value === "string")
603
+ return value;
604
+ try {
605
+ return JSON.stringify(value);
606
+ }
607
+ catch {
608
+ return String(value);
609
+ }
610
+ }
611
+ function truncate(value, maxLength) {
612
+ return value.length > maxLength ? value.slice(0, maxLength) : value;
613
+ }
614
+ function extractFreshness(value) {
615
+ const record = isPlainObject(value) ? value : {};
616
+ const direct = record.freshness;
617
+ if (isFreshnessStamp(direct))
618
+ return direct;
619
+ const details = isPlainObject(record.details) ? record.details : {};
620
+ return isFreshnessStamp(details.freshness) ? details.freshness : undefined;
621
+ }
622
+ function isFreshnessStamp(value) {
623
+ const record = isPlainObject(value) ? value : {};
624
+ return (typeof record.fetchedAt === "string" &&
625
+ typeof record.cacheStatus === "string" &&
626
+ typeof record.marketSession === "string" &&
627
+ typeof record.isStaleForSession === "boolean");
361
628
  }
362
629
  function formatToolDefaultsForPrompt() {
363
630
  try {
@@ -387,6 +654,76 @@ function flattenDefaults(defaults, prefix = "") {
387
654
  }
388
655
  return out;
389
656
  }
657
+ function isStructuredAnalystStep(stepType) {
658
+ return stepType.startsWith("analyst_") || stepType.startsWith("debate_");
659
+ }
660
+ function hasStructuredContract(stepType, text) {
661
+ if (stepType.startsWith("analyst_")) {
662
+ // The conviction range check must match extractConviction's 1-10
663
+ // contract: parseAnalystOutput silently defaults out-of-range values to
664
+ // 5, so accepting them here would record a fabricated conviction.
665
+ const conviction = text.match(/CONVICTION:\s*(\d+)/i);
666
+ const convictionInRange = conviction !== null && Number(conviction[1]) >= 1 && Number(conviction[1]) <= 10;
667
+ return (/SIGNAL:\s*(BUY|HOLD|SELL)/i.test(text) && convictionInRange && /THESIS:\s*(.+)/i.test(text));
668
+ }
669
+ if (stepType === "debate_bull") {
670
+ return (/BULL THESIS:\s*(.+)/i.test(text) && /KEY RISK(?:\s+TO THIS THESIS)?:\s*(.+)/i.test(text));
671
+ }
672
+ if (stepType === "debate_bear") {
673
+ return /BEAR THESIS:\s*(.+)/i.test(text) && /WHAT WOULD CHANGE MY MIND:\s*(.+)/i.test(text);
674
+ }
675
+ if (stepType === "debate_rebuttal") {
676
+ return (/^REBUTTAL SKIPPED/i.test(text.trim()) ||
677
+ (/CONCESSIONS:\s*[\s\S]+/i.test(text) && /REMAINING CONVICTION:\s*(\d+)/i.test(text)));
678
+ }
679
+ return false;
680
+ }
681
+ function attachStructuredOutput(pi, output) {
682
+ if (!isStructuredAnalystStep(output.stepType))
683
+ return output;
684
+ const rawText = output.rawText ?? "";
685
+ const evidence = summarizeStepEvidence(output.evidence);
686
+ const evidenceCount = output.evidence.length;
687
+ if (!hasStructuredContract(output.stepType, rawText)) {
688
+ const role = analystRoleFromStep(output.stepType);
689
+ pi.appendEntry("opencandle-analyst-step", {
690
+ stage: output.stepType,
691
+ ...(role ? { role } : {}),
692
+ parsed: false,
693
+ evidenceCount,
694
+ evidence,
695
+ });
696
+ return { ...output, parsed: false };
697
+ }
698
+ if (output.stepType.startsWith("analyst_")) {
699
+ const role = analystRoleFromStep(output.stepType) ?? "analyst";
700
+ const analystOutput = parseAnalystOutput(role, rawText);
701
+ const parsedOutput = { ...output, analystOutput, parsed: true };
702
+ pi.appendEntry("opencandle-analyst-step", {
703
+ stage: output.stepType,
704
+ role,
705
+ signal: analystOutput.signal,
706
+ conviction: analystOutput.conviction,
707
+ parsed: true,
708
+ evidenceCount,
709
+ evidence,
710
+ });
711
+ return parsedOutput;
712
+ }
713
+ const side = output.stepType === "debate_bear" ? "bear" : "bull";
714
+ const debateOutput = parseDebateOutput(side, rawText);
715
+ pi.appendEntry("opencandle-analyst-step", {
716
+ stage: output.stepType,
717
+ side,
718
+ parsed: true,
719
+ evidenceCount,
720
+ evidence,
721
+ });
722
+ return { ...output, debateOutput, parsed: true };
723
+ }
724
+ function analystRoleFromStep(stepType) {
725
+ return stepType.startsWith("analyst_") ? stepType.slice("analyst_".length) : undefined;
726
+ }
390
727
  function buildSavedMarketStateContext(db) {
391
728
  try {
392
729
  const service = new MarketStateService(db);
@@ -409,29 +746,10 @@ function buildSavedMarketStateContext(db) {
409
746
  'If the question concerns a sector, industry, event, company, or competitor connected to any saved position or watchlist symbol, end the answer with a short "Your positions" section explaining how it affects those specific holdings. Skip that section only when no saved symbol is plausibly affected.',
410
747
  ];
411
748
  if (lots.length > 0) {
412
- lines.push("Portfolio lots:");
413
- for (const lot of lots.slice(0, 8)) {
414
- const costBasis = formatMoney(lot.quantity * lot.avgCost, lot.currency);
415
- const name = lot.name ? ` (${lot.name})` : "";
416
- lines.push(`- ${lot.symbol}: ${lot.quantity} @ ${formatMoney(lot.avgCost, lot.currency)}, cost basis ${costBasis}${name}`);
417
- }
749
+ lines.push(...formatPortfolioSummary(lots));
418
750
  }
419
751
  if (watchlist.length > 0) {
420
- lines.push("Watchlist:");
421
- for (const item of watchlist.slice(0, 8)) {
422
- const parts = [
423
- item.targetPrice == null
424
- ? null
425
- : `target ${formatMoney(item.targetPrice, item.priceCurrency ?? item.currency ?? "USD")}`,
426
- item.stopPrice == null
427
- ? null
428
- : `stop ${formatMoney(item.stopPrice, item.priceCurrency ?? item.currency ?? "USD")}`,
429
- item.thesis ? `thesis: ${item.thesis}` : null,
430
- item.tags && item.tags.length > 0 ? `tags: ${item.tags.join(", ")}` : null,
431
- item.notes ? `notes: ${item.notes}` : null,
432
- ].filter((part) => part != null);
433
- lines.push(`- ${item.symbol}${item.name ? ` (${item.name})` : ""}${parts.length > 0 ? ` — ${parts.join("; ")}` : ""}`);
434
- }
752
+ lines.push(...formatWatchlistSummary(watchlist));
435
753
  }
436
754
  if (alerts.length > 0) {
437
755
  lines.push("Alert rules:");
@@ -447,8 +765,7 @@ function buildSavedMarketStateContext(db) {
447
765
  }
448
766
  }
449
767
  if (reportRuns.length > 0) {
450
- const latest = reportRuns[0];
451
- lines.push(`Latest report run: ${latest.status} at ${latest.completedAt ?? latest.startedAt}`);
768
+ lines.push(...formatLatestReportSummary(reportRuns[0], { includeSummary: false }));
452
769
  }
453
770
  return lines.join("\n");
454
771
  }
@@ -464,21 +781,6 @@ function shouldIncludeSavedMarketStateContext(workflowType, resolvedTurnContext,
464
781
  // general finance or LLM-router fallback), never for pass-through prompts.
465
782
  return workflowType != null || fallbackContext != null;
466
783
  }
467
- function formatMoney(value, currency) {
468
- const normalized = currency.toUpperCase();
469
- if (normalized === "USD")
470
- return `$${value.toFixed(2)}`;
471
- return `${normalized} ${value.toFixed(2)}`;
472
- }
473
- function formatJsonSummary(value) {
474
- if (value == null)
475
- return "";
476
- const json = JSON.stringify(value);
477
- if (json.length <= 90)
478
- return json;
479
- return `${json.slice(0, 87)}...`;
480
- }
481
784
  function isPlainObject(value) {
482
785
  return typeof value === "object" && value !== null && !Array.isArray(value);
483
786
  }
484
- //# sourceMappingURL=session-coordinator.js.map
@@ -47,4 +47,3 @@ function sanitizeTitle(raw) {
47
47
  }
48
48
  return title;
49
49
  }
50
- //# sourceMappingURL=session-title.js.map
@@ -24,4 +24,3 @@ function mergeDefaults(defaults, args) {
24
24
  function isPlainObject(value) {
25
25
  return typeof value === "object" && value !== null && !Array.isArray(value);
26
26
  }
27
- //# sourceMappingURL=tool-defaults-wrapper.js.map