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
@@ -1,43 +0,0 @@
1
- import type { AgentTool } from "@earendil-works/pi-agent-core";
2
- import type { TSchema } from "@sinclair/typebox";
3
-
4
- export function wrapWithDefaults<TParams extends TSchema, TDetails>(
5
- tool: AgentTool<TParams, TDetails>,
6
- defaults: Record<string, unknown>,
7
- ): AgentTool<TParams, TDetails> {
8
- return {
9
- ...tool,
10
- execute: async (toolCallId, params, signal, onUpdate, ctx?: unknown) => {
11
- const merged = mergeDefaults(defaults, params as Record<string, unknown>);
12
- const executeWithContext = tool.execute as unknown as (
13
- id: string,
14
- params: unknown,
15
- signal?: AbortSignal,
16
- onUpdate?: unknown,
17
- ctx?: unknown,
18
- ) => ReturnType<typeof tool.execute>;
19
- if (ctx === undefined) {
20
- return executeWithContext(toolCallId, merged, signal, onUpdate);
21
- }
22
- return executeWithContext(toolCallId, merged, signal, onUpdate, ctx);
23
- },
24
- };
25
- }
26
-
27
- function mergeDefaults(
28
- defaults: Record<string, unknown>,
29
- args: Record<string, unknown>,
30
- ): Record<string, unknown> {
31
- if (Object.keys(defaults).length === 0) return args;
32
-
33
- const out: Record<string, unknown> = { ...defaults };
34
- for (const [key, value] of Object.entries(args)) {
35
- const base = out[key];
36
- out[key] = isPlainObject(base) && isPlainObject(value) ? mergeDefaults(base, value) : value;
37
- }
38
- return out;
39
- }
40
-
41
- function isPlainObject(value: unknown): value is Record<string, unknown> {
42
- return typeof value === "object" && value !== null && !Array.isArray(value);
43
- }
@@ -1,211 +0,0 @@
1
- import type { EvidenceRecord } from "./evidence.js";
2
-
3
- /** A single validation check result. */
4
- export interface ValidationEntry {
5
- message: string;
6
- evidenceLabel?: string;
7
- detail?: string;
8
- }
9
-
10
- /** Result of running all deterministic validation checks. */
11
- export interface ValidationResult {
12
- passes: ValidationEntry[];
13
- failures: ValidationEntry[];
14
- warnings: ValidationEntry[];
15
- }
16
-
17
- /** Create an empty validation result. */
18
- export function emptyValidationResult(): ValidationResult {
19
- return { passes: [], failures: [], warnings: [] };
20
- }
21
-
22
- /** Check that market-sensitive evidence records have timestamps. */
23
- export function checkTimestamps(
24
- evidence: EvidenceRecord[],
25
- marketSensitiveLabels: Set<string>,
26
- ): ValidationEntry[] {
27
- const warnings: ValidationEntry[] = [];
28
- for (const record of evidence) {
29
- if (
30
- marketSensitiveLabels.has(record.label) &&
31
- record.provenance.source === "fetched" &&
32
- !record.provenance.timestamp
33
- ) {
34
- warnings.push({
35
- message: `Market-sensitive value '${record.label}' has no timestamp`,
36
- evidenceLabel: record.label,
37
- });
38
- }
39
- }
40
- return warnings;
41
- }
42
-
43
- /** Check that options expiry dates are in the future. */
44
- export function checkOptionsExpiries(evidence: EvidenceRecord[], today: string): ValidationEntry[] {
45
- const failures: ValidationEntry[] = [];
46
- for (const record of evidence) {
47
- if (
48
- record.label.toLowerCase().includes("expir") &&
49
- typeof record.value === "string" &&
50
- record.value < today
51
- ) {
52
- failures.push({
53
- message: `Options expiry ${record.value} is in the past`,
54
- evidenceLabel: record.label,
55
- detail: `Today is ${today}`,
56
- });
57
- }
58
- }
59
- return failures;
60
- }
61
-
62
- /** Check that all required fields have evidence records. */
63
- export function checkRequiredFields(
64
- evidence: EvidenceRecord[],
65
- requiredLabels: string[],
66
- ): ValidationEntry[] {
67
- const present = new Set(evidence.map((e) => e.label));
68
- const failures: ValidationEntry[] = [];
69
- for (const label of requiredLabels) {
70
- if (!present.has(label)) {
71
- failures.push({
72
- message: `Required field '${label}' has no evidence record`,
73
- evidenceLabel: label,
74
- });
75
- }
76
- }
77
- return failures;
78
- }
79
-
80
- /** Default market-sensitive labels. */
81
- export const DEFAULT_MARKET_SENSITIVE_LABELS = new Set([
82
- "Stock Price",
83
- "Volume",
84
- "Market Cap",
85
- "52-Week High",
86
- "52-Week Low",
87
- "Bid",
88
- "Ask",
89
- "Day High",
90
- "Day Low",
91
- "Open",
92
- "Previous Close",
93
- "Crypto Price",
94
- "Crypto Volume",
95
- ]);
96
-
97
- /** Configuration for the runtime validator. */
98
- export interface ValidatorConfig {
99
- marketSensitiveLabels?: Set<string>;
100
- requiredFields?: string[];
101
- toolResults?: Map<string, number>;
102
- today?: string;
103
- }
104
-
105
- /**
106
- * Orchestrates all deterministic validation checks on evidence records.
107
- * Runs before LLM-based validation.
108
- */
109
- export class RuntimeValidator {
110
- private readonly config: ValidatorConfig;
111
-
112
- constructor(config: ValidatorConfig = {}) {
113
- this.config = config;
114
- }
115
-
116
- /** Run all validation checks and return a combined result. */
117
- validate(evidence: EvidenceRecord[]): ValidationResult {
118
- const result = emptyValidationResult();
119
-
120
- // Timestamp checks
121
- const timestampWarnings = checkTimestamps(
122
- evidence,
123
- this.config.marketSensitiveLabels ?? DEFAULT_MARKET_SENSITIVE_LABELS,
124
- );
125
- result.warnings.push(...timestampWarnings);
126
-
127
- // Options expiry checks
128
- const today = this.config.today ?? new Date().toISOString().slice(0, 10);
129
- const expiryFailures = checkOptionsExpiries(evidence, today);
130
- result.failures.push(...expiryFailures);
131
-
132
- // Required field checks
133
- if (this.config.requiredFields) {
134
- const fieldFailures = checkRequiredFields(evidence, this.config.requiredFields);
135
- result.failures.push(...fieldFailures);
136
- }
137
-
138
- // Number match checks
139
- if (this.config.toolResults) {
140
- const numberEntries = checkNumberMatch(evidence, this.config.toolResults);
141
- for (const entry of numberEntries) {
142
- if ((entry as any).type === "pass") {
143
- result.passes.push(entry);
144
- } else {
145
- result.failures.push(entry);
146
- }
147
- }
148
- }
149
-
150
- return result;
151
- }
152
-
153
- /** Format validation results as a summary string for the LLM validation prompt. */
154
- formatForLLM(result: ValidationResult): string {
155
- const lines: string[] = ["## Deterministic Validation Results"];
156
-
157
- if (result.failures.length > 0) {
158
- lines.push(`\n### Failures (${result.failures.length})`);
159
- for (const f of result.failures) {
160
- lines.push(`- ${f.message}`);
161
- }
162
- }
163
-
164
- if (result.warnings.length > 0) {
165
- lines.push(`\n### Warnings (${result.warnings.length})`);
166
- for (const w of result.warnings) {
167
- lines.push(`- ${w.message}`);
168
- }
169
- }
170
-
171
- if (result.passes.length > 0) {
172
- lines.push(`\n### Verified (${result.passes.length})`);
173
- for (const p of result.passes) {
174
- lines.push(`- ${p.message}`);
175
- }
176
- }
177
-
178
- if (result.failures.length === 0 && result.warnings.length === 0) {
179
- lines.push("\nAll deterministic checks passed.");
180
- }
181
-
182
- return lines.join("\n");
183
- }
184
- }
185
-
186
- /** Check that evidence values match expected tool result values. */
187
- export function checkNumberMatch(
188
- evidence: EvidenceRecord[],
189
- toolResults: Map<string, number>,
190
- ): ValidationEntry[] {
191
- const results: (ValidationEntry & { type: "pass" | "failure" })[] = [];
192
- for (const record of evidence) {
193
- if (typeof record.value !== "number") continue;
194
- const expected = toolResults.get(record.label);
195
- if (expected === undefined) continue;
196
- if (record.value === expected) {
197
- results.push({
198
- type: "pass",
199
- message: `${record.label}: ${record.value} matches tool result`,
200
- evidenceLabel: record.label,
201
- });
202
- } else {
203
- results.push({
204
- type: "failure",
205
- message: `${record.label} mismatch: evidence says ${record.value}, tool returned ${expected}`,
206
- evidenceLabel: record.label,
207
- });
208
- }
209
- }
210
- return results;
211
- }
@@ -1,75 +0,0 @@
1
- import type Database from "better-sqlite3";
2
-
3
- /** All workflow event types. */
4
- export type WorkflowEventType =
5
- | "workflow_started"
6
- | "slot_resolved"
7
- | "clarification_asked"
8
- | "clarification_answered"
9
- | "step_started"
10
- | "step_completed"
11
- | "step_failed"
12
- | "step_skipped"
13
- | "tool_called"
14
- | "tool_failed"
15
- | "validation_passed"
16
- | "validation_failed"
17
- | "workflow_completed"
18
- | "workflow_cancelled";
19
-
20
- /** A persisted workflow event row. */
21
- export interface WorkflowEvent {
22
- id: number;
23
- runId: string;
24
- stepIndex: number;
25
- eventType: WorkflowEventType;
26
- payloadJson: string | null;
27
- timestamp: string;
28
- }
29
-
30
- /** Append-only workflow event logger backed by SQLite. */
31
- export class WorkflowEventLogger {
32
- constructor(private readonly db: Database.Database) {}
33
-
34
- /** Append a workflow event. */
35
- log(
36
- runId: string,
37
- stepIndex: number,
38
- eventType: WorkflowEventType,
39
- payload?: Record<string, unknown>,
40
- ): void {
41
- const now = new Date().toISOString();
42
- const payloadJson = payload ? JSON.stringify(payload) : null;
43
- this.db
44
- .prepare(
45
- `INSERT INTO workflow_events (run_id, step_index, event_type, payload_json, timestamp)
46
- VALUES (?, ?, ?, ?, ?)`,
47
- )
48
- .run(runId, stepIndex, eventType, payloadJson, now);
49
- }
50
-
51
- /** Query all events for a given run ID, ordered by timestamp. */
52
- getEventsByRunId(runId: string): WorkflowEvent[] {
53
- const rows = this.db
54
- .prepare(
55
- "SELECT id, run_id, step_index, event_type, payload_json, timestamp FROM workflow_events WHERE run_id = ? ORDER BY id",
56
- )
57
- .all(runId) as Array<{
58
- id: number;
59
- run_id: string;
60
- step_index: number;
61
- event_type: string;
62
- payload_json: string | null;
63
- timestamp: string;
64
- }>;
65
-
66
- return rows.map((r) => ({
67
- id: r.id,
68
- runId: r.run_id,
69
- stepIndex: r.step_index,
70
- eventType: r.event_type as WorkflowEventType,
71
- payloadJson: r.payload_json,
72
- timestamp: r.timestamp,
73
- }));
74
- }
75
- }
@@ -1,182 +0,0 @@
1
- import type { EvidenceRecord } from "./evidence.js";
2
- import type { ProviderTracker } from "./provider-tracker.js";
3
- import type { WorkflowEventLogger } from "./workflow-events.js";
4
- import type { StepOutput, WorkflowRun, WorkflowStep } from "./workflow-types.js";
5
- import { createWorkflowRun, transitionStepStatus } from "./workflow-types.js";
6
-
7
- /** Function that executes a single workflow step. */
8
- export type StepExecutor = (
9
- step: WorkflowStep,
10
- stepIndex: number,
11
- priorEvidence: EvidenceRecord[],
12
- context: StepExecutionContext,
13
- ) => Promise<StepOutput>;
14
-
15
- /** Context passed to step executors. */
16
- export interface StepExecutionContext {
17
- runId: string;
18
- providerTracker: ProviderTracker;
19
- }
20
-
21
- /** Options for creating a WorkflowRunner. */
22
- export interface WorkflowRunnerOptions {
23
- eventLogger?: WorkflowEventLogger;
24
- providerTracker?: ProviderTracker;
25
- }
26
-
27
- let runCounter = 0;
28
-
29
- function generateRunId(): string {
30
- runCounter += 1;
31
- return `run_${Date.now()}_${runCounter}`;
32
- }
33
-
34
- /**
35
- * Typed workflow execution engine with run IDs, step definitions,
36
- * state transitions, cancellation, and event logging.
37
- */
38
- export class WorkflowRunner {
39
- private readonly eventLogger?: WorkflowEventLogger;
40
- private readonly providerTracker?: ProviderTracker;
41
- private activeRun: WorkflowRun | null = null;
42
-
43
- constructor(options: WorkflowRunnerOptions = {}) {
44
- this.eventLogger = options.eventLogger;
45
- this.providerTracker = options.providerTracker;
46
- }
47
-
48
- /** Get the currently active run, if any. */
49
- getActiveRun(): WorkflowRun | null {
50
- return this.activeRun;
51
- }
52
-
53
- /**
54
- * Start a new workflow run. If a run is already active, it is cancelled first.
55
- */
56
- async start(
57
- workflowType: string,
58
- stepDefinitions: Omit<WorkflowStep, "status">[],
59
- executor: StepExecutor,
60
- ): Promise<WorkflowRun> {
61
- // Cancel any active run
62
- if (this.activeRun && this.activeRun.status === "running") {
63
- this.cancel();
64
- }
65
-
66
- const runId = generateRunId();
67
- const run = createWorkflowRun(runId, workflowType, stepDefinitions);
68
- this.activeRun = run;
69
- run.status = "running";
70
-
71
- this.providerTracker?.resetAll();
72
-
73
- this.logEvent(runId, 0, "workflow_started", {
74
- workflowType,
75
- stepCount: stepDefinitions.length,
76
- });
77
-
78
- // Execute steps
79
- await this.executeSteps(run, executor);
80
-
81
- return run;
82
- }
83
-
84
- /** Cancel the active run. */
85
- cancel(): void {
86
- const run = this.activeRun;
87
- if (!run || run.status !== "running") return;
88
-
89
- for (let i = run.currentStepIndex; i < run.steps.length; i++) {
90
- const step = run.steps[i];
91
- if (step.status === "pending" || step.status === "running") {
92
- step.status = transitionStepStatus(step.status, "skipped");
93
- this.logEvent(run.runId, i, "step_skipped", {
94
- stepType: step.stepType,
95
- reason: "cancelled",
96
- });
97
- }
98
- }
99
-
100
- run.status = "cancelled";
101
- this.logEvent(run.runId, run.currentStepIndex, "workflow_cancelled", {
102
- cancelledAtStep: run.currentStepIndex,
103
- });
104
- }
105
-
106
- private async executeSteps(run: WorkflowRun, executor: StepExecutor): Promise<void> {
107
- for (let i = 0; i < run.steps.length; i++) {
108
- // Check if run was cancelled externally
109
- if (run.status !== "running") return;
110
-
111
- const step = run.steps[i];
112
- run.currentStepIndex = i;
113
-
114
- // Collect all prior evidence
115
- const priorEvidence: EvidenceRecord[] = [];
116
- for (const [, output] of run.stepOutputs) {
117
- priorEvidence.push(...output.evidence);
118
- }
119
-
120
- // Transition to running
121
- step.status = transitionStepStatus(step.status, "running");
122
- this.logEvent(run.runId, i, "step_started", { stepType: step.stepType });
123
-
124
- try {
125
- const context: StepExecutionContext = {
126
- runId: run.runId,
127
- providerTracker: this.providerTracker!,
128
- };
129
-
130
- const output = await executor(step, i, priorEvidence, context);
131
-
132
- // If run was cancelled during execution, stop without further transitions
133
- if (run.status !== "running") return;
134
-
135
- step.status = transitionStepStatus(step.status, "completed");
136
- run.stepOutputs.set(i, output);
137
-
138
- this.logEvent(run.runId, i, "step_completed", {
139
- stepType: step.stepType,
140
- evidenceCount: output.evidence.length,
141
- });
142
- } catch (error) {
143
- // If run was cancelled during execution, stop without further transitions
144
- if (run.status !== "running") return;
145
-
146
- const message = error instanceof Error ? error.message : "unknown_error";
147
-
148
- if (step.skippable) {
149
- step.status = transitionStepStatus(step.status, "skipped");
150
- this.logEvent(run.runId, i, "step_skipped", {
151
- stepType: step.stepType,
152
- reason: message,
153
- });
154
- } else {
155
- step.status = transitionStepStatus(step.status, "failed");
156
- this.logEvent(run.runId, i, "step_failed", {
157
- stepType: step.stepType,
158
- error: message,
159
- });
160
- run.status = "failed";
161
- return;
162
- }
163
- }
164
- }
165
-
166
- if (run.status === "running") {
167
- run.status = "completed";
168
- this.logEvent(run.runId, run.steps.length - 1, "workflow_completed", {
169
- workflowType: run.workflowType,
170
- });
171
- }
172
- }
173
-
174
- private logEvent(
175
- runId: string,
176
- stepIndex: number,
177
- eventType: string,
178
- payload: Record<string, unknown>,
179
- ): void {
180
- this.eventLogger?.log(runId, stepIndex, eventType as any, payload);
181
- }
182
- }
@@ -1,102 +0,0 @@
1
- import type { EvidenceRecord } from "./evidence.js";
2
-
3
- /** Status of a single workflow step. */
4
- export type StepStatus = "pending" | "running" | "completed" | "failed" | "skipped";
5
-
6
- /** Overall status of a workflow run. */
7
- export type RunStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
8
-
9
- /** Valid step status transitions. */
10
- const VALID_STEP_TRANSITIONS: Record<StepStatus, StepStatus[]> = {
11
- pending: ["running", "skipped"],
12
- running: ["completed", "failed", "skipped"],
13
- completed: [],
14
- failed: [],
15
- skipped: [],
16
- };
17
-
18
- /** Check whether a step status transition is valid. */
19
- export function isValidStepTransition(from: StepStatus, to: StepStatus): boolean {
20
- return VALID_STEP_TRANSITIONS[from].includes(to);
21
- }
22
-
23
- /** Transition a step status, throwing on invalid transitions. */
24
- export function transitionStepStatus(from: StepStatus, to: StepStatus): StepStatus {
25
- if (!isValidStepTransition(from, to)) {
26
- throw new Error(`Invalid step transition: ${from} → ${to}`);
27
- }
28
- return to;
29
- }
30
-
31
- /** Definition of a single workflow step. */
32
- export interface WorkflowStep {
33
- stepType: string;
34
- description: string;
35
- requiredInputs: string[];
36
- expectedOutputs: string[];
37
- skippable: boolean;
38
- status: StepStatus;
39
- }
40
-
41
- /** Output produced by a completed workflow step. */
42
- export interface StepOutput {
43
- stepIndex: number;
44
- stepType: string;
45
- evidence: EvidenceRecord[];
46
- rawText?: string;
47
- }
48
-
49
- /** Analyst signal direction. */
50
- export type AnalystSignal = "BUY" | "HOLD" | "SELL";
51
-
52
- /** Structured output from a single analyst role. */
53
- export interface AnalystOutput {
54
- role: string;
55
- signal: AnalystSignal;
56
- conviction: number;
57
- thesis: string;
58
- evidence: EvidenceRecord[];
59
- rawText?: string;
60
- }
61
-
62
- /** Debate side in bull/bear adversarial debate. */
63
- export type DebateSide = "bull" | "bear";
64
-
65
- /** Structured output from a debate step (eval/test only — not used in live path). */
66
- export interface DebateOutput {
67
- side: DebateSide;
68
- thesis: string;
69
- keyRisk: string;
70
- concessions: string[];
71
- remainingConviction: number;
72
- evidence: EvidenceRecord[];
73
- rawText: string;
74
- }
75
-
76
- /** A complete workflow run definition and state. */
77
- export interface WorkflowRun {
78
- runId: string;
79
- workflowType: string;
80
- steps: WorkflowStep[];
81
- currentStepIndex: number;
82
- status: RunStatus;
83
- stepOutputs: Map<number, StepOutput>;
84
- createdAt: string;
85
- }
86
-
87
- /** Create a new workflow run with all steps in pending state. */
88
- export function createWorkflowRun(
89
- runId: string,
90
- workflowType: string,
91
- stepDefinitions: Omit<WorkflowStep, "status">[],
92
- ): WorkflowRun {
93
- return {
94
- runId,
95
- workflowType,
96
- steps: stepDefinitions.map((def) => ({ ...def, status: "pending" as const })),
97
- currentStepIndex: 0,
98
- status: "pending",
99
- stepOutputs: new Map(),
100
- createdAt: new Date().toISOString(),
101
- };
102
- }
@@ -1,49 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import type { FinnhubArticle } from "../../providers/finnhub.js";
3
- import { extractEntities } from "../../routing/entity-extractor.js";
4
- import type { SentinelRecord } from "../types.js";
5
-
6
- const MAX_TICKERS = 3;
7
-
8
- export class FinnhubAdapter {
9
- readonly source = "finnhub" as const;
10
-
11
- mapToRecords(articles: FinnhubArticle[], query: string): SentinelRecord[] {
12
- const fetchedAt = new Date().toISOString();
13
- return articles.map((article) => ({
14
- id: randomUUID(),
15
- source: this.source,
16
- sourceId: String(article.id),
17
- query,
18
- title: article.headline,
19
- text: article.summary,
20
- author: article.source,
21
- url: article.url,
22
- publishedAt: new Date(article.datetime * 1000).toISOString(),
23
- fetchedAt,
24
- engagement: {
25
- score: 0,
26
- replies: null,
27
- shares: null,
28
- views: null,
29
- },
30
- sentiment: {
31
- score: 0,
32
- confidence: 0,
33
- method: "keyword" as const,
34
- tickers: article.related
35
- ? article.related
36
- .split(",")
37
- .map((t) => t.trim())
38
- .filter(Boolean)
39
- : [],
40
- },
41
- metadata: { category: article.category },
42
- }));
43
- }
44
- }
45
-
46
- export function extractTickersFromQuery(query: string): string[] {
47
- const entities = extractEntities(query);
48
- return entities.symbols.slice(0, MAX_TICKERS);
49
- }