opencandle 0.2.0 → 0.4.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 +110 -87
- package/assets/logo.svg +187 -0
- package/dist/analysts/orchestrator.js +1 -2
- package/dist/analysts/orchestrator.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +38 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +34 -5
- package/dist/config.js +29 -8
- package/dist/config.js.map +1 -1
- package/dist/infra/browser.d.ts +10 -0
- package/dist/infra/browser.js +1 -0
- package/dist/infra/browser.js.map +1 -1
- package/dist/infra/cache.d.ts +4 -0
- package/dist/infra/cache.js +4 -0
- package/dist/infra/cache.js.map +1 -1
- package/dist/infra/native-dependencies.d.ts +1 -0
- package/dist/infra/native-dependencies.js +10 -0
- package/dist/infra/native-dependencies.js.map +1 -0
- package/dist/infra/node-version.d.ts +2 -0
- package/dist/infra/node-version.js +23 -0
- package/dist/infra/node-version.js.map +1 -0
- package/dist/infra/rate-limiter.js +6 -0
- package/dist/infra/rate-limiter.js.map +1 -1
- package/dist/memory/index.d.ts +2 -0
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/sqlite.js +42 -4
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/storage.d.ts +6 -0
- package/dist/memory/storage.js +3 -3
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/tool-defaults.d.ts +8 -0
- package/dist/memory/tool-defaults.js +59 -0
- package/dist/memory/tool-defaults.js.map +1 -0
- package/dist/onboarding/connect.d.ts +35 -0
- package/dist/onboarding/connect.js +118 -0
- package/dist/onboarding/connect.js.map +1 -0
- package/dist/onboarding/credential-interceptor.d.ts +44 -0
- package/dist/onboarding/credential-interceptor.js +72 -0
- package/dist/onboarding/credential-interceptor.js.map +1 -0
- package/dist/onboarding/degradation-accumulator.d.ts +21 -0
- package/dist/onboarding/degradation-accumulator.js +55 -0
- package/dist/onboarding/degradation-accumulator.js.map +1 -0
- package/dist/onboarding/prompt-user.d.ts +23 -0
- package/dist/onboarding/prompt-user.js +61 -0
- package/dist/onboarding/prompt-user.js.map +1 -0
- package/dist/onboarding/providers.d.ts +116 -0
- package/dist/onboarding/providers.js +239 -0
- package/dist/onboarding/providers.js.map +1 -0
- package/dist/onboarding/state.d.ts +31 -2
- package/dist/onboarding/state.js +141 -13
- package/dist/onboarding/state.js.map +1 -1
- package/dist/onboarding/tool-helpers.d.ts +34 -0
- package/dist/onboarding/tool-helpers.js +80 -0
- package/dist/onboarding/tool-helpers.js.map +1 -0
- package/dist/onboarding/tool-tags.d.ts +37 -0
- package/dist/onboarding/tool-tags.js +149 -0
- package/dist/onboarding/tool-tags.js.map +1 -0
- package/dist/onboarding/validation.d.ts +19 -0
- package/dist/onboarding/validation.js +117 -0
- package/dist/onboarding/validation.js.map +1 -0
- package/dist/pi/opencandle-extension.d.ts +7 -1
- package/dist/pi/opencandle-extension.js +488 -13
- package/dist/pi/opencandle-extension.js.map +1 -1
- package/dist/pi/session-storage.d.ts +2 -0
- package/dist/pi/session-storage.js +5 -0
- package/dist/pi/session-storage.js.map +1 -0
- package/dist/pi/session.d.ts +4 -1
- package/dist/pi/session.js +25 -3
- package/dist/pi/session.js.map +1 -1
- package/dist/pi/setup.d.ts +1 -2
- package/dist/pi/setup.js +67 -120
- package/dist/pi/setup.js.map +1 -1
- package/dist/pi/tool-adapter.d.ts +2 -2
- package/dist/pi/tool-adapter.js +14 -1
- package/dist/pi/tool-adapter.js.map +1 -1
- package/dist/prompts/context-builder.d.ts +22 -0
- package/dist/prompts/context-builder.js +47 -11
- package/dist/prompts/context-builder.js.map +1 -1
- package/dist/prompts/disclaimer.d.ts +6 -0
- package/dist/prompts/disclaimer.js +9 -0
- package/dist/prompts/disclaimer.js.map +1 -0
- package/dist/prompts/workflow-prompts.d.ts +8 -0
- package/dist/prompts/workflow-prompts.js +39 -5
- package/dist/prompts/workflow-prompts.js.map +1 -1
- package/dist/providers/alpha-vantage.js +20 -1
- package/dist/providers/alpha-vantage.js.map +1 -1
- package/dist/providers/exa-search.d.ts +39 -0
- package/dist/providers/exa-search.js +276 -0
- package/dist/providers/exa-search.js.map +1 -0
- package/dist/providers/finnhub.d.ts +17 -0
- package/dist/providers/finnhub.js +94 -0
- package/dist/providers/finnhub.js.map +1 -0
- package/dist/providers/fred.js +13 -1
- package/dist/providers/fred.js.map +1 -1
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/provider-credential-error.d.ts +8 -0
- package/dist/providers/provider-credential-error.js +22 -0
- package/dist/providers/provider-credential-error.js.map +1 -0
- package/dist/providers/reddit.d.ts +8 -0
- package/dist/providers/reddit.js +36 -9
- package/dist/providers/reddit.js.map +1 -1
- package/dist/providers/twitter.js +2 -8
- package/dist/providers/twitter.js.map +1 -1
- package/dist/providers/web-search.d.ts +17 -0
- package/dist/providers/web-search.js +224 -0
- package/dist/providers/web-search.js.map +1 -0
- package/dist/providers/wrap-provider.d.ts +7 -0
- package/dist/providers/wrap-provider.js +15 -0
- package/dist/providers/wrap-provider.js.map +1 -1
- package/dist/providers/yahoo-finance.js +70 -33
- package/dist/providers/yahoo-finance.js.map +1 -1
- package/dist/routing/classify-intent.js +22 -0
- package/dist/routing/classify-intent.js.map +1 -1
- package/dist/routing/defaults.js +1 -1
- package/dist/routing/defaults.js.map +1 -1
- package/dist/routing/index.d.ts +4 -0
- package/dist/routing/index.js +3 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/router-llm-client.d.ts +11 -0
- package/dist/routing/router-llm-client.js +42 -0
- package/dist/routing/router-llm-client.js.map +1 -0
- package/dist/routing/router-prompt.d.ts +2 -0
- package/dist/routing/router-prompt.js +138 -0
- package/dist/routing/router-prompt.js.map +1 -0
- package/dist/routing/router-types.d.ts +62 -0
- package/dist/routing/router-types.js +2 -0
- package/dist/routing/router-types.js.map +1 -0
- package/dist/routing/router.d.ts +10 -0
- package/dist/routing/router.js +194 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/runtime/session-coordinator.d.ts +63 -4
- package/dist/runtime/session-coordinator.js +155 -4
- package/dist/runtime/session-coordinator.js.map +1 -1
- package/dist/runtime/tool-defaults-wrapper.d.ts +3 -0
- package/dist/runtime/tool-defaults-wrapper.js +25 -0
- package/dist/runtime/tool-defaults-wrapper.js.map +1 -0
- package/dist/sentiment/adapters/finnhub.d.ts +7 -0
- package/dist/sentiment/adapters/finnhub.js +39 -0
- package/dist/sentiment/adapters/finnhub.js.map +1 -0
- package/dist/sentiment/adapters/reddit.d.ts +11 -0
- package/dist/sentiment/adapters/reddit.js +54 -0
- package/dist/sentiment/adapters/reddit.js.map +1 -0
- package/dist/sentiment/adapters/twitter.d.ts +9 -0
- package/dist/sentiment/adapters/twitter.js +32 -0
- package/dist/sentiment/adapters/twitter.js.map +1 -0
- package/dist/sentiment/adapters/web.d.ts +9 -0
- package/dist/sentiment/adapters/web.js +40 -0
- package/dist/sentiment/adapters/web.js.map +1 -0
- package/dist/sentiment/index.d.ts +16 -0
- package/dist/sentiment/index.js +44 -0
- package/dist/sentiment/index.js.map +1 -0
- package/dist/sentiment/keywords.d.ts +2 -0
- package/dist/sentiment/keywords.js +9 -0
- package/dist/sentiment/keywords.js.map +1 -0
- package/dist/sentiment/pipeline.d.ts +9 -0
- package/dist/sentiment/pipeline.js +57 -0
- package/dist/sentiment/pipeline.js.map +1 -0
- package/dist/sentiment/scorer.d.ts +9 -0
- package/dist/sentiment/scorer.js +64 -0
- package/dist/sentiment/scorer.js.map +1 -0
- package/dist/sentiment/store.d.ts +24 -0
- package/dist/sentiment/store.js +182 -0
- package/dist/sentiment/store.js.map +1 -0
- package/dist/sentiment/trends.d.ts +13 -0
- package/dist/sentiment/trends.js +73 -0
- package/dist/sentiment/trends.js.map +1 -0
- package/dist/sentiment/types.d.ts +66 -0
- package/dist/sentiment/types.js +54 -0
- package/dist/sentiment/types.js.map +1 -0
- package/dist/system-prompt.js +29 -13
- package/dist/system-prompt.js.map +1 -1
- package/dist/tool-kit.d.ts +4 -4
- package/dist/tools/fundamentals/company-overview.d.ts +4 -2
- package/dist/tools/fundamentals/company-overview.js +27 -27
- package/dist/tools/fundamentals/company-overview.js.map +1 -1
- package/dist/tools/fundamentals/comps.d.ts +1 -1
- package/dist/tools/fundamentals/comps.js +45 -45
- package/dist/tools/fundamentals/comps.js.map +1 -1
- package/dist/tools/fundamentals/dcf.d.ts +1 -1
- package/dist/tools/fundamentals/dcf.js +82 -82
- package/dist/tools/fundamentals/dcf.js.map +1 -1
- package/dist/tools/fundamentals/earnings.d.ts +4 -2
- package/dist/tools/fundamentals/earnings.js +25 -25
- package/dist/tools/fundamentals/earnings.js.map +1 -1
- package/dist/tools/fundamentals/financials.d.ts +4 -2
- package/dist/tools/fundamentals/financials.js +23 -23
- package/dist/tools/fundamentals/financials.js.map +1 -1
- package/dist/tools/fundamentals/sec-filings.d.ts +1 -1
- package/dist/tools/index.d.ts +28 -1
- package/dist/tools/index.js +35 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interaction/ask-user.d.ts +1 -1
- package/dist/tools/interaction/ask-user.js +28 -64
- package/dist/tools/interaction/ask-user.js.map +1 -1
- package/dist/tools/interaction/twitter-login.d.ts +1 -1
- package/dist/tools/macro/fear-greed.d.ts +1 -1
- package/dist/tools/macro/fred-data.d.ts +4 -2
- package/dist/tools/macro/fred-data.js +26 -26
- package/dist/tools/macro/fred-data.js.map +1 -1
- package/dist/tools/market/crypto-history.d.ts +1 -1
- package/dist/tools/market/crypto-price.d.ts +1 -1
- package/dist/tools/market/search-ticker.d.ts +1 -1
- package/dist/tools/market/stock-history.d.ts +1 -1
- package/dist/tools/market/stock-quote.d.ts +1 -1
- package/dist/tools/options/option-chain.d.ts +1 -1
- package/dist/tools/options/option-chain.js +4 -1
- package/dist/tools/options/option-chain.js.map +1 -1
- package/dist/tools/portfolio/correlation.d.ts +1 -1
- package/dist/tools/portfolio/predictions.d.ts +1 -1
- package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
- package/dist/tools/portfolio/tracker.d.ts +1 -1
- package/dist/tools/portfolio/watchlist.d.ts +1 -1
- package/dist/tools/sentiment/reddit-sentiment.d.ts +4 -2
- package/dist/tools/sentiment/reddit-sentiment.js +107 -22
- package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
- package/dist/tools/sentiment/sentiment-summary.d.ts +7 -0
- package/dist/tools/sentiment/sentiment-summary.js +230 -0
- package/dist/tools/sentiment/sentiment-summary.js.map +1 -0
- package/dist/tools/sentiment/sentiment-trend.d.ts +22 -0
- package/dist/tools/sentiment/sentiment-trend.js +39 -0
- package/dist/tools/sentiment/sentiment-trend.js.map +1 -0
- package/dist/tools/sentiment/twitter-sentiment.d.ts +1 -1
- package/dist/tools/sentiment/twitter-sentiment.js +17 -0
- package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
- package/dist/tools/sentiment/web-search.d.ts +11 -0
- package/dist/tools/sentiment/web-search.js +115 -0
- package/dist/tools/sentiment/web-search.js.map +1 -0
- package/dist/tools/sentiment/web-sentiment.d.ts +8 -0
- package/dist/tools/sentiment/web-sentiment.js +66 -0
- package/dist/tools/sentiment/web-sentiment.js.map +1 -0
- package/dist/tools/technical/backtest.d.ts +1 -1
- package/dist/tools/technical/indicators.d.ts +1 -1
- package/dist/tools/technical/indicators.js +7 -1
- package/dist/tools/technical/indicators.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/sentiment.d.ts +21 -0
- package/dist/workflows/options-screener.js +7 -2
- package/dist/workflows/options-screener.js.map +1 -1
- package/dist/workflows/portfolio-builder.js +3 -3
- package/dist/workflows/portfolio-builder.js.map +1 -1
- package/gui/server/background-quotes.ts +31 -0
- package/gui/server/chat-event-adapter.ts +142 -0
- package/gui/server/invoke-tool.ts +89 -0
- package/gui/server/live-chat-event-adapter.ts +181 -0
- package/gui/server/model-setup.ts +100 -0
- package/gui/server/package.json +5 -0
- package/gui/server/projector.ts +212 -0
- package/gui/server/server.ts +592 -0
- package/gui/server/session-actions.ts +31 -0
- package/gui/server/tool-metadata.ts +88 -0
- package/gui/server/websocket.ts +128 -0
- package/gui/server/writer-lock.ts +118 -0
- package/gui/shared/chat-events.ts +118 -0
- package/gui/shared/event-reducer.ts +186 -0
- package/gui/web/dist/assets/CatalogOverlay-D1ImSJTe.js +1 -0
- package/gui/web/dist/assets/index-DBrWq43L.css +1 -0
- package/gui/web/dist/assets/index-RflHaj0y.js +67 -0
- package/gui/web/dist/assets/logo-CWpt6Y2a.svg +187 -0
- package/gui/web/dist/index.html +17 -0
- package/package.json +62 -20
- package/src/analysts/contracts.ts +189 -0
- package/src/analysts/orchestrator.ts +300 -0
- package/src/cli.ts +205 -0
- package/src/config.ts +161 -0
- package/src/index.ts +5 -0
- package/src/infra/browser.ts +111 -0
- package/src/infra/cache.ts +103 -0
- package/src/infra/http-client.ts +68 -0
- package/src/infra/index.ts +18 -0
- package/src/infra/native-dependencies.ts +12 -0
- package/src/infra/node-version.ts +24 -0
- package/src/infra/open-url.ts +28 -0
- package/src/infra/opencandle-paths.ts +64 -0
- package/src/infra/rate-limiter.ts +64 -0
- package/src/memory/index.ts +10 -0
- package/src/memory/manager.ts +159 -0
- package/src/memory/preference-extractor.ts +106 -0
- package/src/memory/retrieval.ts +70 -0
- package/src/memory/sqlite.ts +172 -0
- package/src/memory/storage.ts +204 -0
- package/src/memory/tool-defaults.ts +87 -0
- package/src/memory/types.ts +67 -0
- package/src/onboarding/connect.ts +184 -0
- package/src/onboarding/credential-interceptor.ts +134 -0
- package/src/onboarding/degradation-accumulator.ts +79 -0
- package/src/onboarding/prompt-user.ts +85 -0
- package/src/onboarding/providers.ts +315 -0
- package/src/onboarding/state.ts +218 -0
- package/src/onboarding/tool-helpers.ts +111 -0
- package/src/onboarding/tool-tags.ts +201 -0
- package/src/onboarding/validation.ts +158 -0
- package/src/pi/opencandle-extension.ts +724 -0
- package/src/pi/session-storage.ts +5 -0
- package/src/pi/session.ts +81 -0
- package/src/pi/setup.ts +371 -0
- package/src/pi/tool-adapter.ts +36 -0
- package/src/prompts/context-builder.ts +204 -0
- package/src/prompts/disclaimer.ts +9 -0
- package/src/prompts/sections.ts +46 -0
- package/src/prompts/workflow-prompts.ts +279 -0
- package/src/providers/alpha-vantage.ts +292 -0
- package/src/providers/coingecko.ts +96 -0
- package/src/providers/exa-search.ts +373 -0
- package/src/providers/fear-greed.ts +45 -0
- package/src/providers/finnhub.ts +124 -0
- package/src/providers/fred.ts +83 -0
- package/src/providers/index.ts +9 -0
- package/src/providers/provider-credential-error.ts +23 -0
- package/src/providers/reddit.ts +151 -0
- package/src/providers/sec-edgar.ts +96 -0
- package/src/providers/twitter.ts +173 -0
- package/src/providers/web-search.ts +293 -0
- package/src/providers/with-fallback.ts +41 -0
- package/src/providers/wrap-provider.ts +64 -0
- package/src/providers/yahoo-finance.ts +367 -0
- package/src/routing/classify-intent.ts +194 -0
- package/src/routing/defaults.ts +29 -0
- package/src/routing/entity-extractor.ts +140 -0
- package/src/routing/index.ts +26 -0
- package/src/routing/router-llm-client.ts +51 -0
- package/src/routing/router-prompt.ts +159 -0
- package/src/routing/router-types.ts +66 -0
- package/src/routing/router.ts +213 -0
- package/src/routing/slot-resolver.ts +152 -0
- package/src/routing/types.ts +63 -0
- package/src/runtime/evidence.ts +77 -0
- package/src/runtime/index.ts +55 -0
- package/src/runtime/prompt-step.ts +75 -0
- package/src/runtime/provider-ids.ts +15 -0
- package/src/runtime/provider-tracker.ts +40 -0
- package/src/runtime/run-context.ts +22 -0
- package/src/runtime/session-coordinator.ts +406 -0
- package/src/runtime/tool-defaults-wrapper.ts +35 -0
- package/src/runtime/validation.ts +214 -0
- package/src/runtime/workflow-events.ts +75 -0
- package/src/runtime/workflow-runner.ts +188 -0
- package/src/runtime/workflow-types.ts +102 -0
- package/src/sentiment/adapters/finnhub.ts +44 -0
- package/src/sentiment/adapters/reddit.ts +65 -0
- package/src/sentiment/adapters/twitter.ts +36 -0
- package/src/sentiment/adapters/web.ts +44 -0
- package/src/sentiment/index.ts +58 -0
- package/src/sentiment/keywords.ts +9 -0
- package/src/sentiment/pipeline.ts +68 -0
- package/src/sentiment/scorer.ts +78 -0
- package/src/sentiment/store.ts +260 -0
- package/src/sentiment/trends.ts +90 -0
- package/src/sentiment/types.ts +108 -0
- package/src/system-prompt.ts +115 -0
- package/src/tool-kit.ts +68 -0
- package/src/tools/AGENTS.md +36 -0
- package/src/tools/fundamentals/company-overview.ts +54 -0
- package/src/tools/fundamentals/comps.ts +156 -0
- package/src/tools/fundamentals/dcf.ts +267 -0
- package/src/tools/fundamentals/earnings.ts +47 -0
- package/src/tools/fundamentals/financials.ts +54 -0
- package/src/tools/fundamentals/sec-filings.ts +61 -0
- package/src/tools/index.ts +88 -0
- package/src/tools/interaction/ask-user.ts +81 -0
- package/src/tools/interaction/twitter-login.ts +93 -0
- package/src/tools/macro/fear-greed.ts +41 -0
- package/src/tools/macro/fred-data.ts +54 -0
- package/src/tools/market/crypto-history.ts +51 -0
- package/src/tools/market/crypto-price.ts +53 -0
- package/src/tools/market/search-ticker.ts +53 -0
- package/src/tools/market/stock-history.ts +79 -0
- package/src/tools/market/stock-quote.ts +64 -0
- package/src/tools/options/greeks.ts +82 -0
- package/src/tools/options/option-chain.ts +91 -0
- package/src/tools/portfolio/correlation.ts +162 -0
- package/src/tools/portfolio/predictions.ts +253 -0
- package/src/tools/portfolio/risk-analysis.ts +134 -0
- package/src/tools/portfolio/tracker.ts +147 -0
- package/src/tools/portfolio/watchlist.ts +153 -0
- package/src/tools/sentiment/reddit-sentiment.ts +164 -0
- package/src/tools/sentiment/sentiment-summary.ts +256 -0
- package/src/tools/sentiment/sentiment-trend.ts +58 -0
- package/src/tools/sentiment/twitter-sentiment.ts +96 -0
- package/src/tools/sentiment/web-search.ts +150 -0
- package/src/tools/sentiment/web-sentiment.ts +76 -0
- package/src/tools/technical/backtest.ts +246 -0
- package/src/tools/technical/indicators.ts +258 -0
- package/src/types/fundamentals.ts +46 -0
- package/src/types/index.ts +20 -0
- package/src/types/macro.ts +27 -0
- package/src/types/market.ts +43 -0
- package/src/types/options.ts +35 -0
- package/src/types/portfolio.ts +41 -0
- package/src/types/sentiment.ts +70 -0
- package/src/workflows/compare-assets.ts +39 -0
- package/src/workflows/index.ts +4 -0
- package/src/workflows/options-screener.ts +49 -0
- package/src/workflows/portfolio-builder.ts +52 -0
- package/src/workflows/types.ts +4 -0
- package/dist/tools/sentiment/news-sentiment.d.ts +0 -7
- package/dist/tools/sentiment/news-sentiment.js +0 -55
- package/dist/tools/sentiment/news-sentiment.js.map +0 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:v="https://svgstorm.com"
|
|
2
|
+
viewBox = "0 0 1009 1008"
|
|
3
|
+
width="1009"
|
|
4
|
+
height="1008">
|
|
5
|
+
<g fill="None" fill-opacity="0.0" stroke="#34474E" stroke-opacity="0.00" stroke-width="0.3"><path d="
|
|
6
|
+
M 0.00 1008.00
|
|
7
|
+
L 1009.00 1008.00
|
|
8
|
+
L 1009.00 0.00
|
|
9
|
+
L 0.00 0.00
|
|
10
|
+
L 0.00 1008.00
|
|
11
|
+
M 893.00 7.00
|
|
12
|
+
C 912.65 7.48 933.31 16.27 951.00 28.00
|
|
13
|
+
C 960.90 34.53 969.82 43.54 977.00 53.00
|
|
14
|
+
C 987.75 70.16 998.47 88.32 1000.00 109.00
|
|
15
|
+
C 1004.61 172.94 1000.71 239.89 1002.00 305.00 C 1002.00 437.00 1002.00 569.00 1002.00 701.00 C 1000.71 766.09 1004.61 833.14 1000.00 897.00
|
|
16
|
+
C 997.20 915.93 990.73 934.49 979.00 950.00
|
|
17
|
+
C 971.95 960.06 962.97 968.87 953.00 976.00
|
|
18
|
+
C 936.25 987.24 917.87 994.87 898.00 998.00
|
|
19
|
+
C 848.40 1002.63 795.77 998.69 745.00 1000.00 C 537.83 999.33 329.35 1001.34 123.00 999.00
|
|
20
|
+
C 113.93 999.28 105.34 997.59 97.00 995.00
|
|
21
|
+
C 87.29 992.63 76.80 989.30 69.00 983.00
|
|
22
|
+
C 68.57 982.83 68.00 983.00 68.00 983.00
|
|
23
|
+
C 55.21 976.65 44.68 965.81 35.00 955.00
|
|
24
|
+
C -7.40 902.87 14.27 828.97 9.00 765.00 C 9.00 548.67 9.00 332.33 9.00 116.00 C 11.95 60.04 61.08 10.55 117.00 7.00
|
|
25
|
+
C 374.60 5.33 635.47 5.33 893.00 7.00 Z"/>
|
|
26
|
+
</g>
|
|
27
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="1.00" stroke-width="0.3"><path d="
|
|
28
|
+
M 117.00 7.00
|
|
29
|
+
C 375.67 7.00 634.33 7.00 893.00 7.00
|
|
30
|
+
C 635.47 5.33 374.60 5.33 117.00 7.00 Z"/>
|
|
31
|
+
</g>
|
|
32
|
+
<g fill="None" fill-opacity="0.0" stroke="#34474E" stroke-opacity="1.00" stroke-width="0.3"><path d="
|
|
33
|
+
M 893.00 7.00
|
|
34
|
+
C 634.33 7.00 375.67 7.00 117.00 7.00
|
|
35
|
+
C 61.08 10.55 11.95 60.04 9.00 116.00 C 9.00 332.33 9.00 548.67 9.00 765.00 C 14.27 828.97 -7.40 902.87 35.00 955.00
|
|
36
|
+
C 45.51 965.18 56.26 975.41 68.00 983.00
|
|
37
|
+
C 68.00 983.00 68.57 982.83 69.00 983.00
|
|
38
|
+
C 77.85 988.23 88.00 991.10 97.00 995.00
|
|
39
|
+
C 105.34 997.59 113.93 999.28 123.00 999.00
|
|
40
|
+
C 381.25 998.34 640.16 1000.33 898.00 998.00
|
|
41
|
+
C 917.87 994.87 936.25 987.24 953.00 976.00
|
|
42
|
+
C 961.89 967.94 970.70 958.59 979.00 950.00
|
|
43
|
+
C 990.73 934.49 997.20 915.93 1000.00 897.00
|
|
44
|
+
C 1001.66 634.92 1001.67 371.08 1000.00 109.00
|
|
45
|
+
C 998.47 88.32 987.75 70.16 977.00 53.00
|
|
46
|
+
C 968.92 44.28 959.99 35.47 951.00 28.00
|
|
47
|
+
C 933.31 16.27 912.65 7.48 893.00 7.00
|
|
48
|
+
M 515.00 304.00
|
|
49
|
+
C 539.00 304.00 563.00 304.00 587.00 304.00 C 615.29 302.32 605.38 337.85 607.00 356.00 C 607.00 452.00 607.00 548.00 607.00 644.00 C 605.19 661.97 615.63 698.38 587.00 696.00 C 563.00 696.00 539.00 696.00 515.00 696.00
|
|
50
|
+
C 515.00 728.00 515.00 760.00 515.00 792.00 C 512.34 804.03 522.39 828.07 505.00 830.00 C 487.59 827.79 497.67 804.11 495.00 792.00 C 495.00 760.00 495.00 728.00 495.00 696.00
|
|
51
|
+
C 471.33 696.00 447.67 696.00 424.00 696.00 C 394.53 699.12 406.18 662.06 404.00 644.00 C 404.00 548.33 404.00 452.67 404.00 357.00 C 406.52 338.80 394.21 302.66 423.00 304.00 C 447.00 304.00 471.00 304.00 495.00 304.00
|
|
52
|
+
C 495.00 272.00 495.00 240.00 495.00 208.00 C 497.32 195.66 488.16 173.46 505.01 170.01 C 521.85 173.62 512.68 195.59 515.00 208.00 C 515.00 240.00 515.00 272.00 515.00 304.00 Z"/>
|
|
53
|
+
</g>
|
|
54
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="0.91" stroke-width="0.3"><path d="
|
|
55
|
+
M 977.00 53.00
|
|
56
|
+
C 969.82 43.54 960.90 34.53 951.00 28.00
|
|
57
|
+
C 959.99 35.47 968.92 44.28 977.00 53.00 Z"/>
|
|
58
|
+
</g>
|
|
59
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="1.00" stroke-width="0.3"><path d="
|
|
60
|
+
M 1000.00 897.00
|
|
61
|
+
C 1004.61 833.14 1000.71 766.09 1002.00 701.00 C 1002.00 569.00 1002.00 437.00 1002.00 305.00 C 1000.71 239.89 1004.61 172.94 1000.00 109.00
|
|
62
|
+
C 1001.67 371.08 1001.66 634.92 1000.00 897.00 Z"/>
|
|
63
|
+
</g>
|
|
64
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="1.00" stroke-width="0.3"><path d="
|
|
65
|
+
M 515.00 304.00
|
|
66
|
+
C 515.00 272.00 515.00 240.00 515.00 208.00 C 512.68 195.59 521.85 173.62 505.01 170.01 C 488.16 173.46 497.32 195.66 495.00 208.00 C 495.00 240.00 495.00 272.00 495.00 304.00
|
|
67
|
+
C 471.00 304.00 447.00 304.00 423.00 304.00 C 394.21 302.66 406.52 338.80 404.00 357.00 C 404.00 452.67 404.00 548.33 404.00 644.00 C 406.18 662.06 394.53 699.12 424.00 696.00 C 447.67 696.00 471.33 696.00 495.00 696.00
|
|
68
|
+
C 495.00 728.00 495.00 760.00 495.00 792.00 C 497.67 804.11 487.59 827.79 505.00 830.00 C 522.39 828.07 512.34 804.03 515.00 792.00 C 515.00 760.00 515.00 728.00 515.00 696.00
|
|
69
|
+
C 539.00 696.00 563.00 696.00 587.00 696.00 C 615.63 698.38 605.19 661.97 607.00 644.00 C 607.00 548.00 607.00 452.00 607.00 356.00 C 605.38 337.85 615.29 302.32 587.00 304.00 C 563.00 304.00 539.00 304.00 515.00 304.00 Z"/>
|
|
70
|
+
</g>
|
|
71
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="0.78" stroke-width="0.3"><path d="
|
|
72
|
+
M 953.00 976.00
|
|
73
|
+
C 962.97 968.87 971.95 960.06 979.00 950.00
|
|
74
|
+
C 970.70 958.59 961.89 967.94 953.00 976.00 Z"/>
|
|
75
|
+
</g>
|
|
76
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="0.85" stroke-width="0.3"><path d="
|
|
77
|
+
M 68.00 983.00
|
|
78
|
+
C 56.26 975.41 45.51 965.18 35.00 955.00
|
|
79
|
+
C 44.68 965.81 55.21 976.65 68.00 983.00 Z"/>
|
|
80
|
+
</g>
|
|
81
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="0.79" stroke-width="0.3"><path d="
|
|
82
|
+
M 97.00 995.00
|
|
83
|
+
C 88.00 991.10 77.85 988.23 69.00 983.00
|
|
84
|
+
C 76.80 989.30 87.29 992.63 97.00 995.00 Z"/>
|
|
85
|
+
</g>
|
|
86
|
+
<g fill="None" fill-opacity="0.0" stroke="#87A188" stroke-opacity="0.53" stroke-width="0.3"><path d="
|
|
87
|
+
M 123.00 999.00
|
|
88
|
+
C 329.35 1001.34 537.83 999.33 745.00 1000.00 C 795.77 998.69 848.40 1002.63 898.00 998.00
|
|
89
|
+
C 640.16 1000.33 381.25 998.34 123.00 999.00 Z"/>
|
|
90
|
+
</g>
|
|
91
|
+
<g fill="#34474E" fill-opacity="0.00" stroke="None">
|
|
92
|
+
<path d="
|
|
93
|
+
M 0.00 1008.00
|
|
94
|
+
L 1009.00 1008.00
|
|
95
|
+
L 1009.00 0.00
|
|
96
|
+
L 0.00 0.00
|
|
97
|
+
L 0.00 1008.00
|
|
98
|
+
M 893.00 7.00
|
|
99
|
+
C 912.65 7.48 933.31 16.27 951.00 28.00
|
|
100
|
+
C 960.90 34.53 969.82 43.54 977.00 53.00
|
|
101
|
+
C 987.75 70.16 998.47 88.32 1000.00 109.00
|
|
102
|
+
C 1004.61 172.94 1000.71 239.89 1002.00 305.00 C 1002.00 437.00 1002.00 569.00 1002.00 701.00 C 1000.71 766.09 1004.61 833.14 1000.00 897.00
|
|
103
|
+
C 997.20 915.93 990.73 934.49 979.00 950.00
|
|
104
|
+
C 971.95 960.06 962.97 968.87 953.00 976.00
|
|
105
|
+
C 936.25 987.24 917.87 994.87 898.00 998.00
|
|
106
|
+
C 848.40 1002.63 795.77 998.69 745.00 1000.00 C 537.83 999.33 329.35 1001.34 123.00 999.00
|
|
107
|
+
C 113.93 999.28 105.34 997.59 97.00 995.00
|
|
108
|
+
C 87.29 992.63 76.80 989.30 69.00 983.00
|
|
109
|
+
C 68.57 982.83 68.00 983.00 68.00 983.00
|
|
110
|
+
C 55.21 976.65 44.68 965.81 35.00 955.00
|
|
111
|
+
C -7.40 902.87 14.27 828.97 9.00 765.00 C 9.00 548.67 9.00 332.33 9.00 116.00 C 11.95 60.04 61.08 10.55 117.00 7.00
|
|
112
|
+
C 374.60 5.33 635.47 5.33 893.00 7.00 Z"/>
|
|
113
|
+
</g>
|
|
114
|
+
<g fill="#87A188" fill-opacity="1.00" stroke="None">
|
|
115
|
+
<path d="
|
|
116
|
+
M 117.00 7.00
|
|
117
|
+
C 375.67 7.00 634.33 7.00 893.00 7.00
|
|
118
|
+
C 635.47 5.33 374.60 5.33 117.00 7.00 Z"/>
|
|
119
|
+
</g>
|
|
120
|
+
<g fill="#34474E" fill-opacity="1.00" stroke="None">
|
|
121
|
+
<path d="
|
|
122
|
+
M 893.00 7.00
|
|
123
|
+
C 634.33 7.00 375.67 7.00 117.00 7.00
|
|
124
|
+
C 61.08 10.55 11.95 60.04 9.00 116.00 C 9.00 332.33 9.00 548.67 9.00 765.00 C 14.27 828.97 -7.40 902.87 35.00 955.00
|
|
125
|
+
C 45.51 965.18 56.26 975.41 68.00 983.00
|
|
126
|
+
C 68.00 983.00 68.57 982.83 69.00 983.00
|
|
127
|
+
C 77.85 988.23 88.00 991.10 97.00 995.00
|
|
128
|
+
C 105.34 997.59 113.93 999.28 123.00 999.00
|
|
129
|
+
C 381.25 998.34 640.16 1000.33 898.00 998.00
|
|
130
|
+
C 917.87 994.87 936.25 987.24 953.00 976.00
|
|
131
|
+
C 961.89 967.94 970.70 958.59 979.00 950.00
|
|
132
|
+
C 990.73 934.49 997.20 915.93 1000.00 897.00
|
|
133
|
+
C 1001.66 634.92 1001.67 371.08 1000.00 109.00
|
|
134
|
+
C 998.47 88.32 987.75 70.16 977.00 53.00
|
|
135
|
+
C 968.92 44.28 959.99 35.47 951.00 28.00
|
|
136
|
+
C 933.31 16.27 912.65 7.48 893.00 7.00
|
|
137
|
+
M 515.00 304.00
|
|
138
|
+
C 539.00 304.00 563.00 304.00 587.00 304.00 C 615.29 302.32 605.38 337.85 607.00 356.00 C 607.00 452.00 607.00 548.00 607.00 644.00 C 605.19 661.97 615.63 698.38 587.00 696.00 C 563.00 696.00 539.00 696.00 515.00 696.00
|
|
139
|
+
C 515.00 728.00 515.00 760.00 515.00 792.00 C 512.34 804.03 522.39 828.07 505.00 830.00 C 487.59 827.79 497.67 804.11 495.00 792.00 C 495.00 760.00 495.00 728.00 495.00 696.00
|
|
140
|
+
C 471.33 696.00 447.67 696.00 424.00 696.00 C 394.53 699.12 406.18 662.06 404.00 644.00 C 404.00 548.33 404.00 452.67 404.00 357.00 C 406.52 338.80 394.21 302.66 423.00 304.00 C 447.00 304.00 471.00 304.00 495.00 304.00
|
|
141
|
+
C 495.00 272.00 495.00 240.00 495.00 208.00 C 497.32 195.66 488.16 173.46 505.01 170.01 C 521.85 173.62 512.68 195.59 515.00 208.00 C 515.00 240.00 515.00 272.00 515.00 304.00 Z"/>
|
|
142
|
+
</g>
|
|
143
|
+
<g fill="#87A188" fill-opacity="0.91" stroke="None">
|
|
144
|
+
<path d="
|
|
145
|
+
M 977.00 53.00
|
|
146
|
+
C 969.82 43.54 960.90 34.53 951.00 28.00
|
|
147
|
+
C 959.99 35.47 968.92 44.28 977.00 53.00 Z"/>
|
|
148
|
+
</g>
|
|
149
|
+
<g fill="#87A188" fill-opacity="1.00" stroke="None">
|
|
150
|
+
<path d="
|
|
151
|
+
M 1000.00 897.00
|
|
152
|
+
C 1004.61 833.14 1000.71 766.09 1002.00 701.00 C 1002.00 569.00 1002.00 437.00 1002.00 305.00 C 1000.71 239.89 1004.61 172.94 1000.00 109.00
|
|
153
|
+
C 1001.67 371.08 1001.66 634.92 1000.00 897.00 Z"/>
|
|
154
|
+
</g>
|
|
155
|
+
<g fill="#87A188" fill-opacity="1.00" stroke="None">
|
|
156
|
+
<path d="
|
|
157
|
+
M 515.00 304.00
|
|
158
|
+
C 515.00 272.00 515.00 240.00 515.00 208.00 C 512.68 195.59 521.85 173.62 505.01 170.01 C 488.16 173.46 497.32 195.66 495.00 208.00 C 495.00 240.00 495.00 272.00 495.00 304.00
|
|
159
|
+
C 471.00 304.00 447.00 304.00 423.00 304.00 C 394.21 302.66 406.52 338.80 404.00 357.00 C 404.00 452.67 404.00 548.33 404.00 644.00 C 406.18 662.06 394.53 699.12 424.00 696.00 C 447.67 696.00 471.33 696.00 495.00 696.00
|
|
160
|
+
C 495.00 728.00 495.00 760.00 495.00 792.00 C 497.67 804.11 487.59 827.79 505.00 830.00 C 522.39 828.07 512.34 804.03 515.00 792.00 C 515.00 760.00 515.00 728.00 515.00 696.00
|
|
161
|
+
C 539.00 696.00 563.00 696.00 587.00 696.00 C 615.63 698.38 605.19 661.97 607.00 644.00 C 607.00 548.00 607.00 452.00 607.00 356.00 C 605.38 337.85 615.29 302.32 587.00 304.00 C 563.00 304.00 539.00 304.00 515.00 304.00 Z"/>
|
|
162
|
+
</g>
|
|
163
|
+
<g fill="#87A188" fill-opacity="0.78" stroke="None">
|
|
164
|
+
<path d="
|
|
165
|
+
M 953.00 976.00
|
|
166
|
+
C 962.97 968.87 971.95 960.06 979.00 950.00
|
|
167
|
+
C 970.70 958.59 961.89 967.94 953.00 976.00 Z"/>
|
|
168
|
+
</g>
|
|
169
|
+
<g fill="#87A188" fill-opacity="0.85" stroke="None">
|
|
170
|
+
<path d="
|
|
171
|
+
M 68.00 983.00
|
|
172
|
+
C 56.26 975.41 45.51 965.18 35.00 955.00
|
|
173
|
+
C 44.68 965.81 55.21 976.65 68.00 983.00 Z"/>
|
|
174
|
+
</g>
|
|
175
|
+
<g fill="#87A188" fill-opacity="0.79" stroke="None">
|
|
176
|
+
<path d="
|
|
177
|
+
M 97.00 995.00
|
|
178
|
+
C 88.00 991.10 77.85 988.23 69.00 983.00
|
|
179
|
+
C 76.80 989.30 87.29 992.63 97.00 995.00 Z"/>
|
|
180
|
+
</g>
|
|
181
|
+
<g fill="#87A188" fill-opacity="0.53" stroke="None">
|
|
182
|
+
<path d="
|
|
183
|
+
M 123.00 999.00
|
|
184
|
+
C 329.35 1001.34 537.83 999.33 745.00 1000.00 C 795.77 998.69 848.40 1002.63 898.00 998.00
|
|
185
|
+
C 640.16 1000.33 381.25 998.34 123.00 999.00 Z"/>
|
|
186
|
+
</g>
|
|
187
|
+
</svg>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<meta name="theme-color" content="#FFFFFF" />
|
|
7
|
+
<title>OpenCandle</title>
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-RflHaj0y.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DBrWq43L.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<div id="root"></div>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencandle",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Financial trading & investing agent",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/Kahtaf/OpenCandle#readme",
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
"url": "https://github.com/Kahtaf/OpenCandle/issues"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
|
+
"workspaces": [
|
|
16
|
+
"gui/*"
|
|
17
|
+
],
|
|
15
18
|
"bin": {
|
|
16
19
|
"opencandle": "dist/cli.js"
|
|
17
20
|
},
|
|
@@ -35,6 +38,14 @@
|
|
|
35
38
|
"./providers": {
|
|
36
39
|
"types": "./dist/providers/index.d.ts",
|
|
37
40
|
"import": "./dist/providers/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./tools": {
|
|
43
|
+
"types": "./dist/tools/index.d.ts",
|
|
44
|
+
"import": "./dist/tools/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./workflows": {
|
|
47
|
+
"types": "./dist/workflows/index.d.ts",
|
|
48
|
+
"import": "./dist/workflows/index.js"
|
|
38
49
|
}
|
|
39
50
|
},
|
|
40
51
|
"pi": {
|
|
@@ -43,23 +54,52 @@
|
|
|
43
54
|
]
|
|
44
55
|
},
|
|
45
56
|
"keywords": [
|
|
46
|
-
"pi-package",
|
|
47
57
|
"opencandle",
|
|
48
|
-
"finance"
|
|
58
|
+
"finance",
|
|
59
|
+
"stock",
|
|
60
|
+
"investing",
|
|
61
|
+
"trading",
|
|
62
|
+
"options",
|
|
63
|
+
"market-data",
|
|
64
|
+
"portfolio",
|
|
65
|
+
"ai-agent",
|
|
66
|
+
"terminal",
|
|
67
|
+
"financial-analysis",
|
|
68
|
+
"sentiment",
|
|
69
|
+
"technical-analysis",
|
|
70
|
+
"pi-package"
|
|
49
71
|
],
|
|
50
72
|
"files": [
|
|
51
|
-
"
|
|
73
|
+
"assets/logo.svg",
|
|
74
|
+
"dist",
|
|
75
|
+
"gui/server",
|
|
76
|
+
"gui/shared",
|
|
77
|
+
"gui/web/dist",
|
|
78
|
+
"src"
|
|
52
79
|
],
|
|
53
80
|
"scripts": {
|
|
81
|
+
"check:node": "node scripts/check-node-version.mjs",
|
|
82
|
+
"prebuild": "npm run check:node",
|
|
54
83
|
"build": "tsc && chmod +x dist/cli.js",
|
|
55
|
-
"prepare": "npm run build",
|
|
84
|
+
"prepare": "npm run build && npm run gui:web:build",
|
|
85
|
+
"prestart": "npm run check:node",
|
|
56
86
|
"start": "tsx src/cli.ts",
|
|
87
|
+
"gui:web:build": "npm --workspace @opencandle/gui-web run build",
|
|
88
|
+
"gui": "tsx gui/server/server.ts",
|
|
89
|
+
"gui:dev": "tsx gui/server/server.ts",
|
|
90
|
+
"pretest": "npm run check:node",
|
|
57
91
|
"test": "vitest run",
|
|
58
92
|
"test:watch": "vitest",
|
|
59
93
|
"test:e2e": "tsx tests/e2e/tools.test.ts",
|
|
60
94
|
"test:e2e:cli": "tsx tests/e2e/cli.test.ts",
|
|
95
|
+
"test:e2e:credential-prompt": "tsx tests/e2e/credential-prompt.test.ts",
|
|
96
|
+
"test:e2e:credential-snooze": "tsx tests/e2e/credential-snooze.test.ts",
|
|
97
|
+
"test:e2e:credential-soft-fallback": "tsx tests/e2e/credential-soft-fallback.test.ts",
|
|
98
|
+
"test:e2e:credential-per-workflow-cap": "tsx tests/e2e/credential-per-workflow-cap.test.ts",
|
|
99
|
+
"test:gui:browser": "OPENCANDLE_GUI_BROWSER=1 vitest run --config vitest.config.gui.ts",
|
|
61
100
|
"test:e2e:providers": "tsx tests/e2e/providers.test.ts",
|
|
62
101
|
"test:evals": "vitest run --config vitest.config.evals.ts",
|
|
102
|
+
"eval:router-live": "tsx tests/scripts/run-live-router-eval.ts",
|
|
63
103
|
"test:evals:usually": "EVAL_TIER=usually vitest run --config vitest.config.evals.ts",
|
|
64
104
|
"version:patch": "npm version patch --no-git-tag-version",
|
|
65
105
|
"version:minor": "npm version minor --no-git-tag-version",
|
|
@@ -72,30 +112,32 @@
|
|
|
72
112
|
"release:major": "node scripts/release.mjs major"
|
|
73
113
|
},
|
|
74
114
|
"engines": {
|
|
75
|
-
"node": "
|
|
115
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0 <27"
|
|
76
116
|
},
|
|
77
117
|
"dependencies": {
|
|
118
|
+
"@earendil-works/pi-agent-core": "^0.74.0",
|
|
119
|
+
"@earendil-works/pi-ai": "^0.74.0",
|
|
120
|
+
"@earendil-works/pi-coding-agent": "^0.74.0",
|
|
78
121
|
"@the-convocation/twitter-scraper": "^0.22.3",
|
|
79
|
-
"better-sqlite3": "^12.
|
|
80
|
-
"camoufox-js": "^0.
|
|
81
|
-
"
|
|
122
|
+
"better-sqlite3": "^12.10.0",
|
|
123
|
+
"camoufox-js": "^0.10.2",
|
|
124
|
+
"duck-duck-scrape": "^2.2.7",
|
|
125
|
+
"playwright-core": "^1.60.0",
|
|
126
|
+
"tsx": "^4.22.0"
|
|
82
127
|
},
|
|
83
128
|
"peerDependencies": {
|
|
84
|
-
"@mariozechner/pi-agent-core": "*",
|
|
85
|
-
"@mariozechner/pi-ai": "*",
|
|
86
|
-
"@mariozechner/pi-coding-agent": "*",
|
|
87
129
|
"@sinclair/typebox": "*"
|
|
88
130
|
},
|
|
89
131
|
"devDependencies": {
|
|
90
|
-
"@mariozechner/pi-agent-core": "^0.
|
|
91
|
-
"@mariozechner/pi-ai": "^0.
|
|
92
|
-
"@mariozechner/pi-coding-agent": "^0.
|
|
132
|
+
"@mariozechner/pi-agent-core": "^0.73.1",
|
|
133
|
+
"@mariozechner/pi-ai": "^0.73.1",
|
|
134
|
+
"@mariozechner/pi-coding-agent": "^0.73.1",
|
|
93
135
|
"@sinclair/typebox": "^0.34.0",
|
|
94
136
|
"@types/better-sqlite3": "^7.6.13",
|
|
95
|
-
"@types/node": "^22.
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"vitest": "^
|
|
99
|
-
"vitest-evals": "^0.
|
|
137
|
+
"@types/node": "^22.19.19",
|
|
138
|
+
"typescript": "^6.0.3",
|
|
139
|
+
"vite": "^8.0.11",
|
|
140
|
+
"vitest": "^4.1.6",
|
|
141
|
+
"vitest-evals": "^0.8.0"
|
|
100
142
|
}
|
|
101
143
|
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { AnalystOutput, AnalystSignal, DebateSide, DebateOutput } from "../runtime/workflow-types.js";
|
|
2
|
+
import type { EvidenceRecord } from "../runtime/evidence.js";
|
|
3
|
+
|
|
4
|
+
/** All analyst roles. */
|
|
5
|
+
export type AnalystRole =
|
|
6
|
+
| "valuation"
|
|
7
|
+
| "momentum"
|
|
8
|
+
| "options"
|
|
9
|
+
| "contrarian"
|
|
10
|
+
| "risk";
|
|
11
|
+
|
|
12
|
+
/** Evidence fields expected per analyst role. */
|
|
13
|
+
export const ROLE_EXPECTED_EVIDENCE: Record<AnalystRole, string[]> = {
|
|
14
|
+
valuation: ["P/E Ratio", "Forward P/E", "EPS", "Intrinsic Value", "Revenue Growth"],
|
|
15
|
+
momentum: ["RSI", "MACD", "SMA 50", "SMA 200", "Volume Trend"],
|
|
16
|
+
options: ["Put/Call Ratio", "IV Level", "Unusual Volume", "Max Pain"],
|
|
17
|
+
contrarian: ["Fear & Greed Index", "Reddit Sentiment", "Sentiment Score"],
|
|
18
|
+
risk: ["Annualized Volatility", "Sharpe Ratio", "Max Drawdown", "VaR 95%", "Position Size"],
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Parse an LLM response into a structured AnalystOutput.
|
|
23
|
+
* Falls back to raw text if parsing fails.
|
|
24
|
+
*/
|
|
25
|
+
export function parseAnalystOutput(
|
|
26
|
+
role: string,
|
|
27
|
+
responseText: string,
|
|
28
|
+
): AnalystOutput {
|
|
29
|
+
const signal = extractSignal(responseText);
|
|
30
|
+
const conviction = extractConviction(responseText);
|
|
31
|
+
const thesis = extractThesis(responseText);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
role,
|
|
35
|
+
signal: signal ?? "HOLD",
|
|
36
|
+
conviction: conviction ?? 5,
|
|
37
|
+
thesis: thesis ?? "",
|
|
38
|
+
evidence: [],
|
|
39
|
+
rawText: responseText,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function extractSignal(text: string): AnalystSignal | null {
|
|
44
|
+
const match = text.match(/SIGNAL:\s*(BUY|HOLD|SELL)/i);
|
|
45
|
+
if (match) return match[1].toUpperCase() as AnalystSignal;
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function extractConviction(text: string): number | null {
|
|
50
|
+
const match = text.match(/CONVICTION:\s*(\d+)/i);
|
|
51
|
+
if (match) {
|
|
52
|
+
const value = parseInt(match[1], 10);
|
|
53
|
+
if (value >= 1 && value <= 10) return value;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function extractThesis(text: string): string | null {
|
|
59
|
+
const match = text.match(/THESIS:\s*(.+)/i);
|
|
60
|
+
return match ? match[1].trim() : null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Build a structured vote tally from analyst outputs. */
|
|
64
|
+
export function tallyVotes(outputs: AnalystOutput[]): {
|
|
65
|
+
buy: number;
|
|
66
|
+
hold: number;
|
|
67
|
+
sell: number;
|
|
68
|
+
weightedConviction: number;
|
|
69
|
+
verdict: AnalystSignal;
|
|
70
|
+
} {
|
|
71
|
+
let buy = 0;
|
|
72
|
+
let hold = 0;
|
|
73
|
+
let sell = 0;
|
|
74
|
+
let totalWeight = 0;
|
|
75
|
+
let weightedSum = 0;
|
|
76
|
+
|
|
77
|
+
for (const output of outputs) {
|
|
78
|
+
switch (output.signal) {
|
|
79
|
+
case "BUY":
|
|
80
|
+
buy++;
|
|
81
|
+
break;
|
|
82
|
+
case "HOLD":
|
|
83
|
+
hold++;
|
|
84
|
+
break;
|
|
85
|
+
case "SELL":
|
|
86
|
+
sell++;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
totalWeight += output.conviction;
|
|
90
|
+
const signalValue = output.signal === "BUY" ? 1 : output.signal === "SELL" ? -1 : 0;
|
|
91
|
+
weightedSum += signalValue * output.conviction;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const weightedConviction = totalWeight > 0
|
|
95
|
+
? Math.round((totalWeight / outputs.length) * 10) / 10
|
|
96
|
+
: 0;
|
|
97
|
+
|
|
98
|
+
let verdict: AnalystSignal;
|
|
99
|
+
if (weightedSum > 0) verdict = "BUY";
|
|
100
|
+
else if (weightedSum < 0) verdict = "SELL";
|
|
101
|
+
else verdict = "HOLD";
|
|
102
|
+
|
|
103
|
+
return { buy, hold, sell, weightedConviction, verdict };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Parse an LLM debate response into a structured DebateOutput.
|
|
108
|
+
* Eval/test helper only — not used in the live workflow path.
|
|
109
|
+
*/
|
|
110
|
+
export function parseDebateOutput(side: DebateSide, responseText: string): DebateOutput {
|
|
111
|
+
// Detect skipped rebuttal
|
|
112
|
+
if (/^rebuttal skipped/i.test(responseText.trim())) {
|
|
113
|
+
return {
|
|
114
|
+
side,
|
|
115
|
+
thesis: "",
|
|
116
|
+
keyRisk: "",
|
|
117
|
+
concessions: [],
|
|
118
|
+
remainingConviction: 0,
|
|
119
|
+
evidence: [],
|
|
120
|
+
rawText: responseText,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const thesis = extractDebateThesis(side, responseText);
|
|
125
|
+
const keyRisk = extractKeyRisk(side, responseText);
|
|
126
|
+
const concessions = extractConcessions(responseText);
|
|
127
|
+
const remainingConviction = extractRemainingConviction(responseText);
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
side,
|
|
131
|
+
thesis,
|
|
132
|
+
keyRisk,
|
|
133
|
+
concessions,
|
|
134
|
+
remainingConviction,
|
|
135
|
+
evidence: [],
|
|
136
|
+
rawText: responseText,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function extractDebateThesis(side: DebateSide, text: string): string {
|
|
141
|
+
const label = side === "bull" ? "BULL THESIS" : "BEAR THESIS";
|
|
142
|
+
const match = text.match(new RegExp(`${label}:\\s*(.+)`, "i"));
|
|
143
|
+
return match ? match[1].trim() : "";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function extractKeyRisk(side: DebateSide, text: string): string {
|
|
147
|
+
if (side === "bear") {
|
|
148
|
+
const match = text.match(/WHAT WOULD CHANGE MY MIND:\s*(.+)/i);
|
|
149
|
+
return match ? match[1].trim() : "";
|
|
150
|
+
}
|
|
151
|
+
const match = text.match(/KEY RISK(?:\s+TO THIS THESIS)?:\s*(.+)/i);
|
|
152
|
+
return match ? match[1].trim() : "";
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function extractConcessions(text: string): string[] {
|
|
156
|
+
const match = text.match(/CONCESSIONS:\s*([\s\S]*?)(?=REMAINING CONVICTION:|$)/i);
|
|
157
|
+
if (!match) return [];
|
|
158
|
+
return match[1]
|
|
159
|
+
.split("\n")
|
|
160
|
+
.map((line) => line.replace(/^[-*•]\s*/, "").trim())
|
|
161
|
+
.filter(Boolean);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function extractRemainingConviction(text: string): number {
|
|
165
|
+
const match = text.match(/REMAINING CONVICTION:\s*(\d+)/i);
|
|
166
|
+
if (match) {
|
|
167
|
+
const value = parseInt(match[1], 10);
|
|
168
|
+
if (value >= 1 && value <= 10) return value;
|
|
169
|
+
}
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Check whether analysts produced a BUY+SELL split.
|
|
175
|
+
* Eval/test helper only — not used in the live workflow path.
|
|
176
|
+
*/
|
|
177
|
+
export function isAnalystSplit(outputs: AnalystOutput[]): boolean {
|
|
178
|
+
const votes = tallyVotes(outputs);
|
|
179
|
+
return votes.buy > 0 && votes.sell > 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Collect all evidence from analyst outputs. */
|
|
183
|
+
export function collectEvidence(outputs: AnalystOutput[]): EvidenceRecord[] {
|
|
184
|
+
const evidence: EvidenceRecord[] = [];
|
|
185
|
+
for (const output of outputs) {
|
|
186
|
+
evidence.push(...output.evidence);
|
|
187
|
+
}
|
|
188
|
+
return evidence;
|
|
189
|
+
}
|