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
package/src/api-client/socket.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
AuthUser,
|
|
4
4
|
ChatMessage,
|
|
5
5
|
ChatNotification,
|
|
6
|
+
ChatReactionsUpdate,
|
|
6
7
|
CloudQuotePayload,
|
|
7
8
|
QuoteStreamTarget,
|
|
8
9
|
ScannerFeedEvent,
|
|
@@ -12,6 +13,7 @@ import type {
|
|
|
12
13
|
import {
|
|
13
14
|
normalizeChatMessage,
|
|
14
15
|
normalizeChatNotification,
|
|
16
|
+
normalizeChatReactions,
|
|
15
17
|
normalizeTeamNotification,
|
|
16
18
|
} from "./normalizers";
|
|
17
19
|
import { debugLog } from "../utils/debug-log";
|
|
@@ -41,6 +43,7 @@ const cloudApiLog = debugLog.createLogger("cloud-api");
|
|
|
41
43
|
type ChannelListener = (message: ChatMessage) => void;
|
|
42
44
|
type ChatNotificationListener = (notification: ChatNotification) => void;
|
|
43
45
|
type ChatPresenceListener = (onlineCount: number) => void;
|
|
46
|
+
type ChatReactionsListener = (update: ChatReactionsUpdate) => void;
|
|
44
47
|
type TeamNotificationListener = (notification: TeamNotification) => void;
|
|
45
48
|
type CloudEventListener = (data: unknown) => void;
|
|
46
49
|
type QuoteListener = (
|
|
@@ -106,6 +109,7 @@ export class CloudApiSocket {
|
|
|
106
109
|
private readonly chatNotificationListeners =
|
|
107
110
|
new Set<ChatNotificationListener>();
|
|
108
111
|
private readonly chatPresenceListeners = new Set<ChatPresenceListener>();
|
|
112
|
+
private readonly chatReactionsListeners = new Set<ChatReactionsListener>();
|
|
109
113
|
private readonly teamNotificationListeners =
|
|
110
114
|
new Set<TeamNotificationListener>();
|
|
111
115
|
private readonly cloudEventListeners = new Map<
|
|
@@ -245,6 +249,14 @@ export class CloudApiSocket {
|
|
|
245
249
|
};
|
|
246
250
|
}
|
|
247
251
|
|
|
252
|
+
/** A message's reactions changed in a channel this socket reads. */
|
|
253
|
+
subscribeChatReactions(listener: ChatReactionsListener): () => void {
|
|
254
|
+
this.chatReactionsListeners.add(listener);
|
|
255
|
+
return () => {
|
|
256
|
+
this.chatReactionsListeners.delete(listener);
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
248
260
|
subscribeChatPresence(listener: ChatPresenceListener): () => void {
|
|
249
261
|
this.chatPresenceListeners.add(listener);
|
|
250
262
|
return () => {
|
|
@@ -500,6 +512,7 @@ export class CloudApiSocket {
|
|
|
500
512
|
this.connectionListeners.clear();
|
|
501
513
|
this.chatNotificationListeners.clear();
|
|
502
514
|
this.chatPresenceListeners.clear();
|
|
515
|
+
this.chatReactionsListeners.clear();
|
|
503
516
|
this.teamNotificationListeners.clear();
|
|
504
517
|
this.cloudEventListeners.clear();
|
|
505
518
|
this.quoteSubscriptions.clear();
|
|
@@ -575,6 +588,22 @@ export class CloudApiSocket {
|
|
|
575
588
|
return;
|
|
576
589
|
}
|
|
577
590
|
|
|
591
|
+
if (
|
|
592
|
+
parsed?.type === "chat.reactions" &&
|
|
593
|
+
typeof parsed.channelId === "string" &&
|
|
594
|
+
typeof parsed.data?.messageId === "string"
|
|
595
|
+
) {
|
|
596
|
+
const update: ChatReactionsUpdate = {
|
|
597
|
+
channelId: parsed.channelId,
|
|
598
|
+
messageId: parsed.data.messageId,
|
|
599
|
+
reactions: normalizeChatReactions(parsed.data.reactions),
|
|
600
|
+
};
|
|
601
|
+
for (const listener of this.chatReactionsListeners) {
|
|
602
|
+
listener(update);
|
|
603
|
+
}
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
|
|
578
607
|
if (parsed?.type === "chat.notification" && parsed.data) {
|
|
579
608
|
const notification = normalizeChatNotification(
|
|
580
609
|
parsed.data as ChatNotification,
|
package/src/api-client/themes.ts
CHANGED
|
@@ -15,6 +15,12 @@ export interface ThemeSummary {
|
|
|
15
15
|
worst: { symbol: string; changePercent: number } | null;
|
|
16
16
|
stale: boolean;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A member's figures. `price`, `changePercent` and the returns are the regular
|
|
20
|
+
* session's: outside it, its close and that close's move. The extended fields
|
|
21
|
+
* are the pre-market or after-hours print measured from that close; a server
|
|
22
|
+
* sends them only when there is one, and older servers never do.
|
|
23
|
+
*/
|
|
18
24
|
export interface ThemeMember extends Record<ThemePeriod | "price", number | null> {
|
|
19
25
|
symbol: string;
|
|
20
26
|
name: string | null;
|
|
@@ -22,7 +28,22 @@ export interface ThemeMember extends Record<ThemePeriod | "price", number | null
|
|
|
22
28
|
present: boolean;
|
|
23
29
|
asOf: Record<ThemePeriod | "price", string | null>;
|
|
24
30
|
stale: boolean;
|
|
31
|
+
extendedSession?: "PRE" | "POST" | null;
|
|
32
|
+
extendedPrice?: number | null;
|
|
33
|
+
extendedChange?: number | null;
|
|
34
|
+
extendedChangePercent?: number | null;
|
|
35
|
+
}
|
|
36
|
+
interface SnapshotMetadata {
|
|
37
|
+
/** When the server put the snapshot together, not a trade time. */
|
|
38
|
+
asOf: string;
|
|
39
|
+
snapshotId: string;
|
|
40
|
+
stale: boolean;
|
|
41
|
+
/** The US market as the server's delayed board reads it. Absent from older servers. */
|
|
42
|
+
session?: "PRE" | "REGULAR" | "POST" | "CLOSED" | null;
|
|
43
|
+
/** Outside the regular session, the completed session every figure describes; null while one trades. */
|
|
44
|
+
regularSessionDate?: string | null;
|
|
45
|
+
/** When that session closed, in epoch milliseconds (13:00 New York on an early close). */
|
|
46
|
+
regularSessionClosedAt?: number | null;
|
|
25
47
|
}
|
|
26
|
-
interface SnapshotMetadata { asOf: string; snapshotId: string; stale: boolean }
|
|
27
48
|
export interface ThemesPayload extends SnapshotMetadata { themes: ThemeSummary[] }
|
|
28
49
|
export interface ThemeMembersPayload extends SnapshotMetadata { theme: ThemeSummary; members: ThemeMember[] }
|
package/src/api-client/types.ts
CHANGED
|
@@ -49,6 +49,33 @@ export interface ChatAttachment {
|
|
|
49
49
|
url: string;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/** Someone who reacted, as a reaction lists the first few. */
|
|
53
|
+
export interface ChatReactionUser {
|
|
54
|
+
id: string;
|
|
55
|
+
username: string | null;
|
|
56
|
+
displayName: string;
|
|
57
|
+
accountType?: ChatAccountType | null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* One emoji on a message: how many reacted, whether you did, and the first
|
|
62
|
+
* few who did, oldest first. `emoji` is the character, or `:name:` for a
|
|
63
|
+
* custom Discord server emoji.
|
|
64
|
+
*/
|
|
65
|
+
export interface ChatReaction {
|
|
66
|
+
emoji: string;
|
|
67
|
+
count: number;
|
|
68
|
+
me: boolean;
|
|
69
|
+
users?: ChatReactionUser[];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A message's reactions as they stand after a change, from the `chat.reactions` frame or a reaction request. */
|
|
73
|
+
export interface ChatReactionsUpdate {
|
|
74
|
+
channelId: string;
|
|
75
|
+
messageId: string;
|
|
76
|
+
reactions: ChatReaction[];
|
|
77
|
+
}
|
|
78
|
+
|
|
52
79
|
export interface ChatMessage {
|
|
53
80
|
id: string;
|
|
54
81
|
channelId: string;
|
|
@@ -66,6 +93,12 @@ export interface ChatMessage {
|
|
|
66
93
|
} | null;
|
|
67
94
|
/** Images in display order. A server that predates them leaves this out. */
|
|
68
95
|
attachments?: ChatAttachment[];
|
|
96
|
+
/**
|
|
97
|
+
* Emoji reactions in the order they first appeared. Message lists from a
|
|
98
|
+
* server that knows reactions always carry it; a live copy of a message
|
|
99
|
+
* (an edit) leaves it out, and the reactions held stay.
|
|
100
|
+
*/
|
|
101
|
+
reactions?: ChatReaction[];
|
|
69
102
|
/**
|
|
70
103
|
* Only on the author's copy of a public message whose images are still being
|
|
71
104
|
* checked ("pending") or could not be checked ("failed"). Nobody else has the
|
|
@@ -402,6 +435,10 @@ export interface CloudPricePointPayload {
|
|
|
402
435
|
low?: number;
|
|
403
436
|
close: number;
|
|
404
437
|
volume?: number;
|
|
438
|
+
/** A coin's daily bar for the UTC day still forming when served; it has no volume yet. */
|
|
439
|
+
partial?: boolean;
|
|
440
|
+
/** A coin's daily bar whose prices were rebuilt from hourly bars; a day the source left empty has no volume. */
|
|
441
|
+
filled?: boolean;
|
|
405
442
|
}
|
|
406
443
|
|
|
407
444
|
type CloudEconImpact = "high" | "medium" | "low";
|
|
@@ -432,6 +469,13 @@ export interface CloudMacroReleaseDaysPayload {
|
|
|
432
469
|
export interface CloudFredObservationPayload {
|
|
433
470
|
date: string;
|
|
434
471
|
value: number | null;
|
|
472
|
+
/**
|
|
473
|
+
* Who published a value FRED does not list yet, such as a Treasury yield
|
|
474
|
+
* Gloom Cloud read from the Treasury first. Absent on FRED's own values.
|
|
475
|
+
*/
|
|
476
|
+
publisher?: string;
|
|
477
|
+
/** When that publisher's value was first read, ISO in UTC. */
|
|
478
|
+
publishedAt?: string;
|
|
435
479
|
}
|
|
436
480
|
|
|
437
481
|
export interface CloudFredSeriesInfoPayload {
|
|
@@ -538,6 +582,22 @@ export interface CloudCdsHistoryResponse {
|
|
|
538
582
|
points: CloudCdsHistoryPointPayload[];
|
|
539
583
|
}
|
|
540
584
|
|
|
585
|
+
/** An issuer's latest 5Y level: the last point of its history over the last month. */
|
|
586
|
+
export interface CloudCdsLevelPayload {
|
|
587
|
+
/** The reference entity as the history response names it. */
|
|
588
|
+
issuer: string;
|
|
589
|
+
spreadBp: number;
|
|
590
|
+
date: string;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
export interface CloudCdsLevelsResponse {
|
|
594
|
+
source: string;
|
|
595
|
+
tenor: string;
|
|
596
|
+
asOf: string | null;
|
|
597
|
+
/** Every issuer traded in the last month whose 5Y line has a level in it. */
|
|
598
|
+
levels: CloudCdsLevelPayload[];
|
|
599
|
+
}
|
|
600
|
+
|
|
541
601
|
interface CloudShortInterestPointPayload {
|
|
542
602
|
settlementDate: string;
|
|
543
603
|
shortPercentFloat?: number | null;
|
|
@@ -1098,7 +1158,7 @@ export interface CloudSearchResponse {
|
|
|
1098
1158
|
tookMs: number;
|
|
1099
1159
|
}
|
|
1100
1160
|
|
|
1101
|
-
|
|
1161
|
+
interface CloudSearchDocumentChunk {
|
|
1102
1162
|
id: string;
|
|
1103
1163
|
chunkIndex: number;
|
|
1104
1164
|
body: string;
|
|
@@ -1383,6 +1443,8 @@ export interface CloudMarketResponse<T> {
|
|
|
1383
1443
|
historySession?: unknown;
|
|
1384
1444
|
/** "extended" when the history includes the pre-market and after-hours bars asked for. */
|
|
1385
1445
|
session?: unknown;
|
|
1446
|
+
/** "1day" when daily bars answer an intraday range: the listing has no intraday bars. */
|
|
1447
|
+
servedResolution?: unknown;
|
|
1386
1448
|
/** Untrusted until the history adapter validates its boundary dates. */
|
|
1387
1449
|
coverage?: CloudHistoryCoverage;
|
|
1388
1450
|
providerMeta?: {
|
|
@@ -1427,13 +1489,27 @@ export interface CloudMarketBatchPayload<T> {
|
|
|
1427
1489
|
|
|
1428
1490
|
export type CloudMarketScreenerCategory = "gainers" | "losers" | "most-active";
|
|
1429
1491
|
|
|
1430
|
-
|
|
1492
|
+
/**
|
|
1493
|
+
* A movers row's quote sessions, under the quote's field names and meaning:
|
|
1494
|
+
* the session it was read in, the day its change is dated to, the last
|
|
1495
|
+
* completed regular session's close and move, and an open pre-market or
|
|
1496
|
+
* after-hours print with its move from that close. Older servers send none.
|
|
1497
|
+
*/
|
|
1498
|
+
export type CloudMoverSessionFields = Partial<Pick<Quote,
|
|
1499
|
+
| "marketState" | "changeSessionDate"
|
|
1500
|
+
| "regularClose" | "regularCloseSessionDate" | "regularChange" | "regularChangePercent"
|
|
1501
|
+
| "preMarketPrice" | "preMarketChange" | "preMarketChangePercent"
|
|
1502
|
+
| "postMarketPrice" | "postMarketChange" | "postMarketChangePercent">>;
|
|
1503
|
+
|
|
1504
|
+
/** price, change and changePercent are the live print the list is ranked by; the session fields say how it reads. */
|
|
1505
|
+
export interface CloudMarketScreenerItem extends CloudMoverSessionFields {
|
|
1431
1506
|
rank: number;
|
|
1432
1507
|
symbol: string;
|
|
1433
1508
|
name: string;
|
|
1434
1509
|
price: number;
|
|
1435
1510
|
change: number;
|
|
1436
1511
|
changePercent: number;
|
|
1512
|
+
previousClose?: number;
|
|
1437
1513
|
volume: number;
|
|
1438
1514
|
/** Available average volume for this listing, independent of public ranking membership. */
|
|
1439
1515
|
avgVolume?: number;
|
|
@@ -36,6 +36,14 @@ export interface CloudCurveView {
|
|
|
36
36
|
checkedAt: string | null;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/** One tenor of a stored curve over time, oldest first (`GET /cloud/econ/curves/:curve/history`). */
|
|
40
|
+
export interface CloudCurveHistory {
|
|
41
|
+
curve: CloudCurveHeader;
|
|
42
|
+
tenor: string;
|
|
43
|
+
points: Array<{ date: string; value: number }>;
|
|
44
|
+
checkedAt: string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
39
47
|
export interface CloudWorldCurves {
|
|
40
48
|
curves: Array<{
|
|
41
49
|
curve: CloudCurveHeader;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect, useRef, type Dispatch } from "react";
|
|
1
|
+
import { useEffect, useRef, useState, type Dispatch } from "react";
|
|
2
2
|
import { useShortcut } from "../react/input";
|
|
3
3
|
import { useNativeRenderer, useRendererHost, useUiHost } from "../ui";
|
|
4
4
|
import { useDialogState } from "../ui/dialog";
|
|
@@ -13,6 +13,9 @@ import { getVisiblePaneCycleOrder } from "../components/layout/pane/cycle-order"
|
|
|
13
13
|
import { requestFunctionHelp, useFunctionHelpHost } from "../plugins/builtin/help/function-card";
|
|
14
14
|
import { buildRegistryHelpIndex, helpFunctionForPane } from "../plugins/builtin/help/function-index";
|
|
15
15
|
import { recordFunctionOpen } from "../telemetry/usage-counts";
|
|
16
|
+
import { createOneShots } from "../utils/one-shot";
|
|
17
|
+
import { DOCS_PANE_TEMPLATE_ID } from "../docs/content";
|
|
18
|
+
import { registerPaneDocsHandler } from "../docs/requests";
|
|
16
19
|
import { isMoveDownShortcut, isMoveUpShortcut } from "../components/command-bar/keyboard-handlers";
|
|
17
20
|
import { pressStarPromptKey } from "./star-prompt/runtime";
|
|
18
21
|
import {
|
|
@@ -115,11 +118,27 @@ export function useAppGlobalShortcuts({
|
|
|
115
118
|
const uiKind = useUiHost().kind;
|
|
116
119
|
const toastHost = useToastHost();
|
|
117
120
|
useKeybindingIssueNotice(keybindings, pluginRegistry, state.initialized);
|
|
121
|
+
// Every action here runs once per press: a held key, or a terminal that does
|
|
122
|
+
// not say it is a repeat, must not run it again. Only moving focus between
|
|
123
|
+
// panes (Tab) and switching layouts by number (idempotent) are left to repeat.
|
|
124
|
+
const [shots] = useState(createOneShots);
|
|
118
125
|
useFunctionHelpHost({
|
|
119
126
|
closeCommandBar: () => {
|
|
120
127
|
if (state.commandBarOpen) dispatch({ type: "SET_COMMAND_BAR", open: false });
|
|
121
128
|
},
|
|
122
129
|
});
|
|
130
|
+
const layoutRef = useRef(state.config.layout);
|
|
131
|
+
layoutRef.current = state.config.layout;
|
|
132
|
+
// A pane's `?`: its entry in DOCS, or its help card where no pane can open.
|
|
133
|
+
useEffect(() => registerPaneDocsHandler((paneId) => {
|
|
134
|
+
if (!isDetachedWindow) {
|
|
135
|
+
pluginRegistry.createPaneFromTemplate(DOCS_PANE_TEMPLATE_ID, { values: { pane: paneId } });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const instance = findPaneInstance(layoutRef.current, paneId);
|
|
139
|
+
const fn = instance ? helpFunctionForPane(buildRegistryHelpIndex(pluginRegistry), pluginRegistry, instance) : null;
|
|
140
|
+
if (fn) requestFunctionHelp({ kind: "function", fn, inAppDocs: false });
|
|
141
|
+
}), [isDetachedWindow, pluginRegistry]);
|
|
123
142
|
|
|
124
143
|
useShortcut((event) => {
|
|
125
144
|
if (isCopyShortcut(event) && copyActiveSelection(nativeRenderer)) {
|
|
@@ -135,6 +154,23 @@ export function useAppGlobalShortcuts({
|
|
|
135
154
|
|
|
136
155
|
const match = matchKeybinding(keybindings, event);
|
|
137
156
|
const action = match?.kind === "action" ? match.id : null;
|
|
157
|
+
/**
|
|
158
|
+
* Whether the action already ran for this press or hold. An action that
|
|
159
|
+
* takes the key (`claims`) swallows the refused ones as well; one that
|
|
160
|
+
* leaves it to the pane (R) does not, so a pane's own key keeps working.
|
|
161
|
+
*/
|
|
162
|
+
const ranAlready = (id: string, claims = true): boolean => {
|
|
163
|
+
const shot = shots.get(id);
|
|
164
|
+
if (shot.refuses(event)) {
|
|
165
|
+
if (claims) {
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
event.stopPropagation();
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
shot.end();
|
|
172
|
+
return false;
|
|
173
|
+
};
|
|
138
174
|
|
|
139
175
|
// Terminals send Ctrl; the browser and the desktop webview send Cmd on
|
|
140
176
|
// macOS, which the OpenTUI host also reports as `super` under the kitty
|
|
@@ -158,6 +194,7 @@ export function useAppGlobalShortcuts({
|
|
|
158
194
|
// The status bar's star line answers the same keys once no toast does,
|
|
159
195
|
// but only over the workspace itself.
|
|
160
196
|
if (action === "notification-action" || action === "notification-dismiss") {
|
|
197
|
+
if (ranAlready(action)) return;
|
|
161
198
|
const toastHandled = action === "notification-action"
|
|
162
199
|
? toastHost.activateNewest?.() === true
|
|
163
200
|
: toastHost.dismissNewest?.() === true;
|
|
@@ -181,12 +218,14 @@ export function useAppGlobalShortcuts({
|
|
|
181
218
|
// Ctrl+P and Ctrl+N move the open bar's selection, so a bar chord that
|
|
182
219
|
// is one of them only opens it; Esc and the bar's other chords close it.
|
|
183
220
|
if (state.commandBarOpen && (isMoveUpShortcut(event) || isMoveDownShortcut(event))) return;
|
|
221
|
+
if (ranAlready(action)) return;
|
|
184
222
|
event.preventDefault();
|
|
185
223
|
event.stopPropagation();
|
|
186
224
|
dispatch({ type: "TOGGLE_COMMAND_BAR" });
|
|
187
225
|
return;
|
|
188
226
|
}
|
|
189
227
|
if (!isDetachedWindow && action === "ticker-search" && !state.commandBarOpen) {
|
|
228
|
+
if (ranAlready(action)) return;
|
|
190
229
|
event.preventDefault();
|
|
191
230
|
event.stopPropagation();
|
|
192
231
|
dispatch({
|
|
@@ -219,6 +258,7 @@ export function useAppGlobalShortcuts({
|
|
|
219
258
|
// Command and function keys are never text, so they still fire.
|
|
220
259
|
const editing = state.inputCaptured || event.targetEditable === true;
|
|
221
260
|
if (editing && event.ctrl && !(event.meta || event.super)) return;
|
|
261
|
+
if (ranAlready(`command:${match.command.query}`)) return;
|
|
222
262
|
event.preventDefault();
|
|
223
263
|
event.stopPropagation();
|
|
224
264
|
dispatch({
|
|
@@ -232,12 +272,13 @@ export function useAppGlobalShortcuts({
|
|
|
232
272
|
|
|
233
273
|
// A function key is never text, so the card opens from a focused field too.
|
|
234
274
|
if (action === "function-help") {
|
|
275
|
+
if (ranAlready(action)) return;
|
|
235
276
|
event.preventDefault();
|
|
236
277
|
event.stopPropagation();
|
|
237
278
|
recordFunctionOpen({ shortcut: "HELP", externalPluginId: null });
|
|
238
279
|
const instance = state.focusedPaneId ? findPaneInstance(state.config.layout, state.focusedPaneId) : undefined;
|
|
239
280
|
const fn = instance ? helpFunctionForPane(buildRegistryHelpIndex(pluginRegistry), pluginRegistry, instance) : null;
|
|
240
|
-
if (fn && requestFunctionHelp({ kind: "function", fn })) return;
|
|
281
|
+
if (fn && requestFunctionHelp({ kind: "function", fn, inAppDocs: !isDetachedWindow })) return;
|
|
241
282
|
if (!isDetachedWindow) pluginRegistry.showPane("help");
|
|
242
283
|
return;
|
|
243
284
|
}
|
|
@@ -245,6 +286,7 @@ export function useAppGlobalShortcuts({
|
|
|
245
286
|
if (state.inputCaptured) return;
|
|
246
287
|
|
|
247
288
|
if (!isDetachedWindow && action === "help") {
|
|
289
|
+
if (ranAlready(action)) return;
|
|
248
290
|
event.preventDefault();
|
|
249
291
|
event.stopPropagation();
|
|
250
292
|
pluginRegistry.showPane("help");
|
|
@@ -252,13 +294,16 @@ export function useAppGlobalShortcuts({
|
|
|
252
294
|
}
|
|
253
295
|
|
|
254
296
|
if (!isDetachedWindow && action === "quit") {
|
|
297
|
+
if (ranAlready(action, false)) return;
|
|
255
298
|
if (uiKind === "opentui") rendererHost.requestExit();
|
|
256
299
|
} else if (action === "refresh-ticker") {
|
|
300
|
+
if (ranAlready(action, false)) return;
|
|
257
301
|
if (focusedTickerSymbol) {
|
|
258
302
|
const ticker = state.tickers.get(focusedTickerSymbol);
|
|
259
303
|
if (ticker) refreshTicker(ticker.metadata.ticker, ticker.metadata.exchange, ticker, 0);
|
|
260
304
|
}
|
|
261
305
|
} else if (action === "refresh-all") {
|
|
306
|
+
if (ranAlready(action, false)) return;
|
|
262
307
|
for (const ticker of state.tickers.values()) {
|
|
263
308
|
refreshTicker(ticker.metadata.ticker, ticker.metadata.exchange, ticker, 1);
|
|
264
309
|
}
|
|
@@ -266,10 +311,12 @@ export function useAppGlobalShortcuts({
|
|
|
266
311
|
// A release that can install itself downloads on its own, so the key is
|
|
267
312
|
// for the one that waits for a restart and for the one that failed.
|
|
268
313
|
if (!isDetachedWindow && canRestartToApply(state.updateProgress)) {
|
|
314
|
+
if (ranAlready(action)) return;
|
|
269
315
|
event.preventDefault();
|
|
270
316
|
event.stopPropagation();
|
|
271
317
|
restartToApplyUpdate();
|
|
272
318
|
} else if (canRetryUpdate(state)) {
|
|
319
|
+
if (ranAlready(action)) return;
|
|
273
320
|
event.preventDefault();
|
|
274
321
|
event.stopPropagation();
|
|
275
322
|
startUpdate(state.updateAvailable!);
|
|
@@ -282,6 +329,7 @@ export function useAppGlobalShortcuts({
|
|
|
282
329
|
if (ownerId && disabledPlugins.has(ownerId)) continue;
|
|
283
330
|
const chords = resolvePluginShortcutChords(keybindingsConfig, shortcut);
|
|
284
331
|
if (chords.some((chord) => matchesKeyChord(chord, event))) {
|
|
332
|
+
if (ranAlready(`plugin:${shortcut.id}`, false)) return;
|
|
285
333
|
shortcut.execute();
|
|
286
334
|
break;
|
|
287
335
|
}
|
|
@@ -28,6 +28,7 @@ export type CoreKeybindingActionId =
|
|
|
28
28
|
| "pane-screenshot"
|
|
29
29
|
| "pane-export-csv"
|
|
30
30
|
| "pane-share"
|
|
31
|
+
| "pane-ask"
|
|
31
32
|
| "layout-gallery"
|
|
32
33
|
| "tidy-windows"
|
|
33
34
|
| "window-move-mode"
|
|
@@ -59,6 +60,7 @@ export const PANE_ACTION_IDS = new Set<CoreKeybindingActionId>([
|
|
|
59
60
|
"pane-screenshot",
|
|
60
61
|
"pane-export-csv",
|
|
61
62
|
"pane-share",
|
|
63
|
+
"pane-ask",
|
|
62
64
|
"layout-gallery",
|
|
63
65
|
"tidy-windows",
|
|
64
66
|
"window-move-mode",
|
|
@@ -225,9 +227,18 @@ export const KEYBINDING_ACTIONS: readonly KeybindingActionDef[] = [
|
|
|
225
227
|
{
|
|
226
228
|
id: "pane-share",
|
|
227
229
|
category: "Pane Management",
|
|
228
|
-
description: "Share the focused pane.",
|
|
230
|
+
description: "Share the focused pane: post a picture to chat or copy its link.",
|
|
229
231
|
defaults: ["CmdOrCtrl+Shift+S"],
|
|
230
232
|
},
|
|
233
|
+
{
|
|
234
|
+
id: "pane-ask",
|
|
235
|
+
category: "Pane Management",
|
|
236
|
+
description: "Ask Gloom about the focused pane, in a new conversation with the pane attached.",
|
|
237
|
+
// A for ask. Alt+A first, because it reaches most terminals, where
|
|
238
|
+
// Ctrl+Shift+A is often the terminal's own select all; the desktop app
|
|
239
|
+
// advertises the chord on its platform modifier.
|
|
240
|
+
defaults: ["Alt+A", "CmdOrCtrl+Shift+A"],
|
|
241
|
+
},
|
|
231
242
|
{
|
|
232
243
|
id: "layout-gallery",
|
|
233
244
|
category: "Pane Management",
|
|
@@ -16,8 +16,8 @@ import {
|
|
|
16
16
|
} from "../../components/layout/shell/visible-layout";
|
|
17
17
|
import { applyPluginToggles } from "../../plugins/ownership";
|
|
18
18
|
import { setLayoutManagerDispatch } from "../../plugins/builtin/layout-manager";
|
|
19
|
-
import { setMarketplaceHost } from "../../plugins/
|
|
20
|
-
import type { InstalledPlugin } from "../../plugins/
|
|
19
|
+
import { setMarketplaceHost } from "../../plugins/marketplace/store";
|
|
20
|
+
import type { InstalledPlugin } from "../../plugins/marketplace/model";
|
|
21
21
|
import {
|
|
22
22
|
listExternalPlugins,
|
|
23
23
|
removeExternalPlugin,
|
|
@@ -111,11 +111,11 @@ export function useAppTickerOpenRuntime({
|
|
|
111
111
|
return true;
|
|
112
112
|
}, [pluginRegistry, stateRef]);
|
|
113
113
|
|
|
114
|
-
const placePinnedTickerTarget = useCallback((target: TickerOpenTarget, options?: PinTickerOptions) => {
|
|
114
|
+
const placePinnedTickerTarget = useCallback((target: TickerOpenTarget, options?: PinTickerOptions, typed?: string) => {
|
|
115
115
|
const paneType = normalizePaneId(options?.paneType ?? TICKER_RESEARCH_PANE_ID);
|
|
116
116
|
const paneDef = pluginRegistry.panes.get(paneType);
|
|
117
117
|
if (!paneDef) return;
|
|
118
|
-
if (refuseWhileOwnerOff(target.symbol, options, () => placePinnedTickerTarget(target, options))) return;
|
|
118
|
+
if (refuseWhileOwnerOff(target.symbol, options, () => placePinnedTickerTarget(target, options, typed))) return;
|
|
119
119
|
|
|
120
120
|
publishTickerOpenTarget(target);
|
|
121
121
|
const symbol = target.symbol;
|
|
@@ -128,8 +128,18 @@ export function useAppTickerOpenRuntime({
|
|
|
128
128
|
let existing = options?.forceNewPane
|
|
129
129
|
? null
|
|
130
130
|
: findFixedTickerPaneForSymbol(currentLayout, paneType, symbol, instrument);
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
// A pane bound to the key as typed (the web terminal's first pane for ?ticker=7203:TSE) is the one the
|
|
132
|
+
// resolved listing (7203:JPX) settles.
|
|
133
|
+
const typedKey = typed?.trim().toUpperCase();
|
|
134
|
+
if (!options?.forceNewPane && !existing && typedKey && typedKey !== symbol) {
|
|
135
|
+
existing = findFixedTickerPaneForSymbol(currentLayout, paneType, typedKey, instrument);
|
|
136
|
+
}
|
|
137
|
+
// Without a broker route, the public listing and an unnamed route are the same security: a link that names
|
|
138
|
+
// neither still finds the DES the command bar opened on the public listing, and leaves its binding as it is.
|
|
139
|
+
let keepBinding = false;
|
|
140
|
+
if (!options?.forceNewPane && !existing && !instrument && !target.ticker.metadata.broker_contracts?.length) {
|
|
141
|
+
existing = findFixedTickerPaneForSymbol(currentLayout, paneType, symbol, instrument === null ? undefined : null);
|
|
142
|
+
keepBinding = !!existing && instrument === undefined;
|
|
133
143
|
}
|
|
134
144
|
if (!options?.forceNewPane && !existing && !instrument && (parsePublicTickerKey(symbol).exchange || tickerHasListingSuffix(symbol))) {
|
|
135
145
|
existing = currentLayout.instances.find((instance) => {
|
|
@@ -145,7 +155,7 @@ export function useAppTickerOpenRuntime({
|
|
|
145
155
|
// verified same listing, retaining its pane identity and its followers.
|
|
146
156
|
const previousSymbol = existing.binding?.kind === "fixed" ? existing.binding.symbol : null;
|
|
147
157
|
let nextLayout = currentLayout;
|
|
148
|
-
if (previousSymbol && (previousSymbol !== symbol || JSON.stringify(existing.binding) !== JSON.stringify(binding))) {
|
|
158
|
+
if (previousSymbol && (previousSymbol !== symbol || (!keepBinding && JSON.stringify(existing.binding) !== JSON.stringify(binding)))) {
|
|
149
159
|
const existingId = existing.instanceId;
|
|
150
160
|
nextLayout = { ...currentLayout, instances: currentLayout.instances.map((instance) => (
|
|
151
161
|
instance.instanceId === existingId ? {
|
|
@@ -209,7 +219,7 @@ export function useAppTickerOpenRuntime({
|
|
|
209
219
|
? { symbol: selectedTicker.metadata.ticker, ticker: selectedTicker, created: false, instrument: options?.instrument, listing: options?.listing }
|
|
210
220
|
: await resolveOpenTickerTarget(rawSymbol, options?.instrument === null);
|
|
211
221
|
if (!target) return;
|
|
212
|
-
placePinnedTickerTarget(target, options);
|
|
222
|
+
placePinnedTickerTarget(target, options, rawSymbol);
|
|
213
223
|
const action = attentionActionForPane(options?.paneType ?? TICKER_RESEARCH_PANE_ID);
|
|
214
224
|
if (action && pluginRegistry.panes.has(options?.paneType ?? TICKER_RESEARCH_PANE_ID)) {
|
|
215
225
|
recordAttention(publicTickerKey(target.symbol, target.listing?.exchange ?? target.ticker.metadata.exchange), action);
|
|
@@ -17,6 +17,7 @@ import { getShare } from "../../shares/api";
|
|
|
17
17
|
import { openPaneShare } from "../../shares/pane";
|
|
18
18
|
import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
|
|
19
19
|
import { materializeMarketplaceLayout } from "../../shares/portable-layout";
|
|
20
|
+
import { settleTypedListingKey } from "../../tickers/listing-venues";
|
|
20
21
|
|
|
21
22
|
type CloudDeepLinkRoute = {
|
|
22
23
|
kind: "cloud-alerts" | "cloud-emails" | "cloud-roundup" | "cloud-success" | "cloud-teams";
|
|
@@ -475,11 +476,15 @@ function handleOpenNews(
|
|
|
475
476
|
notifyError(pluginRegistry, "Ticker news is unavailable.");
|
|
476
477
|
return;
|
|
477
478
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
479
|
+
// A link's 7203:TSE is the venue its symbol trades on; ticker and alert links settle it where they open.
|
|
480
|
+
void settleTypedListingKey(action.symbol, { store: pluginRegistry.tickerRepository, dataProvider: pluginRegistry.marketData })
|
|
481
|
+
.then((symbol) => pluginRegistry.createPaneFromTemplateAsync("ticker-news-pane", { symbol: symbol.toUpperCase() }))
|
|
482
|
+
.then(() => {
|
|
483
|
+
notifySuccess(pluginRegistry, action.message);
|
|
484
|
+
})
|
|
485
|
+
.catch((error) => {
|
|
486
|
+
notifyError(pluginRegistry, error instanceof Error ? error.message : "Failed to open ticker news.");
|
|
487
|
+
});
|
|
483
488
|
return;
|
|
484
489
|
}
|
|
485
490
|
|
|
@@ -6,7 +6,7 @@ import type { MarketDataCoordinator } from "../../market-data/coordinator";
|
|
|
6
6
|
import { instrumentFromTicker, type InstrumentRef } from "../../market-data/request-types";
|
|
7
7
|
import { useSavedLayoutWarmup } from "./layout-warmup";
|
|
8
8
|
import { chatController } from "../../plugins/builtin/chat/controller";
|
|
9
|
-
import { PLUGIN_MARKETPLACE_PANE_ID } from "../../plugins/
|
|
9
|
+
import { PLUGIN_MARKETPLACE_PANE_ID } from "../../plugins/marketplace/ids";
|
|
10
10
|
import type { LoadedExternalPlugin } from "../../plugins/loader";
|
|
11
11
|
import type { PluginRegistry } from "../../plugins/registry";
|
|
12
12
|
import type {
|
package/src/app.tsx
CHANGED
|
@@ -38,6 +38,7 @@ import type { LayoutBounds } from "./layout/pane-manager";
|
|
|
38
38
|
import type { AppSessionSnapshot } from "./core/state/session-persistence";
|
|
39
39
|
import type { MarketDataCoordinator } from "./market-data/coordinator";
|
|
40
40
|
import { createAppNotifier } from "./notifications/app-notifier";
|
|
41
|
+
import { attachNotificationLog } from "./notifications/notification-log";
|
|
41
42
|
import { useBrokerImportRuntime } from "./app/runtime/broker-import";
|
|
42
43
|
import { useDesktopDeepLinkRuntime } from "./app/runtime/desktop-deeplink";
|
|
43
44
|
import { useDesktopApplicationMenuRuntime } from "./app/runtime/desktop-menu";
|
|
@@ -374,6 +375,11 @@ function AppInner({
|
|
|
374
375
|
|
|
375
376
|
// Wire up app-level notifications.
|
|
376
377
|
pluginRegistry.bindHost({ notify: appNotifier.notify });
|
|
378
|
+
// Missed alerts live in this device's state store. A detached window keeps
|
|
379
|
+
// its own in memory rather than overwrite the main window's.
|
|
380
|
+
useEffect(() => (
|
|
381
|
+
isDetachedWindow ? undefined : attachNotificationLog(pluginRegistry.persistence.pluginState)
|
|
382
|
+
), [isDetachedWindow, pluginRegistry]);
|
|
377
383
|
|
|
378
384
|
// Persist layout changes (switching, saving, deleting, renaming layouts).
|
|
379
385
|
// The saved layouts also mirror live pane state and focus, so they change on
|