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,4 +1,3 @@
1
- import type { AgentTool } from "@earendil-works/pi-agent-core";
2
1
  import type { AskUserHandler } from "../types/index.js";
3
2
  export { companyOverviewTool } from "./fundamentals/company-overview.js";
4
3
  export { compsTool } from "./fundamentals/comps.js";
@@ -34,4 +33,119 @@ export { backtestTool } from "./technical/backtest.js";
34
33
  export { technicalIndicatorsTool } from "./technical/indicators.js";
35
34
  export declare function getAllTools(options?: {
36
35
  askUserHandler?: AskUserHandler;
37
- }): AgentTool<any>[];
36
+ }): (import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
37
+ symbol: import("@sinclair/typebox").TString;
38
+ }>, import("../types/fundamentals.js").CompanyOverview | {
39
+ credentialRequired: unknown;
40
+ } | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
41
+ symbols: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
42
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
43
+ symbol: import("@sinclair/typebox").TString;
44
+ growth_rate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
45
+ discount_rate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
46
+ terminal_growth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
47
+ projection_years: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
48
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
49
+ symbol: import("@sinclair/typebox").TString;
50
+ }>, import("../types/fundamentals.js").EarningsData | {
51
+ credentialRequired: unknown;
52
+ } | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
53
+ symbol: import("@sinclair/typebox").TString;
54
+ }>, import("../types/fundamentals.js").FinancialStatement[] | {
55
+ credentialRequired: unknown;
56
+ }> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
57
+ symbol: import("@sinclair/typebox").TString;
58
+ form_types: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
59
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
60
+ include_snippets: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
61
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{}>, import("../types/sentiment.js").FearGreedData | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
62
+ series_id: import("@sinclair/typebox").TString;
63
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
64
+ }>, import("../types/macro.js").FredSeries | {
65
+ credentialRequired: unknown;
66
+ } | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
67
+ symbol: import("@sinclair/typebox").TString;
68
+ period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"6mo" | "1y" | "2y">[]>>;
69
+ }>, import("../types/portfolio.js").RiskMetrics | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
70
+ id: import("@sinclair/typebox").TString;
71
+ days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
72
+ }>, import("../types/market.js").OHLCV[]> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
73
+ id: import("@sinclair/typebox").TString;
74
+ }>, (import("../types/market.js").CryptoPrice & {
75
+ freshness: import("../infra/freshness.js").FreshnessStamp;
76
+ }) | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
77
+ market: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
78
+ columns: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
79
+ filter: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
80
+ field: import("@sinclair/typebox").TString;
81
+ op: import("@sinclair/typebox").TString;
82
+ value: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnknown>;
83
+ }>>>;
84
+ sort: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
85
+ field: import("@sinclair/typebox").TString;
86
+ direction: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
87
+ }>>;
88
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
89
+ }>, import("../providers/tradingview.js").ScreenerRow[]> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
90
+ query: import("@sinclair/typebox").TString;
91
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
92
+ symbol: import("@sinclair/typebox").TString;
93
+ range: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"6mo" | "1d" | "ytd" | "5d" | "1mo" | "3mo" | "1y" | "2y" | "5y" | "10y" | "max">[]>>;
94
+ interval: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"1d" | "1mo" | "1wk" | "1m" | "5m" | "15m" | "1h">[]>>;
95
+ }>, import("../types/market.js").OHLCV[]> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
96
+ symbol: import("@sinclair/typebox").TString;
97
+ }>, (import("../types/market.js").StockQuote & {
98
+ freshness: import("../infra/freshness.js").FreshnessStamp;
99
+ }) | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
100
+ symbol: import("@sinclair/typebox").TString;
101
+ expiration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
102
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"call">, import("@sinclair/typebox").TLiteral<"put">, import("@sinclair/typebox").TLiteral<"CALL">, import("@sinclair/typebox").TLiteral<"PUT">]>>;
103
+ }>, (import("../types/options.js").OptionsChain & {
104
+ freshness: import("../infra/freshness.js").FreshnessStamp;
105
+ }) | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
106
+ symbol: import("@sinclair/typebox").TString;
107
+ range: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
108
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
109
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create_price_above">, import("@sinclair/typebox").TLiteral<"create_price_below">, import("@sinclair/typebox").TLiteral<"create_price_above_sma">, import("@sinclair/typebox").TLiteral<"create_price_below_sma">, import("@sinclair/typebox").TLiteral<"create_rsi_above">, import("@sinclair/typebox").TLiteral<"create_rsi_below">, import("@sinclair/typebox").TLiteral<"create_volume_spike">, import("@sinclair/typebox").TLiteral<"create_percent_move_up">, import("@sinclair/typebox").TLiteral<"create_percent_move_down">, import("@sinclair/typebox").TLiteral<"create_sma_cross_above">, import("@sinclair/typebox").TLiteral<"create_sma_cross_below">, import("@sinclair/typebox").TLiteral<"set_enabled">, import("@sinclair/typebox").TLiteral<"update">, import("@sinclair/typebox").TLiteral<"delete">, import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"check">]>;
110
+ symbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
111
+ threshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
112
+ period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
113
+ fast_period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
114
+ slow_period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
115
+ cooldown_seconds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
116
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
117
+ condition_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create_price_above">, import("@sinclair/typebox").TLiteral<"create_price_below">, import("@sinclair/typebox").TLiteral<"create_price_above_sma">, import("@sinclair/typebox").TLiteral<"create_price_below_sma">, import("@sinclair/typebox").TLiteral<"create_rsi_above">, import("@sinclair/typebox").TLiteral<"create_rsi_below">, import("@sinclair/typebox").TLiteral<"create_volume_spike">, import("@sinclair/typebox").TLiteral<"create_percent_move_up">, import("@sinclair/typebox").TLiteral<"create_percent_move_down">, import("@sinclair/typebox").TLiteral<"create_sma_cross_above">, import("@sinclair/typebox").TLiteral<"create_sma_cross_below">]>>;
118
+ enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
119
+ check_after_create: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
120
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
121
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"run">, import("@sinclair/typebox").TLiteral<"configure">, import("@sinclair/typebox").TLiteral<"history">]>;
122
+ timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
123
+ local_time: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
124
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
125
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"acknowledge">]>;
126
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
127
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
128
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create">, import("@sinclair/typebox").TLiteral<"rename">, import("@sinclair/typebox").TLiteral<"add">, import("@sinclair/typebox").TLiteral<"update">, import("@sinclair/typebox").TLiteral<"remove">, import("@sinclair/typebox").TLiteral<"view">]>;
129
+ portfolio_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
130
+ new_portfolio_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
131
+ lot_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
132
+ symbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
133
+ shares: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
134
+ avg_cost: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
135
+ currency: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
136
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
137
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create">, import("@sinclair/typebox").TLiteral<"rename">, import("@sinclair/typebox").TLiteral<"delete">, import("@sinclair/typebox").TLiteral<"add">, import("@sinclair/typebox").TLiteral<"remove">, import("@sinclair/typebox").TLiteral<"check">]>;
138
+ watchlist_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
139
+ symbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
140
+ new_watchlist_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
141
+ }>, any> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
142
+ subreddit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
143
+ query: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
144
+ subreddits: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
145
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
146
+ }>, import("../types/sentiment.js").RedditSentimentResult | null> | import("@earendil-works/pi-agent-core").AgentTool<import("@sinclair/typebox").TObject<{
147
+ symbol: import("@sinclair/typebox").TString;
148
+ strategy: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"sma_crossover">, import("@sinclair/typebox").TLiteral<"sma_50_200_crossover">, import("@sinclair/typebox").TLiteral<"rsi_mean_reversion">]>;
149
+ period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"1y">, import("@sinclair/typebox").TLiteral<"2y">, import("@sinclair/typebox").TLiteral<"5y">]>>;
150
+ cost_bps: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
151
+ }>, any>)[];
@@ -98,4 +98,3 @@ export function getAllTools(options = {}) {
98
98
  createSentimentSummaryTool({ askUserHandler: options.askUserHandler }),
99
99
  ];
