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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ModelKeyProviderId = "google" | "openai" | "anthropic";
|
|
2
|
+
export type ModelKeyValidationResult = {
|
|
3
|
+
status: "valid";
|
|
4
|
+
providerLabel: string;
|
|
5
|
+
} | {
|
|
6
|
+
status: "invalid";
|
|
7
|
+
providerLabel: string;
|
|
8
|
+
} | {
|
|
9
|
+
status: "transient";
|
|
10
|
+
providerLabel: string;
|
|
11
|
+
reason: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Checks whether an API key is accepted by a model provider without saving it.
|
|
15
|
+
* Transient failures deliberately permit saving so offline setup remains usable.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateModelKey(providerId: ModelKeyProviderId, key: string): Promise<ModelKeyValidationResult>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const VALIDATION_TIMEOUT_MS = 5_000;
|
|
2
|
+
const MODEL_KEY_PROBES = {
|
|
3
|
+
google: {
|
|
4
|
+
label: "Google Gemini",
|
|
5
|
+
url: "https://generativelanguage.googleapis.com/v1beta/models",
|
|
6
|
+
headers: (key) => ({ "x-goog-api-key": key }),
|
|
7
|
+
},
|
|
8
|
+
openai: {
|
|
9
|
+
label: "OpenAI",
|
|
10
|
+
url: "https://api.openai.com/v1/models",
|
|
11
|
+
headers: (key) => ({ Authorization: `Bearer ${key}` }),
|
|
12
|
+
},
|
|
13
|
+
anthropic: {
|
|
14
|
+
label: "Anthropic",
|
|
15
|
+
url: "https://api.anthropic.com/v1/models",
|
|
16
|
+
headers: (key) => ({ "x-api-key": key, "anthropic-version": "2023-06-01" }),
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Checks whether an API key is accepted by a model provider without saving it.
|
|
21
|
+
* Transient failures deliberately permit saving so offline setup remains usable.
|
|
22
|
+
*/
|
|
23
|
+
export async function validateModelKey(providerId, key) {
|
|
24
|
+
const probe = MODEL_KEY_PROBES[providerId];
|
|
25
|
+
try {
|
|
26
|
+
const response = await fetch(probe.url, {
|
|
27
|
+
method: "GET",
|
|
28
|
+
headers: probe.headers(key),
|
|
29
|
+
signal: AbortSignal.timeout(VALIDATION_TIMEOUT_MS),
|
|
30
|
+
});
|
|
31
|
+
if (response.status === 401 || response.status === 403) {
|
|
32
|
+
return { status: "invalid", providerLabel: probe.label };
|
|
33
|
+
}
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
// Google reports bad keys as 400 INVALID_ARGUMENT / API_KEY_INVALID
|
|
36
|
+
// rather than 401.
|
|
37
|
+
if (response.status === 400) {
|
|
38
|
+
const body = await response.text().catch(() => "");
|
|
39
|
+
if (/API_KEY_INVALID|API key not valid/i.test(body)) {
|
|
40
|
+
return { status: "invalid", providerLabel: probe.label };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { status: "transient", providerLabel: probe.label, reason: `HTTP ${response.status}` };
|
|
44
|
+
}
|
|
45
|
+
return { status: "valid", providerLabel: probe.label };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
status: "transient",
|
|
50
|
+
providerLabel: probe.label,
|
|
51
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -20,9 +20,18 @@ export default function openCandleExtension(pi, options) {
|
|
|
20
20
|
const coordinator = new SessionCoordinator();
|
|
21
21
|
// Workflow transforms replace the user's turn with the expanded prompt; this
|
|
22
22
|
// marker lets the GUI render the user's original words instead.
|
|
23
|
-
const markOriginalInput = (original) => {
|
|
23
|
+
const markOriginalInput = (original, ctx) => {
|
|
24
|
+
if (hasUnconsumedOriginalInputMarker(ctx))
|
|
25
|
+
return;
|
|
24
26
|
pi.appendEntry("opencandle-user-input", { original });
|
|
25
27
|
};
|
|
28
|
+
const appendComprehensiveAnalysisWorkflowEntry = (symbol, definition) => {
|
|
29
|
+
pi.appendEntry("opencandle-workflow", {
|
|
30
|
+
workflow: "comprehensive_analysis",
|
|
31
|
+
resolvedSlots: { symbol },
|
|
32
|
+
analystsTotal: definition.steps.filter((step) => step.stepType.startsWith("analyst_")).length,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
26
35
|
// Credential-interception state. Lifetime:
|
|
27
36
|
// `sessionPromptedSet` — cleared on session_start, persists across turns
|
|
28
37
|
// within a session so users don't get re-prompted after picking
|
|
@@ -60,6 +69,7 @@ export default function openCandleExtension(pi, options) {
|
|
|
60
69
|
return;
|
|
61
70
|
}
|
|
62
71
|
const definition = buildComprehensiveAnalysisDefinition(symbol);
|
|
72
|
+
appendComprehensiveAnalysisWorkflowEntry(symbol, definition);
|
|
63
73
|
coordinator.executeWorkflow(pi, definition, ctx);
|
|
64
74
|
},
|
|
65
75
|
});
|
|
@@ -565,9 +575,10 @@ export default function openCandleExtension(pi, options) {
|
|
|
565
575
|
const analysis = isAnalysisRequest(event.text);
|
|
566
576
|
if (analysis.match && analysis.symbol) {
|
|
567
577
|
const definition = buildComprehensiveAnalysisDefinition(analysis.symbol);
|
|
578
|
+
appendComprehensiveAnalysisWorkflowEntry(analysis.symbol, definition);
|
|
568
579
|
const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
|
|
569
580
|
if (prompt)
|
|
570
|
-
markOriginalInput(event.text);
|
|
581
|
+
markOriginalInput(event.text, ctx);
|
|
571
582
|
return prompt ? { action: "transform", text: prompt } : { action: "handled" };
|
|
572
583
|
}
|
|
573
584
|
const dispatched = await handleLlmRouterTurn(event.text, ctx);
|
|
@@ -679,6 +690,8 @@ export default function openCandleExtension(pi, options) {
|
|
|
679
690
|
}
|
|
680
691
|
async function dispatchRouterWorkflow(output, ctx, originalText) {
|
|
681
692
|
const workflow = output.workflow;
|
|
693
|
+
if (!workflow)
|
|
694
|
+
return false;
|
|
682
695
|
const storage = coordinator.getStorage();
|
|
683
696
|
const workflowPrefs = storage?.getWorkflowPreferences("global") ?? {};
|
|
684
697
|
const entities = mergeRouterSlotsIntoEntities(output);
|
|
@@ -693,7 +706,7 @@ export default function openCandleExtension(pi, options) {
|
|
|
693
706
|
const definition = buildPortfolioWorkflowDefinition(resolution);
|
|
694
707
|
const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
|
|
695
708
|
if (prompt)
|
|
696
|
-
markOriginalInput(originalText);
|
|
709
|
+
markOriginalInput(originalText, ctx);
|
|
697
710
|
return prompt ? { action: "transform", text: prompt } : false;
|
|
698
711
|
}
|
|
699
712
|
if (workflow === "options_screener") {
|
|
@@ -710,7 +723,7 @@ export default function openCandleExtension(pi, options) {
|
|
|
710
723
|
const definition = buildOptionsScreenerWorkflowDefinition(resolution);
|
|
711
724
|
const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
|
|
712
725
|
if (prompt)
|
|
713
|
-
markOriginalInput(originalText);
|
|
726
|
+
markOriginalInput(originalText, ctx);
|
|
714
727
|
return prompt ? { action: "transform", text: prompt } : false;
|
|
715
728
|
}
|
|
716
729
|
// Missing required symbol — treat as fallback with ask_user directive.
|
|
@@ -756,7 +769,7 @@ export default function openCandleExtension(pi, options) {
|
|
|
756
769
|
applyPreflightAnnotation(definition, preflight.dropped);
|
|
757
770
|
const prompt = coordinator.transformWorkflowInput(pi, definition, ctx);
|
|
758
771
|
if (prompt)
|
|
759
|
-
markOriginalInput(originalText);
|
|
772
|
+
markOriginalInput(originalText, ctx);
|
|
760
773
|
return prompt ? { action: "transform", text: prompt } : false;
|
|
761
774
|
}
|
|
762
775
|
// single_asset_analysis / watchlist / general_qa + any workflow with
|
|
@@ -977,7 +990,6 @@ export default function openCandleExtension(pi, options) {
|
|
|
977
990
|
const model = ctx.model;
|
|
978
991
|
if (!model)
|
|
979
992
|
return null;
|
|
980
|
-
// biome-ignore lint/suspicious/noExplicitAny: Pi typings keep Model generic
|
|
981
993
|
return createPiAiRouterClient(model);
|
|
982
994
|
}
|
|
983
995
|
// System prompt assembly — delegate to coordinator. When a fallback context
|
|
@@ -990,6 +1002,34 @@ export default function openCandleExtension(pi, options) {
|
|
|
990
1002
|
};
|
|
991
1003
|
});
|
|
992
1004
|
}
|
|
1005
|
+
function hasUnconsumedOriginalInputMarker(ctx) {
|
|
1006
|
+
const manager = ctx?.sessionManager;
|
|
1007
|
+
const entries = typeof manager?.getBranch === "function"
|
|
1008
|
+
? manager.getBranch()
|
|
1009
|
+
: typeof manager?.getEntries === "function"
|
|
1010
|
+
? manager.getEntries()
|
|
1011
|
+
: [];
|
|
1012
|
+
let markerAfterLastUser = false;
|
|
1013
|
+
for (const entry of entries) {
|
|
1014
|
+
if (!isSessionEntryRecord(entry))
|
|
1015
|
+
continue;
|
|
1016
|
+
if (entry.type === "message" && entry.message?.role === "user") {
|
|
1017
|
+
markerAfterLastUser = false;
|
|
1018
|
+
continue;
|
|
1019
|
+
}
|
|
1020
|
+
if (entry.type === "custom" && entry.customType === "opencandle-user-input") {
|
|
1021
|
+
markerAfterLastUser = true;
|
|
1022
|
+
continue;
|
|
1023
|
+
}
|
|
1024
|
+
if (markerAfterLastUser) {
|
|
1025
|
+
markerAfterLastUser = false;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
return markerAfterLastUser;
|
|
1029
|
+
}
|
|
1030
|
+
function isSessionEntryRecord(entry) {
|
|
1031
|
+
return typeof entry === "object" && entry !== null;
|
|
1032
|
+
}
|
|
993
1033
|
/** Concatenate text from a Pi message `content` (plain string or block array). */
|
|
994
1034
|
function extractMessageText(content) {
|
|
995
1035
|
if (typeof content === "string")
|
|
@@ -1026,4 +1066,3 @@ function isPlaceholderSessionName(name, candidates) {
|
|
|
1026
1066
|
}
|
|
1027
1067
|
return false;
|
|
1028
1068
|
}
|
|
1029
|
-
//# sourceMappingURL=opencandle-extension.js.map
|
package/dist/pi/session.js
CHANGED
package/dist/pi/setup.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
type SetupMode = "startup" | "manual";
|
|
3
3
|
type SetupRequirement = "ready" | "select_model" | "connect_auth";
|
|
4
|
+
type ApiKeyProviderId = "google" | "openai" | "anthropic";
|
|
4
5
|
type SetupResult = "ready" | "shutdown" | "cancelled";
|
|
5
6
|
export declare function getLlmSetupRequirement(ctx: Pick<ExtensionContext, "model" | "modelRegistry">): SetupRequirement;
|
|
7
|
+
export declare function runApiKeySetup(ctx: ExtensionContext, provider: ApiKeyProviderId): Promise<boolean>;
|
|
6
8
|
export declare function runOpenCandleSetup(api: ExtensionAPI, ctx: ExtensionContext, options?: {
|
|
7
9
|
mode: SetupMode;
|
|
8
10
|
}): Promise<SetupResult>;
|
package/dist/pi/setup.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LoginDialogComponent, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { validateModelKey } from "../onboarding/validate-model-key.js";
|
|
2
3
|
/**
|
|
3
4
|
* Registry of "fast default" models for each LLM auth provider. After a fresh
|
|
4
5
|
* sign-in we try to activate the default without opening a picker, falling back
|
|
@@ -174,7 +175,7 @@ async function runLoginDialog(ctx, providerId) {
|
|
|
174
175
|
}
|
|
175
176
|
return false;
|
|
176
177
|
}
|
|
177
|
-
async function runApiKeySetup(ctx, provider) {
|
|
178
|
+
export async function runApiKeySetup(ctx, provider) {
|
|
178
179
|
const label = API_KEY_PROVIDER_LABELS[provider];
|
|
179
180
|
ctx.ui.notify(`OpenCandle stores your ${label} API key locally. After saving it, OpenCandle will select a fast default model when one is available.`, "info");
|
|
180
181
|
const key = await ctx.ui.input(`Paste your ${label} API key`, "API key");
|
|
@@ -183,9 +184,16 @@ async function runApiKeySetup(ctx, provider) {
|
|
|
183
184
|
ctx.ui.notify("No API key entered.", "warning");
|
|
184
185
|
return false;
|
|
185
186
|
}
|
|
187
|
+
const validation = await validateModelKey(provider, trimmed);
|
|
188
|
+
if (validation.status === "invalid") {
|
|
189
|
+
ctx.ui.notify(`Key was rejected by ${validation.providerLabel}. Paste a different key.`, "error");
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
186
192
|
ctx.modelRegistry.authStorage.set(provider, { type: "api_key", key: trimmed });
|
|
187
193
|
ctx.modelRegistry.refresh();
|
|
188
|
-
ctx.ui.notify(
|
|
194
|
+
ctx.ui.notify(validation.status === "transient"
|
|
195
|
+
? `Saved — couldn't verify (network issue). ${label} API key saved to OpenCandle.`
|
|
196
|
+
: `${label} API key saved to OpenCandle.`, "info");
|
|
189
197
|
return true;
|
|
190
198
|
}
|
|
191
199
|
/**
|
|
@@ -316,4 +324,3 @@ export async function runOpenCandleSetup(api, ctx, options = { mode: "startup" }
|
|
|
316
324
|
}
|
|
317
325
|
return "ready";
|
|
318
326
|
}
|
|
319
|
-
//# sourceMappingURL=setup.js.map
|
package/dist/pi/tool-adapter.js
CHANGED
|
@@ -33,7 +33,7 @@ export class PromptContextBuilder {
|
|
|
33
33
|
let truncationMarkers = 0;
|
|
34
34
|
for (const name of SECTION_ORDER) {
|
|
35
35
|
const section = this.sections.get(name);
|
|
36
|
-
if (!section
|
|
36
|
+
if (!section?.content)
|
|
37
37
|
continue;
|
|
38
38
|
const truncated = truncateTobudget(section.content, section.characterBudget);
|
|
39
39
|
const wasTruncated = truncated.includes("[...truncated]");
|
|
@@ -258,4 +258,3 @@ Every committal response MUST carry four elements:
|
|
|
258
258
|
|
|
259
259
|
## Assumption Disclosure
|
|
260
260
|
Structured workflow prompts may include a pre-rendered "Assumptions" block with correct source attribution (user-specified, saved preference, or default). Start with that block only when the workflow instructions explicitly say to. Fallback prompts include "Assumptions Context" only for internal routing context; do not reproduce that context unless the user explicitly asks for assumptions. Do NOT independently relabel any value's source anywhere in your response. When an assumptions block is shown, it is the single authoritative provenance representation.`;
|
|
261
|
-
//# sourceMappingURL=context-builder.js.map
|
|
@@ -6,4 +6,3 @@
|
|
|
6
6
|
export const DISCLAIMER_TEXT = "OpenCandle is a research and analysis tool, not financial advice or a fiduciary financial advisor. " +
|
|
7
7
|
"Views, targets, and allocations are informational analyst output — not personalized recommendations. " +
|
|
8
8
|
"Verify independently before acting.";
|
|
9
|
-
//# sourceMappingURL=disclaimer.js.map
|
package/dist/prompts/sections.js
CHANGED
|
@@ -442,4 +442,3 @@ ${tableInstruction}
|
|
|
442
442
|
${actionPlanResponse}
|
|
443
443
|
- Note any caveats (different sectors, concentration, market cap disparity, unavailable fundamentals, unavailable forward-looking estimates, etc.).${horizonResponse}`;
|
|
444
444
|
}
|
|
445
|
-
//# sourceMappingURL=workflow-prompts.js.map
|
|
@@ -182,7 +182,7 @@ export async function getGlobalQuote(symbol, apiKey) {
|
|
|
182
182
|
const data = await httpGet(url);
|
|
183
183
|
throwIfApiMessage(data);
|
|
184
184
|
const gq = data["Global Quote"];
|
|
185
|
-
if (!gq
|
|
185
|
+
if (!gq?.["05. price"]) {
|
|
186
186
|
throw new Error(`Alpha Vantage: No quote data for ${symbol}`);
|
|
187
187
|
}
|
|
188
188
|
const price = parseFloat(gq["05. price"]) || 0;
|
|
@@ -201,6 +201,7 @@ export async function getGlobalQuote(symbol, apiKey) {
|
|
|
201
201
|
week52High: 0, // Not available from GLOBAL_QUOTE
|
|
202
202
|
week52Low: 0, // Not available from GLOBAL_QUOTE
|
|
203
203
|
timestamp: Date.now(),
|
|
204
|
+
asOf: dateOnlyValue(gq["07. latest trading day"]),
|
|
204
205
|
};
|
|
205
206
|
cache.set(cacheKey, result, TTL.QUOTE);
|
|
206
207
|
return result;
|
|
@@ -213,6 +214,11 @@ export async function getGlobalQuote(symbol, apiKey) {
|
|
|
213
214
|
throw error;
|
|
214
215
|
}
|
|
215
216
|
}
|
|
217
|
+
function dateOnlyValue(value) {
|
|
218
|
+
if (!value || !/^\d{4}-\d{2}-\d{2}$/.test(value))
|
|
219
|
+
return undefined;
|
|
220
|
+
return value;
|
|
221
|
+
}
|
|
216
222
|
export async function getDailyHistory(symbol, apiKey, range = "6mo") {
|
|
217
223
|
const cacheKey = `av:daily:${symbol}:${range}`;
|
|
218
224
|
const cached = cache.get(cacheKey);
|
|
@@ -285,6 +291,5 @@ function parseNullableNum(s) {
|
|
|
285
291
|
if (!s || s === "None" || s === "-")
|
|
286
292
|
return null;
|
|
287
293
|
const n = parseFloat(s);
|
|
288
|
-
return isNaN(n) ? null : n;
|
|
294
|
+
return Number.isNaN(n) ? null : n;
|
|
289
295
|
}
|
|
290
|
-
//# sourceMappingURL=alpha-vantage.js.map
|
|
@@ -28,6 +28,7 @@ export async function getCryptoPrice(id) {
|
|
|
28
28
|
circulatingSupply: md.circulating_supply,
|
|
29
29
|
totalSupply: md.total_supply,
|
|
30
30
|
timestamp: Date.now(),
|
|
31
|
+
asOf: md.last_updated,
|
|
31
32
|
};
|
|
32
33
|
cache.set(cacheKey, result, TTL.QUOTE);
|
|
33
34
|
return result;
|
|
@@ -66,4 +67,3 @@ export async function getCryptoHistory(id, days = 180) {
|
|
|
66
67
|
throw error;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
|
-
//# sourceMappingURL=coingecko.js.map
|
package/dist/providers/errors.js
CHANGED
|
@@ -90,14 +90,16 @@ function parseMcpResultBlocks(text) {
|
|
|
90
90
|
return results;
|
|
91
91
|
}
|
|
92
92
|
function mapApiResults(results) {
|
|
93
|
-
return results
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
return results.flatMap((r) => {
|
|
94
|
+
if (!r.url)
|
|
95
|
+
return [];
|
|
96
|
+
return {
|
|
97
|
+
title: r.title ?? "",
|
|
98
|
+
url: r.url,
|
|
99
|
+
published: r.publishedDate ?? null,
|
|
100
|
+
snippet: (r.highlights?.join(" ") || r.text || "").slice(0, SNIPPET_MAX_CHARS),
|
|
101
|
+
};
|
|
102
|
+
});
|
|
101
103
|
}
|
|
102
104
|
// ---------------------------------------------------------------------------
|
|
103
105
|
// Freshness post-filter
|
|
@@ -108,7 +110,7 @@ function filterByFreshness(results, freshness) {
|
|
|
108
110
|
if (!r.published)
|
|
109
111
|
return true; // benefit of the doubt
|
|
110
112
|
const pubTime = new Date(r.published).getTime();
|
|
111
|
-
return !isNaN(pubTime) && pubTime >= cutoff;
|
|
113
|
+
return !Number.isNaN(pubTime) && pubTime >= cutoff;
|
|
112
114
|
});
|
|
113
115
|
}
|
|
114
116
|
// ---------------------------------------------------------------------------
|
|
@@ -281,4 +283,3 @@ export async function exaSearch(query, opts) {
|
|
|
281
283
|
}
|
|
282
284
|
// Exported for testing
|
|
283
285
|
export { enrichQueryForMcp, extractJsonRpcPayload, filterByFreshness, mapApiResults, parseMcpResultBlocks, };
|
|
284
|
-
//# sourceMappingURL=exa-search.js.map
|
package/dist/providers/fred.js
CHANGED
package/dist/providers/index.js
CHANGED
|
@@ -7,4 +7,3 @@ export { searchFilings } from "./sec-edgar.js";
|
|
|
7
7
|
export { getQuotes, screenStocks } from "./tradingview.js";
|
|
8
8
|
export { braveSearch, ddgSearch, normalizeFinancialQuery, searchWeb } from "./web-search.js";
|
|
9
9
|
export { clearCrumbCache, computeTimeToExpiry, getHistory, getOptionsChain, getQuote, getYahooCrumb, } from "./yahoo-finance.js";
|
|
10
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { cache, STALE_LIMIT, TTL } from "../infra/cache.js";
|
|
2
|
+
import { httpGet } from "../infra/http-client.js";
|
|
3
|
+
import { rateLimiter } from "../infra/rate-limiter.js";
|
|
4
|
+
const BASE_URL = "https://gamma-api.polymarket.com";
|
|
5
|
+
const POLYMARKET_URL = "https://polymarket.com";
|
|
6
|
+
export async function searchPredictionMarkets(query, limit = 8) {
|
|
7
|
+
const normalizedQuery = query.trim();
|
|
8
|
+
const normalizedLimit = normalizeLimit(limit);
|
|
9
|
+
if (!normalizedQuery)
|
|
10
|
+
return [];
|
|
11
|
+
const cacheKey = `polymarket:search:${normalizedQuery.toLowerCase()}:${normalizedLimit}`;
|
|
12
|
+
const cached = cache.get(cacheKey);
|
|
13
|
+
if (cached)
|
|
14
|
+
return cached;
|
|
15
|
+
try {
|
|
16
|
+
await rateLimiter.acquire("polymarket");
|
|
17
|
+
const url = `${BASE_URL}/public-search?q=${encodeURIComponent(normalizedQuery)}&limit=${normalizedLimit}`;
|
|
18
|
+
const response = await httpGet(url, {
|
|
19
|
+
headers: { Accept: "application/json" },
|
|
20
|
+
maxRetries: 0,
|
|
21
|
+
});
|
|
22
|
+
const quotes = decodeSearchResponse(response).slice(0, normalizedLimit);
|
|
23
|
+
cache.set(cacheKey, quotes, TTL.PREDICTION_MARKETS);
|
|
24
|
+
return quotes;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const stale = cache.getStale(cacheKey, STALE_LIMIT.PREDICTION_MARKETS);
|
|
28
|
+
if (stale)
|
|
29
|
+
return stale.value;
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function decodeSearchResponse(response) {
|
|
34
|
+
const markets = [
|
|
35
|
+
...(response.events ?? []).flatMap((event) => (event.markets ?? []).map((market) => ({ event, market }))),
|
|
36
|
+
...(response.markets ?? []).map((market) => ({ market })),
|
|
37
|
+
];
|
|
38
|
+
return markets.flatMap(({ event, market }) => isOpenMarket(market) ? marketToQuotes(market, event) : []);
|
|
39
|
+
}
|
|
40
|
+
function marketToQuotes(market, event) {
|
|
41
|
+
const marketId = market.id === undefined ? undefined : String(market.id);
|
|
42
|
+
const title = stringValue(market.question) ?? stringValue(event?.title);
|
|
43
|
+
if (!marketId || !title)
|
|
44
|
+
return [];
|
|
45
|
+
const outcomes = parseStringArray(market.outcomes);
|
|
46
|
+
const prices = parseNumberArray(market.outcomePrices);
|
|
47
|
+
if (outcomes.length === 0 || prices.length === 0)
|
|
48
|
+
return [];
|
|
49
|
+
const resolutionCriteria = firstNonEmpty(market.description, market.resolutionSource);
|
|
50
|
+
const volumeUsd = numberValue(market.volumeNum) ?? numberValue(market.volume) ?? numberValue(event?.volume);
|
|
51
|
+
const liquidityUsd = numberValue(market.liquidityNum) ??
|
|
52
|
+
numberValue(market.liquidity) ??
|
|
53
|
+
numberValue(event?.liquidity);
|
|
54
|
+
const closeDate = stringValue(market.endDate) ?? normalizeDateOnly(market.endDateIso ?? event?.endDate);
|
|
55
|
+
const url = marketUrl(market, event);
|
|
56
|
+
const asOf = stringValue(market.updatedAt) ?? stringValue(event?.updatedAt);
|
|
57
|
+
return outcomes.flatMap((outcome, index) => {
|
|
58
|
+
const probability = prices[index];
|
|
59
|
+
if (probability === undefined || probability < 0 || probability > 1)
|
|
60
|
+
return [];
|
|
61
|
+
return [
|
|
62
|
+
{
|
|
63
|
+
source: "polymarket",
|
|
64
|
+
marketId,
|
|
65
|
+
title,
|
|
66
|
+
outcome,
|
|
67
|
+
probability,
|
|
68
|
+
...(volumeUsd !== undefined && { volumeUsd }),
|
|
69
|
+
...(liquidityUsd !== undefined && { liquidityUsd }),
|
|
70
|
+
...(closeDate && { closeDate }),
|
|
71
|
+
...(resolutionCriteria && { resolutionCriteria }),
|
|
72
|
+
url,
|
|
73
|
+
...(asOf && { asOf }),
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function isOpenMarket(market) {
|
|
79
|
+
if (booleanValue(market.closed) === true)
|
|
80
|
+
return false;
|
|
81
|
+
if (booleanValue(market.active) === false)
|
|
82
|
+
return false;
|
|
83
|
+
const endDate = stringValue(market.endDate) ?? stringValue(market.endDateIso);
|
|
84
|
+
if (!endDate)
|
|
85
|
+
return true;
|
|
86
|
+
const parsed = new Date(endDate);
|
|
87
|
+
return Number.isNaN(parsed.getTime()) || parsed.getTime() > Date.now();
|
|
88
|
+
}
|
|
89
|
+
function normalizeLimit(limit) {
|
|
90
|
+
if (!Number.isFinite(limit))
|
|
91
|
+
return 8;
|
|
92
|
+
return Math.min(50, Math.max(1, Math.floor(limit)));
|
|
93
|
+
}
|
|
94
|
+
function parseStringArray(value) {
|
|
95
|
+
const parsed = parseJsonArray(value);
|
|
96
|
+
return parsed.flatMap((item) => {
|
|
97
|
+
const text = stringValue(item);
|
|
98
|
+
return text ? [text] : [];
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function parseNumberArray(value) {
|
|
102
|
+
const parsed = parseJsonArray(value);
|
|
103
|
+
return parsed.map((item) => numberValue(item));
|
|
104
|
+
}
|
|
105
|
+
function parseJsonArray(value) {
|
|
106
|
+
if (Array.isArray(value))
|
|
107
|
+
return value;
|
|
108
|
+
if (typeof value !== "string")
|
|
109
|
+
return [];
|
|
110
|
+
try {
|
|
111
|
+
const parsed = JSON.parse(value);
|
|
112
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function numberValue(value) {
|
|
119
|
+
const number = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
|
|
120
|
+
return Number.isFinite(number) ? number : undefined;
|
|
121
|
+
}
|
|
122
|
+
function stringValue(value) {
|
|
123
|
+
if (typeof value !== "string")
|
|
124
|
+
return undefined;
|
|
125
|
+
const trimmed = value.trim();
|
|
126
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
127
|
+
}
|
|
128
|
+
function booleanValue(value) {
|
|
129
|
+
if (typeof value === "boolean")
|
|
130
|
+
return value;
|
|
131
|
+
if (typeof value !== "string")
|
|
132
|
+
return undefined;
|
|
133
|
+
const normalized = value.trim().toLowerCase();
|
|
134
|
+
if (normalized === "true")
|
|
135
|
+
return true;
|
|
136
|
+
if (normalized === "false")
|
|
137
|
+
return false;
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
function firstNonEmpty(...values) {
|
|
141
|
+
for (const value of values) {
|
|
142
|
+
const text = stringValue(value);
|
|
143
|
+
if (text)
|
|
144
|
+
return text;
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
function normalizeDateOnly(value) {
|
|
149
|
+
if (!value)
|
|
150
|
+
return undefined;
|
|
151
|
+
return /^\d{4}-\d{2}-\d{2}$/.test(value) ? `${value}T00:00:00Z` : value;
|
|
152
|
+
}
|
|
153
|
+
function marketUrl(market, event) {
|
|
154
|
+
const marketSlug = stringValue(market.slug);
|
|
155
|
+
const eventSlug = stringValue(event?.slug);
|
|
156
|
+
if (eventSlug && marketSlug) {
|
|
157
|
+
return `${POLYMARKET_URL}/event/${encodeURIComponent(eventSlug)}/${encodeURIComponent(marketSlug)}`;
|
|
158
|
+
}
|
|
159
|
+
if (marketSlug)
|
|
160
|
+
return `${POLYMARKET_URL}/event/${encodeURIComponent(marketSlug)}`;
|
|
161
|
+
return POLYMARKET_URL;
|
|
162
|
+
}
|
package/dist/providers/reddit.js
CHANGED