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
|
@@ -28,8 +28,17 @@ export interface LogoMarkProps {
|
|
|
28
28
|
/** What the logo stands for, such as a broker. Only its initial is drawn; the label beside it names it. */
|
|
29
29
|
name: string;
|
|
30
30
|
size?: LogoMarkSize;
|
|
31
|
+
/**
|
|
32
|
+
* Draws the logo on a white plate. Company and coin logos are made for a
|
|
33
|
+
* light page: a black mark on a clear field (XRP's) would vanish on a dark
|
|
34
|
+
* theme, while a logo that fills its square covers the plate.
|
|
35
|
+
*/
|
|
36
|
+
plate?: boolean;
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
/** The page logos are drawn for, in every theme. */
|
|
40
|
+
const LOGO_PLATE = "#ffffff";
|
|
41
|
+
|
|
33
42
|
function initialOf(name: string): string {
|
|
34
43
|
const letter = [...name.trim()].find((character) => /[\p{L}\p{N}]/u.test(character));
|
|
35
44
|
return letter ? letter.toLocaleUpperCase() : "?";
|
|
@@ -40,7 +49,7 @@ function initialOf(name: string): string {
|
|
|
40
49
|
* the desktop and the web. Decoration: hidden from assistive technology, so
|
|
41
50
|
* the label beside it stays the name. The terminal draws nothing.
|
|
42
51
|
*/
|
|
43
|
-
export function LogoMark({ src, name, size = "row" }: LogoMarkProps) {
|
|
52
|
+
export function LogoMark({ src, name, size = "row", plate = false }: LogoMarkProps) {
|
|
44
53
|
const desktop = useUiCapabilities().nativePaneChrome === true;
|
|
45
54
|
const colors = useThemeColors();
|
|
46
55
|
if (!desktop) return null;
|
|
@@ -52,7 +61,7 @@ export function LogoMark({ src, name, size = "row" }: LogoMarkProps) {
|
|
|
52
61
|
objectFit="cover"
|
|
53
62
|
aria-hidden="true"
|
|
54
63
|
data-gloom-role="logo-mark"
|
|
55
|
-
style={{ width: tile.side, height: tile.side, flexShrink: 0, borderRadius: tile.radius }}
|
|
64
|
+
style={{ width: tile.side, height: tile.side, flexShrink: 0, borderRadius: tile.radius, ...(plate ? { background: LOGO_PLATE } : {}) }}
|
|
56
65
|
>
|
|
57
66
|
<Box width="100%" height="100%" alignItems="center" justifyContent="center" backgroundColor={colors.border}>
|
|
58
67
|
<Text fg={colors.textBright} attributes={TextAttributes.BOLD} style={LETTER_STYLE[size]}>
|
|
@@ -144,7 +144,7 @@ export interface QueryBarProps {
|
|
|
144
144
|
leading?: ReactNode;
|
|
145
145
|
/**
|
|
146
146
|
* The date the data is as of (`as of 2026-10-09`), shown where `meta` is
|
|
147
|
-
* when there is none. A `
|
|
147
|
+
* when there is none. A `gloom shot` whose status line dates the data
|
|
148
148
|
* leaves it out, so the date is said once.
|
|
149
149
|
*/
|
|
150
150
|
asOf?: string;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What the last action on one row of a list came to, kept for that row
|
|
5
|
+
* (docs/pane-conventions.md, "Row messages"): the row's status cell shows
|
|
6
|
+
* its short state, its detail the full reason. The footer and toasts stay
|
|
7
|
+
* out of it.
|
|
8
|
+
*
|
|
9
|
+
* A note stands until the caller replaces or clears it (the next action on
|
|
10
|
+
* the row), or, given `signature`, until the row's own status moves past what
|
|
11
|
+
* it was when the note first showed: a later state is newer news than the
|
|
12
|
+
* note. A note on a row that is not listed waits for it; whether a note
|
|
13
|
+
* belongs in a toast instead (its row has left the list) is the caller's call.
|
|
14
|
+
*/
|
|
15
|
+
export interface RowNotes<Row, Note> {
|
|
16
|
+
/** The row's note while it stands, else null. */
|
|
17
|
+
noteFor(row: Row): Note | null;
|
|
18
|
+
/** Sets or clears one row's note, by the row's key. */
|
|
19
|
+
setNote(key: string, note: Note | null): void;
|
|
20
|
+
/** Clears every note: the list now shows other rows (another account, a reload). */
|
|
21
|
+
clearNotes(): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface Kept<Note> {
|
|
25
|
+
note: Note;
|
|
26
|
+
/** The row's signature when the note first showed it. */
|
|
27
|
+
baseline?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const NO_NOTES: ReadonlyMap<string, never> = new Map<string, never>();
|
|
31
|
+
|
|
32
|
+
export function useRowNotes<Row, Note>(rows: readonly Row[], options: {
|
|
33
|
+
key: (row: Row) => string;
|
|
34
|
+
/**
|
|
35
|
+
* The parts of a row a real change moves (its state, its message), never a
|
|
36
|
+
* timestamp a poll restamps on every read. Without it a note stands until
|
|
37
|
+
* it is replaced or cleared.
|
|
38
|
+
*/
|
|
39
|
+
signature?: (row: Row) => string;
|
|
40
|
+
}): RowNotes<Row, Note> {
|
|
41
|
+
const { key, signature } = options;
|
|
42
|
+
const [notes, setNotes] = useState<ReadonlyMap<string, Kept<Note>>>(NO_NOTES);
|
|
43
|
+
|
|
44
|
+
const setNote = useCallback((rowKey: string, note: Note | null) => {
|
|
45
|
+
setNotes((current) => {
|
|
46
|
+
if (!note && !current.has(rowKey)) return current;
|
|
47
|
+
const next = new Map(current);
|
|
48
|
+
if (note) next.set(rowKey, { note });
|
|
49
|
+
else next.delete(rowKey);
|
|
50
|
+
return next;
|
|
51
|
+
});
|
|
52
|
+
}, []);
|
|
53
|
+
const clearNotes = useCallback(() => setNotes((current) => (current.size ? NO_NOTES : current)), []);
|
|
54
|
+
|
|
55
|
+
// A note takes its row as the list shows it once the note is up, and goes
|
|
56
|
+
// when that row moves on.
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (!signature || notes.size === 0) return;
|
|
59
|
+
setNotes((current) => {
|
|
60
|
+
let next: Map<string, Kept<Note>> | null = null;
|
|
61
|
+
for (const [rowKey, kept] of current) {
|
|
62
|
+
const row = rows.find((entry) => key(entry) === rowKey);
|
|
63
|
+
if (!row) continue;
|
|
64
|
+
const now = signature(row);
|
|
65
|
+
if (kept.baseline === undefined) (next ??= new Map(current)).set(rowKey, { ...kept, baseline: now });
|
|
66
|
+
else if (kept.baseline !== now) (next ??= new Map(current)).delete(rowKey);
|
|
67
|
+
}
|
|
68
|
+
return next ?? current;
|
|
69
|
+
});
|
|
70
|
+
}, [key, notes, rows, signature]);
|
|
71
|
+
|
|
72
|
+
const noteFor = useCallback((row: Row): Note | null => {
|
|
73
|
+
const kept = notes.get(key(row));
|
|
74
|
+
if (!kept) return null;
|
|
75
|
+
return !signature || kept.baseline === undefined || kept.baseline === signature(row) ? kept.note : null;
|
|
76
|
+
}, [key, notes, signature]);
|
|
77
|
+
|
|
78
|
+
return { noteFor, setNote, clearNotes };
|
|
79
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDockLeafLayouts, getDockedPaneIds } from "../../../layout/pane-manager";
|
|
1
|
+
import { compactFloatingZ, getDockLeafLayouts, getDockedPaneIds } from "../../../layout/pane-manager";
|
|
2
2
|
import { pinFollowingPane } from "../../../layout/pane-follow";
|
|
3
3
|
import {
|
|
4
4
|
cloneLayout,
|
|
@@ -509,7 +509,7 @@ export function moveHistoryIndex(
|
|
|
509
509
|
return next;
|
|
510
510
|
}
|
|
511
511
|
|
|
512
|
-
/** If paneId is a floating pane, bump its zIndex to the top. */
|
|
512
|
+
/** If paneId is a floating pane, bump its zIndex to the top, renumbering a stack that would climb past the shell's overlays. */
|
|
513
513
|
export function bringFloatingToFront(layout: LayoutConfig, paneId: string): LayoutConfig {
|
|
514
514
|
const entryIndex = layout.floating.findIndex((e) => e.instanceId === paneId);
|
|
515
515
|
const entry = entryIndex >= 0 ? layout.floating[entryIndex] : undefined;
|
|
@@ -519,9 +519,9 @@ export function bringFloatingToFront(layout: LayoutConfig, paneId: string): Layo
|
|
|
519
519
|
if ((entry.zIndex ?? 50) === maxZ && entryIndex === topEqualIndex) return layout; // already on top
|
|
520
520
|
return {
|
|
521
521
|
...layout,
|
|
522
|
-
floating: layout.floating.map((e) =>
|
|
522
|
+
floating: compactFloatingZ(layout.floating.map((e) =>
|
|
523
523
|
e.instanceId === paneId ? { ...e, zIndex: maxZ + 1 } : e,
|
|
524
|
-
),
|
|
524
|
+
)),
|
|
525
525
|
};
|
|
526
526
|
}
|
|
527
527
|
|
package/src/data/cached-query.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { QuoteIntradayBar } from "../types/financials";
|
|
1
2
|
import { nextResponseSequence } from "./response-sequence";
|
|
3
|
+
import { servedFromSavedCopy } from "./saved-copies";
|
|
2
4
|
|
|
3
5
|
/** A value's age belongs to its source, not to the consumer that last read it. */
|
|
4
6
|
export interface CachedValue<T> {
|
|
@@ -13,6 +15,10 @@ export interface CachedValue<T> {
|
|
|
13
15
|
asOf?: number;
|
|
14
16
|
/** How far a delayed source runs behind the market, in minutes; 0 for a real-time one. */
|
|
15
17
|
delayMinutes?: number;
|
|
18
|
+
/** Exchange rates: the pair's bar the rate is the close of, when it is not a print. */
|
|
19
|
+
intradayBar?: QuoteIntradayBar;
|
|
20
|
+
/** Exchange rates: why a stale rate stands, as the data service states it. */
|
|
21
|
+
staleReason?: string;
|
|
16
22
|
refreshError?: unknown;
|
|
17
23
|
}
|
|
18
24
|
|
|
@@ -95,7 +101,8 @@ export class CachedQuery<T> implements CachedQueryHandle<T> {
|
|
|
95
101
|
return accepted;
|
|
96
102
|
}, (error: unknown) => {
|
|
97
103
|
const fallback = this.usable(cached) ?? this.usable(this.options.read(true));
|
|
98
|
-
|
|
104
|
+
// A command that shows it says it is the saved copy (`servedFromSavedCopy`).
|
|
105
|
+
const retained = fallback ? { ...fallback, value: servedFromSavedCopy(fallback.value, fallback.fetchedAt), refreshError: error } : null;
|
|
99
106
|
if (generation === this.generation) this.publish({ result: retained, loading: false, error });
|
|
100
107
|
if (retained) return retained;
|
|
101
108
|
throw error;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logFailure } from "../../utils/log-failure";
|
|
2
|
-
import {
|
|
2
|
+
import { TIME_RANGES, type ChartResolution, type TimeRange } from "../../time-series/range";
|
|
3
|
+
import { isChartResolution } from "../../time-series/resolution";
|
|
3
4
|
import type { LayoutConfig, PaneBinding } from "../../types/config";
|
|
4
5
|
import type {
|
|
5
6
|
ChartPanelSpec,
|
|
@@ -19,7 +20,6 @@ import {
|
|
|
19
20
|
import { recordOrNull } from "../../utils/guards";
|
|
20
21
|
|
|
21
22
|
const CHART_RANGES = new Set<TimeRange>(TIME_RANGES);
|
|
22
|
-
const CHART_RESOLUTION_SET = new Set<ChartResolution>(CHART_RESOLUTIONS);
|
|
23
23
|
const PRICE_RENDER_MODES = new Set<SeriesStyle>(["area", "line", "candles", "ohlc", "hlc"]);
|
|
24
24
|
const LEGACY_INDICATOR_IDS = new Set<LegacyChartIndicatorId>([
|
|
25
25
|
"volume",
|
|
@@ -90,7 +90,7 @@ function range(value: unknown, fallback: TimeRange): TimeRange {
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
function resolution(value: unknown, fallback: ChartResolution): ChartResolution {
|
|
93
|
-
return
|
|
93
|
+
return isChartResolution(value) ? value : fallback;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
function makeSpec(
|
package/src/data/config/home.ts
CHANGED
|
@@ -16,7 +16,7 @@ import { isAbsolute, join } from "path";
|
|
|
16
16
|
* On Linux a new install follows the XDG Base Directory spec instead (#1267):
|
|
17
17
|
* config.json in `$XDG_CONFIG_HOME/gloomberb`, the data directory, plugins
|
|
18
18
|
* and the terminal media pid file in `$XDG_DATA_HOME/gloomberb`, the plugin
|
|
19
|
-
*
|
|
19
|
+
* and native caches in `$XDG_CACHE_HOME/gloomberb`. An existing `~/.gloomberb` keeps
|
|
20
20
|
* winning, so no install moves. Once an XDG config.json exists it wins over
|
|
21
21
|
* a `~/.gloomberb` created later (an older version, a stray `mkdir`), so the
|
|
22
22
|
* choice cannot flip and leave the data behind.
|
|
@@ -41,6 +41,11 @@ export interface GloomberbDirs {
|
|
|
41
41
|
plugins: string;
|
|
42
42
|
/** Host-owned scratch space for plugins: bundles, update state. */
|
|
43
43
|
pluginCache: string;
|
|
44
|
+
/**
|
|
45
|
+
* The standalone binary's render library, copied out of the binary when the
|
|
46
|
+
* temp folder cannot hold or run it (see renderers/opentui/render-lib).
|
|
47
|
+
*/
|
|
48
|
+
nativeCache: string;
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
function getUserHome(env: NodeJS.ProcessEnv): string {
|
|
@@ -74,6 +79,7 @@ function singleFolder(kind: "override" | "home", home: string): GloomberbDirs {
|
|
|
74
79
|
data: home,
|
|
75
80
|
plugins: join(home, "plugins"),
|
|
76
81
|
pluginCache: join(home, "plugin-cache"),
|
|
82
|
+
nativeCache: join(home, "native-cache"),
|
|
77
83
|
};
|
|
78
84
|
}
|
|
79
85
|
|
|
@@ -85,12 +91,14 @@ function xdgBase(env: NodeJS.ProcessEnv, variable: string, fallback: string): st
|
|
|
85
91
|
|
|
86
92
|
function xdgFolders(env: NodeJS.ProcessEnv): GloomberbDirs {
|
|
87
93
|
const data = join(xdgBase(env, "XDG_DATA_HOME", join(".local", "share")), XDG_FOLDER);
|
|
94
|
+
const cache = join(xdgBase(env, "XDG_CACHE_HOME", ".cache"), XDG_FOLDER);
|
|
88
95
|
return {
|
|
89
96
|
kind: "xdg",
|
|
90
97
|
configFile: join(xdgBase(env, "XDG_CONFIG_HOME", ".config"), XDG_FOLDER, "config.json"),
|
|
91
98
|
data,
|
|
92
99
|
plugins: join(data, "plugins"),
|
|
93
|
-
pluginCache: join(
|
|
100
|
+
pluginCache: join(cache, "plugin-cache"),
|
|
101
|
+
nativeCache: join(cache, "native-cache"),
|
|
94
102
|
};
|
|
95
103
|
}
|
|
96
104
|
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
normalizePaneId,
|
|
20
20
|
removeUnreachablePaneInstances,
|
|
21
21
|
} from "../../types/config";
|
|
22
|
+
import { compactFloatingZ } from "../../layout/pane-manager/floating";
|
|
22
23
|
import {
|
|
23
24
|
migrateChartPaneSettings,
|
|
24
25
|
type LegacyChartMigrationContext,
|
|
@@ -237,7 +238,7 @@ function getDefaultFollowSourceInstanceId(layout: LayoutConfig): string | null {
|
|
|
237
238
|
|
|
238
239
|
function sanitizeFloatingEntries(value: unknown, validInstanceIds: Set<string>): LayoutConfig["floating"] {
|
|
239
240
|
if (!Array.isArray(value)) return [];
|
|
240
|
-
|
|
241
|
+
const entries = value
|
|
241
242
|
.filter((entry): entry is LayoutConfig["floating"][number] =>
|
|
242
243
|
!!entry
|
|
243
244
|
&& typeof entry === "object"
|
|
@@ -256,6 +257,8 @@ function sanitizeFloatingEntries(value: unknown, validInstanceIds: Set<string>):
|
|
|
256
257
|
height: Math.max(1, Math.round(entry.height)),
|
|
257
258
|
zIndex: typeof entry.zIndex === "number" ? Math.round(entry.zIndex) : entry.zIndex,
|
|
258
259
|
}));
|
|
260
|
+
// A stack raised past the shell's menus and previews in an older session is renumbered in the same order.
|
|
261
|
+
return compactFloatingZ(entries);
|
|
259
262
|
}
|
|
260
263
|
|
|
261
264
|
function sanitizeDetachedEntries(value: unknown, validInstanceIds: Set<string>): LayoutConfig["detached"] {
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
} from "./normalize";
|
|
16
16
|
|
|
17
17
|
const configLog = debugLog.createLogger("config");
|
|
18
|
+
const IN_MEMORY_DATA_DIR = ":memory:";
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* The config.json for a data directory: the file inside it, except that the
|
|
@@ -130,6 +131,9 @@ async function writeConfigFile(configPath: string, contents: string): Promise<vo
|
|
|
130
131
|
* and the next one still runs.
|
|
131
132
|
*/
|
|
132
133
|
export async function saveConfig(config: AppConfig): Promise<void> {
|
|
134
|
+
// `:memory:` is the data directory of a config kept in memory (tests, as for
|
|
135
|
+
// SQLite): there is no file, and writing one would land under the working directory.
|
|
136
|
+
if (config.dataDir === IN_MEMORY_DATA_DIR) return;
|
|
133
137
|
const configPath = configFileFor(config.dataDir);
|
|
134
138
|
// Written as it was when called, however the caller's object changes while
|
|
135
139
|
// earlier saves are still running.
|
|
@@ -44,7 +44,7 @@ function sanitizeTheme(value: unknown, fallback: string): string {
|
|
|
44
44
|
if (typeof value !== "string") return fallback;
|
|
45
45
|
if (!themes[value] && !reportedUnknownThemes.has(value)) {
|
|
46
46
|
reportedUnknownThemes.add(value);
|
|
47
|
-
configLog.warn(`Unknown theme "${value}" in config; showing ${DEFAULT_THEME}.
|
|
47
|
+
configLog.warn(`Unknown theme "${value}" in config; showing ${DEFAULT_THEME}. gloom config themes lists the ids.`);
|
|
48
48
|
}
|
|
49
49
|
return value;
|
|
50
50
|
}
|
|
@@ -93,6 +93,7 @@ export function normalizeLoadedConfig(
|
|
|
93
93
|
brokerInstances: sanitizeBrokerInstances(candidate.brokerInstances),
|
|
94
94
|
disabledPlugins,
|
|
95
95
|
seededPlugins: sanitizeUniqueStringList(candidate.seededPlugins),
|
|
96
|
+
...sanitizePluginSeedFailure(candidate.pluginSeedFailure),
|
|
96
97
|
...(candidate.portfolioCurrenciesAdopted === true ? { portfolioCurrenciesAdopted: true } : {}),
|
|
97
98
|
...(candidate.presentationMode === true ? { presentationMode: true } : {}),
|
|
98
99
|
...(typeof candidate.timezone === "string" && candidate.timezone.trim() ? { timezone: candidate.timezone.trim() } : {}),
|
|
@@ -160,6 +161,7 @@ export function normalizeConfigForSave(config: AppConfig): AppConfig {
|
|
|
160
161
|
// Older apps read the retired group ids, so a group that is all off is saved as one.
|
|
161
162
|
disabledPlugins: encodeBuiltinDisabledPluginIds(sanitizeUniqueStringList(config.disabledPlugins)),
|
|
162
163
|
seededPlugins: sanitizeUniqueStringList(config.seededPlugins),
|
|
164
|
+
...sanitizePluginSeedFailure(config.pluginSeedFailure),
|
|
163
165
|
disabledSources: sanitizeUniqueStringList(config.disabledSources),
|
|
164
166
|
pluginConfig: sanitizePluginConfig(config.pluginConfig),
|
|
165
167
|
chartPreferences: sanitizeChartPreferences(config.chartPreferences, defaults.chartPreferences),
|
|
@@ -317,6 +319,13 @@ function sanitizeUniqueStringList(value: unknown): string[] {
|
|
|
317
319
|
return [...new Set(sanitizeStringArray(value, []))];
|
|
318
320
|
}
|
|
319
321
|
|
|
322
|
+
/** The last failed plugin seed as saved, or nothing when it is absent or unreadable. */
|
|
323
|
+
function sanitizePluginSeedFailure(value: unknown): Pick<AppConfig, "pluginSeedFailure"> {
|
|
324
|
+
if (!isRecord(value)) return {};
|
|
325
|
+
const plugins = sanitizeUniqueStringList(value.plugins).sort();
|
|
326
|
+
return plugins.length > 0 ? { pluginSeedFailure: { plugins, gitMissing: value.gitMissing === true } } : {};
|
|
327
|
+
}
|
|
328
|
+
|
|
320
329
|
function isPluginConfigMap(value: unknown): value is Record<string, Record<string, unknown>> {
|
|
321
330
|
if (!isRecord(value)) return false;
|
|
322
331
|
return Object.values(value).every((entry) => isRecord(entry));
|
|
@@ -363,10 +372,11 @@ function sanitizePortfolios(value: unknown, fallback: Portfolio[]): Portfolio[]
|
|
|
363
372
|
.map(sanitizePortfolioAllocation);
|
|
364
373
|
}
|
|
365
374
|
|
|
366
|
-
/** Cash, target weights
|
|
375
|
+
/** Cash, target weights, the import source and a fixed currency the portfolio commands write; a malformed one is dropped. */
|
|
367
376
|
function sanitizePortfolioAllocation(entry: Portfolio): Portfolio {
|
|
368
|
-
const { cash, targetWeights, importedFrom, ...portfolio } = entry;
|
|
377
|
+
const { cash, targetWeights, importedFrom, fixedCurrency, ...portfolio } = entry;
|
|
369
378
|
const next: Portfolio = { ...portfolio };
|
|
379
|
+
if (fixedCurrency === true) next.fixedCurrency = true;
|
|
370
380
|
if (isRecord(importedFrom) && importedFrom.kind === "13f"
|
|
371
381
|
&& [importedFrom.cik, importedFrom.name, importedFrom.period, importedFrom.filed].every((value) => typeof value === "string" && value)) {
|
|
372
382
|
next.importedFrom = { kind: "13f", cik: importedFrom.cik, name: importedFrom.name, period: importedFrom.period, filed: importedFrom.filed };
|
|
@@ -3,8 +3,8 @@ import { isRecord } from "../../../utils/guards";
|
|
|
3
3
|
const PORTFOLIO_PANE_ID = "portfolio-list";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* The portfolio pane's default columns before AS OF UTC took AGE's place
|
|
7
|
-
*
|
|
6
|
+
* The portfolio pane's default columns before AS OF UTC took AGE's place.
|
|
7
|
+
* Frozen here: the current default may change again, and only a
|
|
8
8
|
* list still equal to this one was never chosen by the user.
|
|
9
9
|
*/
|
|
10
10
|
const PREVIOUS_DEFAULT_COLUMN_IDS: readonly string[] = [
|
package/src/data/json-storage.ts
CHANGED
|
@@ -52,4 +52,6 @@ export const BROWSER_STORAGE_KEYS = {
|
|
|
52
52
|
session: "gloomberb.web.session.v1",
|
|
53
53
|
/** Broker account snapshots; other caches stay in memory. */
|
|
54
54
|
resources: "gloomberb.web.resources.v1",
|
|
55
|
+
/** The layout the page draws before its script loads (renderers/dom/boot-frame.ts). */
|
|
56
|
+
bootFrame: "gloomberb.web.boot-frame.v1",
|
|
55
57
|
} as const;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answers a CLI command gave from a copy saved earlier because refreshing it
|
|
3
|
+
* failed: offline, a refused proxy, a service error. A command answers once,
|
|
4
|
+
* so the line it ends with says "couldn't refresh; saved <time>" instead of
|
|
5
|
+
* reading as live or delayed, but only when what it shows came from such a
|
|
6
|
+
* copy: a saved copy of something else it loaded on the way (a fallback for a
|
|
7
|
+
* pane it does not print) says nothing about the data on screen.
|
|
8
|
+
*
|
|
9
|
+
* The copy served is marked, by a symbol property that object spreads carry
|
|
10
|
+
* along and JSON never writes, and the command's output is searched for the
|
|
11
|
+
* marks. Nothing is marked outside `collectSavedCopies`: the app and its panes
|
|
12
|
+
* keep running for hours and say how current their data is in their own
|
|
13
|
+
* footers.
|
|
14
|
+
*/
|
|
15
|
+
const SAVED_AT = Symbol("gloomberb.savedCopyAt");
|
|
16
|
+
|
|
17
|
+
let collecting = 0;
|
|
18
|
+
let marked = 0;
|
|
19
|
+
|
|
20
|
+
type Marked = { [SAVED_AT]?: number };
|
|
21
|
+
|
|
22
|
+
function mark<T>(value: T, savedAt: number): T {
|
|
23
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return value;
|
|
24
|
+
marked += 1;
|
|
25
|
+
return { ...value, [SAVED_AT]: savedAt };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The value a command answers with when it came from a copy saved at
|
|
30
|
+
* `savedAt` (ms) after its refresh failed: a marked copy while a command runs,
|
|
31
|
+
* the value itself otherwise. An array's items are marked one by one, since
|
|
32
|
+
* a report shows its rows rather than the array that held them.
|
|
33
|
+
*/
|
|
34
|
+
export function servedFromSavedCopy<T>(value: T, savedAt: number): T {
|
|
35
|
+
if (collecting === 0 || !Number.isFinite(savedAt) || !value || typeof value !== "object") return value;
|
|
36
|
+
return (Array.isArray(value) ? value.map((item) => mark(item, savedAt)) : mark(value, savedAt)) as T;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The saved-copy mark of `value`, to spread into what is drawn from it (a
|
|
41
|
+
* report row built from a quote's fields), or nothing when it has none.
|
|
42
|
+
*/
|
|
43
|
+
export function savedCopyMark(value: unknown): object {
|
|
44
|
+
const savedAt = value && typeof value === "object" ? (value as Marked)[SAVED_AT] : undefined;
|
|
45
|
+
return typeof savedAt === "number" ? { [SAVED_AT]: savedAt } : {};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** How far into a command's output the marks are looked for, so a large report is not walked whole. */
|
|
49
|
+
const MAX_DEPTH = 6;
|
|
50
|
+
const MAX_NODES = 50_000;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* When the oldest saved copy among `shown` (what a command prints, or the
|
|
54
|
+
* data its closing line is drawn from) was saved, or null when none of it
|
|
55
|
+
* came from one. The oldest, since that is how old what is shown can be.
|
|
56
|
+
*/
|
|
57
|
+
export function savedCopyShownAt(shown: unknown): number | null {
|
|
58
|
+
if (collecting === 0 || marked === 0) return null;
|
|
59
|
+
let oldest: number | null = null;
|
|
60
|
+
let budget = MAX_NODES;
|
|
61
|
+
const seen = new Set<object>();
|
|
62
|
+
const visit = (node: unknown, depth: number) => {
|
|
63
|
+
if (!node || typeof node !== "object" || seen.has(node) || budget-- <= 0) return;
|
|
64
|
+
seen.add(node);
|
|
65
|
+
const savedAt = (node as Marked)[SAVED_AT];
|
|
66
|
+
if (typeof savedAt === "number") oldest = oldest == null ? savedAt : Math.min(oldest, savedAt);
|
|
67
|
+
if (depth >= MAX_DEPTH) return;
|
|
68
|
+
for (const child of Array.isArray(node) ? node : Object.values(node)) visit(child, depth + 1);
|
|
69
|
+
};
|
|
70
|
+
visit(shown, 0);
|
|
71
|
+
return oldest;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Runs one command, marking the saved copies it answers from. */
|
|
75
|
+
export async function collectSavedCopies<T>(run: () => Promise<T>): Promise<T> {
|
|
76
|
+
if (collecting === 0) marked = 0;
|
|
77
|
+
collecting += 1;
|
|
78
|
+
try {
|
|
79
|
+
return await run();
|
|
80
|
+
} finally {
|
|
81
|
+
collecting -= 1;
|
|
82
|
+
if (collecting === 0) marked = 0;
|
|
83
|
+
}
|
|
84
|
+
}
|