opencandle 0.11.1 → 0.13.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 +50 -186
- package/dist/analysts/contracts.js +0 -1
- package/dist/analysts/orchestrator.js +0 -1
- package/dist/cli-main.js +22 -15
- package/dist/cli-options.d.ts +4 -0
- package/dist/cli-options.js +33 -0
- package/dist/cli.js +8 -3
- package/dist/config.d.ts +4 -0
- package/dist/config.js +1 -1
- package/dist/doctor/cli-command.js +9 -5
- package/dist/doctor/render.js +0 -1
- package/dist/doctor/report.js +53 -11
- 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 +388 -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/history-snapshot-store.d.ts +8 -0
- package/dist/gui/server/history-snapshot-store.js +43 -0
- package/dist/gui/server/http-routes.d.ts +71 -0
- package/dist/gui/server/http-routes.js +1033 -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 +21 -0
- package/dist/gui/server/live-chat-event-adapter.js +224 -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-indices-api.d.ts +21 -0
- package/dist/gui/server/market-indices-api.js +26 -0
- package/dist/gui/server/market-indices-snapshot-store.d.ts +12 -0
- package/dist/gui/server/market-indices-snapshot-store.js +56 -0
- package/dist/gui/server/market-state-api.d.ts +250 -0
- package/dist/gui/server/market-state-api.js +597 -0
- package/dist/gui/server/model-setup.d.ts +55 -0
- package/dist/gui/server/model-setup.js +154 -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 +262 -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 +4 -0
- package/dist/infra/cache.js +4 -1
- package/dist/infra/freshness.js +0 -1
- package/dist/infra/http-client.js +1 -2
- package/dist/infra/index.js +0 -1
- package/dist/infra/lse-byte-budget.d.ts +10 -0
- package/dist/infra/lse-byte-budget.js +47 -0
- package/dist/infra/market-calendar.js +0 -1
- 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.js +1 -13
- 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 +16 -1
- package/dist/onboarding/providers.js +20 -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 +86 -0
- package/dist/onboarding/validation.js +8 -1
- package/dist/pi/opencandle-extension.d.ts +2 -1
- package/dist/pi/opencandle-extension.js +4 -4
- 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.d.ts +2 -3
- package/dist/pi/session.js +7 -6
- package/dist/pi/setup.d.ts +4 -2
- package/dist/pi/setup.js +60 -61
- 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 +16 -15
- package/dist/providers/alpha-vantage.js +2 -3
- package/dist/providers/coingecko.js +0 -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.d.ts +1 -0
- package/dist/providers/index.js +1 -1
- package/dist/providers/lse.d.ts +35 -0
- package/dist/providers/lse.js +284 -0
- package/dist/providers/polymarket.js +22 -6
- 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 +1 -1
- package/dist/providers/yahoo-finance.js +68 -4
- package/dist/routing/classify-intent.js +0 -1
- package/dist/routing/defaults.js +0 -1
- package/dist/routing/entity-extractor.js +2 -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 -1
- package/dist/routing/router-llm-client.d.ts +2 -2
- package/dist/routing/router-llm-client.js +0 -1
- package/dist/routing/router-prompt.js +0 -1
- package/dist/routing/router-types.js +0 -1
- package/dist/routing/router.js +9 -3
- package/dist/routing/slot-resolver.js +0 -1
- 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 +1 -2
- package/dist/runtime/numeric-claims.js +0 -1
- package/dist/runtime/planning-evidence.js +0 -1
- package/dist/runtime/prompt-step.js +0 -1
- package/dist/runtime/provider-tracker.js +0 -1
- package/dist/runtime/run-context.js +0 -1
- package/dist/runtime/session-coordinator.d.ts +2 -2
- package/dist/runtime/session-coordinator.js +2 -3
- package/dist/runtime/session-title.js +0 -1
- package/dist/runtime/tool-defaults-wrapper.js +0 -1
- package/dist/runtime/validation.js +0 -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.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.js +6 -4
- package/dist/tools/fundamentals/dcf.js +37 -9
- package/dist/tools/fundamentals/earnings.d.ts +1 -1
- package/dist/tools/fundamentals/earnings.js +2 -1
- package/dist/tools/fundamentals/financials.js +88 -9
- package/dist/tools/fundamentals/sec-filings.js +0 -1
- package/dist/tools/index.d.ts +121 -2
- package/dist/tools/index.js +3 -1
- package/dist/tools/interaction/ask-user.js +11 -1
- package/dist/tools/macro/event-probabilities.js +0 -1
- 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 +2 -2
- package/dist/tools/market/crypto-price.js +0 -1
- package/dist/tools/market/price-comparison.d.ts +30 -0
- package/dist/tools/market/price-comparison.js +202 -0
- package/dist/tools/market/screen-stocks.js +0 -1
- package/dist/tools/market/search-ticker.js +1 -2
- package/dist/tools/market/stock-history.d.ts +18 -3
- package/dist/tools/market/stock-history.js +132 -18
- package/dist/tools/market/stock-quote.d.ts +2 -2
- package/dist/tools/market/stock-quote.js +0 -1
- package/dist/tools/options/greeks.js +0 -1
- package/dist/tools/options/option-chain.d.ts +2 -2
- package/dist/tools/options/option-chain.js +0 -1
- package/dist/tools/portfolio/alerts.d.ts +2 -1
- package/dist/tools/portfolio/alerts.js +228 -2
- package/dist/tools/portfolio/correlation.d.ts +1 -1
- 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 +2 -2
- package/dist/tools/portfolio/risk-analysis.js +0 -1
- 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 +0 -1
- package/dist/types/fundamentals.js +0 -1
- 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.js +0 -1
- package/dist/types/portfolio.js +0 -1
- package/dist/types/prediction-markets.js +0 -1
- 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-Cy8Fq0fn.js +1 -0
- package/gui/web/dist/assets/allocation-donut-DgBRIKCk.js +52 -0
- package/gui/web/dist/assets/index-DIlFyIOO.js +66 -0
- package/gui/web/dist/assets/index-DS4jESOB.css +2 -0
- package/gui/web/dist/assets/market-chart-DammaCjH.js +1 -0
- package/gui/web/dist/assets/utils-CnADgYgh.js +1 -0
- package/gui/web/dist/index.html +3 -2
- package/package.json +23 -26
- 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/freshness.js.map +0 -1
- package/dist/infra/http-client.js.map +0 -1
- package/dist/infra/index.js.map +0 -1
- package/dist/infra/market-calendar.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/market-state/summaries.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/polymarket.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/numeric-claims.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/event-probabilities.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/prediction-markets.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 -294
- package/gui/server/gui-session-manager.ts +0 -5
- package/gui/server/http-routes.ts +0 -1201
- package/gui/server/invoke-tool.ts +0 -490
- package/gui/server/live-chat-event-adapter.ts +0 -243
- package/gui/server/local-session-coordinator.ts +0 -97
- package/gui/server/market-state-api.ts +0 -331
- 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 -392
- 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 -323
- package/gui/server/session-entry-wait.ts +0 -179
- 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 -403
- package/gui/shared/chat-events.ts +0 -165
- package/gui/shared/event-reducer.ts +0 -220
- package/gui/web/dist/assets/CatalogOverlay-DZ1niyQm.js +0 -1
- package/gui/web/dist/assets/index-D4F9AJnn.css +0 -2
- package/gui/web/dist/assets/index-DtqMMBTr.js +0 -65
- package/src/analysts/contracts.ts +0 -176
- package/src/analysts/orchestrator.ts +0 -244
- 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 -127
- package/src/infra/freshness.ts +0 -165
- package/src/infra/http-client.ts +0 -134
- package/src/infra/index.ts +0 -14
- package/src/infra/market-calendar.ts +0 -193
- 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 -77
- 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/market-state/summaries.ts +0 -75
- 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 -442
- 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 -1294
- 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 -340
- package/src/providers/coingecko.ts +0 -95
- 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/polymarket.ts +0 -214
- 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 -105
- package/src/providers/yahoo-finance.ts +0 -984
- package/src/routing/classify-intent.ts +0 -380
- package/src/routing/defaults.ts +0 -29
- package/src/routing/entity-extractor.ts +0 -557
- 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 -64
- package/src/routing/router-prompt.ts +0 -159
- package/src/routing/router-types.ts +0 -84
- package/src/routing/router.ts +0 -1332
- 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 -78
- package/src/runtime/numeric-claims.ts +0 -108
- package/src/runtime/planning-evidence.ts +0 -597
- package/src/runtime/prompt-step.ts +0 -185
- package/src/runtime/provider-tracker.ts +0 -40
- package/src/runtime/run-context.ts +0 -32
- package/src/runtime/session-coordinator.ts +0 -1037
- 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 -77
- package/src/runtime/workflow-runner.ts +0 -182
- package/src/runtime/workflow-types.ts +0 -105
- 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 -180
- package/src/tools/fundamentals/dcf.ts +0 -447
- 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 -104
- package/src/tools/interaction/ask-user.ts +0 -93
- package/src/tools/macro/event-probabilities.ts +0 -141
- 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 -65
- package/src/tools/market/screen-stocks.ts +0 -290
- 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 -73
- package/src/tools/options/greeks.ts +0 -81
- package/src/tools/options/option-chain.ts +0 -134
- 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 -47
- package/src/types/index.ts +0 -26
- package/src/types/macro.ts +0 -27
- package/src/types/market.ts +0 -46
- package/src/types/options.ts +0 -53
- package/src/types/portfolio.ts +0 -83
- package/src/types/prediction-markets.ts +0 -13
- 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
package/README.md
CHANGED
|
@@ -1,36 +1,28 @@
|
|
|
1
1
|
# OpenCandle
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
npx opencandle
|
|
5
|
-
# or
|
|
6
|
-
npx opencandle gui
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
OpenCandle is an open source financial investigator: a terminal agent and local browser workbench for market research that starts from real provider data, shows source gaps, and keeps risk visible.
|
|
3
|
+
OpenCandle is an open source financial investigator: a terminal agent and local browser workbench for market research that uses real-time provider data to try to accurately answer financial questions.
|
|
10
4
|
|
|
11
|
-
[](https://github.com/Kahtaf/OpenCandle/actions/workflows/ci.yml)
|
|
12
6
|
[](https://www.npmjs.com/package/opencandle)
|
|
13
|
-
[](https://www.npmjs.com/package/opencandle)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npx opencandle # terminal
|
|
12
|
+
npx opencandle gui # browser UI at http://127.0.0.1:14567
|
|
13
|
+
```
|
|
14
14
|
|
|
15
15
|
[Docs](https://opencandle.app/docs/) | [First run](https://opencandle.app/docs/first-run.html) | [GUI quickstart](https://opencandle.app/docs/gui-quickstart.html) | [Data sources](https://opencandle.app/docs/data-sources.html) | [Build a tool](https://opencandle.app/docs/build-a-tool.html)
|
|
16
16
|
|
|
17
17
|
## See It Work
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
[](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-tui.mp4)
|
|
19
|
+
https://github.com/user-attachments/assets/334956b1-18b4-4d6f-92b5-3f739824cd29
|
|
22
20
|
|
|
23
|
-
[
|
|
24
|
-
|
|
25
|
-
### Local GUI
|
|
26
|
-
|
|
27
|
-
[](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-gui.mp4)
|
|
28
|
-
|
|
29
|
-
[Watch the local GUI demo](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-gui.mp4) | [Download MP4](https://github.com/Kahtaf/OpenCandle/raw/refs/heads/main/assets/opencandle-gui.mp4)
|
|
21
|
+

|
|
30
22
|
|
|
31
23
|
## Why OpenCandle
|
|
32
24
|
|
|
33
|
-
|
|
25
|
+
Generic LLMs answer too early. OpenCandle is built around the opposite loop: understand the question, gather market evidence, disclose missing or stale data, then synthesize.
|
|
34
26
|
|
|
35
27
|
Use it when a question needs inspectable evidence:
|
|
36
28
|
|
|
@@ -42,38 +34,27 @@ Use it when a question needs inspectable evidence:
|
|
|
42
34
|
|
|
43
35
|
OpenCandle is read-only research software. It does not place trades, route orders, or provide financial advice.
|
|
44
36
|
|
|
45
|
-
##
|
|
37
|
+
## Features
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
| Local state | OpenCandle user state lives under `~/.opencandle/` unless `OPENCANDLE_HOME` is set; durable market state is stored in SQLite at `state.db`. |
|
|
55
|
-
| Extensible tools | TypeScript tool APIs, provider boundaries, workflow builders, and package exports for add-on tools. |
|
|
56
|
-
| Eval harness | Unit tests, live provider checks, CLI e2e, GUI browser smoke tests, and competitive finance evals. |
|
|
39
|
+
- **Terminal agent** — keyboard-driven research in the bundled [Pi](https://github.com/earendil-works/pi) TUI, with sessions, slash commands, and saved transcripts.
|
|
40
|
+
- **Local browser GUI** — chat with result cards and interactive charts, a market dashboard, per-ticker symbol pages, watchlists and portfolios with live sparklines.
|
|
41
|
+
- **Evidence-first answers** — tools fetch and format data; the model synthesizes only after evidence is gathered.
|
|
42
|
+
- **Finance routing** — quotes, comparisons, portfolio reviews, options, filings, macro, sentiment, and education each get a purpose-built research path.
|
|
43
|
+
- **Provider transparency** — missing keys, degraded sources, and stale data are disclosed instead of hidden.
|
|
44
|
+
- **Local state** — watchlists, portfolios, and alerts stay on your machine under `~/.opencandle/`; sessions in Pi's local storage.
|
|
45
|
+
- **Extensible** — typed TypeScript tool APIs for building and publishing add-on tools.
|
|
57
46
|
|
|
58
47
|
## Quick Start
|
|
59
48
|
|
|
60
|
-
Requires Node.js
|
|
49
|
+
Requires [Node.js](https://nodejs.org/) 22.19+ or 24–26. macOS and Linux are fully supported; Windows is best-effort (WSL recommended).
|
|
61
50
|
|
|
62
51
|
```bash
|
|
63
52
|
npx opencandle
|
|
64
53
|
```
|
|
65
54
|
|
|
66
|
-
On first run, OpenCandle walks you through model setup
|
|
67
|
-
|
|
68
|
-
Start the GUI instead:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
npx opencandle gui
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Then open `http://127.0.0.1:14567`.
|
|
55
|
+
On first run, OpenCandle walks you through model setup — use Pi sign-in when offered, or provide a model API key (in the GUI, use the API-key setup panel). Data-provider keys are separate and optional. For the five-minute path from install to a first answer, see [First Run](https://opencandle.app/docs/first-run.html).
|
|
75
56
|
|
|
76
|
-
|
|
57
|
+
Check your setup anytime with `npx opencandle doctor` (or the GUI's `/diagnostics` page).
|
|
77
58
|
|
|
78
59
|
## Example Prompts
|
|
79
60
|
|
|
@@ -87,85 +68,28 @@ Run risk analysis on SPY
|
|
|
87
68
|
/analyze NVDA # deep research: multi-analyst debate, takes a few minutes
|
|
88
69
|
```
|
|
89
70
|
|
|
90
|
-
Useful slash commands:
|
|
91
|
-
|
|
92
|
-
```text
|
|
93
|
-
/setup
|
|
94
|
-
/login
|
|
95
|
-
/model
|
|
96
|
-
/connect
|
|
97
|
-
/analyze AAPL # deep research: multi-analyst debate, takes a few minutes
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Health diagnostics run from your shell:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
opencandle doctor
|
|
104
|
-
opencandle doctor --json
|
|
105
|
-
opencandle doctor --sessions
|
|
106
|
-
opencandle doctor --full
|
|
107
|
-
opencandle doctor --enable twitter
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
The GUI also has a Diagnostics page at `/diagnostics` with the same health report, provider setup links, model setup actions, and an explicit browser-session check for Reddit and Twitter/X.
|
|
111
|
-
|
|
112
71
|
## Data Sources
|
|
113
72
|
|
|
114
|
-
| Area
|
|
115
|
-
|
|
|
116
|
-
| Market data
|
|
117
|
-
| Options
|
|
118
|
-
| Fundamentals | Overview, financials, earnings, DCF, comparable companies
|
|
119
|
-
| Macro
|
|
120
|
-
| Technical
|
|
121
|
-
| Sentiment
|
|
122
|
-
| Filings
|
|
123
|
-
| Portfolio
|
|
73
|
+
| Area | Examples | Source |
|
|
74
|
+
| ------------ | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
75
|
+
| Market data | Quotes, history, indexed price comparisons, ticker search, screeners, crypto price and history | Yahoo Finance, TradingView scanner, Alpha Vantage and London Strategic Edge fallbacks when configured, CoinGecko |
|
|
76
|
+
| Options | Chains, open interest, IV, locally computed Greeks | Yahoo Finance plus local calculations |
|
|
77
|
+
| Fundamentals | Overview, financials, earnings, DCF, comparable companies | Alpha Vantage; optional London Strategic Edge for financial statements and DCF, with Yahoo Finance fallbacks |
|
|
78
|
+
| Macro | Rates, CPI, GDP, unemployment, event probabilities, crypto Fear & Greed | FRED, Polymarket Gamma API, alternative.me |
|
|
79
|
+
| Technical | Indicators and strategy backtests | Local calculations over market history |
|
|
80
|
+
| Sentiment | Reddit, Twitter/X, Finnhub news, and web sentiment | `rdt-cli` and `twitter-cli` using your normal browser sessions, Finnhub, Exa, Brave, DuckDuckGo |
|
|
81
|
+
| Filings | SEC filing search | SEC EDGAR |
|
|
82
|
+
| Portfolio | Watchlists, holdings, correlation, risk | Local state plus market data |
|
|
124
83
|
|
|
125
|
-
|
|
84
|
+
Most sources work without API keys. Reddit and Twitter/X sentiment use `rdt-cli` / `twitter-cli` (`uv tool install ...`) with your normal browser sessions. Alpha Vantage, FRED, Brave, Exa, Finnhub, and London Strategic Edge unlock deeper coverage when configured — see [Data Sources](https://opencandle.app/docs/data-sources.html).
|
|
126
85
|
|
|
127
86
|
## Configuration
|
|
128
87
|
|
|
129
|
-
Model access
|
|
130
|
-
|
|
131
|
-
| Key | Used For |
|
|
132
|
-
| --- | --- |
|
|
133
|
-
| `GEMINI_API_KEY` | Google models through Pi |
|
|
134
|
-
| `OPENAI_API_KEY` | OpenAI models through Pi |
|
|
135
|
-
| `ANTHROPIC_API_KEY` | Anthropic models through Pi |
|
|
136
|
-
| `ALPHA_VANTAGE_API_KEY` | Fundamentals, earnings, financial statements, DCF, comps |
|
|
137
|
-
| `FRED_API_KEY` | Macro series such as rates, CPI, GDP, unemployment |
|
|
138
|
-
| `BRAVE_API_KEY` | Brave web search fallback |
|
|
139
|
-
| `EXA_API_KEY` | Exa web search |
|
|
140
|
-
| `FINNHUB_API_KEY` | Finnhub company news for sentiment summaries |
|
|
141
|
-
| `OPENCANDLE_HOME` | Override OpenCandle state directory |
|
|
142
|
-
| `OPENCANDLE_GUI_HOST` | GUI bind host, default `127.0.0.1` |
|
|
143
|
-
| `OPENCANDLE_GUI_PORT` | GUI port, default `14567` |
|
|
144
|
-
| `OPENCANDLE_NOTIFICATION_WEBHOOK_URL` | Optional local webhook target for alert/report notification delivery attempts |
|
|
145
|
-
|
|
146
|
-
Environment variables override `~/.opencandle/config.json`. See [Configuration](https://opencandle.app/docs/configuration.html) for the full reference, including advanced routing and diagnostic switches.
|
|
147
|
-
|
|
148
|
-
## From Source
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
git clone https://github.com/Kahtaf/OpenCandle.git
|
|
152
|
-
cd OpenCandle
|
|
153
|
-
npm install
|
|
154
|
-
cp .env.example .env
|
|
155
|
-
npm start
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
On Windows Command Prompt, use `copy .env.example .env` instead of `cp .env.example .env`.
|
|
159
|
-
|
|
160
|
-
Run the local GUI from a checkout:
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
npm run gui
|
|
164
|
-
```
|
|
88
|
+
Model access is configured through Pi on first run (`GEMINI_API_KEY`, `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, or Pi sign-in). Data-provider keys are optional and can be set in the environment, through `/connect`, through the GUI provider setup flow, or in `~/.opencandle/config.json`; environment variables override the config file. See [Configuration](https://opencandle.app/docs/configuration.html) for the full key reference and advanced switches.
|
|
165
89
|
|
|
166
90
|
## How It Fits Together
|
|
167
91
|
|
|
168
|
-

|
|
92
|
+

|
|
169
93
|
|
|
170
94
|
```text
|
|
171
95
|
User prompt
|
|
@@ -176,81 +100,21 @@ User prompt
|
|
|
176
100
|
-> terminal or GUI session records the trace
|
|
177
101
|
```
|
|
178
102
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
```text
|
|
182
|
-
src/
|
|
183
|
-
|-- providers/ API clients
|
|
184
|
-
|-- tools/ Tool implementations by domain
|
|
185
|
-
|-- infra/ Cache, rate limiter, HTTP client, paths
|
|
186
|
-
|-- routing/ Request understanding, entity extraction, slot resolution
|
|
187
|
-
|-- workflows/ WorkflowDefinition builders
|
|
188
|
-
|-- runtime/ Session coordinator, workflow runner, runtime context
|
|
189
|
-
|-- market-state/ Durable watchlists, portfolios, alerts, reports
|
|
190
|
-
|-- memory/ SQLite-backed state and retrieval
|
|
191
|
-
|-- sentiment/ Cross-source sentiment pipeline, scoring, adapters, trends
|
|
192
|
-
|-- analysts/ Multi-analyst orchestration
|
|
193
|
-
|-- pi/ Pi integration and session wiring
|
|
194
|
-
|-- cli.ts CLI entry point
|
|
195
|
-
|-- monitor.ts Local automation heartbeat command
|
|
196
|
-
|-- tool-kit.ts Public add-on tool helpers
|
|
197
|
-
`-- index.ts Public package exports
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Package exports:
|
|
201
|
-
|
|
202
|
-
- `opencandle`
|
|
203
|
-
- `opencandle/tool-kit`
|
|
204
|
-
- `opencandle/infra`
|
|
205
|
-
- `opencandle/types`
|
|
206
|
-
- `opencandle/providers`
|
|
207
|
-
- `opencandle/tools`
|
|
208
|
-
- `opencandle/workflows`
|
|
209
|
-
|
|
210
|
-
If you want to add a new first-party tool or publish an add-on package, start with [Build a Tool](https://opencandle.app/docs/build-a-tool.html).
|
|
103
|
+
To add a first-party tool or publish an add-on package, start with [Build a Tool](https://opencandle.app/docs/build-a-tool.html).
|
|
211
104
|
|
|
212
105
|
## Development
|
|
213
106
|
|
|
214
107
|
```bash
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
npm
|
|
218
|
-
|
|
219
|
-
npm
|
|
220
|
-
npm run
|
|
221
|
-
npm
|
|
222
|
-
npm run test:e2e:providers
|
|
223
|
-
npm run eval
|
|
224
|
-
npm run eval -- cases
|
|
225
|
-
npm run eval -- product
|
|
226
|
-
npm run eval -- competitive
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
Baseline check:
|
|
230
|
-
|
|
231
|
-
```bash
|
|
232
|
-
npm test
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
The e2e, provider, and eval commands can hit live APIs, live model providers, or local agent CLIs. `npm run eval` lists every eval suite; run suites through `npm run eval -- <suite>`. Run them intentionally; see [Testing and Evals](https://opencandle.app/docs/testing-and-evals.html).
|
|
236
|
-
|
|
237
|
-
Repository rules that matter:
|
|
238
|
-
|
|
239
|
-
- Unit tests mock `globalThis.fetch` and use fixture JSON.
|
|
240
|
-
- External calls go through shared cache and rate-limiter infrastructure.
|
|
241
|
-
- Tools fetch and format; analysts and prompts synthesize.
|
|
242
|
-
- Relative TypeScript imports use `.js` extensions.
|
|
243
|
-
- Behavior changes should be test-first.
|
|
244
|
-
|
|
245
|
-
For scripted full-session driving with file-based IPC:
|
|
246
|
-
|
|
247
|
-
```bash
|
|
248
|
-
npx tsx tests/harness/cli.ts run --prompt "What is AAPL trading at?" --ipc /tmp/opencandle-ipc &
|
|
249
|
-
npx tsx tests/harness/cli.ts wait --ipc /tmp/opencandle-ipc
|
|
250
|
-
npx tsx tests/harness/cli.ts trace --ipc /tmp/opencandle-ipc
|
|
108
|
+
git clone https://github.com/Kahtaf/OpenCandle.git
|
|
109
|
+
cd OpenCandle
|
|
110
|
+
npm install
|
|
111
|
+
cp .env.example .env # optional provider keys (copy .env.example .env on Windows CMD)
|
|
112
|
+
npm start # terminal agent
|
|
113
|
+
npm run gui # browser GUI
|
|
114
|
+
npm test # unit tests
|
|
251
115
|
```
|
|
252
116
|
|
|
253
|
-
|
|
117
|
+
Contributor conventions live in [AGENTS.md](AGENTS.md) and [CONTRIBUTING.md](CONTRIBUTING.md). The e2e, provider, and eval suites can hit live APIs and model providers — run them intentionally; see [Testing and Evals](https://opencandle.app/docs/testing-and-evals.html).
|
|
254
118
|
|
|
255
119
|
## Documentation
|
|
256
120
|
|
|
@@ -263,12 +127,12 @@ See [tests/harness/README.md](https://github.com/Kahtaf/OpenCandle/blob/main/tes
|
|
|
263
127
|
- [Configuration](https://opencandle.app/docs/configuration.html)
|
|
264
128
|
- [System Architecture](https://opencandle.app/docs/system-architecture.html)
|
|
265
129
|
- [Testing and Evals](https://opencandle.app/docs/testing-and-evals.html)
|
|
266
|
-
- [
|
|
130
|
+
- [Why OpenCandle](https://opencandle.app/docs/comparisons.html)
|
|
267
131
|
|
|
268
|
-
##
|
|
132
|
+
## Community and Contributing
|
|
269
133
|
|
|
270
|
-
|
|
134
|
+
Questions and bug reports are welcome in [GitHub Issues](https://github.com/Kahtaf/OpenCandle/issues) — redact API keys, account identifiers, holdings, and local state from public issues. Before opening large changes or reporting sensitive issues, see [Contributing](CONTRIBUTING.md), [Security](https://opencandle.app/docs/security.html), and the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
271
135
|
|
|
272
|
-
##
|
|
136
|
+
## License
|
|
273
137
|
|
|
274
|
-
|
|
138
|
+
MIT — see [LICENSE](LICENSE).
|
package/dist/cli-main.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
3
4
|
import { createRequire } from "node:module";
|
|
4
5
|
import { dirname, resolve } from "node:path";
|
|
5
6
|
import { createInterface } from "node:readline/promises";
|
|
6
7
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import {
|
|
8
|
+
import { createAgentSessionRuntime, createAgentSessionServices, DefaultPackageManager, getAgentDir, InteractiveMode, initTheme, ModelRegistry, ModelRuntime, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
8
9
|
import { loadEnv } from "./config.js";
|
|
9
10
|
import { handleDoctorCommand } from "./doctor/cli-command.js";
|
|
10
11
|
import { createOpenCandleSession } from "./pi/session.js";
|
|
@@ -98,9 +99,12 @@ async function handlePackageCommand(args, cwd, agentDir) {
|
|
|
98
99
|
async function handleGuiCommand(args, cwd) {
|
|
99
100
|
if (args[0] !== "gui")
|
|
100
101
|
return false;
|
|
101
|
-
const
|
|
102
|
-
const
|
|
103
|
-
const
|
|
102
|
+
const compiledServerPath = resolve(packageRoot, "dist/gui/server/server.js");
|
|
103
|
+
const sourceServerPath = resolve(packageRoot, "gui/server/server.ts");
|
|
104
|
+
const commandArgs = existsSync(compiledServerPath)
|
|
105
|
+
? [compiledServerPath, ...args.slice(1)]
|
|
106
|
+
: [require.resolve("tsx/cli"), sourceServerPath, ...args.slice(1)];
|
|
107
|
+
const child = spawn(process.execPath, commandArgs, {
|
|
104
108
|
cwd,
|
|
105
109
|
env: process.env,
|
|
106
110
|
stdio: "inherit",
|
|
@@ -121,9 +125,12 @@ async function handleGuiCommand(args, cwd) {
|
|
|
121
125
|
async function handleMonitorCommand(args, cwd) {
|
|
122
126
|
if (args[0] !== "monitor")
|
|
123
127
|
return false;
|
|
124
|
-
const
|
|
125
|
-
const
|
|
126
|
-
const
|
|
128
|
+
const compiledMonitorPath = resolve(packageRoot, "dist/monitor.js");
|
|
129
|
+
const sourceMonitorPath = resolve(packageRoot, "src/monitor.ts");
|
|
130
|
+
const commandArgs = existsSync(compiledMonitorPath)
|
|
131
|
+
? [compiledMonitorPath, ...args.slice(1)]
|
|
132
|
+
: [require.resolve("tsx/cli"), sourceMonitorPath, ...args.slice(1)];
|
|
133
|
+
const child = spawn(process.execPath, commandArgs, {
|
|
127
134
|
cwd,
|
|
128
135
|
env: process.env,
|
|
129
136
|
stdio: "inherit",
|
|
@@ -160,8 +167,11 @@ async function main() {
|
|
|
160
167
|
}
|
|
161
168
|
// Default: start the OpenCandle interactive agent
|
|
162
169
|
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
163
|
-
const
|
|
164
|
-
|
|
170
|
+
const modelRuntime = await ModelRuntime.create({
|
|
171
|
+
authPath: resolve(agentDir, "auth.json"),
|
|
172
|
+
modelsPath: resolve(agentDir, "models.json"),
|
|
173
|
+
});
|
|
174
|
+
const modelRegistry = new ModelRegistry(modelRuntime);
|
|
165
175
|
const shouldSuppressFallbackMessage = modelRegistry.getAvailable().length === 0;
|
|
166
176
|
initTheme(settingsManager.getTheme(), true);
|
|
167
177
|
const sessionManager = continueOpenCandleSession(cwd);
|
|
@@ -183,7 +193,7 @@ async function main() {
|
|
|
183
193
|
if (!model) {
|
|
184
194
|
return "Connect an AI model before chat can run. Paste a Google Gemini, OpenAI, or Anthropic API key in the setup panel.";
|
|
185
195
|
}
|
|
186
|
-
if (!session.
|
|
196
|
+
if (!session.modelRuntime.hasConfiguredAuth(model.provider)) {
|
|
187
197
|
return "Connect an AI model before chat can run. Paste a Google Gemini, OpenAI, or Anthropic API key in the setup panel.";
|
|
188
198
|
}
|
|
189
199
|
return null;
|
|
@@ -232,16 +242,14 @@ async function main() {
|
|
|
232
242
|
const services = await createAgentSessionServices({
|
|
233
243
|
cwd: opts.cwd,
|
|
234
244
|
agentDir: opts.agentDir,
|
|
235
|
-
authStorage,
|
|
236
245
|
settingsManager,
|
|
237
|
-
|
|
246
|
+
modelRuntime,
|
|
238
247
|
});
|
|
239
248
|
const result = await createOpenCandleSession({
|
|
240
249
|
cwd: opts.cwd,
|
|
241
250
|
agentDir: opts.agentDir,
|
|
242
251
|
settingsManager,
|
|
243
|
-
|
|
244
|
-
modelRegistry,
|
|
252
|
+
modelRuntime,
|
|
245
253
|
sessionManager: opts.sessionManager,
|
|
246
254
|
bindExtensions: false,
|
|
247
255
|
});
|
|
@@ -454,4 +462,3 @@ function asRecord(value) {
|
|
|
454
462
|
: {};
|
|
455
463
|
}
|
|
456
464
|
await main();
|
|
457
|
-
//# sourceMappingURL=cli-main.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
6
|
+
export function frontDoorCommand(args) {
|
|
7
|
+
if (args[0] === "--help" || args[0] === "-h")
|
|
8
|
+
return "help";
|
|
9
|
+
if (args[0] === "--version" || args[0] === "-v")
|
|
10
|
+
return "version";
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
export function renderFrontDoorCommand(command) {
|
|
14
|
+
if (command === "version")
|
|
15
|
+
return readPackageMetadata().version ?? "unknown";
|
|
16
|
+
return [
|
|
17
|
+
"Usage: opencandle [command]",
|
|
18
|
+
"",
|
|
19
|
+
"Commands:",
|
|
20
|
+
" (default) Start the interactive terminal TUI",
|
|
21
|
+
" gui Start the local GUI",
|
|
22
|
+
" monitor [--once] Run local alert/report automation",
|
|
23
|
+
" doctor [--json|--full|--sessions|--enable <provider>]",
|
|
24
|
+
" Check OpenCandle health",
|
|
25
|
+
" install <source> [-l] Install a package",
|
|
26
|
+
" remove|uninstall <source> [-l] Remove a package",
|
|
27
|
+
" list List installed packages",
|
|
28
|
+
" update [source] Update packages",
|
|
29
|
+
].join("\n");
|
|
30
|
+
}
|
|
31
|
+
function readPackageMetadata() {
|
|
32
|
+
return require(resolve(packageRoot, "package.json"));
|
|
33
|
+
}
|
package/dist/cli.js
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { frontDoorCommand, renderFrontDoorCommand } from "./cli-options.js";
|
|
2
3
|
import { ensureOpenCandleNativeDependencies } from "./infra/native-dependencies.js";
|
|
3
4
|
import { assertSupportedNodeVersion } from "./infra/node-version.js";
|
|
4
|
-
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const command = frontDoorCommand(args);
|
|
7
|
+
if (command) {
|
|
8
|
+
console.log(renderFrontDoorCommand(command));
|
|
9
|
+
}
|
|
10
|
+
else if (args[0] === "doctor") {
|
|
5
11
|
const [{ loadEnv }, { handleDoctorCommand }, { getAgentDir }] = await Promise.all([
|
|
6
12
|
import("./config.js"),
|
|
7
13
|
import("./doctor/cli-command.js"),
|
|
8
14
|
import("@earendil-works/pi-coding-agent"),
|
|
9
15
|
]);
|
|
10
16
|
loadEnv();
|
|
11
|
-
await handleDoctorCommand(
|
|
17
|
+
await handleDoctorCommand(args, process.cwd(), getAgentDir());
|
|
12
18
|
}
|
|
13
19
|
else {
|
|
14
20
|
assertSupportedNodeVersion();
|
|
15
21
|
await ensureOpenCandleNativeDependencies();
|
|
16
22
|
await import("./cli-main.js");
|
|
17
23
|
}
|
|
18
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/config.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export interface Config {
|
|
|
19
19
|
braveApiKey?: string;
|
|
20
20
|
exaApiKey?: string;
|
|
21
21
|
finnhubApiKey?: string;
|
|
22
|
+
lseApiKey?: string;
|
|
22
23
|
/**
|
|
23
24
|
* Intent-router mode. The LLM router is the only production routing path;
|
|
24
25
|
* `OPENCANDLE_ROUTER_MODE` accepts only `"llm"` (or unset). The removed
|
|
@@ -56,6 +57,9 @@ export interface OpenCandleFileConfig {
|
|
|
56
57
|
finnhub?: {
|
|
57
58
|
apiKey?: string;
|
|
58
59
|
};
|
|
60
|
+
lse?: {
|
|
61
|
+
apiKey?: string;
|
|
62
|
+
};
|
|
59
63
|
};
|
|
60
64
|
sentiment?: {
|
|
61
65
|
retentionDays?: number;
|
package/dist/config.js
CHANGED
|
@@ -108,6 +108,7 @@ function resolveConfig(fileConfig) {
|
|
|
108
108
|
braveApiKey: process.env.BRAVE_API_KEY ?? fileConfig.providers?.brave?.apiKey,
|
|
109
109
|
exaApiKey: process.env.EXA_API_KEY ?? fileConfig.providers?.exa?.apiKey,
|
|
110
110
|
finnhubApiKey: process.env.FINNHUB_API_KEY ?? fileConfig.providers?.finnhub?.apiKey,
|
|
111
|
+
lseApiKey: process.env.LSE_API_KEY ?? fileConfig.providers?.lse?.apiKey,
|
|
111
112
|
routerMode: resolveRouterMode(),
|
|
112
113
|
toolScopeMode: resolveToolScopeMode(),
|
|
113
114
|
planningMigrationStatuses: resolvePlanningMigrationStatuses(),
|
|
@@ -172,4 +173,3 @@ export function getConfig() {
|
|
|
172
173
|
export function resetConfigCache() {
|
|
173
174
|
cachedConfig = null;
|
|
174
175
|
}
|
|
175
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ModelRegistry, ModelRuntime, SettingsManager } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { getProvider } from "../onboarding/providers.js";
|
|
3
3
|
import { clearProviderOnboardingEntry, loadOnboardingState, saveOnboardingState, } from "../onboarding/state.js";
|
|
4
4
|
import { renderDoctorReport } from "./render.js";
|
|
@@ -27,8 +27,11 @@ export async function handleDoctorCommand(args, cwd, agentDir) {
|
|
|
27
27
|
if (!json)
|
|
28
28
|
console.log(`Re-enabled ${providerId}.`);
|
|
29
29
|
}
|
|
30
|
-
const
|
|
31
|
-
|
|
30
|
+
const modelRuntime = await ModelRuntime.create({
|
|
31
|
+
authPath: `${agentDir}/auth.json`,
|
|
32
|
+
modelsPath: `${agentDir}/models.json`,
|
|
33
|
+
});
|
|
34
|
+
const modelRegistry = new ModelRegistry(modelRuntime);
|
|
32
35
|
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
33
36
|
const includeSessions = args.includes("--sessions");
|
|
34
37
|
if (includeSessions) {
|
|
@@ -42,10 +45,12 @@ export async function handleDoctorCommand(args, cwd, agentDir) {
|
|
|
42
45
|
modelSetup: buildCliModelSetupState(modelRegistry, settingsManager),
|
|
43
46
|
});
|
|
44
47
|
console.log(json ? JSON.stringify(report, null, 2) : renderDoctorReport(report));
|
|
48
|
+
if (report.status === "blocked")
|
|
49
|
+
process.exitCode = 1;
|
|
45
50
|
return true;
|
|
46
51
|
}
|
|
47
52
|
function buildCliModelSetupState(modelRegistry, settingsManager) {
|
|
48
|
-
modelRegistry.refresh();
|
|
53
|
+
void modelRegistry.refresh();
|
|
49
54
|
const provider = settingsManager.getDefaultProvider();
|
|
50
55
|
const modelId = settingsManager.getDefaultModel();
|
|
51
56
|
const activeModel = provider && modelId ? modelRegistry.find(provider, modelId) : undefined;
|
|
@@ -66,4 +71,3 @@ function buildCliModelSetupState(modelRegistry, settingsManager) {
|
|
|
66
71
|
availableModels,
|
|
67
72
|
};
|
|
68
73
|
}
|
|
69
|
-
//# sourceMappingURL=cli-command.js.map
|
package/dist/doctor/render.js
CHANGED