gloomberb 0.18.3 → 0.18.4
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 +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +84 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +22 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +21 -4
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1117 -264
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +192 -47
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +47 -10
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +198 -68
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +305 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +13 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +12 -6
- package/src/components/layout/header.tsx +7 -6
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +107 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +76 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +6 -3
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +6 -8
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +79 -23
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +5 -3
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +3 -2
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +18 -11
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +6 -1
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -4
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +10 -4
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +33 -19
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +29 -8
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +36 -15
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +4 -1
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +8 -1
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +2 -1
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/styles.css +76 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +1 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +32 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +17 -4
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/index.ts +10 -5
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
package/src/api-client/socket.ts
CHANGED
|
@@ -23,6 +23,7 @@ import { debugLog } from "../utils/debug-log";
|
|
|
23
23
|
import { canonicalExchange, normalizeSymbol } from "../utils/exchanges";
|
|
24
24
|
import { mergeQuoteSubscriptionTargets } from "../market-data/quote-subscription-target";
|
|
25
25
|
import { recordServerClockSample } from "../market-data/quotes/clock";
|
|
26
|
+
import { perpetualListing } from "../tickers/perpetual-listing";
|
|
26
27
|
import {
|
|
27
28
|
connectionHealth,
|
|
28
29
|
GLOOM_CLOUD_SOCKET_CONNECTION_ID,
|
|
@@ -41,6 +42,19 @@ export const CHAT_ATTACHMENTS_FEATURE = "chat.attachments";
|
|
|
41
42
|
/** The app can run terminal tools relayed from a remote assistant; it still announces itself first. */
|
|
42
43
|
export const TERMINAL_RELAY_FEATURE = "terminal.relay";
|
|
43
44
|
const CLIENT_SOCKET_FEATURES = [MARKET_BATCH_FEATURE, CHAT_ATTACHMENTS_FEATURE, TERMINAL_RELAY_FEATURE] as const;
|
|
45
|
+
/**
|
|
46
|
+
* The server streams perpetual listings (`BTC:HYPERLIQUID`) from their venues. Until a server offers it, they are
|
|
47
|
+
* kept off market.subscribe: an older one would read `BTC` on HYPERLIQUID as a stock symbol.
|
|
48
|
+
*/
|
|
49
|
+
const MARKET_PERPS_FEATURE = "market.perps";
|
|
50
|
+
/**
|
|
51
|
+
* The most perpetual listings the app streams at once, across every pane: on screen and selected first. The server
|
|
52
|
+
* takes up to 100 from one connection (fewer signed out); the rest keep their fetched readings.
|
|
53
|
+
*/
|
|
54
|
+
const PERP_STREAM_BUDGET = 60;
|
|
55
|
+
/** On screen and selected first, then by weight; equal ones keep the order they were asked in. */
|
|
56
|
+
const perpStreamRank = (target: QuoteStreamTarget) => (target.selected ? 2 : 0) + (target.visible ? 1 : 0);
|
|
57
|
+
const isPerpTarget = (target: QuoteStreamTarget) => !!perpetualListing(target.symbol, target.exchange);
|
|
44
58
|
const cloudApiLog = debugLog.createLogger("cloud-api");
|
|
45
59
|
|
|
46
60
|
type ChannelListener = (message: ChatMessage) => void;
|
|
@@ -143,6 +157,13 @@ export class CloudApiSocket {
|
|
|
143
157
|
private featuresRequestedFor: WebSocket | null = null;
|
|
144
158
|
/** What the last "ready" frame offered; kept across reconnects so a blip does not hide features. */
|
|
145
159
|
private offeredFeatures: ReadonlySet<string> = new Set();
|
|
160
|
+
/**
|
|
161
|
+
* The connection whose server offered perpetual markets. Asked of every connection: a reconnect may reach an older
|
|
162
|
+
* server, which would read `BTC` on HYPERLIQUID as a stock symbol.
|
|
163
|
+
*/
|
|
164
|
+
private perpsOfferedOn: WebSocket | null = null;
|
|
165
|
+
/** The perpetual listings this connection streams, within PERP_STREAM_BUDGET. */
|
|
166
|
+
private streamedPerps = new Map<string, QuoteStreamTarget>();
|
|
146
167
|
private readonly offeredFeatureListeners = new Set<() => void>();
|
|
147
168
|
private readonly connectionListeners = new Set<(event: "ready" | "closed") => void>();
|
|
148
169
|
private readonly tapeListeners = new Map<string, { symbol: string; exchange: string; listeners: Set<(event: TapeFeedEvent) => void> }>();
|
|
@@ -761,6 +782,13 @@ export class CloudApiSocket {
|
|
|
761
782
|
const changed = next.size !== this.offeredFeatures.size
|
|
762
783
|
|| [...next].some((feature) => !this.offeredFeatures.has(feature));
|
|
763
784
|
this.offeredFeatures = next;
|
|
785
|
+
// Perpetual listings held back since the socket opened go out once this connection's server offers them.
|
|
786
|
+
const perpsOffered = next.has(MARKET_PERPS_FEATURE) ? this.ws : null;
|
|
787
|
+
if (perpsOffered !== this.perpsOfferedOn) {
|
|
788
|
+
this.perpsOfferedOn = perpsOffered;
|
|
789
|
+
this.streamedPerps.clear();
|
|
790
|
+
this.syncPerpSubscriptions();
|
|
791
|
+
}
|
|
764
792
|
if (!changed) return;
|
|
765
793
|
for (const listener of this.offeredFeatureListeners) listener();
|
|
766
794
|
}
|
|
@@ -960,14 +988,41 @@ export class CloudApiSocket {
|
|
|
960
988
|
this.sendSocketMessage({ type: "scanner.subscribe", scanner });
|
|
961
989
|
}
|
|
962
990
|
|
|
963
|
-
|
|
991
|
+
const targets = [...this.quoteTargets.values()].filter((target) => !isPerpTarget(target));
|
|
992
|
+
if (targets.length > 0) {
|
|
964
993
|
this.sendSocketMessage({
|
|
965
994
|
type: "market.subscribe",
|
|
966
|
-
symbols:
|
|
995
|
+
symbols: targets.map((target) =>
|
|
967
996
|
this.serializeQuoteStreamTarget(target),
|
|
968
997
|
),
|
|
969
998
|
});
|
|
970
999
|
}
|
|
1000
|
+
this.streamedPerps.clear();
|
|
1001
|
+
this.syncPerpSubscriptions();
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
/**
|
|
1005
|
+
* Streams the perpetual listings within the budget, once this connection's server offers them: the best ranked
|
|
1006
|
+
* across every pane. One that falls out is unsubscribed; one whose target changed (`changed`) is sent again.
|
|
1007
|
+
*/
|
|
1008
|
+
private syncPerpSubscriptions(changed: ReadonlySet<string> = new Set()): void {
|
|
1009
|
+
const ws = this.ws;
|
|
1010
|
+
if (!ws || ws.readyState !== WebSocket.OPEN || this.perpsOfferedOn !== ws) return;
|
|
1011
|
+
const wanted = new Map(
|
|
1012
|
+
[...this.quoteTargets]
|
|
1013
|
+
.filter(([, target]) => isPerpTarget(target))
|
|
1014
|
+
.sort(([, left], [, right]) => perpStreamRank(right) - perpStreamRank(left) || (right.weight ?? 0) - (left.weight ?? 0))
|
|
1015
|
+
.slice(0, PERP_STREAM_BUDGET),
|
|
1016
|
+
);
|
|
1017
|
+
const unsubscribes = [...this.streamedPerps].filter(([key]) => !wanted.has(key)).map(([, target]) => target);
|
|
1018
|
+
const subscribes = [...wanted].filter(([key]) => !this.streamedPerps.has(key) || changed.has(key)).map(([, target]) => target);
|
|
1019
|
+
this.streamedPerps = wanted;
|
|
1020
|
+
if (unsubscribes.length > 0) {
|
|
1021
|
+
this.sendSocketMessage({ type: "market.unsubscribe", symbols: unsubscribes.map((target) => this.serializeQuoteStreamTarget(target)) });
|
|
1022
|
+
}
|
|
1023
|
+
if (subscribes.length > 0) {
|
|
1024
|
+
this.sendSocketMessage({ type: "market.subscribe", symbols: subscribes.map((target) => this.serializeQuoteStreamTarget(target)) });
|
|
1025
|
+
}
|
|
971
1026
|
}
|
|
972
1027
|
|
|
973
1028
|
private scheduleQuoteSubscriptionFlush(): void {
|
|
@@ -1002,10 +1057,15 @@ export class CloudApiSocket {
|
|
|
1002
1057
|
this.pendingQuoteUnsubscribes.clear();
|
|
1003
1058
|
return;
|
|
1004
1059
|
}
|
|
1005
|
-
const subscribes = [...this.pendingQuoteSubscribes.values()];
|
|
1006
|
-
const unsubscribes = [...this.pendingQuoteUnsubscribes.values()];
|
|
1060
|
+
const subscribes = [...this.pendingQuoteSubscribes.values()].filter((target) => !isPerpTarget(target));
|
|
1061
|
+
const unsubscribes = [...this.pendingQuoteUnsubscribes.values()].filter((target) => !isPerpTarget(target));
|
|
1062
|
+
const perpsChanged = [...this.pendingQuoteSubscribes]
|
|
1063
|
+
.filter(([, target]) => isPerpTarget(target))
|
|
1064
|
+
.map(([key]) => key);
|
|
1065
|
+
const perpsMoved = perpsChanged.length > 0 || [...this.pendingQuoteUnsubscribes.values()].some(isPerpTarget);
|
|
1007
1066
|
this.pendingQuoteSubscribes.clear();
|
|
1008
1067
|
this.pendingQuoteUnsubscribes.clear();
|
|
1068
|
+
if (perpsMoved) this.syncPerpSubscriptions(new Set(perpsChanged));
|
|
1009
1069
|
if (unsubscribes.length > 0) {
|
|
1010
1070
|
this.sendSocketMessage({
|
|
1011
1071
|
type: "market.unsubscribe",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const SWAP_TENORS = ["1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "15Y", "20Y", "30Y"] as const;
|
|
2
|
+
export type SwapTenor = typeof SWAP_TENORS[number];
|
|
3
|
+
type SwapQuality = "ok" | "thin" | "missing";
|
|
4
|
+
|
|
5
|
+
export interface SwapPoint {
|
|
6
|
+
tenor: SwapTenor;
|
|
7
|
+
years: number;
|
|
8
|
+
/** Percentage rate: 4.5 means 4.5%. */
|
|
9
|
+
rate: number | null;
|
|
10
|
+
changeBp: number | null;
|
|
11
|
+
spreadBp: number | null;
|
|
12
|
+
treasuryRate: number | null;
|
|
13
|
+
tradeCount: number;
|
|
14
|
+
candidateCount: number;
|
|
15
|
+
excludedCount: number;
|
|
16
|
+
notionalUsd: number;
|
|
17
|
+
quality: SwapQuality;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface SwapCurvePayload {
|
|
21
|
+
source: "DTCC PPD";
|
|
22
|
+
currency: "USD";
|
|
23
|
+
benchmark: "SOFR";
|
|
24
|
+
asOf: string | null;
|
|
25
|
+
fetchedAt: string | null;
|
|
26
|
+
stale: boolean;
|
|
27
|
+
previousDate: string | null;
|
|
28
|
+
treasuryDate: string | null;
|
|
29
|
+
points: SwapPoint[];
|
|
30
|
+
comparisons: Record<"week" | "month", { date: string | null; points: SwapPoint[] }>;
|
|
31
|
+
history: {
|
|
32
|
+
tenor: SwapTenor;
|
|
33
|
+
points: Array<{ date: string; rate: number | null; spreadBp: number | null; tradeCount: number; quality: SwapQuality }>;
|
|
34
|
+
};
|
|
35
|
+
}
|
package/src/api-client/themes.ts
CHANGED
|
@@ -38,7 +38,13 @@ interface SnapshotMetadata {
|
|
|
38
38
|
asOf: string;
|
|
39
39
|
snapshotId: string;
|
|
40
40
|
stale: boolean;
|
|
41
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* Whose prices the board carries: `realtime` for a Pro account, priced from
|
|
43
|
+
* a live read the server renews every 15 seconds; `delayed`, fifteen
|
|
44
|
+
* minutes behind, otherwise. An older server leaves it out (delayed).
|
|
45
|
+
*/
|
|
46
|
+
access?: "realtime" | "delayed";
|
|
47
|
+
/** The US market as the board reads it: now for a real-time board, fifteen minutes back otherwise. Absent from older servers. */
|
|
42
48
|
session?: "PRE" | "REGULAR" | "POST" | "CLOSED" | null;
|
|
43
49
|
/** Outside the regular session, the completed session every figure describes; null while one trades. */
|
|
44
50
|
regularSessionDate?: string | null;
|
package/src/api-client/types.ts
CHANGED
|
@@ -480,6 +480,11 @@ export interface CloudPricePointPayload {
|
|
|
480
480
|
low?: number;
|
|
481
481
|
close: number;
|
|
482
482
|
volume?: number;
|
|
483
|
+
/**
|
|
484
|
+
* One venue's count for a bar whose market volume is unavailable (a US session still trading, counted on IEX
|
|
485
|
+
* alone), served in place of `volume`.
|
|
486
|
+
*/
|
|
487
|
+
venueVolume?: { venue: string; volume: number };
|
|
483
488
|
/** A daily bar still forming when served: a coin's UTC day, or the trade date a future is trading. */
|
|
484
489
|
partial?: boolean;
|
|
485
490
|
/** A coin's daily bar whose prices were rebuilt from hourly bars; a day the source left empty has no volume. */
|
|
@@ -500,6 +505,43 @@ export interface CloudEconEventPayload {
|
|
|
500
505
|
forecast: string | null;
|
|
501
506
|
prior: string | null;
|
|
502
507
|
impact: CloudEconImpact;
|
|
508
|
+
/** Rows the calendar adds beside its feeds: a central bank's kept decision or a statistics office's listed release. */
|
|
509
|
+
kind?: "central-bank-decision" | "statistics-release";
|
|
510
|
+
/** The publisher's own clock time and its IANA zone; null when it states no time. */
|
|
511
|
+
localTime?: string | null;
|
|
512
|
+
timeZone?: string;
|
|
513
|
+
/** Why a row has no time, when its publisher states none. */
|
|
514
|
+
timeNote?: string | null;
|
|
515
|
+
priorAsOf?: string | null;
|
|
516
|
+
referencePeriod?: string | null;
|
|
517
|
+
/** Who publishes the release (Freddie Mac for the 30-year mortgage rate), and its page when one is named. */
|
|
518
|
+
source?: { name: string; url?: string };
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/** One currency's short-term rate, as GET /cloud/econ/short-rates serves it. */
|
|
522
|
+
export interface CloudShortRate {
|
|
523
|
+
currency: string;
|
|
524
|
+
/** "SOFR", "TIIE 28d". */
|
|
525
|
+
name: string;
|
|
526
|
+
/** "overnight" or the term the rate is for. */
|
|
527
|
+
tenor: string;
|
|
528
|
+
tenorDays: number;
|
|
529
|
+
/** Days in the year the rate is quoted over. */
|
|
530
|
+
dayCountBasis: 360 | 365;
|
|
531
|
+
publisher: string;
|
|
532
|
+
sourceUrl: string;
|
|
533
|
+
/** Percent a year; null when it could not be read. */
|
|
534
|
+
value: number | null;
|
|
535
|
+
/** The day the rate is for. */
|
|
536
|
+
asOf: string | null;
|
|
537
|
+
fetchedAt: string | null;
|
|
538
|
+
stale: boolean;
|
|
539
|
+
unavailableReason: string | null;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
export interface CloudShortRatesPayload {
|
|
543
|
+
generatedAt: string;
|
|
544
|
+
rates: CloudShortRate[];
|
|
503
545
|
}
|
|
504
546
|
|
|
505
547
|
/** CPI, payrolls and FOMC statement days as published, as GET /cloud/econ/release-days serves them. */
|
|
@@ -509,8 +551,17 @@ export interface CloudMacroReleaseDaysPayload {
|
|
|
509
551
|
/** The last New York day the lists are complete for. */
|
|
510
552
|
coveredThrough: string;
|
|
511
553
|
sources: string[];
|
|
512
|
-
/** New York dates, oldest first. */
|
|
513
|
-
releases: Record<"cpi" | "jobs" | "fomc", string[]
|
|
554
|
+
/** New York dates, oldest first. Brazil's IPCA days when the server can vouch for them. */
|
|
555
|
+
releases: Record<"cpi" | "jobs" | "fomc", string[]> & { ipca?: string[] };
|
|
556
|
+
/** Each kind's figures by New York release day, for the days they are known. */
|
|
557
|
+
figures?: Partial<Record<"cpi" | "jobs" | "fomc" | "ipca", Record<string, {
|
|
558
|
+
event: string;
|
|
559
|
+
actual: string | null;
|
|
560
|
+
forecast: string | null;
|
|
561
|
+
prior: string | null;
|
|
562
|
+
/** Above the consensus (hot), below it (cool), at it (in-line); null without both. */
|
|
563
|
+
surprise: "hot" | "cool" | "in-line" | null;
|
|
564
|
+
}>>>;
|
|
514
565
|
}
|
|
515
566
|
|
|
516
567
|
export interface CloudFredObservationPayload {
|
|
@@ -523,6 +574,12 @@ export interface CloudFredObservationPayload {
|
|
|
523
574
|
publisher?: string;
|
|
524
575
|
/** When that publisher's value was first read, ISO in UTC. */
|
|
525
576
|
publishedAt?: string;
|
|
577
|
+
/**
|
|
578
|
+
* The day FRED's source released this value (`YYYY-MM-DD`), on the newest
|
|
579
|
+
* observation of a weekly to annual series: September's permits are dated
|
|
580
|
+
* 1 Sep and were released 20 Oct. Absent on daily series and older points.
|
|
581
|
+
*/
|
|
582
|
+
releasedOn?: string;
|
|
526
583
|
}
|
|
527
584
|
|
|
528
585
|
export interface CloudFredSeriesInfoPayload {
|
|
@@ -681,6 +738,10 @@ export interface CloudCdsLevelsResponse {
|
|
|
681
738
|
interface CloudShortInterestPointPayload {
|
|
682
739
|
settlementDate: string;
|
|
683
740
|
shortPercentFloat?: number | null;
|
|
741
|
+
/** The 10-K or 10-Q cover share count known when FINRA published the settlement. Absent on servers older than the field. */
|
|
742
|
+
sharesOutstanding?: number;
|
|
743
|
+
/** YYYY-MM-DD that count was taken. */
|
|
744
|
+
sharesOutstandingAsOf?: string;
|
|
684
745
|
sharesShort: number;
|
|
685
746
|
previousSharesShort: number | null;
|
|
686
747
|
averageDailyVolume: number | null;
|
|
@@ -819,6 +880,11 @@ export interface CloudEarningsCallPayload {
|
|
|
819
880
|
sentiment: number | null;
|
|
820
881
|
/** The replay or event page the transcript came from. */
|
|
821
882
|
webcastUrl?: string | null;
|
|
883
|
+
/**
|
|
884
|
+
* Whether `callAt` is the call's start or its day alone (00:00 UTC of that
|
|
885
|
+
* New York day). Absent from a server that predates it.
|
|
886
|
+
*/
|
|
887
|
+
callTimeKnown?: boolean;
|
|
822
888
|
}
|
|
823
889
|
|
|
824
890
|
interface CloudJobsSeriesPoint {
|
|
@@ -864,6 +930,17 @@ export interface CloudJobsPosting {
|
|
|
864
930
|
tags: string[];
|
|
865
931
|
}
|
|
866
932
|
|
|
933
|
+
/** One posting as its detail view reads it. */
|
|
934
|
+
export interface CloudJobsPostingDetail extends CloudJobsPosting {
|
|
935
|
+
/** The careers system's own id. */
|
|
936
|
+
externalId: string;
|
|
937
|
+
/** As the careers system writes it ("Full time", "FULL_TIME", "CDI"). */
|
|
938
|
+
employmentType: string | null;
|
|
939
|
+
/** The start of the role's description, as read from its page. */
|
|
940
|
+
description: string | null;
|
|
941
|
+
closedAt: string | null;
|
|
942
|
+
}
|
|
943
|
+
|
|
867
944
|
export interface CloudJobsChange {
|
|
868
945
|
count: number;
|
|
869
946
|
percent: number | null;
|
|
@@ -1335,6 +1412,8 @@ interface CloudSecFilingPayload {
|
|
|
1335
1412
|
primaryDocumentUrl?: string;
|
|
1336
1413
|
/** The filing's SEC file number for this company, empty when it has none. Absent from older servers. */
|
|
1337
1414
|
fileNumber?: string;
|
|
1415
|
+
/** In a fund's list from a trust that runs several funds: filed for the fund's own series. Absent from older servers. */
|
|
1416
|
+
fundSeries?: boolean;
|
|
1338
1417
|
}
|
|
1339
1418
|
|
|
1340
1419
|
interface CloudSecDocumentPayload {
|
|
@@ -2200,6 +2279,15 @@ export interface TeamCollectionItem {
|
|
|
2200
2279
|
exchange: string;
|
|
2201
2280
|
quantity: number | null;
|
|
2202
2281
|
note: string | null;
|
|
2282
|
+
/**
|
|
2283
|
+
* A portfolio holding's purchase date (YYYY-MM-DD), its currency, and the
|
|
2284
|
+
* rate its cost was bought at (one unit of `currency` in `costFxCurrency`).
|
|
2285
|
+
* Null when no one has sent one; missing from a server that keeps none.
|
|
2286
|
+
*/
|
|
2287
|
+
dateAcquired?: string | null;
|
|
2288
|
+
currency?: string | null;
|
|
2289
|
+
costFxRate?: number | null;
|
|
2290
|
+
costFxCurrency?: string | null;
|
|
2203
2291
|
addedBy: string;
|
|
2204
2292
|
addedAt: string;
|
|
2205
2293
|
updatedAt: string;
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
import { applyPluginToggles } from "../../plugins/ownership";
|
|
18
18
|
import { setLayoutManagerDispatch } from "../../plugins/builtin/layout-manager";
|
|
19
19
|
import { setMarketplaceHost } from "../../plugins/marketplace/store";
|
|
20
|
+
import { deactivatePluginForRemoval } from "../../plugins/marketplace/deactivation";
|
|
20
21
|
import type { InstalledPlugin } from "../../plugins/marketplace/model";
|
|
21
22
|
import {
|
|
22
23
|
listExternalPlugins,
|
|
@@ -235,7 +236,7 @@ export function bindAppPanePluginRegistry({
|
|
|
235
236
|
const sharedPane = materialized.layout.instances[0];
|
|
236
237
|
if (!sharedPane) throw new Error("This shared pane is invalid.");
|
|
237
238
|
const paneDef = pluginRegistry.panes.get(sharedPane.paneId);
|
|
238
|
-
if (!paneDef) throw new Error("This shared pane is unavailable in this version of
|
|
239
|
+
if (!paneDef) throw new Error("This shared pane is unavailable in this version of Gloom.");
|
|
239
240
|
const owner = pluginRegistry.getDisabledPaneOwner(sharedPane.paneId, stateRef.current.config.disabledPlugins);
|
|
240
241
|
if (owner) throw new PluginOffError(owner, "this shared pane");
|
|
241
242
|
const instance = buildPaneInstance(sharedPane.paneId, sharedPane);
|
|
@@ -502,7 +503,13 @@ export function bindAppPanePluginRegistry({
|
|
|
502
503
|
for (const instanceId of orphaned) next = removePane(next, instanceId);
|
|
503
504
|
persistLayout(next);
|
|
504
505
|
}
|
|
505
|
-
|
|
506
|
+
try {
|
|
507
|
+
deactivatePluginForRemoval(pluginRegistry, pluginId);
|
|
508
|
+
} catch (error) {
|
|
509
|
+
const entry = listExternalPlugins().find((candidate) => candidate.plugin.id === pluginId);
|
|
510
|
+
if (entry) upsertExternalPlugin({ ...entry, needsRestart: true });
|
|
511
|
+
throw error;
|
|
512
|
+
}
|
|
506
513
|
removeExternalPlugin(pluginId, directory);
|
|
507
514
|
},
|
|
508
515
|
contributions: (pluginId) => {
|
|
@@ -184,7 +184,7 @@ function parseCloudDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
|
|
|
184
184
|
message: "Pro is active.",
|
|
185
185
|
};
|
|
186
186
|
}
|
|
187
|
-
return { type: "unsupported", message: "Unsupported
|
|
187
|
+
return { type: "unsupported", message: "Unsupported Gloom cloud link." };
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
function parseTickerDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
|
|
@@ -207,7 +207,7 @@ function parseCollectionDeepLink(parsed: ParsedGloomUrl, kind: CollectionDeepLin
|
|
|
207
207
|
|
|
208
208
|
function parseAlertDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
|
|
209
209
|
if ((parsed.segments[0] ?? "new") !== "new") {
|
|
210
|
-
return { type: "unsupported", message: "Unsupported
|
|
210
|
+
return { type: "unsupported", message: "Unsupported Gloom alert link." };
|
|
211
211
|
}
|
|
212
212
|
const symbol = normalizeSymbol(param(parsed.url, "symbol", "ticker"));
|
|
213
213
|
const condition = normalizeAlertCondition(param(parsed.url, "condition", "side", "trigger"));
|
|
@@ -255,7 +255,7 @@ function parseNewsDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
|
|
|
255
255
|
if (route === "top") {
|
|
256
256
|
return { type: "open-news", kind: "top", symbol: null, message: "Opened top news." };
|
|
257
257
|
}
|
|
258
|
-
return { type: "unsupported", message: "Unsupported
|
|
258
|
+
return { type: "unsupported", message: "Unsupported Gloom news link." };
|
|
259
259
|
}
|
|
260
260
|
|
|
261
261
|
function parseLayoutDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
|
|
@@ -274,7 +274,7 @@ function parseShareDeepLink(parsed: ParsedGloomUrl): DesktopDeepLinkAction {
|
|
|
274
274
|
|
|
275
275
|
export function resolveDesktopDeepLinkAction(rawUrl: string): DesktopDeepLinkAction {
|
|
276
276
|
const parsed = parseGloomUrl(rawUrl);
|
|
277
|
-
if (!parsed) return { type: "unsupported", message: "Unsupported
|
|
277
|
+
if (!parsed) return { type: "unsupported", message: "Unsupported Gloom link." };
|
|
278
278
|
|
|
279
279
|
switch (parsed.host) {
|
|
280
280
|
case "cloud":
|
|
@@ -298,7 +298,7 @@ export function resolveDesktopDeepLinkAction(rawUrl: string): DesktopDeepLinkAct
|
|
|
298
298
|
case "layout":
|
|
299
299
|
return parseLayoutDeepLink(parsed);
|
|
300
300
|
default:
|
|
301
|
-
return { type: "unsupported", message: "Unsupported
|
|
301
|
+
return { type: "unsupported", message: "Unsupported Gloom link." };
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
clearPersistedBrokerAccounts,
|
|
5
5
|
getBrokerAccountCacheSourceKey,
|
|
6
6
|
} from "../../brokers/account-cache";
|
|
7
|
-
import { clearLeftoverBrokerHoldings, findPortfolioHeir, knownBrokerHoldings } from "../../brokers/broker-portfolio-sync";
|
|
7
|
+
import { accountsShownFor, clearLeftoverBrokerHoldings, findPortfolioHeir, knownBrokerHoldings } from "../../brokers/broker-portfolio-sync";
|
|
8
8
|
import type { AppTickerRepositoryPort } from "../../core/app-service-ports";
|
|
9
9
|
import type { MarketDataCoordinator } from "../../market-data/coordinator";
|
|
10
10
|
import { instrumentFromTicker } from "../../market-data/request-types";
|
|
@@ -143,7 +143,7 @@ export function bindPluginRegistryRuntimeAccess({
|
|
|
143
143
|
|
|
144
144
|
await broker.connect?.(instance);
|
|
145
145
|
if (broker.listAccounts) {
|
|
146
|
-
const accounts = await broker.listAccounts(instance);
|
|
146
|
+
const accounts = accountsShownFor(stateRef.current.config, instance, await broker.listAccounts(instance));
|
|
147
147
|
dispatch({ type: "SET_BROKER_ACCOUNTS", instanceId, accounts });
|
|
148
148
|
}
|
|
149
149
|
},
|
|
@@ -8,6 +8,7 @@ import { instrumentFromTicker, type InstrumentRef } from "../../market-data/requ
|
|
|
8
8
|
import { useSavedLayoutWarmup } from "./layout-warmup";
|
|
9
9
|
import { chatController } from "../../plugins/builtin/chat/controller";
|
|
10
10
|
import { PLUGIN_MARKETPLACE_PANE_ID } from "../../plugins/marketplace/ids";
|
|
11
|
+
import { takePluginSeedNotice } from "../../plugins/seed-notice";
|
|
11
12
|
import type { LoadedExternalPlugin } from "../../plugins/loader";
|
|
12
13
|
import type { PluginRegistry } from "../../plugins/registry";
|
|
13
14
|
import type {
|
|
@@ -38,6 +39,8 @@ const appLog = debugLog.createLogger("app");
|
|
|
38
39
|
|
|
39
40
|
/** How long the restored panes wait for plugins that register theirs during setup. */
|
|
40
41
|
const RESTORED_FUNCTIONS_WAIT_MS = 15_000;
|
|
42
|
+
/** Long enough to read what to install before it goes. */
|
|
43
|
+
const PLUGIN_SEED_NOTICE_MS = 12_000;
|
|
41
44
|
|
|
42
45
|
/**
|
|
43
46
|
* One function per pane placed in the layout: docked, floating and popped
|
|
@@ -203,6 +206,16 @@ export function useAppStartupRuntime({
|
|
|
203
206
|
// identity, so this runs when initialization flips and not again.
|
|
204
207
|
}, [externalPlugins, isDetachedWindow, pluginRegistry, state.initialized]);
|
|
205
208
|
|
|
209
|
+
// Official plugins the launch could not install (no git, offline) are
|
|
210
|
+
// otherwise simply missing. One notice, taken once, says which and why.
|
|
211
|
+
useEffect(() => {
|
|
212
|
+
if (!state.initialized || isDetachedWindow) return;
|
|
213
|
+
const notice = takePluginSeedNotice();
|
|
214
|
+
if (!notice) return;
|
|
215
|
+
appLog.warn("official plugins not installed at launch", { notice: notice.body });
|
|
216
|
+
pluginRegistry.notify({ ...notice, duration: PLUGIN_SEED_NOTICE_MS });
|
|
217
|
+
}, [isDetachedWindow, pluginRegistry, state.initialized]);
|
|
218
|
+
|
|
206
219
|
// What people keep on screen: the functions open in the workspace restored
|
|
207
220
|
// at launch, counted once per session. The layout is taken as restored,
|
|
208
221
|
// before cloud sync can replace it; the first launch shows the default
|
|
@@ -49,7 +49,7 @@ function starPromptCopy(widgetRoom: number, openKey: string, dismissKey: string)
|
|
|
49
49
|
+ 1 + (dismissKey ? 1 + displayWidth(dismissKey) : 0)
|
|
50
50
|
// The chip padding after the line.
|
|
51
51
|
+ 1;
|
|
52
|
-
for (const lead of [t("Enjoying
|
|
52
|
+
for (const lead of [t("Enjoying Gloom? Star it on GitHub"), t("Star on GitHub")]) {
|
|
53
53
|
const columns = displayWidth(STAR + lead) + keys;
|
|
54
54
|
if (spare >= columns) return { lead, columns };
|
|
55
55
|
}
|
|
@@ -163,7 +163,7 @@ function StarPromptLine({ delayMs = STAR_PROMPT_DELAY_MS, visibleMs = STAR_PROMP
|
|
|
163
163
|
return (
|
|
164
164
|
<Box flexDirection="row" flexShrink={0} paddingRight={1} data-gloom-role="star-prompt">
|
|
165
165
|
<Button
|
|
166
|
-
label={t("Star
|
|
166
|
+
label={t("Star Gloom on GitHub")}
|
|
167
167
|
variant="plain"
|
|
168
168
|
compact
|
|
169
169
|
shortcut={openKey || undefined}
|
|
@@ -16,15 +16,18 @@
|
|
|
16
16
|
"src/cli/pane-functions/headless.ts": ["portfolio-list"],
|
|
17
17
|
"src/cli/pane-functions/options.ts": ["ticker-detail"],
|
|
18
18
|
"src/cli/pane-functions/resolver.ts": ["chart-composer"],
|
|
19
|
+
"src/cli/pane-functions/screenshot-bridge.ts": ["time-sales"],
|
|
20
|
+
"src/cli/pane-functions/screenshot-chart-evidence.ts": ["chart-composer"],
|
|
21
|
+
"src/cli/pane-functions/screenshot-data-evidence.ts": ["chart-composer","ticker-detail"],
|
|
19
22
|
"src/cli/pane-functions/screenshot-evidence.ts": ["attention","awards","catalysts","company-attention","company-kpis","credit-documents","exposure","market-heatmap","options-calculator","options-scenario","power","realized-vol","supply-chain","vol-surface","volatility","world-venue-map"],
|
|
20
|
-
"src/cli/pane-functions/screenshot.ts": ["chart-composer","econ-statistics","market-valuation","portfolio-list","ticker-detail","time-sales"],
|
|
23
|
+
"src/cli/pane-functions/screenshot-payload.ts": ["chart-composer","econ-statistics","market-valuation","portfolio-list","ticker-detail","time-sales"],
|
|
21
24
|
"src/components/command-bar/commands/direct/index.ts": ["broker-manager"],
|
|
22
25
|
"src/components/command-bar/routes/root/help-items.ts": ["help"],
|
|
23
26
|
"src/components/command-bar/workflow/ops.ts": ["correlation","portfolio-list","ticker-detail"],
|
|
24
27
|
"src/components/layout/shell/index.tsx": ["cloud"],
|
|
25
28
|
"src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
|
|
26
29
|
"src/layout/desks.ts": ["chart-composer"],
|
|
27
|
-
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
30
|
+
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","crypto-etf-flows","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
28
31
|
"src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
|
|
29
32
|
"src/plugins/catalog.ts": ["debug"],
|
|
30
33
|
"src/remote/controller.ts": ["custom-view"],
|
|
@@ -65,14 +65,14 @@
|
|
|
65
65
|
"radius": 5,
|
|
66
66
|
"spacing": 2
|
|
67
67
|
},
|
|
68
|
-
"why": "Chat has its own owner and conventions; reported, not changed
|
|
68
|
+
"why": "Chat has its own owner and conventions; reported, not changed."
|
|
69
69
|
},
|
|
70
70
|
"src/plugins/builtin/chat/content/handle-prompt.tsx": {
|
|
71
71
|
"literals": {
|
|
72
72
|
"font weight": 1,
|
|
73
73
|
"spacing": 2
|
|
74
74
|
},
|
|
75
|
-
"why": "Chat has its own owner and conventions; reported, not changed
|
|
75
|
+
"why": "Chat has its own owner and conventions; reported, not changed."
|
|
76
76
|
},
|
|
77
77
|
"src/plugins/builtin/chat/message/pane-chip.tsx": {
|
|
78
78
|
"literals": {
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"radius": 3,
|
|
81
81
|
"spacing": 2
|
|
82
82
|
},
|
|
83
|
-
"why": "Chat has its own owner and conventions; reported, not changed
|
|
83
|
+
"why": "Chat has its own owner and conventions; reported, not changed."
|
|
84
84
|
},
|
|
85
85
|
"src/plugins/builtin/credit-documents/gauge.tsx": {
|
|
86
86
|
"literals": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"measure": "inset",
|
|
27
27
|
"value": 7.2,
|
|
28
28
|
"component": "PaneSidebarRow",
|
|
29
|
-
"why": "Chat has its own owner: its channel rows start 7px in (reported, not changed
|
|
29
|
+
"why": "Chat has its own owner: its channel rows start 7px in (reported, not changed)."
|
|
30
30
|
}
|
|
31
31
|
],
|
|
32
32
|
"FXMD_REST_HEALTH": [
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BrokerAdapter } from "../types/broker";
|
|
2
2
|
import type { AppConfig, BrokerInstanceConfig } from "../types/config";
|
|
3
3
|
import type { Portfolio, TickerPosition, TickerRecord } from "../types/ticker";
|
|
4
|
+
import type { BrokerAccount } from "../types/trading";
|
|
4
5
|
import { buildBrokerPortfolioId, getBrokerInstance, isBrokerPortfolioId } from "../utils/broker-instances";
|
|
5
6
|
import { isSignedInBrokerProfile } from "./signed-in/profile";
|
|
6
7
|
|
|
@@ -55,6 +56,42 @@ export function isHeldByOtherSignedInProfile(
|
|
|
55
56
|
return !!owner && owner.id !== instance.id && isSignedInBrokerProfile(owner);
|
|
56
57
|
}
|
|
57
58
|
|
|
59
|
+
/**
|
|
60
|
+
* The accounts `instance` reports that another enabled profile already holds
|
|
61
|
+
* under the account's own number, such as IBKR U1234567 synced on this device
|
|
62
|
+
* and linked through SnapTrade as well. That profile keeps the account, so its
|
|
63
|
+
* portfolio and positions appear once.
|
|
64
|
+
*/
|
|
65
|
+
export function accountsHeldUnderOwnNumber(
|
|
66
|
+
config: AppConfig,
|
|
67
|
+
instance: BrokerInstanceConfig,
|
|
68
|
+
accounts: readonly BrokerAccount[],
|
|
69
|
+
): Set<string> {
|
|
70
|
+
const held = new Set(config.portfolios.flatMap((portfolio) => {
|
|
71
|
+
if (!portfolio.brokerAccountId || portfolio.brokerInstanceId === instance.id) return [];
|
|
72
|
+
const owner = getBrokerInstance(config.brokerInstances, portfolio.brokerInstanceId);
|
|
73
|
+
return owner && owner.enabled !== false ? [portfolio.brokerAccountId.trim().toUpperCase()] : [];
|
|
74
|
+
}));
|
|
75
|
+
return new Set(accounts.flatMap((account) => {
|
|
76
|
+
const number = account.brokerageAccountId?.trim().toUpperCase();
|
|
77
|
+
return number && held.has(number) ? [account.accountId] : [];
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The accounts of `instance` to list: without those another enabled profile
|
|
83
|
+
* holds under their own number (`accountsHeldUnderOwnNumber`), so an account
|
|
84
|
+
* linked twice appears once wherever accounts are chosen or shown.
|
|
85
|
+
*/
|
|
86
|
+
export function accountsShownFor(
|
|
87
|
+
config: AppConfig,
|
|
88
|
+
instance: BrokerInstanceConfig,
|
|
89
|
+
accounts: BrokerAccount[],
|
|
90
|
+
): BrokerAccount[] {
|
|
91
|
+
const held = accountsHeldUnderOwnNumber(config, instance, accounts);
|
|
92
|
+
return held.size ? accounts.filter((account) => !held.has(account.accountId)) : accounts;
|
|
93
|
+
}
|
|
94
|
+
|
|
58
95
|
/**
|
|
59
96
|
* Who keeps a portfolio when the profile holding it is removed: another
|
|
60
97
|
* enabled profile of the same broker that syncs the same account. Only a
|
package/src/brokers/directory.ts
CHANGED
|
@@ -57,6 +57,17 @@ export function brokerMethodSummary(entry: BrokerDirectoryEntry): string {
|
|
|
57
57
|
return signsIn ? t("Sign in") : t("On this device");
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/**
|
|
61
|
+
* The method summary with what the broker says of itself, for a list that
|
|
62
|
+
* gives each broker a line under its name: "Sign in · Brokerages you link in
|
|
63
|
+
* SnapTrade" for one that is not itself a broker.
|
|
64
|
+
*/
|
|
65
|
+
export function brokerDirectorySummary(entry: BrokerDirectoryEntry): string {
|
|
66
|
+
const described = entry.methods.find((method) => method.kind === "signed-in")?.broker.description?.trim();
|
|
67
|
+
const summary = brokerMethodSummary(entry);
|
|
68
|
+
return described ? `${summary} · ${described}` : summary;
|
|
69
|
+
}
|
|
70
|
+
|
|
60
71
|
export function brokerMethodLabel(entry: BrokerDirectoryEntry, method: BrokerMethod): string {
|
|
61
72
|
if (method.kind === "signed-in") {
|
|
62
73
|
return entry.methods.some((candidate) => candidate.kind === "device") ? t("Sign in (recommended)") : t("Sign in");
|
package/src/brokers/logos.ts
CHANGED
|
@@ -15,11 +15,13 @@ function svg(markup: string): string {
|
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* The marks the official plugins ship as their icon, for the same brokers
|
|
18
|
-
* when Gloom connects them, keyed by the backend's broker id.
|
|
18
|
+
* when Gloom connects them, keyed by the backend's broker id. SnapTrade has
|
|
19
|
+
* no plugin: its mark is from its own site, on white.
|
|
19
20
|
*/
|
|
20
21
|
const SIGNED_IN_BROKER_LOGOS: Readonly<Record<string, string>> = {
|
|
21
22
|
ibkr: svg('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><linearGradient id="t" x1="0" y1="0" x2="0" y2="64" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#262626"/><stop offset="1" stop-color="#0F0F0F"/></linearGradient><linearGradient id="m" gradientUnits="userSpaceOnUse" x1="3633.335" y1="66.0445" x2="3671.0737" y2="66.0445" gradientTransform="matrix(-1 0 0 1 3673.7529 0)"><stop offset="0" stop-color="#D71F27"/><stop offset="1" stop-color="#971B1E"/></linearGradient></defs><rect width="64" height="64" fill="url(#t)"/><g transform="translate(20.4 8.2) scale(0.539)"><polygon points="40.4,86.8 2.7,86.8 2.7,45.3" fill="url(#m)"/><polygon points="40.4,1.5 2.7,45.3 2.7,86.8" fill="#D71F27"/><circle cx="35.2" cy="55.5" r="11.3" fill="#D71F27"/></g></svg>'),
|
|
22
23
|
robinhood: svg('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect width="64" height="64" fill="#CCFF00"/><path transform="translate(14 14) scale(1.5)" d="M2.84 24h.53c.096 0 .192-.048.224-.128C7.591 13.696 11.94 8.656 14.67 5.638c.112-.128.064-.225-.096-.225h-4.88a.55.55 0 0 0-.45.225L5.746 9.972c-.514.642-.642 1.236-.642 2.086v4.43c-1.14 3.194-1.862 5.361-2.392 7.32-.032.125.016.192.129.192M20.447.646c-.754-.802-4.157-.834-5.73-.224a3 3 0 0 0-.786.465 41 41 0 0 0-3.323 3.178c-.112.113-.064.225.097.225h5.409c.497 0 .786.289.786.786v6.1c0 .16.128.208.225.064l3.258-4.254c.53-.69.69-.898.835-1.861.192-1.413.08-3.58-.77-4.479m-6.982 16.18 2.231-3.676a.7.7 0 0 0 .064-.29V6.73c0-.16-.112-.225-.224-.097-3.355 3.74-5.971 7.672-8.395 12.407-.06.12.016.225.16.177l5.009-1.54c.565-.174.882-.402 1.155-.852" fill="#1A1A1A"/></svg>'),
|
|
24
|
+
snaptrade: svg('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><linearGradient id="a" x1="14" y1="-33.2" x2="39.35" y2="10.81" gradientUnits="userSpaceOnUse"><stop stop-color="#045856"/><stop offset="1" stop-color="#52C4C2"/></linearGradient><linearGradient id="b" x1="14.33" y1="34.34" x2="-24.58" y2="-4.39" gradientUnits="userSpaceOnUse"><stop stop-color="#E6960D"/><stop offset=".27" stop-color="#F2CA86"/></linearGradient><linearGradient id="c" x1="1.95" y1="33.87" x2="-32.55" y2="-6.92" gradientUnits="userSpaceOnUse"><stop stop-color="#E6960D"/><stop offset=".27" stop-color="#F2CA86"/></linearGradient></defs><rect width="64" height="64" fill="#FFFFFF"/><g transform="translate(12.4 10.45) scale(1.4)"><path d="M27.47 11.24 27.11 10.62 22.55 2.73C21.96 1.72 20.88 1.09 19.7 1.09H11.12C9.95 1.09 8.86 1.72 8.28 2.73L3.71 10.62 8.28 18.51C8.86 19.53 9.95 20.15 11.12 20.15H15.42L9.9 10.62 15.41 1.1 20.92 10.62 25.32 18.23 27.46 14.52C28.05 13.5 28.05 12.25 27.46 11.24Z" fill="url(#a)"/><path d="M24.21 20.15 19.64 12.26C19.06 11.25 17.97 10.62 16.8 10.62H12.5L18.01 20.15 12.5 29.69H16.8C17.97 29.69 19.06 29.06 19.64 28.05Z" fill="url(#b)"/><path d="M6.99 20.15 2.59 12.54.44 16.26C-.15 17.27-.15 18.52.44 19.54L.8 20.15 5.36 28.05C5.95 29.06 7.03 29.69 8.21 29.69H12.5L6.99 20.15Z" fill="url(#c)"/></g></svg>'),
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
/** The plugin icon of a broker adapter (`getBrokerLogo` on the plugin runtime). */
|