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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { NewsCapability } from "../../capabilities";
|
|
2
2
|
import type { PaneRuntimeState } from "../../core/state/app/state";
|
|
3
3
|
import type { LayoutMarketplacePayload } from "../../shares/portable-layout";
|
|
4
|
+
import type { PaneImageCapture } from "../../shares/pane-image";
|
|
5
|
+
import type { DialogOptions, PromptContext } from "../../ui/dialog";
|
|
4
6
|
import type { AppConfig, BrokerInstanceConfig, LayoutConfig } from "../../types/config";
|
|
5
7
|
import type { TickerFinancials } from "../../types/financials";
|
|
6
8
|
import type { NewsQuery, NewsQueryState } from "../../types/news-source";
|
|
@@ -42,6 +44,13 @@ export interface PluginHostActions {
|
|
|
42
44
|
/** `options.fieldKey` starts the cursor on that setting, as a setting picked in the command bar does. */
|
|
43
45
|
openPaneSettings(paneId?: string, options?: { fieldKey?: string }): void;
|
|
44
46
|
sharePane(paneId?: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* A picture of a pane (the focused one when omitted) as it looks now, its
|
|
49
|
+
* footer reading as a dated status line. Not on the plugin API.
|
|
50
|
+
*/
|
|
51
|
+
capturePaneImage(paneId?: string): Promise<PaneImageCapture>;
|
|
52
|
+
/** Opens a dialog from code outside a React tree, such as a command or a menu item. Not on the plugin API. */
|
|
53
|
+
promptDialog<T>(options: DialogOptions<PromptContext<T>>): Promise<T | undefined>;
|
|
45
54
|
openWindowMode(paneId?: string, mode?: WindowEditMode): void;
|
|
46
55
|
/** The shell's fullscreen toggle for a pane; false when there is nothing to fill the window with. */
|
|
47
56
|
togglePaneFullscreen(paneId: string): boolean;
|
|
@@ -105,6 +114,8 @@ export function createDefaultHostActions(current?: () => Pick<PluginHostActions,
|
|
|
105
114
|
openBuiltInWorkflow: () => {},
|
|
106
115
|
openPaneSettings: () => {},
|
|
107
116
|
sharePane: () => {},
|
|
117
|
+
capturePaneImage: async () => { throw new Error("Pictures of panes are not available here."); },
|
|
118
|
+
promptDialog: async () => undefined,
|
|
108
119
|
openWindowMode: () => {},
|
|
109
120
|
togglePaneFullscreen: () => false,
|
|
110
121
|
movePaneToNewLayout: () => false,
|
|
@@ -10,6 +10,14 @@ import {
|
|
|
10
10
|
connectionHealth as sharedConnectionHealth,
|
|
11
11
|
type ConnectionHealthRegistry,
|
|
12
12
|
} from "../../core/connection-health";
|
|
13
|
+
import { chartSeriesResolveRequestSchema } from "../../capabilities/chart-series";
|
|
14
|
+
import {
|
|
15
|
+
registeredSeriesCapability,
|
|
16
|
+
resolveRegisteredSeries,
|
|
17
|
+
seriesCatalogCapability,
|
|
18
|
+
} from "../../series/capability";
|
|
19
|
+
import { SeriesRegistry } from "../../series/registry";
|
|
20
|
+
import type { SeriesDefinition } from "../../series/types";
|
|
13
21
|
import { cloudSyncController } from "../../sync/controller";
|
|
14
22
|
import type {
|
|
15
23
|
RegisteredSyncContributor,
|
|
@@ -83,6 +91,9 @@ interface PluginRegistryOptions {
|
|
|
83
91
|
|
|
84
92
|
export type { WindowEditMode } from "./host-actions";
|
|
85
93
|
|
|
94
|
+
/** The owner the series catalog capability is registered under; no plugin can switch it off. */
|
|
95
|
+
const SERIES_CATALOG_OWNER = "gloomberb";
|
|
96
|
+
|
|
86
97
|
/** A switched-off plugin, named for a "Turn on" offer. */
|
|
87
98
|
export interface DisabledPluginOwner {
|
|
88
99
|
id: string;
|
|
@@ -112,6 +123,9 @@ export class PluginRegistry implements PluginRuntimeAccess {
|
|
|
112
123
|
|
|
113
124
|
readonly events: EventBus;
|
|
114
125
|
readonly capabilities: CapabilityRegistry;
|
|
126
|
+
/** Every series plugins registered here: what the data catalog lists. */
|
|
127
|
+
readonly series: SeriesRegistry;
|
|
128
|
+
private readonly seriesNamespaceCapabilities = new Map<string, () => void>();
|
|
115
129
|
readonly connectionHealth: ConnectionHealthRegistry;
|
|
116
130
|
readonly marketData: DataProvider;
|
|
117
131
|
readonly tickerRepository: AppTickerRepositoryPort;
|
|
@@ -136,11 +150,21 @@ export class PluginRegistry implements PluginRuntimeAccess {
|
|
|
136
150
|
operationId: string,
|
|
137
151
|
payload: unknown,
|
|
138
152
|
options: { signal?: AbortSignal } = {},
|
|
139
|
-
): Promise<T> =>
|
|
140
|
-
this
|
|
153
|
+
): Promise<T> => {
|
|
154
|
+
// A series registered in this process loads here, the desktop view
|
|
155
|
+
// included: its loaders fetch the way the panes that plot it do.
|
|
156
|
+
if (operationId === "resolve" && this.series.namespaceOwner(capabilityId)) {
|
|
157
|
+
const local = this.resolveLocalSeries(capabilityId, payload, options.signal);
|
|
158
|
+
if (local) return local as Promise<T>;
|
|
159
|
+
}
|
|
160
|
+
return this.remoteCapabilityInvoke
|
|
141
161
|
? this.remoteCapabilityInvoke<T>(capabilityId, operationId, payload, options)
|
|
142
|
-
: this.capabilities.invoke<T>(capabilityId, operationId, payload, { renderer: true, signal: options.signal })
|
|
143
|
-
|
|
162
|
+
: this.capabilities.invoke<T>(capabilityId, operationId, payload, { renderer: true, signal: options.signal });
|
|
163
|
+
};
|
|
164
|
+
/** True where capabilities run in another process (the desktop view), so a catalog asks that process too. */
|
|
165
|
+
get usesRemoteCapabilities(): boolean {
|
|
166
|
+
return !!this.remoteCapabilityInvoke;
|
|
167
|
+
}
|
|
144
168
|
getBrokerAdapter = (brokerType: string) => this.contributions.brokersMap.get(brokerType) ?? null;
|
|
145
169
|
listBrokerAdapters = () => [...this.contributions.brokersMap.values()];
|
|
146
170
|
|
|
@@ -186,6 +210,54 @@ export class PluginRegistry implements PluginRuntimeAccess {
|
|
|
186
210
|
},
|
|
187
211
|
connectionHealth: this.connectionHealth,
|
|
188
212
|
});
|
|
213
|
+
this.series = new SeriesRegistry({
|
|
214
|
+
pluginHosts: (pluginId) => this.plugins.get(pluginId)?.hosts,
|
|
215
|
+
onNamespaceChange: (namespace, pluginId) => this.updateSeriesNamespace(namespace, pluginId),
|
|
216
|
+
});
|
|
217
|
+
if (this.enableCapabilityHandlers) {
|
|
218
|
+
this.capabilities.register(SERIES_CATALOG_OWNER, seriesCatalogCapability(this.series));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
private resolveLocalSeries(namespace: string, payload: unknown, signal?: AbortSignal) {
|
|
223
|
+
const request = chartSeriesResolveRequestSchema.parse(payload);
|
|
224
|
+
const found = this.series.findLoaded(namespace, request.seriesId);
|
|
225
|
+
if (!found) return null;
|
|
226
|
+
if (this.getConfig().disabledPlugins.includes(found.series.pluginId)) {
|
|
227
|
+
const name = this.plugins.get(found.series.pluginId)?.name ?? found.series.pluginId;
|
|
228
|
+
return Promise.reject(new Error(`Turn on ${name} to chart ${found.series.definition.name}.`));
|
|
229
|
+
}
|
|
230
|
+
return resolveRegisteredSeries(this.series, namespace, request.seriesId, request.viewport, signal)
|
|
231
|
+
.then((resolved) => {
|
|
232
|
+
if (!resolved) throw new Error(`No series ${namespace}:${request.seriesId} is registered.`);
|
|
233
|
+
return resolved;
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Gives a namespace with loaded series its chart-series capability, for automation and other processes. */
|
|
238
|
+
private updateSeriesNamespace(namespace: string, pluginId: string | null): void {
|
|
239
|
+
this.seriesNamespaceCapabilities.get(namespace)?.();
|
|
240
|
+
this.seriesNamespaceCapabilities.delete(namespace);
|
|
241
|
+
if (!pluginId || !this.enableCapabilityHandlers) return;
|
|
242
|
+
try {
|
|
243
|
+
this.seriesNamespaceCapabilities.set(namespace, this.capabilities.register(
|
|
244
|
+
pluginId,
|
|
245
|
+
registeredSeriesCapability(this.series, namespace),
|
|
246
|
+
));
|
|
247
|
+
} catch (error) {
|
|
248
|
+
// A capability of the same id already answers there; the series still resolve in this process.
|
|
249
|
+
this.registryLog.warn("Series namespace has no capability", {
|
|
250
|
+
namespace,
|
|
251
|
+
pluginId,
|
|
252
|
+
error: error instanceof Error ? error.message : String(error),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private registerSeriesForPlugin(pluginId: string, series: SeriesDefinition, items: PluginItems): () => void {
|
|
258
|
+
const dispose = this.series.register(pluginId, series);
|
|
259
|
+
items.capabilityDisposers.push(dispose);
|
|
260
|
+
return dispose;
|
|
189
261
|
}
|
|
190
262
|
|
|
191
263
|
/**
|
|
@@ -526,6 +598,7 @@ export class PluginRegistry implements PluginRuntimeAccess {
|
|
|
526
598
|
registerShortcut: (shortcut) => contributions.registerShortcut(pluginId, shortcut),
|
|
527
599
|
registerTickerAction: (action) => contributions.registerTickerAction(pluginId, action),
|
|
528
600
|
registerContextMenuProvider: (provider) => contributions.registerContextMenuProvider(pluginId, provider),
|
|
601
|
+
registerSeries: (series) => this.registerSeriesForPlugin(pluginId, series, items),
|
|
529
602
|
registerSyncContributor: (contributor) => {
|
|
530
603
|
const dispose = this.registerSyncContributorForPlugin(pluginId, contributor);
|
|
531
604
|
items.eventDisposers.push(dispose);
|
|
@@ -615,6 +688,18 @@ export class PluginRegistry implements PluginRuntimeAccess {
|
|
|
615
688
|
}
|
|
616
689
|
}
|
|
617
690
|
|
|
691
|
+
for (const series of plugin.series ?? []) {
|
|
692
|
+
try {
|
|
693
|
+
this.registerSeriesForPlugin(plugin.id, series, items);
|
|
694
|
+
} catch (error) {
|
|
695
|
+
// One bad entry in a long list leaves the plugin's other series and panes working.
|
|
696
|
+
this.registryLog.error("Series skipped", {
|
|
697
|
+
pluginId: plugin.id,
|
|
698
|
+
error: error instanceof Error ? error.message : String(error),
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
618
703
|
this.slots.register(plugin, (renderer) => withPluginRender(this.stateNamespace(plugin.id), this, renderer));
|
|
619
704
|
|
|
620
705
|
const setupCommand = createPluginSetupCommand(plugin, {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Collections an unknown-name error lists, so the caller can retry with one. */
|
|
2
|
+
const LISTED_COLLECTIONS = 12;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The portfolio or watchlist an argument names, by its id or its name,
|
|
6
|
+
* trimmed and in any case: `Family`, `family` and `FAMILY` are one portfolio.
|
|
7
|
+
* An exact id wins over another collection's name. Every command and function
|
|
8
|
+
* that takes a portfolio or watchlist argument reads it here.
|
|
9
|
+
*/
|
|
10
|
+
export function findNamedCollection<T extends { id: string; name: string }>(
|
|
11
|
+
collections: readonly T[],
|
|
12
|
+
raw: string | null | undefined,
|
|
13
|
+
): T | null {
|
|
14
|
+
const wanted = raw?.trim() ?? "";
|
|
15
|
+
if (!wanted) return null;
|
|
16
|
+
const exact = collections.find((entry) => entry.id === wanted);
|
|
17
|
+
if (exact) return exact;
|
|
18
|
+
const normalized = wanted.toLowerCase();
|
|
19
|
+
return collections.find((entry) => (
|
|
20
|
+
entry.id.toLowerCase() === normalized || entry.name.trim().toLowerCase() === normalized
|
|
21
|
+
)) ?? null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** "Main Portfolio (main), Family (family)": each collection's name and id, for an error naming what there is. */
|
|
25
|
+
export function describeCollections(collections: readonly { id: string; name: string }[]): string {
|
|
26
|
+
const listed = collections.slice(0, LISTED_COLLECTIONS).map(({ id, name }) => (
|
|
27
|
+
name.trim() && name.trim() !== id ? `${name.trim()} (${id})` : id
|
|
28
|
+
));
|
|
29
|
+
const more = collections.length - LISTED_COLLECTIONS;
|
|
30
|
+
return `${listed.join(", ")}${more > 0 ? ` and ${more} more` : ""}`;
|
|
31
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { TickerRecord } from "
|
|
2
|
-
import type { Quote } from "
|
|
3
|
-
import type { PriceBasis } from "
|
|
4
|
-
import { resolvePriceBasis } from "
|
|
5
|
-
import { getActiveQuoteDisplay, type ActiveQuoteDisplay } from "
|
|
6
|
-
import { resolveCurrencyUnit } from "
|
|
1
|
+
import type { TickerRecord } from "../types/ticker";
|
|
2
|
+
import type { Quote } from "../types/financials";
|
|
3
|
+
import type { PriceBasis } from "../types/instrument";
|
|
4
|
+
import { resolvePriceBasis } from "../market-data/market/price-basis";
|
|
5
|
+
import { getActiveQuoteDisplay, type ActiveQuoteDisplay } from "../market-data/market/status";
|
|
6
|
+
import { resolveCurrencyUnit } from "../utils/currency-units";
|
|
7
7
|
|
|
8
8
|
export interface PortfolioPositionMetrics {
|
|
9
9
|
positionCurrency: string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TickerFinancials } from "../types/financials";
|
|
2
|
+
import type { TickerRecord } from "../types/ticker";
|
|
3
|
+
import { convertCurrency } from "../utils/format";
|
|
4
|
+
import { getPortfolioPositionMetrics, getPortfolioQuoteDisplay, resolvePortfolioMarketValue } from "./position-metrics";
|
|
5
|
+
|
|
6
|
+
export function getPortfolioPositionValue({
|
|
7
|
+
ticker,
|
|
8
|
+
financials,
|
|
9
|
+
portfolioId,
|
|
10
|
+
baseCurrency,
|
|
11
|
+
exchangeRates,
|
|
12
|
+
}: {
|
|
13
|
+
ticker: TickerRecord | null;
|
|
14
|
+
financials: TickerFinancials | null;
|
|
15
|
+
portfolioId: string | null;
|
|
16
|
+
baseCurrency: string;
|
|
17
|
+
exchangeRates: Map<string, number>;
|
|
18
|
+
}): number {
|
|
19
|
+
if (!ticker) return 0;
|
|
20
|
+
const scopedTicker: TickerRecord = portfolioId
|
|
21
|
+
? {
|
|
22
|
+
...ticker,
|
|
23
|
+
metadata: {
|
|
24
|
+
...ticker.metadata,
|
|
25
|
+
positions: ticker.metadata.positions.filter((position) => position.portfolio === portfolioId),
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
: ticker;
|
|
29
|
+
const quote = financials?.quote;
|
|
30
|
+
|
|
31
|
+
const quoteCurrency = quote?.currency || ticker.metadata.currency || baseCurrency;
|
|
32
|
+
const metrics = getPortfolioPositionMetrics(scopedTicker, undefined, quoteCurrency, {
|
|
33
|
+
currency: baseCurrency, convert: (value, currency) => convertCurrency(value, currency, baseCurrency, exchangeRates),
|
|
34
|
+
}, quote);
|
|
35
|
+
const activeQuote = getPortfolioQuoteDisplay(metrics, quote);
|
|
36
|
+
|
|
37
|
+
return resolvePortfolioMarketValue(metrics, activeQuote
|
|
38
|
+
? convertCurrency(activeQuote.price, quoteCurrency, baseCurrency, exchangeRates) : null)?.gross
|
|
39
|
+
?? (metrics.positionCount > 0 ? Number.NaN : 0);
|
|
40
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { Quote } from "../types/financials";
|
|
2
|
+
import { latestRegularSessionClose } from "../market-data/market/freshness";
|
|
3
|
+
import { getCompletedRegularSessionDisplay, type ActiveQuoteDisplay } from "../market-data/market/status";
|
|
4
|
+
import { quoteTradingDay } from "../market-data/quotes/day-range";
|
|
5
|
+
import type { ReportTime } from "../utils/utc-time";
|
|
6
|
+
import { getPortfolioQuoteDisplay, type PortfolioPositionMetrics } from "./position-metrics";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* What a portfolio's market value is priced at. `latest-print` (the default,
|
|
10
|
+
* as brokers value a book) takes the last trade, pre-market and after hours
|
|
11
|
+
* included. `regular-close` takes the price Last shows: the regular session's
|
|
12
|
+
* close once it is over, so a value is Last times the shares.
|
|
13
|
+
*/
|
|
14
|
+
export type PortfolioValuationBasis = "latest-print" | "regular-close";
|
|
15
|
+
|
|
16
|
+
/** The basis as reports and panes state it, after "Priced at". */
|
|
17
|
+
export const VALUATION_BASIS_LABELS: Record<PortfolioValuationBasis, string> = {
|
|
18
|
+
"latest-print": "the latest print, extended hours included",
|
|
19
|
+
"regular-close": "the regular close",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** Whether the regular close values this position: an option keeps its mark on either basis. */
|
|
23
|
+
function valuesAtClose(metrics: Pick<PortfolioPositionMetrics, "valuesAtMark"> | null, basis: PortfolioValuationBasis): boolean {
|
|
24
|
+
return basis === "regular-close" && !metrics?.valuesAtMark;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The price a position is valued at on `basis`. The latest print is
|
|
29
|
+
* getPortfolioQuoteDisplay's. The regular close is the completed regular
|
|
30
|
+
* session's close and its move (getCompletedRegularSessionDisplay), the
|
|
31
|
+
* headline Last and Chg show, and the live price while that session trades.
|
|
32
|
+
*/
|
|
33
|
+
export function getPortfolioValuationDisplay(
|
|
34
|
+
metrics: PortfolioPositionMetrics,
|
|
35
|
+
quote: Quote | null | undefined,
|
|
36
|
+
basis: PortfolioValuationBasis = "latest-print",
|
|
37
|
+
): ActiveQuoteDisplay | null {
|
|
38
|
+
const live = getPortfolioQuoteDisplay(metrics, quote);
|
|
39
|
+
if (!live || !valuesAtClose(metrics, basis)) return live;
|
|
40
|
+
return getCompletedRegularSessionDisplay(quote) ?? live;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* When the completed regular session the quote reports closed: the venue's
|
|
45
|
+
* close on that day from its calendar, or the day alone when the calendar does
|
|
46
|
+
* not give the hour.
|
|
47
|
+
*/
|
|
48
|
+
function regularCloseTime(quote: Quote): ReportTime | null {
|
|
49
|
+
const date = quote.regularCloseSessionDate ?? quoteTradingDay(quote);
|
|
50
|
+
const exchange = quote.listingExchangeName || quote.exchangeName;
|
|
51
|
+
const close = exchange && Number.isFinite(quote.lastUpdated) ? latestRegularSessionClose(exchange, quote.lastUpdated) : null;
|
|
52
|
+
if (close && (!date || close.date === date)) return { time: close.close, dateOnly: false };
|
|
53
|
+
const day = date ? Date.parse(`${date}T00:00:00Z`) : Number.NaN;
|
|
54
|
+
return Number.isFinite(day) ? { time: day, dateOnly: true } : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* When the price a position is valued at on `basis` is from: the quote's time
|
|
59
|
+
* for a print, the session's close for a regular close. Null without a dated quote.
|
|
60
|
+
*/
|
|
61
|
+
export function getPortfolioValuationTime(
|
|
62
|
+
quote: Quote | null | undefined,
|
|
63
|
+
basis: PortfolioValuationBasis = "latest-print",
|
|
64
|
+
metrics: Pick<PortfolioPositionMetrics, "valuesAtMark"> | null = null,
|
|
65
|
+
): ReportTime | null {
|
|
66
|
+
if (!quote) return null;
|
|
67
|
+
if (valuesAtClose(metrics, basis) && getCompletedRegularSessionDisplay(quote)) {
|
|
68
|
+
const close = regularCloseTime(quote);
|
|
69
|
+
if (close) return close;
|
|
70
|
+
}
|
|
71
|
+
return Number.isFinite(quote.lastUpdated) && quote.lastUpdated > 0 ? { time: quote.lastUpdated, dateOnly: false } : null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** A valuation time as exports write it: an ISO instant in UTC, or an ISO date. */
|
|
75
|
+
export function valuationTimeIso(time: ReportTime | null): string | null {
|
|
76
|
+
if (!time) return null;
|
|
77
|
+
const iso = new Date(time.time).toISOString();
|
|
78
|
+
return time.dateOnly ? iso.slice(0, 10) : iso;
|
|
79
|
+
}
|
|
@@ -367,9 +367,12 @@ exports[`the runtime exports of every public subpath are the reviewed ones 1`] =
|
|
|
367
367
|
"CHART_RESOLUTION_STEP_MS",
|
|
368
368
|
"CHART_SPEC_VERSION",
|
|
369
369
|
"DEFAULT_CHART_RESOLUTION_SUPPORT",
|
|
370
|
+
"SERIES_FREQUENCIES",
|
|
370
371
|
"TIME_RANGES",
|
|
371
372
|
"TIME_RANGE_ORDER",
|
|
372
373
|
"clampTimeRangeToMaxRange",
|
|
374
|
+
"defineSeries",
|
|
375
|
+
"describeSeriesUnits",
|
|
373
376
|
"getBestSupportedResolutionForVisibleWindow",
|
|
374
377
|
"getChartResolutionLabel",
|
|
375
378
|
"getExpandedBufferRange",
|
|
@@ -378,12 +381,16 @@ exports[`the runtime exports of every public subpath are the reviewed ones 1`] =
|
|
|
378
381
|
"getSupportMaxRange",
|
|
379
382
|
"getSupportedChartResolutionsForViewport",
|
|
380
383
|
"getSupportedPresetResolution",
|
|
384
|
+
"inferSeriesFrequency",
|
|
381
385
|
"intersectChartResolutionSupport",
|
|
382
386
|
"isIntradayResolution",
|
|
383
387
|
"isRangePresetSupported",
|
|
388
|
+
"isValidSeriesUnit",
|
|
384
389
|
"normalizeChartResolution",
|
|
385
390
|
"normalizeChartResolutionSupport",
|
|
391
|
+
"parseSeriesCsv",
|
|
386
392
|
"sortChartResolutions",
|
|
393
|
+
"validateSeriesDefinition",
|
|
387
394
|
],
|
|
388
395
|
"./types/broker": [
|
|
389
396
|
"resolveBrokerConfigFields",
|
|
@@ -38,3 +38,20 @@ export type {
|
|
|
38
38
|
SecuritySeriesSource, SeriesAxis, SeriesDataShape, SeriesInterpolation, SeriesPeriod, SeriesStyle,
|
|
39
39
|
SeriesTimestampMode, SeriesTransform, TimeSeriesFieldDefinition, TimeSeriesPoint,
|
|
40
40
|
} from "../time-series/types";
|
|
41
|
+
|
|
42
|
+
// Series a plugin adds to the data catalog, chartable against any other
|
|
43
|
+
// catalog entry: `series` on the plugin, or `ctx.registerSeries` from setup.
|
|
44
|
+
// PLUGINS.md ("Data catalog series") shows both, and series from a file.
|
|
45
|
+
export {
|
|
46
|
+
defineSeries, describeSeriesUnits, isValidSeriesUnit, SERIES_FREQUENCIES, validateSeriesDefinition,
|
|
47
|
+
} from "../series/validate";
|
|
48
|
+
export {
|
|
49
|
+
inferSeriesFrequency, parseSeriesCsv,
|
|
50
|
+
} from "../series/csv";
|
|
51
|
+
export type {
|
|
52
|
+
ParsedSeriesCsv, SeriesCsvColumn, SeriesCsvMetadata,
|
|
53
|
+
} from "../series/csv";
|
|
54
|
+
export type {
|
|
55
|
+
ExpressionSeriesDefinition, LoadedSeriesDefinition, SeriesDefinition, SeriesDrawStyle, SeriesFrequency,
|
|
56
|
+
SeriesAttribution, SeriesInput, SeriesLoadOutput, SeriesLoadRequest, SeriesLoadResult, SeriesPoint,
|
|
57
|
+
} from "../series/types";
|
|
@@ -13,17 +13,27 @@ export const AGE_TICK_MS = 30_000;
|
|
|
13
13
|
* rests while the pane cannot be seen and catches up when it can.
|
|
14
14
|
*/
|
|
15
15
|
export function useUpdatedAgo(lastUpdated: number | null): string | null {
|
|
16
|
+
const now = useAgeClock(lastUpdated);
|
|
17
|
+
return lastUpdated ? formatRelativeAge(lastUpdated, now) : null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The time a label that says how old data is reads against: it moves every
|
|
22
|
+
* `AGE_TICK_MS` once the data has loaded (`since`, restarting when it
|
|
23
|
+
* reloads), and rests while the pane cannot be seen.
|
|
24
|
+
*/
|
|
25
|
+
export function useAgeClock(since: number | null): number {
|
|
16
26
|
const visible = usePaneVisible();
|
|
17
27
|
const [now, setNow] = useState(() => Date.now());
|
|
18
28
|
|
|
19
29
|
useEffect(() => {
|
|
20
|
-
if (!
|
|
30
|
+
if (!since || !visible) return;
|
|
21
31
|
setNow(Date.now());
|
|
22
32
|
const timer = setInterval(() => setNow(Date.now()), AGE_TICK_MS);
|
|
23
33
|
return () => clearInterval(timer);
|
|
24
|
-
}, [
|
|
34
|
+
}, [since, visible]);
|
|
25
35
|
|
|
26
|
-
return
|
|
36
|
+
return now;
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
export interface AutoRefreshOptions {
|
package/src/react/input.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
useRef,
|
|
7
7
|
type ReactNode,
|
|
8
8
|
} from "react";
|
|
9
|
+
import { keySignature, mayRepeat } from "./key-repeat";
|
|
9
10
|
|
|
10
11
|
export interface KeyEventLike {
|
|
11
12
|
key: string;
|
|
@@ -17,6 +18,12 @@ export interface KeyEventLike {
|
|
|
17
18
|
meta: boolean;
|
|
18
19
|
super?: boolean;
|
|
19
20
|
targetEditable?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* The platform sent this press because the key is held down (DOM `repeat`,
|
|
23
|
+
* the kitty protocol's repeat event). Absent where the host cannot tell,
|
|
24
|
+
* such as a terminal that does not report event types.
|
|
25
|
+
*/
|
|
26
|
+
readonly repeat?: boolean;
|
|
20
27
|
readonly defaultPrevented?: boolean;
|
|
21
28
|
readonly propagationStopped?: boolean;
|
|
22
29
|
preventDefault(): void;
|
|
@@ -104,7 +111,7 @@ export function createShortcutRegistry({ flushSync }: ShortcutRegistryOptions =
|
|
|
104
111
|
const entries = new Map<number, ShortcutEntry>();
|
|
105
112
|
const beforeListeners = new Set<(event: KeyEventLike) => void>();
|
|
106
113
|
|
|
107
|
-
|
|
114
|
+
const registry: ShortcutRegistry = {
|
|
108
115
|
register(registration) {
|
|
109
116
|
const order = nextOrder++;
|
|
110
117
|
entries.set(order, {
|
|
@@ -153,6 +160,31 @@ export function createShortcutRegistry({ flushSync }: ShortcutRegistryOptions =
|
|
|
153
160
|
}
|
|
154
161
|
},
|
|
155
162
|
};
|
|
163
|
+
|
|
164
|
+
// A held key repeats its press. Only the keys meant to repeat (key-repeat.ts)
|
|
165
|
+
// reach the handlers again; the rest already ran when the key went down.
|
|
166
|
+
// `lastPress` is that press: a repeat of a key the app claimed stays claimed,
|
|
167
|
+
// or the webview would act on it itself (a beep on macOS).
|
|
168
|
+
let lastPress: { signature: string; claimed: boolean } | null = null;
|
|
169
|
+
return {
|
|
170
|
+
...registry,
|
|
171
|
+
dispatch(event) {
|
|
172
|
+
if (event.repeat === true && !mayRepeat(event)) {
|
|
173
|
+
if (lastPress?.claimed && lastPress.signature === keySignature(event)) {
|
|
174
|
+
event.preventDefault();
|
|
175
|
+
event.stopPropagation();
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
registry.dispatch(event);
|
|
180
|
+
if (event.repeat !== true) {
|
|
181
|
+
lastPress = {
|
|
182
|
+
signature: keySignature(event),
|
|
183
|
+
claimed: event.defaultPrevented === true || event.propagationStopped === true,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
};
|
|
156
188
|
}
|
|
157
189
|
|
|
158
190
|
export function useRegisteredShortcut(
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { KeyEventLike } from "./input";
|
|
2
|
+
|
|
3
|
+
type RepeatKey = Pick<KeyEventLike, "name" | "key" | "ctrl" | "meta" | "super" | "shift" | "alt" | "targetEditable">;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Holding a key makes the platform send it again about thirty times a second
|
|
7
|
+
* (`repeat` on a DOM key event, the repeat event type of the kitty keyboard
|
|
8
|
+
* protocol). Most of what a key does should happen once per press, so the
|
|
9
|
+
* shortcut registry drops a repeat before any handler sees it unless the key
|
|
10
|
+
* is meant to repeat.
|
|
11
|
+
*
|
|
12
|
+
* Only keys that run a command are held to that: a command chord (Ctrl, Cmd or
|
|
13
|
+
* Super with a key), Escape, a function key and the menu key. Letters,
|
|
14
|
+
* digits, Enter, Space and the other plain keys pass untouched, because a pane
|
|
15
|
+
* binds them for typing, stepping and zooming (j and k, + and -, [ and ]) and
|
|
16
|
+
* nothing here can tell those from a one-shot. The core actions bound to a
|
|
17
|
+
* plain key (help, refresh, the pane menu) fire once through the cooldown on
|
|
18
|
+
* their own handlers instead.
|
|
19
|
+
*
|
|
20
|
+
* A command key repeats when it is on the allow-list below.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** Move, scroll, select and delete, with any modifier: Ctrl+Left, Cmd+Backspace, Shift+Down. */
|
|
24
|
+
const REPEATING_KEY_NAMES: ReadonlySet<string> = new Set([
|
|
25
|
+
"up",
|
|
26
|
+
"down",
|
|
27
|
+
"left",
|
|
28
|
+
"right",
|
|
29
|
+
"pageup",
|
|
30
|
+
"pagedown",
|
|
31
|
+
"home",
|
|
32
|
+
"end",
|
|
33
|
+
"tab",
|
|
34
|
+
"backspace",
|
|
35
|
+
"delete",
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
/** Ctrl+N and Ctrl+P step a list selection; they are the arrow keys of a terminal. */
|
|
39
|
+
const LIST_STEP_LETTERS: ReadonlySet<string> = new Set(["n", "p"]);
|
|
40
|
+
|
|
41
|
+
/** The editing chords of a text field: delete word, line, character, kill and yank. Ctrl only, and only in a field. */
|
|
42
|
+
const FIELD_EDIT_LETTERS: ReadonlySet<string> = new Set(["a", "b", "d", "e", "f", "h", "k", "u", "w", "y"]);
|
|
43
|
+
|
|
44
|
+
function keyName(event: Pick<KeyEventLike, "name" | "key">): string {
|
|
45
|
+
return (event.name ?? event.key ?? "").toLowerCase();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function isCommandKey(event: RepeatKey, name: string): boolean {
|
|
49
|
+
if (event.ctrl || event.meta || event.super === true) return true;
|
|
50
|
+
return name === "escape" || name === "esc" || name === "contextmenu" || name === "menu" || /^f([1-9]|1\d|2[0-4])$/.test(name);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Whether a held key keeps firing: true for typing and moving, false for a command that should run once. */
|
|
54
|
+
export function mayRepeat(event: RepeatKey): boolean {
|
|
55
|
+
const name = keyName(event);
|
|
56
|
+
if (!isCommandKey(event, name)) return true;
|
|
57
|
+
if (REPEATING_KEY_NAMES.has(name)) return true;
|
|
58
|
+
const ctrlOnly = event.ctrl && !event.meta && event.super !== true && !event.alt && !event.shift;
|
|
59
|
+
if (!ctrlOnly) return false;
|
|
60
|
+
if (LIST_STEP_LETTERS.has(name)) return true;
|
|
61
|
+
return event.targetEditable === true && FIELD_EDIT_LETTERS.has(name);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Plain keys a pane's footer hint keeps repeating: moving, paging, stepping and
|
|
66
|
+
* zooming (`[` `]` `<` `>` `+` `-` `=`, and the vim letters). Any other hint key
|
|
67
|
+
* (an add, an export, a pause on Space) runs once per press: the footer drops
|
|
68
|
+
* its repeats, so a held key never opens a dialog or writes a file again.
|
|
69
|
+
*/
|
|
70
|
+
const REPEATING_HINT_KEYS: ReadonlySet<string> = new Set([
|
|
71
|
+
...REPEATING_KEY_NAMES,
|
|
72
|
+
"j", "k", "h", "l",
|
|
73
|
+
"[", "]", "<", ">", "+", "-", "=", "_",
|
|
74
|
+
]);
|
|
75
|
+
|
|
76
|
+
/** Whether a held key keeps pressing the footer hint it names. Chords follow `mayRepeat`; plain keys must be a movement or zoom key. */
|
|
77
|
+
export function hintMayRepeat(event: RepeatKey): boolean {
|
|
78
|
+
const name = keyName(event);
|
|
79
|
+
return isCommandKey(event, name) ? mayRepeat(event) : REPEATING_HINT_KEYS.has(name);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** The key and its modifiers, to tell whether a repeat belongs to the press that came before it. */
|
|
83
|
+
export function keySignature(event: RepeatKey): string {
|
|
84
|
+
const modifiers = [event.ctrl, event.alt, event.meta, event.shift, event.super === true].map(Number).join("");
|
|
85
|
+
return `${modifiers}:${keyName(event)}`;
|
|
86
|
+
}
|
package/src/remote/app-host.tsx
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { createContext, useContext, useEffect, useMemo } from "react";
|
|
1
|
+
import { createContext, useContext, useEffect, useMemo, useRef } from "react";
|
|
2
2
|
import type { Dispatch, ReactNode } from "react";
|
|
3
3
|
import type { PluginRegistry } from "../plugins/registry";
|
|
4
4
|
import type { AppAction, AppState } from "../state/app/context";
|
|
5
5
|
import type { DesktopWindowBridge } from "../types/desktop-window";
|
|
6
|
+
import { useOptionalDialog } from "../ui/dialog";
|
|
7
|
+
import { confirmRemoteChange } from "./confirm-change";
|
|
6
8
|
import { createAppRemoteController } from "./controller";
|
|
7
9
|
import { useRemoteUiRegistry } from "./semantic-tree";
|
|
8
|
-
import type {
|
|
10
|
+
import type { CapturePane } from "./pane-screenshot";
|
|
11
|
+
import type { RemoteCallContext, RemoteControlRequest, RemoteControlResponse } from "./types";
|
|
9
12
|
|
|
10
|
-
|
|
13
|
+
/** `context` is for callers inside this process; the local endpoint sends requests alone. */
|
|
14
|
+
export type RemoteControlHandler = (request: RemoteControlRequest, context?: RemoteCallContext) => Promise<RemoteControlResponse>;
|
|
11
15
|
|
|
12
16
|
const RemoteControlHandlerContext = createContext<RemoteControlHandler | null>(null);
|
|
13
17
|
|
|
@@ -28,6 +32,8 @@ export interface RemoteControlAdapter {
|
|
|
28
32
|
* kind of app it is and the machine name it shows under.
|
|
29
33
|
*/
|
|
30
34
|
terminalDevice?: { kind: "desktop" | "tui"; name: string };
|
|
35
|
+
/** Paints a pane of this window for pane.screenshot; only the desktop app has one. */
|
|
36
|
+
capturePane?: CapturePane;
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
interface RemoteControlHostProps {
|
|
@@ -48,12 +54,22 @@ export function RemoteControlHost({
|
|
|
48
54
|
desktopWindowBridge,
|
|
49
55
|
}: RemoteControlHostProps) {
|
|
50
56
|
const uiRegistry = useRemoteUiRegistry();
|
|
57
|
+
// Read at call time, so a new dialog host never restarts the server.
|
|
58
|
+
const dialog = useOptionalDialog();
|
|
59
|
+
const dialogRef = useRef(dialog);
|
|
60
|
+
dialogRef.current = dialog;
|
|
51
61
|
const controller = useMemo(() => createAppRemoteController({
|
|
52
62
|
dispatch,
|
|
53
63
|
getState,
|
|
54
64
|
pluginRegistry,
|
|
55
65
|
uiRegistry,
|
|
56
66
|
desktopWindowBridge,
|
|
67
|
+
capturePane: adapter?.capturePane,
|
|
68
|
+
confirmChange: async (prompt, signal) => {
|
|
69
|
+
const host = dialogRef.current;
|
|
70
|
+
if (!host) throw new Error("This window cannot ask for confirmation, so nothing changed.");
|
|
71
|
+
return confirmRemoteChange(host, prompt, signal);
|
|
72
|
+
},
|
|
57
73
|
afterMutation: async () => {
|
|
58
74
|
await Promise.resolve();
|
|
59
75
|
await new Promise((resolve) => {
|
|
@@ -70,7 +86,7 @@ export function RemoteControlHost({
|
|
|
70
86
|
});
|
|
71
87
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
72
88
|
},
|
|
73
|
-
}), [desktopWindowBridge, dispatch, getState, pluginRegistry, uiRegistry]);
|
|
89
|
+
}), [adapter?.capturePane, desktopWindowBridge, dispatch, getState, pluginRegistry, uiRegistry]);
|
|
74
90
|
const dataDir = getState().config.dataDir;
|
|
75
91
|
|
|
76
92
|
useEffect(() => {
|