gloomberb 0.16.3 → 0.16.5
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 +7 -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 +42 -17
- package/src/account/upgrade-personalization.ts +57 -0
- package/src/account/upgrade-tickers.ts +124 -0
- package/src/{plugins/builtin/cloud → account}/verification-panel.tsx +6 -6
- package/src/api-client/askg.ts +43 -0
- package/src/api-client/auth.ts +15 -0
- package/src/api-client/beneficial-owners.ts +4 -0
- package/src/api-client/chat.ts +19 -0
- package/src/api-client/company-kpis.ts +14 -2
- package/src/api-client/data.ts +58 -18
- package/src/api-client/earnings.ts +6 -0
- package/src/api-client/futures-curve.ts +56 -0
- package/src/api-client/index.ts +16 -1
- package/src/api-client/market-discovery.ts +10 -1
- package/src/api-client/normalizers.ts +27 -0
- package/src/api-client/paths.ts +95 -23
- package/src/api-client/request.ts +2 -1
- package/src/api-client/research-activity.ts +46 -10
- package/src/api-client/socket.ts +39 -8
- package/src/api-client/types.ts +74 -2
- package/src/api-client/upgrade-experiment.ts +90 -0
- package/src/api-client/yield-curves.ts +8 -0
- package/src/app/global-shortcuts.ts +26 -2
- package/src/app/keybindings/actions.ts +10 -0
- package/src/app/pane-runtime/index.tsx +8 -0
- package/src/app/pane-runtime/pane-template-runtime.ts +5 -0
- package/src/app/pane-runtime/plugin-bindings.ts +65 -25
- package/src/app/pane-runtime/ticker-inspector-runtime.ts +12 -0
- package/src/app/pane-runtime/ticker-open-runtime.ts +25 -4
- package/src/app/runtime/desktop-deeplink.ts +5 -0
- package/src/app/star-prompt/model.ts +98 -0
- package/src/app/star-prompt/runtime.ts +41 -0
- package/src/app/star-prompt/status-line.tsx +190 -0
- package/src/app.tsx +13 -7
- package/src/architecture/core-builtin-allowlist.json +61 -0
- package/src/brokers/signed-in/adapter.ts +33 -2
- package/src/brokers/signed-in/client.ts +10 -0
- package/src/brokers/signed-in/sign-in-dialog.tsx +34 -14
- package/src/brokers/signed-in/sign-in.ts +62 -5
- package/src/capabilities/chart-series.ts +11 -1
- package/src/capabilities/registry.ts +8 -1
- package/src/capabilities/types.ts +2 -0
- package/src/cli/commands/crypto-hints.ts +19 -4
- package/src/cli/commands/fred-series.ts +61 -0
- package/src/cli/commands/market.ts +744 -181
- package/src/cli/commands/news-hints.ts +62 -0
- package/src/cli/commands/news-search.ts +53 -0
- package/src/cli/commands/options-chain.ts +172 -0
- package/src/cli/commands/options-leaps.ts +425 -0
- package/src/cli/commands/overview.ts +251 -40
- package/src/cli/commands/remote.ts +2 -1
- package/src/cli/commands/search.ts +109 -15
- package/src/cli/commands/system.ts +151 -24
- package/src/cli/commands/themes.ts +64 -0
- package/src/cli/commands/ticker.ts +149 -40
- package/src/cli/context.ts +45 -14
- package/src/cli/desktop-pane-shot.ts +150 -17
- package/src/cli/earnings-calendar.ts +71 -0
- package/src/cli/errors.ts +25 -2
- package/src/cli/freshness.ts +22 -8
- package/src/cli/fx-pair.ts +57 -0
- package/src/cli/glossary.ts +429 -0
- package/src/cli/help.ts +14 -1
- package/src/cli/history-rows.ts +48 -7
- package/src/cli/index-roots.ts +58 -0
- package/src/cli/index.ts +29 -12
- package/src/cli/known-gaps.ts +27 -0
- package/src/cli/listing-arg.ts +595 -26
- package/src/cli/not-a-ticker.ts +44 -0
- package/src/cli/options.ts +50 -6
- package/src/cli/pane-functions/access-gate.ts +5 -0
- package/src/cli/pane-functions/capabilities.ts +11 -4
- package/src/cli/pane-functions/catalog.ts +48 -7
- package/src/cli/pane-functions/data.ts +48 -13
- package/src/cli/pane-functions/discovery.ts +1 -0
- package/src/cli/pane-functions/dom.ts +41 -19
- package/src/cli/pane-functions/freshness.ts +531 -32
- package/src/cli/pane-functions/function-help.ts +77 -25
- package/src/cli/pane-functions/headless.ts +50 -21
- package/src/cli/pane-functions/index.ts +66 -10
- package/src/cli/pane-functions/market-session.ts +147 -0
- package/src/cli/pane-functions/options.ts +77 -25
- package/src/cli/pane-functions/report-notices.ts +81 -0
- package/src/cli/pane-functions/report.ts +19 -8
- package/src/cli/pane-functions/resolver.ts +53 -18
- package/src/cli/pane-functions/screenshot-evidence.ts +2 -0
- package/src/cli/pane-functions/screenshot.ts +199 -30
- package/src/cli/registry.ts +2 -1
- package/src/cli/report-tables.ts +3 -0
- package/src/cli/result.ts +53 -13
- package/src/cli/row-window.ts +76 -0
- package/src/cli/scroll-truncation.ts +34 -0
- package/src/cli/staged-tickers.ts +52 -0
- package/src/cli/symbol-args.ts +9 -0
- package/src/cli/symbol-list.ts +172 -0
- package/src/cli/ticker-resolution.ts +223 -30
- package/src/cli/types.ts +5 -0
- package/src/components/chart/composite/axis-overlays.tsx +6 -2
- package/src/components/chart/composite/composite-chart.tsx +83 -10
- package/src/components/chart/composite/legend.tsx +88 -8
- package/src/components/chart/composite/panel-surface.tsx +44 -17
- package/src/components/chart/composite/price-axis-labels.tsx +3 -1
- package/src/components/chart/composite/rasterizer.ts +64 -4
- package/src/components/chart/composite/series-cues.ts +71 -0
- package/src/components/chart/composite/text-renderer.ts +16 -8
- package/src/components/chart/composite/types.ts +3 -0
- package/src/components/command-bar/commands/direct/index.ts +9 -1
- package/src/components/command-bar/commands/plugin/items.ts +3 -1
- package/src/components/command-bar/commands/registry.ts +7 -0
- package/src/components/command-bar/layout-items/focused-pane.ts +38 -0
- package/src/components/command-bar/pane-templates/workflow.ts +5 -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/command-items.ts +2 -0
- package/src/components/command-bar/routes/root/plugin-turn-on.ts +92 -0
- package/src/components/command-bar/routes/root/provider-search.ts +4 -3
- package/src/components/command-bar/routes/root/results.ts +40 -10
- package/src/components/command-bar/routes/root/runtime.ts +8 -0
- package/src/components/command-bar/routes/root/search-providers.ts +97 -14
- 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/surface/index.tsx +18 -4
- package/src/components/command-bar/theme-picker.tsx +48 -13
- package/src/components/command-bar/workflow/ops.ts +5 -3
- package/src/components/command-bar/workflow/tickers.ts +23 -4
- package/src/components/data-table/view.tsx +28 -9
- package/src/components/layout/detached-pane-shell.tsx +9 -0
- package/src/components/layout/floating-pane.tsx +9 -2
- package/src/components/layout/header.tsx +20 -5
- package/src/components/layout/market-summary.ts +23 -9
- package/src/components/layout/pane/content.tsx +40 -29
- package/src/components/layout/pane/cycle-order.ts +2 -11
- package/src/components/layout/pane/footer/index.tsx +6 -2
- package/src/components/layout/pane/footer/model.ts +35 -1
- package/src/components/layout/pane/header.tsx +26 -2
- package/src/components/layout/pane/index.tsx +12 -2
- package/src/components/layout/pane/sidebar.tsx +78 -10
- package/src/components/layout/pane/title.ts +1 -1
- package/src/components/layout/presentation.ts +22 -0
- package/src/components/layout/shell/active-drag.ts +21 -5
- package/src/components/layout/shell/drag/index.ts +43 -9
- package/src/components/layout/shell/drag/live.ts +87 -6
- package/src/components/layout/shell/drag/runtime.ts +62 -20
- package/src/components/layout/shell/index.tsx +71 -12
- package/src/components/layout/shell/layout-state.ts +5 -11
- package/src/components/layout/shell/menu.ts +33 -1
- package/src/components/layout/shell/native/pointer-runtime.ts +3 -1
- package/src/components/layout/shell/pane/actions.ts +2 -1
- package/src/components/layout/shell/pane/layers.tsx +216 -28
- package/src/components/layout/shell/pane/management-shortcuts.ts +5 -0
- package/src/components/layout/shell/pane/new-layout.ts +116 -0
- package/src/components/layout/shell/shortcuts.ts +5 -2
- package/src/components/layout/shell/terminal-pointer-runtime.ts +24 -0
- package/src/components/layout/shell/visible-layout.ts +44 -1
- package/src/components/layout/status-bar.tsx +4 -1
- package/src/components/markdown-text.tsx +69 -23
- package/src/components/metric-treemap/heat-surface.tsx +37 -9
- package/src/components/metric-treemap/heat-tiles.ts +48 -17
- 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-frame.tsx +33 -10
- package/src/components/onboarding/onboarding-keyboard.ts +1 -1
- package/src/components/onboarding/onboarding-wizard.tsx +50 -41
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +5 -2
- package/src/components/onboarding/pro-step-layout.ts +86 -0
- package/src/components/onboarding/use-onboarding-upgrade.ts +8 -4
- 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/sign-in-gate.tsx +3 -3
- package/src/components/ticker/list-table-view.tsx +24 -1
- package/src/components/ui/action-row.tsx +2 -1
- package/src/components/ui/button.tsx +17 -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 +49 -0
- package/src/components/ui/data-table/opentui/index.tsx +37 -6
- package/src/components/ui/data-table/types.ts +20 -1
- package/src/components/ui/data-table/visible-range.ts +2 -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 +13 -2
- package/src/components/ui/index.ts +1 -1
- package/src/components/ui/text-prompt-dialog.tsx +11 -9
- package/src/core/connection-health.ts +1 -1
- package/src/core/state/app/layout-reducer.ts +89 -3
- package/src/core/state/app/state.ts +8 -5
- package/src/core/state/app/types.ts +13 -2
- package/src/data/cached-query.ts +2 -0
- package/src/data/config/layout.ts +55 -21
- package/src/data/config/store/fold-panes.ts +149 -0
- package/src/data/config/store/migrations.ts +7 -0
- package/src/data/config/store/node.ts +27 -6
- package/src/data/config/store/normalize.ts +44 -5
- 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 +7416 -0
- package/src/docs/topics.ts +216 -0
- package/src/i18n/es.ts +75 -5
- package/src/i18n/ja.ts +75 -5
- package/src/i18n/ko.ts +75 -5
- package/src/i18n/zh-cn.ts +75 -5
- package/src/i18n/zh-tw.ts +75 -5
- package/src/layout/desks.ts +2 -3
- package/src/layout/pane-layout-move.ts +264 -0
- package/src/layout/pane-manager/dock-tree.ts +18 -0
- package/src/layout/pane-manager/hidden-panes.ts +160 -0
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/market-data/coordinator/chart.ts +10 -4
- package/src/market-data/coordinator/entries.ts +7 -1
- package/src/market-data/coordinator/index.ts +6 -3
- package/src/market-data/coordinator/quotes.ts +2 -2
- 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 +193 -30
- package/src/market-data/market/status.ts +59 -23
- package/src/market-data/options-alternatives.ts +69 -0
- package/src/market-data/published-apac-sessions.ts +23 -1
- package/src/market-data/quotes/contributions.ts +22 -2
- package/src/market-data/quotes/metadata.ts +8 -9
- package/src/market-data/quotes/resolution.ts +2 -0
- package/src/market-data/quotes/screener-live-quotes.ts +61 -9
- package/src/market-data/result-types.ts +2 -0
- package/src/plugins/builtin/account-management/keyboard.ts +3 -0
- package/src/plugins/builtin/account-management/model.ts +2 -56
- package/src/plugins/builtin/account-management/navigation.ts +1 -1
- package/src/plugins/builtin/account-management/pane.tsx +37 -8
- package/src/plugins/builtin/account-management/password-dialog.tsx +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/history-pane.tsx +7 -2
- package/src/plugins/builtin/alerts/history.ts +2 -0
- package/src/plugins/builtin/alerts/index.tsx +41 -9
- package/src/plugins/builtin/alerts/pane.tsx +8 -0
- package/src/plugins/builtin/alerts/quotes.ts +3 -0
- 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 +4 -2
- package/src/plugins/builtin/analytics/risk-headless.ts +33 -13
- package/src/plugins/builtin/analytics/risk-math.ts +91 -27
- package/src/plugins/builtin/analytics/risk-model.ts +71 -12
- package/src/plugins/builtin/analytics/risk-pane.tsx +23 -12
- 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/index.tsx +2 -0
- package/src/plugins/builtin/awards/pane.tsx +3 -1
- package/src/plugins/builtin/awards/series.ts +29 -0
- package/src/plugins/builtin/backtest/pane.tsx +1 -1
- package/src/plugins/builtin/bond-calculator/model.ts +2 -1
- package/src/plugins/builtin/broker-manager/detail.tsx +4 -0
- package/src/plugins/builtin/broker-manager/index.tsx +7 -3
- package/src/plugins/builtin/broker-manager/model.ts +8 -0
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +8 -2
- package/src/plugins/builtin/broker-manager/sign-in-end.ts +82 -0
- package/src/plugins/builtin/broker-manager/table.ts +5 -0
- package/src/plugins/builtin/builtin-plugin-meta.ts +121 -11
- package/src/plugins/builtin/catalysts/pane.tsx +3 -1
- package/src/plugins/builtin/cds/client.ts +70 -13
- package/src/plugins/builtin/cds/headless.ts +116 -19
- package/src/plugins/builtin/cds/index.tsx +3 -1
- package/src/plugins/builtin/cds/model.ts +193 -31
- package/src/plugins/builtin/cds/pane.tsx +56 -14
- package/src/plugins/builtin/cds/series.ts +19 -0
- package/src/plugins/builtin/central-bank-rates/index.tsx +2 -0
- package/src/plugins/builtin/central-bank-rates/series.ts +42 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +192 -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.ts +8 -3
- package/src/plugins/builtin/chart-composer/index.tsx +9 -2
- package/src/plugins/builtin/chart-composer/pane.tsx +1 -1
- 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/channels.ts +34 -36
- package/src/plugins/builtin/chat/command-bar.ts +138 -0
- package/src/plugins/builtin/chat/composer-commands.ts +21 -1
- package/src/plugins/builtin/chat/content/composer-runtime.ts +11 -1
- package/src/plugins/builtin/chat/content/footer.tsx +5 -3
- package/src/plugins/builtin/chat/content/index.tsx +21 -1
- package/src/plugins/builtin/chat/content/mentions.ts +2 -1
- package/src/plugins/builtin/chat/content/new-dm-dialog.tsx +10 -2
- package/src/plugins/builtin/chat/content/user-map.ts +3 -1
- package/src/plugins/builtin/chat/controller/index.ts +50 -0
- package/src/plugins/builtin/chat/conversations.ts +256 -0
- package/src/plugins/builtin/chat/discord-command.ts +91 -0
- package/src/plugins/builtin/chat/edit-window.ts +12 -6
- package/src/plugins/builtin/chat/ghost-user.ts +14 -0
- package/src/plugins/builtin/chat/index.tsx +40 -2
- package/src/plugins/builtin/chat/layout.ts +2 -0
- package/src/plugins/builtin/chat/message/desktop.tsx +2 -1
- package/src/plugins/builtin/chat/message/header.tsx +24 -15
- package/src/plugins/builtin/chat/message/profile-popover.tsx +2 -1
- package/src/plugins/builtin/chat/message/render-state.ts +3 -0
- package/src/plugins/builtin/chat/pane-requests.ts +60 -0
- package/src/plugins/builtin/chat/pane-state.ts +32 -2
- package/src/plugins/builtin/chat/pane.tsx +8 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +223 -23
- package/src/plugins/builtin/cloud/askg/conversation-store.ts +21 -0
- package/src/plugins/builtin/cloud/askg/executor.ts +57 -3
- package/src/plugins/builtin/cloud/askg/manifest.ts +33 -7
- package/src/plugins/builtin/cloud/askg/model.ts +156 -78
- package/src/plugins/builtin/cloud/askg/pane.tsx +772 -377
- package/src/plugins/builtin/cloud/askg/protocol.ts +50 -3
- package/src/plugins/builtin/cloud/askg/tool-display.ts +440 -0
- package/src/plugins/builtin/cloud/askg/tool-timeline.tsx +403 -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 -9
- package/src/plugins/builtin/cloud/mcp-connect/command.ts +24 -0
- package/src/plugins/builtin/cloud/mcp-connect/dialog.tsx +363 -0
- package/src/plugins/builtin/cloud/mcp-connect/model.ts +135 -0
- package/src/plugins/builtin/cloud/mcp-connect/sections.ts +62 -0
- package/src/plugins/builtin/cloud/plugin.tsx +36 -1
- package/src/plugins/builtin/cloud/terminal-relay/acm-tab.tsx +89 -0
- package/src/plugins/builtin/cloud/terminal-relay/client.ts +97 -0
- package/src/plugins/builtin/cloud/terminal-relay/connect-section.tsx +57 -0
- package/src/plugins/builtin/cloud/terminal-relay/engine.ts +734 -0
- package/src/plugins/builtin/cloud/terminal-relay/grants.ts +137 -0
- package/src/plugins/builtin/cloud/terminal-relay/host.tsx +81 -0
- package/src/plugins/builtin/cloud/terminal-relay/indicator.tsx +82 -0
- package/src/plugins/builtin/cloud/terminal-relay/manifest.ts +239 -0
- package/src/plugins/builtin/cloud/terminal-relay/policy.ts +162 -0
- package/src/plugins/builtin/cloud/terminal-relay/prompts.tsx +192 -0
- package/src/plugins/builtin/cloud/terminal-relay/redact.ts +73 -0
- package/src/plugins/builtin/cloud/terminal-relay/summary.ts +62 -0
- package/src/plugins/builtin/cloud/thesis/exposure.ts +1 -1
- package/src/plugins/builtin/cloud/thesis/prompts.tsx +2 -1
- package/src/plugins/builtin/comment-letters/client.ts +1 -3
- package/src/plugins/builtin/company-attention/app-rank.tsx +1 -1
- package/src/plugins/builtin/company-attention/headless.ts +19 -5
- 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/client.ts +23 -8
- package/src/plugins/builtin/company-kpis/headless.ts +3 -1
- package/src/plugins/builtin/company-kpis/pane.tsx +19 -9
- package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +10 -3
- package/src/plugins/builtin/composite-plugins.ts +116 -67
- 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/credit-boards/cdx-pane.tsx +4 -4
- package/src/plugins/builtin/credit-boards/index.tsx +23 -21
- package/src/plugins/builtin/credit-boards/model.ts +0 -1
- package/src/plugins/builtin/credit-boards/pane.tsx +30 -0
- package/src/plugins/builtin/credit-boards/series.ts +66 -0
- package/src/plugins/builtin/credit-boards/sovr-pane.tsx +4 -4
- package/src/plugins/builtin/credit-conditions/index.tsx +2 -0
- package/src/plugins/builtin/credit-conditions/series.ts +26 -0
- package/src/plugins/builtin/credit-documents/headless.ts +31 -1
- 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/client.ts +37 -9
- package/src/plugins/builtin/debt-maturities/headless.ts +3 -1
- package/src/plugins/builtin/debt-maturities/index.tsx +2 -0
- package/src/plugins/builtin/debt-maturities/pane.tsx +5 -4
- package/src/plugins/builtin/debt-maturities/series.ts +45 -0
- package/src/plugins/builtin/dividend-yield/headless.ts +2 -2
- package/src/plugins/builtin/dividend-yield/index.tsx +3 -1
- package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
- package/src/plugins/builtin/dividend-yield/series.ts +20 -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/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-calls/data.ts +28 -7
- package/src/plugins/builtin/earnings-calls/headless.ts +3 -2
- package/src/plugins/builtin/earnings-calls/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +42 -17
- package/src/plugins/builtin/econ/detail-view.tsx +2 -2
- package/src/plugins/builtin/econ/fred-catalog.ts +189 -0
- package/src/plugins/builtin/econ/fred-series-map.ts +0 -46
- package/src/plugins/builtin/econ/index.tsx +70 -22
- package/src/plugins/builtin/econ-statistics/defs.ts +5 -0
- package/src/plugins/builtin/econ-statistics/headless.ts +30 -5
- package/src/plugins/builtin/econ-statistics/pane.tsx +1 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +1 -0
- package/src/plugins/builtin/econ-statistics/view.ts +17 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +4 -11
- package/src/plugins/builtin/executives/data.ts +17 -6
- package/src/plugins/builtin/executives/pane.tsx +16 -7
- package/src/plugins/builtin/exposure/holdings.ts +1 -1
- package/src/plugins/builtin/exposure/pane.tsx +3 -1
- package/src/plugins/builtin/fear-greed/index.tsx +4 -0
- package/src/plugins/builtin/fear-greed/series.ts +52 -0
- package/src/plugins/builtin/filing-events/pane.tsx +22 -5
- 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 +70 -9
- 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/index.tsx +22 -1
- package/src/plugins/builtin/fx-matrix/pairs.ts +1 -1
- package/src/plugins/builtin/fx-matrix/settings.ts +42 -2
- 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 +64 -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 +114 -20
- 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/index.tsx +18 -8
- package/src/plugins/builtin/holders/beneficial-client.ts +29 -7
- 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 +62 -14
- 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 +42 -134
- package/src/plugins/builtin/holders/pane.tsx +14 -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 +27 -10
- 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/iv-history/charts.tsx +21 -7
- package/src/plugins/builtin/iv-history/client.ts +26 -6
- package/src/plugins/builtin/iv-history/format.ts +33 -2
- package/src/plugins/builtin/iv-history/headless.ts +27 -12
- package/src/plugins/builtin/iv-history/index.tsx +5 -3
- package/src/plugins/builtin/iv-history/model.ts +172 -20
- package/src/plugins/builtin/iv-history/pane.tsx +11 -3
- package/src/plugins/builtin/iv-history/screen-pane.tsx +45 -25
- package/src/plugins/builtin/iv-history/series.ts +29 -0
- package/src/plugins/builtin/jobs/headless.ts +28 -3
- package/src/plugins/builtin/jobs/index.tsx +3 -1
- package/src/plugins/builtin/jobs/pane.tsx +1 -1
- package/src/plugins/builtin/jobs/series.ts +19 -0
- package/src/plugins/builtin/kelly-sizer/headless.ts +149 -0
- package/src/plugins/builtin/kelly-sizer/history.ts +80 -0
- package/src/plugins/builtin/kelly-sizer/index.tsx +2 -0
- package/src/plugins/builtin/kelly-sizer/pane.tsx +111 -40
- package/src/plugins/builtin/kelly-sizer/portfolio.ts +0 -39
- package/src/plugins/builtin/kelly-sizer/sections.tsx +14 -0
- package/src/plugins/builtin/kelly-sizer/types.ts +9 -1
- package/src/plugins/builtin/layout-manager/index.tsx +9 -1
- package/src/plugins/builtin/macro-day/client.ts +68 -3
- package/src/plugins/builtin/macro-day/headless.ts +18 -12
- package/src/plugins/builtin/macro-day/index.tsx +3 -0
- package/src/plugins/builtin/macro-day/model.ts +66 -15
- package/src/plugins/builtin/macro-day/pane.tsx +34 -20
- package/src/plugins/builtin/macro-day/release-table.ts +40 -0
- package/src/plugins/builtin/macro-day/releases.ts +62 -44
- package/src/plugins/builtin/market-heatmap/data.ts +25 -5
- package/src/plugins/builtin/market-heatmap/evidence.ts +90 -0
- package/src/plugins/builtin/market-heatmap/index.tsx +144 -63
- package/src/plugins/builtin/market-heatmap/model.ts +102 -3
- package/src/plugins/builtin/market-heatmap/portfolio.ts +12 -2
- package/src/plugins/builtin/market-movers/client.ts +7 -5
- package/src/plugins/builtin/market-movers/headless.ts +31 -4
- package/src/plugins/builtin/market-movers/index.tsx +11 -3
- package/src/plugins/builtin/market-movers/model.ts +101 -17
- package/src/plugins/builtin/market-movers/screener.ts +31 -0
- package/src/plugins/builtin/market-movers/table.ts +50 -23
- 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 +7 -2
- package/src/plugins/builtin/members/model.ts +31 -3
- package/src/plugins/builtin/members/pane.tsx +3 -6
- package/src/plugins/builtin/mna/headless.ts +15 -3
- 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/headless.ts +9 -2
- package/src/plugins/builtin/news/wire/news/footer.ts +10 -0
- package/src/plugins/builtin/notes/cli.ts +12 -7
- package/src/plugins/builtin/openfda/client.ts +1 -1
- package/src/plugins/builtin/options/carry.ts +95 -0
- package/src/plugins/builtin/options/index.tsx +58 -5
- package/src/plugins/builtin/options/strike-window.ts +183 -0
- package/src/plugins/builtin/options/table.ts +55 -3
- package/src/plugins/builtin/options/types.ts +8 -1
- package/src/plugins/builtin/options/view.tsx +162 -13
- 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 +5 -2
- package/src/plugins/builtin/options-positioning/pane.tsx +2 -2
- package/src/plugins/builtin/options-scenario/charts.tsx +2 -2
- package/src/plugins/builtin/options-scenario/client.ts +75 -18
- package/src/plugins/builtin/options-scenario/headless.ts +72 -24
- package/src/plugins/builtin/options-scenario/hedge.ts +285 -0
- package/src/plugins/builtin/options-scenario/index.tsx +9 -2
- package/src/plugins/builtin/options-scenario/model.ts +33 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +40 -16
- package/src/plugins/builtin/pe-band/model.ts +2 -2
- package/src/plugins/builtin/pe-band/report-dates.ts +11 -7
- package/src/plugins/builtin/perps/client.ts +40 -6
- package/src/plugins/builtin/perps/equity-row.tsx +33 -8
- package/src/plugins/builtin/perps/freshness.ts +66 -0
- package/src/plugins/builtin/perps/headless.ts +45 -30
- package/src/plugins/builtin/perps/index.tsx +18 -1
- package/src/plugins/builtin/perps/model.ts +32 -6
- package/src/plugins/builtin/perps/pane.tsx +76 -20
- package/src/plugins/builtin/perps/series.ts +76 -0
- package/src/plugins/builtin/plugin-marketplace/model.ts +64 -21
- package/src/plugins/builtin/plugin-marketplace/packs.ts +118 -0
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +357 -39
- package/src/plugins/builtin/plugin-marketplace/store.ts +7 -1
- package/src/plugins/builtin/plugin-module.ts +90 -4
- package/src/plugins/builtin/portfolio-list/account-metrics.ts +1 -1
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +273 -0
- package/src/plugins/builtin/portfolio-list/cli/import-13f.ts +109 -0
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +400 -99
- package/src/plugins/builtin/portfolio-list/cli/render.ts +281 -43
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +26 -16
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +120 -47
- package/src/plugins/builtin/portfolio-list/column-values.ts +1 -1
- package/src/plugins/builtin/portfolio-list/grid.tsx +1 -1
- package/src/plugins/builtin/portfolio-list/headless.ts +70 -9
- package/src/plugins/builtin/portfolio-list/imported-from.ts +8 -0
- package/src/plugins/builtin/portfolio-list/live-valuation.ts +6 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +6 -1
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +17 -1
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +1 -1
- package/src/plugins/builtin/portfolio-list/table.tsx +7 -1
- package/src/plugins/builtin/power/client.ts +16 -0
- package/src/plugins/builtin/power/evidence.ts +6 -2
- package/src/plugins/builtin/power/headless.ts +71 -7
- package/src/plugins/builtin/power/index.tsx +4 -1
- package/src/plugins/builtin/power/model.ts +72 -1
- package/src/plugins/builtin/power/pane.tsx +32 -9
- package/src/plugins/builtin/rate-path/headless.ts +11 -3
- package/src/plugins/builtin/realized-vol/headless.ts +8 -0
- package/src/plugins/builtin/realized-vol/pane.tsx +1 -1
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +7 -4
- package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +1 -1
- 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/revenue-breakdown/client.ts +13 -6
- package/src/plugins/builtin/revenue-breakdown/headless.ts +4 -1
- package/src/plugins/builtin/revenue-breakdown/pane.tsx +7 -4
- package/src/plugins/builtin/reverse-dcf/headless.ts +5 -1
- package/src/plugins/builtin/reverse-dcf/pane.tsx +1 -1
- package/src/plugins/builtin/risk-factors/data.ts +23 -9
- package/src/plugins/builtin/risk-factors/headless.ts +5 -2
- package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
- 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/index.tsx +5 -5
- package/src/plugins/builtin/sectors/client.ts +10 -2
- package/src/plugins/builtin/sectors/headless.ts +35 -6
- package/src/plugins/builtin/sectors/index.tsx +18 -1
- package/src/plugins/builtin/sectors/sector-model.ts +150 -41
- package/src/plugins/builtin/series-inventory.ts +91 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +1 -1
- package/src/plugins/builtin/shared/command-tab.ts +69 -0
- 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/fx-rate-freshness.ts +101 -0
- package/src/plugins/builtin/shared/headless-market-data.ts +33 -1
- package/src/plugins/builtin/shared/members-menu.tsx +4 -4
- package/src/plugins/builtin/shared/open-description.ts +29 -0
- package/src/plugins/builtin/shared/report-freshness.ts +59 -2
- package/src/plugins/builtin/shared/series-warning.ts +5 -0
- package/src/plugins/builtin/shared/ticker-request.ts +25 -1
- package/src/plugins/builtin/shared/use-quote-board.ts +25 -5
- package/src/plugins/builtin/shared/volatility/options.ts +1 -46
- package/src/plugins/builtin/short-interest/headless.ts +1 -0
- package/src/plugins/builtin/short-interest/index.tsx +21 -4
- package/src/plugins/builtin/short-interest/series.ts +36 -0
- package/src/plugins/builtin/short-interest/surface.tsx +4 -4
- package/src/plugins/builtin/short-interest/watch-headless.ts +1 -0
- package/src/plugins/builtin/short-interest/watch-model.ts +9 -5
- package/src/plugins/builtin/short-volume/headless.ts +1 -0
- package/src/plugins/builtin/short-volume/index.tsx +3 -10
- package/src/plugins/builtin/short-volume/series.ts +23 -0
- 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/model.ts +1 -1
- package/src/plugins/builtin/supply-chain/pane.tsx +3 -1
- 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/headless.ts +43 -21
- package/src/plugins/builtin/ticker-detail/index.tsx +3 -0
- 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 +48 -4
- package/src/plugins/builtin/ticker-detail/pane.tsx +4 -5
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +94 -6
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +13 -3
- package/src/plugins/builtin/time-sales/headless.ts +1 -0
- package/src/plugins/builtin/treasury-auctions/cache.ts +5 -2
- package/src/plugins/builtin/treasury-auctions/client.ts +22 -8
- package/src/plugins/builtin/treasury-auctions/headless.ts +56 -6
- package/src/plugins/builtin/treasury-auctions/index.tsx +12 -9
- package/src/plugins/builtin/treasury-auctions/model.ts +205 -30
- package/src/plugins/builtin/treasury-auctions/pane.tsx +35 -11
- package/src/plugins/builtin/treasury-auctions/types.ts +11 -1
- package/src/plugins/builtin/vol-surface/charts.tsx +1 -3
- package/src/plugins/builtin/vol-surface/client.ts +6 -2
- package/src/plugins/builtin/vol-surface/evidence.ts +11 -6
- package/src/plugins/builtin/vol-surface/headless.ts +125 -20
- package/src/plugins/builtin/vol-surface/model.ts +23 -11
- package/src/plugins/builtin/vol-surface/pane.tsx +38 -27
- package/src/plugins/builtin/vol-surface/tables.ts +124 -0
- package/src/plugins/builtin/volatility/index.tsx +2 -0
- package/src/plugins/builtin/volatility/series.ts +84 -0
- package/src/plugins/builtin/world-indices/client.ts +22 -4
- package/src/plugins/builtin/world-indices/headless.ts +54 -27
- package/src/plugins/builtin/world-indices/model.ts +4 -2
- package/src/plugins/builtin/world-indices/table.tsx +13 -2
- package/src/plugins/builtin/world-venue-map/geo-series.ts +27 -2
- package/src/plugins/builtin/world-venue-map/headless.ts +4 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -2
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +8 -4
- package/src/plugins/builtin/world-venue-map/layers.ts +29 -0
- 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/builtin-editorial.ts +126 -0
- package/src/plugins/catalog-backend.ts +16 -9
- package/src/plugins/catalog-browser.ts +129 -64
- package/src/plugins/catalog-manifest.ts +73 -40
- package/src/plugins/catalog-ui.ts +26 -6
- package/src/plugins/extracted-plugins.ts +7 -1
- package/src/plugins/ownership.ts +150 -7
- package/src/plugins/plugin-functions.ts +54 -0
- package/src/plugins/plugin-off.ts +36 -0
- package/src/plugins/registry/host-actions.ts +16 -0
- package/src/plugins/registry/index.ts +173 -28
- package/src/plugins/registry/plugin-state.ts +25 -1
- package/src/plugins/runtime/context.tsx +29 -0
- package/src/{plugins/builtin/portfolio-list → portfolio}/position-metrics.ts +6 -6
- package/src/portfolio/position-value.ts +40 -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 +48 -1
- package/src/remote/app-host.tsx +25 -4
- package/src/remote/confirm-change.tsx +85 -0
- package/src/remote/controller-utils.ts +8 -1
- package/src/remote/controller.ts +126 -59
- package/src/remote/matching.ts +69 -0
- package/src/remote/pane-screenshot.ts +47 -0
- package/src/remote/schema.ts +63 -1
- package/src/remote/semantic-tree.tsx +14 -0
- package/src/remote/types.ts +32 -0
- package/src/remote/watchlist.ts +306 -0
- package/src/renderers/browser/main.tsx +3 -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 +27 -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 +21 -0
- package/src/renderers/dom/desktop/query-bar.tsx +59 -32
- package/src/renderers/dom/dom-ui-host.tsx +3 -0
- package/src/renderers/dom/host/box.tsx +4 -1
- package/src/renderers/dom/host/chart-surface.tsx +6 -2
- package/src/renderers/dom/host/drag-shield.ts +17 -6
- package/src/renderers/dom/host/live-frame.ts +14 -2
- package/src/renderers/dom/host/overflow-fade.ts +14 -1
- package/src/renderers/dom/host/size-observer.ts +26 -0
- package/src/renderers/dom/host/surface-3d.tsx +7 -2
- package/src/renderers/dom/host/text.tsx +1 -1
- package/src/renderers/dom/input-host.tsx +6 -1
- package/src/renderers/dom/styles.css +74 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +5 -1
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +12 -1
- package/src/renderers/electrobun/bun/desktop/initialization.ts +2 -1
- package/src/renderers/electrobun/shared/protocol.ts +2 -0
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +18 -3
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +109 -5
- package/src/renderers/electrobun/view/cli-pane-shot-health.ts +10 -26
- package/src/renderers/electrobun/view/main.tsx +6 -1
- package/src/renderers/opentui/input-host.tsx +6 -1
- package/src/renderers/opentui/start.tsx +9 -0
- 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 +107 -0
- package/src/series/standalone.ts +48 -0
- package/src/series/types.ts +145 -0
- package/src/series/validate.ts +171 -0
- package/src/shares/portable-layout.ts +16 -6
- package/src/sources/gloomberb-cloud/index.ts +26 -17
- package/src/sources/gloomberb-cloud/normalizers.ts +5 -1
- package/src/sources/history-result.ts +1 -0
- package/src/sources/listing-symbols.ts +14 -5
- package/src/sources/provider-errors.ts +88 -3
- 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 +9 -5
- package/src/sources/provider-router/financial-routes.ts +12 -5
- package/src/sources/provider-router/financials.ts +55 -15
- package/src/sources/provider-router/history.ts +68 -34
- package/src/sources/provider-router/index.ts +1 -1
- package/src/sources/provider-router/primary.ts +23 -5
- package/src/sources/provider-router/search.ts +1 -0
- package/src/sources/sec-edgar.ts +68 -8
- package/src/sync/core-contributors.ts +5 -3
- package/src/test-support/cli-context.ts +2 -1
- package/src/test-support/data-provider.ts +34 -0
- package/src/test-support/shell-pane-keys.tsx +1 -0
- package/src/theme/series-colors.ts +46 -0
- package/src/theme/themes.ts +149 -0
- package/src/tickers/company-name.ts +75 -0
- package/src/tickers/instrument-kind.ts +25 -0
- package/src/tickers/open-target.ts +3 -2
- package/src/tickers/search/index.ts +67 -9
- package/src/tickers/search/ranking.ts +78 -18
- package/src/tickers/search/types.ts +10 -2
- package/src/tickers/starter-symbols.ts +8 -0
- package/src/tickers/us-listing.ts +34 -0
- package/src/time-series/hooks.ts +9 -0
- package/src/time-series/resolve.ts +96 -30
- package/src/time-series/types.ts +4 -2
- package/src/time-series/use-chart-resolution.ts +32 -0
- package/src/types/config.ts +67 -1
- package/src/types/data-provider.ts +5 -0
- package/src/types/financials.ts +52 -1
- package/src/types/headless.ts +72 -0
- package/src/types/instrument.ts +8 -0
- package/src/types/plugin.ts +68 -3
- package/src/types/price-history.ts +7 -0
- package/src/types/ticker.ts +14 -0
- package/src/ui/host.tsx +26 -4
- package/src/ui/index.tsx +2 -0
- package/src/ui/live-resize.ts +81 -0
- package/src/ui/live-stretch.ts +121 -0
- package/src/ui/measured-cells.ts +58 -0
- package/src/ui/pane-fill.ts +11 -0
- package/src/utils/basis-points.ts +17 -0
- package/src/utils/cli-output.ts +21 -2
- 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/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 +437 -52
- package/src/utils/exchange-rate-snapshot.ts +6 -2
- package/src/utils/exchanges.ts +120 -1
- package/src/utils/format.ts +17 -3
- package/src/utils/fundamentals.ts +66 -0
- package/src/utils/futures-generic.ts +6 -12
- package/src/utils/fx-market-hours.ts +44 -0
- package/src/utils/option-expiry.ts +126 -0
- package/src/utils/price-history.ts +130 -40
- package/src/utils/rpc-timeout-error.ts +6 -2
- package/src/utils/sec-eps-basis.ts +178 -36
- package/src/utils/sec.ts +98 -40
- package/src/utils/throttled-fetch.ts +51 -22
- package/src/utils/utc-time.ts +51 -4
|
@@ -77,9 +77,12 @@ import {
|
|
|
77
77
|
resolveExchangeTimeZone,
|
|
78
78
|
} from "../utils/exchanges";
|
|
79
79
|
import { getPricePointTimestamp, isPriceHistoryStaleForCurrentWindow } from "../utils/price-history";
|
|
80
|
+
import { timeZoneLabel, zonedDateKey, zonedWallClockMs } from "../utils/zoned-date-time";
|
|
81
|
+
import { formatShortDate } from "../utils/datetime-format";
|
|
80
82
|
import { latestSessionStart, latestTradingSessionOpen, listingTimeZone, priorSessionClose } from "../market-data/market/trading-sessions";
|
|
81
83
|
import { futuresGenericCaption, futuresGenericListing, futuresGenericPriceBasis } from "../utils/futures-generic";
|
|
82
84
|
import { isOhlcSeriesStyle } from "./spec";
|
|
85
|
+
import { SERIES_COLORS } from "../theme/series-colors";
|
|
83
86
|
import type {
|
|
84
87
|
ChartResolutionResult,
|
|
85
88
|
ChartSeriesSpec,
|
|
@@ -88,20 +91,6 @@ import type {
|
|
|
88
91
|
TimeSeriesPoint,
|
|
89
92
|
} from "./types";
|
|
90
93
|
|
|
91
|
-
/** Colours for series told apart by name (compared tickers, markets). */
|
|
92
|
-
export const SERIES_COLORS = [
|
|
93
|
-
"#4dabf7",
|
|
94
|
-
"#63e6be",
|
|
95
|
-
"#f6c85f",
|
|
96
|
-
"#b197fc",
|
|
97
|
-
"#ff8787",
|
|
98
|
-
"#ffa94d",
|
|
99
|
-
"#74c0fc",
|
|
100
|
-
"#e599f7",
|
|
101
|
-
"#8ce99a",
|
|
102
|
-
"#ffd43b",
|
|
103
|
-
] as const;
|
|
104
|
-
|
|
105
94
|
export interface ChartResolveSources {
|
|
106
95
|
dataProvider: DataProvider | null;
|
|
107
96
|
loadFredSeries: (request: FredSeriesRequest) => Promise<FredSeriesLoadResult>;
|
|
@@ -115,6 +104,11 @@ export interface ChartResolveSources {
|
|
|
115
104
|
liveSince?: number;
|
|
116
105
|
/** Capture the resolved inputs, including the calculation buffer, for an export. */
|
|
117
106
|
onSecurityData?: (series: ChartSeriesSpec, data: TickerFinancials, includesHistory: boolean) => void;
|
|
107
|
+
/**
|
|
108
|
+
* How often, in milliseconds, a plugin-owned series is loaded again while
|
|
109
|
+
* it is charted; nothing for a series that keeps what it loaded.
|
|
110
|
+
*/
|
|
111
|
+
capabilityRefreshMs?: (source: Extract<ChartSeriesSpec["source"], { kind: "capability" }>) => number | undefined;
|
|
118
112
|
/** Provider-neutral boundary for plugin-owned chart series. */
|
|
119
113
|
resolveCapabilitySeries?: (
|
|
120
114
|
source: Extract<ChartSeriesSpec["source"], { kind: "capability" }>,
|
|
@@ -277,6 +271,24 @@ function instrumentLabel(spec: Extract<ChartSeriesSpec["source"], { kind: "secur
|
|
|
277
271
|
return publicTickerKey(spec.instrument.symbol, spec.instrument.exchange);
|
|
278
272
|
}
|
|
279
273
|
|
|
274
|
+
/**
|
|
275
|
+
* Shown while a current chart draws a saved copy that no refetch brought up
|
|
276
|
+
* to date: the last saved bar on the venue's clock, as the axis reads it.
|
|
277
|
+
*/
|
|
278
|
+
function behindHistoryNotice(
|
|
279
|
+
source: Extract<ChartSeriesSpec["source"], { kind: "security" }>,
|
|
280
|
+
points: TickerFinancials["priceHistory"],
|
|
281
|
+
now: number,
|
|
282
|
+
): string | null {
|
|
283
|
+
const latest = points.findLast((point) => Number.isFinite(point.close) && Number.isFinite(getPricePointTimestamp(point)));
|
|
284
|
+
if (!latest) return null;
|
|
285
|
+
const zone = listingTimeZone(source.instrument.symbol, source.instrument.exchange) ?? "UTC";
|
|
286
|
+
const wall = new Date(zonedWallClockMs(getPricePointTimestamp(latest), zone)).toISOString();
|
|
287
|
+
const sameYear = wall.slice(0, 4) === zonedDateKey(now, zone).slice(0, 4);
|
|
288
|
+
const day = formatShortDate(wall.slice(0, 10), { utc: true, year: sameYear ? false : "numeric" });
|
|
289
|
+
return `${instrumentLabel(source)}: newer bars are unavailable; showing saved bars as of ${day} ${wall.slice(11, 16)} ${timeZoneLabel(zone)}.`;
|
|
290
|
+
}
|
|
291
|
+
|
|
280
292
|
// A series that fails to load keeps its place with no observations. Dropping it
|
|
281
293
|
// made a series the user had added disappear from the legend while it still sat
|
|
282
294
|
// in the series editor, with nothing on screen to explain the difference.
|
|
@@ -555,6 +567,25 @@ function followLatestMarketObservation(
|
|
|
555
567
|
};
|
|
556
568
|
}
|
|
557
569
|
|
|
570
|
+
/**
|
|
571
|
+
* A chart of capability series alone (CHOKE's vessel transits) ends at its
|
|
572
|
+
* newest observation, not today: such data is published days late, and an
|
|
573
|
+
* axis running on to today would read as days with nothing in them. The
|
|
574
|
+
* start stays where the range put it, so no empty span opens on the left.
|
|
575
|
+
*/
|
|
576
|
+
function endAtNewestObservation(bounds: DateBounds, series: readonly ResolvedSeries[]): DateBounds {
|
|
577
|
+
if (bounds.end === null) return bounds;
|
|
578
|
+
let newest = Number.NEGATIVE_INFINITY;
|
|
579
|
+
for (const entry of series) {
|
|
580
|
+
for (const point of entry.points) {
|
|
581
|
+
const timestamp = point.date.getTime();
|
|
582
|
+
if (point.value !== null && Number.isFinite(timestamp) && timestamp > newest) newest = timestamp;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
if (!Number.isFinite(newest) || newest >= bounds.end || (bounds.start !== null && newest <= bounds.start)) return bounds;
|
|
586
|
+
return { start: bounds.start, end: newest };
|
|
587
|
+
}
|
|
588
|
+
|
|
558
589
|
/**
|
|
559
590
|
* 1D shows the latest trading session of the chart's first market listing,
|
|
560
591
|
* from its open to the newest bar, with the close before it as a reference.
|
|
@@ -1138,6 +1169,7 @@ function baseCapabilitySeries(
|
|
|
1138
1169
|
axis: spec.axis === "right" ? "right" : spec.axis === "left" ? "left" : loaded.axis,
|
|
1139
1170
|
panelId: spec.panelId,
|
|
1140
1171
|
interpolation: spec.interpolation,
|
|
1172
|
+
observationKind: loaded.observationKind ?? "dataset",
|
|
1141
1173
|
points,
|
|
1142
1174
|
};
|
|
1143
1175
|
}
|
|
@@ -1641,33 +1673,63 @@ async function resolveChartSpecPass(
|
|
|
1641
1673
|
return next;
|
|
1642
1674
|
};
|
|
1643
1675
|
pending ??= acquire();
|
|
1644
|
-
let loaded
|
|
1676
|
+
let loaded: LoadedPriceHistory;
|
|
1677
|
+
try {
|
|
1678
|
+
loaded = await pending;
|
|
1679
|
+
} catch (error) {
|
|
1680
|
+
// Another series' refetch failed and put the saved copy back below.
|
|
1681
|
+
const restored = cache.priceHistoryByRequest.get(key);
|
|
1682
|
+
if (!restored || restored === pending) throw error;
|
|
1683
|
+
pending = restored;
|
|
1684
|
+
loaded = await pending;
|
|
1685
|
+
}
|
|
1645
1686
|
const now = () => referenceNow.getTime() + Math.max(0, Date.now() - resolutionStartedAt);
|
|
1646
1687
|
const currentWindow = () => !request.explicitWindow
|
|
1647
1688
|
|| (request.bounds.end !== null && now() - (request.bounds.end + 1) < 60 * 60_000);
|
|
1648
|
-
|
|
1649
|
-
|
|
1689
|
+
// A copy with a session record is judged here; any other says so itself,
|
|
1690
|
+
// when the router answered it from a saved copy short of the latest session.
|
|
1691
|
+
const staleCurrent = (value: LoadedPriceHistory) => currentWindow() && (value.savedCopyBehind === true
|
|
1692
|
+
|| (!!value.session && isPriceHistoryStaleForCurrentWindow(value.points, now(), {
|
|
1650
1693
|
symbol: source.instrument.symbol, exchange: source.instrument.exchange, session: value.session,
|
|
1651
1694
|
...(value.resolution ? { intervalMs: CHART_RESOLUTION_STEP_MS[value.resolution] } : {}),
|
|
1652
|
-
});
|
|
1695
|
+
})));
|
|
1696
|
+
// A copy behind the current session is fetched again at most every 30 s.
|
|
1697
|
+
// Until a fetch answers a current one, the saved copy is drawn with a
|
|
1698
|
+
// notice, as every other history path does, rather than an error.
|
|
1699
|
+
let behind = false;
|
|
1653
1700
|
if (staleCurrent(loaded)) {
|
|
1701
|
+
const saved = pending;
|
|
1702
|
+
const savedValue = loaded;
|
|
1703
|
+
const latest = cache.priceHistoryByRequest.get(key);
|
|
1704
|
+
let refresh: Promise<LoadedPriceHistory> | undefined;
|
|
1654
1705
|
if (reused && (cache.priceHistoryRefreshAfter.get(key) ?? 0) <= Date.now()) {
|
|
1655
1706
|
// Claim the refresh before awaiting it so price/volume/studies share one attempt.
|
|
1656
1707
|
cache.priceHistoryRefreshAfter.set(key, Date.now() + 30_000);
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1708
|
+
refresh = latest && latest !== pending ? latest : acquire();
|
|
1709
|
+
} else if (latest && latest !== pending) {
|
|
1710
|
+
refresh = latest;
|
|
1711
|
+
}
|
|
1712
|
+
if (refresh) {
|
|
1713
|
+
const attempt = refresh;
|
|
1714
|
+
loaded = await attempt.catch(() => {
|
|
1715
|
+
// A failed refetch leaves the saved copy in place until the next one is due.
|
|
1716
|
+
if (cache.priceHistoryByRequest.get(key) === attempt) {
|
|
1717
|
+
cache.priceHistoryByRequest.set(key, saved);
|
|
1718
|
+
if (savedValue.expiresAt !== undefined) cache.priceHistoryExpiryByRequest.set(key, savedValue.expiresAt);
|
|
1719
|
+
else cache.priceHistoryExpiryByRequest.delete(key);
|
|
1720
|
+
}
|
|
1721
|
+
return savedValue;
|
|
1722
|
+
});
|
|
1662
1723
|
}
|
|
1663
|
-
|
|
1724
|
+
behind = staleCurrent(loaded);
|
|
1725
|
+
if (behind) {
|
|
1664
1726
|
const previousDeadline = cache.priceHistoryRefreshAfter.get(key) ?? 0;
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1727
|
+
cache.priceHistoryRefreshAfter.set(key, previousDeadline > Date.now() ? previousDeadline : Date.now() + 30_000);
|
|
1728
|
+
const notice = behindHistoryNotice(source, loaded.points, now());
|
|
1729
|
+
if (notice) priorityWarnings.push(notice);
|
|
1668
1730
|
}
|
|
1669
1731
|
}
|
|
1670
|
-
cache.priceHistoryRefreshAfter.delete(key);
|
|
1732
|
+
if (!behind) cache.priceHistoryRefreshAfter.delete(key);
|
|
1671
1733
|
const history = loaded.points;
|
|
1672
1734
|
const coverageNotice = historyCoverageNotice(loaded.coverageStart, request.visibleBounds.start);
|
|
1673
1735
|
if (coverageNotice) priorityWarnings.push(coverageNotice);
|
|
@@ -1926,9 +1988,12 @@ async function resolveChartSpecPass(
|
|
|
1926
1988
|
? latestSessionView(primaryRaw, rawSeries.filter((entry) => entry.observationKind === "market"),
|
|
1927
1989
|
extendedHistories.has(primaryRaw?.id ?? ""), quoteReferences.get(primaryRaw?.id ?? ""))
|
|
1928
1990
|
: null;
|
|
1991
|
+
const capabilityOnly = spec.series.length > 0 && spec.series.every(({ source }) => source.kind === "capability");
|
|
1929
1992
|
const bounds = hasExplicitWindow
|
|
1930
1993
|
? requestVisibleBounds
|
|
1931
|
-
: sessionView?.bounds ??
|
|
1994
|
+
: sessionView?.bounds ?? (capabilityOnly
|
|
1995
|
+
? endAtNewestObservation(initialVisibleBounds, rawSeries)
|
|
1996
|
+
: followLatestMarketObservation(initialVisibleBounds, rawSeries));
|
|
1932
1997
|
if (sessionView?.priorClose != null && primaryRaw?.transform === "raw"
|
|
1933
1998
|
&& primaryRaw.unitGroup.startsWith("price") && primaryRaw.unitGroup !== "price:unknown") {
|
|
1934
1999
|
const index = rawSeries.indexOf(primaryRaw);
|
|
@@ -2146,8 +2211,9 @@ export function reconcileChartTail(
|
|
|
2146
2211
|
const refreshed = mergePriceHistoryWindows(loaded.points, points, tail.resolution);
|
|
2147
2212
|
if (samePricePoints(refreshed, loaded.points)) return false;
|
|
2148
2213
|
const acquisition = priceHistoryTailAcquisition(loaded, result);
|
|
2214
|
+
// The merged bars are as current as the newer acquisition says.
|
|
2149
2215
|
cache.priceHistoryByRequest.set(key, Promise.resolve({ ...loaded, points: refreshed,
|
|
2150
|
-
session: acquisition.session, sourceKey: acquisition.sourceKey }));
|
|
2216
|
+
session: acquisition.session, sourceKey: acquisition.sourceKey, savedCopyBehind: acquisition.savedCopyBehind }));
|
|
2151
2217
|
if (accumulated) {
|
|
2152
2218
|
const accumulatedAcquisition = priceHistoryTailAcquisition(accumulated, result);
|
|
2153
2219
|
cache.accumulatedPriceHistory.set(tail.accumulationKey, { ...accumulated,
|
package/src/time-series/types.ts
CHANGED
|
@@ -178,8 +178,10 @@ export interface ResolvedSeries {
|
|
|
178
178
|
*/
|
|
179
179
|
listing?: { symbol: string; exchange: string };
|
|
180
180
|
/** Price/volume observations and their derived studies, including 24/7
|
|
181
|
-
* markets. Independent of whether the chart compresses exchange sessions.
|
|
182
|
-
|
|
181
|
+
* markets. Independent of whether the chart compresses exchange sessions.
|
|
182
|
+
* `dataset`: a capability's published observations (vessel transits),
|
|
183
|
+
* whose values the legend dates because they arrive days late. */
|
|
184
|
+
observationKind?: "market" | "dataset";
|
|
183
185
|
/** Regular-session move supplied with the latest market quote. */
|
|
184
186
|
latestChangePercent?: number;
|
|
185
187
|
/** The previous session's close, set on a one-day chart's price series and drawn as its reference line. */
|
|
@@ -457,6 +457,38 @@ export function useChartResolution(
|
|
|
457
457
|
};
|
|
458
458
|
}, [coordinator, liveFrameMs, liveKey, sources]);
|
|
459
459
|
|
|
460
|
+
// A plugin series that changes through the day asks to be loaded again on
|
|
461
|
+
// its own cadence; only its entries leave the cache, so nothing else refetches.
|
|
462
|
+
const capabilityRefreshMs = sources.capabilityRefreshMs;
|
|
463
|
+
const seriesRefreshMs = useMemo(() => {
|
|
464
|
+
if (snapshot || !capabilityRefreshMs) return 0;
|
|
465
|
+
let shortest = 0;
|
|
466
|
+
for (const series of spec.series) {
|
|
467
|
+
if (series.source.kind !== "capability" || series.visible === false) continue;
|
|
468
|
+
const refreshMs = capabilityRefreshMs(series.source) ?? 0;
|
|
469
|
+
if (refreshMs > 0 && (shortest === 0 || refreshMs < shortest)) shortest = refreshMs;
|
|
470
|
+
}
|
|
471
|
+
return shortest;
|
|
472
|
+
// The spec key is the series' identity; a new spec object alone must not restart the timer.
|
|
473
|
+
}, [capabilityRefreshMs, snapshot, specKey]);
|
|
474
|
+
useEffect(() => {
|
|
475
|
+
if (!seriesRefreshMs || !paneVisible || !capabilityRefreshMs) return;
|
|
476
|
+
const timer = setInterval(() => {
|
|
477
|
+
const cache = resolveCacheRef.current;
|
|
478
|
+
let dropped = false;
|
|
479
|
+
for (const key of [...cache.capabilitySeriesByRequest.keys()]) {
|
|
480
|
+
const [, capabilityId, seriesId] = JSON.parse(key) as [string, string, string];
|
|
481
|
+
if (!capabilityRefreshMs({ kind: "capability", capabilityId, seriesId })) continue;
|
|
482
|
+
cache.capabilitySeriesByRequest.delete(key);
|
|
483
|
+
dropped = true;
|
|
484
|
+
}
|
|
485
|
+
if (!dropped) return;
|
|
486
|
+
cache.revision += 1;
|
|
487
|
+
setSupportRevision((current) => current + 1);
|
|
488
|
+
}, seriesRefreshMs);
|
|
489
|
+
return () => clearInterval(timer);
|
|
490
|
+
}, [capabilityRefreshMs, paneVisible, seriesRefreshMs]);
|
|
491
|
+
|
|
460
492
|
useEffect(() => {
|
|
461
493
|
if (snapshot) return;
|
|
462
494
|
generationRef.current += 1;
|
package/src/types/config.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { Portfolio, Watchlist } from "./ticker";
|
|
|
2
2
|
import type { BrokerContractRef, TickerListingRef } from "./instrument";
|
|
3
3
|
import type { LanguagePreference } from "../i18n/languages";
|
|
4
4
|
|
|
5
|
-
export const CURRENT_CONFIG_VERSION =
|
|
5
|
+
export const CURRENT_CONFIG_VERSION = 25;
|
|
6
6
|
|
|
7
7
|
type ChartRendererPreference = "auto" | "kitty" | "braille";
|
|
8
8
|
|
|
@@ -59,6 +59,30 @@ export interface PanePlacementMemory {
|
|
|
59
59
|
detached?: DetachedPlacementMemory;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* A ticker link Move to New Layout had to cut: the pane followed another one
|
|
64
|
+
* that stayed behind (or left with the moved pane) and was pinned on `symbol`.
|
|
65
|
+
* Move Back links it again while it is still pinned there.
|
|
66
|
+
*/
|
|
67
|
+
export interface PaneMovedLink {
|
|
68
|
+
instanceId: string;
|
|
69
|
+
sourceInstanceId: string;
|
|
70
|
+
symbol: string;
|
|
71
|
+
/** The title before the pin renamed it ("OPX" for "OPX NVDA"), when it did. */
|
|
72
|
+
title?: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Where Move to New Layout took a pane from, so Move Back can return it. */
|
|
76
|
+
export interface PaneMovedFrom {
|
|
77
|
+
/** `SavedLayout.id` of the layout it left. */
|
|
78
|
+
layoutId: string;
|
|
79
|
+
/** Set when it was docked there: its place in the tree and its share of the split. */
|
|
80
|
+
docked?: DockedPlacementMemory & { ratio?: number };
|
|
81
|
+
/** Set when it was floating there. */
|
|
82
|
+
floating?: FloatingPlacementMemory;
|
|
83
|
+
links?: PaneMovedLink[];
|
|
84
|
+
}
|
|
85
|
+
|
|
62
86
|
export interface PaneInstanceConfig {
|
|
63
87
|
instanceId: string;
|
|
64
88
|
paneId: string;
|
|
@@ -69,6 +93,8 @@ export interface PaneInstanceConfig {
|
|
|
69
93
|
placementMemory?: PanePlacementMemory;
|
|
70
94
|
/** Pinned by the user: the keyboard close shortcuts leave this pane alone. */
|
|
71
95
|
locked?: boolean;
|
|
96
|
+
/** Set by Move to New Layout and cleared by Move Back; never published. */
|
|
97
|
+
movedFrom?: PaneMovedFrom;
|
|
72
98
|
}
|
|
73
99
|
|
|
74
100
|
interface DockPaneNode {
|
|
@@ -203,6 +229,21 @@ export interface TelemetryConfig {
|
|
|
203
229
|
attention?: boolean;
|
|
204
230
|
}
|
|
205
231
|
|
|
232
|
+
/**
|
|
233
|
+
* The one-time line in the terminal's status bar asking to star Gloomberb on
|
|
234
|
+
* GitHub. Absent means on and not shown yet. Kept on this machine only.
|
|
235
|
+
*/
|
|
236
|
+
export interface StarPromptConfig {
|
|
237
|
+
/** `false` turns the line off; absent means on. */
|
|
238
|
+
enabled?: boolean;
|
|
239
|
+
/** Local days (`YYYY-MM-DD`) the terminal app was opened on, oldest first, until the line shows. */
|
|
240
|
+
days?: string[];
|
|
241
|
+
/** When the line showed. Once set it never shows again. */
|
|
242
|
+
shownAt?: string;
|
|
243
|
+
/** How it ended: the repository was opened, the line was dismissed, or it timed out. */
|
|
244
|
+
outcome?: "opened" | "dismissed" | "expired";
|
|
245
|
+
}
|
|
246
|
+
|
|
206
247
|
/**
|
|
207
248
|
* One recent command-bar run: `id` is `pane-template:<templateId>`, `label`
|
|
208
249
|
* its name when it ran, and `arg` a ticker it ran with (never free text).
|
|
@@ -255,6 +296,18 @@ export interface AppConfig {
|
|
|
255
296
|
/** Key overrides for this machine. Absent means every default applies. */
|
|
256
297
|
keybindings?: KeybindingsConfig;
|
|
257
298
|
telemetry?: TelemetryConfig;
|
|
299
|
+
starPrompt?: StarPromptConfig;
|
|
300
|
+
/**
|
|
301
|
+
* The IANA zone (`Asia/Tokyo`) the CLI and function reports show a local
|
|
302
|
+
* time in, beside every UTC time. Absent prints UTC alone. Trading-day dates
|
|
303
|
+
* are never shifted by it.
|
|
304
|
+
*/
|
|
305
|
+
timezone?: string;
|
|
306
|
+
/**
|
|
307
|
+
* Presentation mode: the panes fill the window, without the header or the
|
|
308
|
+
* status bar, for a screen that is shown rather than worked at. Absent is off.
|
|
309
|
+
*/
|
|
310
|
+
presentationMode?: boolean;
|
|
258
311
|
}
|
|
259
312
|
|
|
260
313
|
export const TICKER_RESEARCH_PANE_ID = "ticker-research";
|
|
@@ -582,6 +635,17 @@ export function clonePlacementMemory(memory: PanePlacementMemory | undefined): P
|
|
|
582
635
|
};
|
|
583
636
|
}
|
|
584
637
|
|
|
638
|
+
function clonePaneMovedFrom(movedFrom: PaneMovedFrom): PaneMovedFrom {
|
|
639
|
+
return {
|
|
640
|
+
layoutId: movedFrom.layoutId,
|
|
641
|
+
...(movedFrom.docked ? {
|
|
642
|
+
docked: { ...movedFrom.docked, ...(movedFrom.docked.path ? { path: [...movedFrom.docked.path] } : {}) },
|
|
643
|
+
} : {}),
|
|
644
|
+
...(movedFrom.floating ? { floating: { ...movedFrom.floating } } : {}),
|
|
645
|
+
...(movedFrom.links ? { links: movedFrom.links.map((link) => ({ ...link })) } : {}),
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
|
|
585
649
|
function cloneUnknownValue<T>(value: T): T {
|
|
586
650
|
if (Array.isArray(value)) {
|
|
587
651
|
return value.map((entry) => cloneUnknownValue(entry)) as T;
|
|
@@ -816,6 +880,7 @@ export function normalizePaneLayout(
|
|
|
816
880
|
params: instance.params ? { ...instance.params } : undefined,
|
|
817
881
|
settings: clonePaneSettings(instance.settings),
|
|
818
882
|
placementMemory: clonePlacementMemory(instance.placementMemory),
|
|
883
|
+
...(instance.movedFrom ? { movedFrom: clonePaneMovedFrom(instance.movedFrom) } : {}),
|
|
819
884
|
})),
|
|
820
885
|
floating: nextLayout.floating
|
|
821
886
|
.filter((entry) => (
|
|
@@ -838,6 +903,7 @@ export function cloneLayout(layout: LayoutConfig): LayoutConfig {
|
|
|
838
903
|
params: instance.params ? { ...instance.params } : undefined,
|
|
839
904
|
settings: clonePaneSettings(instance.settings),
|
|
840
905
|
placementMemory: clonePlacementMemory(instance.placementMemory),
|
|
906
|
+
...(instance.movedFrom ? { movedFrom: clonePaneMovedFrom(instance.movedFrom) } : {}),
|
|
841
907
|
})),
|
|
842
908
|
floating: layout.floating.map((entry) => ({ ...entry })),
|
|
843
909
|
detached: detached.map((entry) => ({ ...entry })),
|
|
@@ -138,6 +138,11 @@ export interface SearchRequestContext {
|
|
|
138
138
|
* well under a second rather than given the batch budget.
|
|
139
139
|
*/
|
|
140
140
|
interactive?: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Rows to ask a catalogue for. Every listing of a symbol several companies
|
|
143
|
+
* use (CAR: Avis, Carrefour, CAR Group) takes more than a keystroke's ten.
|
|
144
|
+
*/
|
|
145
|
+
limit?: number;
|
|
141
146
|
/**
|
|
142
147
|
* Called when a later source improves the result the search already returned,
|
|
143
148
|
* typically a broker adding contract detail to a symbol the cloud found
|
package/src/types/financials.ts
CHANGED
|
@@ -100,6 +100,14 @@ export interface Quote extends DepositaryReceiptFacts {
|
|
|
100
100
|
postMarketPrice?: number;
|
|
101
101
|
postMarketChange?: number;
|
|
102
102
|
postMarketChangePercent?: number;
|
|
103
|
+
/**
|
|
104
|
+
* Whether the quote holds a trade from the pre-market or after-hours
|
|
105
|
+
* session in progress (marketState PRE or POST). False when nothing has
|
|
106
|
+
* traded in it yet: the extended fields, or the price, are then the regular
|
|
107
|
+
* price carried forward, and their flat move is no move. Absent in the other
|
|
108
|
+
* sessions and when the source does not say.
|
|
109
|
+
*/
|
|
110
|
+
extendedSessionPrint?: boolean;
|
|
103
111
|
bid?: number;
|
|
104
112
|
ask?: number;
|
|
105
113
|
bidSize?: number;
|
|
@@ -123,6 +131,26 @@ export interface QuoteContribution extends Quote {
|
|
|
123
131
|
|
|
124
132
|
export type QuoteContributionMap = Record<string, QuoteContribution>;
|
|
125
133
|
|
|
134
|
+
/** How a fundamentals block's trailing figures were converted from the currency the company reports in. */
|
|
135
|
+
export interface TtmConversion {
|
|
136
|
+
/** The reporting currency the figures were converted from. */
|
|
137
|
+
from: string;
|
|
138
|
+
/** Units of `financialCurrency` per unit of `from` for revenue, income and cash flow; absent when not measured. */
|
|
139
|
+
rate?: number;
|
|
140
|
+
/** YYYY-MM-DD the converted figures were fetched. */
|
|
141
|
+
asOf?: string;
|
|
142
|
+
/** EPS is converted at the rate of each report date, so a P/E on it divides a spot price by EPS at older rates. */
|
|
143
|
+
eps?: "report_date";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** How a trailing P/E converts the EPS it divides by, when that EPS is in another currency than the price. */
|
|
147
|
+
export interface TrailingPEConversion {
|
|
148
|
+
/** The currency of the trailing EPS. */
|
|
149
|
+
from: string;
|
|
150
|
+
/** Units of the quote's (major) currency per unit of `from`. */
|
|
151
|
+
rate: number;
|
|
152
|
+
}
|
|
153
|
+
|
|
126
154
|
export interface Fundamentals extends DepositaryReceiptFacts {
|
|
127
155
|
/** Every share count here is on this basis, the basis of the listing's price and market cap; absent when unproven. */
|
|
128
156
|
shareBasis?: ShareBasis;
|
|
@@ -131,8 +159,14 @@ export interface Fundamentals extends DepositaryReceiptFacts {
|
|
|
131
159
|
source?: "gloom";
|
|
132
160
|
fetchedAt?: string;
|
|
133
161
|
stale?: boolean;
|
|
134
|
-
/** Currency of
|
|
162
|
+
/** Currency of the trailing revenue, income, cash flows and EPS (EPS unless `epsCurrency` says otherwise); may differ from the listing and the statements. */
|
|
135
163
|
financialCurrency?: string;
|
|
164
|
+
/** Set when the trailing figures were converted from the reporting currency into `financialCurrency`. */
|
|
165
|
+
ttmConversion?: TtmConversion;
|
|
166
|
+
/** Set when the trailing EPS is in another currency than `financialCurrency`: the listing's, converted from the reporting currency at each report date's rate. */
|
|
167
|
+
epsCurrency?: string;
|
|
168
|
+
/** Set when `trailingPE` divides the price by the trailing EPS converted from another currency. */
|
|
169
|
+
trailingPEConversion?: TrailingPEConversion;
|
|
136
170
|
/** Provider-reported issuer market cap; marketCapCurrency identifies its units when known. */
|
|
137
171
|
marketCap?: number;
|
|
138
172
|
marketCapCurrency?: string;
|
|
@@ -302,6 +336,16 @@ export interface SplitAction {
|
|
|
302
336
|
toFactor?: number;
|
|
303
337
|
}
|
|
304
338
|
|
|
339
|
+
/**
|
|
340
|
+
* How a reported EPS relates to the company's statements: `gaap` is the
|
|
341
|
+
* quarter's diluted EPS as the statements report it; `adjusted` is the
|
|
342
|
+
* consensus-basis figure, which leaves out items the statements include.
|
|
343
|
+
*/
|
|
344
|
+
export type EarningsEpsBasis = "gaap" | "adjusted";
|
|
345
|
+
|
|
346
|
+
/** A report that is out, a date the company announced, or a date projected from its past reports. */
|
|
347
|
+
export type EarningsDateStatus = "reported" | "confirmed" | "projected";
|
|
348
|
+
|
|
305
349
|
export interface EarningsAction {
|
|
306
350
|
date: string;
|
|
307
351
|
dateType?: "announcement" | "fiscal-period-end";
|
|
@@ -311,6 +355,13 @@ export interface EarningsAction {
|
|
|
311
355
|
epsActual?: number;
|
|
312
356
|
difference?: number;
|
|
313
357
|
surprisePercent?: number;
|
|
358
|
+
/** Fiscal quarter end month, YYYY-MM, when the report's quarter is known. */
|
|
359
|
+
fiscalPeriod?: string;
|
|
360
|
+
/** Analysts behind `epsEstimate`, when known. */
|
|
361
|
+
epsAnalysts?: number;
|
|
362
|
+
/** Null when the basis cannot be determined; absent from sources that do not say. */
|
|
363
|
+
epsBasis?: EarningsEpsBasis | null;
|
|
364
|
+
dateStatus?: EarningsDateStatus;
|
|
314
365
|
}
|
|
315
366
|
|
|
316
367
|
export interface CorporateActionsData {
|
package/src/types/headless.ts
CHANGED
|
@@ -51,6 +51,15 @@ export interface HeadlessPaneOptionDef {
|
|
|
51
51
|
pluginId: string;
|
|
52
52
|
key?: string;
|
|
53
53
|
};
|
|
54
|
+
/** The value's name in the catalog's flag, `--expiration <YYYY-MM-DD|unix>`; the type when absent. */
|
|
55
|
+
placeholder?: string;
|
|
56
|
+
/** The option in use as typed after the function, such as `--expiration 2028-01-21`; the catalog shows it as an example. */
|
|
57
|
+
example?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Checks a typed value and returns it as the pane reads it, in place of the
|
|
60
|
+
* type's own check; throws an Error that names what is wrong.
|
|
61
|
+
*/
|
|
62
|
+
normalize?(value: string): string | number | boolean;
|
|
54
63
|
}
|
|
55
64
|
|
|
56
65
|
export interface HeadlessPaneLoadArgs {
|
|
@@ -90,8 +99,18 @@ export interface HeadlessPaneColumn {
|
|
|
90
99
|
header: string;
|
|
91
100
|
align?: "left" | "right" | "center";
|
|
92
101
|
width?: number;
|
|
102
|
+
/** False keeps the column whole when the text table is fitted to a narrow width, so a time or an id is never cut. */
|
|
103
|
+
shrink?: boolean;
|
|
93
104
|
description?: string;
|
|
94
105
|
format?: (value: unknown, row: HeadlessPaneRow) => string;
|
|
106
|
+
/** What the text report prints when it can say more than an export should (a unit word beside a number); CSV and NDJSON keep `format`. */
|
|
107
|
+
textFormat?: (value: unknown, row: HeadlessPaneRow) => string;
|
|
108
|
+
/**
|
|
109
|
+
* The text report prints the value on its own lines under the row instead
|
|
110
|
+
* of in a column, for a footnote that belongs to that row; an empty value
|
|
111
|
+
* prints nothing. Exports keep it as a column.
|
|
112
|
+
*/
|
|
113
|
+
underRow?: boolean;
|
|
95
114
|
}
|
|
96
115
|
|
|
97
116
|
export interface HeadlessPaneEntry {
|
|
@@ -142,6 +161,12 @@ export interface HeadlessPaneFreshness {
|
|
|
142
161
|
delayMinutes?: number;
|
|
143
162
|
/** What not-a-feed data is, in a few words: "filed data", "monthly release", "your inputs". */
|
|
144
163
|
basis?: string;
|
|
164
|
+
/**
|
|
165
|
+
* How often the data is published, when its dates mark the start of a period
|
|
166
|
+
* (a monthly statistic is dated the 1st). The report then names the month,
|
|
167
|
+
* quarter or year, not a day it was never observed on.
|
|
168
|
+
*/
|
|
169
|
+
periodicity?: "monthly" | "quarterly" | "annual";
|
|
145
170
|
/** The newest observation is stale once it is older than this many minutes. */
|
|
146
171
|
maxAgeMinutes?: number;
|
|
147
172
|
/**
|
|
@@ -155,8 +180,44 @@ export interface HeadlessPaneFreshness {
|
|
|
155
180
|
* completed session has passed after the newest (a day's lag is allowed).
|
|
156
181
|
*/
|
|
157
182
|
cadence?: "daily";
|
|
183
|
+
/** The venue whose trading days a `daily` cadence counts instead, when the app knows its sessions. */
|
|
184
|
+
cadenceExchange?: string;
|
|
185
|
+
/**
|
|
186
|
+
* Whose trading day a dated (`YYYY-MM-DD`) as-of is, as a reader names the
|
|
187
|
+
* market: `US` for a US trading or business day. The report then reads
|
|
188
|
+
* `US trading day Fri 9 Oct 2026`, so a reader whose day is already Saturday
|
|
189
|
+
* does not take the US Friday for theirs. Leave it out when the dates are not
|
|
190
|
+
* one market's.
|
|
191
|
+
*/
|
|
192
|
+
tradingDayMarket?: string;
|
|
158
193
|
/** The newest observation is stale once this time (the next scheduled release) has passed by a day. */
|
|
159
194
|
nextExpectedAt?: string | number | Date | null;
|
|
195
|
+
/**
|
|
196
|
+
* Observations of the world collected and published some days after they
|
|
197
|
+
* happen (vessel transits, job postings, rental prices, grid queues), not
|
|
198
|
+
* quotes. A screenshot then cites the source, the newest observation's date
|
|
199
|
+
* and its lag in days (`Source: Gloom Cloud · observed Sun 4 Oct · lag 6d`),
|
|
200
|
+
* never a market's session. Rows that are quotes keep the market line.
|
|
201
|
+
*/
|
|
202
|
+
dataset?: boolean;
|
|
203
|
+
/**
|
|
204
|
+
* What a dataset's newest observation is, when its every line names it:
|
|
205
|
+
* `last trade` makes the `fn` footer, the pane footer and a screenshot read
|
|
206
|
+
* the same, `Source: DTCC · last trade 2026-10-09 · lag 2 days`, dated as
|
|
207
|
+
* the report's rows are, by ISO date.
|
|
208
|
+
*/
|
|
209
|
+
observation?: string;
|
|
210
|
+
/**
|
|
211
|
+
* Each source's own newest observation, for data drawn from several venues
|
|
212
|
+
* polled apart (a perpetuals board). The line then dates every source and
|
|
213
|
+
* says how old the oldest of them is (`Binance 02:15 · Bybit 02:24 UTC ·
|
|
214
|
+
* oldest 9 min`), and `asOf` is the newest of them unless declared.
|
|
215
|
+
*/
|
|
216
|
+
sources?: Array<{ source: string; asOf: string | number | Date }>;
|
|
217
|
+
/** Say how old the oldest observation is (`oldest 4 min`): rows polled apart from one source. */
|
|
218
|
+
oldestAge?: boolean;
|
|
219
|
+
/** What the figures are, said after the status: `funding = current estimate, pays 08:00 UTC`. */
|
|
220
|
+
note?: string;
|
|
160
221
|
}
|
|
161
222
|
|
|
162
223
|
interface HeadlessPaneResultBase {
|
|
@@ -182,6 +243,8 @@ interface HeadlessPaneResultBase {
|
|
|
182
243
|
export interface HeadlessRowsResult extends HeadlessPaneResultBase {
|
|
183
244
|
columns?: HeadlessPaneColumn[];
|
|
184
245
|
rows: HeadlessPaneRow[];
|
|
246
|
+
/** What the report says when `rows` is empty, in place of "No data.": why there are none. */
|
|
247
|
+
empty?: string;
|
|
185
248
|
}
|
|
186
249
|
|
|
187
250
|
export type HeadlessBundleSection =
|
|
@@ -189,6 +252,8 @@ export type HeadlessBundleSection =
|
|
|
189
252
|
title: string;
|
|
190
253
|
columns?: HeadlessPaneColumn[];
|
|
191
254
|
rows: HeadlessPaneRow[];
|
|
255
|
+
/** What the report says when `rows` is empty, in place of "No data.": why there are none, and what to run instead. */
|
|
256
|
+
empty?: string;
|
|
192
257
|
entries?: never;
|
|
193
258
|
}
|
|
194
259
|
| {
|
|
@@ -255,6 +320,13 @@ export interface HeadlessPaneDefinition<Shape extends HeadlessPaneShape = Headle
|
|
|
255
320
|
*/
|
|
256
321
|
description?: string;
|
|
257
322
|
argument: HeadlessPaneArgumentDef;
|
|
323
|
+
/**
|
|
324
|
+
* The data covers US listings only, named as a sentence starts ("Time and
|
|
325
|
+
* sales"). `fn` and `shot` answer a listing abroad with that and the
|
|
326
|
+
* company's US listing instead of loading, so a symbol another company uses
|
|
327
|
+
* in the US never shows that company's numbers.
|
|
328
|
+
*/
|
|
329
|
+
usListingsOnly?: string;
|
|
258
330
|
options: HeadlessPaneOptionDef[];
|
|
259
331
|
/** What is true of every load: its source, and whether it is a feed. */
|
|
260
332
|
freshness?: HeadlessPaneFreshness;
|
package/src/types/instrument.ts
CHANGED
|
@@ -59,4 +59,12 @@ export interface InstrumentSearchResult {
|
|
|
59
59
|
/** How often the listing is searched, higher is more (the search service score,
|
|
60
60
|
* sent by newer cloud servers). Only comparable within one response. */
|
|
61
61
|
popularity?: number;
|
|
62
|
+
/** Trade names the row answers to ("Aramco" for Saudi Arabian Oil Co.), sent by
|
|
63
|
+
* newer cloud servers on a row a trade-name query added. The legal name does not
|
|
64
|
+
* contain them, so search matches the query against them too. */
|
|
65
|
+
searchAliases?: string[];
|
|
66
|
+
/** A theme the row answers to without its name saying so ("lithium" on
|
|
67
|
+
* Albemarle, which the lithium funds hold), sent by newer cloud servers on a
|
|
68
|
+
* row a theme query added. Matched like the name, ranked after name matches. */
|
|
69
|
+
searchKeywords?: string[];
|
|
62
70
|
}
|