gloomberb 0.16.5 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -1
- package/src/api-client/central-bank-rates.ts +6 -1
- package/src/api-client/chat-pane-link.ts +47 -0
- package/src/api-client/chat.ts +35 -1
- package/src/api-client/credit-boards.ts +2 -0
- package/src/api-client/data.ts +85 -1
- package/src/api-client/equity-screener.ts +3 -0
- package/src/api-client/europe-energy.ts +197 -0
- package/src/api-client/index.ts +15 -0
- package/src/api-client/letters.ts +41 -0
- package/src/api-client/market-discovery.ts +3 -0
- package/src/api-client/normalizers.ts +68 -6
- package/src/api-client/organization-tickers.ts +44 -0
- package/src/api-client/perps.ts +8 -0
- package/src/api-client/request.ts +11 -2
- package/src/api-client/socket.ts +29 -0
- package/src/api-client/themes.ts +22 -1
- package/src/api-client/types.ts +88 -2
- package/src/app/global-shortcuts.ts +35 -1
- 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 +9 -3
- package/src/app/runtime/desktop-deeplink.ts +58 -20
- package/src/app/runtime/startup.ts +1 -1
- package/src/app.tsx +6 -0
- package/src/architecture/core-builtin-allowlist.json +5 -14
- package/src/architecture/dom-cell-metrics-allowlist.json +28 -0
- package/src/ask-gloom/pane-context.ts +118 -0
- package/src/ask-gloom/pane-request.ts +70 -0
- package/src/ask-gloom/pane-text.ts +201 -0
- package/src/capabilities/chart-series.ts +8 -1
- 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 +28 -2
- package/src/cli/commands/fred-series.ts +155 -4
- package/src/cli/commands/market.ts +175 -35
- package/src/cli/commands/overview.ts +62 -20
- package/src/cli/commands/search.ts +254 -23
- package/src/cli/commands/ticker.ts +137 -24
- package/src/cli/desktop-pane-shot-view.ts +114 -0
- package/src/cli/desktop-pane-shot.ts +53 -37
- package/src/cli/entry.ts +7 -0
- package/src/cli/errors.ts +7 -5
- package/src/cli/exit-codes.ts +8 -0
- package/src/cli/export-source.ts +101 -0
- package/src/cli/freshness.ts +18 -3
- package/src/cli/glossary.ts +79 -8
- package/src/cli/help.ts +10 -0
- package/src/cli/helpers.ts +2 -5
- package/src/cli/history-rows.ts +244 -13
- package/src/cli/index.ts +9 -3
- package/src/cli/known-gaps.ts +76 -8
- package/src/cli/listing-arg.ts +201 -90
- package/src/cli/listing-suggestion.ts +159 -0
- package/src/cli/native-smoke.ts +13 -0
- package/src/cli/not-a-ticker.ts +24 -4
- package/src/cli/pane-functions/access-gate.ts +8 -2
- package/src/cli/pane-functions/capabilities.ts +17 -9
- package/src/cli/pane-functions/catalog.ts +183 -39
- package/src/cli/pane-functions/data.ts +30 -0
- package/src/cli/pane-functions/dom.ts +44 -14
- package/src/cli/pane-functions/freshness.ts +48 -24
- package/src/cli/pane-functions/function-help.ts +66 -12
- package/src/cli/pane-functions/headless.ts +81 -22
- package/src/cli/pane-functions/index.ts +90 -18
- package/src/cli/pane-functions/options.ts +8 -0
- package/src/cli/pane-functions/report-notices.ts +6 -3
- package/src/cli/pane-functions/report.ts +16 -2
- package/src/cli/pane-functions/resolver.ts +32 -11
- package/src/cli/pane-functions/screenshot.ts +145 -9
- package/src/cli/perpetual-contract.ts +60 -0
- package/src/cli/registry.ts +3 -1
- package/src/cli/report-tables.ts +53 -13
- package/src/cli/result.ts +91 -17
- package/src/cli/series-search.ts +111 -0
- package/src/cli/staged-tickers.ts +1 -1
- package/src/cli/symbol-args.ts +18 -0
- package/src/cli/symbol-list.ts +1 -19
- package/src/cli/symbol-rows.ts +171 -0
- package/src/cli/ticker-resolution.ts +99 -8
- package/src/components/chart/composite/axis-overlays.tsx +10 -1
- package/src/components/chart/composite/composite-chart.tsx +24 -15
- 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 +57 -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 +6 -8
- package/src/components/chart/composite/price-axis-labels.tsx +1 -0
- 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/list/model.ts +2 -0
- package/src/components/command-bar/pane-templates/items.ts +1 -1
- package/src/components/command-bar/routes/root/plugin-install.ts +4 -4
- package/src/components/command-bar/routes/ticker-search/actions.ts +1 -0
- package/src/components/command-bar/routes/ticker-search/results.ts +3 -1
- package/src/components/command-bar/routing/actions.ts +1 -1
- package/src/components/command-bar/workflow/ops.ts +8 -97
- package/src/components/command-bar/workflow/pane-reuse.ts +177 -0
- package/src/components/command-bar/workflow/tickers.ts +35 -29
- package/src/components/data-table/view.tsx +1 -0
- package/src/components/feed-data-table/stack-view.tsx +18 -42
- package/src/components/layout/detached-pane-shell.tsx +59 -39
- package/src/components/layout/floating-pane.tsx +7 -1
- package/src/components/layout/header.tsx +5 -0
- package/src/components/layout/missing-pane.tsx +5 -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/footer/keyboard.ts +3 -0
- package/src/components/layout/pane/footer/model.ts +7 -1
- package/src/components/layout/pane/header.tsx +26 -0
- package/src/components/layout/pane/index.tsx +9 -1
- package/src/components/layout/pane/sidebar.tsx +10 -11
- package/src/components/layout/shell/cursor-occlusion.ts +2 -1
- package/src/components/layout/shell/index.tsx +62 -60
- package/src/components/layout/shell/menu.ts +9 -1
- package/src/components/layout/shell/pane/actions.ts +32 -10
- package/src/components/layout/shell/pane/ask.ts +136 -0
- package/src/components/layout/shell/pane/capture.ts +136 -0
- package/src/components/layout/shell/pane/layers.tsx +26 -5
- package/src/components/layout/shell/pane/management-shortcuts.ts +46 -1
- package/src/components/layout/shell/shortcuts.ts +21 -4
- package/src/components/markdown-text.tsx +37 -6
- package/src/components/metric-treemap/heat-surface.tsx +1 -3
- package/src/components/reader/article-reader.tsx +467 -0
- package/src/components/reader/article-text.ts +527 -0
- package/src/components/reader/detail-reader.tsx +210 -0
- package/src/components/reader/reader-text.tsx +239 -0
- package/src/components/table-view-shared.tsx +8 -4
- package/src/components/ticker/badge/list.tsx +15 -4
- package/src/components/ticker/list-table-view.tsx +19 -1
- package/src/components/ui/choice-dialog.tsx +3 -0
- package/src/components/ui/data-table/index.tsx +1 -0
- package/src/components/ui/data-table/types.ts +7 -0
- package/src/components/ui/detail-scroll-body.tsx +31 -4
- package/src/components/ui/display.tsx +46 -1
- package/src/components/ui/icon.tsx +14 -1
- package/src/components/ui/list-view.tsx +3 -1
- package/src/components/ui/query-bar-keys.tsx +2 -0
- package/src/components/ui/query-bar.tsx +18 -1
- package/src/components/ui/select-button.tsx +3 -0
- package/src/data/config/store/fold-panes.ts +202 -11
- package/src/data/config/store/migrations.ts +20 -1
- package/src/data/config/store/portfolio-as-of-column.ts +57 -0
- package/src/docs/snapshot.json +191 -23
- package/src/i18n/es.ts +18 -1
- package/src/i18n/ja.ts +18 -1
- package/src/i18n/ko.ts +18 -1
- package/src/i18n/zh-cn.ts +18 -1
- package/src/i18n/zh-tw.ts +18 -1
- package/src/layout/desk-keys.ts +7 -0
- package/src/layout/desks.ts +2 -2
- package/src/layout-marketplace/gallery.tsx +1 -1
- package/src/market-data/market/freshness.ts +3 -2
- package/src/market-data/market/session-close-note.ts +3 -2
- package/src/market-data/market/status.ts +67 -6
- package/src/market-data/quotes/contributions.ts +17 -0
- package/src/market-data/quotes/metadata.ts +12 -0
- package/src/market-data/quotes/regular-session-valuation.ts +131 -0
- package/src/market-data/quotes/resolution.ts +7 -0
- package/src/market-data/snapshot-provider.ts +6 -3
- package/src/notifications/app-badge.ts +30 -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/calendar-tab.tsx +1 -1
- package/src/plugins/builtin/account-management/form-components.tsx +53 -1
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/keyboard.ts +5 -0
- package/src/plugins/builtin/account-management/model.ts +27 -0
- package/src/plugins/builtin/account-management/pane.tsx +62 -2
- package/src/plugins/builtin/alerts/catalysts.ts +1 -1
- package/src/plugins/builtin/alerts/cli.ts +6 -4
- package/src/plugins/builtin/alerts/focus.ts +27 -0
- package/src/plugins/builtin/alerts/index.tsx +6 -2
- package/src/plugins/builtin/alerts/pane.tsx +19 -1
- package/src/plugins/builtin/analytics/index.tsx +5 -2
- package/src/plugins/builtin/analytics/risk-headless.ts +30 -15
- package/src/plugins/builtin/attention/headless.ts +1 -1
- package/src/plugins/builtin/awards/headless.ts +88 -18
- package/src/plugins/builtin/awards/model.ts +41 -1
- package/src/plugins/builtin/awards/pane.tsx +48 -30
- package/src/plugins/builtin/backtest/headless.ts +2 -2
- package/src/plugins/builtin/backtest/pane.tsx +2 -1
- package/src/plugins/builtin/bond-calculator/index.tsx +3 -5
- package/src/plugins/builtin/broker-manager/index.tsx +1 -0
- package/src/plugins/builtin/buildout/detail/company.tsx +7 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +5 -4
- package/src/plugins/builtin/catalysts/headless.ts +1 -1
- package/src/plugins/builtin/catalysts/model.ts +92 -10
- package/src/plugins/builtin/catalysts/pane.tsx +6 -4
- package/src/plugins/builtin/cds/client.ts +11 -31
- package/src/plugins/builtin/cds/headless.ts +5 -2
- package/src/plugins/builtin/cds/index.tsx +21 -30
- package/src/plugins/builtin/cds/model.ts +21 -1
- package/src/plugins/builtin/cds/pane.tsx +6 -4
- 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 +1 -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 +19 -25
- package/src/plugins/builtin/changelog/index.tsx +11 -12
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +3 -1
- package/src/plugins/builtin/chart-composer/headless.ts +151 -9
- package/src/plugins/builtin/chart-composer/index.tsx +6 -1
- package/src/plugins/builtin/chart-composer/pane.tsx +84 -40
- package/src/plugins/builtin/chart-composer/session-history.ts +20 -5
- package/src/plugins/builtin/chat/command-bar.ts +6 -8
- package/src/plugins/builtin/chat/content/composer-runtime.ts +6 -1
- package/src/plugins/builtin/chat/content/composer.tsx +15 -2
- package/src/plugins/builtin/chat/content/footer.tsx +27 -5
- package/src/plugins/builtin/chat/content/handle-prompt.tsx +326 -0
- package/src/plugins/builtin/chat/content/index.tsx +201 -13
- package/src/plugins/builtin/chat/content/layout-metrics.ts +4 -0
- package/src/plugins/builtin/chat/content/new-messages.tsx +89 -0
- package/src/plugins/builtin/chat/content/open-targets.ts +20 -4
- package/src/plugins/builtin/chat/content/row-activity.ts +132 -0
- package/src/plugins/builtin/chat/content/scroll.ts +133 -28
- package/src/plugins/builtin/chat/content/shortcuts.ts +2 -2
- package/src/plugins/builtin/chat/content/transcript.tsx +155 -79
- 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 +121 -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/handle-prompt.ts +128 -0
- package/src/plugins/builtin/chat/index.tsx +66 -25
- package/src/plugins/builtin/chat/layout.ts +84 -18
- package/src/plugins/builtin/chat/message/desktop.tsx +111 -14
- package/src/plugins/builtin/chat/message/header.tsx +81 -21
- package/src/plugins/builtin/chat/message/pane-chip.tsx +223 -0
- package/src/plugins/builtin/chat/message/person-icons.tsx +53 -0
- package/src/plugins/builtin/chat/message/profile-popover.tsx +77 -9
- package/src/plugins/builtin/chat/message/reactions.tsx +210 -0
- package/src/plugins/builtin/chat/message/render-state.ts +33 -4
- package/src/plugins/builtin/chat/message/terminal.tsx +72 -8
- package/src/plugins/builtin/chat/message/types.ts +15 -0
- package/src/plugins/builtin/chat/pane-links/model.ts +149 -0
- package/src/plugins/builtin/chat/pane-links/open.ts +29 -0
- package/src/plugins/builtin/chat/pane-links/previews.ts +119 -0
- package/src/plugins/builtin/chat/pane-state.ts +5 -8
- package/src/plugins/builtin/chat/people.ts +202 -0
- package/src/plugins/builtin/chat/profile-popover.ts +18 -2
- 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 +7 -9
- package/src/plugins/builtin/chat/unread-badge.ts +65 -0
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +151 -27
- package/src/plugins/builtin/chat/unread-inbox.ts +22 -0
- package/src/plugins/builtin/clinical-trials/client.ts +26 -1
- package/src/plugins/builtin/clinical-trials/index.tsx +10 -2
- package/src/plugins/builtin/clinical-trials/model.ts +269 -0
- package/src/plugins/builtin/clinical-trials/pane.tsx +247 -62
- package/src/plugins/builtin/clinical-trials/sponsor-tickers.ts +156 -0
- package/src/plugins/builtin/cloud/askg/attached-pane.tsx +69 -0
- 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/mcp-connect/dialog.tsx +1 -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/thesis/module.tsx +1 -0
- package/src/plugins/builtin/comment-letters/pane.tsx +30 -11
- package/src/plugins/builtin/commodities-energy/index.tsx +179 -0
- package/src/plugins/builtin/commodity-balances/client.ts +208 -0
- package/src/plugins/builtin/commodity-balances/headless.ts +66 -0
- package/src/plugins/builtin/commodity-balances/index.tsx +32 -0
- package/src/plugins/builtin/commodity-balances/model.ts +261 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +227 -0
- package/src/plugins/builtin/company-attention/headless.ts +2 -2
- 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 +13 -14
- package/src/plugins/builtin/composite-plugins.ts +26 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/cot/headless.ts +1 -1
- 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 +21 -42
- package/src/plugins/builtin/credit-boards/model.ts +11 -3
- 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 +20 -22
- package/src/plugins/builtin/credit-conditions/model.ts +19 -11
- package/src/plugins/builtin/credit-conditions/series.ts +8 -18
- package/src/plugins/builtin/credit-documents/headless.ts +2 -2
- package/src/plugins/builtin/credit-documents/index.tsx +27 -10
- package/src/plugins/builtin/debt-maturities/headless.ts +17 -11
- package/src/plugins/builtin/debt-maturities/index.tsx +3 -17
- package/src/plugins/builtin/debug/index.tsx +2 -2
- package/src/plugins/builtin/dividend-yield/client.ts +6 -1
- package/src/plugins/builtin/dividend-yield/headless.ts +8 -3
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/dividend-yield/pane.tsx +6 -2
- package/src/plugins/builtin/dividend-yield/provider-client.ts +3 -1
- package/src/plugins/builtin/dividend-yield/types.ts +2 -0
- package/src/plugins/builtin/docs/blocks.tsx +4 -3
- package/src/plugins/builtin/docs/pane.tsx +16 -8
- package/src/plugins/builtin/doe/headless.ts +12 -8
- package/src/plugins/builtin/earnings/index.tsx +11 -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-calls/pane.tsx +2 -12
- package/src/plugins/builtin/earnings-ripple/index.tsx +2 -0
- package/src/plugins/builtin/econ/fred-catalog.ts +9 -0
- package/src/plugins/builtin/equity-screener/client.ts +1 -1
- package/src/plugins/builtin/equity-screener/headless.ts +39 -5
- package/src/plugins/builtin/equity-screener/model.ts +121 -68
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -3
- package/src/plugins/builtin/executives/pane.tsx +3 -1
- package/src/plugins/builtin/exposure/drivers.ts +13 -0
- package/src/plugins/builtin/exposure/headless.ts +205 -13
- 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 +11 -11
- package/src/plugins/builtin/fear-greed/index.tsx +14 -10
- package/src/plugins/builtin/filing-events/index.tsx +20 -0
- package/src/plugins/builtin/fixed-income/index.tsx +46 -0
- package/src/plugins/builtin/fixed-income/model.ts +27 -0
- package/src/plugins/builtin/fixed-income/pane.tsx +162 -0
- package/src/plugins/builtin/fixed-income/shortcut.ts +52 -0
- package/src/plugins/builtin/futures/index.tsx +24 -7
- package/src/plugins/builtin/futures/series.ts +23 -2
- package/src/plugins/builtin/futures/use-front-returns.ts +3 -2
- package/src/plugins/builtin/futures-curve/headless.ts +1 -1
- package/src/plugins/builtin/futures-curve/index.tsx +1 -1
- package/src/plugins/builtin/futures-curve/pane.tsx +6 -4
- 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 +3 -3
- package/src/plugins/builtin/gpu/headless.ts +4 -4
- package/src/plugins/builtin/help/function-index.ts +2 -0
- package/src/plugins/builtin/help/index.tsx +14 -1
- package/src/plugins/builtin/help/shortcut-table.tsx +4 -2
- package/src/plugins/builtin/insider/detail.tsx +20 -12
- package/src/plugins/builtin/insider/index.tsx +2 -2
- package/src/plugins/builtin/ipo-calendar/headless.ts +1 -1
- package/src/plugins/builtin/iv-history/client.ts +6 -2
- package/src/plugins/builtin/iv-history/format.ts +9 -0
- package/src/plugins/builtin/iv-history/headless.ts +50 -18
- package/src/plugins/builtin/iv-history/index.tsx +3 -0
- package/src/plugins/builtin/iv-history/model.ts +35 -4
- package/src/plugins/builtin/iv-history/screen-pane.tsx +13 -5
- package/src/plugins/builtin/jobs/headless.ts +6 -8
- package/src/plugins/builtin/jodi/client.ts +220 -0
- package/src/plugins/builtin/jodi/headless.ts +63 -0
- package/src/plugins/builtin/jodi/index.tsx +32 -0
- package/src/plugins/builtin/jodi/model.ts +75 -0
- package/src/plugins/builtin/jodi/pane.tsx +141 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
- package/src/plugins/builtin/market-heatmap/evidence.ts +13 -4
- package/src/plugins/builtin/market-heatmap/headless.ts +22 -7
- package/src/plugins/builtin/market-heatmap/index.tsx +47 -23
- package/src/plugins/builtin/market-heatmap/live.ts +2 -1
- package/src/plugins/builtin/market-heatmap/portfolio.ts +67 -21
- package/src/plugins/builtin/market-movers/table.ts +2 -2
- package/src/plugins/builtin/market-valuation/align.ts +10 -9
- package/src/plugins/builtin/members/headless.ts +1 -1
- package/src/plugins/builtin/members/pane.tsx +3 -2
- package/src/plugins/builtin/mna/distress/headless.ts +4 -4
- package/src/plugins/builtin/mna/distress/model.ts +52 -1
- package/src/plugins/builtin/mna/distress/pane.tsx +17 -12
- package/src/plugins/builtin/mna/headless.ts +3 -3
- package/src/plugins/builtin/mna/index.tsx +2 -0
- package/src/plugins/builtin/money-markets/headless.ts +5 -4
- package/src/plugins/builtin/news/index.tsx +0 -2
- package/src/plugins/builtin/news/wire/index.tsx +2 -2
- package/src/plugins/builtin/news/wire/industry-pane.tsx +28 -14
- package/src/plugins/builtin/news/wire/letters/client.ts +108 -0
- package/src/plugins/builtin/news/wire/letters/model.ts +69 -0
- package/src/plugins/builtin/news/wire/letters/pane.tsx +155 -0
- package/src/plugins/builtin/news/wire/mutes.ts +2 -1
- 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/news/wire/news/query-presets.ts +4 -1
- package/src/plugins/builtin/notes/index.tsx +1 -0
- package/src/plugins/builtin/openfda/client.ts +123 -15
- package/src/plugins/builtin/openfda/model.ts +163 -0
- package/src/plugins/builtin/openfda/pane.tsx +109 -65
- package/src/plugins/builtin/openfda/types.ts +25 -0
- package/src/plugins/builtin/options/index.tsx +3 -0
- package/src/plugins/builtin/options/view.tsx +1 -1
- package/src/plugins/builtin/options-positioning/headless.ts +3 -3
- package/src/plugins/builtin/pe-band/model.ts +3 -2
- package/src/plugins/builtin/perps/client.ts +50 -10
- package/src/plugins/builtin/perps/equity-row.tsx +29 -16
- package/src/plugins/builtin/perps/headless.ts +2 -2
- package/src/plugins/builtin/perps/index.tsx +5 -3
- package/src/plugins/builtin/perps/list-perpetuals.ts +118 -0
- package/src/plugins/builtin/perps/open-market.ts +15 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +1 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +7 -7
- package/src/plugins/builtin/plugin-module.ts +3 -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 +24 -136
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +78 -19
- package/src/plugins/builtin/portfolio-list/cli/render.ts +249 -52
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +44 -12
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +21 -7
- package/src/plugins/builtin/portfolio-list/column-values.ts +103 -25
- package/src/plugins/builtin/portfolio-list/headless.ts +51 -15
- package/src/plugins/builtin/portfolio-list/index.tsx +5 -1
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +25 -13
- 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 +46 -8
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +16 -10
- 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 +8 -3
- package/src/plugins/builtin/portfolio-list/table.tsx +30 -6
- package/src/plugins/builtin/power/evidence.ts +86 -8
- package/src/plugins/builtin/power/gas-client.ts +110 -0
- package/src/plugins/builtin/power/gas-model.ts +194 -0
- package/src/plugins/builtin/power/gas.tsx +145 -0
- package/src/plugins/builtin/power/headless.ts +9 -2
- package/src/plugins/builtin/power/index.tsx +35 -3
- package/src/plugins/builtin/power/model.ts +2 -2
- package/src/plugins/builtin/power/pane.tsx +7 -3
- package/src/plugins/builtin/power/prices-client.ts +139 -0
- package/src/plugins/builtin/power/prices-headless.ts +205 -0
- package/src/plugins/builtin/power/prices-model.ts +103 -0
- package/src/plugins/builtin/power/prices.tsx +202 -0
- package/src/plugins/builtin/primary-dealers/client.ts +108 -0
- package/src/plugins/builtin/primary-dealers/headless.ts +53 -0
- package/src/plugins/builtin/primary-dealers/index.tsx +17 -0
- package/src/plugins/builtin/primary-dealers/model.ts +206 -0
- package/src/plugins/builtin/primary-dealers/pane.tsx +149 -0
- package/src/plugins/builtin/rate-path/headless.ts +38 -18
- package/src/plugins/builtin/relative-rotation/headless.ts +3 -3
- package/src/plugins/builtin/relative-rotation/index.tsx +3 -0
- package/src/plugins/builtin/research/analyst-model.ts +9 -5
- package/src/plugins/builtin/research/headless-schema.ts +2 -1
- package/src/plugins/builtin/research/index.tsx +2 -0
- package/src/plugins/builtin/research/relative-valuation-headless.ts +68 -32
- package/src/plugins/builtin/research/relative-valuation-model.ts +45 -24
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +39 -4
- 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/scanner/flow-pane.tsx +8 -1
- package/src/plugins/builtin/sec/filing-display.tsx +3 -36
- package/src/plugins/builtin/sec/headless.ts +25 -3
- package/src/plugins/builtin/sec/index.tsx +133 -44
- package/src/plugins/builtin/sec/model.ts +148 -2
- package/src/plugins/builtin/sec/row-summaries.ts +105 -0
- package/src/plugins/builtin/sectors/index.tsx +2 -0
- package/src/plugins/builtin/sectors/sector-model.ts +2 -2
- package/src/plugins/builtin/series-inventory.ts +3 -0
- package/src/plugins/builtin/shared/cloud-denied.ts +15 -0
- package/src/plugins/builtin/shared/free-preview.ts +47 -0
- package/src/plugins/builtin/shared/locked-rows.tsx +1 -1
- package/src/plugins/builtin/shared/report-freshness.ts +3 -1
- package/src/plugins/builtin/shared/use-quote-board.ts +179 -43
- package/src/plugins/builtin/shared/volatility/options.ts +4 -1
- package/src/plugins/builtin/shared/wall-teaser.tsx +2 -2
- package/src/plugins/builtin/shared/zip-text.ts +46 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +2 -2
- package/src/plugins/builtin/short-interest/watch-model.ts +11 -2
- package/src/plugins/builtin/short-volume/headless.ts +1 -1
- package/src/plugins/builtin/social-mentions/headless.ts +1 -1
- 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 +5 -5
- 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/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/financials/aggregation.ts +11 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +81 -19
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +1 -1
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +30 -0
- package/src/plugins/builtin/ticker-detail/headless.ts +88 -2
- package/src/plugins/builtin/ticker-detail/index.tsx +23 -11
- package/src/plugins/builtin/ticker-detail/overview/model.ts +3 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +8 -6
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +8 -6
- package/src/plugins/builtin/time-sales/headless.ts +23 -1
- package/src/plugins/builtin/time-sales/index.tsx +2 -1
- package/src/plugins/builtin/trace-bonds/client.ts +196 -0
- package/src/plugins/builtin/trace-bonds/headless.ts +69 -0
- package/src/plugins/builtin/trace-bonds/index.tsx +33 -0
- package/src/plugins/builtin/trace-bonds/model.ts +115 -0
- package/src/plugins/builtin/trace-bonds/pane.tsx +191 -0
- package/src/plugins/builtin/treasury-auctions/index.tsx +33 -47
- package/src/plugins/builtin/treasury-daily/client.ts +96 -0
- package/src/plugins/builtin/treasury-daily/headless.ts +69 -0
- package/src/plugins/builtin/treasury-daily/index.tsx +17 -0
- package/src/plugins/builtin/treasury-daily/model.ts +69 -0
- package/src/plugins/builtin/treasury-daily/pane.tsx +140 -0
- package/src/plugins/builtin/vol-surface/evidence.ts +7 -1
- package/src/plugins/builtin/vol-surface/headless.ts +50 -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/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/entity-detail.tsx +15 -2
- package/src/plugins/builtin/world-venue-map/geo-draw.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/geo-svg.tsx +6 -6
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +16 -9
- package/src/plugins/builtin/world-venue-map/map.tsx +145 -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/index.tsx +1 -1
- package/src/plugins/builtin-editorial.ts +1 -1
- package/src/plugins/catalog-browser.ts +25 -2
- 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 +63 -27
- package/src/plugins/{builtin/plugin-marketplace → marketplace}/store.ts +1 -1
- package/src/plugins/registry/host-actions.ts +11 -0
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/valuation-basis.ts +79 -0
- package/src/public/time-series.ts +1 -1
- package/src/react/input.ts +33 -1
- package/src/react/key-repeat.ts +86 -0
- package/src/remote/controller.ts +21 -1
- package/src/remote/schema.ts +3 -2
- package/src/renderers/browser/main.tsx +1 -1
- package/src/renderers/browser/research-entry.ts +4 -2
- package/src/renderers/dom/build-assets.ts +14 -5
- package/src/renderers/dom/data-table/index.tsx +5 -3
- package/src/renderers/dom/data-table/row.tsx +3 -0
- package/src/renderers/dom/desktop/controls.tsx +2 -1
- package/src/renderers/dom/desktop/icons.tsx +34 -0
- package/src/renderers/dom/desktop/list-view.tsx +1 -1
- package/src/renderers/dom/desktop/menu.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +3 -1
- package/src/renderers/dom/host/block-glyph-canvas.tsx +6 -3
- package/src/renderers/dom/host/box.tsx +7 -2
- package/src/renderers/dom/host/chart-surface.tsx +34 -2
- package/src/renderers/dom/host/resize-rows.ts +111 -0
- package/src/renderers/dom/host/scroll-box.tsx +32 -0
- package/src/renderers/dom/host/size-observer.ts +24 -9
- package/src/renderers/dom/host/sticky-scroll.ts +147 -0
- package/src/renderers/dom/host/style.ts +15 -1
- package/src/renderers/dom/host/surface-3d.tsx +15 -7
- package/src/renderers/dom/host/surface-fit.ts +410 -0
- package/src/renderers/dom/host/text.tsx +2 -2
- package/src/renderers/dom/input-host.tsx +1 -0
- package/src/renderers/dom/styles.css +109 -16
- package/src/renderers/electrobun/bun/application-menu/click.ts +18 -0
- package/src/renderers/electrobun/bun/desktop/app-badge.ts +37 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +1 -0
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +8 -0
- package/src/renderers/electrobun/bun/desktop/macos-dock-badge.ts +37 -0
- package/src/renderers/electrobun/bun/desktop/macos-dock-icon.ts +2 -40
- package/src/renderers/electrobun/bun/desktop/macos-objc.ts +41 -0
- package/src/renderers/electrobun/bun/index.ts +3 -2
- package/src/renderers/electrobun/bun/tui-entry.ts +18 -1
- package/src/renderers/electrobun/shared/protocol.ts +3 -1
- package/src/renderers/electrobun/view/app-badge-host.ts +17 -0
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +20 -3
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +59 -24
- package/src/renderers/electrobun/view/main.tsx +5 -3
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +7 -1
- 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/resolve.ts +3 -2
- package/src/series/types.ts +8 -0
- package/src/series/validate.ts +2 -2
- package/src/shares/api.ts +5 -1
- 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/location.ts +31 -0
- package/src/shares/open.ts +26 -0
- package/src/shares/pane-image.ts +164 -0
- package/src/shares/personal-pane.ts +52 -0
- package/src/shares/portable-layout.ts +4 -2
- package/src/shares/prepare.ts +20 -0
- package/src/sources/gloomberb-cloud/index.ts +109 -5
- package/src/sources/gloomberb-cloud/normalizers.ts +7 -0
- package/src/sources/gloomberb-cloud/perpetuals.ts +249 -0
- package/src/sources/history-coverage.ts +22 -4
- package/src/sources/history-result.ts +3 -1
- package/src/sources/history-retention.ts +11 -0
- package/src/sources/listing-target.ts +4 -0
- package/src/sources/provider-errors.ts +2 -1
- package/src/sources/provider-router/batches.ts +18 -2
- package/src/sources/provider-router/index.ts +16 -1
- package/src/state/app/context/index.tsx +3 -2
- package/src/state/hooks/inline-tickers.ts +49 -11
- package/src/test-support/builtin-panes.ts +31 -0
- package/src/test-support/shell-pane-keys.tsx +1 -0
- package/src/theme/theme-context.tsx +15 -1
- package/src/tickers/instrument-kind.ts +9 -1
- package/src/tickers/listing-name.ts +34 -0
- package/src/tickers/listing-venues.ts +154 -0
- package/src/tickers/open-target.ts +11 -3
- package/src/tickers/perpetual-listing.ts +151 -0
- package/src/tickers/prediction-listing.ts +26 -0
- package/src/tickers/search/index.ts +34 -6
- package/src/tickers/search/ranking.ts +85 -4
- package/src/tickers/ticker-changes.ts +213 -0
- package/src/time-series/chart-data.ts +2 -0
- package/src/time-series/economic.ts +2 -6
- package/src/time-series/ice-credit.ts +39 -0
- package/src/time-series/parsed-history-cache.ts +41 -11
- package/src/time-series/resolve.ts +163 -28
- package/src/time-series/studies.ts +1 -0
- package/src/time-series/types.ts +8 -0
- package/src/types/config.ts +4 -2
- package/src/types/data-provider.ts +19 -1
- package/src/types/financials.ts +23 -0
- package/src/types/headless.ts +74 -0
- package/src/types/instrument.ts +4 -0
- package/src/types/plugin.ts +60 -2
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker-changes.ts +26 -0
- package/src/ui/context-menu.tsx +13 -1
- package/src/ui/host.tsx +49 -7
- package/src/ui/live-resize.ts +10 -0
- package/src/ui/live-stretch.ts +51 -19
- package/src/ui/sticky-scroll.ts +7 -0
- package/src/utils/central-banks.ts +76 -0
- package/src/utils/cli-output.ts +126 -16
- package/src/utils/crypto-pair.ts +1 -1
- package/src/utils/currency-pair.ts +66 -0
- package/src/utils/currency-units.ts +11 -0
- package/src/utils/datetime-format.ts +27 -6
- package/src/utils/decimal-comma.ts +57 -0
- package/src/utils/dom-screenshot.ts +3 -1
- package/src/utils/double-escape-close.ts +15 -1
- package/src/utils/exchanges.ts +36 -0
- package/src/utils/format.ts +19 -2
- package/src/utils/forward-dividend.ts +14 -0
- package/src/utils/fx-status.ts +6 -1
- package/src/utils/guards.ts +25 -0
- package/src/utils/inline-content-tokenizer.ts +22 -3
- package/src/utils/local-utc-offset.ts +37 -0
- 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/plugin-proxy-hosts.json +8 -1
- package/src/utils/utc-time.ts +12 -0
- package/src/plugins/builtin/credit-boards/pane.tsx +0 -30
- package/src/ui/pane-fill.ts +0 -11
- /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
|
@@ -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,6 +128,12 @@ export function useAppTickerOpenRuntime({
|
|
|
128
128
|
let existing = options?.forceNewPane
|
|
129
129
|
? null
|
|
130
130
|
: findFixedTickerPaneForSymbol(currentLayout, paneType, symbol, instrument);
|
|
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
|
+
}
|
|
131
137
|
// Without a broker route, the public listing and an unnamed route are the same security: a link that names
|
|
132
138
|
// neither still finds the DES the command bar opened on the public listing, and leaves its binding as it is.
|
|
133
139
|
let keepBinding = false;
|
|
@@ -213,7 +219,7 @@ export function useAppTickerOpenRuntime({
|
|
|
213
219
|
? { symbol: selectedTicker.metadata.ticker, ticker: selectedTicker, created: false, instrument: options?.instrument, listing: options?.listing }
|
|
214
220
|
: await resolveOpenTickerTarget(rawSymbol, options?.instrument === null);
|
|
215
221
|
if (!target) return;
|
|
216
|
-
placePinnedTickerTarget(target, options);
|
|
222
|
+
placePinnedTickerTarget(target, options, rawSymbol);
|
|
217
223
|
const action = attentionActionForPane(options?.paneType ?? TICKER_RESEARCH_PANE_ID);
|
|
218
224
|
if (action && pluginRegistry.panes.has(options?.paneType ?? TICKER_RESEARCH_PANE_ID)) {
|
|
219
225
|
recordAttention(publicTickerKey(target.symbol, target.listing?.exchange ?? target.ticker.metadata.exchange), action);
|
|
@@ -13,10 +13,12 @@ import type { DesktopWindowBridge } from "../../types/desktop-window";
|
|
|
13
13
|
import { requestAccountManagementTab } from "../../plugins/builtin/account-management/navigation";
|
|
14
14
|
import { openTeamPane } from "../../plugins/builtin/cloud/team/pane-request";
|
|
15
15
|
import { chatController } from "../../plugins/builtin/chat/controller";
|
|
16
|
-
import { getShare } from "../../shares/api";
|
|
16
|
+
import { getShare, type ShareRecord } from "../../shares/api";
|
|
17
|
+
import { openShareLink, registerShareOpener } from "../../shares/open";
|
|
17
18
|
import { openPaneShare } from "../../shares/pane";
|
|
18
19
|
import { PluginOffError, notifyPluginOff } from "../../plugins/plugin-off";
|
|
19
20
|
import { materializeMarketplaceLayout } from "../../shares/portable-layout";
|
|
21
|
+
import { settleTypedListingKey } from "../../tickers/listing-venues";
|
|
20
22
|
|
|
21
23
|
type CloudDeepLinkRoute = {
|
|
22
24
|
kind: "cloud-alerts" | "cloud-emails" | "cloud-roundup" | "cloud-success" | "cloud-teams";
|
|
@@ -475,11 +477,15 @@ function handleOpenNews(
|
|
|
475
477
|
notifyError(pluginRegistry, "Ticker news is unavailable.");
|
|
476
478
|
return;
|
|
477
479
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
480
|
+
// A link's 7203:TSE is the venue its symbol trades on; ticker and alert links settle it where they open.
|
|
481
|
+
void settleTypedListingKey(action.symbol, { store: pluginRegistry.tickerRepository, dataProvider: pluginRegistry.marketData })
|
|
482
|
+
.then((symbol) => pluginRegistry.createPaneFromTemplateAsync("ticker-news-pane", { symbol: symbol.toUpperCase() }))
|
|
483
|
+
.then(() => {
|
|
484
|
+
notifySuccess(pluginRegistry, action.message);
|
|
485
|
+
})
|
|
486
|
+
.catch((error) => {
|
|
487
|
+
notifyError(pluginRegistry, error instanceof Error ? error.message : "Failed to open ticker news.");
|
|
488
|
+
});
|
|
483
489
|
return;
|
|
484
490
|
}
|
|
485
491
|
|
|
@@ -509,15 +515,44 @@ async function handleOpenLayout(
|
|
|
509
515
|
notifySuccess(options.pluginRegistry, `Layout "${entry.name}" added.`);
|
|
510
516
|
}
|
|
511
517
|
|
|
512
|
-
|
|
513
|
-
|
|
518
|
+
/**
|
|
519
|
+
* Opens a pane share in this app: the web app's `?share=` hand-off, a
|
|
520
|
+
* gloomberb://share link and a share link in chat all come through here.
|
|
521
|
+
* With `fallback`, a share this app cannot read or that holds a snapshot
|
|
522
|
+
* goes there (its web page) instead of to an error.
|
|
523
|
+
*/
|
|
524
|
+
async function openShareInApp(
|
|
525
|
+
id: string,
|
|
514
526
|
pluginRegistry: PluginRegistry,
|
|
527
|
+
options: { retry: () => void; fallback?: () => void },
|
|
515
528
|
): Promise<void> {
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
529
|
+
let share: ShareRecord | null;
|
|
530
|
+
try {
|
|
531
|
+
share = await getShare(id, fetch, { trackView: false });
|
|
532
|
+
} catch (error) {
|
|
533
|
+
if (options.fallback) options.fallback();
|
|
534
|
+
else notifyError(pluginRegistry, error instanceof Error ? error.message : "Could not open shared pane.");
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
if (!share) {
|
|
538
|
+
notifyError(pluginRegistry, "This share is unavailable or has expired.");
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
if (share.kind !== "pane") {
|
|
542
|
+
if (options.fallback) options.fallback();
|
|
543
|
+
else notifyError(pluginRegistry, "This link contains a snapshot, not a live pane.");
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
try {
|
|
547
|
+
await openPaneShare(pluginRegistry, share.data);
|
|
548
|
+
notifySuccess(pluginRegistry, "Opened shared pane.");
|
|
549
|
+
} catch (error) {
|
|
550
|
+
if (error instanceof PluginOffError) {
|
|
551
|
+
notifyPluginOff(pluginRegistry, error, options.retry);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
notifyError(pluginRegistry, error instanceof Error ? error.message : "Could not open shared pane.");
|
|
555
|
+
}
|
|
521
556
|
}
|
|
522
557
|
|
|
523
558
|
export function handleDesktopDeepLink(rawUrl: string, options: DesktopDeepLinkHandlerOptions): void {
|
|
@@ -564,13 +599,7 @@ export function handleDesktopDeepLink(rawUrl: string, options: DesktopDeepLinkHa
|
|
|
564
599
|
handleOpenNews(action, options.pluginRegistry);
|
|
565
600
|
return;
|
|
566
601
|
case "open-share":
|
|
567
|
-
void
|
|
568
|
-
if (error instanceof PluginOffError) {
|
|
569
|
-
notifyPluginOff(options.pluginRegistry, error, () => handleDesktopDeepLink(rawUrl, options));
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
notifyError(options.pluginRegistry, error instanceof Error ? error.message : "Could not open shared pane.");
|
|
573
|
-
});
|
|
602
|
+
void openShareInApp(action.id, options.pluginRegistry, { retry: () => handleDesktopDeepLink(rawUrl, options) });
|
|
574
603
|
return;
|
|
575
604
|
case "open-layout":
|
|
576
605
|
void handleOpenLayout(action, options).catch((error) => {
|
|
@@ -595,6 +624,15 @@ export function useDesktopDeepLinkRuntime({
|
|
|
595
624
|
pluginRegistry: PluginRegistry;
|
|
596
625
|
stateRef: { current: AppState };
|
|
597
626
|
}) {
|
|
627
|
+
// Share links opened inside the app (chat's share chips) take the same path, in every renderer.
|
|
628
|
+
useEffect(() => {
|
|
629
|
+
if (!initialized) return;
|
|
630
|
+
return registerShareOpener((id, { fallback }) => openShareInApp(id, pluginRegistry, {
|
|
631
|
+
fallback,
|
|
632
|
+
retry: () => openShareLink(id, fallback),
|
|
633
|
+
}));
|
|
634
|
+
}, [initialized, pluginRegistry]);
|
|
635
|
+
|
|
598
636
|
useEffect(() => {
|
|
599
637
|
if (!initialized || desktopWindowKind === "detached" || !desktopDeepLinkBridge) return;
|
|
600
638
|
return desktopDeepLinkBridge.subscribe((deeplink) => {
|
|
@@ -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
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"src/api-client/askg.ts": ["cloud"],
|
|
3
3
|
"src/app.tsx": ["cloud"],
|
|
4
4
|
"src/app/global-shortcuts.ts": ["help"],
|
|
5
|
-
"src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager"
|
|
5
|
+
"src/app/pane-runtime/plugin-bindings.ts": ["broker-manager","layout-manager"],
|
|
6
6
|
"src/app/runtime/broker-import.ts": ["portfolio-list"],
|
|
7
7
|
"src/app/runtime/desktop-deeplink.ts": ["account-management","chat","cloud"],
|
|
8
|
-
"src/app/runtime/startup.ts": ["chat"
|
|
8
|
+
"src/app/runtime/startup.ts": ["chat"],
|
|
9
9
|
"src/cli/commands/market.ts": ["holders","insider","research","sec"],
|
|
10
10
|
"src/cli/commands/options-chain.ts": ["options","options-calculator"],
|
|
11
11
|
"src/cli/commands/options-leaps.ts": ["options","vol-surface"],
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
"src/components/command-bar/commands/direct/index.ts": ["broker-manager","portfolio-list"],
|
|
24
24
|
"src/components/command-bar/routes/root/command-items.ts": ["portfolio-list"],
|
|
25
25
|
"src/components/command-bar/routes/root/help-items.ts": ["help"],
|
|
26
|
-
"src/components/command-bar/routes/root/plugin-install.ts": ["plugin-marketplace"],
|
|
27
26
|
"src/components/command-bar/routes/root/shortcut-items.ts": ["portfolio-list"],
|
|
28
27
|
"src/components/command-bar/workflow/builtin.ts": ["cloud","portfolio-list"],
|
|
29
28
|
"src/components/command-bar/workflow/collection-actions.ts": ["cloud","portfolio-list"],
|
|
@@ -32,30 +31,22 @@
|
|
|
32
31
|
"src/components/feedback-dialog.tsx": ["cloud"],
|
|
33
32
|
"src/components/form-modal/routes.ts": ["portfolio-list"],
|
|
34
33
|
"src/components/index.ts": ["portfolio-list"],
|
|
35
|
-
"src/components/layout/missing-pane.tsx": ["plugin-marketplace"],
|
|
36
34
|
"src/components/layout/shell/index.tsx": ["cloud"],
|
|
37
35
|
"src/components/layout/status-bar-groups.ts": ["cloud"],
|
|
38
36
|
"src/components/layout/status-bar.tsx": ["cloud"],
|
|
39
37
|
"src/components/onboarding/use-onboarding-upgrade.ts": ["chat"],
|
|
40
38
|
"src/components/onboarding/wizard-model.ts": ["portfolio-list"],
|
|
41
39
|
"src/components/onboarding/wizard-positions.ts": ["portfolio-list"],
|
|
42
|
-
"src/layout-marketplace/gallery.tsx": ["cloud"
|
|
40
|
+
"src/layout-marketplace/gallery.tsx": ["cloud"],
|
|
43
41
|
"src/layout-marketplace/linked-sync.ts": ["cloud"],
|
|
44
42
|
"src/layout/desks.ts": ["chart-composer"],
|
|
45
|
-
"src/plugins/
|
|
46
|
-
"src/plugins/auto-update.ts": ["plugin-marketplace"],
|
|
47
|
-
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","treasury-auctions","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
43
|
+
"src/plugins/catalog-browser.ts": ["alerts","analytics","attention","awards","backtest","bond-calculator","catalysts","cds","central-bank-rates","changelog","chart-composer","clinical-trials","cloud","comment-letters","commodities-energy","commodity-balances","company-attention","company-kpis","connections","correlation","cot","cpi","credit-boards","credit-conditions","credit-documents","crypto-board","debt-maturities","dividend-yield","docs","doe","earnings-calls","earnings-ripple","econ","econ-statistics","equity-screener","estimate-revisions","executives","exposure","fear-greed","filing-events","fixed-income","futures","futures-curve","fx-matrix","gpu","help","insider","ipo-calendar","iv-history","jobs","jodi","kelly-sizer","layout-manager","macro-day","market-halts","market-heatmap","market-valuation","members","mna","money-markets","news","openfda","options","options-calculator","options-positioning","options-scenario","pe-band","perps","portfolio-list","power","primary-dealers","rate-path","realized-vol","relative-rotation","research","research-search","revenue-breakdown","reverse-dcf","risk-factors","scanner","seasonality","sec","sectors","short-interest","short-volume","social-mentions","supply-chain","ticker-detail","time-sales","trace-bonds","treasury-auctions","treasury-daily","vol-surface","volatility","world-indices","world-venue-map","yield-curve"],
|
|
48
44
|
"src/plugins/catalog-ui.ts": ["alerts","clinical-trials","cloud","comment-letters","custom-view","fear-greed","ipo-calendar","market-halts","market-heatmap","members","news","notes","openfda","research-search"],
|
|
49
45
|
"src/plugins/catalog.ts": ["debug"],
|
|
50
|
-
"src/plugins/installer.ts": ["plugin-marketplace"],
|
|
51
|
-
"src/plugins/manager-node.ts": ["plugin-marketplace"],
|
|
52
46
|
"src/remote/controller.ts": ["custom-view"],
|
|
53
|
-
"src/renderers/browser/main.tsx": ["plugin-marketplace"],
|
|
54
47
|
"src/renderers/electrobun/bun/core-capabilities.ts": ["notes"],
|
|
55
|
-
"src/renderers/electrobun/shared/protocol.ts": ["plugin-marketplace"],
|
|
56
48
|
"src/renderers/electrobun/view/cli-pane-shot-entry.tsx": ["econ-statistics","market-valuation","time-sales"],
|
|
57
|
-
"src/renderers/electrobun/view/main.tsx": ["notes"
|
|
49
|
+
"src/renderers/electrobun/view/main.tsx": ["notes"],
|
|
58
50
|
"src/renderers/electrobun/view/remote/connection-health.ts": ["connections"],
|
|
59
|
-
"src/renderers/opentui/start.tsx": ["plugin-marketplace"],
|
|
60
51
|
"src/sync/core-contributors.ts": ["analytics","portfolio-list"]
|
|
61
52
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"src/components/layout/pane/header.tsx": 2,
|
|
3
|
+
"src/components/layout/pane/sizing.ts": 3,
|
|
4
|
+
"src/components/layout/shell/drag/slide.ts": 4,
|
|
5
|
+
"src/components/layout/shell/pane/layers.tsx": 6,
|
|
6
|
+
"src/components/ui/select-button.tsx": 2,
|
|
7
|
+
"src/renderers/dom/data-table/dom.ts": 26,
|
|
8
|
+
"src/renderers/dom/data-table/index.tsx": 21,
|
|
9
|
+
"src/renderers/dom/data-table/row.tsx": 11,
|
|
10
|
+
"src/renderers/dom/desktop/controls.tsx": 6,
|
|
11
|
+
"src/renderers/dom/desktop/list-view.tsx": 2,
|
|
12
|
+
"src/renderers/dom/desktop/popover.tsx": 6,
|
|
13
|
+
"src/renderers/dom/desktop/query-bar.tsx": 1,
|
|
14
|
+
"src/renderers/dom/desktop/select-field.tsx": 2,
|
|
15
|
+
"src/renderers/dom/dom-ui-host.tsx": 6,
|
|
16
|
+
"src/renderers/dom/host/input.tsx": 5,
|
|
17
|
+
"src/renderers/dom/host/live-frame.ts": 8,
|
|
18
|
+
"src/renderers/dom/host/mouse.ts": 10,
|
|
19
|
+
"src/renderers/dom/host/scroll-box.tsx": 22,
|
|
20
|
+
"src/renderers/dom/host/size-observer.ts": 6,
|
|
21
|
+
"src/renderers/dom/host/style.ts": 27,
|
|
22
|
+
"src/renderers/dom/host/surface-fit.ts": 4,
|
|
23
|
+
"src/renderers/dom/host/tabs.tsx": 2,
|
|
24
|
+
"src/renderers/dom/host/text.tsx": 2,
|
|
25
|
+
"src/renderers/dom/input-host.tsx": 4,
|
|
26
|
+
"src/renderers/dom/native-renderer.ts": 4,
|
|
27
|
+
"src/renderers/dom/styles.css": 17
|
|
28
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { ResolvedPane } from "../layout/pane-manager";
|
|
2
|
+
import type { PluginRegistry } from "../plugins/registry";
|
|
3
|
+
import { panePersonalData } from "../shares/personal-pane";
|
|
4
|
+
import { resolveTickerForPane, type AppState } from "../state/app/context";
|
|
5
|
+
import type { LayoutConfig } from "../types/config";
|
|
6
|
+
import type { PaneSharePrivateFields } from "../types/plugin";
|
|
7
|
+
import type { AskGloomPaneAttachment } from "./pane-request";
|
|
8
|
+
|
|
9
|
+
/** A handful of the pane's own settings is enough to say how it is set up. */
|
|
10
|
+
const MAX_ARGS = 8;
|
|
11
|
+
const MAX_ARG_KEY_LENGTH = 32;
|
|
12
|
+
const MAX_ARG_VALUE_LENGTH = 48;
|
|
13
|
+
/** Layout and view bookkeeping, not what the pane shows. */
|
|
14
|
+
const BOOKKEEPING_KEYS = [
|
|
15
|
+
/scroll|width|height|offset|index|expanded|collapsed|focus|hover|sidebar|column|sort|order|version|draft/i,
|
|
16
|
+
// The cursor's position, but not the symbol it is on.
|
|
17
|
+
/^cursor(?!Symbol)/,
|
|
18
|
+
// Timestamps such as `updatedAt`.
|
|
19
|
+
/[a-z]At$/,
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
type ArgSource = Readonly<Record<string, unknown>> | undefined;
|
|
23
|
+
|
|
24
|
+
function isPrivate(fields: PaneSharePrivateFields | undefined, key: string): boolean {
|
|
25
|
+
return fields === true || (Array.isArray(fields) && fields.includes(key));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function scalarArgs(source: ArgSource, privateFields: PaneSharePrivateFields | undefined): Array<[string, string]> {
|
|
29
|
+
if (!source || privateFields === true) return [];
|
|
30
|
+
return Object.entries(source).flatMap(([key, value]): Array<[string, string]> => {
|
|
31
|
+
if (key.length > MAX_ARG_KEY_LENGTH || BOOKKEEPING_KEYS.some((pattern) => pattern.test(key)) || isPrivate(privateFields, key)) return [];
|
|
32
|
+
if (typeof value === "number" && Number.isFinite(value)) return [[key, String(value)]];
|
|
33
|
+
if (typeof value !== "string") return [];
|
|
34
|
+
const trimmed = value.trim();
|
|
35
|
+
return trimmed && trimmed.length <= MAX_ARG_VALUE_LENGTH ? [[key, trimmed]] : [];
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The function code a pane is opened by: the one its title starts with when
|
|
41
|
+
* that opens this pane (a chart opened with `GP` stays `GP`), else the first
|
|
42
|
+
* template that opens it.
|
|
43
|
+
*/
|
|
44
|
+
function functionCode(registry: Pick<PluginRegistry, "paneTemplates">, paneType: string, title: string): string | null {
|
|
45
|
+
const prefixes = [...registry.paneTemplates.values()]
|
|
46
|
+
.filter((template) => template.paneId === paneType && template.shortcut?.prefix)
|
|
47
|
+
.map((template) => template.shortcut!.prefix.toUpperCase());
|
|
48
|
+
const token = title.trim().split(/\s+/)[0]?.toUpperCase() ?? "";
|
|
49
|
+
if (token && prefixes.includes(token)) return token;
|
|
50
|
+
return prefixes[0] ?? null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface PaneAttachmentSource {
|
|
54
|
+
registry: Pick<PluginRegistry, "paneTemplates" | "brokers" | "getPanePluginId" | "getBrokerPluginId">;
|
|
55
|
+
pane: Pick<ResolvedPane, "instance" | "def">;
|
|
56
|
+
state: AppState;
|
|
57
|
+
/** The layout the pane is in, as the share path reads it for `personalData`. */
|
|
58
|
+
layout: LayoutConfig;
|
|
59
|
+
/** What the header calls it. */
|
|
60
|
+
title: string;
|
|
61
|
+
/** The tab each of its tab strips has open, outermost first. */
|
|
62
|
+
activeTabs?: readonly string[];
|
|
63
|
+
visibleText: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* What Ask Gloom is told about a pane: its function and arguments as the
|
|
68
|
+
* user set them, and its text as drawn. Fields the pane keeps to itself when
|
|
69
|
+
* shared (`portableShare.private`) stay out of its arguments.
|
|
70
|
+
*/
|
|
71
|
+
export function buildAskGloomPaneAttachment({
|
|
72
|
+
registry,
|
|
73
|
+
pane,
|
|
74
|
+
state,
|
|
75
|
+
layout,
|
|
76
|
+
title,
|
|
77
|
+
activeTabs = [],
|
|
78
|
+
visibleText,
|
|
79
|
+
}: PaneAttachmentSource): AskGloomPaneAttachment {
|
|
80
|
+
const { instance } = pane;
|
|
81
|
+
const symbol = resolveTickerForPane(state, instance.instanceId);
|
|
82
|
+
const paneState = state.paneState[instance.instanceId];
|
|
83
|
+
const privateFields = pane.def.portableShare?.private;
|
|
84
|
+
const args: Record<string, string> = {};
|
|
85
|
+
const tabs = activeTabs.map((tab) => tab.trim()).filter(Boolean);
|
|
86
|
+
if (tabs.length > 0) args.tab = tabs.join(" > ").slice(0, MAX_ARG_VALUE_LENGTH);
|
|
87
|
+
for (const [key, value] of [
|
|
88
|
+
...scalarArgs(instance.params, privateFields?.params),
|
|
89
|
+
...scalarArgs(instance.settings, privateFields?.settings),
|
|
90
|
+
...scalarArgs(paneState, privateFields?.state),
|
|
91
|
+
]) {
|
|
92
|
+
if (Object.keys(args).length >= MAX_ARGS) break;
|
|
93
|
+
if (key in args || value === symbol) continue;
|
|
94
|
+
args[key] = value;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
paneId: instance.instanceId,
|
|
98
|
+
paneType: instance.paneId,
|
|
99
|
+
title,
|
|
100
|
+
code: functionCode(registry, instance.paneId, title),
|
|
101
|
+
symbol,
|
|
102
|
+
args,
|
|
103
|
+
visibleText,
|
|
104
|
+
personal: showsPersonalData({ registry, state, layout, pane }),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Whatever the pane shows as personal data, as sharing its picture reads it.
|
|
110
|
+
* A pane that cannot be read for it counts as personal: its contents then wait for a yes.
|
|
111
|
+
*/
|
|
112
|
+
function showsPersonalData(source: Parameters<typeof panePersonalData>[0]): boolean {
|
|
113
|
+
try {
|
|
114
|
+
return panePersonalData(source) !== null;
|
|
115
|
+
} catch {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking Ask Gloom about a pane. Every pane offers it the same way, with no
|
|
3
|
+
* code of its own: the button beside the `?` in a desktop pane header, Ask
|
|
4
|
+
* Gloom in the pane menu, and the pane-ask key. The shell describes the pane
|
|
5
|
+
* here, and Ask Gloom, while its plugin is on, opens a new conversation with
|
|
6
|
+
* the pane attached.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** A pane as Ask Gloom receives it: what it is and what it showed when asked. */
|
|
10
|
+
export interface AskGloomPaneAttachment {
|
|
11
|
+
/** The pane instance. */
|
|
12
|
+
paneId: string;
|
|
13
|
+
/** Its pane type. */
|
|
14
|
+
paneType: string;
|
|
15
|
+
/** What its header calls it, such as `DES AAPL`. */
|
|
16
|
+
title: string;
|
|
17
|
+
/** The function code that opens it, such as `DES`, when one does. */
|
|
18
|
+
code: string | null;
|
|
19
|
+
/** The ticker it shows, when it shows one. */
|
|
20
|
+
symbol: string | null;
|
|
21
|
+
/** How it is set up as the user sees it: its tab, range or view. Short values only. */
|
|
22
|
+
args: Readonly<Record<string, string>>;
|
|
23
|
+
/** Its text as drawn when asked, bounded; null when none could be read. */
|
|
24
|
+
visibleText: string | null;
|
|
25
|
+
/**
|
|
26
|
+
* The pane shows personal data (`PaneDef.personalData`), so Ask Gloom
|
|
27
|
+
* asks before anything it shows leaves the device.
|
|
28
|
+
*/
|
|
29
|
+
personal: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type AskGloomPaneHandler = (attachment: AskGloomPaneAttachment) => void;
|
|
33
|
+
|
|
34
|
+
const handlers = new Set<AskGloomPaneHandler>();
|
|
35
|
+
const listeners = new Set<() => void>();
|
|
36
|
+
|
|
37
|
+
function changed(): void {
|
|
38
|
+
for (const listener of [...listeners]) listener();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Ask Gloom takes pane questions while it is registered. The shell offers the
|
|
43
|
+
* button, the menu entry and the key only then, so a profile with the cloud
|
|
44
|
+
* plugin off shows none of them.
|
|
45
|
+
*/
|
|
46
|
+
export function registerAskGloomPaneHandler(handler: AskGloomPaneHandler): () => void {
|
|
47
|
+
handlers.add(handler);
|
|
48
|
+
changed();
|
|
49
|
+
return () => {
|
|
50
|
+
if (handlers.delete(handler)) changed();
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function canAskGloomAboutPanes(): boolean {
|
|
55
|
+
return handlers.size > 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function subscribeAskGloomAboutPanes(listener: () => void): () => void {
|
|
59
|
+
listeners.add(listener);
|
|
60
|
+
return () => {
|
|
61
|
+
listeners.delete(listener);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Hands the pane to Ask Gloom. False when nothing takes it. */
|
|
66
|
+
export function askGloomAboutPane(attachment: AskGloomPaneAttachment): boolean {
|
|
67
|
+
if (handlers.size === 0) return false;
|
|
68
|
+
for (const handler of [...handlers]) handler(attachment);
|
|
69
|
+
return true;
|
|
70
|
+
}
|