100
100
  }
101
- //# sourceMappingURL=index.js.map
@@ -32,6 +32,17 @@ export function registerAskUserTool(pi, askUserHandler) {
32
32
  details: { question, questionType, answer: null, cancelled: true },
33
33
  };
34
34
  }
35
+ if (!ctx && !askUserHandler) {
36
+ return {
37
+ content: [
38
+ {
39
+ type: "text",
40
+ text: "UI not available (non-interactive mode). Proceed with your best judgment and clearly disclose your assumption.",
41
+ },
42
+ ],
43
+ details: { question, questionType, answer: null, cancelled: true },
44
+ };
45
+ }
35
46
  const result = await promptUser(ctx, {
36
47
  question,
37
48
  questionType,
@@ -60,4 +71,3 @@ export function registerAskUserTool(pi, askUserHandler) {
60
71
  },
61
72
  });
62
73
  }
63
- //# sourceMappingURL=ask-user.js.map
@@ -118,4 +118,3 @@ function caveatText() {
118
118
  "- Polymarket is a crypto-settled venue with platform and settlement risks distinct from regulated exchanges.",
119
119
  ].join("\n");
120
120
  }
121
- //# sourceMappingURL=event-probabilities.js.map
@@ -1,5 +1,5 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
2
  import type { FearGreedData } from "../../types/sentiment.js";
