gloomberb 0.10.0 → 0.10.2
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/package.json +8 -1
- package/src/api-client/auth.ts +1 -0
- package/src/api-client/index.test.ts +359 -108
- package/src/api-client/index.ts +24 -13
- package/src/api-client/socket.ts +70 -35
- package/src/api-client/types.ts +1 -1
- package/src/app/language-observer.test.tsx +82 -0
- package/src/app/language-observer.tsx +13 -0
- package/src/app/pane-runtime/index.tsx +2 -2
- package/src/app/pane-runtime/pane-settings-runtime.tsx +2 -2
- package/src/app/pane-runtime/pane-template-runtime.ts +2 -2
- package/src/app/pane-runtime/plugin-bindings.ts +2 -2
- package/src/app/pane-runtime/ticker-open-runtime.ts +2 -2
- package/src/app/runtime/broker-import.ts +2 -2
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +2 -2
- package/src/app.tsx +16 -7
- package/src/brokers/account-cache.ts +6 -6
- package/src/brokers/broker-ticker-sync.ts +3 -3
- package/src/brokers/remote-broker-adapter.ts +2 -2
- package/src/brokers/sync-broker-instance.ts +5 -6
- package/src/cli/commands/api.ts +3 -6
- package/src/cli/commands/automation.ts +7 -15
- package/src/cli/commands/market.ts +26 -61
- package/src/cli/commands/overview.ts +34 -45
- package/src/cli/commands/search.ts +25 -27
- package/src/cli/commands/system.ts +27 -57
- package/src/cli/commands/ticker.ts +62 -63
- package/src/cli/context.test.ts +63 -0
- package/src/cli/context.ts +15 -1
- package/src/cli/index.ts +1 -1
- package/src/cli/pane-functions/data.ts +2 -19
- package/src/cli/pane-functions/index.ts +26 -25
- package/src/cli/pane-functions/report.ts +1 -1
- package/src/cli/pane-functions/screenshot.ts +3 -3
- package/src/cli/scoped-context.ts +41 -0
- package/src/components/chart/composite/composite-chart.test.tsx +615 -18
- package/src/components/chart/composite/composite-chart.tsx +179 -79
- package/src/components/chart/composite/format.test.ts +20 -7
- package/src/components/chart/composite/index.ts +0 -21
- package/src/components/chart/composite/interactions.test.ts +90 -3
- package/src/components/chart/composite/interactions.ts +189 -24
- package/src/components/chart/composite/price-series.ts +0 -2
- package/src/components/chart/composite/rasterizer.ts +10 -9
- package/src/components/chart/composite/renderers.test.ts +108 -2
- package/src/components/chart/composite/scene.test.ts +36 -0
- package/src/components/chart/composite/scene.ts +5 -2
- package/src/components/chart/composite/text-renderer.ts +37 -25
- package/src/components/chart/composite/time-axis.test.ts +243 -0
- package/src/components/chart/composite/time-axis.ts +608 -0
- package/src/components/chart/composite/types.ts +12 -1
- package/src/components/chart/core/data.ts +2 -159
- package/src/components/chart/core/date-window.ts +6 -225
- package/src/components/chart/core/palette.ts +1 -12
- package/src/components/chart/core/pointer.ts +0 -142
- package/src/components/chart/core/types.ts +1 -58
- package/src/components/chart/cursor-motion.ts +2 -4
- package/src/components/chart/indicators/types.ts +0 -9
- package/src/components/chart/market-session.ts +0 -11
- package/src/components/chart/native/kitty/protocol.ts +1 -1
- package/src/components/chart/native/raster/layout.ts +3 -10
- package/src/components/chart/static/chart/axis-overlays.test.tsx +64 -0
- package/src/components/chart/static/chart/axis-overlays.tsx +59 -14
- package/src/components/chart/static/chart/surface.tsx +1 -2
- package/src/components/command-bar/action-runtime.ts +2 -2
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/panel/body.tsx +2 -2
- package/src/components/command-bar/panel/index.tsx +11 -9
- package/src/components/command-bar/routes/ticker-search/actions.ts +2 -2
- package/src/components/command-bar/surface/index.tsx +2 -2
- package/src/components/command-bar/workflow/body.tsx +3 -3
- package/src/components/command-bar/workflow/collection-actions.ts +2 -2
- package/src/components/command-bar/workflow/coordinator.ts +2 -2
- package/src/components/command-bar/workflow/field-row.tsx +25 -11
- package/src/components/command-bar/workflow/tickers.ts +2 -2
- package/src/components/feed-data-table/stack-view.test.tsx +28 -36
- package/src/components/feed-data-table/stack-view.tsx +3 -1
- package/src/components/layout/detached-pane-shell.tsx +6 -6
- package/src/components/layout/header.tsx +13 -9
- package/src/components/layout/pane/content.test.tsx +42 -3
- package/src/components/layout/pane/content.tsx +3 -1
- package/src/components/layout/pane/footer/index.test.tsx +45 -2
- package/src/components/layout/pane/footer/registration.tsx +3 -1
- package/src/components/layout/shell/index.tsx +1 -2
- package/src/components/layout/shell/native/surfaces.ts +1 -1
- package/src/components/layout/shell/native/window-state.ts +1 -1
- package/src/components/layout/status-bar.tsx +12 -8
- package/src/components/layout/window-controls.tsx +8 -6
- package/src/components/onboarding/onboarding-wizard.tsx +3 -1
- package/src/components/pane-settings-dialog/desktop.tsx +0 -2
- package/src/components/pane-settings-dialog.tsx +0 -2
- package/src/components/pane-template-wizard.tsx +10 -9
- package/src/components/price-performance.tsx +2 -113
- package/src/components/price-sparkline/model.ts +15 -17
- package/src/components/price-sparkline/view.tsx +8 -7
- package/src/components/speedometer-gauge/desktop.tsx +2 -1
- package/src/components/speedometer-gauge/index.tsx +0 -2
- package/src/components/speedometer-gauge/terminal.tsx +24 -5
- package/src/components/ticker/badge/index.tsx +1 -18
- package/src/components/ui/data-table/opentui/index.tsx +3 -3
- package/src/components/ui/frame.tsx +1 -2
- package/src/components/ui/page-stack-view.test.tsx +126 -0
- package/src/components/ui/page-stack-view.tsx +24 -12
- package/src/components/ui/tabs.tsx +7 -3
- package/src/components/ui/ui.test.tsx +23 -2
- package/src/components/use-external-link-footer.ts +4 -2
- package/src/core/app-service-ports.ts +46 -0
- package/src/core/app-services.test.ts +66 -0
- package/src/core/app-services.ts +17 -15
- package/src/data/config/chart-settings.ts +3 -10
- package/src/data/config/store/index.test.ts +99 -2
- package/src/data/config/store/migrations.ts +278 -0
- package/src/data/config/store/normalize.ts +44 -186
- package/src/data/resource-store.ts +73 -12
- package/src/data/sqlite/cache.test.ts +104 -15
- package/src/i18n/index.test.ts +17 -0
- package/src/i18n/index.ts +23 -6
- package/src/i18n/ja.ts +13 -0
- package/src/i18n/ko.ts +13 -0
- package/src/i18n/react.ts +6 -0
- package/src/i18n/zh-cn.ts +13 -0
- package/src/i18n/zh-tw.ts +13 -0
- package/src/market-data/coordinator/auxiliary.ts +7 -3
- package/src/market-data/coordinator/chart.ts +1 -1
- package/src/market-data/coordinator/index.test.ts +26 -0
- package/src/market-data/coordinator/index.ts +11 -5
- package/src/market-data/coordinator/quotes.ts +4 -40
- package/src/market-data/coordinator/subscriptions.test.ts +89 -1
- package/src/market-data/hooks.tsx +47 -1
- package/src/market-data/market/status.ts +6 -6
- package/src/market-data/performance.ts +1 -1
- package/src/market-data/quote-subscription-target.test.ts +37 -0
- package/src/market-data/quote-subscription-target.ts +60 -0
- package/src/market-data/quotes/freshness.ts +1 -0
- package/src/market-data/quotes/resolution.ts +4 -0
- package/src/market-data/request-types.ts +3 -3
- package/src/news/aggregator.test.ts +97 -1
- package/src/news/aggregator.ts +100 -57
- package/src/news/hooks.test.tsx +64 -0
- package/src/news/hooks.ts +18 -25
- package/src/plugins/builtin/account-management/footer.ts +4 -2
- package/src/plugins/builtin/account-management/pane.tsx +9 -4
- package/src/plugins/builtin/ai/agent-history.ts +11 -7
- package/src/plugins/builtin/ai/ask-ai-detail-tab.tsx +0 -5
- package/src/plugins/builtin/ai/ask-ai.test.tsx +3 -4
- package/src/plugins/builtin/ai/index.test.ts +2 -2
- package/src/plugins/builtin/ai/index.tsx +10 -11
- package/src/plugins/builtin/ai/pane-settings.ts +1 -1
- package/src/plugins/builtin/ai/pi/runtime.ts +6 -5
- package/src/plugins/builtin/ai/providers.ts +1 -9
- package/src/plugins/builtin/ai/runner.ts +0 -6
- package/src/plugins/builtin/ai/screener/footer.ts +4 -1
- package/src/plugins/builtin/ai/screener/pane.test.tsx +9 -9
- package/src/plugins/builtin/ai/workspace/model.ts +2 -27
- package/src/plugins/builtin/ai/workspace/pane.tsx +2 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +3 -2
- package/src/plugins/builtin/broker-manager/index.tsx +4 -2
- package/src/plugins/builtin/chart-composer/editor/controller.ts +643 -0
- package/src/plugins/builtin/chart-composer/editor/desktop-view.tsx +134 -0
- package/src/plugins/builtin/chart-composer/editor/model.test.ts +85 -0
- package/src/plugins/builtin/chart-composer/editor/model.ts +292 -0
- package/src/plugins/builtin/chart-composer/editor/opentui-view.tsx +108 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +65 -947
- package/src/plugins/builtin/chart-composer/index.tsx +0 -6
- package/src/plugins/builtin/chart-composer/pane.tsx +69 -36
- package/src/plugins/builtin/chart-composer/presets.ts +1 -19
- package/src/plugins/builtin/chart-composer/settings.ts +1 -1
- package/src/plugins/builtin/chat/content/composer-runtime.ts +1 -1
- package/src/plugins/builtin/chat/content/shortcuts.ts +0 -1
- package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
- package/src/plugins/builtin/chat/controller/persistence.ts +2 -0
- package/src/plugins/builtin/chat/controller/session.test.ts +25 -0
- package/src/plugins/builtin/chat/controller/session.ts +2 -0
- package/src/plugins/builtin/chat/controller/state.ts +7 -0
- package/src/plugins/builtin/chat/controller.test.ts +73 -20
- package/src/plugins/builtin/chat/message/desktop.tsx +2 -0
- package/src/plugins/builtin/cloud-tweets/footer.ts +9 -28
- package/src/plugins/builtin/cloud-tweets/pane.tsx +0 -5
- package/src/plugins/builtin/cloud-tweets/table.tsx +12 -17
- package/src/plugins/builtin/correlation/compute.ts +4 -10
- package/src/plugins/builtin/econ/index.tsx +17 -19
- package/src/plugins/builtin/holders/types.ts +0 -1
- package/src/plugins/builtin/insider/index.tsx +6 -31
- package/src/plugins/builtin/news/index.tsx +5 -7
- package/src/plugins/builtin/news/wire/breaking/pane.test.tsx +6 -8
- package/src/plugins/builtin/news/wire/news/footer.ts +10 -11
- package/src/plugins/builtin/news/wire/read-state.test.ts +7 -0
- package/src/plugins/builtin/news/wire/read-state.ts +18 -28
- package/src/plugins/builtin/news/wire/rss/parser.ts +1 -11
- package/src/plugins/builtin/options/footer.test.ts +115 -0
- package/src/plugins/builtin/options/footer.ts +110 -0
- package/src/plugins/builtin/options/live-quotes.test.ts +238 -0
- package/src/plugins/builtin/options/live-quotes.ts +147 -0
- package/src/plugins/builtin/options/view.test.tsx +71 -1
- package/src/plugins/builtin/options/view.tsx +39 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +103 -117
- package/src/plugins/builtin/portfolio-list/cli/render.ts +11 -5
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +120 -135
- package/src/plugins/builtin/portfolio-list/header.tsx +9 -4
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +6 -1
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +4 -2
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +24 -52
- package/src/plugins/builtin/sec/filing-content.test.ts +41 -0
- package/src/plugins/builtin/sec/filing-content.ts +94 -0
- package/src/plugins/builtin/sec/index.tsx +21 -104
- package/src/plugins/builtin/sectors/sector-model.ts +1 -7
- package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -0
- package/src/plugins/builtin/shared/pane-footer.ts +82 -0
- package/src/plugins/builtin/shared/read-state.ts +64 -3
- package/src/plugins/builtin/substack/read-state.ts +16 -41
- package/src/plugins/builtin/thirteenf/pane.tsx +24 -73
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +10 -10
- package/src/plugins/builtin/yield-curve/index.tsx +11 -9
- package/src/plugins/ibkr/dialogs.tsx +3 -3
- package/src/plugins/ibkr/gateway/fundamentals.ts +1 -1
- package/src/plugins/ibkr/gateway/history-requests.ts +2 -2
- package/src/plugins/ibkr/gateway/history.ts +2 -2
- package/src/plugins/ibkr/gateway/selection.ts +2 -2
- package/src/plugins/ibkr/gateway/service/index.ts +2 -2
- package/src/plugins/ibkr/gateway/service/native.ts +2 -2
- package/src/plugins/plugin-persistence.ts +3 -4
- package/src/plugins/prediction-markets/controller/keyboard.ts +1 -1
- package/src/plugins/prediction-markets/controller/live-updates.ts +6 -5
- package/src/plugins/prediction-markets/detail/book.tsx +2 -2
- package/src/plugins/prediction-markets/detail/outcomes.tsx +3 -1
- package/src/plugins/prediction-markets/detail/pane.tsx +3 -1
- package/src/plugins/prediction-markets/detail/trades.tsx +3 -3
- package/src/plugins/registry/context.ts +3 -4
- package/src/plugins/registry/index.ts +5 -6
- package/src/react/input.test.ts +126 -3
- package/src/react/input.ts +120 -1
- package/src/remote/app-host.tsx +2 -13
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +44 -60
- package/src/renderers/electrobun/bun/desktop/capability-bridge.ts +15 -13
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +26 -22
- package/src/renderers/electrobun/bun/desktop/http-fetch.ts +5 -1
- package/src/renderers/electrobun/bun/desktop/initialization.ts +11 -6
- package/src/renderers/electrobun/bun/desktop/media.ts +5 -3
- package/src/renderers/electrobun/bun/desktop/plugin-state.ts +21 -22
- package/src/renderers/electrobun/bun/desktop/window-controls.ts +3 -1
- package/src/renderers/electrobun/bun/desktop/workspace/requests.ts +18 -18
- package/src/renderers/electrobun/bun/index.ts +123 -83
- package/src/renderers/electrobun/shared/protocol.ts +146 -7
- package/src/renderers/electrobun/view/app-services.ts +5 -8
- package/src/renderers/electrobun/view/backend-rpc.ts +18 -8
- package/src/renderers/electrobun/view/broker-remote-client.ts +2 -2
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +5 -22
- package/src/renderers/electrobun/view/config-host.ts +1 -1
- package/src/renderers/electrobun/view/context-menu.ts +1 -17
- package/src/renderers/electrobun/view/data-table/index.tsx +0 -1
- package/src/renderers/electrobun/view/data-table/row.tsx +0 -4
- package/src/renderers/electrobun/view/desktop/control-styles.ts +37 -34
- package/src/renderers/electrobun/view/desktop/controls.tsx +36 -33
- package/src/renderers/electrobun/view/desktop/list-view.tsx +15 -12
- package/src/renderers/electrobun/view/desktop/popover.tsx +2 -3
- package/src/renderers/electrobun/view/dialog-host.tsx +2 -3
- package/src/renderers/electrobun/view/fatal-screen.tsx +0 -1
- package/src/renderers/electrobun/view/host/box.tsx +0 -1
- package/src/renderers/electrobun/view/host/chart-surface.tsx +0 -1
- package/src/renderers/electrobun/view/host/input.tsx +0 -1
- package/src/renderers/electrobun/view/host/media-surface.tsx +0 -1
- package/src/renderers/electrobun/view/host/native.ts +0 -1
- package/src/renderers/electrobun/view/host/scroll-box.tsx +0 -1
- package/src/renderers/electrobun/view/host/tabs.tsx +0 -1
- package/src/renderers/electrobun/view/host/text.tsx +0 -1
- package/src/renderers/electrobun/view/http-fetch.ts +3 -11
- package/src/renderers/electrobun/view/input-host.tsx +10 -53
- package/src/renderers/electrobun/view/key-event.ts +0 -1
- package/src/renderers/electrobun/view/main.tsx +3 -3
- package/src/renderers/electrobun/view/native-renderer.ts +0 -1
- package/src/renderers/electrobun/view/native-stubs/backend-rpc.ts +13 -1
- package/src/renderers/electrobun/view/native-stubs/chart/surface-manager.ts +11 -0
- package/src/renderers/electrobun/view/native-stubs/native-stubs.test.ts +47 -0
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +6 -44
- package/src/renderers/electrobun/view/remote/persistence.ts +6 -2
- package/src/renderers/electrobun/view/remote/quote-subscription-registry.test.ts +86 -0
- package/src/renderers/electrobun/view/remote/quote-subscription-registry.ts +72 -0
- package/src/renderers/electrobun/view/remote/ticker-repository.ts +2 -2
- package/src/renderers/electrobun/view/toast-host.tsx +0 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -2
- package/src/renderers/electrobun/view/update-host.ts +1 -1
- package/src/renderers/opentui/chart-surface.tsx +2 -1
- package/src/renderers/opentui/dialog-host.tsx +20 -4
- package/src/renderers/opentui/image/loader.ts +12 -2
- package/src/renderers/opentui/input-host.tsx +7 -49
- package/src/renderers/opentui/start.tsx +2 -0
- package/src/sources/gloomberb-cloud/history-quality.ts +44 -0
- package/src/sources/gloomberb-cloud/index.test.ts +173 -0
- package/src/sources/gloomberb-cloud/index.ts +42 -20
- package/src/sources/gloomberb-cloud/normalizers.ts +9 -3
- package/src/sources/provider-router/cache.ts +1 -1
- package/src/sources/provider-router/document-routes.ts +10 -5
- package/src/sources/provider-router/financials.test.ts +14 -0
- package/src/sources/provider-router/financials.ts +6 -1
- package/src/sources/provider-router/history.test.ts +163 -1
- package/src/sources/provider-router/history.ts +278 -347
- package/src/sources/provider-router/index.ts +2 -2
- package/src/sources/provider-router/routing.test.ts +39 -0
- package/src/sources/provider-router/routing.ts +24 -11
- package/src/sources/provider-router/supplemental.ts +37 -17
- package/src/sources/sec-edgar/content.ts +2 -12
- package/src/sources/sec-edgar.ts +2 -13
- package/src/sources/yahoo-finance/history.ts +2 -2
- package/src/sources/yahoo-finance/options.ts +5 -0
- package/src/sources/yahoo-finance.ts +2 -2
- package/src/state/app/bootstrap.ts +2 -2
- package/src/state/app/context/index.tsx +2 -2
- package/src/state/hooks/quote-streaming.ts +66 -1
- package/src/state/hooks/session-snapshot.ts +2 -2
- package/src/state/selectors.ts +0 -9
- package/src/sync/controller.test.ts +98 -0
- package/src/sync/controller.ts +29 -5
- package/src/sync/react.ts +2 -2
- package/src/sync/types.ts +2 -2
- package/src/theme/colors.test.ts +10 -0
- package/src/theme/colors.ts +75 -78
- package/src/theme/theme-context.test.tsx +67 -0
- package/src/theme/theme-context.tsx +9 -5
- package/src/tickers/open-target.ts +2 -2
- package/src/tickers/search/upsert.ts +2 -2
- package/src/time-series/alignment.ts +0 -7
- package/src/time-series/chart-data.ts +145 -0
- package/src/time-series/date-window.ts +44 -0
- package/src/time-series/history-window.ts +21 -0
- package/src/time-series/hooks.test.ts +59 -0
- package/src/time-series/hooks.ts +33 -12
- package/src/time-series/market-resolution.ts +2 -2
- package/src/time-series/market.ts +1 -1
- package/src/time-series/range.ts +9 -0
- package/src/{components/chart/core → time-series}/resolution.ts +3 -102
- package/src/time-series/resolve.test.ts +203 -1
- package/src/time-series/resolve.ts +96 -18
- package/src/time-series/spec-studies.test.ts +15 -0
- package/src/time-series/spec.ts +2 -2
- package/src/time-series/studies.ts +5 -2
- package/src/time-series/types.ts +3 -1
- package/src/time-series/use-chart-resolution.test.tsx +358 -0
- package/src/time-series/use-chart-resolution.ts +46 -4
- package/src/types/broker.ts +2 -2
- package/src/types/data-provider.ts +3 -3
- package/src/types/financials.ts +12 -0
- package/src/types/plugin.ts +2 -2
- package/src/ui/context-menu.tsx +3 -2
- package/src/ui/dialog.tsx +2 -2
- package/src/utils/html-entities.ts +3 -5
- package/src/utils/main-thread-monitor.ts +1 -1
- package/src/utils/price-history.ts +5 -5
- package/src/version.ts +3 -1
- package/src/components/chart/core/viewport.test.ts +0 -8
- package/src/components/chart/core/viewport.ts +0 -24
- package/src/time-series/index.ts +0 -14
- /package/src/{components/chart/core → time-series}/resolution.test.ts +0 -0
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
} from "./providers";
|
|
9
9
|
import { AiScreenerPane } from "./screener/pane";
|
|
10
10
|
import { buildAiScreenerPaneSettingsDef, getAiScreenerPaneSettings } from "./settings";
|
|
11
|
-
import { t } from "../../../i18n";
|
|
12
11
|
import {
|
|
13
12
|
LOCAL_AGENT_WORKSPACE_SCHEMA_VERSION,
|
|
14
13
|
LOCAL_AGENT_WORKSPACE_STATE_KEY,
|
|
@@ -185,7 +184,7 @@ export const aiPlugin: GloomPlugin = {
|
|
|
185
184
|
id: "ai",
|
|
186
185
|
name: "AI",
|
|
187
186
|
version: "1.0.0",
|
|
188
|
-
description:
|
|
187
|
+
description: "Use AI providers with your financial data.",
|
|
189
188
|
toggleable: true,
|
|
190
189
|
|
|
191
190
|
setup(ctx) {
|
|
@@ -205,12 +204,12 @@ export const aiPlugin: GloomPlugin = {
|
|
|
205
204
|
...screenerRunnerWizard,
|
|
206
205
|
{
|
|
207
206
|
key: "prompt",
|
|
208
|
-
label:
|
|
207
|
+
label: "Screener Prompt",
|
|
209
208
|
type: "textarea" as const,
|
|
210
|
-
placeholder:
|
|
209
|
+
placeholder: "Examples: humanoid robot suppliers, defense software compounders, EM payment rails, obesity-drug picks-and-shovels...",
|
|
211
210
|
body: [
|
|
212
|
-
|
|
213
|
-
|
|
211
|
+
"Describe the screening idea in plain English.",
|
|
212
|
+
"The AI will return validated ticker ideas with a short reason for each one.",
|
|
214
213
|
],
|
|
215
214
|
},
|
|
216
215
|
];
|
|
@@ -253,7 +252,7 @@ export const aiPlugin: GloomPlugin = {
|
|
|
253
252
|
|
|
254
253
|
ctx.registerTickerResearchTab({
|
|
255
254
|
id: "ai-chat",
|
|
256
|
-
name:
|
|
255
|
+
name: "Ask AI",
|
|
257
256
|
order: 60,
|
|
258
257
|
component: AskAiResearchTab,
|
|
259
258
|
});
|
|
@@ -326,7 +325,7 @@ export const aiPlugin: GloomPlugin = {
|
|
|
326
325
|
|
|
327
326
|
ctx.registerPane({
|
|
328
327
|
id: "ai-screener",
|
|
329
|
-
name:
|
|
328
|
+
name: "AI Screener",
|
|
330
329
|
icon: "A",
|
|
331
330
|
component: AiScreenerPane,
|
|
332
331
|
defaultPosition: "right",
|
|
@@ -377,8 +376,8 @@ export const aiPlugin: GloomPlugin = {
|
|
|
377
376
|
ctx.registerPaneTemplate({
|
|
378
377
|
id: "new-ai-screener-pane",
|
|
379
378
|
paneId: "ai-screener",
|
|
380
|
-
label:
|
|
381
|
-
description:
|
|
379
|
+
label: "AI Screener",
|
|
380
|
+
description: "Create a prompt-driven AI screener pane with reusable screening tabs.",
|
|
382
381
|
keywords: ["ai", "screener", "screen", "watchlist", "prompt"],
|
|
383
382
|
shortcut: { prefix: "AI", argPlaceholder: "prompt", argKind: "text" },
|
|
384
383
|
wizard: screenerWizard,
|
|
@@ -406,7 +405,7 @@ export const aiPlugin: GloomPlugin = {
|
|
|
406
405
|
providerId === readyDefaults.providerId ? readyDefaults.modelId : null,
|
|
407
406
|
);
|
|
408
407
|
return {
|
|
409
|
-
title:
|
|
408
|
+
title: "AI Screener",
|
|
410
409
|
placement: "floating",
|
|
411
410
|
params: {
|
|
412
411
|
prompt,
|
|
@@ -10,7 +10,7 @@ export const AI_DEFAULT_PROVIDER_SETTING_KEY = "defaultProviderId";
|
|
|
10
10
|
export const AI_DEFAULT_MODEL_SETTING_KEY = "defaultModelId";
|
|
11
11
|
export const AI_PANE_PROVIDER_SETTING_KEY = "providerId";
|
|
12
12
|
export const AI_PANE_MODEL_SETTING_KEY = "modelId";
|
|
13
|
-
|
|
13
|
+
const AI_INHERIT_SETTING_VALUE = "";
|
|
14
14
|
|
|
15
15
|
export interface AiSharedDefaults {
|
|
16
16
|
providerId: string;
|
|
@@ -606,10 +606,15 @@ export class PiAiRuntime {
|
|
|
606
606
|
const finalAssistant = resultMessages.findLast(isAssistantMessage);
|
|
607
607
|
const finalText = finalAssistant ? assistantText(finalAssistant) : cumulativeText;
|
|
608
608
|
if (finalText && finalText !== cumulativeText) request.onChunk?.(finalText);
|
|
609
|
+
const userMessage: AgentMessage = {
|
|
610
|
+
role: "user",
|
|
611
|
+
content: request.prompt,
|
|
612
|
+
timestamp: Date.now(),
|
|
613
|
+
};
|
|
609
614
|
return {
|
|
610
615
|
text: finalText,
|
|
611
616
|
messages: [
|
|
612
|
-
|
|
617
|
+
userMessage,
|
|
613
618
|
...resultMessages,
|
|
614
619
|
],
|
|
615
620
|
};
|
|
@@ -629,7 +634,3 @@ export class PiAiRuntime {
|
|
|
629
634
|
};
|
|
630
635
|
}
|
|
631
636
|
}
|
|
632
|
-
|
|
633
|
-
export function createPiAiRuntime(options: PiAiRuntimeOptions): PiAiRuntime {
|
|
634
|
-
return new PiAiRuntime(options);
|
|
635
|
-
}
|
|
@@ -16,7 +16,7 @@ export type AiProviderId = (typeof AI_PROVIDER_IDS)[number];
|
|
|
16
16
|
* These aliases exist only to migrate persisted pre-Pi selections. Runtime
|
|
17
17
|
* catalogs and requests always use the canonical Pi provider ids above.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
const LEGACY_AI_PROVIDER_ID_ALIASES = {
|
|
20
20
|
claude: "anthropic",
|
|
21
21
|
codex: "openai-codex",
|
|
22
22
|
gemini: "google",
|
|
@@ -158,12 +158,6 @@ export function detectProviders(): AiProvider[] {
|
|
|
158
158
|
return detectedProviders;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
export function getAvailableProviders(
|
|
162
|
-
providers: readonly AiProvider[] = detectProviders(),
|
|
163
|
-
): AiProvider[] {
|
|
164
|
-
return providers.filter((provider) => provider.available);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
161
|
export function getAiProvider(
|
|
168
162
|
providerId: string | null | undefined,
|
|
169
163
|
providers: readonly AiProvider[] = detectProviders(),
|
|
@@ -195,5 +189,3 @@ export function setDetectedProviders(providers: AiProvider[] | null): void {
|
|
|
195
189
|
outputModes: [...provider.outputModes],
|
|
196
190
|
})) ?? null;
|
|
197
191
|
}
|
|
198
|
-
|
|
199
|
-
export const __setDetectedProvidersForTests = setDetectedProviders;
|
|
@@ -217,12 +217,6 @@ export function getAiRuntimeCatalog(): AiRuntimeCatalog {
|
|
|
217
217
|
return cloneCatalog(runtimeCatalog);
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
export async function refreshAiRuntimeCatalog(): Promise<AiRuntimeCatalog> {
|
|
221
|
-
if (!configuredHost?.getCatalog) return getAiRuntimeCatalog();
|
|
222
|
-
publishCatalog(await configuredHost.getCatalog());
|
|
223
|
-
return getAiRuntimeCatalog();
|
|
224
|
-
}
|
|
225
|
-
|
|
226
220
|
export async function connectAiRuntimeProvider(
|
|
227
221
|
providerId: string,
|
|
228
222
|
authType?: AiRuntimeAuthType,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { usePaneFooter } from "../../../../components";
|
|
2
2
|
import { t } from "../../../../i18n";
|
|
3
|
+
import { useAppLanguage } from "../../../../i18n/react";
|
|
3
4
|
import type { AiScreenerTab, RunState, ScreenerEditorState } from "./model";
|
|
4
5
|
|
|
5
6
|
interface UseAiScreenerFooterOptions {
|
|
@@ -27,6 +28,7 @@ export function useAiScreenerFooter({
|
|
|
27
28
|
onRefresh,
|
|
28
29
|
onSaveEditor,
|
|
29
30
|
}: UseAiScreenerFooterOptions) {
|
|
31
|
+
const language = useAppLanguage();
|
|
30
32
|
usePaneFooter("ai-screener", () => ({
|
|
31
33
|
info: isRunningActiveTab && runState
|
|
32
34
|
? [{
|
|
@@ -75,7 +77,7 @@ export function useAiScreenerFooter({
|
|
|
75
77
|
{
|
|
76
78
|
id: "new",
|
|
77
79
|
key: "t",
|
|
78
|
-
label: t("
|
|
80
|
+
label: t("new"),
|
|
79
81
|
onPress: onAddTab,
|
|
80
82
|
},
|
|
81
83
|
{
|
|
@@ -97,6 +99,7 @@ export function useAiScreenerFooter({
|
|
|
97
99
|
activeTab,
|
|
98
100
|
editorState,
|
|
99
101
|
isRunningActiveTab,
|
|
102
|
+
language,
|
|
100
103
|
onAddTab,
|
|
101
104
|
onCancelRun,
|
|
102
105
|
onCloseEditor,
|
|
@@ -12,7 +12,7 @@ import { Box } from "../../../../ui";
|
|
|
12
12
|
import { PluginRenderProvider, type PluginRuntimeAccess } from "../../../runtime";
|
|
13
13
|
import { getSharedMarketData, setSharedMarketDataForTests, setSharedRegistryForTests } from "../../../registry";
|
|
14
14
|
import { AiScreenerPane } from "./pane";
|
|
15
|
-
import {
|
|
15
|
+
import { setDetectedProviders, type AiProvider } from "../providers";
|
|
16
16
|
import { setAiRunHost, setAiRuntimeCatalog, type AiRunHost } from "../runner";
|
|
17
17
|
|
|
18
18
|
const PANE_ID = "ai-screener:test";
|
|
@@ -175,7 +175,7 @@ beforeEach(() => {
|
|
|
175
175
|
afterEach(() => {
|
|
176
176
|
setAiRunHost(null);
|
|
177
177
|
setAiRuntimeCatalog({ providers: [], accounts: [], models: [] });
|
|
178
|
-
|
|
178
|
+
setDetectedProviders(null);
|
|
179
179
|
setSharedRegistryForTests(undefined);
|
|
180
180
|
setSharedMarketDataForTests(undefined);
|
|
181
181
|
if (testSetup) {
|
|
@@ -187,7 +187,7 @@ afterEach(() => {
|
|
|
187
187
|
describe("AiScreenerPane", () => {
|
|
188
188
|
test("shows the account connection message before trying to run", async () => {
|
|
189
189
|
const provider = makeProvider("anthropic", "Claude");
|
|
190
|
-
|
|
190
|
+
setDetectedProviders([provider]);
|
|
191
191
|
setAiRunHost({
|
|
192
192
|
run() {
|
|
193
193
|
throw new Error("provider should not run before it is connected");
|
|
@@ -216,7 +216,7 @@ describe("AiScreenerPane", () => {
|
|
|
216
216
|
'{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
|
|
217
217
|
'{"title":"Compounders","summary":"Second pass","tickers":[{"symbol":"MSFT","exchange":"NASDAQ","reason":"Fresh rerun result"}]}',
|
|
218
218
|
);
|
|
219
|
-
|
|
219
|
+
setDetectedProviders([provider]);
|
|
220
220
|
|
|
221
221
|
const dataProvider = createTestDataProvider();
|
|
222
222
|
setSharedMarketDataForTests(dataProvider);
|
|
@@ -251,7 +251,7 @@ describe("AiScreenerPane", () => {
|
|
|
251
251
|
});
|
|
252
252
|
|
|
253
253
|
test("uses pane runner overrides without rewriting the seeded tab", async () => {
|
|
254
|
-
|
|
254
|
+
setDetectedProviders([
|
|
255
255
|
makeProvider("anthropic", "Claude"),
|
|
256
256
|
makeProvider("openai-codex", "OpenAI"),
|
|
257
257
|
]);
|
|
@@ -294,7 +294,7 @@ describe("AiScreenerPane", () => {
|
|
|
294
294
|
'{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
|
|
295
295
|
'{"title":"Compounders","summary":"Second pass","tickers":[{"symbol":"MSFT","exchange":"NASDAQ","reason":"Fresh rerun result"}]}',
|
|
296
296
|
);
|
|
297
|
-
|
|
297
|
+
setDetectedProviders([provider]);
|
|
298
298
|
|
|
299
299
|
const dataProvider = createTestDataProvider();
|
|
300
300
|
setSharedMarketDataForTests(dataProvider);
|
|
@@ -333,7 +333,7 @@ describe("AiScreenerPane", () => {
|
|
|
333
333
|
'{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
|
|
334
334
|
'{"title":"Compounders","summary":"Second pass","tickers":[{"symbol":"MSFT","exchange":"NASDAQ","reason":"Fresh rerun result"}]}',
|
|
335
335
|
);
|
|
336
|
-
|
|
336
|
+
setDetectedProviders([provider]);
|
|
337
337
|
|
|
338
338
|
const dataProvider = createTestDataProvider();
|
|
339
339
|
setSharedMarketDataForTests(dataProvider);
|
|
@@ -368,7 +368,7 @@ describe("AiScreenerPane", () => {
|
|
|
368
368
|
|
|
369
369
|
test("does not show a stale prompt-changed status while a refresh is active", async () => {
|
|
370
370
|
const provider = makeProvider("anthropic", "Claude");
|
|
371
|
-
|
|
371
|
+
setDetectedProviders([provider]);
|
|
372
372
|
installHost(() => new Promise<string>(() => {}));
|
|
373
373
|
|
|
374
374
|
const dataProvider = createTestDataProvider();
|
|
@@ -401,7 +401,7 @@ describe("AiScreenerPane", () => {
|
|
|
401
401
|
'{"title":"Compounders","summary":"Initial pass","tickers":[{"symbol":"AAPL","exchange":"NASDAQ","reason":"Strong cash flow durability"}]}',
|
|
402
402
|
"not-json",
|
|
403
403
|
);
|
|
404
|
-
|
|
404
|
+
setDetectedProviders([provider]);
|
|
405
405
|
|
|
406
406
|
const dataProvider = createTestDataProvider();
|
|
407
407
|
setSharedMarketDataForTests(dataProvider);
|
|
@@ -173,15 +173,6 @@ export function createLocalAgentThread(
|
|
|
173
173
|
};
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
export function selectLocalAgentThread(
|
|
177
|
-
state: LocalAgentWorkspaceState,
|
|
178
|
-
threadId: string,
|
|
179
|
-
): LocalAgentWorkspaceState {
|
|
180
|
-
return state.threads.some((thread) => thread.id === threadId)
|
|
181
|
-
? { ...state, activeThreadId: threadId }
|
|
182
|
-
: state;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
176
|
export function updateLocalAgentThread(
|
|
186
177
|
state: LocalAgentWorkspaceState,
|
|
187
178
|
threadId: string,
|
|
@@ -220,22 +211,6 @@ export function appendLocalAgentMessages(
|
|
|
220
211
|
});
|
|
221
212
|
}
|
|
222
213
|
|
|
223
|
-
export function replaceLocalAgentMessage(
|
|
224
|
-
state: LocalAgentWorkspaceState,
|
|
225
|
-
threadId: string,
|
|
226
|
-
messageId: string,
|
|
227
|
-
update: Pick<LocalAgentMessage, "content"> & Pick<Partial<LocalAgentMessage>, "status">,
|
|
228
|
-
now = Date.now(),
|
|
229
|
-
): LocalAgentWorkspaceState {
|
|
230
|
-
return updateLocalAgentThread(state, threadId, (thread) => ({
|
|
231
|
-
...thread,
|
|
232
|
-
updatedAt: now,
|
|
233
|
-
messages: thread.messages.map((message) => (
|
|
234
|
-
message.id === messageId ? { ...message, ...update } : message
|
|
235
|
-
)),
|
|
236
|
-
}));
|
|
237
|
-
}
|
|
238
|
-
|
|
239
214
|
export function removeLocalAgentMessages(
|
|
240
215
|
state: LocalAgentWorkspaceState,
|
|
241
216
|
threadId: string,
|
|
@@ -267,9 +242,9 @@ export function buildLocalAgentTranscript(
|
|
|
267
242
|
thread: LocalAgentThread,
|
|
268
243
|
): AiAgentHistoryMessage[] {
|
|
269
244
|
if (thread.agentMessages.length > 0) return thread.agentMessages;
|
|
270
|
-
return buildLocalAgentHistory(thread).map((message) => (
|
|
245
|
+
return buildLocalAgentHistory(thread).map((message): AiAgentHistoryMessage => (
|
|
271
246
|
message.role === "user"
|
|
272
|
-
? message
|
|
247
|
+
? { role: "user", content: message.content }
|
|
273
248
|
: {
|
|
274
249
|
role: "assistant",
|
|
275
250
|
content: [{ type: "text", text: message.content }],
|
|
@@ -477,7 +477,7 @@ export function LocalAgentWorkspacePane({ paneId, focused, width, height }: Pane
|
|
|
477
477
|
setStreamingOutput("");
|
|
478
478
|
|
|
479
479
|
let streamedOutput = "";
|
|
480
|
-
let completedAgentMessages: AiAgentHistoryMessage[]
|
|
480
|
+
let completedAgentMessages: AiAgentHistoryMessage[] = [];
|
|
481
481
|
try {
|
|
482
482
|
const controller = runAiPrompt({
|
|
483
483
|
providerId: provider.id,
|
|
@@ -499,7 +499,7 @@ export function LocalAgentWorkspacePane({ paneId, focused, width, height }: Pane
|
|
|
499
499
|
if (!mountedRef.current) return;
|
|
500
500
|
setRunningMessageId(null);
|
|
501
501
|
setStreamingOutput("");
|
|
502
|
-
const transcriptDelta = completedAgentMessages
|
|
502
|
+
const transcriptDelta = completedAgentMessages.length
|
|
503
503
|
? completedAgentMessages
|
|
504
504
|
: [
|
|
505
505
|
{ role: "user" as const, content: prompt },
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PricePoint } from "../../../types/financials";
|
|
2
2
|
import type { TickerRecord } from "../../../types/ticker";
|
|
3
|
+
import { getPricePointTimestamp } from "../../../utils/price-history";
|
|
3
4
|
|
|
4
5
|
export interface DatedReturn {
|
|
5
6
|
dateKey: string;
|
|
@@ -11,13 +12,6 @@ export interface WeightedReturnSeries {
|
|
|
11
12
|
returns: DatedReturn[];
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
function getPricePointTimestamp(point: PricePoint): number {
|
|
15
|
-
const value = point.date as Date | string | number | null | undefined;
|
|
16
|
-
if (value instanceof Date) return value.getTime();
|
|
17
|
-
if (value == null) return Number.NaN;
|
|
18
|
-
return new Date(value).getTime();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
15
|
function toDateKey(timestamp: number): string {
|
|
22
16
|
const date = new Date(timestamp);
|
|
23
17
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
@@ -131,6 +131,7 @@ export function BrokerDetailContent({
|
|
|
131
131
|
if (!row) return <Box flexGrow={1} />;
|
|
132
132
|
|
|
133
133
|
const detailStatusMessage = isBrokerErrorMessage(message) ? message : row.message || t("No status message.");
|
|
134
|
+
const editAdapter = row.adapter;
|
|
134
135
|
|
|
135
136
|
return (
|
|
136
137
|
<ScrollBox flexGrow={1} scrollY>
|
|
@@ -152,7 +153,7 @@ export function BrokerDetailContent({
|
|
|
152
153
|
<Text fg={colors.textMuted}>{tf("Status updated {time}", { time: formatBrokerUpdatedAt(row.updatedAt) })}</Text>
|
|
153
154
|
<Box height={1} />
|
|
154
155
|
|
|
155
|
-
{editDraft &&
|
|
156
|
+
{editDraft && editAdapter ? (
|
|
156
157
|
<Box flexDirection="column" gap={1}>
|
|
157
158
|
<Text fg={colors.textBright} attributes={TextAttributes.BOLD}>{t("Edit Profile")}</Text>
|
|
158
159
|
<Box onMouseDown={() => onActiveEditKeyChange("label")}>
|
|
@@ -184,7 +185,7 @@ export function BrokerDetailContent({
|
|
|
184
185
|
field={field}
|
|
185
186
|
draft={editDraft}
|
|
186
187
|
previous={row.instance}
|
|
187
|
-
adapter={
|
|
188
|
+
adapter={editAdapter}
|
|
188
189
|
focused={activeEditKey === field.key}
|
|
189
190
|
onFocus={() => onActiveEditKeyChange(field.key)}
|
|
190
191
|
onChange={onDraftValueChange}
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "../../../state/app/context";
|
|
12
12
|
import { colors } from "../../../theme/colors";
|
|
13
13
|
import { t, tf } from "../../../i18n";
|
|
14
|
+
import { useAppLanguage } from "../../../i18n/react";
|
|
14
15
|
import type { BrokerAdapter } from "../../../types/broker";
|
|
15
16
|
import type { PaneProps } from "../../../types/plugin";
|
|
16
17
|
import type { PluginModule } from "../plugin-module";
|
|
@@ -31,6 +32,7 @@ import {
|
|
|
31
32
|
} from "./table";
|
|
32
33
|
|
|
33
34
|
export function BrokersPane({ focused, width, height }: PaneProps) {
|
|
35
|
+
const language = useAppLanguage();
|
|
34
36
|
const dispatch = useAppDispatch();
|
|
35
37
|
const config = useAppSelector((state) => state.config);
|
|
36
38
|
const brokerAccounts = useAppSelector((state) => state.brokerAccounts);
|
|
@@ -62,7 +64,7 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
|
|
|
62
64
|
|
|
63
65
|
const rows = useMemo(
|
|
64
66
|
() => buildBrokerProfileRows(config, adapters, brokerAccounts),
|
|
65
|
-
[adapters, brokerAccounts, config, statusVersion],
|
|
67
|
+
[adapters, brokerAccounts, config, language, statusVersion],
|
|
66
68
|
);
|
|
67
69
|
const selectedRow = rows[Math.min(selectedIndex, rows.length - 1)] ?? null;
|
|
68
70
|
const selectedAccounts = selectedRow ? brokerAccounts[selectedRow.id] ?? [] : [];
|
|
@@ -175,7 +177,7 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
|
|
|
175
177
|
const errorCount = rows.filter((row) => row.state === "error" || row.state === "unavailable").length;
|
|
176
178
|
const bodyHeight = Math.max(5, height - 4);
|
|
177
179
|
const tableWidth = Math.max(24, width - 2);
|
|
178
|
-
const columns = useMemo(() => buildBrokerColumns(tableWidth), [tableWidth]);
|
|
180
|
+
const columns = useMemo(() => buildBrokerColumns(tableWidth), [language, tableWidth]);
|
|
179
181
|
|
|
180
182
|
const openSelectedDetail = useCallback((index: number, _row: BrokerProfileRow) => {
|
|
181
183
|
setSelectedIndex(index);
|