opencandle 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. package/README.md +20 -24
  2. package/dist/analysts/contracts.js +0 -1
  3. package/dist/analysts/orchestrator.js +0 -1
  4. package/dist/cli-main.js +13 -7
  5. package/dist/cli-options.d.ts +4 -0
  6. package/dist/cli-options.js +33 -0
  7. package/dist/cli.js +8 -3
  8. package/dist/config.js +0 -1
  9. package/dist/doctor/cli-command.js +2 -1
  10. package/dist/doctor/render.js +0 -1
  11. package/dist/doctor/report.js +40 -11
  12. package/dist/gui/server/ask-user-bridge.d.ts +19 -0
  13. package/dist/gui/server/ask-user-bridge.js +55 -0
  14. package/dist/gui/server/automation-heartbeat.d.ts +25 -0
  15. package/dist/gui/server/automation-heartbeat.js +61 -0
  16. package/dist/gui/server/background-quotes.d.ts +39 -0
  17. package/dist/gui/server/background-quotes.js +71 -0
  18. package/dist/gui/server/chat-event-adapter.d.ts +16 -0
  19. package/dist/gui/server/chat-event-adapter.js +263 -0
  20. package/dist/gui/server/gui-session-manager.d.ts +2 -0
  21. package/dist/gui/server/gui-session-manager.js +4 -0
  22. package/dist/gui/server/http-routes.d.ts +69 -0
  23. package/dist/gui/server/http-routes.js +1008 -0
  24. package/dist/gui/server/invoke-tool.d.ts +47 -0
  25. package/dist/gui/server/invoke-tool.js +373 -0
  26. package/dist/gui/server/live-chat-event-adapter.d.ts +19 -0
  27. package/dist/gui/server/live-chat-event-adapter.js +206 -0
  28. package/dist/gui/server/local-session-coordinator.d.ts +26 -0
  29. package/dist/gui/server/local-session-coordinator.js +53 -0
  30. package/dist/gui/server/market-state-api.d.ts +138 -0
  31. package/dist/gui/server/market-state-api.js +355 -0
  32. package/dist/gui/server/model-setup.d.ts +64 -0
  33. package/dist/gui/server/model-setup.js +150 -0
  34. package/dist/gui/server/private-api-access.d.ts +6 -0
  35. package/dist/gui/server/private-api-access.js +53 -0
  36. package/dist/gui/server/projector.d.ts +49 -0
  37. package/dist/gui/server/projector.js +296 -0
  38. package/dist/gui/server/prompt-observation.d.ts +8 -0
  39. package/dist/gui/server/prompt-observation.js +43 -0
  40. package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
  41. package/dist/gui/server/quote-snapshot-store.js +49 -0
  42. package/dist/gui/server/server.d.ts +1 -0
  43. package/dist/gui/server/server.js +259 -0
  44. package/dist/gui/server/session-actions.d.ts +60 -0
  45. package/dist/gui/server/session-actions.js +218 -0
  46. package/dist/gui/server/session-entry-wait.d.ts +27 -0
  47. package/dist/gui/server/session-entry-wait.js +129 -0
  48. package/dist/gui/server/session-list.d.ts +2 -0
  49. package/dist/gui/server/session-list.js +11 -0
  50. package/dist/gui/server/shutdown.d.ts +10 -0
  51. package/dist/gui/server/shutdown.js +29 -0
  52. package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
  53. package/dist/gui/server/tool-invoke-ack.js +26 -0
  54. package/dist/gui/server/tool-metadata.d.ts +93 -0
  55. package/dist/gui/server/tool-metadata.js +148 -0
  56. package/dist/gui/server/websocket.d.ts +9 -0
  57. package/dist/gui/server/websocket.js +124 -0
  58. package/dist/gui/server/writer-lock.d.ts +1 -0
  59. package/dist/gui/server/writer-lock.js +1 -0
  60. package/dist/gui/server/ws-hub.d.ts +50 -0
  61. package/dist/gui/server/ws-hub.js +284 -0
  62. package/dist/gui/shared/chat-events.d.ts +174 -0
  63. package/dist/gui/shared/chat-events.js +13 -0
  64. package/dist/gui/shared/event-reducer.d.ts +3 -0
  65. package/dist/gui/shared/event-reducer.js +187 -0
  66. package/dist/index.js +0 -1
  67. package/dist/infra/cache.js +0 -1
  68. package/dist/infra/freshness.js +0 -1
  69. package/dist/infra/http-client.js +1 -2
  70. package/dist/infra/index.js +0 -1
  71. package/dist/infra/market-calendar.js +0 -1
  72. package/dist/infra/native-dependencies.js +0 -1
  73. package/dist/infra/node-version.js +0 -1
  74. package/dist/infra/open-url.js +0 -1
  75. package/dist/infra/opencandle-paths.js +0 -1
  76. package/dist/infra/rate-limiter.js +0 -1
  77. package/dist/market-state/alert-conditions.js +0 -1
  78. package/dist/market-state/alert-runner.d.ts +1 -0
  79. package/dist/market-state/alert-runner.js +5 -4
  80. package/dist/market-state/daily-report.js +0 -1
  81. package/dist/market-state/local-automation-service.js +0 -1
  82. package/dist/market-state/notification-delivery.js +0 -1
  83. package/dist/market-state/resolve-for-mutation.js +0 -1
  84. package/dist/market-state/resolve.js +0 -1
  85. package/dist/market-state/service.d.ts +26 -21
  86. package/dist/market-state/service.js +175 -36
  87. package/dist/market-state/summaries.js +1 -13
  88. package/dist/memory/index.js +0 -1
  89. package/dist/memory/manager.js +0 -1
  90. package/dist/memory/preference-extractor.js +0 -1
  91. package/dist/memory/retrieval.js +0 -1
  92. package/dist/memory/sqlite.js +60 -11
  93. package/dist/memory/storage.js +0 -1
  94. package/dist/memory/tool-defaults.js +0 -1
  95. package/dist/memory/types.js +0 -1
  96. package/dist/monitor.js +0 -1
  97. package/dist/onboarding/connect.js +0 -1
  98. package/dist/onboarding/credential-interceptor.js +0 -1
  99. package/dist/onboarding/degradation-accumulator.js +0 -1
  100. package/dist/onboarding/prompt-user.d.ts +1 -1
  101. package/dist/onboarding/prompt-user.js +0 -1
  102. package/dist/onboarding/provider-status.js +0 -1
  103. package/dist/onboarding/providers.js +0 -1
  104. package/dist/onboarding/state.js +0 -1
  105. package/dist/onboarding/tool-helpers.js +0 -1
  106. package/dist/onboarding/tool-tags.js +0 -1
  107. package/dist/onboarding/validate-model-key.d.ts +17 -0
  108. package/dist/onboarding/validate-model-key.js +54 -0
  109. package/dist/onboarding/validation.js +0 -1
  110. package/dist/pi/opencandle-extension.js +2 -2
  111. package/dist/pi/session-action-dedupe.js +0 -1
  112. package/dist/pi/session-storage.js +0 -1
  113. package/dist/pi/session-writer-lock.js +0 -1
  114. package/dist/pi/session.js +0 -1
  115. package/dist/pi/setup.d.ts +2 -0
  116. package/dist/pi/setup.js +10 -3
  117. package/dist/pi/tool-adapter.js +0 -1
  118. package/dist/pi/tui-session-coordinator.js +0 -1
  119. package/dist/prompts/context-builder.js +1 -2
  120. package/dist/prompts/disclaimer.js +0 -1
  121. package/dist/prompts/policy-cards.js +0 -1
  122. package/dist/prompts/sections.js +0 -1
  123. package/dist/prompts/symbol-preflight.js +0 -1
  124. package/dist/prompts/workflow-prompts.js +0 -1
  125. package/dist/providers/alpha-vantage.js +2 -3
  126. package/dist/providers/coingecko.js +0 -1
  127. package/dist/providers/errors.js +0 -1
  128. package/dist/providers/exa-search.js +11 -10
  129. package/dist/providers/external-tool-command.js +0 -1
  130. package/dist/providers/external-tool-error.js +0 -1
  131. package/dist/providers/fear-greed.js +0 -1
  132. package/dist/providers/finnhub.js +0 -1
  133. package/dist/providers/fred.js +0 -1
  134. package/dist/providers/index.js +0 -1
  135. package/dist/providers/polymarket.js +0 -1
  136. package/dist/providers/provider-credential-error.js +0 -1
  137. package/dist/providers/reddit-cli.js +0 -1
  138. package/dist/providers/reddit.js +0 -1
  139. package/dist/providers/sec-edgar.js +0 -1
  140. package/dist/providers/tradingview.js +1 -2
  141. package/dist/providers/twitter-cli.js +0 -1
  142. package/dist/providers/twitter.js +0 -1
  143. package/dist/providers/web-search.js +15 -12
  144. package/dist/providers/with-fallback.js +0 -1
  145. package/dist/providers/wrap-provider.js +0 -1
  146. package/dist/providers/yahoo-finance.js +67 -4
  147. package/dist/routing/classify-intent.js +0 -1
  148. package/dist/routing/defaults.js +0 -1
  149. package/dist/routing/entity-extractor.js +2 -3
  150. package/dist/routing/fund-symbols.js +0 -1
  151. package/dist/routing/horizon.js +0 -1
  152. package/dist/routing/index.js +0 -1
  153. package/dist/routing/legacy-rule-router.js +0 -1
  154. package/dist/routing/planning.js +0 -1
  155. package/dist/routing/route-manifest.js +0 -1
  156. package/dist/routing/router-llm-client.d.ts +2 -2
  157. package/dist/routing/router-llm-client.js +0 -1
  158. package/dist/routing/router-prompt.js +0 -1
  159. package/dist/routing/router-types.js +0 -1
  160. package/dist/routing/router.js +1 -2
  161. package/dist/routing/slot-resolver.js +0 -1
  162. package/dist/routing/symbol-disambiguator.js +0 -1
  163. package/dist/routing/turn-context.js +0 -1
  164. package/dist/routing/types.js +0 -1
  165. package/dist/runtime/answer-contracts.js +0 -1
  166. package/dist/runtime/artifact-contracts.js +0 -1
  167. package/dist/runtime/evidence.js +0 -1
  168. package/dist/runtime/numeric-claims.js +0 -1
  169. package/dist/runtime/planning-evidence.js +0 -1
  170. package/dist/runtime/prompt-step.js +0 -1
  171. package/dist/runtime/provider-tracker.js +0 -1
  172. package/dist/runtime/run-context.js +0 -1
  173. package/dist/runtime/session-coordinator.js +0 -1
  174. package/dist/runtime/session-title.js +0 -1
  175. package/dist/runtime/tool-defaults-wrapper.js +0 -1
  176. package/dist/runtime/validation.js +0 -1
  177. package/dist/runtime/workflow-events.js +0 -1
  178. package/dist/runtime/workflow-runner.d.ts +1 -0
  179. package/dist/runtime/workflow-runner.js +8 -3
  180. package/dist/runtime/workflow-types.js +0 -1
  181. package/dist/sentiment/adapters/finnhub.js +0 -1
  182. package/dist/sentiment/adapters/reddit.js +0 -1
  183. package/dist/sentiment/adapters/twitter.js +0 -1
  184. package/dist/sentiment/adapters/web.js +0 -1
  185. package/dist/sentiment/index.js +4 -2
  186. package/dist/sentiment/insights.js +0 -1
  187. package/dist/sentiment/keywords.js +0 -1
  188. package/dist/sentiment/pipeline.js +0 -1
  189. package/dist/sentiment/scorer.js +0 -1
  190. package/dist/sentiment/store.js +0 -1
  191. package/dist/sentiment/trends.js +0 -1
  192. package/dist/sentiment/types.js +0 -1
  193. package/dist/system-prompt.js +0 -1
  194. package/dist/tool-kit.js +0 -1
  195. package/dist/tools/fundamentals/company-overview.d.ts +1 -1
  196. package/dist/tools/fundamentals/company-overview.js +2 -1
  197. package/dist/tools/fundamentals/comps.js +6 -4
  198. package/dist/tools/fundamentals/dcf.js +0 -1
  199. package/dist/tools/fundamentals/earnings.d.ts +1 -1
  200. package/dist/tools/fundamentals/earnings.js +2 -1
  201. package/dist/tools/fundamentals/financials.js +2 -1
  202. package/dist/tools/fundamentals/sec-filings.js +0 -1
  203. package/dist/tools/index.d.ts +116 -2
  204. package/dist/tools/index.js +0 -1
  205. package/dist/tools/interaction/ask-user.js +11 -1
  206. package/dist/tools/macro/event-probabilities.js +0 -1
  207. package/dist/tools/macro/fear-greed.d.ts +1 -1
  208. package/dist/tools/macro/fear-greed.js +0 -1
  209. package/dist/tools/macro/fred-data.d.ts +1 -1
  210. package/dist/tools/macro/fred-data.js +2 -1
  211. package/dist/tools/market/crypto-history.js +0 -1
  212. package/dist/tools/market/crypto-price.d.ts +2 -2
  213. package/dist/tools/market/crypto-price.js +0 -1
  214. package/dist/tools/market/screen-stocks.js +0 -1
  215. package/dist/tools/market/search-ticker.js +1 -2
  216. package/dist/tools/market/stock-history.js +0 -1
  217. package/dist/tools/market/stock-quote.d.ts +2 -2
  218. package/dist/tools/market/stock-quote.js +0 -1
  219. package/dist/tools/options/greeks.js +0 -1
  220. package/dist/tools/options/option-chain.d.ts +2 -2
  221. package/dist/tools/options/option-chain.js +0 -1
  222. package/dist/tools/portfolio/alerts.d.ts +2 -1
  223. package/dist/tools/portfolio/alerts.js +228 -2
  224. package/dist/tools/portfolio/correlation.js +23 -5
  225. package/dist/tools/portfolio/daily-report.js +0 -1
  226. package/dist/tools/portfolio/holdings-overlap.js +0 -1
  227. package/dist/tools/portfolio/notifications.js +0 -1
  228. package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
  229. package/dist/tools/portfolio/risk-analysis.js +0 -1
  230. package/dist/tools/portfolio/tracker.d.ts +3 -1
  231. package/dist/tools/portfolio/tracker.js +57 -10
  232. package/dist/tools/portfolio/watchlist.d.ts +3 -6
  233. package/dist/tools/portfolio/watchlist.js +101 -110
  234. package/dist/tools/sentiment/insight-format.js +0 -1
  235. package/dist/tools/sentiment/query-match.js +0 -1
  236. package/dist/tools/sentiment/reddit-sentiment.js +0 -1
  237. package/dist/tools/sentiment/sentiment-summary.js +8 -4
  238. package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
  239. package/dist/tools/sentiment/sentiment-trend.js +6 -2
  240. package/dist/tools/sentiment/twitter-sentiment.js +0 -1
  241. package/dist/tools/sentiment/untrusted-text.js +0 -1
  242. package/dist/tools/sentiment/web-search.d.ts +1 -1
  243. package/dist/tools/sentiment/web-search.js +0 -1
  244. package/dist/tools/sentiment/web-sentiment.js +0 -1
  245. package/dist/tools/technical/backtest.js +0 -1
  246. package/dist/tools/technical/indicators.js +0 -1
  247. package/dist/types/fundamentals.js +0 -1
  248. package/dist/types/index.js +0 -1
  249. package/dist/types/macro.js +0 -1
  250. package/dist/types/market.d.ts +6 -0
  251. package/dist/types/market.js +0 -1
  252. package/dist/types/options.js +0 -1
  253. package/dist/types/portfolio.js +0 -1
  254. package/dist/types/prediction-markets.js +0 -1
  255. package/dist/types/sentiment.js +0 -1
  256. package/dist/workflows/compare-assets.js +0 -1
  257. package/dist/workflows/index.js +0 -1
  258. package/dist/workflows/options-screener.js +0 -1
  259. package/dist/workflows/portfolio-builder.js +0 -1
  260. package/gui/web/dist/assets/CatalogOverlay-CAc7e3Pf.js +1 -0
  261. package/gui/web/dist/assets/index-BOEKd9wT.css +2 -0
  262. package/gui/web/dist/assets/index-C-H05cQ2.js +65 -0
  263. package/gui/web/dist/index.html +2 -2
  264. package/package.json +11 -12
  265. package/dist/analysts/contracts.js.map +0 -1
  266. package/dist/analysts/orchestrator.js.map +0 -1
  267. package/dist/cli-main.js.map +0 -1
  268. package/dist/cli.js.map +0 -1
  269. package/dist/config.js.map +0 -1
  270. package/dist/doctor/cli-command.js.map +0 -1
  271. package/dist/doctor/render.js.map +0 -1
  272. package/dist/doctor/report.js.map +0 -1
  273. package/dist/index.js.map +0 -1
  274. package/dist/infra/cache.js.map +0 -1
  275. package/dist/infra/freshness.js.map +0 -1
  276. package/dist/infra/http-client.js.map +0 -1
  277. package/dist/infra/index.js.map +0 -1
  278. package/dist/infra/market-calendar.js.map +0 -1
  279. package/dist/infra/native-dependencies.js.map +0 -1
  280. package/dist/infra/node-version.js.map +0 -1
  281. package/dist/infra/open-url.js.map +0 -1
  282. package/dist/infra/opencandle-paths.js.map +0 -1
  283. package/dist/infra/rate-limiter.js.map +0 -1
  284. package/dist/market-state/alert-conditions.js.map +0 -1
  285. package/dist/market-state/alert-runner.js.map +0 -1
  286. package/dist/market-state/daily-report.js.map +0 -1
  287. package/dist/market-state/local-automation-service.js.map +0 -1
  288. package/dist/market-state/notification-delivery.js.map +0 -1
  289. package/dist/market-state/resolve-for-mutation.js.map +0 -1
  290. package/dist/market-state/resolve.js.map +0 -1
  291. package/dist/market-state/service.js.map +0 -1
  292. package/dist/market-state/summaries.js.map +0 -1
  293. package/dist/memory/index.js.map +0 -1
  294. package/dist/memory/manager.js.map +0 -1
  295. package/dist/memory/preference-extractor.js.map +0 -1
  296. package/dist/memory/retrieval.js.map +0 -1
  297. package/dist/memory/sqlite.js.map +0 -1
  298. package/dist/memory/storage.js.map +0 -1
  299. package/dist/memory/tool-defaults.js.map +0 -1
  300. package/dist/memory/types.js.map +0 -1
  301. package/dist/monitor.js.map +0 -1
  302. package/dist/onboarding/connect.js.map +0 -1
  303. package/dist/onboarding/credential-interceptor.js.map +0 -1
  304. package/dist/onboarding/degradation-accumulator.js.map +0 -1
  305. package/dist/onboarding/prompt-user.js.map +0 -1
  306. package/dist/onboarding/provider-status.js.map +0 -1
  307. package/dist/onboarding/providers.js.map +0 -1
  308. package/dist/onboarding/state.js.map +0 -1
  309. package/dist/onboarding/tool-helpers.js.map +0 -1
  310. package/dist/onboarding/tool-tags.js.map +0 -1
  311. package/dist/onboarding/validation.js.map +0 -1
  312. package/dist/pi/opencandle-extension.js.map +0 -1
  313. package/dist/pi/session-action-dedupe.js.map +0 -1
  314. package/dist/pi/session-storage.js.map +0 -1
  315. package/dist/pi/session-writer-lock.js.map +0 -1
  316. package/dist/pi/session.js.map +0 -1
  317. package/dist/pi/setup.js.map +0 -1
  318. package/dist/pi/tool-adapter.js.map +0 -1
  319. package/dist/pi/tui-session-coordinator.js.map +0 -1
  320. package/dist/prompts/context-builder.js.map +0 -1
  321. package/dist/prompts/disclaimer.js.map +0 -1
  322. package/dist/prompts/policy-cards.js.map +0 -1
  323. package/dist/prompts/sections.js.map +0 -1
  324. package/dist/prompts/symbol-preflight.js.map +0 -1
  325. package/dist/prompts/workflow-prompts.js.map +0 -1
  326. package/dist/providers/alpha-vantage.js.map +0 -1
  327. package/dist/providers/coingecko.js.map +0 -1
  328. package/dist/providers/errors.js.map +0 -1
  329. package/dist/providers/exa-search.js.map +0 -1
  330. package/dist/providers/external-tool-command.js.map +0 -1
  331. package/dist/providers/external-tool-error.js.map +0 -1
  332. package/dist/providers/fear-greed.js.map +0 -1
  333. package/dist/providers/finnhub.js.map +0 -1
  334. package/dist/providers/fred.js.map +0 -1
  335. package/dist/providers/index.js.map +0 -1
  336. package/dist/providers/polymarket.js.map +0 -1
  337. package/dist/providers/provider-credential-error.js.map +0 -1
  338. package/dist/providers/reddit-cli.js.map +0 -1
  339. package/dist/providers/reddit.js.map +0 -1
  340. package/dist/providers/sec-edgar.js.map +0 -1
  341. package/dist/providers/tradingview.js.map +0 -1
  342. package/dist/providers/twitter-cli.js.map +0 -1
  343. package/dist/providers/twitter.js.map +0 -1
  344. package/dist/providers/web-search.js.map +0 -1
  345. package/dist/providers/with-fallback.js.map +0 -1
  346. package/dist/providers/wrap-provider.js.map +0 -1
  347. package/dist/providers/yahoo-finance.js.map +0 -1
  348. package/dist/routing/classify-intent.js.map +0 -1
  349. package/dist/routing/defaults.js.map +0 -1
  350. package/dist/routing/entity-extractor.js.map +0 -1
  351. package/dist/routing/fund-symbols.js.map +0 -1
  352. package/dist/routing/horizon.js.map +0 -1
  353. package/dist/routing/index.js.map +0 -1
  354. package/dist/routing/legacy-rule-router.js.map +0 -1
  355. package/dist/routing/planning.js.map +0 -1
  356. package/dist/routing/route-manifest.js.map +0 -1
  357. package/dist/routing/router-llm-client.js.map +0 -1
  358. package/dist/routing/router-prompt.js.map +0 -1
  359. package/dist/routing/router-types.js.map +0 -1
  360. package/dist/routing/router.js.map +0 -1
  361. package/dist/routing/slot-resolver.js.map +0 -1
  362. package/dist/routing/symbol-disambiguator.js.map +0 -1
  363. package/dist/routing/turn-context.js.map +0 -1
  364. package/dist/routing/types.js.map +0 -1
  365. package/dist/runtime/answer-contracts.js.map +0 -1
  366. package/dist/runtime/artifact-contracts.js.map +0 -1
  367. package/dist/runtime/evidence.js.map +0 -1
  368. package/dist/runtime/numeric-claims.js.map +0 -1
  369. package/dist/runtime/planning-evidence.js.map +0 -1
  370. package/dist/runtime/prompt-step.js.map +0 -1
  371. package/dist/runtime/provider-tracker.js.map +0 -1
  372. package/dist/runtime/run-context.js.map +0 -1
  373. package/dist/runtime/session-coordinator.js.map +0 -1
  374. package/dist/runtime/session-title.js.map +0 -1
  375. package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
  376. package/dist/runtime/validation.js.map +0 -1
  377. package/dist/runtime/workflow-events.js.map +0 -1
  378. package/dist/runtime/workflow-runner.js.map +0 -1
  379. package/dist/runtime/workflow-types.js.map +0 -1
  380. package/dist/sentiment/adapters/finnhub.js.map +0 -1
  381. package/dist/sentiment/adapters/reddit.js.map +0 -1
  382. package/dist/sentiment/adapters/twitter.js.map +0 -1
  383. package/dist/sentiment/adapters/web.js.map +0 -1
  384. package/dist/sentiment/index.js.map +0 -1
  385. package/dist/sentiment/insights.js.map +0 -1
  386. package/dist/sentiment/keywords.js.map +0 -1
  387. package/dist/sentiment/pipeline.js.map +0 -1
  388. package/dist/sentiment/scorer.js.map +0 -1
  389. package/dist/sentiment/store.js.map +0 -1
  390. package/dist/sentiment/trends.js.map +0 -1
  391. package/dist/sentiment/types.js.map +0 -1
  392. package/dist/system-prompt.js.map +0 -1
  393. package/dist/tool-kit.js.map +0 -1
  394. package/dist/tools/fundamentals/company-overview.js.map +0 -1
  395. package/dist/tools/fundamentals/comps.js.map +0 -1
  396. package/dist/tools/fundamentals/dcf.js.map +0 -1
  397. package/dist/tools/fundamentals/earnings.js.map +0 -1
  398. package/dist/tools/fundamentals/financials.js.map +0 -1
  399. package/dist/tools/fundamentals/sec-filings.js.map +0 -1
  400. package/dist/tools/index.js.map +0 -1
  401. package/dist/tools/interaction/ask-user.js.map +0 -1
  402. package/dist/tools/macro/event-probabilities.js.map +0 -1
  403. package/dist/tools/macro/fear-greed.js.map +0 -1
  404. package/dist/tools/macro/fred-data.js.map +0 -1
  405. package/dist/tools/market/crypto-history.js.map +0 -1
  406. package/dist/tools/market/crypto-price.js.map +0 -1
  407. package/dist/tools/market/screen-stocks.js.map +0 -1
  408. package/dist/tools/market/search-ticker.js.map +0 -1
  409. package/dist/tools/market/stock-history.js.map +0 -1
  410. package/dist/tools/market/stock-quote.js.map +0 -1
  411. package/dist/tools/options/greeks.js.map +0 -1
  412. package/dist/tools/options/option-chain.js.map +0 -1
  413. package/dist/tools/portfolio/alerts.js.map +0 -1
  414. package/dist/tools/portfolio/correlation.js.map +0 -1
  415. package/dist/tools/portfolio/daily-report.js.map +0 -1
  416. package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
  417. package/dist/tools/portfolio/notifications.js.map +0 -1
  418. package/dist/tools/portfolio/risk-analysis.js.map +0 -1
  419. package/dist/tools/portfolio/tracker.js.map +0 -1
  420. package/dist/tools/portfolio/watchlist.js.map +0 -1
  421. package/dist/tools/sentiment/insight-format.js.map +0 -1
  422. package/dist/tools/sentiment/query-match.js.map +0 -1
  423. package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
  424. package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
  425. package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
  426. package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
  427. package/dist/tools/sentiment/untrusted-text.js.map +0 -1
  428. package/dist/tools/sentiment/web-search.js.map +0 -1
  429. package/dist/tools/sentiment/web-sentiment.js.map +0 -1
  430. package/dist/tools/technical/backtest.js.map +0 -1
  431. package/dist/tools/technical/indicators.js.map +0 -1
  432. package/dist/types/fundamentals.js.map +0 -1
  433. package/dist/types/index.js.map +0 -1
  434. package/dist/types/macro.js.map +0 -1
  435. package/dist/types/market.js.map +0 -1
  436. package/dist/types/options.js.map +0 -1
  437. package/dist/types/portfolio.js.map +0 -1
  438. package/dist/types/prediction-markets.js.map +0 -1
  439. package/dist/types/sentiment.js.map +0 -1
  440. package/dist/workflows/compare-assets.js.map +0 -1
  441. package/dist/workflows/index.js.map +0 -1
  442. package/dist/workflows/options-screener.js.map +0 -1
  443. package/dist/workflows/portfolio-builder.js.map +0 -1
  444. package/gui/server/ask-user-bridge.ts +0 -89
  445. package/gui/server/automation-heartbeat.ts +0 -97
  446. package/gui/server/background-quotes.ts +0 -127
  447. package/gui/server/chat-event-adapter.ts +0 -294
  448. package/gui/server/gui-session-manager.ts +0 -5
  449. package/gui/server/http-routes.ts +0 -1201
  450. package/gui/server/invoke-tool.ts +0 -490
  451. package/gui/server/live-chat-event-adapter.ts +0 -243
  452. package/gui/server/local-session-coordinator.ts +0 -97
  453. package/gui/server/market-state-api.ts +0 -331
  454. package/gui/server/model-setup.ts +0 -254
  455. package/gui/server/package.json +0 -5
  456. package/gui/server/private-api-access.ts +0 -62
  457. package/gui/server/projector.ts +0 -392
  458. package/gui/server/prompt-observation.ts +0 -58
  459. package/gui/server/quote-snapshot-store.ts +0 -50
  460. package/gui/server/server.ts +0 -289
  461. package/gui/server/session-actions.ts +0 -323
  462. package/gui/server/session-entry-wait.ts +0 -179
  463. package/gui/server/shutdown.ts +0 -47
  464. package/gui/server/tool-invoke-ack.ts +0 -49
  465. package/gui/server/tool-metadata.ts +0 -167
  466. package/gui/server/websocket.ts +0 -138
  467. package/gui/server/writer-lock.ts +0 -1
  468. package/gui/server/ws-hub.ts +0 -403
  469. package/gui/shared/chat-events.ts +0 -165
  470. package/gui/shared/event-reducer.ts +0 -220
  471. package/gui/web/dist/assets/CatalogOverlay-DZ1niyQm.js +0 -1
  472. package/gui/web/dist/assets/index-D4F9AJnn.css +0 -2
  473. package/gui/web/dist/assets/index-DtqMMBTr.js +0 -65
  474. package/src/analysts/contracts.ts +0 -176
  475. package/src/analysts/orchestrator.ts +0 -244
  476. package/src/cli-main.ts +0 -510
  477. package/src/cli.ts +0 -17
  478. package/src/config.ts +0 -272
  479. package/src/doctor/cli-command.ts +0 -83
  480. package/src/doctor/render.ts +0 -37
  481. package/src/doctor/report.ts +0 -638
  482. package/src/index.ts +0 -5
  483. package/src/infra/cache.ts +0 -127
  484. package/src/infra/freshness.ts +0 -165
  485. package/src/infra/http-client.ts +0 -134
  486. package/src/infra/index.ts +0 -14
  487. package/src/infra/market-calendar.ts +0 -193
  488. package/src/infra/native-dependencies.ts +0 -84
  489. package/src/infra/node-version.ts +0 -23
  490. package/src/infra/open-url.ts +0 -28
  491. package/src/infra/opencandle-paths.ts +0 -53
  492. package/src/infra/rate-limiter.ts +0 -77
  493. package/src/market-state/alert-conditions.ts +0 -82
  494. package/src/market-state/alert-runner.ts +0 -863
  495. package/src/market-state/daily-report.ts +0 -237
  496. package/src/market-state/local-automation-service.ts +0 -162
  497. package/src/market-state/notification-delivery.ts +0 -158
  498. package/src/market-state/resolve-for-mutation.ts +0 -24
  499. package/src/market-state/resolve.ts +0 -112
  500. package/src/market-state/service.ts +0 -2208
  501. package/src/market-state/summaries.ts +0 -75
  502. package/src/memory/index.ts +0 -10
  503. package/src/memory/manager.ts +0 -190
  504. package/src/memory/preference-extractor.ts +0 -106
  505. package/src/memory/retrieval.ts +0 -71
  506. package/src/memory/sqlite.ts +0 -577
  507. package/src/memory/storage.ts +0 -195
  508. package/src/memory/tool-defaults.ts +0 -108
  509. package/src/memory/types.ts +0 -71
  510. package/src/monitor.ts +0 -123
  511. package/src/onboarding/connect.ts +0 -177
  512. package/src/onboarding/credential-interceptor.ts +0 -122
  513. package/src/onboarding/degradation-accumulator.ts +0 -77
  514. package/src/onboarding/prompt-user.ts +0 -85
  515. package/src/onboarding/provider-status.ts +0 -382
  516. package/src/onboarding/providers.ts +0 -442
  517. package/src/onboarding/state.ts +0 -216
  518. package/src/onboarding/tool-helpers.ts +0 -104
  519. package/src/onboarding/tool-tags.ts +0 -244
  520. package/src/onboarding/validation.ts +0 -152
  521. package/src/pi/opencandle-extension.ts +0 -1294
  522. package/src/pi/session-action-dedupe.ts +0 -155
  523. package/src/pi/session-storage.ts +0 -5
  524. package/src/pi/session-writer-lock.ts +0 -426
  525. package/src/pi/session.ts +0 -84
  526. package/src/pi/setup.ts +0 -399
  527. package/src/pi/tool-adapter.ts +0 -49
  528. package/src/pi/tui-session-coordinator.ts +0 -351
  529. package/src/prompts/context-builder.ts +0 -326
  530. package/src/prompts/disclaimer.ts +0 -9
  531. package/src/prompts/policy-cards.ts +0 -228
  532. package/src/prompts/sections.ts +0 -46
  533. package/src/prompts/symbol-preflight.ts +0 -80
  534. package/src/prompts/workflow-prompts.ts +0 -504
  535. package/src/providers/alpha-vantage.ts +0 -340
  536. package/src/providers/coingecko.ts +0 -95
  537. package/src/providers/errors.ts +0 -9
  538. package/src/providers/exa-search.ts +0 -375
  539. package/src/providers/external-tool-command.ts +0 -164
  540. package/src/providers/external-tool-error.ts +0 -20
  541. package/src/providers/fear-greed.ts +0 -45
  542. package/src/providers/finnhub.ts +0 -125
  543. package/src/providers/fred.ts +0 -83
  544. package/src/providers/index.ts +0 -17
  545. package/src/providers/polymarket.ts +0 -214
  546. package/src/providers/provider-credential-error.ts +0 -23
  547. package/src/providers/reddit-cli.ts +0 -286
  548. package/src/providers/reddit.ts +0 -106
  549. package/src/providers/sec-edgar.ts +0 -326
  550. package/src/providers/tradingview.ts +0 -399
  551. package/src/providers/twitter-cli.ts +0 -202
  552. package/src/providers/twitter.ts +0 -102
  553. package/src/providers/web-search.ts +0 -303
  554. package/src/providers/with-fallback.ts +0 -42
  555. package/src/providers/wrap-provider.ts +0 -105
  556. package/src/providers/yahoo-finance.ts +0 -984
  557. package/src/routing/classify-intent.ts +0 -380
  558. package/src/routing/defaults.ts +0 -29
  559. package/src/routing/entity-extractor.ts +0 -557
  560. package/src/routing/fund-symbols.ts +0 -58
  561. package/src/routing/horizon.ts +0 -7
  562. package/src/routing/index.ts +0 -70
  563. package/src/routing/legacy-rule-router.ts +0 -13
  564. package/src/routing/planning.ts +0 -829
  565. package/src/routing/route-manifest.ts +0 -308
  566. package/src/routing/router-llm-client.ts +0 -64
  567. package/src/routing/router-prompt.ts +0 -159
  568. package/src/routing/router-types.ts +0 -84
  569. package/src/routing/router.ts +0 -1332
  570. package/src/routing/slot-resolver.ts +0 -213
  571. package/src/routing/symbol-disambiguator.ts +0 -72
  572. package/src/routing/turn-context.ts +0 -108
  573. package/src/routing/types.ts +0 -77
  574. package/src/runtime/answer-contracts.ts +0 -693
  575. package/src/runtime/artifact-contracts.ts +0 -77
  576. package/src/runtime/evidence.ts +0 -78
  577. package/src/runtime/numeric-claims.ts +0 -108
  578. package/src/runtime/planning-evidence.ts +0 -597
  579. package/src/runtime/prompt-step.ts +0 -185
  580. package/src/runtime/provider-tracker.ts +0 -40
  581. package/src/runtime/run-context.ts +0 -32
  582. package/src/runtime/session-coordinator.ts +0 -1037
  583. package/src/runtime/session-title.ts +0 -60
  584. package/src/runtime/tool-defaults-wrapper.ts +0 -43
  585. package/src/runtime/validation.ts +0 -211
  586. package/src/runtime/workflow-events.ts +0 -77
  587. package/src/runtime/workflow-runner.ts +0 -182
  588. package/src/runtime/workflow-types.ts +0 -105
  589. package/src/sentiment/adapters/finnhub.ts +0 -49
  590. package/src/sentiment/adapters/reddit.ts +0 -65
  591. package/src/sentiment/adapters/twitter.ts +0 -36
  592. package/src/sentiment/adapters/web.ts +0 -44
  593. package/src/sentiment/index.ts +0 -49
  594. package/src/sentiment/insights.ts +0 -269
  595. package/src/sentiment/keywords.ts +0 -31
  596. package/src/sentiment/pipeline.ts +0 -91
  597. package/src/sentiment/scorer.ts +0 -89
  598. package/src/sentiment/store.ts +0 -260
  599. package/src/sentiment/trends.ts +0 -96
  600. package/src/sentiment/types.ts +0 -112
  601. package/src/system-prompt.ts +0 -115
  602. package/src/tool-kit.ts +0 -69
  603. package/src/tools/AGENTS.md +0 -36
  604. package/src/tools/fundamentals/company-overview.ts +0 -64
  605. package/src/tools/fundamentals/comps.ts +0 -180
  606. package/src/tools/fundamentals/dcf.ts +0 -447
  607. package/src/tools/fundamentals/earnings.ts +0 -57
  608. package/src/tools/fundamentals/financials.ts +0 -63
  609. package/src/tools/fundamentals/sec-filings.ts +0 -105
  610. package/src/tools/index.ts +0 -104
  611. package/src/tools/interaction/ask-user.ts +0 -93
  612. package/src/tools/macro/event-probabilities.ts +0 -141
  613. package/src/tools/macro/fear-greed.ts +0 -41
  614. package/src/tools/macro/fred-data.ts +0 -92
  615. package/src/tools/market/crypto-history.ts +0 -72
  616. package/src/tools/market/crypto-price.ts +0 -65
  617. package/src/tools/market/screen-stocks.ts +0 -290
  618. package/src/tools/market/search-ticker.ts +0 -254
  619. package/src/tools/market/stock-history.ts +0 -104
  620. package/src/tools/market/stock-quote.ts +0 -73
  621. package/src/tools/options/greeks.ts +0 -81
  622. package/src/tools/options/option-chain.ts +0 -134
  623. package/src/tools/portfolio/alerts.ts +0 -457
  624. package/src/tools/portfolio/correlation.ts +0 -189
  625. package/src/tools/portfolio/daily-report.ts +0 -107
  626. package/src/tools/portfolio/holdings-overlap.ts +0 -139
  627. package/src/tools/portfolio/notifications.ts +0 -45
  628. package/src/tools/portfolio/risk-analysis.ts +0 -173
  629. package/src/tools/portfolio/tracker.ts +0 -308
  630. package/src/tools/portfolio/watchlist.ts +0 -288
  631. package/src/tools/sentiment/insight-format.ts +0 -50
  632. package/src/tools/sentiment/query-match.ts +0 -117
  633. package/src/tools/sentiment/reddit-sentiment.ts +0 -403
  634. package/src/tools/sentiment/sentiment-summary.ts +0 -383
  635. package/src/tools/sentiment/sentiment-trend.ts +0 -75
  636. package/src/tools/sentiment/twitter-sentiment.ts +0 -287
  637. package/src/tools/sentiment/untrusted-text.ts +0 -21
  638. package/src/tools/sentiment/web-search.ts +0 -186
  639. package/src/tools/sentiment/web-sentiment.ts +0 -96
  640. package/src/tools/technical/backtest.ts +0 -336
  641. package/src/tools/technical/indicators.ts +0 -281
  642. package/src/types/fundamentals.ts +0 -47
  643. package/src/types/index.ts +0 -26
  644. package/src/types/macro.ts +0 -27
  645. package/src/types/market.ts +0 -46
  646. package/src/types/options.ts +0 -53
  647. package/src/types/portfolio.ts +0 -83
  648. package/src/types/prediction-markets.ts +0 -13
  649. package/src/types/sentiment.ts +0 -129
  650. package/src/workflows/compare-assets.ts +0 -89
  651. package/src/workflows/index.ts +0 -3
  652. package/src/workflows/options-screener.ts +0 -125
  653. package/src/workflows/portfolio-builder.ts +0 -63