3
3
  declare const params: import("@sinclair/typebox").TObject<{}>;
4
- export declare const fearGreedTool: AgentTool<typeof params, FearGreedData>;
4
+ export declare const fearGreedTool: AgentTool<typeof params, FearGreedData | null>;
5
5
  export {};
@@ -31,4 +31,3 @@ function buildGauge(value) {
31
31
  const bar = "█".repeat(pos) + "░".repeat(width - pos);
32
32
  return `[${bar}] ${value}/100`;
33
33
  }
34
- //# sourceMappingURL=fear-greed.js.map
@@ -6,5 +6,5 @@ declare const params: import("@sinclair/typebox").TObject<{
6
6
  }>;
7
7
  export declare const fredDataTool: AgentTool<typeof params, FredSeries | {
8
8
  credentialRequired: unknown;
9
- }>;
9
+ } | null>;
10
10
  export {};
@@ -24,6 +24,8 @@ export const fredDataTool = {
24
24
  async execute(_toolCallId, args) {
25
25
  return withCredentialCheck("fred", async () => {
26
26
  const apiKey = getConfig().fredApiKey;
27
+ if (!apiKey)
28
+ throw new Error("FRED credential is missing.");
27
29
  const seriesId = args.series_id.toUpperCase();
28
30
  const limit = normalizeLimit(seriesId, args.limit);
29
31
  const result = await wrapProvider("fred", () => getSeries(seriesId, apiKey, limit));
@@ -77,4 +79,3 @@ function formatDerivedChange(series) {
77
79
  const pct = (latest.value / prior.value - 1) * 100;
78
80
  return `Derived YoY change: ${pct.toFixed(2)}% (${prior.date} to ${latest.date}).`;
79
81
  }
80
- //# sourceMappingURL=fred-data.js.map
@@ -55,4 +55,3 @@ function buildRiskLines(id, bars) {
55
55
  `Value at Risk (95%, daily): ${(metrics.var95 * 100).toFixed(2)}%`,
56
56
  ];
57
57
  }
58
- //# sourceMappingURL=crypto-history.js.map
@@ -4,7 +4,7 @@ import type { CryptoPrice } from "../../types/market.js";
4
4
  declare const params: import("@sinclair/typebox").TObject<{
5
5
  id: import("@sinclair/typebox").TString;
6
6
  }>;
7
- export declare const cryptoPriceTool: AgentTool<typeof params, CryptoPrice & {
7
+ export declare const cryptoPriceTool: AgentTool<typeof params, (CryptoPrice & {
8
8
  freshness: FreshnessStamp;
9
- }>;
9
+ }) | null>;
10
10
  export {};
@@ -58,4 +58,3 @@ function formatLargeNumber(n) {
58
58
  return `${(n / 1e6).toFixed(2)}M`;
59
59
  return n.toLocaleString();
60
60
  }
61
- //# sourceMappingURL=crypto-price.js.map
@@ -260,4 +260,3 @@ function formatValue(value) {
260
260
  return value.join(", ");
261
261
  return String(value);
262
262
  }
263
- //# sourceMappingURL=screen-stocks.js.map
@@ -174,7 +174,7 @@ function normalizeTickerQuery(query) {
174
174
  return /^[A-Z0-9][A-Z0-9.-]{0,9}$/.test(normalized) ? normalized : undefined;
175
175
  }
176
176
  function symbolFromTvSymbol(tvSymbol) {
177
- return tvSymbol.includes(":") ? tvSymbol.split(":").at(-1) : tvSymbol;
177
+ return tvSymbol.includes(":") ? (tvSymbol.split(":").at(-1) ?? tvSymbol) : tvSymbol;
178
178
  }
179
179
  function exchangeFromTvSymbol(tvSymbol) {
180
180
  return tvSymbol.includes(":") ? tvSymbol.split(":")[0] : "";
@@ -182,4 +182,3 @@ function exchangeFromTvSymbol(tvSymbol) {
182
182
  function stringValue(value) {
183
183
  return typeof value === "string" ? value : undefined;
184
184
  }
185
- //# sourceMappingURL=search-ticker.js.map
@@ -78,4 +78,3 @@ export const stockHistoryTool = {
78
78
  return { content: [{ type: "text", text }], details: bars };
79
79
  },
80
80
  };
81
- //# sourceMappingURL=stock-history.js.map
@@ -4,7 +4,7 @@ import type { StockQuote } from "../../types/market.js";
4
4
  declare const params: import("@sinclair/typebox").TObject<{
5
5
  symbol: import("@sinclair/typebox").TString;
6
6
  }>;
7
- export declare const stockQuoteTool: AgentTool<typeof params, StockQuote & {
7
+ export declare const stockQuoteTool: AgentTool<typeof params, (StockQuote & {
8
8
  freshness: FreshnessStamp;
9
- }>;
9
+ }) | null>;
10
10
  export {};
@@ -61,4 +61,3 @@ function formatLargeNumber(n) {
61
61
  return `${(n / 1e6).toFixed(2)}M`;
62
62
  return n.toLocaleString();
63
63
  }
64
- //# sourceMappingURL=stock-quote.js.map
@@ -61,4 +61,3 @@ function cdf(x) {
61
61
  function pdf(x) {
62
62
  return Math.exp(-0.5 * x * x) / Math.sqrt(2 * Math.PI);
63
63
  }
64
- //# sourceMappingURL=greeks.js.map
@@ -6,7 +6,7 @@ declare const params: import("@sinclair/typebox").TObject<{
6
6
  expiration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
7
  type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"call">, import("@sinclair/typebox").TLiteral<"put">, import("@sinclair/typebox").TLiteral<"CALL">, import("@sinclair/typebox").TLiteral<"PUT">]>>;
8
8
  }>;
9
- export declare const optionChainTool: AgentTool<typeof params, OptionsChain & {
9
+ export declare const optionChainTool: AgentTool<typeof params, (OptionsChain & {
10
10
  freshness: FreshnessStamp;
11
- }>;
11
+ }) | null>;
12
12
  export {};
@@ -98,4 +98,3 @@ function formatContract(c) {
98
98
  const itm = c.inTheMoney ? "*" : " ";
99
99
  return `${itm}$${c.strike.toFixed(2)} | $${c.bid.toFixed(2)}/$${c.ask.toFixed(2)} | $${c.lastPrice.toFixed(2)} | ${c.volume} | ${c.openInterest} | ${(c.impliedVolatility * 100).toFixed(1)}% | ${c.greeks.delta.toFixed(3)} | ${c.greeks.gamma.toFixed(3)} | ${c.greeks.theta.toFixed(3)} | ${c.greeks.vega.toFixed(3)} | ${c.greeks.rho.toFixed(3)}`;
100
100
  }
101
- //# sourceMappingURL=option-chain.js.map
@@ -1,6 +1,6 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
2
  declare const params: import("@sinclair/typebox").TObject<{
3
- action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create_price_above">, import("@sinclair/typebox").TLiteral<"create_price_below">, import("@sinclair/typebox").TLiteral<"create_price_above_sma">, import("@sinclair/typebox").TLiteral<"create_price_below_sma">, import("@sinclair/typebox").TLiteral<"create_rsi_above">, import("@sinclair/typebox").TLiteral<"create_rsi_below">, import("@sinclair/typebox").TLiteral<"create_volume_spike">, import("@sinclair/typebox").TLiteral<"create_percent_move_up">, import("@sinclair/typebox").TLiteral<"create_percent_move_down">, import("@sinclair/typebox").TLiteral<"create_sma_cross_above">, import("@sinclair/typebox").TLiteral<"create_sma_cross_below">, import("@sinclair/typebox").TLiteral<"set_enabled">, import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"check">]>;
3
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create_price_above">, import("@sinclair/typebox").TLiteral<"create_price_below">, import("@sinclair/typebox").TLiteral<"create_price_above_sma">, import("@sinclair/typebox").TLiteral<"create_price_below_sma">, import("@sinclair/typebox").TLiteral<"create_rsi_above">, import("@sinclair/typebox").TLiteral<"create_rsi_below">, import("@sinclair/typebox").TLiteral<"create_volume_spike">, import("@sinclair/typebox").TLiteral<"create_percent_move_up">, import("@sinclair/typebox").TLiteral<"create_percent_move_down">, import("@sinclair/typebox").TLiteral<"create_sma_cross_above">, import("@sinclair/typebox").TLiteral<"create_sma_cross_below">, import("@sinclair/typebox").TLiteral<"set_enabled">, import("@sinclair/typebox").TLiteral<"update">, import("@sinclair/typebox").TLiteral<"delete">, import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"check">]>;
4
4
  symbol: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
5
5
  threshold: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
6
6
  period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
@@ -8,6 +8,7 @@ declare const params: import("@sinclair/typebox").TObject<{
8
8
  slow_period: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
9
9
  cooldown_seconds: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
10
10
  id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
11
+ condition_action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create_price_above">, import("@sinclair/typebox").TLiteral<"create_price_below">, import("@sinclair/typebox").TLiteral<"create_price_above_sma">, import("@sinclair/typebox").TLiteral<"create_price_below_sma">, import("@sinclair/typebox").TLiteral<"create_rsi_above">, import("@sinclair/typebox").TLiteral<"create_rsi_below">, import("@sinclair/typebox").TLiteral<"create_volume_spike">, import("@sinclair/typebox").TLiteral<"create_percent_move_up">, import("@sinclair/typebox").TLiteral<"create_percent_move_down">, import("@sinclair/typebox").TLiteral<"create_sma_cross_above">, import("@sinclair/typebox").TLiteral<"create_sma_cross_below">]>>;
11
12
  enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
12
13
  check_after_create: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
13
14
  }>;
@@ -16,6 +16,7 @@ const ACTION_DESCRIPTION = [
16
16
  "create_sma_cross_above/create_sma_cross_below for fast/slow SMA crossing alerts,",
17
17
  "create_rsi_above/create_rsi_below for RSI alerts,",
18
18
  "create_volume_spike for volume alerts, set_enabled to enable or disable an alert,",
19
+ "update to replace an alert rule definition, delete to remove a rule,",
19
20
  "and status to inspect local runner/check history.",
20
21
  "When the user asks to create an alert and check it now in the same request,",
21
22
  "set check_after_create to true on the create action.",
@@ -34,6 +35,8 @@ const params = Type.Object({
34
35
  Type.Literal("create_sma_cross_above"),
35
36
  Type.Literal("create_sma_cross_below"),
36
37
  Type.Literal("set_enabled"),
38
+ Type.Literal("update"),
39
+ Type.Literal("delete"),
37
40
  Type.Literal("list"),
38
41
  Type.Literal("status"),
39
42
  Type.Literal("check"),
@@ -58,6 +61,21 @@ const params = Type.Object({
58
61
  description: "Cooldown between repeated trigger events. Default: 3600",
59
62
  })),
60
63
  id: Type.Optional(Type.Number({ description: "Alert rule id for update actions" })),
64
+ condition_action: Type.Optional(Type.Union([
65
+ Type.Literal("create_price_above"),
66
+ Type.Literal("create_price_below"),
67
+ Type.Literal("create_price_above_sma"),
68
+ Type.Literal("create_price_below_sma"),
69
+ Type.Literal("create_rsi_above"),
70
+ Type.Literal("create_rsi_below"),
71
+ Type.Literal("create_volume_spike"),
72
+ Type.Literal("create_percent_move_up"),
73
+ Type.Literal("create_percent_move_down"),
74
+ Type.Literal("create_sma_cross_above"),
75
+ Type.Literal("create_sma_cross_below"),
76
+ ], {
77
+ description: "Create-style alert condition action to use when updating an existing alert rule.",
78
+ })),
61
79
  enabled: Type.Optional(Type.Boolean({ description: "Whether an alert rule is enabled" })),
62
80
  check_after_create: Type.Optional(Type.Boolean({
63
81
  description: "Set true only when the user asks to check/run alerts immediately after creating this alert in the same request.",
@@ -66,7 +84,7 @@ const params = Type.Object({
66
84
  export const alertsTool = {
67
85
  name: "manage_alerts",
68
86
  label: "Alerts",
69
- description: "Create, pause/resume, list, check, and inspect status for durable local alerts. Actions include create_price_above, create_price_below, create_price_above_sma, create_price_below_sma, create_rsi_above, create_rsi_below, create_volume_spike, create_percent_move_up, create_percent_move_down, create_sma_cross_above, create_sma_cross_below, set_enabled, list, status, and check. Local background monitoring runs only while an OpenCandle writer/monitor process is active; manual checks are always available. If the user asks to create an alert and check it now, use the create action with check_after_create=true.",
87
+ description: "Create, update, delete, pause/resume, list, check, and inspect status for durable local alerts. Actions include create_price_above, create_price_below, create_price_above_sma, create_price_below_sma, create_rsi_above, create_rsi_below, create_volume_spike, create_percent_move_up, create_percent_move_down, create_sma_cross_above, create_sma_cross_below, set_enabled, update, delete, list, status, and check. Local background monitoring runs only while an OpenCandle writer/monitor process is active; manual checks are always available. If the user asks to create an alert and check it now, use the create action with check_after_create=true.",
70
88
  parameters: params,
71
89
  async execute(_toolCallId, args) {
72
90
  const db = initDefaultDatabase();
@@ -278,6 +296,62 @@ export const alertsTool = {
278
296
  details: rule,
279
297
  };
280
298
  }
299
+ if (args.action === "update") {
300
+ if (args.id == null) {
301
+ throw new Error("id is required for update.");
302
+ }
303
+ const existing = service.listAlertRules().find((rule) => rule.id === args.id);
304
+ if (existing == null) {
305
+ return {
306
+ content: [
307
+ {
308
+ type: "text",
309
+ text: `Alert #${args.id} not found. Use the list action to see alert ids.`,
310
+ },
311
+ ],
312
+ details: null,
313
+ };
314
+ }
315
+ const conditionAction = args.condition_action ?? createActionFromRule(existing);
316
+ if (conditionAction == null) {
317
+ throw new Error(`Alert #${args.id} uses condition ${existing.conditionType}, which cannot be updated without condition_action.`);
318
+ }
319
+ const payload = await buildAlertRulePayload(service, conditionAction, args, existing);
320
+ if (payload.status === "needs_selection")
321
+ return candidateResult(payload.resolution, "alert");
322
+ const rule = service.updateAlertRule(args.id, {
323
+ ...payload.input,
324
+ enabled: args.enabled,
325
+ });
326
+ return {
327
+ content: [
328
+ {
329
+ type: "text",
330
+ text: rule == null
331
+ ? `Alert #${args.id} not found. Use the list action to see alert ids.`
332
+ : `Updated alert #${rule.id}.`,
333
+ },
334
+ ],
335
+ details: rule,
336
+ };
337
+ }
338
+ if (args.action === "delete") {
339
+ if (args.id == null) {
340
+ throw new Error("id is required for delete.");
341
+ }
342
+ const rule = service.deleteAlertRule(args.id);
343
+ return {
344
+ content: [
345
+ {
346
+ type: "text",
347
+ text: rule == null
348
+ ? `Alert #${args.id} not found. Use the list action to see alert ids.`
349
+ : `Deleted alert #${rule.id}.`,
350
+ },
351
+ ],
352
+ details: rule,
353
+ };
354
+ }
281
355
  const result = await checkAlerts(service);
282
356
  return {
283
357
  content: [{ type: "text", text: result.lines.join("\n") }],
@@ -289,6 +363,159 @@ export const alertsTool = {
289
363
  }
290
364
  },
291
365
  };
366
+ async function buildAlertRulePayload(service, action, args, existing) {
367
+ const instrument = await resolveAlertInstrument(service, args.symbol, existing);
368
+ if (instrument.status === "needs_selection")
369
+ return instrument;
370
+ const existingCondition = conditionRecord(existing);
371
+ const cooldownSeconds = args.cooldown_seconds === undefined
372
+ ? undefined
373
+ : validateCooldownSeconds(args.cooldown_seconds);
374
+ const base = {
375
+ scopeType: "instrument",
376
+ instrumentId: instrument.id,
377
+ conditionVersion: ALERT_CONDITION_VERSION,
378
+ cooldownSeconds,
379
+ };
380
+ if (action === "create_price_above" || action === "create_price_below") {
381
+ const threshold = numberInput(args.threshold, existingCondition, "threshold", "threshold");
382
+ const isAbove = action === "create_price_above";
383
+ return {
384
+ status: "ok",
385
+ input: {
386
+ ...base,
387
+ conditionType: isAbove ? "price_crosses_above" : "price_crosses_below",
388
+ condition: isAbove ? priceCrossesAbove(threshold) : priceCrossesBelow(threshold),
389
+ timeframe: "quote",
390
+ },
391
+ };
392
+ }
393
+ if (action === "create_price_above_sma" || action === "create_price_below_sma") {
394
+ const period = validateLookbackPeriod(numberInput(args.period, existingCondition, "period", "period", 50), 200);
395
+ return {
396
+ status: "ok",
397
+ input: {
398
+ ...base,
399
+ conditionType: "price_crosses_sma",
400
+ condition: priceCrossesSma(period, action === "create_price_above_sma" ? "above" : "below"),
401
+ timeframe: "1d",
402
+ },
403
+ };
404
+ }
405
+ if (action === "create_rsi_above" || action === "create_rsi_below") {
406
+ const threshold = numberInput(args.threshold, existingCondition, "threshold", "threshold");
407
+ const period = validateLookbackPeriod(numberInput(args.period, existingCondition, "period", "period", 14), 100);
408
+ return {
409
+ status: "ok",
410
+ input: {
411
+ ...base,
412
+ conditionType: "rsi_threshold",
413
+ condition: rsiThreshold(period, threshold, action === "create_rsi_above" ? "above" : "below"),
414
+ timeframe: "1d",
415
+ },
416
+ };
417
+ }
418
+ if (action === "create_volume_spike") {
419
+ const period = validateLookbackPeriod(numberInput(args.period, existingCondition, "lookback_period", "period", 20), 100);
420
+ const multiplier = numberInput(args.threshold, existingCondition, "multiplier", "threshold", 2);
421
+ return {
422
+ status: "ok",
423
+ input: {
424
+ ...base,
425
+ conditionType: "volume_spike",
426
+ condition: volumeSpike(period, multiplier),
427
+ timeframe: "1d",
428
+ },
429
+ };
430
+ }
431
+ if (action === "create_percent_move_up" || action === "create_percent_move_down") {
432
+ const threshold = numberInput(args.threshold, existingCondition, "percent", "threshold");
433
+ if (threshold <= 0) {
434
+ throw new Error("threshold must be greater than 0 for percent-move alert actions.");
435
+ }
436
+ return {
437
+ status: "ok",
438
+ input: {
439
+ ...base,
440
+ conditionType: "percent_move",
441
+ condition: percentMove(action === "create_percent_move_up" ? "up" : "down", threshold),
442
+ timeframe: "1d",
443
+ },
444
+ };
445
+ }
446
+ const fastPeriod = numberInput(args.fast_period, existingCondition, "fast_period", "fast_period", 50);
447
+ const slowPeriod = numberInput(args.slow_period, existingCondition, "slow_period", "slow_period", 200);
448
+ if (!Number.isInteger(fastPeriod) || !Number.isInteger(slowPeriod)) {
449
+ throw new Error("fast_period and slow_period must be whole-number lookback periods for SMA-cross alert actions.");
450
+ }
451
+ if (fastPeriod <= 0 || slowPeriod <= 0) {
452
+ throw new Error("fast_period and slow_period must be greater than 0 for SMA-cross alert actions.");
453
+ }
454
+ if (fastPeriod >= slowPeriod) {
455
+ throw new Error("fast_period must be less than slow_period for SMA-cross alert actions.");
456
+ }
457
+ if (slowPeriod > 400) {
458
+ throw new Error("slow_period must be at most 400 so alert checks can evaluate it against the runner's 2y daily history window.");
459
+ }
460
+ return {
461
+ status: "ok",
462
+ input: {
463
+ ...base,
464
+ conditionType: "sma_cross",
465
+ condition: smaCross(fastPeriod, slowPeriod, action === "create_sma_cross_above" ? "above" : "below"),
466
+ timeframe: "1d",
467
+ },
468
+ };
469
+ }
470
+ async function resolveAlertInstrument(service, symbol, existing) {
471
+ if (symbol) {
472
+ const resolution = await resolveInstrumentForMutation(symbol);
473
+ if (resolution.status === "needs_selection")
474
+ return { status: "needs_selection", resolution };
475
+ return { status: "ok", id: service.upsertInstrumentRecord(resolution.instrument).id };
476
+ }
477
+ if (existing?.instrumentId != null)
478
+ return { status: "ok", id: existing.instrumentId };
479
+ throw new Error("symbol is required for update when the existing alert is not instrument-scoped.");
480
+ }
481
+ function conditionRecord(rule) {
482
+ return typeof rule?.conditionJson === "object" && rule.conditionJson !== null
483
+ ? rule.conditionJson
484
+ : {};
485
+ }
486
+ function numberInput(value, existing, existingKey, label, fallback) {
487
+ if (value !== undefined)
488
+ return value;
489
+ const existingValue = existing[existingKey];
490
+ if (typeof existingValue === "number")
491
+ return existingValue;
492
+ if (fallback !== undefined)
493
+ return fallback;
494
+ throw new Error(`${label} is required for update.`);
495
+ }
496
+ function createActionFromRule(rule) {
497
+ const condition = conditionRecord(rule);
498
+ const direction = condition.direction;
499
+ if (rule.conditionType === "price_crosses_above")
500
+ return "create_price_above";
501
+ if (rule.conditionType === "price_crosses_below")
502
+ return "create_price_below";
503
+ if (rule.conditionType === "price_crosses_sma") {
504
+ return direction === "below" ? "create_price_below_sma" : "create_price_above_sma";
505
+ }
506
+ if (rule.conditionType === "rsi_threshold") {
507
+ return direction === "below" ? "create_rsi_below" : "create_rsi_above";
508
+ }
509
+ if (rule.conditionType === "volume_spike")
510
+ return "create_volume_spike";
511
+ if (rule.conditionType === "percent_move") {
512
+ return direction === "down" ? "create_percent_move_down" : "create_percent_move_up";
513
+ }
514
+ if (rule.conditionType === "sma_cross") {
515
+ return direction === "below" ? "create_sma_cross_below" : "create_sma_cross_above";
516
+ }
517
+ return null;
518
+ }
292
519
  function validateLookbackPeriod(period, maxPeriod) {
293
520
  if (!Number.isInteger(period) || period <= 0) {
294
521
  throw new Error("period must be a whole-number lookback period greater than 0 for indicator alert actions.");
@@ -354,4 +581,3 @@ async function createResultMaybeChecked(service, rule, createdText, checkAfterCr
354
581
  },
355
582
  };
356
583
  }
357
- //# sourceMappingURL=alerts.js.map