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.
- package/README.md +25 -28
- package/dist/analysts/contracts.js +0 -1
- package/dist/analysts/orchestrator.d.ts +2 -0
- package/dist/analysts/orchestrator.js +19 -1
- package/dist/cli-main.js +13 -7
- package/dist/cli-options.d.ts +4 -0
- package/dist/cli-options.js +33 -0
- package/dist/cli.js +8 -3
- package/dist/config.js +0 -1
- package/dist/doctor/cli-command.js +2 -1
- package/dist/doctor/render.js +0 -1
- package/dist/doctor/report.js +41 -12
- package/dist/gui/server/ask-user-bridge.d.ts +19 -0
- package/dist/gui/server/ask-user-bridge.js +55 -0
- package/dist/gui/server/automation-heartbeat.d.ts +25 -0
- package/dist/gui/server/automation-heartbeat.js +61 -0
- package/dist/gui/server/background-quotes.d.ts +39 -0
- package/dist/gui/server/background-quotes.js +71 -0
- package/dist/gui/server/chat-event-adapter.d.ts +16 -0
- package/dist/gui/server/chat-event-adapter.js +263 -0
- package/dist/gui/server/gui-session-manager.d.ts +2 -0
- package/dist/gui/server/gui-session-manager.js +4 -0
- package/dist/gui/server/http-routes.d.ts +69 -0
- package/dist/gui/server/http-routes.js +1008 -0
- package/dist/gui/server/invoke-tool.d.ts +47 -0
- package/dist/gui/server/invoke-tool.js +373 -0
- package/dist/gui/server/live-chat-event-adapter.d.ts +19 -0
- package/dist/gui/server/live-chat-event-adapter.js +206 -0
- package/dist/gui/server/local-session-coordinator.d.ts +26 -0
- package/dist/gui/server/local-session-coordinator.js +53 -0
- package/dist/gui/server/market-state-api.d.ts +138 -0
- package/dist/gui/server/market-state-api.js +355 -0
- package/dist/gui/server/model-setup.d.ts +64 -0
- package/dist/gui/server/model-setup.js +150 -0
- package/dist/gui/server/private-api-access.d.ts +6 -0
- package/dist/gui/server/private-api-access.js +53 -0
- package/dist/gui/server/projector.d.ts +49 -0
- package/dist/gui/server/projector.js +296 -0
- package/dist/gui/server/prompt-observation.d.ts +8 -0
- package/dist/gui/server/prompt-observation.js +43 -0
- package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
- package/dist/gui/server/quote-snapshot-store.js +49 -0
- package/dist/gui/server/server.d.ts +1 -0
- package/dist/gui/server/server.js +259 -0
- package/dist/gui/server/session-actions.d.ts +60 -0
- package/dist/gui/server/session-actions.js +218 -0
- package/dist/gui/server/session-entry-wait.d.ts +27 -0
- package/dist/gui/server/session-entry-wait.js +129 -0
- package/dist/gui/server/session-list.d.ts +2 -0
- package/dist/gui/server/session-list.js +11 -0
- package/dist/gui/server/shutdown.d.ts +10 -0
- package/dist/gui/server/shutdown.js +29 -0
- package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
- package/dist/gui/server/tool-invoke-ack.js +26 -0
- package/dist/gui/server/tool-metadata.d.ts +93 -0
- package/dist/gui/server/tool-metadata.js +148 -0
- package/dist/gui/server/websocket.d.ts +9 -0
- package/dist/gui/server/websocket.js +124 -0
- package/dist/gui/server/writer-lock.d.ts +1 -0
- package/dist/gui/server/writer-lock.js +1 -0
- package/dist/gui/server/ws-hub.d.ts +50 -0
- package/dist/gui/server/ws-hub.js +284 -0
- package/dist/gui/shared/chat-events.d.ts +174 -0
- package/dist/gui/shared/chat-events.js +13 -0
- package/dist/gui/shared/event-reducer.d.ts +3 -0
- package/dist/gui/shared/event-reducer.js +187 -0
- package/dist/index.js +0 -1
- package/dist/infra/cache.d.ts +6 -0
- package/dist/infra/cache.js +16 -7
- package/dist/infra/freshness.d.ts +21 -0
- package/dist/infra/freshness.js +118 -0
- package/dist/infra/http-client.js +1 -2
- package/dist/infra/index.js +0 -1
- package/dist/infra/market-calendar.d.ts +14 -0
- package/dist/infra/market-calendar.js +136 -0
- package/dist/infra/native-dependencies.js +0 -1
- package/dist/infra/node-version.js +0 -1
- package/dist/infra/open-url.js +0 -1
- package/dist/infra/opencandle-paths.js +0 -1
- package/dist/infra/rate-limiter.js +1 -1
- package/dist/market-state/alert-conditions.js +0 -1
- package/dist/market-state/alert-runner.d.ts +1 -0
- package/dist/market-state/alert-runner.js +5 -4
- package/dist/market-state/daily-report.js +0 -1
- package/dist/market-state/local-automation-service.js +0 -1
- package/dist/market-state/notification-delivery.js +0 -1
- package/dist/market-state/resolve-for-mutation.js +0 -1
- package/dist/market-state/resolve.js +0 -1
- package/dist/market-state/service.d.ts +26 -21
- package/dist/market-state/service.js +175 -36
- package/dist/market-state/summaries.d.ts +8 -0
- package/dist/market-state/summaries.js +58 -0
- package/dist/memory/index.js +0 -1
- package/dist/memory/manager.js +0 -1
- package/dist/memory/preference-extractor.js +0 -1
- package/dist/memory/retrieval.js +0 -1
- package/dist/memory/sqlite.js +60 -11
- package/dist/memory/storage.js +0 -1
- package/dist/memory/tool-defaults.js +0 -1
- package/dist/memory/types.js +0 -1
- package/dist/monitor.js +0 -1
- package/dist/onboarding/connect.js +0 -1
- package/dist/onboarding/credential-interceptor.js +0 -1
- package/dist/onboarding/degradation-accumulator.js +0 -1
- package/dist/onboarding/prompt-user.d.ts +1 -1
- package/dist/onboarding/prompt-user.js +0 -1
- package/dist/onboarding/provider-status.js +0 -1
- package/dist/onboarding/providers.d.ts +25 -1
- package/dist/onboarding/providers.js +26 -1
- package/dist/onboarding/state.js +0 -1
- package/dist/onboarding/tool-helpers.js +0 -1
- package/dist/onboarding/tool-tags.js +0 -1
- package/dist/onboarding/validate-model-key.d.ts +17 -0
- package/dist/onboarding/validate-model-key.js +54 -0
- package/dist/onboarding/validation.js +0 -1
- package/dist/pi/opencandle-extension.js +46 -7
- package/dist/pi/session-action-dedupe.js +0 -1
- package/dist/pi/session-storage.js +0 -1
- package/dist/pi/session-writer-lock.js +0 -1
- package/dist/pi/session.js +0 -1
- package/dist/pi/setup.d.ts +2 -0
- package/dist/pi/setup.js +10 -3
- package/dist/pi/tool-adapter.js +0 -1
- package/dist/pi/tui-session-coordinator.js +0 -1
- package/dist/prompts/context-builder.js +1 -2
- package/dist/prompts/disclaimer.js +0 -1
- package/dist/prompts/policy-cards.js +0 -1
- package/dist/prompts/sections.js +0 -1
- package/dist/prompts/symbol-preflight.js +0 -1
- package/dist/prompts/workflow-prompts.js +0 -1
- package/dist/providers/alpha-vantage.js +8 -3
- package/dist/providers/coingecko.js +1 -1
- package/dist/providers/errors.js +0 -1
- package/dist/providers/exa-search.js +11 -10
- package/dist/providers/external-tool-command.js +0 -1
- package/dist/providers/external-tool-error.js +0 -1
- package/dist/providers/fear-greed.js +0 -1
- package/dist/providers/finnhub.js +0 -1
- package/dist/providers/fred.js +0 -1
- package/dist/providers/index.js +0 -1
- package/dist/providers/polymarket.d.ts +2 -0
- package/dist/providers/polymarket.js +162 -0
- package/dist/providers/provider-credential-error.js +0 -1
- package/dist/providers/reddit-cli.js +0 -1
- package/dist/providers/reddit.js +0 -1
- package/dist/providers/sec-edgar.js +0 -1
- package/dist/providers/tradingview.js +1 -2
- package/dist/providers/twitter-cli.js +0 -1
- package/dist/providers/twitter.js +0 -1
- package/dist/providers/web-search.js +15 -12
- package/dist/providers/with-fallback.js +0 -1
- package/dist/providers/wrap-provider.js +5 -4
- package/dist/providers/yahoo-finance.d.ts +3 -0
- package/dist/providers/yahoo-finance.js +272 -13
- package/dist/routing/classify-intent.js +0 -1
- package/dist/routing/defaults.js +0 -1
- package/dist/routing/entity-extractor.js +18 -3
- package/dist/routing/fund-symbols.js +0 -1
- package/dist/routing/horizon.js +0 -1
- package/dist/routing/index.js +0 -1
- package/dist/routing/legacy-rule-router.js +0 -1
- package/dist/routing/planning.js +0 -1
- package/dist/routing/route-manifest.js +1 -2
- package/dist/routing/router-llm-client.d.ts +2 -2
- package/dist/routing/router-llm-client.js +18 -4
- package/dist/routing/router-prompt.js +0 -1
- package/dist/routing/router-types.js +0 -1
- package/dist/routing/router.d.ts +1 -1
- package/dist/routing/router.js +274 -6
- package/dist/routing/slot-resolver.d.ts +1 -0
- package/dist/routing/slot-resolver.js +1 -2
- package/dist/routing/symbol-disambiguator.js +0 -1
- package/dist/routing/turn-context.js +0 -1
- package/dist/routing/types.js +0 -1
- package/dist/runtime/answer-contracts.js +0 -1
- package/dist/runtime/artifact-contracts.js +0 -1
- package/dist/runtime/evidence.d.ts +1 -0
- package/dist/runtime/evidence.js +0 -1
- package/dist/runtime/numeric-claims.d.ts +23 -0
- package/dist/runtime/numeric-claims.js +99 -0
- package/dist/runtime/planning-evidence.js +1 -77
- package/dist/runtime/prompt-step.d.ts +10 -1
- package/dist/runtime/prompt-step.js +116 -3
- package/dist/runtime/provider-tracker.js +0 -1
- package/dist/runtime/run-context.js +0 -1
- package/dist/runtime/session-coordinator.d.ts +11 -1
- package/dist/runtime/session-coordinator.js +352 -50
- package/dist/runtime/session-title.js +0 -1
- package/dist/runtime/tool-defaults-wrapper.js +0 -1
- package/dist/runtime/validation.d.ts +3 -1
- package/dist/runtime/validation.js +0 -1
- package/dist/runtime/workflow-events.d.ts +1 -1
- package/dist/runtime/workflow-events.js +0 -1
- package/dist/runtime/workflow-runner.d.ts +1 -0
- package/dist/runtime/workflow-runner.js +8 -3
- package/dist/runtime/workflow-types.d.ts +3 -0
- package/dist/runtime/workflow-types.js +0 -1
- package/dist/sentiment/adapters/finnhub.js +0 -1
- package/dist/sentiment/adapters/reddit.js +0 -1
- package/dist/sentiment/adapters/twitter.js +0 -1
- package/dist/sentiment/adapters/web.js +0 -1
- package/dist/sentiment/index.js +4 -2
- package/dist/sentiment/insights.js +0 -1
- package/dist/sentiment/keywords.js +0 -1
- package/dist/sentiment/pipeline.js +0 -1
- package/dist/sentiment/scorer.js +0 -1
- package/dist/sentiment/store.js +0 -1
- package/dist/sentiment/trends.js +0 -1
- package/dist/sentiment/types.js +0 -1
- package/dist/system-prompt.js +0 -1
- package/dist/tool-kit.js +0 -1
- package/dist/tools/fundamentals/company-overview.d.ts +1 -1
- package/dist/tools/fundamentals/company-overview.js +2 -1
- package/dist/tools/fundamentals/comps.d.ts +1 -0
- package/dist/tools/fundamentals/comps.js +25 -12
- package/dist/tools/fundamentals/dcf.js +183 -113
- package/dist/tools/fundamentals/earnings.d.ts +1 -1
- package/dist/tools/fundamentals/earnings.js +2 -1
- package/dist/tools/fundamentals/financials.js +2 -1
- package/dist/tools/fundamentals/sec-filings.js +0 -1
- package/dist/tools/index.d.ts +117 -2
- package/dist/tools/index.js +3 -1
- package/dist/tools/interaction/ask-user.js +11 -1
- package/dist/tools/macro/event-probabilities.d.ts +8 -0
- package/dist/tools/macro/event-probabilities.js +120 -0
- package/dist/tools/macro/fear-greed.d.ts +1 -1
- package/dist/tools/macro/fear-greed.js +0 -1
- package/dist/tools/macro/fred-data.d.ts +1 -1
- package/dist/tools/macro/fred-data.js +2 -1
- package/dist/tools/market/crypto-history.js +0 -1
- package/dist/tools/market/crypto-price.d.ts +4 -1
- package/dist/tools/market/crypto-price.js +10 -2
- package/dist/tools/market/screen-stocks.js +14 -4
- package/dist/tools/market/search-ticker.js +1 -2
- package/dist/tools/market/stock-history.js +0 -1
- package/dist/tools/market/stock-quote.d.ts +4 -1
- package/dist/tools/market/stock-quote.js +9 -5
- package/dist/tools/options/greeks.js +0 -1
- package/dist/tools/options/option-chain.d.ts +4 -1
- package/dist/tools/options/option-chain.js +12 -2
- package/dist/tools/portfolio/alerts.d.ts +2 -1
- package/dist/tools/portfolio/alerts.js +228 -2
- package/dist/tools/portfolio/correlation.js +23 -5
- package/dist/tools/portfolio/daily-report.js +0 -1
- package/dist/tools/portfolio/holdings-overlap.js +0 -1
- package/dist/tools/portfolio/notifications.js +0 -1
- package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
- package/dist/tools/portfolio/risk-analysis.js +1 -2
- package/dist/tools/portfolio/tracker.d.ts +3 -1
- package/dist/tools/portfolio/tracker.js +57 -10
- package/dist/tools/portfolio/watchlist.d.ts +3 -6
- package/dist/tools/portfolio/watchlist.js +101 -110
- package/dist/tools/sentiment/insight-format.js +0 -1
- package/dist/tools/sentiment/query-match.js +0 -1
- package/dist/tools/sentiment/reddit-sentiment.js +0 -1
- package/dist/tools/sentiment/sentiment-summary.js +8 -4
- package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
- package/dist/tools/sentiment/sentiment-trend.js +6 -2
- package/dist/tools/sentiment/twitter-sentiment.js +0 -1
- package/dist/tools/sentiment/untrusted-text.js +0 -1
- package/dist/tools/sentiment/web-search.d.ts +1 -1
- package/dist/tools/sentiment/web-search.js +0 -1
- package/dist/tools/sentiment/web-sentiment.js +0 -1
- package/dist/tools/technical/backtest.js +0 -1
- package/dist/tools/technical/indicators.js +1 -2
- package/dist/types/fundamentals.d.ts +1 -0
- package/dist/types/fundamentals.js +0 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +0 -1
- package/dist/types/macro.js +0 -1
- package/dist/types/market.d.ts +8 -0
- package/dist/types/market.js +0 -1
- package/dist/types/options.d.ts +1 -0
- package/dist/types/options.js +0 -1
- package/dist/types/portfolio.js +0 -1
- package/dist/types/prediction-markets.d.ts +13 -0
- package/dist/types/prediction-markets.js +1 -0
- package/dist/types/sentiment.js +0 -1
- package/dist/workflows/compare-assets.js +0 -1
- package/dist/workflows/index.js +0 -1
- package/dist/workflows/options-screener.js +0 -1
- package/dist/workflows/portfolio-builder.js +0 -1
- package/gui/web/dist/assets/CatalogOverlay-CAc7e3Pf.js +1 -0
- package/gui/web/dist/assets/index-BOEKd9wT.css +2 -0
- package/gui/web/dist/assets/index-C-H05cQ2.js +65 -0
- package/gui/web/dist/index.html +2 -2
- package/package.json +16 -22
- package/dist/analysts/contracts.js.map +0 -1
- package/dist/analysts/orchestrator.js.map +0 -1
- package/dist/cli-main.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/doctor/cli-command.js.map +0 -1
- package/dist/doctor/render.js.map +0 -1
- package/dist/doctor/report.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/infra/cache.js.map +0 -1
- package/dist/infra/http-client.js.map +0 -1
- package/dist/infra/index.js.map +0 -1
- package/dist/infra/native-dependencies.js.map +0 -1
- package/dist/infra/node-version.js.map +0 -1
- package/dist/infra/open-url.js.map +0 -1
- package/dist/infra/opencandle-paths.js.map +0 -1
- package/dist/infra/rate-limiter.js.map +0 -1
- package/dist/market-state/alert-conditions.js.map +0 -1
- package/dist/market-state/alert-runner.js.map +0 -1
- package/dist/market-state/daily-report.js.map +0 -1
- package/dist/market-state/local-automation-service.js.map +0 -1
- package/dist/market-state/notification-delivery.js.map +0 -1
- package/dist/market-state/resolve-for-mutation.js.map +0 -1
- package/dist/market-state/resolve.js.map +0 -1
- package/dist/market-state/service.js.map +0 -1
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/manager.js.map +0 -1
- package/dist/memory/preference-extractor.js.map +0 -1
- package/dist/memory/retrieval.js.map +0 -1
- package/dist/memory/sqlite.js.map +0 -1
- package/dist/memory/storage.js.map +0 -1
- package/dist/memory/tool-defaults.js.map +0 -1
- package/dist/memory/types.js.map +0 -1
- package/dist/monitor.js.map +0 -1
- package/dist/onboarding/connect.js.map +0 -1
- package/dist/onboarding/credential-interceptor.js.map +0 -1
- package/dist/onboarding/degradation-accumulator.js.map +0 -1
- package/dist/onboarding/prompt-user.js.map +0 -1
- package/dist/onboarding/provider-status.js.map +0 -1
- package/dist/onboarding/providers.js.map +0 -1
- package/dist/onboarding/state.js.map +0 -1
- package/dist/onboarding/tool-helpers.js.map +0 -1
- package/dist/onboarding/tool-tags.js.map +0 -1
- package/dist/onboarding/validation.js.map +0 -1
- package/dist/pi/opencandle-extension.js.map +0 -1
- package/dist/pi/session-action-dedupe.js.map +0 -1
- package/dist/pi/session-storage.js.map +0 -1
- package/dist/pi/session-writer-lock.js.map +0 -1
- package/dist/pi/session.js.map +0 -1
- package/dist/pi/setup.js.map +0 -1
- package/dist/pi/tool-adapter.js.map +0 -1
- package/dist/pi/tui-session-coordinator.js.map +0 -1
- package/dist/prompts/context-builder.js.map +0 -1
- package/dist/prompts/disclaimer.js.map +0 -1
- package/dist/prompts/policy-cards.js.map +0 -1
- package/dist/prompts/sections.js.map +0 -1
- package/dist/prompts/symbol-preflight.js.map +0 -1
- package/dist/prompts/workflow-prompts.js.map +0 -1
- package/dist/providers/alpha-vantage.js.map +0 -1
- package/dist/providers/coingecko.js.map +0 -1
- package/dist/providers/errors.js.map +0 -1
- package/dist/providers/exa-search.js.map +0 -1
- package/dist/providers/external-tool-command.js.map +0 -1
- package/dist/providers/external-tool-error.js.map +0 -1
- package/dist/providers/fear-greed.js.map +0 -1
- package/dist/providers/finnhub.js.map +0 -1
- package/dist/providers/fred.js.map +0 -1
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/provider-credential-error.js.map +0 -1
- package/dist/providers/reddit-cli.js.map +0 -1
- package/dist/providers/reddit.js.map +0 -1
- package/dist/providers/sec-edgar.js.map +0 -1
- package/dist/providers/tradingview.js.map +0 -1
- package/dist/providers/twitter-cli.js.map +0 -1
- package/dist/providers/twitter.js.map +0 -1
- package/dist/providers/web-search.js.map +0 -1
- package/dist/providers/with-fallback.js.map +0 -1
- package/dist/providers/wrap-provider.js.map +0 -1
- package/dist/providers/yahoo-finance.js.map +0 -1
- package/dist/routing/classify-intent.js.map +0 -1
- package/dist/routing/defaults.js.map +0 -1
- package/dist/routing/entity-extractor.js.map +0 -1
- package/dist/routing/fund-symbols.js.map +0 -1
- package/dist/routing/horizon.js.map +0 -1
- package/dist/routing/index.js.map +0 -1
- package/dist/routing/legacy-rule-router.js.map +0 -1
- package/dist/routing/planning.js.map +0 -1
- package/dist/routing/route-manifest.js.map +0 -1
- package/dist/routing/router-llm-client.js.map +0 -1
- package/dist/routing/router-prompt.js.map +0 -1
- package/dist/routing/router-types.js.map +0 -1
- package/dist/routing/router.js.map +0 -1
- package/dist/routing/slot-resolver.js.map +0 -1
- package/dist/routing/symbol-disambiguator.js.map +0 -1
- package/dist/routing/turn-context.js.map +0 -1
- package/dist/routing/types.js.map +0 -1
- package/dist/runtime/answer-contracts.js.map +0 -1
- package/dist/runtime/artifact-contracts.js.map +0 -1
- package/dist/runtime/evidence.js.map +0 -1
- package/dist/runtime/planning-evidence.js.map +0 -1
- package/dist/runtime/prompt-step.js.map +0 -1
- package/dist/runtime/provider-tracker.js.map +0 -1
- package/dist/runtime/run-context.js.map +0 -1
- package/dist/runtime/session-coordinator.js.map +0 -1
- package/dist/runtime/session-title.js.map +0 -1
- package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
- package/dist/runtime/validation.js.map +0 -1
- package/dist/runtime/workflow-events.js.map +0 -1
- package/dist/runtime/workflow-runner.js.map +0 -1
- package/dist/runtime/workflow-types.js.map +0 -1
- package/dist/sentiment/adapters/finnhub.js.map +0 -1
- package/dist/sentiment/adapters/reddit.js.map +0 -1
- package/dist/sentiment/adapters/twitter.js.map +0 -1
- package/dist/sentiment/adapters/web.js.map +0 -1
- package/dist/sentiment/index.js.map +0 -1
- package/dist/sentiment/insights.js.map +0 -1
- package/dist/sentiment/keywords.js.map +0 -1
- package/dist/sentiment/pipeline.js.map +0 -1
- package/dist/sentiment/scorer.js.map +0 -1
- package/dist/sentiment/store.js.map +0 -1
- package/dist/sentiment/trends.js.map +0 -1
- package/dist/sentiment/types.js.map +0 -1
- package/dist/system-prompt.js.map +0 -1
- package/dist/tool-kit.js.map +0 -1
- package/dist/tools/fundamentals/company-overview.js.map +0 -1
- package/dist/tools/fundamentals/comps.js.map +0 -1
- package/dist/tools/fundamentals/dcf.js.map +0 -1
- package/dist/tools/fundamentals/earnings.js.map +0 -1
- package/dist/tools/fundamentals/financials.js.map +0 -1
- package/dist/tools/fundamentals/sec-filings.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interaction/ask-user.js.map +0 -1
- package/dist/tools/macro/fear-greed.js.map +0 -1
- package/dist/tools/macro/fred-data.js.map +0 -1
- package/dist/tools/market/crypto-history.js.map +0 -1
- package/dist/tools/market/crypto-price.js.map +0 -1
- package/dist/tools/market/screen-stocks.js.map +0 -1
- package/dist/tools/market/search-ticker.js.map +0 -1
- package/dist/tools/market/stock-history.js.map +0 -1
- package/dist/tools/market/stock-quote.js.map +0 -1
- package/dist/tools/options/greeks.js.map +0 -1
- package/dist/tools/options/option-chain.js.map +0 -1
- package/dist/tools/portfolio/alerts.js.map +0 -1
- package/dist/tools/portfolio/correlation.js.map +0 -1
- package/dist/tools/portfolio/daily-report.js.map +0 -1
- package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
- package/dist/tools/portfolio/notifications.js.map +0 -1
- package/dist/tools/portfolio/risk-analysis.js.map +0 -1
- package/dist/tools/portfolio/tracker.js.map +0 -1
- package/dist/tools/portfolio/watchlist.js.map +0 -1
- package/dist/tools/sentiment/insight-format.js.map +0 -1
- package/dist/tools/sentiment/query-match.js.map +0 -1
- package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
- package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
- package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
- package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
- package/dist/tools/sentiment/untrusted-text.js.map +0 -1
- package/dist/tools/sentiment/web-search.js.map +0 -1
- package/dist/tools/sentiment/web-sentiment.js.map +0 -1
- package/dist/tools/technical/backtest.js.map +0 -1
- package/dist/tools/technical/indicators.js.map +0 -1
- package/dist/types/fundamentals.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/macro.js.map +0 -1
- package/dist/types/market.js.map +0 -1
- package/dist/types/options.js.map +0 -1
- package/dist/types/portfolio.js.map +0 -1
- package/dist/types/sentiment.js.map +0 -1
- package/dist/workflows/compare-assets.js.map +0 -1
- package/dist/workflows/index.js.map +0 -1
- package/dist/workflows/options-screener.js.map +0 -1
- package/dist/workflows/portfolio-builder.js.map +0 -1
- package/gui/server/ask-user-bridge.ts +0 -89
- package/gui/server/automation-heartbeat.ts +0 -97
- package/gui/server/background-quotes.ts +0 -127
- package/gui/server/chat-event-adapter.ts +0 -210
- package/gui/server/chat-run-session.ts +0 -16
- package/gui/server/gui-session-manager.ts +0 -5
- package/gui/server/http-routes.ts +0 -953
- package/gui/server/invoke-tool.ts +0 -489
- package/gui/server/live-chat-event-adapter.ts +0 -208
- package/gui/server/local-session-coordinator.ts +0 -97
- package/gui/server/market-state-api.ts +0 -273
- package/gui/server/model-setup.ts +0 -254
- package/gui/server/package.json +0 -5
- package/gui/server/private-api-access.ts +0 -62
- package/gui/server/projector.ts +0 -263
- package/gui/server/prompt-observation.ts +0 -58
- package/gui/server/quote-snapshot-store.ts +0 -50
- package/gui/server/server.ts +0 -289
- package/gui/server/session-actions.ts +0 -331
- package/gui/server/session-entry-wait.ts +0 -160
- package/gui/server/shutdown.ts +0 -47
- package/gui/server/tool-invoke-ack.ts +0 -49
- package/gui/server/tool-metadata.ts +0 -167
- package/gui/server/websocket.ts +0 -138
- package/gui/server/writer-lock.ts +0 -1
- package/gui/server/ws-hub.ts +0 -391
- package/gui/shared/chat-events.ts +0 -156
- package/gui/shared/event-reducer.ts +0 -219
- package/gui/web/dist/assets/CatalogOverlay-ChRTKNlf.js +0 -1
- package/gui/web/dist/assets/index-BzyqyVnd.css +0 -2
- package/gui/web/dist/assets/index-DvMjkOP9.js +0 -65
- package/src/analysts/contracts.ts +0 -176
- package/src/analysts/orchestrator.ts +0 -224
- package/src/cli-main.ts +0 -510
- package/src/cli.ts +0 -17
- package/src/config.ts +0 -272
- package/src/doctor/cli-command.ts +0 -83
- package/src/doctor/render.ts +0 -37
- package/src/doctor/report.ts +0 -638
- package/src/index.ts +0 -5
- package/src/infra/cache.ts +0 -114
- package/src/infra/http-client.ts +0 -134
- package/src/infra/index.ts +0 -14
- package/src/infra/native-dependencies.ts +0 -84
- package/src/infra/node-version.ts +0 -23
- package/src/infra/open-url.ts +0 -28
- package/src/infra/opencandle-paths.ts +0 -53
- package/src/infra/rate-limiter.ts +0 -76
- package/src/market-state/alert-conditions.ts +0 -82
- package/src/market-state/alert-runner.ts +0 -863
- package/src/market-state/daily-report.ts +0 -237
- package/src/market-state/local-automation-service.ts +0 -162
- package/src/market-state/notification-delivery.ts +0 -158
- package/src/market-state/resolve-for-mutation.ts +0 -24
- package/src/market-state/resolve.ts +0 -112
- package/src/market-state/service.ts +0 -2208
- package/src/memory/index.ts +0 -10
- package/src/memory/manager.ts +0 -190
- package/src/memory/preference-extractor.ts +0 -106
- package/src/memory/retrieval.ts +0 -71
- package/src/memory/sqlite.ts +0 -577
- package/src/memory/storage.ts +0 -195
- package/src/memory/tool-defaults.ts +0 -108
- package/src/memory/types.ts +0 -71
- package/src/monitor.ts +0 -123
- package/src/onboarding/connect.ts +0 -177
- package/src/onboarding/credential-interceptor.ts +0 -122
- package/src/onboarding/degradation-accumulator.ts +0 -77
- package/src/onboarding/prompt-user.ts +0 -85
- package/src/onboarding/provider-status.ts +0 -382
- package/src/onboarding/providers.ts +0 -414
- package/src/onboarding/state.ts +0 -216
- package/src/onboarding/tool-helpers.ts +0 -104
- package/src/onboarding/tool-tags.ts +0 -244
- package/src/onboarding/validation.ts +0 -152
- package/src/pi/opencandle-extension.ts +0 -1244
- package/src/pi/session-action-dedupe.ts +0 -155
- package/src/pi/session-storage.ts +0 -5
- package/src/pi/session-writer-lock.ts +0 -426
- package/src/pi/session.ts +0 -84
- package/src/pi/setup.ts +0 -399
- package/src/pi/tool-adapter.ts +0 -49
- package/src/pi/tui-session-coordinator.ts +0 -351
- package/src/prompts/context-builder.ts +0 -326
- package/src/prompts/disclaimer.ts +0 -9
- package/src/prompts/policy-cards.ts +0 -228
- package/src/prompts/sections.ts +0 -46
- package/src/prompts/symbol-preflight.ts +0 -80
- package/src/prompts/workflow-prompts.ts +0 -504
- package/src/providers/alpha-vantage.ts +0 -334
- package/src/providers/coingecko.ts +0 -93
- package/src/providers/errors.ts +0 -9
- package/src/providers/exa-search.ts +0 -375
- package/src/providers/external-tool-command.ts +0 -164
- package/src/providers/external-tool-error.ts +0 -20
- package/src/providers/fear-greed.ts +0 -45
- package/src/providers/finnhub.ts +0 -125
- package/src/providers/fred.ts +0 -83
- package/src/providers/index.ts +0 -17
- package/src/providers/provider-credential-error.ts +0 -23
- package/src/providers/reddit-cli.ts +0 -286
- package/src/providers/reddit.ts +0 -106
- package/src/providers/sec-edgar.ts +0 -326
- package/src/providers/tradingview.ts +0 -399
- package/src/providers/twitter-cli.ts +0 -202
- package/src/providers/twitter.ts +0 -102
- package/src/providers/web-search.ts +0 -303
- package/src/providers/with-fallback.ts +0 -42
- package/src/providers/wrap-provider.ts +0 -103
- package/src/providers/yahoo-finance.ts +0 -672
- package/src/routing/classify-intent.ts +0 -380
- package/src/routing/defaults.ts +0 -29
- package/src/routing/entity-extractor.ts +0 -540
- package/src/routing/fund-symbols.ts +0 -58
- package/src/routing/horizon.ts +0 -7
- package/src/routing/index.ts +0 -70
- package/src/routing/legacy-rule-router.ts +0 -13
- package/src/routing/planning.ts +0 -829
- package/src/routing/route-manifest.ts +0 -308
- package/src/routing/router-llm-client.ts +0 -52
- package/src/routing/router-prompt.ts +0 -159
- package/src/routing/router-types.ts +0 -84
- package/src/routing/router.ts +0 -997
- package/src/routing/slot-resolver.ts +0 -213
- package/src/routing/symbol-disambiguator.ts +0 -72
- package/src/routing/turn-context.ts +0 -108
- package/src/routing/types.ts +0 -77
- package/src/runtime/answer-contracts.ts +0 -693
- package/src/runtime/artifact-contracts.ts +0 -77
- package/src/runtime/evidence.ts +0 -77
- package/src/runtime/planning-evidence.ts +0 -682
- package/src/runtime/prompt-step.ts +0 -60
- package/src/runtime/provider-tracker.ts +0 -40
- package/src/runtime/run-context.ts +0 -32
- package/src/runtime/session-coordinator.ts +0 -632
- package/src/runtime/session-title.ts +0 -60
- package/src/runtime/tool-defaults-wrapper.ts +0 -43
- package/src/runtime/validation.ts +0 -211
- package/src/runtime/workflow-events.ts +0 -75
- package/src/runtime/workflow-runner.ts +0 -182
- package/src/runtime/workflow-types.ts +0 -102
- package/src/sentiment/adapters/finnhub.ts +0 -49
- package/src/sentiment/adapters/reddit.ts +0 -65
- package/src/sentiment/adapters/twitter.ts +0 -36
- package/src/sentiment/adapters/web.ts +0 -44
- package/src/sentiment/index.ts +0 -49
- package/src/sentiment/insights.ts +0 -269
- package/src/sentiment/keywords.ts +0 -31
- package/src/sentiment/pipeline.ts +0 -91
- package/src/sentiment/scorer.ts +0 -89
- package/src/sentiment/store.ts +0 -260
- package/src/sentiment/trends.ts +0 -96
- package/src/sentiment/types.ts +0 -112
- package/src/system-prompt.ts +0 -115
- package/src/tool-kit.ts +0 -69
- package/src/tools/AGENTS.md +0 -36
- package/src/tools/fundamentals/company-overview.ts +0 -64
- package/src/tools/fundamentals/comps.ts +0 -169
- package/src/tools/fundamentals/dcf.ts +0 -367
- package/src/tools/fundamentals/earnings.ts +0 -57
- package/src/tools/fundamentals/financials.ts +0 -63
- package/src/tools/fundamentals/sec-filings.ts +0 -105
- package/src/tools/index.ts +0 -101
- package/src/tools/interaction/ask-user.ts +0 -93
- package/src/tools/macro/fear-greed.ts +0 -41
- package/src/tools/macro/fred-data.ts +0 -92
- package/src/tools/market/crypto-history.ts +0 -72
- package/src/tools/market/crypto-price.ts +0 -53
- package/src/tools/market/screen-stocks.ts +0 -279
- package/src/tools/market/search-ticker.ts +0 -254
- package/src/tools/market/stock-history.ts +0 -104
- package/src/tools/market/stock-quote.ts +0 -67
- package/src/tools/options/greeks.ts +0 -81
- package/src/tools/options/option-chain.ts +0 -120
- package/src/tools/portfolio/alerts.ts +0 -457
- package/src/tools/portfolio/correlation.ts +0 -189
- package/src/tools/portfolio/daily-report.ts +0 -107
- package/src/tools/portfolio/holdings-overlap.ts +0 -139
- package/src/tools/portfolio/notifications.ts +0 -45
- package/src/tools/portfolio/risk-analysis.ts +0 -173
- package/src/tools/portfolio/tracker.ts +0 -308
- package/src/tools/portfolio/watchlist.ts +0 -288
- package/src/tools/sentiment/insight-format.ts +0 -50
- package/src/tools/sentiment/query-match.ts +0 -117
- package/src/tools/sentiment/reddit-sentiment.ts +0 -403
- package/src/tools/sentiment/sentiment-summary.ts +0 -383
- package/src/tools/sentiment/sentiment-trend.ts +0 -75
- package/src/tools/sentiment/twitter-sentiment.ts +0 -287
- package/src/tools/sentiment/untrusted-text.ts +0 -21
- package/src/tools/sentiment/web-search.ts +0 -186
- package/src/tools/sentiment/web-sentiment.ts +0 -96
- package/src/tools/technical/backtest.ts +0 -336
- package/src/tools/technical/indicators.ts +0 -281
- package/src/types/fundamentals.ts +0 -46
- package/src/types/index.ts +0 -25
- package/src/types/macro.ts +0 -27
- package/src/types/market.ts +0 -44
- package/src/types/options.ts +0 -52
- package/src/types/portfolio.ts +0 -83
- package/src/types/sentiment.ts +0 -129
- package/src/workflows/compare-assets.ts +0 -89
- package/src/workflows/index.ts +0 -3
- package/src/workflows/options-screener.ts +0 -125
- package/src/workflows/portfolio-builder.ts +0 -63
|
@@ -252,7 +252,7 @@ export function canUseTradingViewQuote(symbol) {
|
|
|
252
252
|
(isTradingViewQualified(normalized) || !shouldSkipTradingView(normalized)));
|
|
253
253
|
}
|
|
254
254
|
function symbolFromTvSymbol(tvSymbol) {
|
|
255
|
-
return tvSymbol.includes(":") ? tvSymbol.split(":").at(-1) : tvSymbol;
|
|
255
|
+
return tvSymbol.includes(":") ? (tvSymbol.split(":").at(-1) ?? tvSymbol) : tvSymbol;
|
|
256
256
|
}
|
|
257
257
|
function stringValue(value) {
|
|
258
258
|
return typeof value === "string" ? value : undefined;
|
|
@@ -272,4 +272,3 @@ function sortObjectKeys(value) {
|
|
|
272
272
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
273
273
|
.map(([key, nested]) => [key, sortObjectKeys(nested)]));
|
|
274
274
|
}
|
|
275
|
-
//# sourceMappingURL=tradingview.js.map
|
|
@@ -206,17 +206,20 @@ export async function searchWeb(query, opts) {
|
|
|
206
206
|
entries.push({ provider: "exa", fn: () => exaSearch(normalized, resolved) });
|
|
207
207
|
break;
|
|
208
208
|
case "brave":
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
{
|
|
210
|
+
const braveApiKey = config.braveApiKey;
|
|
211
|
+
if (!braveApiKey) {
|
|
212
|
+
return {
|
|
213
|
+
status: "unavailable",
|
|
214
|
+
reason: "BRAVE_API_KEY not configured",
|
|
215
|
+
provider: "brave_search",
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
entries.push({
|
|
213
219
|
provider: "brave_search",
|
|
214
|
-
|
|
220
|
+
fn: () => braveSearch(normalized, resolved, braveApiKey),
|
|
221
|
+
});
|
|
215
222
|
}
|
|
216
|
-
entries.push({
|
|
217
|
-
provider: "brave_search",
|
|
218
|
-
fn: () => braveSearch(normalized, resolved, config.braveApiKey),
|
|
219
|
-
});
|
|
220
223
|
break;
|
|
221
224
|
case "ddg":
|
|
222
225
|
entries.push({ provider: "ddg", fn: () => ddgSearch(normalized, resolved) });
|
|
@@ -226,13 +229,13 @@ export async function searchWeb(query, opts) {
|
|
|
226
229
|
}
|
|
227
230
|
// Default cascade: Exa → Brave → DDG
|
|
228
231
|
entries.push({ provider: "exa", fn: () => exaSearch(normalized, resolved) });
|
|
229
|
-
|
|
232
|
+
const braveApiKey = config.braveApiKey;
|
|
233
|
+
if (braveApiKey) {
|
|
230
234
|
entries.push({
|
|
231
235
|
provider: "brave_search",
|
|
232
|
-
fn: () => braveSearch(normalized, resolved,
|
|
236
|
+
fn: () => braveSearch(normalized, resolved, braveApiKey),
|
|
233
237
|
});
|
|
234
238
|
}
|
|
235
239
|
entries.push({ provider: "ddg", fn: () => ddgSearch(normalized, resolved) });
|
|
236
240
|
return withFallback(entries);
|
|
237
241
|
}
|
|
238
|
-
//# sourceMappingURL=web-search.js.map
|
|
@@ -30,12 +30,14 @@ export async function wrapProvider(providerId, fn) {
|
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
try {
|
|
33
|
-
const { value: data,
|
|
33
|
+
const { value: data, cache } = await runWithStaleMetadata(fn);
|
|
34
|
+
const timestamp = cache ? new Date(cache.cachedAt).toISOString() : new Date().toISOString();
|
|
34
35
|
return {
|
|
35
36
|
status: "ok",
|
|
36
37
|
data,
|
|
37
|
-
timestamp
|
|
38
|
-
|
|
38
|
+
timestamp,
|
|
39
|
+
cached: cache?.status === "cached" ? true : undefined,
|
|
40
|
+
stale: cache?.status === "stale" ? true : undefined,
|
|
39
41
|
};
|
|
40
42
|
}
|
|
41
43
|
catch (error) {
|
|
@@ -91,4 +93,3 @@ function isExternalToolSetupError(error) {
|
|
|
91
93
|
message.includes("unauthorized") ||
|
|
92
94
|
message.includes("expired"));
|
|
93
95
|
}
|
|
94
|
-
//# sourceMappingURL=wrap-provider.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import type { CompanyOverview, FinancialStatement } from "../types/fundamentals.js";
|
|
1
2
|
import type { OHLCV, StockQuote } from "../types/market.js";
|
|
2
3
|
import type { OptionsChain } from "../types/options.js";
|
|
3
4
|
import type { FundHoldings } from "../types/portfolio.js";
|
|
5
|
+
export declare function getYahooCompanyOverview(symbol: string): Promise<CompanyOverview>;
|
|
4
6
|
export declare function getQuote(symbol: string): Promise<StockQuote>;
|
|
7
|
+
export declare function getYahooFinancials(symbol: string): Promise<FinancialStatement[]>;
|
|
5
8
|
export declare function getHistory(symbol: string, range?: string, interval?: string): Promise<OHLCV[]>;
|
|
6
9
|
export declare function getFundHoldings(symbol: string): Promise<FundHoldings>;
|
|
7
10
|
export declare function clearCrumbCache(): void;
|
|
@@ -14,6 +14,50 @@ function getYahooFinance2Client() {
|
|
|
14
14
|
});
|
|
15
15
|
return yahooFinance2Client;
|
|
16
16
|
}
|
|
17
|
+
export async function getYahooCompanyOverview(symbol) {
|
|
18
|
+
const normalizedSymbol = symbol.toUpperCase();
|
|
19
|
+
const cacheKey = `yahoo:overview:${normalizedSymbol}`;
|
|
20
|
+
const cached = cache.get(cacheKey);
|
|
21
|
+
if (cached)
|
|
22
|
+
return cached;
|
|
23
|
+
try {
|
|
24
|
+
await rateLimiter.acquire("yahoo");
|
|
25
|
+
const result = await getYahooCompanySummary(normalizedSymbol);
|
|
26
|
+
if (!result?.price?.symbol) {
|
|
27
|
+
throw new Error(`Yahoo Finance: no company fundamentals returned for ${normalizedSymbol}`);
|
|
28
|
+
}
|
|
29
|
+
const profile = result.assetProfile ?? result.summaryProfile;
|
|
30
|
+
const overview = {
|
|
31
|
+
symbol: result.price.symbol.toUpperCase(),
|
|
32
|
+
name: result.price.longName ?? result.price.shortName ?? result.price.symbol,
|
|
33
|
+
description: profile?.longBusinessSummary ?? "",
|
|
34
|
+
exchange: result.price.exchangeName ?? "",
|
|
35
|
+
sector: profile?.sector ?? "",
|
|
36
|
+
industry: profile?.industry ?? "",
|
|
37
|
+
marketCap: yahooNumber(result.price.marketCap) ?? 0,
|
|
38
|
+
pe: yahooNullableNumber(result.summaryDetail?.trailingPE),
|
|
39
|
+
forwardPe: yahooNullableNumber(result.summaryDetail?.forwardPE),
|
|
40
|
+
eps: yahooNullableNumber(result.defaultKeyStatistics?.trailingEps) ??
|
|
41
|
+
yahooNullableNumber(result.defaultKeyStatistics?.forwardEps),
|
|
42
|
+
dividendYield: yahooNullableNumber(result.summaryDetail?.dividendYield),
|
|
43
|
+
beta: yahooNullableNumber(result.summaryDetail?.beta) ??
|
|
44
|
+
yahooNullableNumber(result.defaultKeyStatistics?.beta),
|
|
45
|
+
week52High: yahooNumber(result.summaryDetail?.fiftyTwoWeekHigh) ?? 0,
|
|
46
|
+
week52Low: yahooNumber(result.summaryDetail?.fiftyTwoWeekLow) ?? 0,
|
|
47
|
+
avgVolume: yahooNumber(result.summaryDetail?.averageVolume) ?? 0,
|
|
48
|
+
profitMargin: yahooNullableNumber(result.financialData?.profitMargins),
|
|
49
|
+
revenueGrowth: yahooNullableNumber(result.financialData?.revenueGrowth),
|
|
50
|
+
};
|
|
51
|
+
cache.set(cacheKey, overview, TTL.FUNDAMENTALS);
|
|
52
|
+
return overview;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const stale = cache.getStale(cacheKey, STALE_LIMIT.FUNDAMENTALS);
|
|
56
|
+
if (stale)
|
|
57
|
+
return stale.value;
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
17
61
|
export async function getQuote(symbol) {
|
|
18
62
|
const cacheKey = `yahoo:quote:${symbol}`;
|
|
19
63
|
const cached = cache.get(cacheKey);
|
|
@@ -40,6 +84,11 @@ export async function getQuote(symbol) {
|
|
|
40
84
|
const open = meta.regularMarketOpen ?? indicators?.open?.[0] ?? price;
|
|
41
85
|
const quote = {
|
|
42
86
|
symbol: meta.symbol,
|
|
87
|
+
name: typeof meta.longName === "string" && meta.longName.trim() !== ""
|
|
88
|
+
? meta.longName.trim()
|
|
89
|
+
: typeof meta.shortName === "string" && meta.shortName.trim() !== ""
|
|
90
|
+
? meta.shortName.trim()
|
|
91
|
+
: undefined,
|
|
43
92
|
price,
|
|
44
93
|
change,
|
|
45
94
|
changePercent,
|
|
@@ -53,6 +102,7 @@ export async function getQuote(symbol) {
|
|
|
53
102
|
week52High: meta.fiftyTwoWeekHigh ?? 0,
|
|
54
103
|
week52Low: meta.fiftyTwoWeekLow ?? 0,
|
|
55
104
|
timestamp: Date.now(),
|
|
105
|
+
asOf: yahooMarketTimeToIso(meta.regularMarketTime),
|
|
56
106
|
currency: typeof meta.currency === "string" && meta.currency.trim() !== ""
|
|
57
107
|
? meta.currency.trim().toUpperCase()
|
|
58
108
|
: null,
|
|
@@ -60,8 +110,9 @@ export async function getQuote(symbol) {
|
|
|
60
110
|
if (isZeroResultQuote(quote)) {
|
|
61
111
|
throw new InvalidSymbolError(symbol.toUpperCase(), "yahoo");
|
|
62
112
|
}
|
|
63
|
-
|
|
64
|
-
|
|
113
|
+
const enrichedQuote = await enrichQuoteWithExtendedHours(symbol, quote);
|
|
114
|
+
cache.set(cacheKey, enrichedQuote, TTL.QUOTE);
|
|
115
|
+
return enrichedQuote;
|
|
65
116
|
}
|
|
66
117
|
catch (error) {
|
|
67
118
|
const stale = cache.getStale(cacheKey, STALE_LIMIT.QUOTE);
|
|
@@ -70,6 +121,168 @@ export async function getQuote(symbol) {
|
|
|
70
121
|
throw error;
|
|
71
122
|
}
|
|
72
123
|
}
|
|
124
|
+
async function enrichQuoteWithExtendedHours(symbol, quote) {
|
|
125
|
+
try {
|
|
126
|
+
await rateLimiter.acquire("yahoo");
|
|
127
|
+
const yahooQuote = (await getYahooFinance2Client().quote(symbol));
|
|
128
|
+
if (!yahooQuote)
|
|
129
|
+
return quote;
|
|
130
|
+
const marketState = normalizeMarketState(yahooQuote.marketState);
|
|
131
|
+
if (!marketState)
|
|
132
|
+
return quote;
|
|
133
|
+
const withMarketState = { ...quote, marketState };
|
|
134
|
+
if (marketState !== "PRE" && marketState !== "POST")
|
|
135
|
+
return withMarketState;
|
|
136
|
+
const extended = marketState === "PRE" ? preMarketFields(yahooQuote) : postMarketFields(yahooQuote);
|
|
137
|
+
if (!Number.isFinite(extended.price))
|
|
138
|
+
return withMarketState;
|
|
139
|
+
return {
|
|
140
|
+
...withMarketState,
|
|
141
|
+
extendedPrice: extended.price,
|
|
142
|
+
extendedChange: extended.change,
|
|
143
|
+
extendedChangePercent: extended.changePercent,
|
|
144
|
+
extendedAsOf: toIsoString(extended.time),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return quote;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function normalizeMarketState(value) {
|
|
152
|
+
if (value === "PRE" || value === "PREPRE")
|
|
153
|
+
return "PRE";
|
|
154
|
+
if (value === "POST" || value === "POSTPOST")
|
|
155
|
+
return "POST";
|
|
156
|
+
if (value === "REGULAR" || value === "CLOSED")
|
|
157
|
+
return value;
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
function preMarketFields(quote) {
|
|
161
|
+
return {
|
|
162
|
+
price: quote.extendedMarketPrice ?? quote.preMarketPrice,
|
|
163
|
+
change: quote.extendedMarketChange ?? quote.preMarketChange,
|
|
164
|
+
changePercent: quote.extendedMarketChangePercent ?? quote.preMarketChangePercent,
|
|
165
|
+
time: quote.extendedMarketTime ?? quote.preMarketTime,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function postMarketFields(quote) {
|
|
169
|
+
return {
|
|
170
|
+
price: quote.extendedMarketPrice ?? quote.postMarketPrice,
|
|
171
|
+
change: quote.extendedMarketChange ?? quote.postMarketChange,
|
|
172
|
+
changePercent: quote.extendedMarketChangePercent ?? quote.postMarketChangePercent,
|
|
173
|
+
time: quote.extendedMarketTime ?? quote.postMarketTime,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function toIsoString(value) {
|
|
177
|
+
if (value instanceof Date)
|
|
178
|
+
return Number.isNaN(value.getTime()) ? undefined : value.toISOString();
|
|
179
|
+
const timestamp = typeof value === "number" ? value : Date.parse(value ?? "");
|
|
180
|
+
return Number.isFinite(timestamp) ? new Date(timestamp).toISOString() : undefined;
|
|
181
|
+
}
|
|
182
|
+
export async function getYahooFinancials(symbol) {
|
|
183
|
+
const normalizedSymbol = symbol.toUpperCase();
|
|
184
|
+
const cacheKey = `yahoo:financials:${normalizedSymbol}`;
|
|
185
|
+
const cached = cache.get(cacheKey);
|
|
186
|
+
if (cached)
|
|
187
|
+
return cached;
|
|
188
|
+
try {
|
|
189
|
+
await rateLimiter.acquire("yahoo");
|
|
190
|
+
const period1 = new Date();
|
|
191
|
+
period1.setUTCFullYear(period1.getUTCFullYear() - 6);
|
|
192
|
+
const rows = (await getYahooFinance2Client().fundamentalsTimeSeries(normalizedSymbol, {
|
|
193
|
+
period1,
|
|
194
|
+
period2: new Date(),
|
|
195
|
+
type: "annual",
|
|
196
|
+
module: "all",
|
|
197
|
+
}, { validateResult: false }));
|
|
198
|
+
const statements = rows
|
|
199
|
+
.map((row) => yahooFundamentalsRowToStatement(row))
|
|
200
|
+
.filter((statement) => statement !== null)
|
|
201
|
+
.sort((a, b) => b.fiscalDate.localeCompare(a.fiscalDate))
|
|
202
|
+
.slice(0, 4);
|
|
203
|
+
if (statements.length === 0) {
|
|
204
|
+
throw new Error(`Yahoo Finance: no financial statements returned for ${normalizedSymbol}`);
|
|
205
|
+
}
|
|
206
|
+
cache.set(cacheKey, statements, TTL.FUNDAMENTALS);
|
|
207
|
+
return statements;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
const stale = cache.getStale(cacheKey, STALE_LIMIT.FUNDAMENTALS);
|
|
211
|
+
if (stale)
|
|
212
|
+
return stale.value;
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function yahooFundamentalsRowToStatement(row) {
|
|
217
|
+
const fiscalDate = normalizeYahooDate(row.date);
|
|
218
|
+
if (!fiscalDate)
|
|
219
|
+
return null;
|
|
220
|
+
const operatingCashFlowValue = row.annualCashFlowFromContinuingOperatingActivities ??
|
|
221
|
+
row.cashFlowFromContinuingOperatingActivities ??
|
|
222
|
+
row.annualOperatingCashFlow ??
|
|
223
|
+
row.operatingCashFlow;
|
|
224
|
+
const capitalExpenditureValue = row.annualCapitalExpenditure ??
|
|
225
|
+
row.capitalExpenditure ??
|
|
226
|
+
row.annualCapitalExpenditures ??
|
|
227
|
+
row.capitalExpenditures;
|
|
228
|
+
const operatingCashFlow = operatingCashFlowValue ?? 0;
|
|
229
|
+
const capitalExpenditure = capitalExpenditureValue ?? 0;
|
|
230
|
+
const freeCashFlow = row.annualFreeCashFlow ??
|
|
231
|
+
row.freeCashFlow ??
|
|
232
|
+
(operatingCashFlowValue !== undefined && capitalExpenditureValue !== undefined
|
|
233
|
+
? operatingCashFlow + capitalExpenditure
|
|
234
|
+
: 0);
|
|
235
|
+
return {
|
|
236
|
+
fiscalDate,
|
|
237
|
+
revenue: row.annualTotalRevenue ?? row.totalRevenue ?? 0,
|
|
238
|
+
grossProfit: row.annualGrossProfit ?? row.grossProfit ?? 0,
|
|
239
|
+
operatingIncome: row.annualOperatingIncome ?? row.operatingIncome ?? 0,
|
|
240
|
+
netIncome: row.annualNetIncome ??
|
|
241
|
+
row.netIncome ??
|
|
242
|
+
row.annualNetIncomeCommonStockholders ??
|
|
243
|
+
row.netIncomeCommonStockholders ??
|
|
244
|
+
0,
|
|
245
|
+
eps: row.annualDilutedEPS ?? row.dilutedEPS ?? row.annualBasicEPS ?? row.basicEPS ?? 0,
|
|
246
|
+
totalAssets: row.annualTotalAssets ?? row.totalAssets ?? 0,
|
|
247
|
+
totalLiabilities: row.annualTotalLiabilitiesNetMinorityInterest ??
|
|
248
|
+
row.totalLiabilitiesNetMinorityInterest ??
|
|
249
|
+
row.annualTotalLiabilities ??
|
|
250
|
+
row.totalLiabilities ??
|
|
251
|
+
0,
|
|
252
|
+
totalEquity: row.annualStockholdersEquity ??
|
|
253
|
+
row.stockholdersEquity ??
|
|
254
|
+
row.annualCommonStockEquity ??
|
|
255
|
+
row.commonStockEquity ??
|
|
256
|
+
0,
|
|
257
|
+
operatingCashFlow,
|
|
258
|
+
freeCashFlow,
|
|
259
|
+
totalDebt: row.annualTotalDebt ?? row.totalDebt,
|
|
260
|
+
cashAndEquivalents: row.annualCashAndCashEquivalents ?? row.cashAndCashEquivalents,
|
|
261
|
+
sharesOutstanding: row.annualOrdinarySharesNumber ??
|
|
262
|
+
row.ordinarySharesNumber ??
|
|
263
|
+
row.annualShareIssued ??
|
|
264
|
+
row.shareIssued ??
|
|
265
|
+
row.annualDilutedAverageShares ??
|
|
266
|
+
row.dilutedAverageShares ??
|
|
267
|
+
row.annualBasicAverageShares ??
|
|
268
|
+
row.basicAverageShares,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function normalizeYahooDate(value) {
|
|
272
|
+
if (value instanceof Date)
|
|
273
|
+
return value.toISOString().slice(0, 10);
|
|
274
|
+
if (typeof value === "number") {
|
|
275
|
+
if (!Number.isFinite(value))
|
|
276
|
+
return null;
|
|
277
|
+
const timestampMs = Math.abs(value) < 1_000_000_000_000 ? value * 1000 : value;
|
|
278
|
+
const date = new Date(timestampMs);
|
|
279
|
+
return Number.isNaN(date.getTime()) ? null : date.toISOString().slice(0, 10);
|
|
280
|
+
}
|
|
281
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
282
|
+
return null;
|
|
283
|
+
const date = new Date(value);
|
|
284
|
+
return Number.isNaN(date.getTime()) ? null : date.toISOString().slice(0, 10);
|
|
285
|
+
}
|
|
73
286
|
function isZeroResultQuote(quote) {
|
|
74
287
|
return (quote.price === 0 &&
|
|
75
288
|
quote.volume === 0 &&
|
|
@@ -163,26 +376,49 @@ export async function getFundHoldings(symbol) {
|
|
|
163
376
|
}
|
|
164
377
|
}
|
|
165
378
|
async function getFundHoldingsSummary(symbol) {
|
|
379
|
+
return getYahooQuoteSummary(symbol, "price,topHoldings");
|
|
380
|
+
}
|
|
381
|
+
async function getYahooCompanySummary(symbol) {
|
|
382
|
+
const modules = [
|
|
383
|
+
"price",
|
|
384
|
+
"assetProfile",
|
|
385
|
+
"summaryProfile",
|
|
386
|
+
"summaryDetail",
|
|
387
|
+
"defaultKeyStatistics",
|
|
388
|
+
"financialData",
|
|
389
|
+
];
|
|
390
|
+
try {
|
|
391
|
+
return (await getYahooFinance2Client().quoteSummary(symbol, { modules: [...modules] }, { validateResult: false }));
|
|
392
|
+
}
|
|
393
|
+
catch (_error) {
|
|
394
|
+
const data = await getYahooQuoteSummary(symbol, modules.join(","));
|
|
395
|
+
if (data.quoteSummary.error) {
|
|
396
|
+
throw new Error(`Yahoo Finance: ${data.quoteSummary.error.description ?? data.quoteSummary.error.code ?? "quoteSummary error"}`);
|
|
397
|
+
}
|
|
398
|
+
return data.quoteSummary.result?.[0] ?? {};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
async function getYahooQuoteSummary(symbol, modules) {
|
|
166
402
|
try {
|
|
167
|
-
return await
|
|
403
|
+
return await fetchYahooQuoteSummary(symbol, modules);
|
|
168
404
|
}
|
|
169
405
|
catch (error) {
|
|
170
406
|
if (!isYahooAuthError(error))
|
|
171
407
|
throw error;
|
|
172
|
-
return
|
|
408
|
+
return fetchYahooQuoteSummaryWithCrumb(symbol, modules);
|
|
173
409
|
}
|
|
174
410
|
}
|
|
175
|
-
async function
|
|
176
|
-
const
|
|
177
|
-
const url = `${QUOTE_SUMMARY_URL}/${encodeURIComponent(symbol)}?modules=${
|
|
411
|
+
async function fetchYahooQuoteSummary(symbol, modules) {
|
|
412
|
+
const encodedModules = encodeURIComponent(modules);
|
|
413
|
+
const url = `${QUOTE_SUMMARY_URL}/${encodeURIComponent(symbol)}?modules=${encodedModules}`;
|
|
178
414
|
return httpGet(url, {
|
|
179
415
|
headers: { "User-Agent": "OpenCandle/1.0" },
|
|
180
416
|
});
|
|
181
417
|
}
|
|
182
|
-
async function
|
|
183
|
-
const
|
|
418
|
+
async function fetchYahooQuoteSummaryWithCrumb(symbol, modules) {
|
|
419
|
+
const encodedModules = encodeURIComponent(modules);
|
|
184
420
|
const { crumb, cookie } = await getYahooCrumb();
|
|
185
|
-
const url = `${QUOTE_SUMMARY_URL}/${encodeURIComponent(symbol)}?modules=${
|
|
421
|
+
const url = `${QUOTE_SUMMARY_URL}/${encodeURIComponent(symbol)}?modules=${encodedModules}&crumb=${encodeURIComponent(crumb)}`;
|
|
186
422
|
try {
|
|
187
423
|
return await httpGet(url, {
|
|
188
424
|
headers: { "User-Agent": BROWSER_UA, Cookie: cookie },
|
|
@@ -193,7 +429,7 @@ async function fetchFundHoldingsSummaryWithCrumb(symbol) {
|
|
|
193
429
|
throw error;
|
|
194
430
|
clearCrumbCache();
|
|
195
431
|
const fresh = await getYahooCrumb();
|
|
196
|
-
const retryUrl = `${QUOTE_SUMMARY_URL}/${encodeURIComponent(symbol)}?modules=${
|
|
432
|
+
const retryUrl = `${QUOTE_SUMMARY_URL}/${encodeURIComponent(symbol)}?modules=${encodedModules}&crumb=${encodeURIComponent(fresh.crumb)}`;
|
|
197
433
|
return httpGet(retryUrl, {
|
|
198
434
|
headers: { "User-Agent": BROWSER_UA, Cookie: fresh.cookie },
|
|
199
435
|
});
|
|
@@ -203,11 +439,18 @@ function isYahooAuthError(error) {
|
|
|
203
439
|
return error instanceof HttpError && (error.status === 401 || error.status === 429);
|
|
204
440
|
}
|
|
205
441
|
function normalizeHoldingWeight(value) {
|
|
206
|
-
const numeric =
|
|
442
|
+
const numeric = yahooNumber(value);
|
|
207
443
|
if (numeric === undefined || !Number.isFinite(numeric) || numeric <= 0)
|
|
208
444
|
return undefined;
|
|
209
445
|
return numeric > 1 ? roundWeight(numeric / 100) : roundWeight(numeric);
|
|
210
446
|
}
|
|
447
|
+
function yahooNumber(value) {
|
|
448
|
+
const numeric = typeof value === "number" ? value : value?.raw;
|
|
449
|
+
return numeric !== undefined && Number.isFinite(numeric) ? numeric : undefined;
|
|
450
|
+
}
|
|
451
|
+
function yahooNullableNumber(value) {
|
|
452
|
+
return yahooNumber(value) ?? null;
|
|
453
|
+
}
|
|
211
454
|
function normalizeSectorWeights(sectors) {
|
|
212
455
|
if (!sectors?.length)
|
|
213
456
|
return undefined;
|
|
@@ -471,6 +714,7 @@ function parseOptionsResponse(data) {
|
|
|
471
714
|
putCallRatio: totalCallVolume > 0 ? totalPutVolume / totalCallVolume : 0,
|
|
472
715
|
quoteStatus,
|
|
473
716
|
fetchedAt: new Date().toISOString(),
|
|
717
|
+
asOf: yahooMarketTimeToIso(quote.regularMarketTime),
|
|
474
718
|
};
|
|
475
719
|
}
|
|
476
720
|
/**
|
|
@@ -521,4 +765,19 @@ function toYahooUnixSeconds(value) {
|
|
|
521
765
|
}
|
|
522
766
|
return Math.floor(new Date(value).getTime() / 1000);
|
|
523
767
|
}
|
|
524
|
-
|
|
768
|
+
function yahooMarketTimeToIso(value) {
|
|
769
|
+
let date;
|
|
770
|
+
if (value instanceof Date) {
|
|
771
|
+
date = value;
|
|
772
|
+
}
|
|
773
|
+
else if (typeof value === "number" && Number.isFinite(value)) {
|
|
774
|
+
date = new Date(value < 10_000_000_000 ? value * 1000 : value);
|
|
775
|
+
}
|
|
776
|
+
else if (typeof value === "string" && value.trim() !== "") {
|
|
777
|
+
const numeric = Number(value);
|
|
778
|
+
date = Number.isFinite(numeric)
|
|
779
|
+
? new Date(numeric < 10_000_000_000 ? numeric * 1000 : numeric)
|
|
780
|
+
: new Date(value);
|
|
781
|
+
}
|
|
782
|
+
return date && Number.isFinite(date.getTime()) ? date.toISOString() : undefined;
|
|
783
|
+
}
|
package/dist/routing/defaults.js
CHANGED
|
@@ -186,6 +186,15 @@ const LOWERCASE_FINANCE_TERMS = new Set([
|
|
|
186
186
|
"rate",
|
|
187
187
|
"rates",
|
|
188
188
|
"cuts",
|
|
189
|
+
// Trading verbs written in lowercase are actions, not tickers — "sell
|
|
190
|
+
// calls" must not mint a SELL symbol. Uppercase ticker extraction is
|
|
191
|
+
// unaffected, so a genuine $SELL / "SELL" ticker still resolves.
|
|
192
|
+
"sell",
|
|
193
|
+
"buy",
|
|
194
|
+
"hold",
|
|
195
|
+
"write",
|
|
196
|
+
"roll",
|
|
197
|
+
"trim",
|
|
189
198
|
"gold",
|
|
190
199
|
"oil",
|
|
191
200
|
"stock",
|
|
@@ -348,14 +357,14 @@ function extractMaxPremium(input) {
|
|
|
348
357
|
const under = input.match(/\b(?:under|below|less\s+than|max(?:imum)?|up\s+to)\s+\$?\s*([\d,]+(?:\.\d+)?)\s*([kK])?\b/i);
|
|
349
358
|
if (under) {
|
|
350
359
|
const base = parseFloat(under[1].replace(/,/g, ""));
|
|
351
|
-
if (isNaN(base))
|
|
360
|
+
if (Number.isNaN(base))
|
|
352
361
|
return undefined;
|
|
353
362
|
return under[2] ? base * 1000 : base;
|
|
354
363
|
}
|
|
355
364
|
const trailing = input.match(/\$\s*([\d,]+(?:\.\d+)?)\s*([kK])?\s*(?:premium|max\s*premium)\b/i);
|
|
356
365
|
if (trailing) {
|
|
357
366
|
const base = parseFloat(trailing[1].replace(/,/g, ""));
|
|
358
|
-
if (isNaN(base))
|
|
367
|
+
if (Number.isNaN(base))
|
|
359
368
|
return undefined;
|
|
360
369
|
return trailing[2] ? base * 1000 : base;
|
|
361
370
|
}
|
|
@@ -418,6 +427,13 @@ function extractDteHint(input) {
|
|
|
418
427
|
const explicitDays = lower.match(/\b(\d+)\s*(?:-|to|or)\s*(\d+)\s*(?:dte|days?)\b/);
|
|
419
428
|
if (explicitDays)
|
|
420
429
|
return `${explicitDays[1]}-${explicitDays[2]} days`;
|
|
430
|
+
// An explicit user week range ("1-2 weeks out") must outrank the
|
|
431
|
+
// catalyst-derived event_week inference below; a same-day earnings
|
|
432
|
+
// mention otherwise collapses the requested horizon to 0-7 days
|
|
433
|
+
// (historical "1-2 weeks DTE preservation" loss class).
|
|
434
|
+
const explicitWeeks = lower.match(/\b(\d+|one|two|three|four)\s*(?:[-–]|to|or)\s*(\d+|one|two|three|four)\s*weeks?\b/);
|
|
435
|
+
if (explicitWeeks)
|
|
436
|
+
return `${explicitWeeks[1]}-${explicitWeeks[2]} weeks`;
|
|
421
437
|
if (/\bmonth\b/.test(lower))
|
|
422
438
|
return "month";
|
|
423
439
|
if (/\bearnings?\b.*\b(?:today|tonight|this\s+week)\b|\b(?:today|tonight|this\s+week)\b.*\bearnings?\b/.test(lower))
|
|
@@ -478,4 +494,3 @@ function extractCompareMetrics(input) {
|
|
|
478
494
|
metrics.push("overlap");
|
|
479
495
|
return metrics.length > 0 ? metrics : undefined;
|
|
480
496
|
}
|
|
481
|
-
//# sourceMappingURL=entity-extractor.js.map
|
package/dist/routing/horizon.js
CHANGED
package/dist/routing/index.js
CHANGED
|
@@ -9,4 +9,3 @@ export { createPiAiRouterClient } from "./router-llm-client.js";
|
|
|
9
9
|
export { buildRouterPrompt } from "./router-prompt.js";
|
|
10
10
|
export { resolveOptionsScreenerSlots, resolvePortfolioSlots } from "./slot-resolver.js";
|
|
11
11
|
export { buildMemoryQueryPlan, buildResolvedTurnContext, } from "./turn-context.js";
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
package/dist/routing/planning.js
CHANGED
|
@@ -30,7 +30,7 @@ export const TOOL_BUNDLE_TOOLS = {
|
|
|
30
30
|
"search_web",
|
|
31
31
|
],
|
|
32
32
|
options: ["get_option_chain", "get_stock_quote", "search_ticker", "search_web"],
|
|
33
|
-
macro: ["get_economic_data", "get_fear_greed", "search_web"],
|
|
33
|
+
macro: ["get_economic_data", "get_event_probabilities", "get_fear_greed", "search_web"],
|
|
34
34
|
sentiment: [
|
|
35
35
|
"get_reddit_sentiment",
|
|
36
36
|
"get_twitter_sentiment",
|
|
@@ -238,4 +238,3 @@ export function memoryScopesForRoute(routeKind, workflow) {
|
|
|
238
238
|
return WORKFLOW_CAPABILITY_MANIFEST[workflow]?.memoryScopes ?? [];
|
|
239
239
|
return ROUTE_CAPABILITY_MANIFEST[routeKind]?.memoryScopes ?? [];
|
|
240
240
|
}
|
|
241
|
-
//# sourceMappingURL=route-manifest.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Model } from "@earendil-works/pi-ai";
|
|
1
|
+
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
2
2
|
import type { RouterLlmClient } from "./router-types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Build a router LLM client backed by pi-ai's `completeSimple`. The client
|
|
@@ -8,4 +8,4 @@ import type { RouterLlmClient } from "./router-types.js";
|
|
|
8
8
|
* Zero tools are passed — the router operates on text alone. Temperature
|
|
9
9
|
* is pinned low for structured-output stability.
|
|
10
10
|
*/
|
|
11
|
-
export declare function createPiAiRouterClient(model: Model<"anthropic-messages"> | Model<
|
|
11
|
+
export declare function createPiAiRouterClient(model: Model<"anthropic-messages"> | Model<Api>): RouterLlmClient;
|
|
@@ -10,7 +10,7 @@ import { completeSimple } from "@earendil-works/pi-ai/compat";
|
|
|
10
10
|
export function createPiAiRouterClient(model) {
|
|
11
11
|
return {
|
|
12
12
|
async complete(prompt) {
|
|
13
|
-
const
|
|
13
|
+
const request = {
|
|
14
14
|
messages: [
|
|
15
15
|
{
|
|
16
16
|
role: "user",
|
|
@@ -20,11 +20,22 @@ export function createPiAiRouterClient(model) {
|
|
|
20
20
|
],
|
|
21
21
|
// Explicitly no tools — spec requirement.
|
|
22
22
|
tools: [],
|
|
23
|
-
}
|
|
23
|
+
};
|
|
24
|
+
const options = {
|
|
24
25
|
temperature: 0,
|
|
25
26
|
maxTokens: 2000,
|
|
26
27
|
reasoning: "minimal",
|
|
27
|
-
}
|
|
28
|
+
};
|
|
29
|
+
let response;
|
|
30
|
+
try {
|
|
31
|
+
response = await completeSimple(model, request, options);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (!isUnsupportedTemperatureError(error))
|
|
35
|
+
throw error;
|
|
36
|
+
const { temperature: _temperature, ...retryOptions } = options;
|
|
37
|
+
response = await completeSimple(model, request, retryOptions);
|
|
38
|
+
}
|
|
28
39
|
if (response.stopReason === "error" || response.stopReason === "aborted") {
|
|
29
40
|
throw new Error(`router LLM call failed: ${response.errorMessage ?? response.stopReason}`);
|
|
30
41
|
}
|
|
@@ -39,4 +50,7 @@ export function createPiAiRouterClient(model) {
|
|
|
39
50
|
},
|
|
40
51
|
};
|
|
41
52
|
}
|
|
42
|
-
|
|
53
|
+
function isUnsupportedTemperatureError(error) {
|
|
54
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
+
return /unsupported parameter/i.test(message) && /temperature/i.test(message);
|
|
56
|
+
}
|
package/dist/routing/router.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ import type { RouterInputContext, RouterLlmClient, RouterOutput } from "./router
|
|
|
8
8
|
*/
|
|
9
9
|
export declare function route(input: RouterInputContext, client: RouterLlmClient): Promise<RouterOutput>;
|
|
10
10
|
export declare function validateRouterOutput(raw: string): RouterOutput;
|
|
11
|
-
export declare function postProcessRouterOutput(text: string, output: RouterOutput): RouterOutput;
|
|
11
|
+
export declare function postProcessRouterOutput(text: string, output: RouterOutput, inputContext?: Pick<RouterInputContext, "priorTurns" | "profileSnapshot">): RouterOutput;
|