gloomberb 0.16.4 → 0.16.6
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 +14 -91
- package/package.json +5 -1
- package/src/{plugins/builtin/cloud → account}/auth-form.tsx +9 -9
- package/src/{plugins/builtin/cloud → account}/auth-model.ts +4 -4
- package/src/account/billing.ts +57 -0
- package/src/{plugins/builtin/cloud → account}/device-signin-dialog.tsx +18 -12
- package/src/{plugins/builtin/cloud → account}/device-signin.ts +2 -2
- package/src/{plugins/builtin/cloud → account}/email-auth-attempt.ts +2 -2
- package/src/account/session.ts +16 -0
- package/src/{plugins/builtin/cloud → account}/upgrade-dialog.tsx +16 -15
- package/src/{plugins/builtin/cloud → account}/upgrade-personalization.ts +7 -7
- package/src/{plugins/builtin/cloud → account}/upgrade-tickers.ts +6 -6
- package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
- package/src/api-client/central-bank-rates.ts +6 -1
- package/src/api-client/chat.ts +26 -0
- package/src/api-client/credit-boards.ts +2 -0
- package/src/api-client/data.ts +73 -3
- package/src/api-client/earnings.ts +6 -0
- package/src/api-client/europe-energy.ts +106 -0
- package/src/api-client/futures-curve.ts +56 -0
- package/src/api-client/index.ts +13 -1
- package/src/api-client/market-discovery.ts +13 -1
- package/src/api-client/normalizers.ts +32 -0
- package/src/api-client/paths.ts +7 -0
- package/src/api-client/perps.ts +8 -0
- package/src/api-client/request.ts +9 -2
- package/src/api-client/research-activity.ts +15 -10
- package/src/api-client/socket.ts +29 -0
- package/src/api-client/themes.ts +22 -1
- package/src/api-client/types.ts +78 -2
- package/src/api-client/yield-curves.ts +8 -0
- package/src/app/global-shortcuts.ts +50 -2
- package/src/app/keybindings/actions.ts +12 -1
- package/src/app/pane-runtime/plugin-bindings.ts +2 -2
- package/src/app/pane-runtime/ticker-open-runtime.ts +16 -6
- package/src/app/runtime/desktop-deeplink.ts +10 -5
- package/src/app/runtime/startup.ts +1 -1
- package/src/app.tsx +6 -0
- package/src/architecture/core-builtin-allowlist.json +8 -26
- package/src/ask-gloom/pane-context.ts +114 -0
- package/src/ask-gloom/pane-request.ts +70 -0
- package/src/ask-gloom/pane-text.ts +201 -0
- package/src/brokers/signed-in/sign-in-dialog.tsx +11 -5
- package/src/capabilities/chart-series.ts +19 -2
- package/src/capabilities/factories.ts +1 -0
- package/src/cli/central-bank-events.ts +23 -0
- package/src/cli/command-options.ts +17 -5
- package/src/cli/commands/crypto-hints.ts +35 -2
- package/src/cli/commands/fred-series.ts +146 -0
- package/src/cli/commands/market.ts +501 -115
- package/src/cli/commands/news-hints.ts +62 -0
- package/src/cli/commands/news-search.ts +53 -0
- package/src/cli/commands/options-leaps.ts +5 -2
- package/src/cli/commands/overview.ts +132 -26
- package/src/cli/commands/remote.ts +2 -1
- package/src/cli/commands/search.ts +317 -13
- package/src/cli/commands/system.ts +55 -8
- package/src/cli/commands/ticker.ts +155 -18
- package/src/cli/context.ts +45 -14
- package/src/cli/desktop-pane-shot.ts +76 -7
- package/src/cli/earnings-calendar.ts +71 -0
- package/src/cli/errors.ts +7 -5
- package/src/cli/exit-codes.ts +8 -0
- package/src/cli/export-source.ts +58 -0
- package/src/cli/freshness.ts +18 -7
- package/src/cli/glossary.ts +483 -0
- package/src/cli/help.ts +10 -0
- package/src/cli/helpers.ts +2 -5
- package/src/cli/history-rows.ts +118 -7
- package/src/cli/index-roots.ts +7 -0
- package/src/cli/index.ts +29 -9
- package/src/cli/known-gaps.ts +84 -0
- package/src/cli/listing-arg.ts +551 -97
- package/src/cli/not-a-ticker.ts +24 -9
- package/src/cli/pane-functions/access-gate.ts +13 -2
- package/src/cli/pane-functions/capabilities.ts +4 -3
- package/src/cli/pane-functions/catalog.ts +214 -40
- package/src/cli/pane-functions/data.ts +42 -8
- package/src/cli/pane-functions/discovery.ts +1 -0
- package/src/cli/pane-functions/dom.ts +37 -8
- package/src/cli/pane-functions/freshness.ts +393 -49
- package/src/cli/pane-functions/function-help.ts +31 -15
- package/src/cli/pane-functions/headless.ts +98 -30
- package/src/cli/pane-functions/index.ts +101 -19
- package/src/cli/pane-functions/market-session.ts +22 -8
- package/src/cli/pane-functions/options.ts +71 -22
- package/src/cli/pane-functions/report-notices.ts +25 -7
- package/src/cli/pane-functions/report.ts +15 -8
- package/src/cli/pane-functions/resolver.ts +74 -19
- package/src/cli/pane-functions/screenshot.ts +250 -27
- package/src/cli/perpetual-contract.ts +60 -0
- package/src/cli/registry.ts +3 -1
- package/src/cli/report-tables.ts +26 -7
- package/src/cli/result.ts +45 -11
- package/src/cli/series-search.ts +111 -0
- package/src/cli/staged-tickers.ts +52 -0
- package/src/cli/symbol-args.ts +27 -0
- package/src/cli/symbol-list.ts +154 -0
- package/src/cli/symbol-rows.ts +154 -0
- package/src/cli/ticker-resolution.ts +311 -27
- package/src/cli/types.ts +5 -0
- package/src/components/chart/composite/axis-overlays.tsx +14 -3
- package/src/components/chart/composite/composite-chart.tsx +71 -11
- package/src/components/chart/composite/crosshair-readout.tsx +150 -0
- package/src/components/chart/composite/downsample.ts +1 -1
- package/src/components/chart/composite/format.ts +29 -0
- package/src/components/chart/composite/interactions.ts +9 -2
- package/src/components/chart/composite/legend.tsx +100 -33
- package/src/components/chart/composite/panel-bitmap.ts +70 -35
- package/src/components/chart/composite/panel-labels.ts +18 -17
- package/src/components/chart/composite/panel-series.ts +1 -0
- package/src/components/chart/composite/panel-surface.tsx +46 -21
- package/src/components/chart/composite/price-axis-labels.tsx +3 -1
- package/src/components/chart/composite/rasterizer.ts +50 -8
- package/src/components/chart/composite/scene.ts +2 -1
- package/src/components/chart/composite/time-scale.ts +26 -9
- package/src/components/chart/composite/types.ts +18 -0
- package/src/components/chart/composite/use-composite-viewport.ts +30 -2
- package/src/components/chart/native/raster/crosshair.ts +8 -3
- package/src/components/chart/native/raster/primitives.ts +85 -21
- package/src/components/chart/native/surface/manager.ts +33 -8
- package/src/components/chart/surface3d/chart.tsx +1 -1
- package/src/components/command-bar/action-runtime.ts +1 -1
- package/src/components/command-bar/commands/collection-list.ts +210 -0
- package/src/components/command-bar/commands/collection.ts +40 -1
- package/src/components/command-bar/commands/direct/index.ts +4 -0
- package/src/components/command-bar/commands/registry.ts +8 -0
- package/src/components/command-bar/panel/index.tsx +11 -3
- package/src/components/command-bar/panel/runtime.ts +3 -0
- package/src/components/command-bar/panel/types.ts +2 -0
- package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
- package/src/components/command-bar/routes/root/provider-search.ts +4 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +12 -11
- package/src/components/command-bar/routes/ticker-search/route.ts +4 -3
- package/src/components/command-bar/routing/actions.ts +1 -1
- package/src/components/command-bar/workflow/tickers.ts +42 -17
- package/src/components/layout/detached-pane-shell.tsx +68 -39
- package/src/components/layout/floating-pane.tsx +10 -1
- package/src/components/layout/header.tsx +25 -5
- package/src/components/layout/missing-pane.tsx +3 -3
- package/src/components/layout/pane/capture-stamp.ts +41 -0
- package/src/components/layout/pane/capture-status.ts +12 -0
- package/src/components/layout/pane/content.tsx +7 -13
- package/src/components/layout/pane/footer/index.tsx +6 -2
- package/src/components/layout/pane/footer/keyboard.ts +3 -0
- package/src/components/layout/pane/footer/model.ts +41 -1
- package/src/components/layout/pane/header.tsx +50 -1
- package/src/components/layout/pane/index.tsx +21 -3
- package/src/components/layout/pane/sidebar.tsx +88 -21
- package/src/components/layout/shell/active-drag.ts +21 -5
- package/src/components/layout/shell/cursor-occlusion.ts +2 -1
- package/src/components/layout/shell/drag/index.ts +39 -9
- package/src/components/layout/shell/drag/live.ts +61 -51
- package/src/components/layout/shell/drag/runtime.ts +54 -12
- package/src/components/layout/shell/index.tsx +84 -65
- package/src/components/layout/shell/menu.ts +14 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
- package/src/components/layout/shell/pane/actions.ts +32 -10
- package/src/components/layout/shell/pane/ask.ts +131 -0
- package/src/components/layout/shell/pane/capture.ts +162 -0
- package/src/components/layout/shell/pane/layers.tsx +218 -50
- package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
- package/src/components/layout/shell/shortcuts.ts +21 -4
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
- package/src/components/markdown-text.tsx +62 -20
- package/src/components/metric-treemap/heat-surface.tsx +8 -1
- package/src/components/onboarding/account-step/form-panel.tsx +1 -1
- package/src/components/onboarding/account-step/index.tsx +1 -1
- package/src/components/onboarding/account-step/qr-panel.tsx +1 -1
- package/src/components/onboarding/account-step/signed-in-panel.tsx +1 -1
- package/src/components/onboarding/onboarding-keyboard.ts +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +2 -2
- package/src/components/onboarding/use-onboarding-upgrade.ts +3 -3
- package/src/components/onboarding/wizard-account.ts +2 -2
- package/src/components/pane-template-wizard.tsx +9 -1
- package/src/components/price-selector-dialog.tsx +11 -2
- package/src/components/reader/article-reader.tsx +642 -0
- package/src/components/reader/article-text.ts +527 -0
- package/src/components/sign-in-gate.tsx +3 -3
- package/src/components/ticker/list-table-view.tsx +43 -2
- package/src/components/ui/action-row.tsx +2 -1
- package/src/components/ui/button.tsx +7 -1
- package/src/components/ui/choice-dialog.tsx +6 -4
- package/src/components/ui/confirm-dialog.tsx +28 -18
- package/src/components/ui/data-table/index.tsx +18 -6
- package/src/components/ui/data-table/opentui/index.tsx +37 -6
- package/src/components/ui/data-table/types.ts +12 -0
- package/src/components/ui/dialog-actions.tsx +64 -0
- package/src/components/ui/display.tsx +17 -3
- package/src/components/ui/frame.tsx +35 -2
- package/src/components/ui/icon.tsx +6 -1
- package/src/components/ui/query-bar.tsx +10 -1
- package/src/components/ui/text-prompt-dialog.tsx +11 -9
- package/src/data/cached-query.ts +2 -0
- package/src/data/config/store/migrations.ts +7 -0
- package/src/data/config/store/normalize.ts +7 -2
- package/src/data/config/store/portfolio-as-of-column.ts +57 -0
- package/src/data/ticker-repository.ts +5 -0
- package/src/data/ticker-store.ts +15 -0
- package/src/docs/content.ts +215 -0
- package/src/docs/load.ts +139 -0
- package/src/docs/requests.ts +39 -0
- package/src/docs/snapshot.chunk.ts +8 -0
- package/src/docs/snapshot.json +7555 -0
- package/src/docs/topics.ts +216 -0
- package/src/i18n/es.ts +65 -5
- package/src/i18n/ja.ts +65 -5
- package/src/i18n/ko.ts +65 -5
- package/src/i18n/zh-cn.ts +65 -5
- package/src/i18n/zh-tw.ts +65 -5
- package/src/layout/desks.ts +1 -1
- package/src/layout/pane-manager/dock-tree.ts +18 -0
- package/src/layout/pane-manager/index.ts +1 -0
- package/src/layout-marketplace/gallery.tsx +1 -1
- package/src/market-data/coordinator/chart.ts +10 -4
- package/src/market-data/coordinator/index.ts +6 -3
- package/src/{plugins/builtin/futures/contracts.ts → market-data/futures-board.ts} +81 -28
- package/src/market-data/futures-contract.ts +151 -0
- package/src/market-data/hooks.tsx +10 -2
- package/src/market-data/market/format.ts +39 -21
- package/src/market-data/market/freshness.ts +84 -20
- package/src/market-data/market/session-close-note.ts +3 -2
- package/src/market-data/market/status.ts +19 -23
- package/src/market-data/published-apac-sessions.ts +23 -1
- package/src/market-data/quotes/contributions.ts +5 -0
- package/src/market-data/quotes/metadata.ts +19 -24
- package/src/market-data/quotes/resolution.ts +5 -0
- package/src/market-data/quotes/screener-live-quotes.ts +5 -4
- package/src/market-data/result-types.ts +2 -0
- package/src/notifications/app-notifier.ts +17 -1
- package/src/notifications/notification-log.ts +180 -0
- package/src/plugins/auto-update-node.ts +2 -2
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/model.ts +1 -56
- package/src/plugins/builtin/account-management/pane.tsx +6 -4
- package/src/plugins/builtin/account-management/password-dialog.tsx +1 -1
- package/src/plugins/builtin/alerts/catalysts.ts +1 -1
- package/src/plugins/builtin/alerts/cli.ts +313 -47
- package/src/plugins/builtin/alerts/events-pane.tsx +45 -7
- package/src/plugins/builtin/alerts/events.ts +23 -2
- package/src/plugins/builtin/alerts/focus.ts +27 -0
- package/src/plugins/builtin/alerts/history-pane.tsx +7 -2
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +47 -11
- package/src/plugins/builtin/alerts/pane.tsx +27 -1
- package/src/plugins/builtin/alerts/research-builder.ts +8 -3
- package/src/plugins/builtin/alerts/research-rules.ts +18 -2
- package/src/plugins/builtin/alerts/scheduled-check.ts +122 -0
- package/src/plugins/builtin/alerts/scheduled-sources.ts +25 -0
- package/src/plugins/builtin/alerts/scheduled.ts +254 -0
- package/src/plugins/builtin/alerts/targets.ts +92 -0
- package/src/plugins/builtin/analytics/index.tsx +8 -3
- package/src/plugins/builtin/analytics/risk-headless.ts +60 -27
- package/src/plugins/builtin/analytics/risk-math.ts +91 -27
- package/src/plugins/builtin/analytics/risk-model.ts +35 -5
- package/src/plugins/builtin/analytics/risk-pane.tsx +15 -8
- package/src/plugins/builtin/attention/headless.ts +1 -1
- package/src/plugins/builtin/attention/index.tsx +2 -0
- package/src/plugins/builtin/attention/pane.tsx +3 -1
- package/src/plugins/builtin/attention/series.ts +26 -0
- package/src/plugins/builtin/awards/headless.ts +88 -18
- package/src/plugins/builtin/awards/index.tsx +2 -0
- package/src/plugins/builtin/awards/model.ts +41 -1
- package/src/plugins/builtin/awards/pane.tsx +22 -13
- package/src/plugins/builtin/awards/series.ts +29 -0
- package/src/plugins/builtin/backtest/headless.ts +2 -2
- package/src/plugins/builtin/bond-calculator/model.ts +2 -1
- package/src/plugins/builtin/broker-manager/index.tsx +1 -0
- package/src/plugins/builtin/catalysts/headless.ts +1 -1
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/client.ts +49 -12
- package/src/plugins/builtin/cds/headless.ts +119 -19
- package/src/plugins/builtin/cds/index.tsx +3 -1
- package/src/plugins/builtin/cds/model.ts +214 -32
- package/src/plugins/builtin/cds/pane.tsx +58 -14
- package/src/plugins/builtin/cds/series.ts +19 -0
- package/src/plugins/builtin/central-bank-rates/client.ts +4 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +46 -16
- package/src/plugins/builtin/central-bank-rates/index.tsx +3 -1
- package/src/plugins/builtin/central-bank-rates/model.ts +99 -0
- package/src/plugins/builtin/central-bank-rates/pane.tsx +1 -1
- package/src/plugins/builtin/central-bank-rates/series.ts +36 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +193 -255
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +84 -46
- package/src/plugins/builtin/chart-composer/editor.tsx +5 -4
- package/src/plugins/builtin/chart-composer/field-series.ts +40 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +1 -1
- package/src/plugins/builtin/chart-composer/headless.ts +70 -5
- package/src/plugins/builtin/chart-composer/index.tsx +15 -3
- package/src/plugins/builtin/chart-composer/pane.tsx +81 -38
- package/src/plugins/builtin/chart-composer/series-catalog.ts +58 -50
- package/src/plugins/builtin/chart-composer/series-expression.ts +18 -10
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +59 -3
- package/src/plugins/builtin/chart-composer/user-series.ts +84 -0
- package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
- package/src/plugins/builtin/chat/content/composer.tsx +5 -1
- package/src/plugins/builtin/chat/content/footer.tsx +12 -0
- package/src/plugins/builtin/chat/content/index.tsx +89 -5
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
- package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
- package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
- package/src/plugins/builtin/chat/content/scroll.ts +127 -27
- package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
- package/src/plugins/builtin/chat/content/transcript.tsx +145 -78
- package/src/plugins/builtin/chat/content/types.ts +1 -0
- package/src/plugins/builtin/chat/controller/fetch.ts +8 -2
- package/src/plugins/builtin/chat/controller/index.ts +123 -1
- package/src/plugins/builtin/chat/controller/message-loading.ts +3 -0
- package/src/plugins/builtin/chat/controller/messages.ts +7 -2
- package/src/plugins/builtin/chat/controller/realtime.ts +10 -1
- package/src/plugins/builtin/chat/controller/send.ts +61 -1
- package/src/plugins/builtin/chat/controller/state.ts +8 -0
- package/src/plugins/builtin/chat/ghost-user.ts +20 -0
- package/src/plugins/builtin/chat/index.tsx +23 -5
- package/src/plugins/builtin/chat/layout.ts +78 -5
- package/src/plugins/builtin/chat/message/ai-badge.tsx +18 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +55 -6
- package/src/plugins/builtin/chat/message/header.tsx +16 -4
- package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
- package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
- package/src/plugins/builtin/chat/message/render-state.ts +18 -2
- package/src/plugins/builtin/chat/message/terminal.tsx +43 -4
- package/src/plugins/builtin/chat/message/types.ts +12 -0
- package/src/plugins/builtin/chat/reactions.ts +197 -0
- package/src/plugins/builtin/chat/share/flow.tsx +87 -0
- package/src/plugins/builtin/chat/share/targets.ts +27 -0
- package/src/plugins/builtin/chat/status-widget.tsx +6 -3
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +148 -27
- package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
- package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +111 -19
- package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
- package/src/plugins/builtin/cloud/askg/manifest.ts +32 -7
- package/src/plugins/builtin/cloud/askg/model.ts +27 -8
- package/src/plugins/builtin/cloud/askg/pane-attachment.ts +94 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +141 -12
- package/src/plugins/builtin/cloud/askg/pending-question.ts +11 -0
- package/src/plugins/builtin/cloud/askg/protocol.ts +10 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +3 -0
- package/src/plugins/builtin/cloud/askg/undo.ts +2 -0
- package/src/plugins/builtin/cloud/auth-actions.tsx +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +1 -1
- package/src/plugins/builtin/cloud/auth-dialog.tsx +3 -3
- package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +3 -0
- package/src/plugins/builtin/cloud/plugin.tsx +19 -2
- package/src/plugins/builtin/cloud/team/model.ts +5 -0
- package/src/plugins/builtin/cloud/team/module.tsx +1 -0
- package/src/plugins/builtin/cloud/team/store.ts +8 -3
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +77 -9
- package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +6 -1
- package/src/plugins/builtin/cloud/terminal-relay/policy.ts +9 -0
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +35 -11
- package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -0
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
- package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
- package/src/plugins/builtin/company-attention/headless.ts +21 -7
- package/src/plugins/builtin/company-attention/index.tsx +2 -0
- package/src/plugins/builtin/company-attention/model.ts +26 -7
- package/src/plugins/builtin/company-attention/pane.tsx +12 -9
- package/src/plugins/builtin/company-attention/series.ts +52 -0
- package/src/plugins/builtin/company-kpis/headless.ts +97 -10
- package/src/plugins/builtin/company-kpis/model.ts +24 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +17 -16
- package/src/plugins/builtin/composite-plugins.ts +19 -13
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +1 -1
- package/src/plugins/builtin/cot/index.tsx +3 -1
- package/src/plugins/builtin/cot/model.ts +40 -11
- package/src/plugins/builtin/cot/series.ts +27 -0
- package/src/plugins/builtin/cpi/headless.ts +3 -3
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +10 -1
- package/src/plugins/builtin/credit-boards/client.ts +6 -2
- package/src/plugins/builtin/credit-boards/headless.ts +108 -31
- package/src/plugins/builtin/credit-boards/index.tsx +2 -0
- package/src/plugins/builtin/credit-boards/model.ts +11 -1
- package/src/plugins/builtin/credit-boards/series.ts +66 -0
- package/src/plugins/builtin/credit-conditions/client.ts +12 -9
- package/src/plugins/builtin/credit-conditions/headless.ts +13 -2
- package/src/plugins/builtin/credit-conditions/index.tsx +18 -9
- package/src/plugins/builtin/credit-conditions/model.ts +19 -11
- package/src/plugins/builtin/credit-conditions/series.ts +16 -0
- package/src/plugins/builtin/credit-documents/headless.ts +33 -3
- package/src/plugins/builtin/credit-documents/pane.tsx +3 -1
- package/src/plugins/builtin/crypto-board/headless.ts +2 -3
- package/src/plugins/builtin/crypto-board/index.tsx +2 -0
- package/src/plugins/builtin/crypto-board/model.ts +12 -0
- package/src/plugins/builtin/crypto-board/pane.tsx +19 -12
- package/src/plugins/builtin/crypto-board/series.ts +48 -0
- package/src/plugins/builtin/custom-view/live-quotes.ts +2 -2
- package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
- package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
- package/src/plugins/builtin/debt-maturities/series.ts +45 -0
- package/src/plugins/builtin/dividend-yield/client.ts +3 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +7 -4
- package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/pane.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/series.ts +20 -0
- package/src/plugins/builtin/dividend-yield/types.ts +2 -0
- package/src/plugins/builtin/docs/blocks.tsx +181 -0
- package/src/plugins/builtin/docs/index.tsx +68 -0
- package/src/plugins/builtin/docs/pane.tsx +426 -0
- package/src/plugins/builtin/docs/targets.ts +72 -0
- package/src/plugins/builtin/docs/use-docs.ts +60 -0
- package/src/plugins/builtin/doe/headless.ts +12 -8
- package/src/plugins/builtin/doe/index.tsx +2 -0
- package/src/plugins/builtin/doe/series.ts +62 -0
- package/src/plugins/builtin/earnings/client.ts +3 -2
- package/src/plugins/builtin/earnings/format.ts +1 -5
- package/src/plugins/builtin/earnings/headless.ts +58 -6
- package/src/plugins/builtin/earnings/history-model.ts +15 -1
- package/src/plugins/builtin/earnings/history-table.ts +13 -2
- package/src/plugins/builtin/earnings/history.tsx +7 -3
- package/src/plugins/builtin/earnings/index.tsx +9 -0
- package/src/plugins/builtin/earnings-calls/headless.ts +28 -2
- package/src/plugins/builtin/earnings-calls/index.tsx +1 -1
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +198 -0
- package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
- package/src/plugins/builtin/econ/index.tsx +2 -0
- package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +19 -4
- package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
- package/src/plugins/builtin/equity-screener/headless.ts +3 -3
- package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
- package/src/plugins/builtin/exposure/drivers.ts +13 -0
- package/src/plugins/builtin/exposure/headless.ts +205 -13
- package/src/plugins/builtin/exposure/holdings.ts +1 -1
- package/src/plugins/builtin/exposure/index.tsx +1 -0
- package/src/plugins/builtin/exposure/model.ts +23 -3
- package/src/plugins/builtin/exposure/pane.tsx +14 -12
- package/src/plugins/builtin/fear-greed/index.tsx +18 -10
- package/src/plugins/builtin/fear-greed/series.ts +52 -0
- package/src/plugins/builtin/futures/index.tsx +43 -3
- package/src/plugins/builtin/futures/model.ts +1 -1
- package/src/plugins/builtin/futures/returns.ts +1 -1
- package/src/plugins/builtin/futures/series.ts +13 -0
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures/use-front-returns.ts +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +12 -3
- package/src/plugins/builtin/futures-curve/headless.ts +71 -10
- package/src/plugins/builtin/futures-curve/index.tsx +1 -1
- package/src/plugins/builtin/futures-curve/model.ts +66 -11
- package/src/plugins/builtin/futures-curve/pane.tsx +52 -18
- package/src/plugins/builtin/fx-matrix/client.ts +63 -0
- package/src/plugins/builtin/fx-matrix/export.ts +2 -1
- package/src/plugins/builtin/fx-matrix/headless.ts +154 -0
- package/src/plugins/builtin/fx-matrix/index.tsx +4 -4
- package/src/plugins/builtin/gpu/board.tsx +13 -10
- package/src/plugins/builtin/gpu/changes.tsx +4 -4
- package/src/plugins/builtin/gpu/client.ts +19 -1
- package/src/plugins/builtin/gpu/equities.tsx +14 -10
- package/src/plugins/builtin/gpu/headless.ts +58 -27
- package/src/plugins/builtin/gpu/history.tsx +3 -3
- package/src/plugins/builtin/gpu/index.tsx +2 -0
- package/src/plugins/builtin/gpu/model.ts +101 -16
- package/src/plugins/builtin/gpu/pane.tsx +28 -12
- package/src/plugins/builtin/gpu/series.ts +38 -0
- package/src/plugins/builtin/help/function-card.tsx +25 -6
- package/src/plugins/builtin/help/function-index.ts +2 -0
- package/src/plugins/builtin/help/index.tsx +31 -9
- package/src/plugins/builtin/holders/beneficial-model.ts +90 -3
- package/src/plugins/builtin/holders/beneficial-report.ts +57 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +55 -11
- package/src/plugins/builtin/holders/client.ts +22 -3
- package/src/plugins/builtin/holders/format.ts +18 -3
- package/src/plugins/builtin/holders/headless.ts +36 -133
- package/src/plugins/builtin/holders/pane.tsx +11 -4
- package/src/plugins/builtin/holders/report-header.ts +40 -5
- package/src/plugins/builtin/holders/report-rows.ts +240 -0
- package/src/plugins/builtin/insider/client.ts +35 -20
- package/src/plugins/builtin/insider/headless.ts +41 -11
- package/src/plugins/builtin/insider/index.tsx +26 -9
- package/src/plugins/builtin/insider/insider-data.ts +10 -0
- package/src/plugins/builtin/insider/issuer.ts +49 -0
- package/src/plugins/builtin/insider/model.ts +3 -0
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
- package/src/plugins/builtin/iv-history/client.ts +20 -6
- package/src/plugins/builtin/iv-history/format.ts +9 -0
- package/src/plugins/builtin/iv-history/headless.ts +56 -21
- package/src/plugins/builtin/iv-history/index.tsx +2 -0
- package/src/plugins/builtin/iv-history/model.ts +143 -8
- package/src/plugins/builtin/iv-history/screen-pane.tsx +5 -9
- package/src/plugins/builtin/iv-history/series.ts +29 -0
- package/src/plugins/builtin/jobs/headless.ts +26 -3
- package/src/plugins/builtin/jobs/index.tsx +3 -1
- package/src/plugins/builtin/jobs/series.ts +19 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +2 -1
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
- package/src/plugins/builtin/macro-day/client.ts +44 -3
- package/src/plugins/builtin/macro-day/headless.ts +13 -10
- package/src/plugins/builtin/macro-day/model.ts +56 -10
- package/src/plugins/builtin/macro-day/pane.tsx +30 -20
- package/src/plugins/builtin/market-heatmap/headless.ts +20 -5
- package/src/plugins/builtin/market-heatmap/index.tsx +6 -0
- package/src/plugins/builtin/market-heatmap/model.ts +19 -11
- package/src/plugins/builtin/market-heatmap/portfolio.ts +2 -2
- package/src/plugins/builtin/market-movers/client.ts +7 -5
- package/src/plugins/builtin/market-movers/index.tsx +3 -2
- package/src/plugins/builtin/market-movers/model.ts +30 -0
- package/src/plugins/builtin/market-movers/screener.ts +31 -0
- package/src/plugins/builtin/market-valuation/chart-series.ts +29 -69
- package/src/plugins/builtin/market-valuation/index.tsx +3 -3
- package/src/plugins/builtin/market-valuation/indicators.ts +0 -5
- package/src/plugins/builtin/members/headless.ts +8 -3
- package/src/plugins/builtin/members/model.ts +31 -3
- package/src/plugins/builtin/members/pane.tsx +6 -8
- package/src/plugins/builtin/mna/distress/headless.ts +4 -4
- package/src/plugins/builtin/mna/headless.ts +18 -6
- package/src/plugins/builtin/money-markets/headless.ts +5 -4
- package/src/plugins/builtin/money-markets/index.tsx +2 -0
- package/src/plugins/builtin/money-markets/series.ts +41 -0
- package/src/plugins/builtin/news/index.tsx +0 -2
- package/src/plugins/builtin/news/wire/news/detail-view.tsx +53 -104
- package/src/plugins/builtin/news/wire/news/footer.ts +2 -25
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +0 -2
- package/src/plugins/builtin/notes/cli.ts +12 -7
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/options/index.tsx +3 -0
- package/src/plugins/builtin/options/view.tsx +1 -1
- package/src/plugins/builtin/options-calculator/inputs.ts +2 -1
- package/src/plugins/builtin/options-positioning/client.ts +7 -3
- package/src/plugins/builtin/options-positioning/headless.ts +4 -3
- package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
- package/src/plugins/builtin/options-scenario/client.ts +2 -1
- package/src/plugins/builtin/options-scenario/headless.ts +1 -0
- package/src/plugins/builtin/options-scenario/hedge.ts +2 -1
- package/src/plugins/builtin/perps/client.ts +90 -16
- package/src/plugins/builtin/perps/equity-row.tsx +52 -17
- package/src/plugins/builtin/perps/freshness.ts +66 -0
- package/src/plugins/builtin/perps/headless.ts +47 -32
- package/src/plugins/builtin/perps/index.tsx +23 -4
- package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
- package/src/plugins/builtin/perps/model.ts +20 -5
- package/src/plugins/builtin/perps/open-market.ts +15 -0
- package/src/plugins/builtin/perps/pane.tsx +76 -20
- package/src/plugins/builtin/perps/series.ts +76 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +73 -67
- package/src/plugins/builtin/plugin-module.ts +3 -0
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
- package/src/plugins/builtin/portfolio-list/allocation.ts +5 -4
- package/src/plugins/builtin/portfolio-list/cell-version.ts +8 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +161 -0
- package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +384 -74
- package/src/plugins/builtin/portfolio-list/cli/render.ts +437 -71
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +21 -4
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +121 -47
- package/src/plugins/builtin/portfolio-list/column-values.ts +104 -26
- package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
- package/src/plugins/builtin/portfolio-list/headless.ts +84 -18
- package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
- package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
- package/src/plugins/builtin/portfolio-list/mutations.ts +2 -9
- package/src/plugins/builtin/portfolio-list/pane/data.ts +5 -1
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +52 -9
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +33 -11
- package/src/plugins/builtin/portfolio-list/quick-add/resolution.ts +21 -1
- package/src/plugins/builtin/portfolio-list/settings.ts +17 -0
- package/src/plugins/builtin/portfolio-list/summary/index.tsx +12 -0
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +9 -4
- package/src/plugins/builtin/portfolio-list/table.tsx +37 -7
- package/src/plugins/builtin/power/client.ts +16 -0
- package/src/plugins/builtin/power/evidence.ts +63 -10
- package/src/plugins/builtin/power/headless.ts +77 -9
- package/src/plugins/builtin/power/index.tsx +28 -3
- package/src/plugins/builtin/power/model.ts +73 -2
- package/src/plugins/builtin/power/pane.tsx +37 -9
- package/src/plugins/builtin/power/prices-client.ts +139 -0
- package/src/plugins/builtin/power/prices-headless.ts +137 -0
- package/src/plugins/builtin/power/prices-model.ts +103 -0
- package/src/plugins/builtin/power/prices.tsx +179 -0
- package/src/plugins/builtin/rate-path/headless.ts +46 -18
- package/src/plugins/builtin/realized-vol/headless.ts +5 -0
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +5 -2
- package/src/plugins/builtin/research/event-model.ts +68 -24
- package/src/plugins/builtin/research/events-headless.ts +2 -1
- package/src/plugins/builtin/research/headless.ts +2 -1
- package/src/plugins/builtin/research/index.tsx +2 -0
- package/src/plugins/builtin/research-search/article.ts +65 -0
- package/src/plugins/builtin/research-search/document-view.tsx +33 -215
- package/src/plugins/builtin/research-search/model.ts +0 -9
- package/src/plugins/builtin/research-search/pane.tsx +41 -30
- package/src/plugins/builtin/research-search/snippet.ts +0 -29
- package/src/plugins/builtin/revenue-breakdown/headless.ts +18 -6
- package/src/plugins/builtin/seasonality/client.ts +15 -7
- package/src/plugins/builtin/seasonality/headless.ts +36 -12
- package/src/plugins/builtin/seasonality/index.tsx +2 -2
- package/src/plugins/builtin/seasonality/model.ts +119 -0
- package/src/plugins/builtin/seasonality/pane.tsx +108 -37
- package/src/plugins/builtin/sec/headless.ts +25 -3
- package/src/plugins/builtin/sec/index.tsx +2 -1
- package/src/plugins/builtin/series-inventory.ts +93 -0
- package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
- package/src/plugins/builtin/shared/command-tab.ts +30 -12
- package/src/plugins/builtin/shared/earnings-report.ts +55 -0
- package/src/plugins/builtin/shared/fred-points.ts +20 -0
- package/src/plugins/builtin/shared/free-preview.ts +47 -0
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +101 -0
- package/src/plugins/builtin/shared/open-description.ts +29 -0
- package/src/plugins/builtin/shared/report-freshness.ts +12 -1
- package/src/plugins/builtin/shared/series-warning.ts +5 -0
- package/src/plugins/builtin/shared/volatility/options.ts +4 -1
- package/src/plugins/builtin/short-interest/headless.ts +1 -0
- package/src/plugins/builtin/short-interest/index.tsx +2 -0
- package/src/plugins/builtin/short-interest/series.ts +36 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +3 -2
- package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
- package/src/plugins/builtin/short-volume/headless.ts +2 -1
- package/src/plugins/builtin/short-volume/index.tsx +2 -0
- package/src/plugins/builtin/short-volume/series.ts +23 -0
- package/src/plugins/builtin/social-mentions/headless.ts +1 -1
- package/src/plugins/builtin/social-mentions/index.tsx +2 -0
- package/src/plugins/builtin/social-mentions/series.ts +23 -0
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +3 -2
- package/src/plugins/builtin/supply-chain/headless.ts +43 -11
- package/src/plugins/builtin/supply-chain/model.ts +13 -0
- package/src/plugins/builtin/supply-chain/pane.tsx +8 -6
- package/src/plugins/builtin/themes/headless.ts +74 -10
- package/src/plugins/builtin/themes/model.ts +71 -4
- package/src/plugins/builtin/themes/pane.tsx +22 -5
- package/src/plugins/builtin/thirteenf/api.ts +1 -0
- package/src/plugins/builtin/thirteenf/data.ts +6 -4
- package/src/plugins/builtin/thirteenf/headless.ts +217 -36
- package/src/plugins/builtin/thirteenf/model.ts +39 -1
- package/src/plugins/builtin/thirteenf/overlap.ts +75 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +10 -1
- package/src/plugins/builtin/thirteenf/report-notes.ts +103 -1
- package/src/plugins/builtin/thirteenf/types.ts +2 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +114 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +57 -2
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +19 -55
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +86 -0
- package/src/plugins/builtin/ticker-detail/index.tsx +26 -11
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/overview/futures-contract.ts +31 -0
- package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -3
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +49 -5
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
- package/src/plugins/builtin/time-sales/headless.ts +2 -1
- package/src/plugins/builtin/time-sales/index.tsx +2 -1
- package/src/plugins/builtin/treasury-auctions/headless.ts +16 -2
- package/src/plugins/builtin/treasury-auctions/index.tsx +1 -0
- package/src/plugins/builtin/treasury-auctions/model.ts +8 -0
- package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
- package/src/plugins/builtin/vol-surface/headless.ts +51 -17
- package/src/plugins/builtin/vol-surface/heat-grid.tsx +113 -0
- package/src/plugins/builtin/vol-surface/model.ts +39 -6
- package/src/plugins/builtin/vol-surface/pane.tsx +14 -13
- package/src/plugins/builtin/vol-surface/stored.ts +63 -3
- package/src/plugins/builtin/vol-surface/surface.tsx +30 -2
- package/src/plugins/builtin/volatility/index.tsx +2 -0
- package/src/plugins/builtin/volatility/series.ts +84 -0
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +6 -5
- package/src/plugins/builtin/world-venue-map/basemap.ts +6 -3
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +26 -1
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
- package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
- package/src/plugins/builtin/world-venue-map/index.ts +2 -1
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +24 -13
- package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +144 -13
- package/src/plugins/builtin/world-venue-map/model.ts +56 -19
- package/src/plugins/builtin/world-venue-map/pane.tsx +5 -2
- package/src/plugins/builtin/yield-curve/chart.ts +2 -2
- package/src/plugins/builtin/yield-curve/curves.ts +21 -8
- package/src/plugins/builtin/yield-curve/headless.ts +71 -18
- package/src/plugins/builtin/yield-curve/index.tsx +4 -2
- package/src/plugins/builtin/yield-curve/series.ts +86 -0
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/installer.ts +2 -2
- package/src/plugins/loader.ts +15 -0
- package/src/plugins/manager-node.ts +1 -1
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/feed.ts +2 -2
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/model.ts +6 -6
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
- package/src/plugins/registry/host-actions.ts +11 -0
- package/src/plugins/registry/index.ts +89 -4
- package/src/portfolio/collection-name.ts +31 -0
- package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
- package/src/portfolio/position-value.ts +40 -0
- package/src/portfolio/valuation-basis.ts +79 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +7 -0
- package/src/public/time-series.ts +17 -0
- package/src/react/auto-refresh.ts +13 -3
- package/src/react/input.ts +33 -1
- package/src/react/key-repeat.ts +86 -0
- package/src/remote/app-host.tsx +20 -4
- package/src/remote/confirm-change.tsx +85 -0
- package/src/remote/controller-utils.ts +8 -1
- package/src/remote/controller.ts +144 -7
- package/src/remote/pane-screenshot.ts +47 -0
- package/src/remote/schema.ts +65 -2
- package/src/remote/types.ts +30 -0
- package/src/remote/watchlist.ts +306 -0
- package/src/renderers/browser/main.tsx +4 -3
- package/src/renderers/browser/research-entry.ts +4 -2
- package/src/renderers/cloudflare/worker.ts +1 -1
- package/src/renderers/dom/data-table/frozen-column.ts +3 -1
- package/src/renderers/dom/data-table/index.tsx +33 -6
- package/src/renderers/dom/data-table/row.tsx +30 -1
- package/src/renderers/dom/desktop/control-styles.ts +63 -1
- package/src/renderers/dom/desktop/controls.tsx +30 -23
- package/src/renderers/dom/desktop/dialog-actions.tsx +170 -0
- package/src/renderers/dom/desktop/icons.tsx +16 -0
- package/src/renderers/dom/dom-ui-host.tsx +3 -0
- package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
- package/src/renderers/dom/host/box.tsx +8 -0
- package/src/renderers/dom/host/chart-surface.tsx +33 -2
- package/src/renderers/dom/host/live-frame.ts +6 -2
- package/src/renderers/dom/host/overflow-fade.ts +14 -1
- package/src/renderers/dom/host/scroll-box.tsx +32 -0
- package/src/renderers/dom/host/size-observer.ts +41 -0
- package/src/renderers/dom/host/sticky-scroll.ts +128 -0
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/host/surface-3d.tsx +19 -7
- package/src/renderers/dom/host/surface-fit.ts +406 -0
- package/src/renderers/dom/host/text.tsx +1 -1
- package/src/renderers/dom/input-host.tsx +1 -0
- package/src/renderers/dom/styles.css +102 -5
- package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
- package/src/renderers/electrobun/bun/index.ts +3 -2
- package/src/renderers/electrobun/shared/protocol.ts +1 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +29 -2
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +63 -20
- package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
- package/src/renderers/electrobun/view/main.tsx +5 -3
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +2 -0
- package/src/renderers/opentui/chart-surface.tsx +1 -0
- package/src/renderers/opentui/frame-capture.ts +33 -0
- package/src/renderers/opentui/host.tsx +10 -13
- package/src/renderers/opentui/pane-image/glyphs-license.txt +107 -0
- package/src/renderers/opentui/pane-image/glyphs.json +1 -0
- package/src/renderers/opentui/pane-image/index.ts +107 -0
- package/src/renderers/opentui/pane-image/raster.ts +428 -0
- package/src/renderers/opentui/start.tsx +3 -3
- package/src/renderers/opentui/test-utils.tsx +3 -0
- package/src/renderers/opentui/ui-host.tsx +29 -1
- package/src/series/capability.ts +75 -0
- package/src/series/csv.ts +160 -0
- package/src/series/files.ts +107 -0
- package/src/series/registry.ts +198 -0
- package/src/series/resolve.ts +108 -0
- package/src/series/standalone.ts +48 -0
- package/src/series/types.ts +153 -0
- package/src/series/validate.ts +171 -0
- package/src/shares/chat.ts +34 -0
- package/src/shares/dialog.tsx +295 -0
- package/src/shares/flow.tsx +56 -0
- package/src/shares/live.ts +14 -22
- package/src/shares/pane-image.ts +152 -0
- package/src/shares/personal-pane.ts +64 -0
- package/src/shares/portable-layout.ts +4 -2
- package/src/shares/prepare.ts +20 -0
- package/src/sources/gloomberb-cloud/index.ts +109 -10
- package/src/sources/gloomberb-cloud/normalizers.ts +3 -0
- package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
- package/src/sources/history-result.ts +1 -0
- package/src/sources/history-retention.ts +11 -0
- package/src/sources/listing-symbols.ts +4 -1
- package/src/sources/listing-target.ts +4 -0
- package/src/sources/provider-router/batches.ts +4 -1
- package/src/sources/provider-router/cache.ts +4 -2
- package/src/sources/provider-router/cached-routes.ts +1 -1
- package/src/sources/provider-router/financial-routes.ts +1 -0
- package/src/sources/provider-router/financials.ts +13 -0
- package/src/sources/provider-router/history.ts +43 -25
- package/src/sources/provider-router/index.ts +14 -0
- package/src/sources/provider-router/search.ts +1 -0
- package/src/state/hooks/inline-tickers.ts +49 -11
- package/src/sync/core-contributors.ts +1 -0
- package/src/test-support/shell-pane-keys.tsx +1 -0
- package/src/theme/theme-context.tsx +15 -1
- package/src/tickers/company-name.ts +75 -0
- package/src/tickers/instrument-kind.ts +34 -1
- package/src/tickers/listing-name.ts +34 -0
- package/src/tickers/listing-venues.ts +132 -0
- package/src/tickers/open-target.ts +13 -4
- package/src/tickers/perpetual-listing.ts +151 -0
- package/src/tickers/prediction-listing.ts +26 -0
- package/src/tickers/search/index.ts +72 -11
- package/src/tickers/search/ranking.ts +98 -20
- package/src/tickers/search/types.ts +7 -1
- package/src/tickers/ticker-changes.ts +213 -0
- package/src/tickers/us-listing.ts +34 -0
- package/src/time-series/economic.ts +2 -6
- package/src/time-series/hooks.ts +9 -0
- package/src/time-series/ice-credit.ts +39 -0
- package/src/time-series/resolve.ts +211 -29
- package/src/time-series/studies.ts +1 -0
- package/src/time-series/types.ts +12 -2
- package/src/time-series/use-chart-resolution.ts +32 -0
- package/src/types/config.ts +10 -2
- package/src/types/data-provider.ts +11 -0
- package/src/types/financials.ts +62 -1
- package/src/types/headless.ts +113 -0
- package/src/types/instrument.ts +4 -0
- package/src/types/plugin.ts +52 -2
- package/src/types/price-history.ts +7 -0
- package/src/types/ticker-changes.ts +26 -0
- package/src/types/ticker.ts +14 -0
- package/src/ui/context-menu.tsx +13 -1
- package/src/ui/host.tsx +57 -3
- package/src/ui/live-resize.ts +91 -0
- package/src/ui/live-stretch.ts +153 -0
- package/src/ui/measured-cells.ts +58 -0
- package/src/ui/sticky-scroll.ts +7 -0
- package/src/utils/basis-points.ts +17 -0
- package/src/utils/central-banks.ts +76 -0
- package/src/utils/cli-output.ts +131 -15
- package/src/utils/concurrency.ts +25 -0
- package/src/utils/crypto-pair.ts +20 -0
- package/src/utils/currency-pair.ts +19 -0
- package/src/utils/currency-units.ts +11 -0
- package/src/utils/datetime-format.ts +27 -6
- package/src/utils/decimal-comma.ts +19 -0
- package/src/utils/dom-screenshot-css.ts +265 -0
- package/src/utils/dom-screenshot-rasters.ts +276 -0
- package/src/utils/dom-screenshot.ts +439 -52
- package/src/utils/double-escape-close.ts +15 -1
- package/src/utils/exchange-rate-snapshot.ts +6 -2
- package/src/utils/exchanges.ts +143 -1
- package/src/utils/format.ts +35 -5
- package/src/utils/forward-dividend.ts +14 -0
- package/src/utils/fundamentals.ts +66 -0
- package/src/utils/futures-generic.ts +6 -12
- package/src/utils/fx-market-hours.ts +15 -5
- package/src/utils/fx-status.ts +6 -1
- package/src/utils/inline-content-tokenizer.ts +22 -3
- package/src/utils/market-capitalization.ts +8 -0
- package/src/utils/one-shot.ts +73 -0
- package/src/utils/options.ts +37 -8
- package/src/utils/price-history.ts +99 -42
- package/src/utils/sec-eps-basis.ts +24 -11
- package/src/utils/sec.ts +61 -7
- package/src/utils/utc-time.ts +63 -4
- package/src/plugins/builtin/fx-matrix/freshness.ts +0 -65
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/activation.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/ids.ts +0 -0
- /package/src/plugins/{builtin/plugin-marketplace → marketplace}/packs.ts +0 -0
- /package/src/{plugins/builtin/cloud → tickers}/starter-symbols.ts +0 -0
|
@@ -10,6 +10,43 @@ export type GpuTab = typeof GPU_TABS[number]["value"];
|
|
|
10
10
|
export const gpuTab = (value: unknown): GpuTab => GPU_TABS.find((tab) => tab.value === value)?.value ?? "board";
|
|
11
11
|
export const GPU_MODELS = ["H100", "H200", "B200", "B300", "GB200", "GB300", "A100", "MI300X", "MI355X", "L40S", "RTX PRO 6000"];
|
|
12
12
|
export const gpuArgument = (value: string | null | undefined) => (value ?? "").trim().toUpperCase().replace(/\s+/g, " ");
|
|
13
|
+
const gpuModelRank = (name: string) => GPU_MODELS.indexOf(name) < 0 ? 99 : GPU_MODELS.indexOf(name);
|
|
14
|
+
/** Board order: the GPUs people rent most first, the rest by name. */
|
|
15
|
+
const gpuModelOrder = (a: string, b: string) => gpuModelRank(a) - gpuModelRank(b) || a.localeCompare(b);
|
|
16
|
+
|
|
17
|
+
/** Every GPU name a reader can ask for: the ones on this board and the ones the full board carries. */
|
|
18
|
+
export const gpuFamilies = (rows: readonly Pick<GpuObservation, "gpuModel">[]) =>
|
|
19
|
+
[...new Set([...GPU_MODELS, ...rows.map((row) => row.gpuModel)])].sort(gpuModelOrder);
|
|
20
|
+
|
|
21
|
+
/** A GPU name as typed, for comparison: case, spaces, dashes and underscores do not matter. */
|
|
22
|
+
const gpuKey = (value: string) => value.toLowerCase().replace(/[\s_-]+/g, "");
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The GPU a typed name means, so "h100", "H-100" and "H100 80GB SXM" all
|
|
26
|
+
* read H100. A whole name wins over a longer one it begins ("A10" is not
|
|
27
|
+
* A100), and the most leading words that name a GPU win over fewer ("RTX PRO
|
|
28
|
+
* 6000"). Otherwise the first GPU, in board order, whose name begins with
|
|
29
|
+
* what was typed ("B2" is B200), or that begins it ("H100SXM"). Null when
|
|
30
|
+
* nothing matches.
|
|
31
|
+
*/
|
|
32
|
+
export function gpuFamily(query: string, families: readonly string[]): string | null {
|
|
33
|
+
const words = query.trim().split(/[\s_-]+/).filter(Boolean);
|
|
34
|
+
if (!words.length) return null;
|
|
35
|
+
const ordered = [...new Set(families)].sort(gpuModelOrder);
|
|
36
|
+
for (let count = words.length; count > 0; count -= 1) {
|
|
37
|
+
const key = gpuKey(words.slice(0, count).join(""));
|
|
38
|
+
const exact = ordered.find((family) => gpuKey(family) === key);
|
|
39
|
+
if (exact) return exact;
|
|
40
|
+
}
|
|
41
|
+
const key = gpuKey(query);
|
|
42
|
+
return ordered.find((family) => gpuKey(family).startsWith(key))
|
|
43
|
+
?? [...ordered].sort((a, b) => gpuKey(b).length - gpuKey(a).length).find((family) => key.startsWith(gpuKey(family)))
|
|
44
|
+
?? null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The sentence for a name that matches no GPU, naming the ones that do. */
|
|
48
|
+
export const gpuNoMatch = (query: string, families: readonly string[]) =>
|
|
49
|
+
`No GPU matches "${query.trim()}". GPUs: ${families.join(", ")}.`;
|
|
13
50
|
export const gpuBasisLabel = (basis: GpuBasis, compact = false): string => compact
|
|
14
51
|
? ({ list: "List", spot: "Spot", ask: "Ask", reserved: "Rsvd", index: "Locked", reference: "Reference" })[basis]
|
|
15
52
|
: ({ list: "List price", spot: "Provider-declared spot", ask: "Ask", reserved: "Reserved", index: "Index (licensed)", reference: "Reference" })[basis];
|
|
@@ -60,13 +97,31 @@ export function gpuTime(value: string | null | undefined, compact = false): stri
|
|
|
60
97
|
return compact ? `${day} ${time}` : `${day}, ${date.getUTCFullYear()} ${time} UTC`;
|
|
61
98
|
}
|
|
62
99
|
|
|
63
|
-
export function gpuRows(rows: readonly
|
|
100
|
+
export function gpuRows<T extends GpuBoardRow>(rows: readonly T[], model = "", basis = "all"): T[] {
|
|
64
101
|
const rank = (row: GpuBoardRow) => row.providerClass === "aggregate" ? 0 : row.basis === "list" ? 1 : row.basis === "spot" ? 2 : row.basis === "reserved" ? 3 : 4;
|
|
65
|
-
return rows.filter((row) => (!model || row.gpuModel === model) && (basis === "all" || row.basis === basis)).sort((a, b) =>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
102
|
+
return rows.filter((row) => (!model || row.gpuModel === model) && (basis === "all" || row.basis === basis)).sort((a, b) =>
|
|
103
|
+
gpuModelOrder(a.gpuModel, b.gpuModel) || rank(a) - rank(b)
|
|
104
|
+
|| gpuSource(a).localeCompare(gpuSource(b)) || (b.memoryGb ?? 0) - (a.memoryGb ?? 0) || (a.formFactor ?? "").localeCompare(b.formFactor ?? ""));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** A row the free board leaves out, read from the free preview of its GPU: the latest price, with its moves left to Pro. */
|
|
108
|
+
export type GpuPreviewRow = GpuBoardRow & { changesLocked: true };
|
|
109
|
+
export const gpuChangesLocked = (row: GpuBoardRow): row is GpuPreviewRow => (row as Partial<GpuPreviewRow>).changesLocked === true;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The free board carries three rows of one GPU. For another GPU, the latest
|
|
113
|
+
* rows its free history preview serves stand in, one per series; reference
|
|
114
|
+
* indexes stay out, as they do on the board.
|
|
115
|
+
*/
|
|
116
|
+
export function gpuPreviewRows(points: readonly GpuObservation[]): GpuPreviewRow[] {
|
|
117
|
+
const latest = new Map<string, GpuObservation>();
|
|
118
|
+
for (const point of points) {
|
|
119
|
+
if (point.basis === "reference" || point.provenance === "reference" || point.basis === "index") continue;
|
|
120
|
+
const id = `${point.source}:${point.skuKey}`;
|
|
121
|
+
if (!latest.has(id) || point.observedAt > latest.get(id)!.observedAt) latest.set(id, point);
|
|
122
|
+
}
|
|
123
|
+
return [...latest].map(([id, point]) => ({ ...point, id, label: gpuLabel(point), sourceLabel: gpuSource(point),
|
|
124
|
+
change1d: null, change7d: null, change30d: null, stale: false, lastError: null, changesLocked: true }));
|
|
70
125
|
}
|
|
71
126
|
|
|
72
127
|
/** The bases in board order. The licensed index never reaches the board. */
|
|
@@ -105,9 +160,8 @@ export interface GpuBoardSection { id: string; label: string; basis: GpuBasis; g
|
|
|
105
160
|
* sections by basis alone; every model names the model in each heading.
|
|
106
161
|
*/
|
|
107
162
|
export function gpuBoardSections(rows: readonly GpuBoardRow[], model = ""): GpuBoardSection[] {
|
|
108
|
-
const modelRank = (name: string) => GPU_MODELS.indexOf(name) < 0 ? 99 : GPU_MODELS.indexOf(name);
|
|
109
163
|
const ordered = rows.filter((row) => (!model || row.gpuModel === model) && row.basis !== "index").sort((a, b) =>
|
|
110
|
-
|
|
164
|
+
gpuModelOrder(a.gpuModel, b.gpuModel) || basisRank(a.basis) - basisRank(b.basis)
|
|
111
165
|
|| Number(gpuHeadline(b)) - Number(gpuHeadline(a)) || gpuSource(a).localeCompare(gpuSource(b))
|
|
112
166
|
|| (b.memoryGb ?? 0) - (a.memoryGb ?? 0) || (a.formFactor ?? "").localeCompare(b.formFactor ?? ""));
|
|
113
167
|
const sections: GpuBoardSection[] = [];
|
|
@@ -321,18 +375,49 @@ export const GPU_EQUITY_GROUPS = [
|
|
|
321
375
|
{ label: "Neoclouds", roles: ["Neocloud"] }, { label: "Hosts and builders", roles: ["Host", "Server builder"] },
|
|
322
376
|
] as const;
|
|
323
377
|
|
|
324
|
-
|
|
378
|
+
const equityModel = (symbol: string, selectedModel: string) => symbol === "AMD" && !selectedModel.startsWith("MI") ? "MI300X"
|
|
379
|
+
: symbol === "NVDA" && selectedModel.startsWith("MI") ? "H100" : selectedModel;
|
|
380
|
+
|
|
381
|
+
/** The GPUs the Equities tab reads for one selected GPU: AMD reads its own chip, NVIDIA reads H100 beside an AMD chip. */
|
|
382
|
+
export const gpuEquityModels = (selectedModel: string) => [...new Set(GPU_EQUITIES.map(({ symbol }) => equityModel(symbol, selectedModel)))];
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Each share beside the list series that ties it to GPU rents. A share with
|
|
386
|
+
* no series says why: `pro` when the free board leaves its series out,
|
|
387
|
+
* `unlisted` when the board has no such series at all.
|
|
388
|
+
*/
|
|
389
|
+
export function gpuEquityRows(rows: readonly GpuBoardRow[], selectedModel: string, locked = false) {
|
|
325
390
|
return GPU_EQUITIES.map((equity) => {
|
|
326
|
-
const model = equity.symbol
|
|
327
|
-
: equity.symbol === "NVDA" && selectedModel.startsWith("MI") ? "H100" : selectedModel;
|
|
391
|
+
const model = equityModel(equity.symbol, selectedModel);
|
|
328
392
|
const candidates = gpuRows(rows, model, "list");
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
: aggregates.find((row) => row.provider.startsWith("Neocloud")) ?? aggregates[0];
|
|
333
|
-
return { ...equity, gpuModel: model, reference: reference ?? null };
|
|
393
|
+
const reference = ("provider" in equity ? candidates.find((row) => gpuSource(row) === equity.provider) : gpuListIndex(candidates, model)) ?? null;
|
|
394
|
+
const gap: "pro" | "unlisted" | null = reference ? null : locked ? "pro" : "unlisted";
|
|
395
|
+
return { ...equity, gpuModel: model, reference, gap };
|
|
334
396
|
});
|
|
335
397
|
}
|
|
398
|
+
export type GpuEquityRow = ReturnType<typeof gpuEquityRows>[number];
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* A GPU's list index: of its main variant (SXM first, then the most
|
|
402
|
+
* providers, then the most memory), the neocloud index, else the hyperscaler
|
|
403
|
+
* one. The series a share reads in Equities, and the catalog's GPU list indexes.
|
|
404
|
+
*/
|
|
405
|
+
export function gpuListIndex<T extends GpuBoardRow>(rows: readonly T[], model: string): T | null {
|
|
406
|
+
const indexes = gpuRows(rows, model, "list").filter((row) => row.providerClass === "aggregate").sort((a, b) =>
|
|
407
|
+
Number(b.formFactor === "SXM") - Number(a.formFactor === "SXM") || (b.stats?.n ?? 0) - (a.stats?.n ?? 0) || (b.memoryGb ?? 0) - (a.memoryGb ?? 0));
|
|
408
|
+
return indexes.find((row) => row.provider.startsWith("Neocloud")) ?? indexes[0] ?? null;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** The series a share would read, named when it has none: "AWS H100 list", "H100 list index". */
|
|
412
|
+
const gpuEquitySeries = (row: Pick<GpuEquityRow, "gpuModel"> & { provider?: string }) =>
|
|
413
|
+
row.provider ? `${row.provider} ${row.gpuModel} list` : `${row.gpuModel} list index`;
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* The series column of a share with no series: the one Pro unlocks (its price
|
|
417
|
+
* and move cells read Pro), or the one the board does not list.
|
|
418
|
+
*/
|
|
419
|
+
export const gpuEquityGap = (row: GpuEquityRow) => row.gap === "pro" ? gpuEquitySeries(row)
|
|
420
|
+
: row.gap === "unlisted" ? `No ${gpuEquitySeries(row)}` : null;
|
|
336
421
|
|
|
337
422
|
export function equityFiveDayReturn(history: readonly PricePoint[]): { value: number | null; asOf: string | null } {
|
|
338
423
|
const dates = new Map<string, { time: number; close: number }>();
|
|
@@ -3,7 +3,7 @@ import { isAccessDenied } from "../../../api-client/errors";
|
|
|
3
3
|
import { SignInWall } from "../cloud/auth-actions";
|
|
4
4
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
5
5
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
6
|
-
import { useCallback } from "react";
|
|
6
|
+
import { useCallback, useMemo } from "react";
|
|
7
7
|
import { PaneStatusBody, usePaneFooter, usePaneNoticeFooter, usePaneStatusFooter, usePaneTabs } from "../../../components";
|
|
8
8
|
import { usePaneRefreshKey } from "../../../components/data-table/table-pane";
|
|
9
9
|
import { useAsyncResource, useAutoRefresh, usePaneSettingValue, usePluginAppActions, usePluginPaneState } from "../../../public/react";
|
|
@@ -11,11 +11,11 @@ import { usePaneInstance } from "../../../state/app/context";
|
|
|
11
11
|
import type { PaneProps } from "../../../types/plugin";
|
|
12
12
|
import { Box } from "../../../ui";
|
|
13
13
|
import { GpuBoard } from "./board";
|
|
14
|
-
import { getCachedGpuBoard, gpuCacheScope, GPU_NOT_AVAILABLE, loadGpuBoard } from "./client";
|
|
14
|
+
import { getCachedGpuBoard, gpuCacheScope, GPU_NOT_AVAILABLE, gpuPreviewModels, loadGpuBoard, loadGpuModelPreviews } from "./client";
|
|
15
15
|
import { GpuChanges } from "./changes";
|
|
16
16
|
import { GpuEquities } from "./equities";
|
|
17
17
|
import { GpuHistory } from "./history";
|
|
18
|
-
import { GPU_TABS, gpuTab, gpuTime } from "./model";
|
|
18
|
+
import { GPU_TABS, gpuEquityModels, gpuFamilies, gpuFamily, gpuNoMatch, gpuTab, gpuTime } from "./model";
|
|
19
19
|
|
|
20
20
|
export function GpuPane(props: PaneProps) {
|
|
21
21
|
usePlanAccess();
|
|
@@ -34,12 +34,28 @@ function GpuView({ width, height, focused }: PaneProps) {
|
|
|
34
34
|
const resource = useAsyncResource(loadGpuBoard, { initialData: getCachedGpuBoard, clearOnError: isAccessDenied });
|
|
35
35
|
const data = resource.data?.payload;
|
|
36
36
|
const { createPaneFromTemplate } = usePluginAppActions();
|
|
37
|
+
const locked = !!data?.access?.locked;
|
|
38
|
+
const families = useMemo(() => gpuFamilies(data?.rows ?? []), [data]);
|
|
39
|
+
// What was typed ("h-100", "H100 80GB SXM") reads as the GPU it names; a name that matches none stays as typed and says so.
|
|
40
|
+
const activeModel = model ? gpuFamily(model, families) ?? model : "";
|
|
41
|
+
const unknownModel = !!model && !families.includes(activeModel);
|
|
42
|
+
// The free board is one GPU's three rows; another GPU's free preview stands in for the rows it leaves out.
|
|
43
|
+
const previewKey = useMemo(() => data && !unknownModel ? gpuPreviewModels(data, tab === "equities" ? gpuEquityModels(activeModel || "H100")
|
|
44
|
+
: tab === "changes" ? [] : tab === "history" ? [activeModel || "H100"] : [activeModel]).join("\n") : "", [data, unknownModel, tab, activeModel]);
|
|
45
|
+
const previewLoader = useCallback((force: boolean) => loadGpuModelPreviews(previewKey.split("\n"), force), [previewKey]);
|
|
46
|
+
const preview = useAsyncResource(previewKey ? previewLoader : null);
|
|
47
|
+
const rows = useMemo(() => data ? [...data.rows, ...(previewKey ? preview.data ?? [] : [])] : [], [data, previewKey, preview.data]);
|
|
48
|
+
const models = useMemo(() => locked ? [...families].sort() : [...new Set(rows.map((row) => row.gpuModel))].sort(), [locked, families, rows]);
|
|
49
|
+
// A failed preview is the footer's error; the body does not repeat it.
|
|
50
|
+
const emptyTitle = unknownModel ? gpuNoMatch(model, families)
|
|
51
|
+
: preview.error ? `No ${activeModel} rental prices to show.` : `No ${activeModel} rental prices have been observed yet.`;
|
|
37
52
|
useAutoRefresh(resource.updatedAt, resource.load);
|
|
38
|
-
|
|
53
|
+
useAutoRefresh(preview.updatedAt, preview.load);
|
|
54
|
+
usePaneRefreshKey(() => { void resource.reload(); void preview.reload(); }, { focused: focused && (tab === "board" || !data) });
|
|
39
55
|
const signIn = !data && (session.needsVerification || isCloudSessionRequired(resource.error));
|
|
40
56
|
const notAvailable = !data && resource.error === GPU_NOT_AVAILABLE;
|
|
41
|
-
usePaneStatusFooter({ registrationId: "gpu", loading: resource.loading, error: notAvailable || signIn ? null : resource.error,
|
|
42
|
-
stale: !!data && (data.stale || resource.data?.stale), info: data?.asOf ? [{ id: "asof", parts: [{ text: `as of ${gpuTime(data.asOf)}`, tone: "muted" }] }] : [] });
|
|
57
|
+
usePaneStatusFooter({ registrationId: "gpu", loading: resource.loading || preview.loading, error: notAvailable || signIn ? null : resource.error ?? preview.error,
|
|
58
|
+
stale: !!data && (data.stale || resource.data?.stale), info: data?.asOf ? [{ id: "asof", asOf: true, parts: [{ text: `as of ${gpuTime(data.asOf)}`, tone: "muted" }] }] : [] });
|
|
43
59
|
usePaneNoticeFooter({ registrationId: "gpu:notices", focused,
|
|
44
60
|
notices: [...(data?.gaps ?? []), ...(resource.data?.refreshError ? [resource.data.refreshError] : [])] });
|
|
45
61
|
usePaneFooter("gpu:actions", () => ({ info: data?.access?.preview ? [{ id: "preview", parts: [{ text: "Free preview", tone: "muted" }] }] : [],
|
|
@@ -47,17 +63,17 @@ function GpuView({ width, height, focused }: PaneProps) {
|
|
|
47
63
|
onPress: () => createPaneFromTemplate("buildout-pane") }] }), [createPaneFromTemplate, data?.access, upgrade]);
|
|
48
64
|
const { strip, rows: tabRows } = usePaneTabs(data ? { tabs: [...GPU_TABS], activeValue: tab, onSelect: setTab, focused, dense: true } : null);
|
|
49
65
|
const body = { width, height: Math.max(3, height - tabRows), focused };
|
|
50
|
-
const reloadBoard = useCallback(() => { void resource.reload(); }, [resource.reload]);
|
|
66
|
+
const reloadBoard = useCallback(() => { void resource.reload(); void preview.reload(); }, [resource.reload, preview.reload]);
|
|
51
67
|
if (signIn) return <SignInWall placement="gpu" width={width} height={height} action="browse GPU rental prices" needsVerification={session.needsVerification} />;
|
|
52
68
|
return <Box width={width} height={height} flexDirection="column">
|
|
53
69
|
{strip}
|
|
54
|
-
<PaneStatusBody loading={resource.loading && !data} error={!data && !notAvailable ? resource.error : null}
|
|
70
|
+
<PaneStatusBody loading={(resource.loading && !data) || (!!previewKey && preview.loading && !preview.data)} error={!data && !notAvailable ? resource.error : null}
|
|
55
71
|
empty={notAvailable} emptyTitle={GPU_NOT_AVAILABLE} subject="GPU rental prices">
|
|
56
|
-
{data ? tab === "board" ? <GpuBoard rows={
|
|
72
|
+
{data ? tab === "board" ? <GpuBoard rows={rows} models={models} asOf={data.asOf} model={activeModel} setModel={setModel} selectedId={selectedId} emptyTitle={emptyTitle}
|
|
57
73
|
select={(row, open) => { setSelectedId(row.id); if (open) setTab("history"); }} {...body} />
|
|
58
|
-
: tab === "history" ? <GpuHistory rows={
|
|
59
|
-
: tab === "changes" ? <GpuChanges
|
|
60
|
-
: <GpuEquities board={
|
|
74
|
+
: tab === "history" ? <GpuHistory rows={rows} models={models} model={unknownModel ? "" : activeModel} setModel={setModel} selectedId={selectedId} onSelect={setSelectedId} reloadBoard={reloadBoard} {...body} />
|
|
75
|
+
: tab === "changes" ? <GpuChanges models={models} model={unknownModel ? "" : activeModel} setModel={setModel} reloadBoard={reloadBoard} {...body} />
|
|
76
|
+
: <GpuEquities board={rows} models={models} locked={locked} model={unknownModel ? "" : activeModel} setModel={setModel} reloadBoard={reloadBoard} {...body} /> : null}
|
|
61
77
|
</PaneStatusBody>
|
|
62
78
|
</Box>;
|
|
63
79
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
2
|
+
import { cachedSeriesWarning } from "../shared/series-warning";
|
|
3
|
+
import { loadGpuBoard, loadGpuHistory } from "./client";
|
|
4
|
+
import { GPU_MODELS, gpuListIndex } from "./model";
|
|
5
|
+
|
|
6
|
+
/** What the GPU pane says when the free preview leaves history out. */
|
|
7
|
+
const GPU_PRO_ONLY = "Full history is available with Pro.";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Each GPU's list index, the one the GPU pane's Equities tab reads shares
|
|
11
|
+
* against. The per-provider listings stay on the board and its History tab:
|
|
12
|
+
* the server lists them, and they come and go.
|
|
13
|
+
*/
|
|
14
|
+
export const GPU_SERIES: readonly SeriesDefinition[] = GPU_MODELS.map((model): SeriesDefinition => ({
|
|
15
|
+
id: `gpu:${model.toLowerCase().replaceAll(" ", "-")}-list-index`,
|
|
16
|
+
name: `${model} rental list index`,
|
|
17
|
+
unit: "USD/GPU-hour",
|
|
18
|
+
frequency: "intraday",
|
|
19
|
+
group: "Alternative data",
|
|
20
|
+
tags: ["GPU", "rental", "compute", "cloud", "list price", model],
|
|
21
|
+
description: `Median list price to rent one ${model} from neocloud providers (hyperscalers where none list it), chained so a change of providers causes no jump, as GPU charts it. Needs Pro.`,
|
|
22
|
+
style: "step",
|
|
23
|
+
load: async () => {
|
|
24
|
+
const board = await loadGpuBoard();
|
|
25
|
+
if (board.payload.access?.locked) throw new Error(GPU_PRO_ONLY);
|
|
26
|
+
const index = gpuListIndex(board.payload.rows, model);
|
|
27
|
+
if (!index) throw new Error(`No ${model} list index is listed yet.`);
|
|
28
|
+
const history = await loadGpuHistory(index.id);
|
|
29
|
+
if (history.payload.access?.locked) throw new Error(GPU_PRO_ONLY);
|
|
30
|
+
const warning = cachedSeriesWarning(history);
|
|
31
|
+
return {
|
|
32
|
+
points: history.payload.points
|
|
33
|
+
.filter((point) => `${point.source}:${point.skuKey}` === index.id)
|
|
34
|
+
.map((point) => ({ date: point.observedAt, value: point.pricePerGpuHr })),
|
|
35
|
+
...(warning ? { warning } : {}),
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
}));
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* The help card for one function, opened by `HELP <fn>` in the command bar
|
|
3
3
|
* and F1 on a focused pane: what it answers, how to type it, the keys that
|
|
4
4
|
* matter in its pane, how fresh its data is on each plan, its Bloomberg
|
|
5
|
-
* equivalent and its docs entry. Enter
|
|
6
|
-
*
|
|
5
|
+
* equivalent and its docs entry. Enter reads the entry in DOCS, inside the
|
|
6
|
+
* app; the link beside it is the same entry on gloom.sh, in the browser. A
|
|
7
|
+
* popped-out window cannot open a pane, so there Enter opens the link. Esc,
|
|
8
|
+
* the close button or a click outside closes it.
|
|
7
9
|
*
|
|
8
10
|
* `useFunctionHelpHost` is mounted with the app's global shortcuts for the
|
|
9
11
|
* life of the window and owns the dialog; `requestFunctionHelp` lets the
|
|
@@ -13,7 +15,9 @@ import { useEffect, useRef, type ReactNode } from "react";
|
|
|
13
15
|
import { usePlanAccess } from "../../../api-client/plan-access";
|
|
14
16
|
import { functionDocsUrl, type FunctionFreshness, type FunctionHelpKey } from "../../../cli/pane-functions/function-help";
|
|
15
17
|
import { requestFeedbackDialog } from "../../../components/feedback-dialog";
|
|
18
|
+
import { Button } from "../../../components/ui/button";
|
|
16
19
|
import { ExternalLink } from "../../../components/ui/external-link";
|
|
20
|
+
import { DOCS_PANE_TEMPLATE_ID } from "../../../docs/content";
|
|
17
21
|
import { DialogFrame } from "../../../components/ui/frame";
|
|
18
22
|
import { ShortcutHint } from "../../../components/ui/shortcut-hint";
|
|
19
23
|
import { t } from "../../../i18n";
|
|
@@ -21,10 +25,12 @@ import { useViewport } from "../../../react/input";
|
|
|
21
25
|
import { useThemeColors } from "../../../theme/theme-context";
|
|
22
26
|
import { Box, Text, TextAttributes, useRendererHost } from "../../../ui";
|
|
23
27
|
import { useDialog, useDialogKeyboard, type AlertContext } from "../../../ui/dialog";
|
|
28
|
+
import { getSharedRegistry } from "../../registry";
|
|
24
29
|
import type { HelpFunction } from "./function-index";
|
|
25
30
|
|
|
26
31
|
export type FunctionHelpRequest =
|
|
27
|
-
|
|
32
|
+
/** `inAppDocs: false` where DOCS cannot open (a popped-out window). */
|
|
33
|
+
| { kind: "function"; fn: HelpFunction; inAppDocs?: boolean }
|
|
28
34
|
/** `HELP HELP`: the feedback dialog, which is how people reach us. */
|
|
29
35
|
| { kind: "support" };
|
|
30
36
|
|
|
@@ -103,9 +109,10 @@ function FreshnessRows({ data, pro }: { data: FunctionFreshness; pro: boolean })
|
|
|
103
109
|
);
|
|
104
110
|
}
|
|
105
111
|
|
|
106
|
-
function FunctionHelpCard({ fn, dismiss, dialogId, width, compact = false }: AlertContext & {
|
|
112
|
+
function FunctionHelpCard({ fn, dismiss, dialogId, width, compact = false, inAppDocs = true }: AlertContext & {
|
|
107
113
|
fn: HelpFunction;
|
|
108
114
|
width: number;
|
|
115
|
+
inAppDocs?: boolean;
|
|
109
116
|
/** A short terminal: no blank row between the summary and the rows. */
|
|
110
117
|
compact?: boolean;
|
|
111
118
|
}) {
|
|
@@ -117,6 +124,10 @@ function FunctionHelpCard({ fn, dismiss, dialogId, width, compact = false }: Ale
|
|
|
117
124
|
void rendererHost.openExternal(url);
|
|
118
125
|
dismiss();
|
|
119
126
|
};
|
|
127
|
+
const readInApp = () => {
|
|
128
|
+
getSharedRegistry()?.createPaneFromTemplate(DOCS_PANE_TEMPLATE_ID, { arg: fn.code });
|
|
129
|
+
dismiss();
|
|
130
|
+
};
|
|
120
131
|
|
|
121
132
|
useDialogKeyboard((event) => {
|
|
122
133
|
if (event.ctrl || event.alt || event.meta || event.super) return;
|
|
@@ -124,7 +135,8 @@ function FunctionHelpCard({ fn, dismiss, dialogId, width, compact = false }: Ale
|
|
|
124
135
|
if (name !== "enter" && name !== "return") return;
|
|
125
136
|
event.preventDefault();
|
|
126
137
|
event.stopPropagation();
|
|
127
|
-
|
|
138
|
+
if (inAppDocs) readInApp();
|
|
139
|
+
else openDocs();
|
|
128
140
|
}, { scope: dialogId });
|
|
129
141
|
|
|
130
142
|
const help = fn.help;
|
|
@@ -153,6 +165,11 @@ function FunctionHelpCard({ fn, dismiss, dialogId, width, compact = false }: Ale
|
|
|
153
165
|
</CardRow>
|
|
154
166
|
)}
|
|
155
167
|
<CardRow label="Docs">
|
|
168
|
+
{inAppDocs && (
|
|
169
|
+
<Box flexDirection="row">
|
|
170
|
+
<Button label="Read in Docs" shortcut="Enter" compact onPress={readInApp} stopPropagation />
|
|
171
|
+
</Box>
|
|
172
|
+
)}
|
|
156
173
|
<ExternalLink url={docsUrl} label={docsUrl.replace(/^https:\/\//, "")} onOpen={openDocs} />
|
|
157
174
|
</CardRow>
|
|
158
175
|
</Box>
|
|
@@ -189,7 +206,9 @@ export function useFunctionHelpHost({ closeCommandBar }: { closeCommandBar: () =
|
|
|
189
206
|
closeOnClickOutside: true,
|
|
190
207
|
// The terminal host defaults to 60 columns; the desktop sizes to the content.
|
|
191
208
|
style: { width: width + TERMINAL_DIALOG_CHROME, ...(compact ? { paddingY: 0 } : {}) },
|
|
192
|
-
content: (context: AlertContext) =>
|
|
209
|
+
content: (context: AlertContext) => (
|
|
210
|
+
<FunctionHelpCard {...context} fn={request.fn} width={width} compact={compact} inAppDocs={request.inAppDocs !== false} />
|
|
211
|
+
),
|
|
193
212
|
}).catch(() => {}).finally(() => {
|
|
194
213
|
openRef.current = false;
|
|
195
214
|
});
|
|
@@ -61,6 +61,8 @@ function withHelp(fn: Omit<HelpFunction, "help">): HelpFunction {
|
|
|
61
61
|
export function buildHelpFunctionIndex(sources: HelpFunctionSources): HelpFunctionIndex {
|
|
62
62
|
const functions: HelpFunction[] = [];
|
|
63
63
|
for (const command of sources.commands ?? builtInCommands) {
|
|
64
|
+
// Search phrases on an action without a mnemonic are not standalone functions.
|
|
65
|
+
if (!command.prefix.trim()) continue;
|
|
64
66
|
const [code, ...aliases] = getCommandPrefixes(command);
|
|
65
67
|
if (!code) continue;
|
|
66
68
|
functions.push(withHelp({
|
|
@@ -8,10 +8,11 @@ import { Box, ScrollBox, Text, useRendererHost, useUiHost } from "../../../ui";
|
|
|
8
8
|
import { detectShortcutPlatform, formatPrimaryShortcut, getShortcutDisplayMode } from "../../../utils/shortcut-labels";
|
|
9
9
|
import { getSharedRegistry } from "../../registry";
|
|
10
10
|
import { apiClient, type CloudPricing } from "../../../api-client";
|
|
11
|
-
import { trialDaysOf } from "
|
|
11
|
+
import { trialDaysOf } from "../../../account/billing";
|
|
12
12
|
import { usePluginAppActions, usePluginPaneState } from "../../runtime";
|
|
13
13
|
import type { PluginModule } from "../plugin-module";
|
|
14
14
|
import { requestFeedbackDialog } from "../../../components/feedback-dialog";
|
|
15
|
+
import { DOCS_PANE_TEMPLATE_ID } from "../../../docs/content";
|
|
15
16
|
import { FeedbackTab } from "./feedback-tab";
|
|
16
17
|
import { FunctionsTable } from "./functions-table";
|
|
17
18
|
import { KeybindingsEditor } from "./keybindings-editor";
|
|
@@ -36,7 +37,7 @@ function entry(id: string, badges: string[], description: string): ShortcutTable
|
|
|
36
37
|
|
|
37
38
|
function HelpPane({ focused, width, height }: PaneProps) {
|
|
38
39
|
const registry = getSharedRegistry();
|
|
39
|
-
const { openCommandBar, showPane } = usePluginAppActions();
|
|
40
|
+
const { openCommandBar, showPane, createPaneFromTemplate } = usePluginAppActions();
|
|
40
41
|
// A key capture requested from the command bar belongs to the Shortcuts
|
|
41
42
|
// tab, whether the pane is already open or is being opened for it.
|
|
42
43
|
const [activeTabId, setActiveTabId] = usePluginPaneState<HelpTabId>("activeTab", "basics");
|
|
@@ -56,6 +57,7 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
56
57
|
const windowMoveBadges = actionBadges("window-move-mode");
|
|
57
58
|
const windowResizeBadges = actionBadges("window-resize-mode");
|
|
58
59
|
const functionHelpBadges = actionBadges("function-help");
|
|
60
|
+
const askBadges = actionBadges("pane-ask");
|
|
59
61
|
useEffect(() => subscribeKeybindingCapture(() => setActiveTabId("shortcuts")), []);
|
|
60
62
|
const copyBadges = shortcutDisplayMode === "terminal" ? ["Ctrl+Shift+C"] : [platformShortcut("C")];
|
|
61
63
|
const pasteBadges = shortcutDisplayMode === "terminal" ? ["Ctrl+Shift+V"] : [platformShortcut("V")];
|
|
@@ -100,6 +102,10 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
100
102
|
openCommandBar("PL ");
|
|
101
103
|
}, [openCommandBar]);
|
|
102
104
|
|
|
105
|
+
const openDocs = useCallback(() => {
|
|
106
|
+
createPaneFromTemplate(DOCS_PANE_TEMPLATE_ID);
|
|
107
|
+
}, [createPaneFromTemplate]);
|
|
108
|
+
|
|
103
109
|
const openIssues = useCallback(() => {
|
|
104
110
|
void rendererHost.openExternal(GLOOMBERB_ISSUES_URL);
|
|
105
111
|
}, [rendererHost]);
|
|
@@ -107,7 +113,10 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
107
113
|
// Each tab's actions. `l` moves between tabs, so layout actions take `a`.
|
|
108
114
|
const tabHints = useMemo<PaneHint[]>(() => {
|
|
109
115
|
if (activeTabId === "basics") {
|
|
110
|
-
return [
|
|
116
|
+
return [
|
|
117
|
+
{ id: "docs", key: "d", label: "ocs", title: "Open Docs", onPress: openDocs },
|
|
118
|
+
{ id: "layout-actions", key: "a", label: " layout actions", title: "Layout Actions", onPress: openLayoutActions },
|
|
119
|
+
];
|
|
111
120
|
}
|
|
112
121
|
if (activeTabId === "functions") {
|
|
113
122
|
return [{ id: "plugins", key: "p", label: "lugins", title: "Manage Plugins", onPress: openPluginManager }];
|
|
@@ -120,7 +129,7 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
120
129
|
];
|
|
121
130
|
}
|
|
122
131
|
return [];
|
|
123
|
-
}, [activeTabId, openDebugLog, openIssues, openLayoutActions, openPluginManager]);
|
|
132
|
+
}, [activeTabId, openDebugLog, openDocs, openIssues, openLayoutActions, openPluginManager]);
|
|
124
133
|
|
|
125
134
|
// The footer binds each hint's key; a search field keeps its typing.
|
|
126
135
|
usePaneFooter("help:tab", () => tabHints.length > 0 ? { hints: tabHints } : null, [tabHints]);
|
|
@@ -152,6 +161,7 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
152
161
|
: []),
|
|
153
162
|
entry("des", ["DES", "<ticker>"], "Open security details for a specific ticker."),
|
|
154
163
|
entry("help-card", ["HELP", "<function>"], "Open a function's help card: what it shows, its keys, how fresh its data is. HELP HELP reaches support."),
|
|
164
|
+
entry("docs", ["DOCS", "<function>"], "Read the docs and Academy lessons in the app. The ? on a pane opens its entry."),
|
|
155
165
|
entry("upgrade", ["UPGRADE"], tf("Go Pro for real-time data at gloom.sh/cloud, free for {days} days.", { days: trialDays })),
|
|
156
166
|
entry("mcp", ["MCP"], "Connect Claude Code, Codex, Cursor or any MCP client to Gloom's research tools."),
|
|
157
167
|
entry("move", ["Up/Down", "Ctrl+P/N"], "Move through command bar results."),
|
|
@@ -175,9 +185,13 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
175
185
|
entry("back", ["Esc", "Backspace"], "Go back from a detail view."),
|
|
176
186
|
entry("pane-menu", actionBadges("pane-menu"), "Open the focused pane's menu: every action in the pane with its key, sorting, filters, tabs, toggles and the pane actions."),
|
|
177
187
|
...(functionHelpBadges.length > 0
|
|
178
|
-
? [entry("function-help", functionHelpBadges, "Open the focused pane's help card
|
|
188
|
+
? [entry("function-help", functionHelpBadges, "Open the focused pane's help card; Enter reads its docs.")]
|
|
189
|
+
: []),
|
|
190
|
+
...(askBadges.length > 0
|
|
191
|
+
? [entry("ask-gloom", askBadges, "Ask Gloom about the focused pane, in a new conversation with the pane attached. Also Ask Gloom in the pane menu.")]
|
|
179
192
|
: []),
|
|
180
193
|
entry("search", ["/"], "Search in the focused pane."),
|
|
194
|
+
entry("sidebar", ["<", ">"], "Narrow or widen the list beside the content, as in MAP and ASKG."),
|
|
181
195
|
entry("warnings", ["!"], "Open the focused pane's data warnings."),
|
|
182
196
|
entry("notification", [...actionBadges("notification-action"), ...actionBadges("notification-dismiss")], "Run or dismiss the newest notification."),
|
|
183
197
|
],
|
|
@@ -215,6 +229,14 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
215
229
|
entry("zoom-keys", ["+/-", "0"], "Zoom the focused chart in or out, or reset it."),
|
|
216
230
|
],
|
|
217
231
|
},
|
|
232
|
+
{
|
|
233
|
+
label: "Map",
|
|
234
|
+
items: [
|
|
235
|
+
entry("map-pan", ["m", "Arrows"], "Give the arrow keys to the map and pan it; Shift pans further, Esc gives them back to the list."),
|
|
236
|
+
entry("map-zoom", ["+/-", "0"], "Zoom the map in or out, or reset it."),
|
|
237
|
+
entry("map-pointer", ["Scroll", "Pinch"], "Zoom the map around the pointer; drag to pan, double-click to zoom in."),
|
|
238
|
+
],
|
|
239
|
+
},
|
|
218
240
|
{
|
|
219
241
|
label: "Clipboard",
|
|
220
242
|
items: [
|
|
@@ -246,7 +268,7 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
246
268
|
entry("commit", ["Enter", "Esc"], "Commit pending changes or exit window mode."),
|
|
247
269
|
],
|
|
248
270
|
},
|
|
249
|
-
], [copyBadges, functionHelpBadges, pasteBadges, windowMoveBadges, windowResizeBadges]);
|
|
271
|
+
], [askBadges, copyBadges, functionHelpBadges, pasteBadges, windowMoveBadges, windowResizeBadges]);
|
|
250
272
|
|
|
251
273
|
const renderContent = () => {
|
|
252
274
|
switch (activeTabId) {
|
|
@@ -267,11 +289,11 @@ function HelpPane({ focused, width, height }: PaneProps) {
|
|
|
267
289
|
<SectionHeading title="How To Use Gloomberb" />
|
|
268
290
|
<Box flexDirection="column">
|
|
269
291
|
<Text fg={colors.textDim}>{t("Gloomberb is command-bar first.")}</Text>
|
|
270
|
-
<Text fg={colors.textDim}>{t("
|
|
292
|
+
<Text fg={colors.textDim} wrapText>{t("Click anything to use it; the keys shown beside actions are shortcuts.")}</Text>
|
|
271
293
|
<Text fg={colors.textDim} wrapText>
|
|
272
294
|
{commandBarBadges[0]
|
|
273
|
-
? tf("Not sure of a code?
|
|
274
|
-
: t("Not sure of a code?
|
|
295
|
+
? tf("Not sure of a code? Click the search bar at the top, or press {key}, and type what you want in plain words, like \"apple earnings\". The Functions tab lists everything.", { key: commandBarBadges[0] })
|
|
296
|
+
: t("Not sure of a code? Click the search bar at the top and type what you want in plain words, like \"apple earnings\". The Functions tab lists everything.")}
|
|
275
297
|
</Text>
|
|
276
298
|
</Box>
|
|
277
299
|
</Box>
|