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,682 +0,0 @@
1
- import type { ParsedTag } from "../onboarding/tool-tags.js";
2
- import { parseToolTag } from "../onboarding/tool-tags.js";
3
- import type { CapabilityGapId, EvidencePlanId, TaskFamily } from "../routing/planning.js";
4
- import type { ProviderResult } from "./evidence.js";
5
-
6
- export type PlanningEvidenceType =
7
- | "market_status"
8
- | "ticker_disambiguation"
9
- | "portfolio_exposure_map"
10
- | "tool_result"
11
- | "provider_gap";
12
-
13
- export type PlanningProviderStatus =
14
- | "available"
15
- | "unavailable"
16
- | "credential_required"
17
- | "soft_degraded"
18
- | "skipped";
19
-
20
- export interface EvidenceSource {
21
- toolName?: string;
22
- provider?: string;
23
- }
24
-
25
- export interface EntityScope {
26
- symbols?: string[];
27
- query?: string;
28
- }
29
-
30
- export interface RawTracePointer {
31
- traceId?: string;
32
- turnIndex?: number;
33
- toolCallIndex?: number;
34
- toolCallId?: string;
35
- toolName?: string;
36
- customEntryType?: string;
37
- }
38
-
39
- export interface EvidenceGap {
40
- kind: "provider_status" | "capability_gap" | "roadmap_placeholder";
41
- providerStatus?: Exclude<PlanningProviderStatus, "available">;
42
- provider?: string;
43
- capabilityGapId?: CapabilityGapId;
44
- reason: string;
45
- remediation?: string;
46
- silenced?: boolean;
47
- rawTag?: string;
48
- }
49
-
50
- export interface PlanningEvidenceRecord {
51
- id: string;
52
- evidenceType: PlanningEvidenceType;
53
- source: EvidenceSource;
54
- entityScope: EntityScope;
55
- observedAt: string;
56
- providerStatus: PlanningProviderStatus;
57
- normalizedFacts: Record<string, unknown>;
58
- rawTracePointer?: RawTracePointer;
59
- gaps: EvidenceGap[];
60
- caveats: string[];
61
- }
62
-
63
- export interface EvidencePlanDefinition {
64
- id: EvidencePlanId;
65
- taskFamilies: TaskFamily[];
66
- implemented: boolean;
67
- requiredEvidence: PlanningEvidenceType[];
68
- optionalEvidence: PlanningEvidenceType[];
69
- capabilityGapIds: CapabilityGapId[];
70
- roadmapPlaceholder?: string;
71
- }
72
-
73
- export interface MarketStatusInput {
74
- text: string;
75
- now?: Date;
76
- timezone?: string;
77
- traceId?: string;
78
- }
79
-
80
- export interface TickerDisambiguationInput {
81
- text: string;
82
- symbols?: string[];
83
- traceId?: string;
84
- }
85
-
86
- export interface PortfolioExposureMapInput {
87
- text: string;
88
- now?: Date;
89
- traceId?: string;
90
- }
91
-
92
- export interface PortfolioExposureSleeve {
93
- label: string;
94
- normalizedSleeve: string;
95
- percent: number;
96
- }
97
-
98
- export interface ToolCallEvidenceInput {
99
- name: string;
100
- args: Record<string, unknown>;
101
- result: unknown;
102
- isError?: boolean;
103
- }
104
-
105
- export interface ToolTraceOptions {
106
- traceId?: string;
107
- turnIndex?: number;
108
- toolCallIndex?: number;
109
- toolCallId?: string;
110
- }
111
-
112
- export interface NormalizedProviderGap {
113
- providerStatus: Exclude<PlanningProviderStatus, "available">;
114
- provider: string;
115
- reason: string;
116
- remediation?: string;
117
- silenced?: boolean;
118
- rawTag: string;
119
- }
120
-
121
- export const EVIDENCE_PLAN_REGISTRY: Record<EvidencePlanId, EvidencePlanDefinition> = {
122
- market_status: {
123
- id: "market_status",
124
- taskFamilies: ["current_event_explanation", "macro_allocation_review"],
125
- implemented: true,
126
- requiredEvidence: ["market_status"],
127
- optionalEvidence: ["tool_result"],
128
- capabilityGapIds: ["market_calendar"],
129
- },
130
- ticker_disambiguation: {
131
- id: "ticker_disambiguation",
132
- taskFamilies: ["ticker_disambiguation"],
133
- implemented: true,
134
- requiredEvidence: ["ticker_disambiguation"],
135
- optionalEvidence: ["tool_result"],
136
- capabilityGapIds: ["earnings_event_risk"],
137
- },
138
- placeholder_single_asset_decision: placeholderPlan(
139
- "placeholder_single_asset_decision",
140
- ["single_asset_decision"],
141
- [],
142
- ),
143
- placeholder_asset_compare: placeholderPlan(
144
- "placeholder_asset_compare",
145
- ["asset_compare"],
146
- ["etf_holdings_overlap"],
147
- ),
148
- placeholder_portfolio_build: placeholderPlan(
149
- "placeholder_portfolio_build",
150
- ["portfolio_build"],
151
- [],
152
- ),
153
- placeholder_portfolio_review: placeholderPlan(
154
- "placeholder_portfolio_review",
155
- ["portfolio_review"],
156
- [],
157
- ),
158
- placeholder_options_strategy: placeholderPlan(
159
- "placeholder_options_strategy",
160
- ["options_strategy"],
161
- [],
162
- ),
163
- placeholder_current_event_explanation: placeholderPlan(
164
- "placeholder_current_event_explanation",
165
- ["current_event_explanation"],
166
- ["market_calendar"],
167
- ),
168
- placeholder_sentiment_snapshot: placeholderPlan(
169
- "placeholder_sentiment_snapshot",
170
- ["sentiment_snapshot"],
171
- ["sentiment_sample_depth"],
172
- ),
173
- placeholder_filing_thesis_review: placeholderPlan(
174
- "placeholder_filing_thesis_review",
175
- ["filing_thesis_review"],
176
- [],
177
- ),
178
- placeholder_retail_finance_tradeoff: placeholderPlan(
179
- "placeholder_retail_finance_tradeoff",
180
- ["retail_finance_tradeoff"],
181
- ["brokerage_comparison", "cash_yield_products", "fund_tax_efficiency"],
182
- ),
183
- placeholder_concept_explainer: placeholderPlan(
184
- "placeholder_concept_explainer",
185
- ["concept_explainer"],
186
- [],
187
- ),
188
- placeholder_backtest_review: placeholderPlan(
189
- "placeholder_backtest_review",
190
- ["backtest_review"],
191
- [],
192
- ),
193
- placeholder_stateful_tracking_update: placeholderPlan(
194
- "placeholder_stateful_tracking_update",
195
- ["stateful_tracking_update"],
196
- [],
197
- ),
198
- placeholder_general_fallback: placeholderPlan(
199
- "placeholder_general_fallback",
200
- ["general_fallback"],
201
- [],
202
- ),
203
- };
204
-
205
- const KNOWN_US_MARKET_HOLIDAYS: Record<string, string> = {
206
- "2026-01-01": "New Year's Day",
207
- "2026-01-19": "Martin Luther King Jr. Day",
208
- "2026-02-16": "Washington's Birthday",
209
- "2026-04-03": "Good Friday",
210
- "2026-05-25": "Memorial Day",
211
- "2026-06-19": "Juneteenth",
212
- "2026-07-03": "Independence Day observed",
213
- "2026-09-07": "Labor Day",
214
- "2026-11-26": "Thanksgiving Day",
215
- "2026-12-25": "Christmas Day",
216
- };
217
-
218
- function placeholderPlan(
219
- id: EvidencePlanId,
220
- taskFamilies: TaskFamily[],
221
- capabilityGapIds: CapabilityGapId[],
222
- ): EvidencePlanDefinition {
223
- return {
224
- id,
225
- taskFamilies,
226
- implemented: false,
227
- requiredEvidence: [],
228
- optionalEvidence: ["tool_result"],
229
- capabilityGapIds,
230
- roadmapPlaceholder: "openspec/changes/prompt-to-policy-agent-planning/future-roadmap.md",
231
- };
232
- }
233
-
234
- export function buildMarketStatusEvidence(input: MarketStatusInput): PlanningEvidenceRecord {
235
- const timezone = input.timezone ?? "America/New_York";
236
- const now = input.now ?? new Date();
237
- const local = localDateTimeParts(now, timezone);
238
- const temporalReferences = temporalReferencesFor(input.text);
239
- const holidayName = KNOWN_US_MARKET_HOLIDAYS[local.date];
240
- const isWeekend = local.weekday === "Sat" || local.weekday === "Sun";
241
- const isMarketHoliday = holidayName !== undefined;
242
- const marketStatus = classifyMarketStatus(local, isWeekend, isMarketHoliday, temporalReferences);
243
- const lastTradingDate = marketStatus === "open" ? local.date : lastTradingDay(local.date);
244
- const gaps: EvidenceGap[] = [
245
- {
246
- kind: "capability_gap",
247
- capabilityGapId: "market_calendar",
248
- reason:
249
- "V1 uses deterministic weekday and known-holiday grounding, not a live exchange-calendar provider.",
250
- },
251
- ];
252
-
253
- return {
254
- id: "market_status:deterministic",
255
- evidenceType: "market_status",
256
- source: { toolName: "deterministic_market_status" },
257
- entityScope: { query: input.text },
258
- observedAt: now.toISOString(),
259
- providerStatus: "available",
260
- normalizedFacts: {
261
- timezone,
262
- localDate: local.date,
263
- localTime: local.time,
264
- weekday: local.weekday,
265
- temporalReferences,
266
- isWeekend,
267
- isMarketHoliday,
268
- holidayName,
269
- marketStatus,
270
- lastTradingDay: lastTradingDate,
271
- quoteAsOfCaveat: quoteAsOfCaveat(marketStatus),
272
- },
273
- rawTracePointer: input.traceId
274
- ? { traceId: input.traceId, toolName: "deterministic_market_status" }
275
- : undefined,
276
- gaps,
277
- caveats: [
278
- "Market status is deterministic V1 grounding and should be verified against an exchange calendar for edge cases.",
279
- ],
280
- };
281
- }
282
-
283
- export function buildTickerDisambiguationEvidence(
284
- input: TickerDisambiguationInput,
285
- ): PlanningEvidenceRecord {
286
- const gaps: EvidenceGap[] = [
287
- {
288
- kind: "capability_gap",
289
- capabilityGapId: "earnings_event_risk",
290
- reason:
291
- "Ticker disambiguation can preserve symbol-verification gaps, but V1 does not add richer earnings-event data.",
292
- },
293
- ];
294
-
295
- return {
296
- id: "ticker_disambiguation:selected_slice",
297
- evidenceType: "ticker_disambiguation",
298
- source: { toolName: "planning_ticker_disambiguation" },
299
- entityScope: { symbols: [...(input.symbols ?? [])], query: input.text },
300
- observedAt: new Date(0).toISOString(),
301
- providerStatus: "available",
302
- normalizedFacts: {
303
- selectedMigrationSlice: "ticker_disambiguation",
304
- requestedSymbols: [...(input.symbols ?? [])],
305
- requiresSymbolVerification: true,
306
- legacyBehaviorRemainsActive: true,
307
- },
308
- rawTracePointer: input.traceId
309
- ? { traceId: input.traceId, toolName: "planning_ticker_disambiguation" }
310
- : undefined,
311
- gaps,
312
- caveats: input.symbols?.length
313
- ? []
314
- : [
315
- "No symbol was verified by this evidence plan; active tools remain responsible for lookup.",
316
- ],
317
- };
318
- }
319
-
320
- export function buildPortfolioExposureMapEvidence(
321
- input: PortfolioExposureMapInput,
322
- ): PlanningEvidenceRecord {
323
- const sleeves = extractPortfolioSleeves(input.text);
324
- const normalizedSleeves = new Set(sleeves.map((sleeve) => sleeve.normalizedSleeve));
325
- const hasBroadIndex =
326
- normalizedSleeves.has("broad_us_index") || normalizedSleeves.has("broad_equity");
327
- const hasSectorSleeve = sleeves.some((sleeve) => sleeve.normalizedSleeve.endsWith("_sector"));
328
- const broadIndexOverlapCaveat = hasBroadIndex && hasSectorSleeve;
329
-
330
- return {
331
- id: "portfolio_exposure_map:deterministic",
332
- evidenceType: "portfolio_exposure_map",
333
- source: { toolName: "deterministic_portfolio_exposure_map" },
334
- entityScope: { query: input.text },
335
- observedAt: (input.now ?? new Date()).toISOString(),
336
- providerStatus: "available",
337
- normalizedFacts: {
338
- directSleeves: sleeves,
339
- directExposureTotalPercent: roundPercent(
340
- sleeves.reduce((sum, sleeve) => sum + sleeve.percent, 0),
341
- ),
342
- broadIndexOverlapCaveat,
343
- exactHoldingsOverlapAvailable: false,
344
- targetBandGuidanceNeeded:
345
- /\b(?:rebalance|target\s+bands?|drift|overweight|underweight|concentration|diversif)/i.test(
346
- input.text,
347
- ),
348
- },
349
- rawTracePointer: input.traceId
350
- ? {
351
- traceId: input.traceId,
352
- toolName: "deterministic_portfolio_exposure_map",
353
- }
354
- : undefined,
355
- gaps: [
356
- {
357
- kind: "capability_gap",
358
- capabilityGapId: "etf_holdings_overlap",
359
- reason:
360
- "V1 records user-stated sleeves and overlap caveats but does not fetch exact ETF/index holdings or issuer weights.",
361
- },
362
- ],
363
- caveats: [
364
- "Exact ETF/index holdings overlap requires a provider-backed holdings source.",
365
- ...(broadIndexOverlapCaveat
366
- ? [
367
- "Broad index exposure may already include sector exposure; V1 does not estimate exact constituent weights.",
368
- ]
369
- : []),
370
- ],
371
- };
372
- }
373
-
374
- export function captureEvidenceFromToolCall(
375
- toolCall: ToolCallEvidenceInput,
376
- options: ToolTraceOptions = {},
377
- ): PlanningEvidenceRecord {
378
- const text = toolResultText(toolCall.result);
379
- const providerGap = text ? normalizeProviderGapFromToolText(text) : undefined;
380
- const providerStatus =
381
- providerGap?.providerStatus ?? (toolCall.isError ? "unavailable" : "available");
382
- const gaps = providerGap ? [providerGapToEvidenceGap(providerGap)] : [];
383
- if (toolCall.isError && !providerGap) {
384
- gaps.push({
385
- kind: "provider_status",
386
- providerStatus: "unavailable",
387
- reason: "Tool call returned an error.",
388
- });
389
- }
390
-
391
- return {
392
- id: `tool_result:${toolCall.name}`,
393
- evidenceType: providerGap ? "provider_gap" : "tool_result",
394
- source: {
395
- toolName: toolCall.name,
396
- provider: providerGap?.provider,
397
- },
398
- entityScope: symbolsFromArgs(toolCall.args),
399
- observedAt: new Date(0).toISOString(),
400
- providerStatus,
401
- normalizedFacts: {
402
- toolName: toolCall.name,
403
- args: { ...toolCall.args },
404
- isError: toolCall.isError === true,
405
- providerStatus,
406
- },
407
- rawTracePointer: {
408
- ...options,
409
- toolName: toolCall.name,
410
- },
411
- gaps,
412
- caveats: [],
413
- };
414
- }
415
-
416
- export function normalizeProviderGapFromToolText(text: string): NormalizedProviderGap | undefined {
417
- const parsed = parseToolTag(text);
418
- if (!parsed || parsed.kind === "connected") return undefined;
419
-
420
- return {
421
- providerStatus: providerStatusFromTag(parsed),
422
- provider: parsed.provider,
423
- reason: reasonFromTag(parsed),
424
- remediation: remediationFromTag(parsed),
425
- silenced: parsed.kind === "skipped" ? parsed.silenced : undefined,
426
- rawTag: text,
427
- };
428
- }
429
-
430
- export function providerResultToPlanningEvidence<T>(
431
- label: string,
432
- result: ProviderResult<T>,
433
- rawTracePointer?: RawTracePointer,
434
- ): PlanningEvidenceRecord {
435
- if (result.status === "ok") {
436
- return {
437
- id: `provider_result:${label}`,
438
- evidenceType: "tool_result",
439
- source: {},
440
- entityScope: {},
441
- observedAt: result.timestamp,
442
- providerStatus: "available",
443
- normalizedFacts: { label, data: result.data, stale: result.stale === true },
444
- rawTracePointer,
445
- gaps: [],
446
- caveats: result.stale ? ["Provider result came from stale cache."] : [],
447
- };
448
- }
449
-
450
- return {
451
- id: `provider_result:${label}`,
452
- evidenceType: "provider_gap",
453
- source: { provider: result.provider },
454
- entityScope: {},
455
- observedAt: new Date(0).toISOString(),
456
- providerStatus: "unavailable",
457
- normalizedFacts: { label },
458
- rawTracePointer,
459
- gaps: [
460
- {
461
- kind: "provider_status",
462
- providerStatus: "unavailable",
463
- provider: result.provider,
464
- reason: result.reason,
465
- },
466
- ],
467
- caveats: [],
468
- };
469
- }
470
-
471
- function providerGapToEvidenceGap(gap: NormalizedProviderGap): EvidenceGap {
472
- return {
473
- kind: "provider_status",
474
- providerStatus: gap.providerStatus,
475
- provider: gap.provider,
476
- reason: gap.reason,
477
- remediation: gap.remediation,
478
- silenced: gap.silenced,
479
- rawTag: gap.rawTag,
480
- };
481
- }
482
-
483
- function providerStatusFromTag(
484
- tag: Exclude<ParsedTag, { kind: "connected" }>,
485
- ): Exclude<PlanningProviderStatus, "available"> {
486
- if (tag.kind === "credential_required") return "credential_required";
487
- if (tag.kind === "soft_degraded") return "soft_degraded";
488
- return "skipped";
489
- }
490
-
491
- function reasonFromTag(tag: Exclude<ParsedTag, { kind: "connected" }>): string {
492
- if (tag.kind === "credential_required") {
493
- return tag.reason === "stale" ? "credential_stale" : "credential_missing";
494
- }
495
- if (tag.kind === "soft_degraded") {
496
- return `soft_degraded_to_${tag.fallback}`;
497
- }
498
- return tag.reason;
499
- }
500
-
501
- function remediationFromTag(tag: Exclude<ParsedTag, { kind: "connected" }>): string | undefined {
502
- if (tag.kind === "soft_degraded") return tag.remediation;
503
- if (tag.kind === "skipped") return tag.remediation;
504
- return "run /connect";
505
- }
506
-
507
- function toolResultText(result: unknown): string | undefined {
508
- if (typeof result === "string") return result;
509
- if (!isRecord(result)) return undefined;
510
- const content = result.content;
511
- if (typeof content === "string") return content;
512
- if (Array.isArray(content)) {
513
- return content
514
- .map((item) => {
515
- if (typeof item === "string") return item;
516
- if (isRecord(item) && typeof item.text === "string") return item.text;
517
- return "";
518
- })
519
- .filter(Boolean)
520
- .join("\n");
521
- }
522
- return undefined;
523
- }
524
-
525
- function symbolsFromArgs(args: Record<string, unknown>): EntityScope {
526
- const symbol = args.symbol;
527
- const symbols = args.symbols;
528
- if (typeof symbol === "string") return { symbols: [symbol] };
529
- if (Array.isArray(symbols) && symbols.every((item) => typeof item === "string")) {
530
- return { symbols: [...symbols] };
531
- }
532
- return {};
533
- }
534
-
535
- function extractPortfolioSleeves(text: string): PortfolioExposureSleeve[] {
536
- const matches: PortfolioExposureSleeve[] = [];
537
- const pattern =
538
- /(\d+(?:\.\d+)?)\s*%\s*(?:in|to|of|toward|towards|allocated\s+to)?\s*([^,;.\n?]+)/gi;
539
- for (const match of text.matchAll(pattern)) {
540
- const percent = Number(match[1]);
541
- if (!Number.isFinite(percent)) continue;
542
- const label = cleanSleeveLabel(match[2] ?? "");
543
- if (!label) continue;
544
- matches.push({
545
- label,
546
- normalizedSleeve: normalizePortfolioSleeve(label),
547
- percent: roundPercent(percent),
548
- });
549
- }
550
- return matches;
551
- }
552
-
553
- function cleanSleeveLabel(label: string): string {
554
- return label
555
- .replace(/^(?:and|plus|with)\s+/i, "")
556
- .replace(/\b(?:should|can|could|would|do|does|rebalance|diversify|target|bands?).*$/i, "")
557
- .trim();
558
- }
559
-
560
- function normalizePortfolioSleeve(label: string): string {
561
- const lower = label.toLowerCase();
562
- if (/\b(?:s&p\s*500|sp\s*500|index|voo|spy|ivv)\b/.test(lower)) return "broad_us_index";
563
- if (/\b(?:tech|technology|software|semis?|semiconductors?)\b/.test(lower))
564
- return "technology_sector";
565
- if (/\b(?:bond|bonds|fixed\s+income|treasur(?:y|ies))\b/.test(lower)) return "bonds";
566
- if (/\b(?:cash|savings?|money\s*market|t[-\s]?bills?)\b/.test(lower)) return "cash";
567
- if (/\b(?:international|ex[-\s]?us|foreign|global)\b/.test(lower)) return "international_equity";
568
- if (/\b(?:stock|stocks|equity|equities)\b/.test(lower)) return "broad_equity";
569
- return (
570
- lower
571
- .replace(/[^a-z0-9]+/g, "_")
572
- .replace(/^_+|_+$/g, "")
573
- .slice(0, 48) || "unknown_sleeve"
574
- );
575
- }
576
-
577
- function roundPercent(value: number): number {
578
- return Math.round(value * 100) / 100;
579
- }
580
-
581
- function temporalReferencesFor(text: string): string[] {
582
- const lower = text.toLowerCase();
583
- const refs: string[] = [];
584
- if (/\btoday\b/.test(lower)) refs.push("today");
585
- if (/\bright now\b/.test(lower)) refs.push("right_now");
586
- if (/\bthis morning\b/.test(lower)) refs.push("this_morning");
587
- if (/\bafter close\b|\bafter the close\b/.test(lower)) refs.push("after_close");
588
- if (/\bmarket(?: is|'s)? closed\b|\bmarket-closed\b/.test(lower)) refs.push("market_closed");
589
- if (/\bweekend\b/.test(lower)) refs.push("weekend");
590
- if (/\bholiday\b/.test(lower)) refs.push("holiday");
591
- return refs;
592
- }
593
-
594
- function classifyMarketStatus(
595
- local: LocalDateTimeParts,
596
- isWeekend: boolean,
597
- isMarketHoliday: boolean,
598
- temporalReferences: string[],
599
- ): string {
600
- if (isWeekend) return "closed_weekend";
601
- if (isMarketHoliday) return "closed_holiday";
602
- if (local.minutesSinceMidnight < 9 * 60 + 30) return "pre_market";
603
- if (local.minutesSinceMidnight < 16 * 60) return "open";
604
- if (temporalReferences.includes("after_close")) return "after_close";
605
- return "closed_after_hours";
606
- }
607
-
608
- function quoteAsOfCaveat(marketStatus: string): string {
609
- if (marketStatus === "open")
610
- return "Quote evidence may be intraday or delayed depending on provider.";
611
- if (marketStatus === "pre_market")
612
- return "Quote evidence may reflect the previous regular session until premarket data is fetched.";
613
- return "Quote evidence should distinguish the current calendar date from the most recent trading session.";
614
- }
615
-
616
- interface LocalDateTimeParts {
617
- date: string;
618
- time: string;
619
- weekday: string;
620
- minutesSinceMidnight: number;
621
- }
622
-
623
- function localDateTimeParts(date: Date, timezone: string): LocalDateTimeParts {
624
- const formatter = new Intl.DateTimeFormat("en-US", {
625
- timeZone: timezone,
626
- year: "numeric",
627
- month: "2-digit",
628
- day: "2-digit",
629
- hour: "2-digit",
630
- minute: "2-digit",
631
- hour12: false,
632
- weekday: "short",
633
- });
634
- const parts = formatter.formatToParts(date).reduce<Record<string, string>>((acc, part) => {
635
- acc[part.type] = part.value;
636
- return acc;
637
- }, {});
638
- const hour = Number(parts.hour);
639
- const minute = Number(parts.minute);
640
- return {
641
- date: `${parts.year}-${parts.month}-${parts.day}`,
642
- time: `${parts.hour}:${parts.minute}`,
643
- weekday: parts.weekday ?? "",
644
- minutesSinceMidnight: hour * 60 + minute,
645
- };
646
- }
647
-
648
- function lastTradingDay(localDate: string): string {
649
- let cursor = dateFromKey(localDate);
650
- do {
651
- cursor = addDays(cursor, -1);
652
- } while (isWeekendOrKnownHoliday(dateKey(cursor)));
653
- return dateKey(cursor);
654
- }
655
-
656
- function isWeekendOrKnownHoliday(key: string): boolean {
657
- const date = dateFromKey(key);
658
- const day = date.getUTCDay();
659
- return day === 0 || day === 6 || KNOWN_US_MARKET_HOLIDAYS[key] !== undefined;
660
- }
661
-
662
- function dateFromKey(key: string): Date {
663
- const [year, month, day] = key.split("-").map(Number);
664
- return new Date(Date.UTC(year, month - 1, day));
665
- }
666
-
667
- function addDays(date: Date, days: number): Date {
668
- const next = new Date(date);
669
- next.setUTCDate(next.getUTCDate() + days);
670
- return next;
671
- }
672
-
673
- function dateKey(date: Date): string {
674
- const year = date.getUTCFullYear();
675
- const month = String(date.getUTCMonth() + 1).padStart(2, "0");
676
- const day = String(date.getUTCDate()).padStart(2, "0");
677
- return `${year}-${month}-${day}`;
678
- }
679
-
680
- function isRecord(value: unknown): value is Record<string, unknown> {
681
- return typeof value === "object" && value !== null && !Array.isArray(value);
682
- }