gloomberb 0.15.7 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/package.json +1 -1
- package/src/api-client/app-attention.ts +147 -0
- package/src/api-client/attention.ts +26 -0
- package/src/api-client/awards.ts +215 -0
- package/src/api-client/catalysts.ts +160 -0
- package/src/api-client/chat.ts +137 -14
- package/src/api-client/company-kpis.ts +153 -0
- package/src/api-client/cpi.ts +52 -0
- package/src/api-client/credit-documents.ts +107 -0
- package/src/api-client/data.ts +192 -3
- package/src/api-client/distress.ts +164 -0
- package/src/api-client/doe.ts +75 -0
- package/src/api-client/equity-screener.ts +11 -0
- package/src/api-client/exposure.ts +202 -0
- package/src/api-client/gpu.ts +93 -0
- package/src/api-client/hiring.ts +110 -0
- package/src/api-client/index.ts +78 -3
- package/src/api-client/normalizers.ts +31 -1
- package/src/api-client/paths.ts +3 -0
- package/src/api-client/perps.ts +127 -0
- package/src/api-client/power.ts +148 -0
- package/src/api-client/request.ts +58 -1
- package/src/api-client/research-activity.ts +172 -13
- package/src/api-client/socket.ts +75 -27
- package/src/api-client/supply-chain-graph.ts +40 -0
- package/src/api-client/supply-chain.ts +98 -0
- package/src/api-client/telemetry.ts +29 -0
- package/src/api-client/themes.ts +28 -0
- package/src/api-client/types.ts +33 -1
- package/src/api-client/wall-experiments.ts +100 -0
- package/src/api-client/wall-summary.ts +49 -0
- package/src/api-client/web-experiments.ts +136 -0
- package/src/app/pane-runtime/plugin-bindings.ts +5 -0
- package/src/app/pane-runtime/ticker-open-runtime.ts +8 -2
- package/src/app/runtime/update.ts +13 -1
- package/src/cli/commands/system.ts +2 -0
- package/src/cli/desktop-pane-shot.ts +3 -4
- package/src/cli/pane-functions/data.ts +78 -0
- package/src/cli/pane-functions/financial-ratio-shot.ts +160 -0
- package/src/cli/pane-functions/function-help.ts +220 -8
- package/src/cli/pane-functions/headless.ts +4 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +21 -0
- package/src/cli/pane-functions/screenshot.ts +49 -5
- package/src/components/chart/composite/composite-chart.tsx +15 -2
- package/src/components/chart/composite/format.ts +24 -11
- package/src/components/chart/composite/rasterizer.ts +67 -16
- package/src/components/chart/composite/scene.ts +53 -2
- package/src/components/chart/composite/session-shading.ts +3 -2
- package/src/components/chart/composite/text-renderer.ts +52 -1
- package/src/components/chart/composite/time-axis.ts +100 -30
- package/src/components/chart/composite/tools.ts +2 -1
- package/src/components/chart/composite/types.ts +4 -0
- package/src/components/chart-table/index.ts +1 -0
- package/src/components/chart-table/layout.ts +15 -0
- package/src/components/command-bar/action-runtime.ts +1 -0
- package/src/components/command-bar/commands/direct/index.ts +32 -0
- package/src/components/command-bar/commands/registry.ts +7 -0
- package/src/components/command-bar/pane-templates/items.ts +11 -0
- package/src/components/command-bar/pane-templates/workflow.ts +19 -4
- package/src/components/command-bar/routes/root/command-items.ts +6 -0
- package/src/components/command-bar/routes/root/provider-search.ts +2 -0
- package/src/components/command-bar/routes/root/results.ts +64 -0
- package/src/components/command-bar/routes/root/runtime.ts +8 -0
- package/src/components/command-bar/routes/ticker-search/results.ts +89 -24
- package/src/components/command-bar/routes/ticker-search/route.ts +2 -0
- package/src/components/command-bar/surface/index.tsx +15 -0
- package/src/components/command-bar/view-model.ts +3 -0
- package/src/components/command-bar/workflow/collection-actions.ts +9 -7
- package/src/components/command-bar/workflow/ops.ts +19 -0
- package/src/components/command-bar/workflow/tickers.ts +5 -0
- package/src/components/company-logo.tsx +15 -2
- package/src/components/data-table/table-pane.ts +2 -1
- package/src/components/index.ts +1 -0
- package/src/components/layout/detached-pane-shell.tsx +12 -1
- package/src/components/layout/missing-pane.tsx +87 -23
- package/src/components/layout/pane/footer/index.tsx +64 -18
- package/src/components/layout/pane/footer/model.ts +85 -0
- package/src/components/layout/pane/sidebar.tsx +19 -1
- package/src/components/layout/shell/index.tsx +38 -28
- package/src/components/layout/shell/pane/management-shortcuts.ts +13 -1
- package/src/components/layout/status-bar.tsx +93 -28
- package/src/components/layout/status-widget-space.ts +72 -0
- package/src/components/onboarding/first-run-workspace.ts +8 -2
- package/src/components/onboarding/onboarding-wizard.tsx +35 -16
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +14 -5
- package/src/components/onboarding/wizard-model.ts +13 -5
- package/src/components/onboarding/wizard-positions.ts +56 -7
- package/src/components/price-performance.tsx +31 -34
- package/src/components/ui/data-table/index.tsx +11 -8
- package/src/components/ui/display.tsx +15 -6
- package/src/components/ui/fields.tsx +5 -0
- package/src/components/ui/figure.tsx +94 -0
- package/src/components/ui/header-case.ts +25 -3
- package/src/components/ui/icon.tsx +3 -1
- package/src/components/ui/message-composer.tsx +8 -1
- package/src/components/ui/query-bar.tsx +8 -1
- package/src/components/ui/ratio-bar.tsx +84 -0
- package/src/components/ui/toggle.tsx +3 -1
- package/src/components/use-scrollbox-layout.ts +17 -0
- package/src/core/state/app/layout.ts +35 -1
- package/src/core/state/app/state.ts +15 -0
- package/src/core/state/app/types.ts +1 -0
- package/src/data/config/store/normalize.ts +24 -0
- package/src/i18n/es.ts +2 -0
- package/src/i18n/ja.ts +2 -0
- package/src/i18n/ko.ts +2 -0
- package/src/i18n/zh-cn.ts +2 -0
- package/src/i18n/zh-tw.ts +2 -0
- package/src/layout-marketplace/pane-imagery.ts +1 -0
- package/src/market-data/coordinator/entries.ts +13 -0
- package/src/market-data/coordinator/financials.ts +33 -8
- package/src/market-data/market/freshness.ts +16 -5
- package/src/market-data/market/trading-sessions.ts +65 -1
- package/src/market-data/published-cn-sessions.ts +25 -0
- package/src/market-data/published-nse-sessions.ts +20 -0
- package/src/news/aggregator.ts +4 -0
- package/src/plugins/builtin/account-management/model.ts +6 -1
- package/src/plugins/builtin/account-management/pane.tsx +36 -25
- package/src/plugins/builtin/alerts/catalysts.ts +77 -0
- package/src/plugins/builtin/alerts/events-pane.tsx +3 -0
- package/src/plugins/builtin/alerts/events.ts +10 -4
- package/src/plugins/builtin/alerts/history-pane.tsx +1 -1
- package/src/plugins/builtin/alerts/history.ts +1 -0
- package/src/plugins/builtin/alerts/index.tsx +6 -0
- package/src/plugins/builtin/alerts/research-builder.ts +10 -3
- package/src/plugins/builtin/alerts/research-rules.ts +15 -1
- package/src/plugins/builtin/analytics/risk-client.ts +15 -3
- package/src/plugins/builtin/analytics/risk-headless.ts +123 -18
- package/src/plugins/builtin/attention/client.ts +80 -0
- package/src/plugins/builtin/attention/evidence.ts +30 -0
- package/src/plugins/builtin/attention/headless.ts +33 -0
- package/src/plugins/builtin/attention/index.tsx +18 -0
- package/src/plugins/builtin/attention/model.ts +59 -0
- package/src/plugins/builtin/attention/pane.tsx +211 -0
- package/src/plugins/builtin/attention/trending.tsx +59 -0
- package/src/plugins/builtin/awards/alerts.ts +32 -0
- package/src/plugins/builtin/awards/client.ts +82 -0
- package/src/plugins/builtin/awards/detail.tsx +107 -0
- package/src/plugins/builtin/awards/evidence.ts +36 -0
- package/src/plugins/builtin/awards/headless.ts +55 -0
- package/src/plugins/builtin/awards/index.tsx +20 -0
- package/src/plugins/builtin/awards/model.ts +42 -0
- package/src/plugins/builtin/awards/pane.tsx +263 -0
- package/src/plugins/builtin/catalysts/client.ts +28 -0
- package/src/plugins/builtin/catalysts/detail.tsx +88 -0
- package/src/plugins/builtin/catalysts/evidence.ts +47 -0
- package/src/plugins/builtin/catalysts/headless.ts +42 -0
- package/src/plugins/builtin/catalysts/history.ts +26 -0
- package/src/plugins/builtin/catalysts/index.tsx +29 -0
- package/src/plugins/builtin/catalysts/model.ts +135 -0
- package/src/plugins/builtin/catalysts/pane.tsx +159 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +4 -0
- package/src/plugins/builtin/chart-composer/headless-schema.ts +6 -0
- package/src/plugins/builtin/chart-composer/index.tsx +8 -1
- package/src/plugins/builtin/chart-composer/pane.tsx +28 -1
- package/src/plugins/builtin/chat/attachments/desktop.tsx +610 -0
- package/src/plugins/builtin/chat/attachments/files.ts +45 -0
- package/src/plugins/builtin/chat/attachments/model.ts +164 -0
- package/src/plugins/builtin/chat/attachments/terminal.tsx +72 -0
- package/src/plugins/builtin/chat/attachments/transfer.ts +165 -0
- package/src/plugins/builtin/chat/content/channel-navigation.ts +13 -12
- package/src/plugins/builtin/chat/content/composer-runtime.ts +25 -4
- package/src/plugins/builtin/chat/content/composer.tsx +46 -4
- package/src/plugins/builtin/chat/content/footer.tsx +46 -8
- package/src/plugins/builtin/chat/content/index.tsx +263 -62
- package/src/plugins/builtin/chat/content/layout-metrics.ts +10 -2
- package/src/plugins/builtin/chat/content/open-targets.ts +17 -3
- package/src/plugins/builtin/chat/content/scroll.ts +7 -1
- package/src/plugins/builtin/chat/content/shortcuts.ts +36 -11
- package/src/plugins/builtin/chat/content/snapshot.ts +3 -0
- package/src/plugins/builtin/chat/content/transcript.tsx +17 -1
- package/src/plugins/builtin/chat/content/types.ts +7 -0
- package/src/plugins/builtin/chat/controller/attachments.ts +213 -0
- package/src/plugins/builtin/chat/controller/connections.ts +3 -1
- package/src/plugins/builtin/chat/controller/index.ts +114 -2
- package/src/plugins/builtin/chat/controller/lifecycle.ts +9 -0
- package/src/plugins/builtin/chat/controller/messages.ts +35 -2
- package/src/plugins/builtin/chat/controller/send.ts +128 -25
- package/src/plugins/builtin/chat/controller/state.ts +12 -1
- package/src/plugins/builtin/chat/controller/utils.ts +7 -5
- package/src/plugins/builtin/chat/controller/view.ts +2 -0
- package/src/plugins/builtin/chat/index.tsx +21 -0
- package/src/plugins/builtin/chat/layout.ts +9 -4
- package/src/plugins/builtin/chat/message/desktop.tsx +55 -20
- package/src/plugins/builtin/chat/message/header.tsx +30 -5
- package/src/plugins/builtin/chat/message/inline-tokens.tsx +9 -0
- package/src/plugins/builtin/chat/message/pending-send.ts +35 -0
- package/src/plugins/builtin/chat/message/profile-popover.tsx +5 -1
- package/src/plugins/builtin/chat/message/render-state.ts +12 -2
- package/src/plugins/builtin/chat/message/terminal.tsx +51 -4
- package/src/plugins/builtin/chat/message/types.ts +6 -1
- package/src/plugins/builtin/chat/pane-state.ts +59 -1
- package/src/plugins/builtin/chat/profile-popover.ts +50 -1
- package/src/plugins/builtin/chat/sidebar.tsx +8 -3
- package/src/plugins/builtin/chat/status-widget.tsx +29 -12
- package/src/plugins/builtin/chat/unread-inbox-pane.tsx +143 -0
- package/src/plugins/builtin/chat/unread-inbox.ts +91 -0
- package/src/plugins/builtin/clinical-trials/client.ts +237 -0
- package/src/plugins/builtin/clinical-trials/index.tsx +74 -0
- package/src/plugins/builtin/clinical-trials/pane.tsx +225 -0
- package/src/plugins/builtin/clinical-trials/types.ts +2 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +37 -6
- package/src/plugins/builtin/cloud/askg/executor.ts +59 -44
- package/src/plugins/builtin/cloud/askg/host.ts +8 -1
- package/src/plugins/builtin/cloud/askg/manifest.ts +29 -2
- package/src/plugins/builtin/cloud/askg/model.ts +47 -13
- package/src/plugins/builtin/cloud/askg/notes.ts +100 -0
- package/src/plugins/builtin/cloud/askg/pane.tsx +50 -14
- package/src/plugins/builtin/cloud/askg/protocol.ts +39 -1
- package/src/plugins/builtin/cloud/askg/result-budget.ts +156 -0
- package/src/plugins/builtin/cloud/askg/user-data.ts +89 -0
- package/src/plugins/builtin/cloud/auth-actions.tsx +55 -31
- package/src/plugins/builtin/cloud/plugin.tsx +4 -1
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +10 -1
- package/src/plugins/builtin/cloud/team/pane.tsx +3 -2
- package/src/plugins/builtin/cloud/thesis/board-pane.tsx +2 -2
- package/src/plugins/builtin/cloud/thesis/detail.tsx +1 -1
- package/src/plugins/builtin/cloud/thesis/ticker-tab.tsx +2 -2
- package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +202 -0
- package/src/plugins/builtin/cloud/upgrade-command.ts +1 -1
- package/src/plugins/builtin/cloud/upgrade-dialog.tsx +29 -3
- package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +1 -1
- package/src/plugins/builtin/cloud-tweets/table.tsx +1 -1
- package/src/plugins/builtin/comment-letters/client.ts +342 -0
- package/src/plugins/builtin/comment-letters/index.tsx +74 -0
- package/src/plugins/builtin/comment-letters/pane.tsx +295 -0
- package/src/plugins/builtin/comment-letters/types.ts +43 -0
- package/src/plugins/builtin/company-attention/app-rank.tsx +79 -0
- package/src/plugins/builtin/company-attention/client.ts +69 -0
- package/src/plugins/builtin/company-attention/evidence.ts +45 -0
- package/src/plugins/builtin/company-attention/headless.ts +47 -0
- package/src/plugins/builtin/company-attention/index.tsx +30 -0
- package/src/plugins/builtin/company-attention/model.ts +129 -0
- package/src/plugins/builtin/company-attention/pane.tsx +183 -0
- package/src/plugins/builtin/company-kpis/client.ts +92 -0
- package/src/plugins/builtin/company-kpis/headless.ts +32 -0
- package/src/plugins/builtin/company-kpis/index.tsx +26 -0
- package/src/plugins/builtin/company-kpis/model.ts +124 -0
- package/src/plugins/builtin/company-kpis/pane.tsx +226 -0
- package/src/plugins/builtin/company-kpis/related.ts +11 -0
- package/src/plugins/builtin/company-kpis/screenshot-evidence.ts +44 -0
- package/src/plugins/builtin/composite-plugins.ts +34 -0
- package/src/plugins/builtin/correlation/history.ts +4 -1
- package/src/plugins/builtin/correlation/index.tsx +139 -80
- package/src/plugins/builtin/correlation/matrix/pair-chart.tsx +48 -0
- package/src/plugins/builtin/correlation/matrix/selection.ts +77 -0
- package/src/plugins/builtin/correlation/relationship/model.ts +2 -2
- package/src/plugins/builtin/cpi/client.ts +66 -0
- package/src/plugins/builtin/cpi/headless.ts +78 -0
- package/src/plugins/builtin/cpi/index.tsx +31 -0
- package/src/plugins/builtin/cpi/model.ts +198 -0
- package/src/plugins/builtin/cpi/pane.tsx +157 -0
- package/src/plugins/builtin/credit-documents/client.ts +99 -0
- package/src/plugins/builtin/credit-documents/detail.tsx +109 -0
- package/src/plugins/builtin/credit-documents/evidence.ts +64 -0
- package/src/plugins/builtin/credit-documents/gauge.tsx +55 -0
- package/src/plugins/builtin/credit-documents/headless.ts +40 -0
- package/src/plugins/builtin/credit-documents/index.tsx +19 -0
- package/src/plugins/builtin/credit-documents/model.ts +336 -0
- package/src/plugins/builtin/credit-documents/pane.tsx +185 -0
- package/src/plugins/builtin/custom-view/view-spec.ts +14 -2
- package/src/plugins/builtin/debt-maturities/pane.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/pane.tsx +1 -1
- package/src/plugins/builtin/doe/client.ts +73 -0
- package/src/plugins/builtin/doe/headless.ts +93 -0
- package/src/plugins/builtin/doe/index.tsx +41 -0
- package/src/plugins/builtin/doe/model.ts +215 -0
- package/src/plugins/builtin/doe/pane.tsx +148 -0
- package/src/plugins/builtin/doe/range-bar.tsx +45 -0
- package/src/plugins/builtin/earnings/board.tsx +3 -0
- package/src/plugins/builtin/earnings/index.tsx +2 -0
- package/src/plugins/builtin/earnings-calls/pane.tsx +7 -1
- package/src/plugins/builtin/earnings-calls/transcript-view.tsx +7 -7
- package/src/plugins/builtin/earnings-ripple/client.ts +60 -0
- package/src/plugins/builtin/earnings-ripple/headless.ts +35 -0
- package/src/plugins/builtin/earnings-ripple/index.tsx +35 -0
- package/src/plugins/builtin/earnings-ripple/model.ts +98 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +103 -0
- package/src/plugins/builtin/equity-screener/client.ts +1 -1
- package/src/plugins/builtin/equity-screener/criterion-editor.tsx +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +74 -9
- package/src/plugins/builtin/equity-screener/pane.tsx +2 -0
- package/src/plugins/builtin/estimate-revisions/pane.tsx +3 -0
- package/src/plugins/builtin/executives/pane.tsx +7 -5
- package/src/plugins/builtin/exposure/charts.tsx +66 -0
- package/src/plugins/builtin/exposure/client.ts +53 -0
- package/src/plugins/builtin/exposure/drivers.ts +29 -0
- package/src/plugins/builtin/exposure/editor.tsx +61 -0
- package/src/plugins/builtin/exposure/evidence.ts +39 -0
- package/src/plugins/builtin/exposure/headless.ts +51 -0
- package/src/plugins/builtin/exposure/holdings.ts +56 -0
- package/src/plugins/builtin/exposure/index.tsx +13 -0
- package/src/plugins/builtin/exposure/model.ts +104 -0
- package/src/plugins/builtin/exposure/pane.tsx +247 -0
- package/src/plugins/builtin/fear-greed/charts.tsx +1 -1
- package/src/plugins/builtin/fear-greed/pane.tsx +2 -9
- package/src/plugins/builtin/filing-events/pane.tsx +2 -1
- package/src/plugins/builtin/gpu/board.tsx +163 -0
- package/src/plugins/builtin/gpu/changes.tsx +94 -0
- package/src/plugins/builtin/gpu/client.ts +130 -0
- package/src/plugins/builtin/gpu/equities.tsx +112 -0
- package/src/plugins/builtin/gpu/headless.ts +67 -0
- package/src/plugins/builtin/gpu/history.tsx +140 -0
- package/src/plugins/builtin/gpu/index.tsx +18 -0
- package/src/plugins/builtin/gpu/ladder.tsx +127 -0
- package/src/plugins/builtin/gpu/model.ts +317 -0
- package/src/plugins/builtin/gpu/pane.tsx +63 -0
- package/src/plugins/builtin/help/index.tsx +19 -2
- package/src/plugins/builtin/holders/pane.tsx +5 -9
- package/src/plugins/builtin/insider/detail.tsx +119 -0
- package/src/plugins/builtin/insider/display.ts +221 -0
- package/src/plugins/builtin/insider/headless.ts +24 -3
- package/src/plugins/builtin/insider/index.tsx +206 -108
- package/src/plugins/builtin/insider/insider-data.ts +31 -3
- package/src/plugins/builtin/insider/model.ts +53 -4
- package/src/plugins/builtin/insider/table-model.ts +226 -0
- package/src/plugins/builtin/insider/table.tsx +79 -0
- package/src/plugins/builtin/iv-history/screen-pane.tsx +1 -1
- package/src/plugins/builtin/jobs/pane.tsx +14 -7
- package/src/plugins/builtin/kelly-sizer/pane.tsx +1 -1
- package/src/plugins/builtin/macro-day/client.ts +50 -0
- package/src/plugins/builtin/macro-day/headless.ts +51 -0
- package/src/plugins/builtin/macro-day/index.tsx +21 -0
- package/src/plugins/builtin/macro-day/model.ts +137 -0
- package/src/plugins/builtin/macro-day/pane.tsx +118 -0
- package/src/plugins/builtin/macro-day/releases.ts +58 -0
- package/src/plugins/builtin/market-halts/model.ts +30 -17
- package/src/plugins/builtin/market-halts/pane.tsx +15 -21
- package/src/plugins/builtin/market-heatmap/data.ts +1 -1
- package/src/plugins/builtin/market-heatmap/index.tsx +198 -50
- package/src/plugins/builtin/market-heatmap/portfolio.ts +220 -0
- package/src/plugins/builtin/market-movers/index.tsx +1 -0
- package/src/plugins/builtin/market-movers/session-body.tsx +5 -2
- package/src/plugins/builtin/mna/distress/client.ts +326 -0
- package/src/plugins/builtin/mna/distress/detail.tsx +247 -0
- package/src/plugins/builtin/mna/distress/headless.ts +257 -0
- package/src/plugins/builtin/mna/distress/model.ts +427 -0
- package/src/plugins/builtin/mna/distress/pane.tsx +606 -0
- package/src/plugins/builtin/mna/index.tsx +15 -0
- package/src/plugins/builtin/mna/pane.tsx +42 -1
- package/src/plugins/builtin/news/index.tsx +62 -16
- package/src/plugins/builtin/news/wire/filter-articles.ts +54 -0
- package/src/plugins/builtin/news/wire/index.tsx +37 -3
- package/src/plugins/builtin/news/wire/industry-pane.tsx +29 -13
- package/src/plugins/builtin/news/wire/mutes.ts +253 -0
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +117 -0
- package/src/plugins/builtin/news/wire/news/footer.ts +4 -0
- package/src/plugins/builtin/news/wire/news/list-search.ts +34 -0
- package/src/plugins/builtin/news/wire/news/pop-out.tsx +158 -0
- package/src/plugins/builtin/news/wire/news/preset-pane.tsx +64 -19
- package/src/plugins/builtin/openfda/client.ts +300 -0
- package/src/plugins/builtin/openfda/index.tsx +71 -0
- package/src/plugins/builtin/openfda/pane.tsx +382 -0
- package/src/plugins/builtin/openfda/types.ts +76 -0
- package/src/plugins/builtin/options/footer.ts +1 -0
- package/src/plugins/builtin/options/view.tsx +1 -1
- package/src/plugins/builtin/options-calculator/pane.tsx +0 -1
- package/src/plugins/builtin/options-positioning/index.tsx +4 -2
- package/src/plugins/builtin/options-positioning/pane.tsx +1 -1
- package/src/plugins/builtin/pe-band/client.ts +61 -0
- package/src/plugins/builtin/pe-band/headless.ts +51 -0
- package/src/plugins/builtin/pe-band/index.tsx +20 -0
- package/src/plugins/builtin/pe-band/model.ts +267 -0
- package/src/plugins/builtin/pe-band/pane.tsx +159 -0
- package/src/plugins/builtin/perps/client.ts +66 -0
- package/src/plugins/builtin/perps/equity-row.tsx +28 -0
- package/src/plugins/builtin/perps/headless.ts +34 -0
- package/src/plugins/builtin/perps/index.tsx +14 -0
- package/src/plugins/builtin/perps/model.ts +58 -0
- package/src/plugins/builtin/perps/pane.tsx +185 -0
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +0 -1
- package/src/plugins/builtin/portfolio-list/cli/render.ts +177 -87
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +6 -20
- package/src/plugins/builtin/portfolio-list/command-bar.ts +6 -2
- package/src/plugins/builtin/portfolio-list/headless.ts +237 -0
- package/src/plugins/builtin/portfolio-list/index.tsx +2 -0
- package/src/plugins/builtin/portfolio-list/mutations.ts +70 -1
- package/src/plugins/builtin/portfolio-list/pane/data.ts +17 -0
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +88 -5
- package/src/plugins/builtin/portfolio-list/pane/remove-ticker.ts +85 -0
- package/src/plugins/builtin/portfolio-list/pane/streaming.ts +18 -12
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +6 -0
- package/src/plugins/builtin/power/client.ts +100 -0
- package/src/plugins/builtin/power/detail.tsx +82 -0
- package/src/plugins/builtin/power/evidence.ts +56 -0
- package/src/plugins/builtin/power/generation.tsx +37 -0
- package/src/plugins/builtin/power/headless.ts +43 -0
- package/src/plugins/builtin/power/index.tsx +16 -0
- package/src/plugins/builtin/power/model.ts +89 -0
- package/src/plugins/builtin/power/pane.tsx +209 -0
- package/src/plugins/builtin/power/query.ts +25 -0
- package/src/plugins/builtin/relative-rotation/pane.tsx +3 -3
- package/src/plugins/builtin/research/analyst-pane.tsx +1 -1
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +13 -4
- package/src/plugins/builtin/research/equity-diagnostic-pane.tsx +11 -9
- package/src/plugins/builtin/research-search/pane.tsx +21 -7
- package/src/plugins/builtin/revenue-breakdown/pane.tsx +1 -1
- package/src/plugins/builtin/reverse-dcf/client.ts +35 -0
- package/src/plugins/builtin/reverse-dcf/headless.ts +44 -0
- package/src/plugins/builtin/reverse-dcf/index.tsx +20 -0
- package/src/plugins/builtin/reverse-dcf/model.ts +87 -0
- package/src/plugins/builtin/reverse-dcf/pane.tsx +107 -0
- package/src/plugins/builtin/risk-factors/pane.tsx +6 -5
- package/src/plugins/builtin/scanner/denied.tsx +4 -2
- package/src/plugins/builtin/scanner/feed.ts +1 -0
- package/src/plugins/builtin/scanner/flow-pane.tsx +3 -2
- package/src/plugins/builtin/scanner/hilo-pane.tsx +1 -1
- package/src/plugins/builtin/seasonality/client.ts +4 -1
- package/src/plugins/builtin/sec/command-bar-search.ts +217 -0
- package/src/plugins/builtin/sec/forms.ts +54 -0
- package/src/plugins/builtin/sec/headless.ts +31 -5
- package/src/plugins/builtin/sec/index.tsx +67 -11
- package/src/plugins/builtin/sec/model.ts +35 -5
- package/src/plugins/builtin/sectors/headless.ts +1 -0
- package/src/plugins/builtin/sectors/index.tsx +72 -26
- package/src/plugins/builtin/shared/cloud-upgrade.ts +143 -39
- package/src/plugins/builtin/shared/pro-feature-wall.tsx +8 -4
- package/src/plugins/builtin/shared/research-cells.tsx +107 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +5 -1
- package/src/plugins/builtin/shared/ticker-request.ts +1 -1
- package/src/plugins/builtin/shared/wall-teaser-catalog.ts +80 -0
- package/src/plugins/builtin/shared/wall-teaser.tsx +192 -0
- package/src/plugins/builtin/shared/wall-view-lifecycle.ts +43 -0
- package/src/plugins/builtin/short-interest/index.tsx +31 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +70 -0
- package/src/plugins/builtin/short-interest/watch-headless.ts +49 -0
- package/src/plugins/builtin/short-interest/watch-model.ts +185 -0
- package/src/plugins/builtin/short-interest/watch-pane.tsx +169 -0
- package/src/plugins/builtin/short-volume/pane.tsx +1 -1
- package/src/plugins/builtin/social-mentions/pane.tsx +1 -1
- package/src/plugins/builtin/supply-chain/client.ts +104 -0
- package/src/plugins/builtin/supply-chain/disclosure-quote.tsx +17 -0
- package/src/plugins/builtin/supply-chain/evidence.ts +88 -0
- package/src/plugins/builtin/supply-chain/flow-layout.ts +133 -0
- package/src/plugins/builtin/supply-chain/flow.tsx +323 -0
- package/src/plugins/builtin/supply-chain/graph-client.ts +83 -0
- package/src/plugins/builtin/supply-chain/graph-evidence.ts +25 -0
- package/src/plugins/builtin/supply-chain/graph-model.ts +45 -0
- package/src/plugins/builtin/supply-chain/graph-pane.tsx +218 -0
- package/src/plugins/builtin/supply-chain/graph.tsx +163 -0
- package/src/plugins/builtin/supply-chain/headless.ts +105 -0
- package/src/plugins/builtin/supply-chain/index.tsx +17 -0
- package/src/plugins/builtin/supply-chain/model.ts +145 -0
- package/src/plugins/builtin/supply-chain/pane.tsx +276 -0
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +96 -0
- package/src/plugins/builtin/supply-chain/trust.ts +34 -0
- package/src/plugins/builtin/themes/client.ts +39 -0
- package/src/plugins/builtin/themes/headless.ts +38 -0
- package/src/plugins/builtin/themes/model.ts +92 -0
- package/src/plugins/builtin/themes/pane.tsx +125 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +6 -15
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +5 -6
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +201 -0
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +327 -0
- package/src/plugins/builtin/ticker-detail/financials/period-end-history.ts +5 -2
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +60 -12
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +2 -1
- package/src/plugins/builtin/ticker-detail/headless.ts +7 -2
- package/src/plugins/builtin/ticker-detail/index.tsx +22 -0
- package/src/plugins/builtin/ticker-detail/overview/components.tsx +53 -30
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +2 -0
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +112 -47
- package/src/plugins/builtin/ticker-detail/pane.tsx +50 -6
- package/src/plugins/builtin/ticker-detail/quote-monitor/card.tsx +21 -42
- package/src/plugins/builtin/ticker-detail/quote-monitor/index.tsx +3 -0
- package/src/plugins/builtin/time-sales/pane.tsx +1 -1
- package/src/plugins/builtin/world-indices/indices.ts +1 -0
- package/src/plugins/catalog-browser.ts +40 -0
- package/src/plugins/catalog-manifest.ts +3 -0
- package/src/plugins/catalog-ui.ts +6 -0
- package/src/plugins/current-target.ts +0 -9
- package/src/public/__snapshots__/public-api.test.ts.snap +1 -0
- package/src/renderers/browser/cloud-transport.ts +66 -1
- package/src/renderers/browser/main.tsx +2 -0
- package/src/renderers/dom/data-table/row.tsx +2 -0
- package/src/renderers/dom/desktop/controls.tsx +38 -25
- package/src/renderers/dom/desktop/icons.tsx +8 -0
- package/src/renderers/dom/host/chart-surface.tsx +36 -2
- package/src/renderers/dom/host/focus-scope.ts +11 -1
- package/src/renderers/dom/styles.css +28 -0
- package/src/renderers/electrobun/view/backend-rpc.ts +3 -2
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/http-fetch.ts +2 -0
- package/src/renderers/electrobun/view/main.tsx +3 -1
- package/src/renderers/electrobun/view/rpc-timeout.ts +59 -0
- package/src/renderers/opentui/start.tsx +3 -0
- package/src/shares/api.ts +3 -1
- package/src/sources/gloomberb-cloud/index.ts +47 -13
- package/src/sources/history-result.ts +1 -0
- package/src/sources/history-retention.ts +16 -0
- package/src/sources/provider-router/history.ts +4 -2
- package/src/sources/sec-edgar/identity.ts +36 -0
- package/src/sources/sec-edgar.ts +1 -34
- package/src/state/app/context/index.tsx +8 -0
- package/src/sync/core-contributors.ts +20 -2
- package/src/telemetry/attention-counts.ts +164 -0
- package/src/telemetry/live-config.ts +7 -0
- package/src/test-support/rpc-loopback.ts +7 -3
- package/src/test-support/shell-pane-keys.tsx +34 -0
- package/src/tickers/instrument-kind.ts +12 -6
- package/src/tickers/open-target.ts +1 -1
- package/src/tickers/search/asset-classes.ts +91 -0
- package/src/tickers/search/index.ts +62 -15
- package/src/tickers/search/ranking.ts +22 -3
- package/src/tickers/search/upsert.ts +4 -1
- package/src/time-series/live-bars.ts +8 -3
- package/src/time-series/resolve.ts +224 -17
- package/src/time-series/spec.ts +1 -0
- package/src/time-series/types.ts +9 -1
- package/src/types/config.ts +23 -1
- package/src/types/data-provider.ts +2 -0
- package/src/types/headless.ts +17 -0
- package/src/types/price-history.ts +2 -0
- package/src/ui/host.tsx +6 -0
- package/src/utils/double-escape-close.ts +20 -0
- package/src/utils/exchanges.ts +1 -0
- package/src/utils/html-entities.ts +15 -0
- package/src/utils/http-proxy-response.ts +44 -7
- package/src/utils/plugin-proxy-hosts.json +3 -0
- package/src/utils/price-history.ts +35 -1
- package/src/utils/sec.ts +21 -2
- package/src/utils/text-wrap.ts +13 -8
- package/src/utils/zoned-date-time.ts +67 -0
|
@@ -79,6 +79,7 @@ const TABS = key("h/l", " tabs");
|
|
|
79
79
|
const OPEN = key("Enter", " open");
|
|
80
80
|
const SEARCH = key("/", "search");
|
|
81
81
|
const OPEN_SOURCE = key("o", "pen source");
|
|
82
|
+
const POP_OUT = key("p", "op out");
|
|
82
83
|
const STEP = key("←/→", " step");
|
|
83
84
|
const CHART_KEYS = [key("s", "eries"), key("i", "ndicators"), key("t", "imeframe"), key("f", "ormulas")];
|
|
84
85
|
|
|
@@ -168,6 +169,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
168
169
|
data: QUOTES,
|
|
169
170
|
bloomberg: ["HP"],
|
|
170
171
|
},
|
|
172
|
+
RETURN: {
|
|
173
|
+
summary: "Interval and cumulative price returns in a scrollable table, for a selectable range and granularity.",
|
|
174
|
+
usage: ["RETURN AAPL"],
|
|
175
|
+
keys: [key("/", "search")],
|
|
176
|
+
data: QUOTES,
|
|
177
|
+
bloomberg: [],
|
|
178
|
+
},
|
|
171
179
|
GR: {
|
|
172
180
|
summary: "How two tickers move together: indexed prices, their ratio, rolling correlation, and a return regression with beta, alpha and R².",
|
|
173
181
|
usage: ["GR NVDA, AMD"],
|
|
@@ -283,6 +291,34 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
283
291
|
data: DAILY_CLOSES,
|
|
284
292
|
bloomberg: ["SEAS"],
|
|
285
293
|
},
|
|
294
|
+
RIPL: {
|
|
295
|
+
summary: "Which of my holdings are tied to a company that reports soon? Customers your holdings name in their filings, and suppliers whose filings name your holdings, with the disclosed revenue share, by report date.",
|
|
296
|
+
usage: ["RIPL", "RIPL CRUS QRVO"],
|
|
297
|
+
keys: [key("Enter", " supply chain"), key("e", "arnings")],
|
|
298
|
+
data: ON_RELEASE,
|
|
299
|
+
bloomberg: [],
|
|
300
|
+
},
|
|
301
|
+
RDCF: {
|
|
302
|
+
summary: "What growth is the price assuming? The yearly free cash flow growth over ten years that makes a DCF equal today's enterprise value, next to the growth the company delivered.",
|
|
303
|
+
usage: ["RDCF AAPL"],
|
|
304
|
+
keys: [],
|
|
305
|
+
data: ON_RELEASE,
|
|
306
|
+
bloomberg: [],
|
|
307
|
+
},
|
|
308
|
+
PEB: {
|
|
309
|
+
summary: "Is the stock cheap or rich against itself? Weekly price against round multiples of trailing EPS, stepping when each EPS figure became known, with today's P/E ranked in its own history.",
|
|
310
|
+
usage: ["PEB AAPL", "PEB RELIANCE.NS"],
|
|
311
|
+
keys: [],
|
|
312
|
+
data: ON_RELEASE,
|
|
313
|
+
bloomberg: [],
|
|
314
|
+
},
|
|
315
|
+
MDAY: {
|
|
316
|
+
summary: "Does this name care about CPI day? Its average move on CPI, jobs report and FOMC days against a normal day, the average signed move and share of up days, and the move on every release day.",
|
|
317
|
+
usage: ["MDAY SPY"],
|
|
318
|
+
keys: [],
|
|
319
|
+
data: DAILY_CLOSES,
|
|
320
|
+
bloomberg: [],
|
|
321
|
+
},
|
|
286
322
|
VCA: {
|
|
287
323
|
summary: "IV rank, term slope, skew and IV against realized vol for up to 60 US tickers, flagged rich or cheap against each name's own year. Alone it screens index and sector ETFs.",
|
|
288
324
|
usage: ["VCA", "VCA NVDA, AAPL, TSLA"],
|
|
@@ -354,6 +390,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
354
390
|
data: same("Twice a month, as FINRA publishes"),
|
|
355
391
|
bloomberg: ["SI"],
|
|
356
392
|
},
|
|
393
|
+
SIW: {
|
|
394
|
+
summary: "Which of your names are crowded shorts that are moving up? Short interest as a share of float, days to cover, the change since the prior settlement and the month's price move across your portfolios and watchlists, or the tickers you give.",
|
|
395
|
+
usage: ["SIW", "SIW GME, AMC, CVNA"],
|
|
396
|
+
keys: [OPEN],
|
|
397
|
+
data: same("Twice a month, as FINRA publishes; daily closes"),
|
|
398
|
+
bloomberg: [],
|
|
399
|
+
},
|
|
357
400
|
SIV: {
|
|
358
401
|
summary: "FINRA daily off-exchange short volume as a share of volume, against its one-year range. Not short interest; SI has that.",
|
|
359
402
|
usage: ["SIV TSLA"],
|
|
@@ -410,6 +453,90 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
410
453
|
data: pro("As calls, stories and filings arrive"),
|
|
411
454
|
bloomberg: ["NSE"],
|
|
412
455
|
},
|
|
456
|
+
COVN: {
|
|
457
|
+
summary: "Financial maintenance covenant thresholds, matching reported values and supported headroom. Open a covenant for its definition, calculation limits, literal filing evidence and instrument revisions.",
|
|
458
|
+
usage: ["COVN FICO"],
|
|
459
|
+
keys: [TABS, OPEN, OPEN_SOURCE, key("f", "a"), key("m", "aturities")],
|
|
460
|
+
data: { free: "As filed; three supported rows per section", pro: "As filed; all covenants, evidence and revisions" },
|
|
461
|
+
bloomberg: ["CAST"],
|
|
462
|
+
},
|
|
463
|
+
CRDOC: {
|
|
464
|
+
summary: "Issuer capital structure, contractual covenants, supported headroom and maturity walls. Open each instrument for verbatim filing evidence and immutable amendment history. Screen for low headroom and approaching springing maturities.",
|
|
465
|
+
usage: ["CRDOC FICO", "COVN AAPL"],
|
|
466
|
+
keys: [TABS, OPEN, OPEN_SOURCE, key("d", "es"), key("f", "a"), key("m", "aturities"), key("c", "ds")],
|
|
467
|
+
data: { free: "As filed; three rows per section with supporting evidence", pro: "As filed; all stored terms, revisions and risk screens" },
|
|
468
|
+
bloomberg: ["CAST", "DDIS"],
|
|
469
|
+
},
|
|
470
|
+
ATTN: {
|
|
471
|
+
summary: "See which tickers opted-in Gloom users are researching, with delayed privacy-qualified hourly counts, abnormal attention, sectors, countries and market context. Suppressed activity is unavailable, never zero.",
|
|
472
|
+
usage: ["ATTN", "ATTN 6758:JPX"],
|
|
473
|
+
keys: [OPEN, key("e", "vidence"), key("d", "es"), key("g", "raph"), key("n", "ews")],
|
|
474
|
+
data: { free: "Three published rows per section and the latest history point", pro: "All published rows and hourly history; minimum one-hour publication lag" },
|
|
475
|
+
bloomberg: [],
|
|
476
|
+
},
|
|
477
|
+
HIRE: {
|
|
478
|
+
summary: "Pro hiring momentum: weekly observed open roles, additions and removals, role families, seniority, remote and location mix, peers and primary posting evidence. Observed requisitions are not headcount. No argument opens the covered-company board.",
|
|
479
|
+
usage: ["HIRE", "HIRE NET", "HIRE 0700:HKEX"],
|
|
480
|
+
keys: [TABS, OPEN, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("g", "raph")],
|
|
481
|
+
data: { free: "Latest values and three rows per section", pro: "Weekly history, all stored observations and evidence" },
|
|
482
|
+
bloomberg: [],
|
|
483
|
+
},
|
|
484
|
+
APPS: {
|
|
485
|
+
summary: "Pro app attention: public app ranks by country, rank velocity, rating drift and country spreads, mapped through developers to listed parents. Evidence preserves capture and ownership revisions. Ranks are not downloads or revenue.",
|
|
486
|
+
usage: ["APPS", "APPS META", "APPS 0700:HKEX"],
|
|
487
|
+
keys: [TABS, OPEN, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("g", "raph")],
|
|
488
|
+
data: { free: "Latest values and three rows per section", pro: "Daily observations, full history, countries and evidence" },
|
|
489
|
+
bloomberg: [],
|
|
490
|
+
},
|
|
491
|
+
CATL: {
|
|
492
|
+
summary: "Regulatory, clinical, legal and trade-policy events linked to companies. Filter the calendar by type, agency, country and sector, follow upcoming dates or observed changes, and inspect source evidence and revision history.",
|
|
493
|
+
usage: ["CATL", "CATL PFE", "CATL NOVN:SIX"],
|
|
494
|
+
keys: [TABS, OPEN, OPEN_SOURCE, key("a", "lert"), key("d", "es")],
|
|
495
|
+
data: { free: "Three events with primary-source evidence", pro: "All stored events, revision history and local alerts" },
|
|
496
|
+
bloomberg: [],
|
|
497
|
+
},
|
|
498
|
+
LITI: {
|
|
499
|
+
summary: "Company litigation, enforcement and antitrust dockets with primary documents, resolved parties, dated status changes and revision history. Published coverage varies by jurisdiction.",
|
|
500
|
+
usage: ["LITI AAPL", "LITI MSFT"],
|
|
501
|
+
keys: [TABS, OPEN, OPEN_SOURCE, key("t", "o calendar")],
|
|
502
|
+
data: { free: "Three company events with evidence", pro: "All stored company dockets and history" },
|
|
503
|
+
bloomberg: ["LITI"],
|
|
504
|
+
},
|
|
505
|
+
KPIS: {
|
|
506
|
+
summary: "Company operating KPIs, fiscal history and revisions with source quotes.",
|
|
507
|
+
usage: ["KPIS CRM", "KPIS 005930:KRX"],
|
|
508
|
+
keys: [TABS, OPEN, key("e", "vidence"), OPEN_SOURCE],
|
|
509
|
+
data: { free: "Pro dataset; fixed latest preview with evidence", pro: "As disclosed; all stored observations and history" },
|
|
510
|
+
bloomberg: [],
|
|
511
|
+
},
|
|
512
|
+
GUIDE: {
|
|
513
|
+
summary: "Management guidance ranges, raises, cuts and later actuals, with source quotes.",
|
|
514
|
+
usage: ["GUIDE DAL", "GUIDE CRM"],
|
|
515
|
+
keys: [TABS, OPEN, key("e", "vidence"), OPEN_SOURCE],
|
|
516
|
+
data: { free: "Pro dataset; fixed latest preview with evidence", pro: "As issued; full guidance history and actual matches" },
|
|
517
|
+
bloomberg: [],
|
|
518
|
+
},
|
|
519
|
+
EXPO: {
|
|
520
|
+
summary: "Pro scenario exposure engine. Trace country, supplier, customer, commodity, rate, FX and tariff shocks through holdings, disclosed revenue and supply chains. Table, Drivers, Paths and Portfolio preserve evidence, unknowns, signed NAV weights and separate operating denominators. Drivers adds sourced KPIs, guidance and credit disclosures.",
|
|
521
|
+
usage: ["EXPO AAPL=60% NVDA=40%", "EXPO PORT:portfolio-id", "EXPO WATCH:watchlist-id"],
|
|
522
|
+
keys: [TABS, OPEN, key("s", "cenario and holdings"), key("e", "vidence"), key("a", "ll company disclosures"), key("v", "isibility"), key("o", "pen source")],
|
|
523
|
+
data: { free: "One holding and one-hop evidence preview", pro: "Full holdings and up to four-hop paths, as filed" },
|
|
524
|
+
bloomberg: ["PORT", "SPLC"],
|
|
525
|
+
},
|
|
526
|
+
SPLC: {
|
|
527
|
+
summary: "Pro global supply chain research in Table, Flow, Graph and Path with a free preview. Filter filings, company announcements, calls and reported evidence. Follow up to four disclosed hops with ranked paths and estimated exposure. Unconfirmed leads stay separate and out of the flow. Evidence carries publisher, date, corroboration, permitted original-language quotes or links, labelled English glosses and native disclosed units.",
|
|
528
|
+
usage: ["SPLC NVDA", "SUPPLY AAPL", "SPLC 005930.KS", "SPLC 8035.T"],
|
|
529
|
+
keys: [OPEN, key("e", "vidence"), key("d", "es"), key("g", "raph")],
|
|
530
|
+
data: { free: "Three relationships per role with evidence and a one-hop graph preview", pro: "Full evidence tiers, one-to-four-hop graphs and ranked paths" },
|
|
531
|
+
bloomberg: ["SPLC"],
|
|
532
|
+
},
|
|
533
|
+
AWARDS: {
|
|
534
|
+
summary: "Government contracts mapped to verified listed parents, with a dated feed, company award history, agency concentration, sector leaders and awards relative to annual revenue. Inspect original evidence, revisions, subawards and modifications. Coverage varies by jurisdiction.",
|
|
535
|
+
usage: ["AWARDS", "AWARDS LMT", "AWARDS BA.:LSE"],
|
|
536
|
+
keys: [TABS, OPEN, SEARCH, key("e", "vidence"), key("o", "pen source"), key("d", "es"), key("f", "a"), key("g", "raph"), key("s", "plc"), key("c", "alendar")],
|
|
537
|
+
data: { free: "Pro preview: three rows per section", pro: "All collected awards, history, revisions and relationships" },
|
|
538
|
+
bloomberg: [],
|
|
539
|
+
},
|
|
413
540
|
SEG: {
|
|
414
541
|
summary: "Quarterly revenue by product, segment or region from the company's 10-Q and 10-K filings.",
|
|
415
542
|
usage: ["SEG AAPL"],
|
|
@@ -452,6 +579,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
452
579
|
data: { free: "7 days delayed", pro: "As announced, spreads live" },
|
|
453
580
|
bloomberg: ["MA"],
|
|
454
581
|
},
|
|
582
|
+
DIST: {
|
|
583
|
+
summary: "Dated public records about companies in difficulty: 8-K bankruptcy, obligation and listing filings, SEC going-concern disclosures, Taiwan exchange listing designations, and French and UK insolvency notices. The Distress tab of MA.",
|
|
584
|
+
usage: ["DIST"],
|
|
585
|
+
keys: [key("←/→", " source"), OPEN, key("t", "icker"), key("o", "pen")],
|
|
586
|
+
data: same("As published: 8-K filings through the day, going-concern disclosures from monthly SEC data sets, listings and notices daily"),
|
|
587
|
+
bloomberg: [],
|
|
588
|
+
},
|
|
455
589
|
ASKG: {
|
|
456
590
|
summary: "Ask a question about what is on screen and watch the tools Gloom runs to answer it.",
|
|
457
591
|
usage: ["ASKG why is NVDA down today"],
|
|
@@ -464,35 +598,35 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
464
598
|
TOP: {
|
|
465
599
|
summary: "Curated stories ranked by importance across wires, publishers and X, with tickers and category. The pane to keep open when you only want what matters.",
|
|
466
600
|
usage: ["TOP"],
|
|
467
|
-
keys: [OPEN, key("t", "icker")],
|
|
601
|
+
keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
|
|
468
602
|
data: NEWS,
|
|
469
603
|
bloomberg: ["TOP"],
|
|
470
604
|
},
|
|
471
605
|
N: {
|
|
472
606
|
summary: "Every story as it arrives, newest first, with source, tickers, sentiment and importance; filter by sentiment or minimum score.",
|
|
473
607
|
usage: ["N"],
|
|
474
|
-
keys: [OPEN, key("t", "icker"), key("y", " share")],
|
|
608
|
+
keys: [OPEN, SEARCH, POP_OUT, key("t", "icker"), key("y", " share")],
|
|
475
609
|
data: NEWS,
|
|
476
610
|
bloomberg: ["N"],
|
|
477
611
|
},
|
|
478
612
|
CN: {
|
|
479
613
|
summary: "Stories linked to the ticker, newest first.",
|
|
480
614
|
usage: ["CN NVDA"],
|
|
481
|
-
keys: [OPEN, key("t", "icker")],
|
|
615
|
+
keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
|
|
482
616
|
data: NEWS,
|
|
483
617
|
bloomberg: ["CN"],
|
|
484
618
|
},
|
|
485
619
|
NI: {
|
|
486
620
|
summary: "Market news by topic code (MNA, CB, ENERGY, REG, CRYPTO, EARN, IPO) or sector.",
|
|
487
621
|
usage: ["NI ENERGY"],
|
|
488
|
-
keys: [OPEN, key("t", "icker")],
|
|
622
|
+
keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
|
|
489
623
|
data: NEWS,
|
|
490
624
|
bloomberg: ["NI"],
|
|
491
625
|
},
|
|
492
626
|
FIRST: {
|
|
493
627
|
summary: "Stories flagged as breaking or urgent. Turn on Notifications in its pane settings to hear about new ones while the pane is closed.",
|
|
494
628
|
usage: ["FIRST"],
|
|
495
|
-
keys: [OPEN, key("t", "icker")],
|
|
629
|
+
keys: [OPEN, SEARCH, POP_OUT, key("t", "icker")],
|
|
496
630
|
data: NEWS,
|
|
497
631
|
bloomberg: ["FIRST"],
|
|
498
632
|
},
|
|
@@ -516,16 +650,23 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
516
650
|
summary: "Major indices grouped by region with last, change and session status: which markets are open and how they closed.",
|
|
517
651
|
usage: ["WEI"],
|
|
518
652
|
keys: [OPEN],
|
|
519
|
-
data: same(
|
|
653
|
+
data: same(DELAYED),
|
|
520
654
|
bloomberg: ["WEI"],
|
|
521
655
|
},
|
|
522
656
|
BI: {
|
|
523
|
-
summary: "S&P 500 sectors and industries sorted by the day's move, with their representative ETFs.",
|
|
657
|
+
summary: "S&P 500 sectors and industries sorted by the day's move, with their representative ETFs, and curated thematic baskets on the Themes tab.",
|
|
524
658
|
usage: ["BI"],
|
|
525
659
|
keys: [TABS, OPEN],
|
|
526
660
|
data: QUOTES,
|
|
527
661
|
bloomberg: ["IMAP"],
|
|
528
662
|
},
|
|
663
|
+
THEM: {
|
|
664
|
+
summary: "Curated thematic baskets with equal-weight returns and breadth. Open a theme to see its members, leaders and laggards. The Themes tab of BI.",
|
|
665
|
+
usage: ["THEM", "THEM nuclear"],
|
|
666
|
+
keys: [TABS, OPEN, key("Esc", "back")],
|
|
667
|
+
data: same("Updated every 15 minutes"),
|
|
668
|
+
bloomberg: ["IMAP", "custom baskets"],
|
|
669
|
+
},
|
|
529
670
|
RRG: {
|
|
530
671
|
summary: "Each name's strength against SPY or another benchmark, plotted against its momentum with weekly trails through the four quadrants. Sector ETFs by default, or your tickers.",
|
|
531
672
|
usage: ["RRG", "RRG NVDA, AAPL, MSFT"],
|
|
@@ -547,6 +688,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
547
688
|
data: FX,
|
|
548
689
|
bloomberg: ["FXC"],
|
|
549
690
|
},
|
|
691
|
+
PERP: {
|
|
692
|
+
summary: "Perpetual funding, open interest and premiums across crypto and stock, index, commodity and FX contracts. Per-market History and Evidence. Pro history with a latest-value free preview.",
|
|
693
|
+
usage: ["PERP", "PERP BTC", "PERP TSLA"],
|
|
694
|
+
keys: [TABS, SEARCH, OPEN_SOURCE, key("a", "lert"), key("e", "vidence"), key("d", "es"), key("f", "a"), key("g", "raph")],
|
|
695
|
+
data: { free: "Latest market values", pro: "Observed funding, open interest and stored history; source timestamps retained" },
|
|
696
|
+
bloomberg: [],
|
|
697
|
+
},
|
|
550
698
|
CRYP: {
|
|
551
699
|
summary: "The top coins by market cap, stablecoins on their own tab, with returns from a day to a year, a 30-day sparkline, volume and market cap.",
|
|
552
700
|
usage: ["CRYP"],
|
|
@@ -558,7 +706,7 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
558
706
|
summary: "Front-month futures across equity index, rates, energy, metals, agriculture, livestock and FX with last price and session change, grouped by sector.",
|
|
559
707
|
usage: ["FUT"],
|
|
560
708
|
keys: [SEARCH, OPEN],
|
|
561
|
-
data: same(
|
|
709
|
+
data: same(DELAYED),
|
|
562
710
|
bloomberg: ["GLCO"],
|
|
563
711
|
},
|
|
564
712
|
CTM: {
|
|
@@ -582,6 +730,35 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
582
730
|
data: same("Weekly: Tuesday positions, out on Friday"),
|
|
583
731
|
bloomberg: ["COT"],
|
|
584
732
|
},
|
|
733
|
+
DOE: {
|
|
734
|
+
summary: "The EIA's weekly petroleum and natural gas storage numbers: crude, Cushing and the SPR, gasoline, distillates, jet fuel and propane, refinery runs, trade and demand, and gas storage by region. Each row shows the week's build or draw, the change on a year ago and where it sits in its five-year range; the selected one is charted over the year against the five-year band with a plain read of the numbers.",
|
|
735
|
+
usage: ["DOE", "NGS"],
|
|
736
|
+
keys: [],
|
|
737
|
+
data: same("Weekly, on release"),
|
|
738
|
+
bloomberg: ["DOE"],
|
|
739
|
+
},
|
|
740
|
+
POWER: {
|
|
741
|
+
summary: "Pro: global power interconnection queues, recorded MW history, completion and withdrawal cohorts, large-load requests and approvals, utility exposure and generation capacity. Open a project for primary evidence and revisions; mapped companies link to DES, FA, G and SPLC.",
|
|
742
|
+
usage: ["POWER", "POWER NEE"],
|
|
743
|
+
keys: [SEARCH, key("o", "pen source"), key("d", "es"), key("f", "a"), key("g", "raph"), key("s", "plc"), key("c", "ompute"), key("t", "BO")],
|
|
744
|
+
data: { free: "Three rows per section; limited history", pro: "Snapshots as public registers update; coverage by region" },
|
|
745
|
+
bloomberg: [],
|
|
746
|
+
},
|
|
747
|
+
GPU: {
|
|
748
|
+
summary: "Pro GPU rental list prices, provider-declared spot rates and marketplace asks in USD per GPU-hour. Compare clouds and hardware variants, inspect observations, anonymised third-party reference indices and dated price changes, and open related equities or TheBuildout.",
|
|
749
|
+
usage: ["GPU", "GPU H100", "GPU B200"],
|
|
750
|
+
keys: [key("t", "BO")],
|
|
751
|
+
data: same("Hourly asks and AWS spot; other published prices every 6 or 24 hours"),
|
|
752
|
+
bloomberg: [],
|
|
753
|
+
},
|
|
754
|
+
NGS: {
|
|
755
|
+
summary: "Lower 48 working gas in storage and each region's, the week's injection or withdrawal against a year ago and the five-year average, charted over the year. The Gas Storage tab of DOE.",
|
|
756
|
+
usage: ["NGS"],
|
|
757
|
+
keys: [],
|
|
758
|
+
data: same("Weekly, on release"),
|
|
759
|
+
bloomberg: [],
|
|
760
|
+
docs: "DOE",
|
|
761
|
+
},
|
|
585
762
|
VIX: {
|
|
586
763
|
summary: "Daily VIX tenor closes, the term structure and whether it is in contango or inverted, with the cross-asset volatility board beside it.",
|
|
587
764
|
usage: ["VIX"],
|
|
@@ -647,6 +824,13 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
647
824
|
data: ON_RELEASE,
|
|
648
825
|
bloomberg: ["ECST"],
|
|
649
826
|
},
|
|
827
|
+
CPI: {
|
|
828
|
+
summary: "The US consumer price index by component: food, energy, core goods, shelter and services ex shelter, each with its weight, the month's change, three- and six-month annualised rates, the change on a year ago and its contribution in points to the headline. The selected row is charted month by month against the headline with a plain read of the numbers; the header gives the next release.",
|
|
829
|
+
usage: ["CPI", "CPI shelter", "ECAN"],
|
|
830
|
+
keys: [],
|
|
831
|
+
data: same("Monthly, on release"),
|
|
832
|
+
bloomberg: ["ECAN"],
|
|
833
|
+
},
|
|
650
834
|
CBR: {
|
|
651
835
|
summary: "Policy rates for the G20 central banks with the last move, its date and a one-year percentile; open one for its history.",
|
|
652
836
|
usage: ["CBR"],
|
|
@@ -733,6 +917,34 @@ export const FUNCTION_HELP: Readonly<Record<string, FunctionHelp>> = {
|
|
|
733
917
|
data: AS_FILED,
|
|
734
918
|
bloomberg: ["CF"],
|
|
735
919
|
},
|
|
920
|
+
ETF: {
|
|
921
|
+
summary: "A US-listed fund's SEC filings: registration statements and prospectus updates, shareholder reports, N-CEN and N-PORT reports. Open any of them inline.",
|
|
922
|
+
usage: ["ETF SPY"],
|
|
923
|
+
keys: [OPEN, OPEN_SOURCE],
|
|
924
|
+
data: AS_FILED,
|
|
925
|
+
bloomberg: [],
|
|
926
|
+
},
|
|
927
|
+
TRIAL: {
|
|
928
|
+
summary: "Clinical studies by condition, drug, or sponsor, with status, phase, and enrollment. Open the study record.",
|
|
929
|
+
usage: ["TRIAL", "TRIAL semaglutide"],
|
|
930
|
+
keys: [SEARCH, OPEN],
|
|
931
|
+
data: same("As studies are posted"),
|
|
932
|
+
bloomberg: [],
|
|
933
|
+
},
|
|
934
|
+
CLTR: {
|
|
935
|
+
summary: "SEC staff comment letters and company responses, newest first. Search their text, or type a ticker for one company's letters, and open a letter to read it.",
|
|
936
|
+
usage: ["CLTR", "CLTR revenue recognition", "CLTR AAPL"],
|
|
937
|
+
keys: [SEARCH, OPEN],
|
|
938
|
+
data: AS_FILED,
|
|
939
|
+
bloomberg: [],
|
|
940
|
+
},
|
|
941
|
+
FDA: {
|
|
942
|
+
summary: "FDA drug and device adverse event reports and drug recalls, by drug, device or firm name. A report is what someone observed, not proof the product caused it.",
|
|
943
|
+
usage: ["FDA", "FDA metformin", "FDA insulin pump"],
|
|
944
|
+
keys: [SEARCH, OPEN],
|
|
945
|
+
data: same("As FDA updates each dataset; drug reports quarterly"),
|
|
946
|
+
bloomberg: [],
|
|
947
|
+
},
|
|
736
948
|
HDS: {
|
|
737
949
|
summary: "Institutional holders as a table (value, shares, change, percent held) or as an ownership treemap.",
|
|
738
950
|
usage: ["HDS NVDA"],
|
|
@@ -170,6 +170,10 @@ export async function loadResolvedHeadlessPaneModel(
|
|
|
170
170
|
const tickers = (await context.store.loadAllTickers()).filter(row => row.metadata.portfolios.includes(id));
|
|
171
171
|
return { portfolio, tickers };
|
|
172
172
|
},
|
|
173
|
+
async resolveWatchlist(id) {
|
|
174
|
+
if (!context.config.watchlists.some(row => row.id === id)) return null;
|
|
175
|
+
return (await context.store.loadAllTickers()).filter(row => row.metadata.watchlists.includes(id));
|
|
176
|
+
},
|
|
173
177
|
async resolveInstrument(key) {
|
|
174
178
|
const parsed = parsePublicTickerKey(key);
|
|
175
179
|
const ticker = await context.store.loadTicker(key)
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import { creditScreenshotEvidence } from "../../plugins/builtin/credit-documents/evidence";
|
|
2
|
+
import { attentionScreenshotEvidence } from "../../plugins/builtin/attention/evidence";
|
|
3
|
+
import { attentionScreenshotEvidence as companyAttentionScreenshotEvidence } from "../../plugins/builtin/company-attention/evidence";
|
|
4
|
+
import { catalystsScreenshotEvidence, litigationScreenshotEvidence } from "../../plugins/builtin/catalysts/evidence";
|
|
5
|
+
import { companyKpisScreenshotEvidence, companyGuidanceScreenshotEvidence } from "../../plugins/builtin/company-kpis/screenshot-evidence";
|
|
6
|
+
import { powerScreenshotEvidence } from "../../plugins/builtin/power/evidence";
|
|
7
|
+
import { exposureScreenshotEvidence } from "../../plugins/builtin/exposure/evidence";
|
|
8
|
+
import { supplyScreenshotEvidence } from "../../plugins/builtin/supply-chain/evidence";
|
|
9
|
+
import { awardsScreenshotEvidence } from "../../plugins/builtin/awards/evidence";
|
|
1
10
|
import type { RemoteUiNodeSnapshot } from "../../remote/types";
|
|
2
11
|
import type { TickerFinancials } from "../../types/financials";
|
|
3
12
|
import type { DesktopPaneShotPayload, DesktopPaneShotRenderResult } from "../desktop-pane-shot";
|
|
@@ -67,6 +76,18 @@ export interface PaneScreenshotEvidenceHook<E extends PaneScreenshotEvidence = P
|
|
|
67
76
|
|
|
68
77
|
/** Built-in panes that certify their captures with their own evidence. */
|
|
69
78
|
const PANE_SCREENSHOT_EVIDENCE: readonly PaneScreenshotEvidenceHook[] = [
|
|
79
|
+
exposureScreenshotEvidence,
|
|
80
|
+
supplyScreenshotEvidence,
|
|
81
|
+
creditScreenshotEvidence,
|
|
82
|
+
attentionScreenshotEvidence,
|
|
83
|
+
companyAttentionScreenshotEvidence("hiring"),
|
|
84
|
+
companyAttentionScreenshotEvidence("apps"),
|
|
85
|
+
catalystsScreenshotEvidence,
|
|
86
|
+
litigationScreenshotEvidence,
|
|
87
|
+
companyKpisScreenshotEvidence,
|
|
88
|
+
companyGuidanceScreenshotEvidence,
|
|
89
|
+
awardsScreenshotEvidence,
|
|
90
|
+
powerScreenshotEvidence,
|
|
70
91
|
calculatorScreenshotEvidence,
|
|
71
92
|
scenarioScreenshotEvidence,
|
|
72
93
|
realizedVolScreenshotEvidence,
|
|
@@ -84,8 +84,19 @@ import {
|
|
|
84
84
|
createFallbackTicker,
|
|
85
85
|
fetchTickerFinancials,
|
|
86
86
|
isFinancialAnalysisFunction,
|
|
87
|
+
readsDailyReturns,
|
|
88
|
+
withShotDailyReturns,
|
|
89
|
+
withShotPeriodEndHistory,
|
|
87
90
|
withShotPriceHistory,
|
|
91
|
+
withShotSeasonalityHistory,
|
|
88
92
|
} from "./data";
|
|
93
|
+
import {
|
|
94
|
+
financialRatioRenderMismatches,
|
|
95
|
+
financialRatioShotEvidence,
|
|
96
|
+
financialRatioShotGap,
|
|
97
|
+
shotRatioTab,
|
|
98
|
+
type PaneScreenshotFinancialRatioEvidence,
|
|
99
|
+
} from "./financial-ratio-shot";
|
|
89
100
|
|
|
90
101
|
const DESKTOP_CELL_WIDTH_PX = 8;
|
|
91
102
|
const DESKTOP_CELL_HEIGHT_PX = 18;
|
|
@@ -270,7 +281,7 @@ async function collectShotValuationSeries(
|
|
|
270
281
|
}
|
|
271
282
|
|
|
272
283
|
export interface PaneScreenshotExpectedSelection {
|
|
273
|
-
control: "metric" | "statement" | "period";
|
|
284
|
+
control: "metric" | "statement" | "ratio" | "period";
|
|
274
285
|
value?: string;
|
|
275
286
|
label?: string;
|
|
276
287
|
}
|
|
@@ -368,6 +379,7 @@ export type PaneScreenshotDataEvidence =
|
|
|
368
379
|
| PaneScreenshotPriceComparisonEvidence
|
|
369
380
|
| PaneScreenshotFundamentalSeriesEvidence
|
|
370
381
|
| PaneScreenshotFinancialStatementEvidence
|
|
382
|
+
| PaneScreenshotFinancialRatioEvidence
|
|
371
383
|
| PaneScreenshotEvidence;
|
|
372
384
|
|
|
373
385
|
export interface PaneScreenshotReadinessSignals {
|
|
@@ -550,7 +562,8 @@ export async function buildDesktopShotPayload(
|
|
|
550
562
|
?? data.quote?.listingExchangeName
|
|
551
563
|
?? data.quote?.exchangeName
|
|
552
564
|
?? "";
|
|
553
|
-
|
|
565
|
+
const fiveYearsDaily = resolved.pane.id === "realized-vol" || resolved.pane.id === "iv-history" || resolved.pane.id === "macro-day";
|
|
566
|
+
if (fiveYearsDaily || resolved.pane.id === "iv-screen" || resolved.pane.id === "short-watch"
|
|
554
567
|
|| resolved.pane.id === "backtest" || resolved.pane.id === OPTIONS_PANE_ID) {
|
|
555
568
|
// Generic 5Y snapshots can contain weekly bars. The snapshot provider
|
|
556
569
|
// treats captured history as authoritative, even for a later 1d request.
|
|
@@ -560,10 +573,16 @@ export async function buildDesktopShotPayload(
|
|
|
560
573
|
}
|
|
561
574
|
const priceHistory = await context.dataProvider.getPriceHistoryForResolution(
|
|
562
575
|
entry.instrument.symbol, exchange,
|
|
563
|
-
|
|
576
|
+
fiveYearsDaily ? "5Y" : resolved.pane.id === "backtest" ? "ALL" : "1Y",
|
|
564
577
|
"1d", toMarketDataContext(entry.instrument),
|
|
565
578
|
);
|
|
566
579
|
data = { ...data, priceHistory };
|
|
580
|
+
} else if (shotRatioTab(resolved)?.key === "valuation") {
|
|
581
|
+
data = await withShotPeriodEndHistory(context, entry.instrument, exchange, resolved, data);
|
|
582
|
+
} else if (resolved.pane.id === "seasonality") {
|
|
583
|
+
data = await withShotSeasonalityHistory(context, entry.instrument, data);
|
|
584
|
+
} else if (requestedRange && readsDailyReturns(resolved)) {
|
|
585
|
+
data = await withShotDailyReturns(context, entry.instrument, exchange, requestedRange, data);
|
|
567
586
|
} else if (requestedRange) {
|
|
568
587
|
try {
|
|
569
588
|
const priceHistory = await context.dataProvider.getPriceHistory(entry.instrument.symbol, exchange, requestedRange);
|
|
@@ -717,6 +736,17 @@ export async function renderDesktopShot({
|
|
|
717
736
|
}
|
|
718
737
|
const renderedInstance = payload.config.layout.instances.find(({ instanceId }) => instanceId === payload.paneId);
|
|
719
738
|
if (renderedInstance) resolved = { ...resolved, instance: renderedInstance };
|
|
739
|
+
return assessPaneScreenshot(resolved, payload, render, rawArg, outputPath);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/** What a rendered capture shows, and whether it is fit to use. */
|
|
743
|
+
export function assessPaneScreenshot(
|
|
744
|
+
resolved: ResolvedPaneFunction,
|
|
745
|
+
payload: DesktopPaneShotPayload,
|
|
746
|
+
render: DesktopPaneShotRenderResult,
|
|
747
|
+
rawArg: string,
|
|
748
|
+
outputPath: string,
|
|
749
|
+
): PaneScreenshotResult {
|
|
720
750
|
const evidenceHook = paneScreenshotEvidenceHook(resolved);
|
|
721
751
|
// The sizer carries portfolio members to value holdings and the earnings board
|
|
722
752
|
// to mark them, but each shows only what its argument asks for.
|
|
@@ -747,6 +777,7 @@ export async function renderDesktopShot({
|
|
|
747
777
|
...(expectedChart ? chartEvidenceMismatchesFor(render.semanticUi, expectedChart) : []),
|
|
748
778
|
...intradayChartEvidenceMismatchesFor(resolved, payload, render.semanticUi),
|
|
749
779
|
...paneEvidenceMismatches(resolved, payload, render),
|
|
780
|
+
...financialRatioRenderMismatches(resolved, payload, render),
|
|
750
781
|
];
|
|
751
782
|
const semanticMismatch = missingExpectedText.length > 0
|
|
752
783
|
|| missingExpectedSelections.length > 0
|
|
@@ -843,6 +874,8 @@ export function shotUnusableReasonFor(
|
|
|
843
874
|
if (render.errorStateDetected) return "The pane rendered an error state.";
|
|
844
875
|
if (render.emptyStateDetected) return "The pane rendered an empty state.";
|
|
845
876
|
if (unavailableSymbols.length > 0) return `Data is unavailable for ${unavailableSymbols.join(", ")}.`;
|
|
877
|
+
const ratioGap = financialRatioShotGap(resolved, payload);
|
|
878
|
+
if (ratioGap) return ratioGap;
|
|
846
879
|
if (semanticMismatch) return "The rendered content did not match the requested capability.";
|
|
847
880
|
return "The pane did not produce verifiable screenshot evidence.";
|
|
848
881
|
}
|
|
@@ -975,6 +1008,7 @@ export function shotDataEvidenceFor(
|
|
|
975
1008
|
return { kind: "fundamental-series", metric, period, series };
|
|
976
1009
|
}
|
|
977
1010
|
|
|
1011
|
+
if (shotRatioTab(resolved)) return financialRatioShotEvidence(resolved, payload);
|
|
978
1012
|
if (resolved.capability.id === "financial-statements") {
|
|
979
1013
|
const [symbol, financials] = payload.financials[0] ?? [];
|
|
980
1014
|
if (!symbol || !financials) return null;
|
|
@@ -1552,7 +1586,9 @@ export function shotExpectedText(
|
|
|
1552
1586
|
balance: "Balance",
|
|
1553
1587
|
cashflow: "Cash Flow",
|
|
1554
1588
|
};
|
|
1555
|
-
|
|
1589
|
+
// A ratio tab names itself in the query bar and leads with its first ratio.
|
|
1590
|
+
const ratioTab = shotRatioTab(resolved);
|
|
1591
|
+
expected.push(ratioTab?.name ?? statementLabels[String(resolved.options.statement)] ?? "");
|
|
1556
1592
|
expected.push(resolved.options.period === "annual" ? "Annual" : "Quarterly");
|
|
1557
1593
|
const financials = payload.financials[0]?.[1];
|
|
1558
1594
|
if (financials) {
|
|
@@ -1576,7 +1612,8 @@ export function shotExpectedText(
|
|
|
1576
1612
|
latestStatement.aggregation?.periodEnd,
|
|
1577
1613
|
).trim());
|
|
1578
1614
|
}
|
|
1579
|
-
|
|
1615
|
+
const firstLabel = ratioTab ? ratioTab.ratios[0]?.label : firstMetric?.unitLabel;
|
|
1616
|
+
if (firstLabel) expected.push(firstLabel);
|
|
1580
1617
|
}
|
|
1581
1618
|
}
|
|
1582
1619
|
return expected.filter(Boolean);
|
|
@@ -1593,6 +1630,13 @@ function shotExpectedSelections(
|
|
|
1593
1630
|
}];
|
|
1594
1631
|
}
|
|
1595
1632
|
if (resolved.capability.id !== "financial-statements") return [];
|
|
1633
|
+
const ratioTab = shotRatioTab(resolved);
|
|
1634
|
+
if (ratioTab) {
|
|
1635
|
+
return [
|
|
1636
|
+
{ control: "ratio", value: ratioTab.key, label: ratioTab.name },
|
|
1637
|
+
{ control: "period", value: String(resolved.options.period) },
|
|
1638
|
+
];
|
|
1639
|
+
}
|
|
1596
1640
|
const labels: Record<string, string> = {
|
|
1597
1641
|
income: "Income",
|
|
1598
1642
|
cashflow: "Cash Flow",
|
|
@@ -1159,6 +1159,17 @@ function CompositePanelSurface({
|
|
|
1159
1159
|
color: marker.color,
|
|
1160
1160
|
};
|
|
1161
1161
|
}, [formatAxisValue, panel]);
|
|
1162
|
+
const priorCloseMarker = useMemo(() => {
|
|
1163
|
+
const marker = panel.priorClose;
|
|
1164
|
+
const domain = marker ? panel.axes[marker.axis] : undefined;
|
|
1165
|
+
if (!marker || !domain) return null;
|
|
1166
|
+
return {
|
|
1167
|
+
side: marker.axis,
|
|
1168
|
+
yRatio: marker.yRatio,
|
|
1169
|
+
label: formatAxisValue ? formatAxisValue(marker.value, domain) : formatCompositeCursorValue(marker.value, domain),
|
|
1170
|
+
color: colors.textDim,
|
|
1171
|
+
};
|
|
1172
|
+
}, [colors.textDim, formatAxisValue, panel]);
|
|
1162
1173
|
const levelMarkers = useMemo(() => levelDomain ? [...projectedLevels]
|
|
1163
1174
|
// The picked level's label first, then alerts', when they compete for room.
|
|
1164
1175
|
.sort((left, right) => Number(right.level.id === selectedLevelId) - Number(left.level.id === selectedLevelId)
|
|
@@ -1181,7 +1192,8 @@ function CompositePanelSurface({
|
|
|
1181
1192
|
!!marker && (marker.side === null || marker.side === side)
|
|
1182
1193
|
);
|
|
1183
1194
|
const fixed = [lastPriceMarker, axisMarkers].filter(onSide).map(toAxisMarker);
|
|
1184
|
-
|
|
1195
|
+
// The prior close's label yields to every level's.
|
|
1196
|
+
const levelLabels = [...levelMarkers, priorCloseMarker].filter(onSide).map(toAxisMarker);
|
|
1185
1197
|
// A label is a row tall, so close levels would stack into an unreadable
|
|
1186
1198
|
// pile and hide the last price: each keeps its line, and only the labels
|
|
1187
1199
|
// with a row to themselves show. Desktop badges sit between rows.
|
|
@@ -2885,7 +2897,7 @@ export function CompositeChart({
|
|
|
2885
2897
|
const timeAxisCursorLabel = xAxis?.formatCursor && scene.cursorXRatio !== null
|
|
2886
2898
|
? xAxis.formatCursor(scene.cursorXRatio)
|
|
2887
2899
|
: scene.cursorDate
|
|
2888
|
-
? formatCompositeTimeAxisDate(scene.cursorDate, scene.startTime, scene.endTime)
|
|
2900
|
+
? formatCompositeTimeAxisDate(scene.cursorDate, scene.startTime, scene.endTime, scene.timeZone)
|
|
2889
2901
|
: null;
|
|
2890
2902
|
// The crosshair labels the moving end, so the axis only adds the anchor.
|
|
2891
2903
|
const timeAxisMarkers = toolSpan
|
|
@@ -2895,6 +2907,7 @@ export function CompositeChart({
|
|
|
2895
2907
|
new Date(toolSpan.startTime),
|
|
2896
2908
|
scene.startTime,
|
|
2897
2909
|
scene.endTime,
|
|
2910
|
+
scene.timeZone,
|
|
2898
2911
|
),
|
|
2899
2912
|
color: toolSpan.color,
|
|
2900
2913
|
}]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { formatMarketPrice, formatMarketPriceWithCurrency, stablePriceFractionDigits, type MarketFormatOptions } from "../../../market-data/market/format";
|
|
2
2
|
import type { ResolvedSeries, TimeSeriesPoint } from "../../../time-series/types";
|
|
3
3
|
import type { CompositeAxisDomain, CompositePanelScene } from "./types";
|
|
4
|
+
import { timeZoneLabel, zonedWallClockMs } from "../../../utils/zoned-date-time";
|
|
4
5
|
|
|
5
6
|
const CURRENCY_SYMBOLS: Record<string, string> = {
|
|
6
7
|
USD: "$",
|
|
@@ -411,17 +412,28 @@ function utcTime(date: Date): string {
|
|
|
411
412
|
return date.toISOString().slice(11, 16);
|
|
412
413
|
}
|
|
413
414
|
|
|
415
|
+
/** The date's wall-clock reading in `timeZone` (UTC when absent), and the zone's short name. */
|
|
416
|
+
function onClock(date: Date, timeZone: string | undefined): { wall: Date; zone: string } {
|
|
417
|
+
if (!timeZone || timeZone === "UTC") return { wall: date, zone: "UTC" };
|
|
418
|
+
try {
|
|
419
|
+
return { wall: new Date(zonedWallClockMs(date.getTime(), timeZone)), zone: timeZoneLabel(timeZone) };
|
|
420
|
+
} catch {
|
|
421
|
+
return { wall: date, zone: "UTC" };
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
414
425
|
function isIntradaySpan(startTime: number, endTime: number): boolean {
|
|
415
426
|
return Number.isFinite(startTime)
|
|
416
427
|
&& Number.isFinite(endTime)
|
|
417
428
|
&& Math.abs(endTime - startTime) <= INTRADAY_SPAN_MAX_MS;
|
|
418
429
|
}
|
|
419
430
|
|
|
420
|
-
/** Shared-cursor timestamp
|
|
421
|
-
export function formatCompositeCursorDate(date: Date, startTime: number, endTime: number): string {
|
|
431
|
+
/** Shared-cursor timestamp on the chart's clock: the venue's for intraday bars, else UTC. */
|
|
432
|
+
export function formatCompositeCursorDate(date: Date, startTime: number, endTime: number, timeZone?: string): string {
|
|
433
|
+
const { wall, zone } = onClock(date, timeZone);
|
|
422
434
|
return isIntradaySpan(startTime, endTime)
|
|
423
|
-
? `${utcDate(
|
|
424
|
-
: utcDate(
|
|
435
|
+
? `${utcDate(wall)} ${utcTime(wall)} ${zone}`
|
|
436
|
+
: utcDate(wall);
|
|
425
437
|
}
|
|
426
438
|
|
|
427
439
|
function validUtcTimestamp(date: Date | undefined): string | null {
|
|
@@ -462,12 +474,13 @@ export function formatCompositePointDetails(point: TimeSeriesPoint | null | unde
|
|
|
462
474
|
return details.join(" · ");
|
|
463
475
|
}
|
|
464
476
|
|
|
465
|
-
/** Compact
|
|
466
|
-
export function formatCompositeTimeAxisDate(date: Date, startTime: number, endTime: number): string {
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
const
|
|
477
|
+
/** Compact tick label on the chart's clock, selected from the full visible chart span. */
|
|
478
|
+
export function formatCompositeTimeAxisDate(date: Date, startTime: number, endTime: number, timeZone?: string): string {
|
|
479
|
+
const { wall, zone } = onClock(date, timeZone);
|
|
480
|
+
if (!isIntradaySpan(startTime, endTime)) return utcDate(wall);
|
|
481
|
+
const startDate = utcDate(onClock(new Date(startTime), timeZone).wall);
|
|
482
|
+
const endDate = utcDate(onClock(new Date(endTime), timeZone).wall);
|
|
470
483
|
return startDate === endDate
|
|
471
|
-
? `${utcTime(
|
|
472
|
-
: `${utcDate(
|
|
484
|
+
? `${utcTime(wall)} ${zone}`
|
|
485
|
+
: `${utcDate(wall).slice(5)} ${utcTime(wall)} ${zone}`;
|
|
473
486
|
}
|