@@ -1,60 +0,0 @@
1
- /**
2
- * LLM-summarized session titles.
3
- *
4
- * Builds a strict short-title prompt from the user's first message (plus an
5
- * optional slice of the first assistant reply), delegates to an injected
6
- * completion function, and sanitizes the result. Returns null when the model
7
- * output is unusable (empty or rambling) so callers can keep the existing
8
- * placeholder name. Completion errors propagate to the caller.
9
- */
10
-
11
- const MAX_TITLE_CHARS = 60;
12
- const MAX_TITLE_WORDS = 12;
13
-
14
- export interface SessionTitleInput {
15
- userText: string;
16
- assistantText?: string;
17
- }
18
-
19
- export async function generateSessionTitle(
20
- input: SessionTitleInput,
21
- complete: (prompt: string) => Promise<string>,
22
- ): Promise<string | null> {
23
- const lines = [
24
- "Write a 4-8 word title for this finance chat session.",
25
- "No quotes, no punctuation at the end, no markdown. Return only the title.",
26
- "",
27
- `User: ${input.userText}`,
28
- ];
29
- if (input.assistantText !== undefined && input.assistantText.trim().length > 0) {
30
- lines.push("", `Assistant: ${input.assistantText}`);
31
- }
32
- const raw = await complete(lines.join("\n"));
33
- return sanitizeTitle(raw);
34
- }
35
-
36
- function sanitizeTitle(raw: string): string | null {
37
- // First non-empty line only — discard any model commentary after a newline.
38
- let title =
39
- raw
40
- .split("\n")
41
- .map((line) => line.trim())
42
- .find((line) => line.length > 0) ?? "";
43
- // Strip markdown emphasis/heading/code characters.
44
- title = title.replace(/[*_`#]/g, "");
45
- // Strip surrounding quotes.
46
- title = title.replace(/^["'“”‘’]+/, "").replace(/["'“”‘’]+$/, "");
47
- // Strip trailing punctuation.
48
- title = title.replace(/[.!?:;,]+$/, "");
49
- // Collapse whitespace.
50
- title = title.replace(/\s+/g, " ").trim();
51
-
52
- if (title.length === 0) return null;
53
- if (title.split(" ").length > MAX_TITLE_WORDS) return null;
54
- if (title.length > MAX_TITLE_CHARS) {
55
- const cut = title.slice(0, MAX_TITLE_CHARS);
56
- const lastSpace = cut.lastIndexOf(" ");
57
- title = (lastSpace > 0 ? cut.slice(0, lastSpace) : cut).trim();
58
- }
59
- return title;
60
- }
@@ -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
- ): Array<ValidationEntry & { type: "pass" | "failure" }> {
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,77 +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
- | "tally_injected"
16
- | "tally_skipped"
17
- | "validation_passed"
18
- | "validation_failed"
19
- | "workflow_completed"
20
- | "workflow_cancelled";
21
-
22
- /** A persisted workflow event row. */
23
- export interface WorkflowEvent {
24
- id: number;
25
- runId: string;
26
- stepIndex: number;
27
- eventType: WorkflowEventType;
28
- payloadJson: string | null;
29
- timestamp: string;
30
- }
31
-
32
- /** Append-only workflow event logger backed by SQLite. */
33
- export class WorkflowEventLogger {
34
- constructor(private readonly db: Database.Database) {}
35
-
36
- /** Append a workflow event. */
37
- log(
38
- runId: string,
39
- stepIndex: number,
40
- eventType: WorkflowEventType,
41
- payload?: Record<string, unknown>,
42
- ): void {
43
- const now = new Date().toISOString();
44
- const payloadJson = payload ? JSON.stringify(payload) : null;
45
- this.db
46
- .prepare(
47
- `INSERT INTO workflow_events (run_id, step_index, event_type, payload_json, timestamp)
48
- VALUES (?, ?, ?, ?, ?)`,
49
- )
50
- .run(runId, stepIndex, eventType, payloadJson, now);
51
- }
52
-
53
- /** Query all events for a given run ID, ordered by timestamp. */
54
- getEventsByRunId(runId: string): WorkflowEvent[] {
55
- const rows = this.db
56
- .prepare(
57
- "SELECT id, run_id, step_index, event_type, payload_json, timestamp FROM workflow_events WHERE run_id = ? ORDER BY id",
58
- )
59
- .all(runId) as Array<{
60
- id: number;
61
- run_id: string;
62
- step_index: number;
63
- event_type: string;
64
- payload_json: string | null;
65
- timestamp: string;
66
- }>;
67
-
68
- return rows.map((r) => ({
69
- id: r.id,
70
- runId: r.run_id,
71
- stepIndex: r.step_index,
72
- eventType: r.event_type as WorkflowEventType,
73
- payloadJson: r.payload_json,
74
- timestamp: r.timestamp,
75
- }));
76
- }
77
- }
@@ -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,105 +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
- analystOutput?: AnalystOutput;
48
- debateOutput?: DebateOutput;
49
- parsed?: boolean;
50
- }
51
-
52
- /** Analyst signal direction. */
53
- export type AnalystSignal = "BUY" | "HOLD" | "SELL";
54
-
55
- /** Structured output from a single analyst role. */
56
- export interface AnalystOutput {
57
- role: string;
58
- signal: AnalystSignal;
59
- conviction: number;
60
- thesis: string;
61
- evidence: EvidenceRecord[];
62
- rawText?: string;
63
- }
64
-
65
- /** Debate side in bull/bear adversarial debate. */
66
- export type DebateSide = "bull" | "bear";
67
-
68
- /** Structured output from a debate step (eval/test only — not used in live path). */
69
- export interface DebateOutput {
70
- side: DebateSide;
71
- thesis: string;
72
- keyRisk: string;
73
- concessions: string[];
74
- remainingConviction: number;
75
- evidence: EvidenceRecord[];
76
- rawText: string;
77
- }
78
-
79
- /** A complete workflow run definition and state. */
80
- export interface WorkflowRun {
81
- runId: string;
82
- workflowType: string;
83
- steps: WorkflowStep[];
84
- currentStepIndex: number;
85
- status: RunStatus;
86
- stepOutputs: Map<number, StepOutput>;
87
- createdAt: string;
88
- }
89
-
90
- /** Create a new workflow run with all steps in pending state. */
91
- export function createWorkflowRun(
92
- runId: string,
93
- workflowType: string,
94
- stepDefinitions: Omit<WorkflowStep, "status">[],
95
- ): WorkflowRun {
96
- return {
97
- runId,
98
- workflowType,
99
- steps: stepDefinitions.map((def) => ({ ...def, status: "pending" as const })),
100
- currentStepIndex: 0,
101
- status: "pending",
102
- stepOutputs: new Map(),
103
- createdAt: new Date().toISOString(),
104
- };
105
- }