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
|
@@ -56,6 +56,8 @@ import {
|
|
|
56
56
|
riskCoverageShortfall,
|
|
57
57
|
riskCoverageText,
|
|
58
58
|
riskPercentile,
|
|
59
|
+
riskAmountBase,
|
|
60
|
+
riskEvidence,
|
|
59
61
|
riskValue,
|
|
60
62
|
RISK_VIEWS,
|
|
61
63
|
type PortfolioRiskModel,
|
|
@@ -79,7 +81,7 @@ const titles = {
|
|
|
79
81
|
};
|
|
80
82
|
const tabs = RISK_VIEWS.map((value) => ({ value, label: titles[value] }));
|
|
81
83
|
const getKey = (row: RiskDisplayRow) => row.id;
|
|
82
|
-
/** The two return rows chart the basket against
|
|
84
|
+
/** The two return rows chart the basket against its benchmark over the window they measure. */
|
|
83
85
|
const RETURN_ROW_IDS: ReadonlySet<string> = new Set(["return", "benchmark"]);
|
|
84
86
|
const formatPercentValue = (value: number) => `${value.toFixed(2)}%`;
|
|
85
87
|
const formatPlainAxis = spanAxisFormatter((value, digits) => value.toFixed(digits));
|
|
@@ -119,12 +121,15 @@ function holdingsSummaryItems(rows: RiskDisplayRow[]): StatItem[] {
|
|
|
119
121
|
}));
|
|
120
122
|
}
|
|
121
123
|
/**
|
|
122
|
-
* Cumulative return of the current-weight basket and of
|
|
123
|
-
* window of paired sessions
|
|
124
|
-
*
|
|
124
|
+
* Cumulative return of the current-weight basket and of its benchmark across
|
|
125
|
+
* the window of paired sessions the return rows measure (the last 60, or those
|
|
126
|
+
* since a 13F filing): the path behind the two rows, whose values the legend
|
|
127
|
+
* ends on. The series take the rows' names.
|
|
125
128
|
*/
|
|
126
129
|
function basketReturnSeries(model: PortfolioRiskModel): ChartTableChart["series"] {
|
|
127
|
-
|
|
130
|
+
// A snapshot saved before the window existed covers the trailing 60.
|
|
131
|
+
const sessions = model.window?.sessions ?? 60;
|
|
132
|
+
const sample = sessions > 0 ? model.sample.slice(-sessions) : [];
|
|
128
133
|
if (!sample.length) return [];
|
|
129
134
|
const label = (id: string, fallback: string) => model.rows.risk.find((row) => row.id === id)?.label ?? fallback;
|
|
130
135
|
let wealth = 1,
|
|
@@ -137,7 +142,7 @@ function basketReturnSeries(model: PortfolioRiskModel): ChartTableChart["series"
|
|
|
137
142
|
),
|
|
138
143
|
staticSeries(
|
|
139
144
|
[start, ...sample.map((row) => scalarPoint(new Date(row.dateKey), ((benchmark *= 1 + row.benchmark) - 1) * 100))],
|
|
140
|
-
{ id: "benchmark", label: label("benchmark", "SPY return
|
|
145
|
+
{ id: "benchmark", label: label("benchmark", `${model.benchmark ?? "SPY"} return`), color: colors.textMuted },
|
|
141
146
|
),
|
|
142
147
|
];
|
|
143
148
|
}
|
|
@@ -178,7 +183,7 @@ function RiskDetail({
|
|
|
178
183
|
detail: row.asOf?.slice(0, 10) ?? "Source date unavailable",
|
|
179
184
|
},
|
|
180
185
|
...(row.percentile != null ? [{ id: "percentile", label: "Pctl 1Y", value: riskPercentile(row) }] : []),
|
|
181
|
-
{ id: "evidence", label: "Evidence", value: row
|
|
186
|
+
{ id: "evidence", label: "Evidence", value: riskEvidence(row), wide: true },
|
|
182
187
|
];
|
|
183
188
|
const statRows = statGridRows(items, width);
|
|
184
189
|
const points = (row.history ?? []).map((point, index) => ({
|
|
@@ -263,7 +268,9 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
|
|
|
263
268
|
);
|
|
264
269
|
const [equity] = usePaneSettingValue("equityShift", -10),
|
|
265
270
|
[rates] = usePaneSettingValue("rateShift", 100),
|
|
266
|
-
[volatility] = usePaneSettingValue("volShift", 10)
|
|
271
|
+
[volatility] = usePaneSettingValue("volShift", 10),
|
|
272
|
+
[since] = usePaneSettingValue("riskSince", "trailing");
|
|
273
|
+
const riskWindow = useMemo(() => (since === "filed" ? { since: "filed" as const } : {}), [since]);
|
|
267
274
|
const [actionStatus, setActionStatus] = useState<string | null>(null);
|
|
268
275
|
const [selected, setSelected] = usePluginPaneState<string | null>(
|
|
269
276
|
"risk:selected",
|
|
@@ -323,12 +330,13 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
|
|
|
323
330
|
rates: Number(rates),
|
|
324
331
|
volatility: Number(volatility),
|
|
325
332
|
},
|
|
333
|
+
riskWindow,
|
|
326
334
|
),
|
|
327
335
|
error: null,
|
|
328
336
|
};
|
|
329
337
|
} catch (error) {
|
|
330
338
|
return {
|
|
331
|
-
model: buildPortfolioRisk(portfolio, localTickers, market),
|
|
339
|
+
model: buildPortfolioRisk(portfolio, localTickers, market, null, undefined, riskWindow),
|
|
332
340
|
error: error instanceof Error ? error.message : "Evidence invalid",
|
|
333
341
|
};
|
|
334
342
|
}
|
|
@@ -342,6 +350,7 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
|
|
|
342
350
|
equity,
|
|
343
351
|
rates,
|
|
344
352
|
volatility,
|
|
353
|
+
riskWindow,
|
|
345
354
|
]);
|
|
346
355
|
const model = derived.model;
|
|
347
356
|
const marketLoading = resource.loading && !resource.data;
|
|
@@ -458,7 +467,8 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
|
|
|
458
467
|
: [
|
|
459
468
|
...(basketBody ? [] : [
|
|
460
469
|
...(asOfDate && sharedEvidence ? [sharedEvidence] : []),
|
|
461
|
-
|
|
470
|
+
// The value the tail losses in money are taken on names the currency too.
|
|
471
|
+
rows.map(riskAmountBase).find(Boolean) ?? model.portfolio.currency,
|
|
462
472
|
...(asOfDate ? [asOfDate] : []),
|
|
463
473
|
...(EVIDENCE_VIEWS.has(view) && model.evidence ? [model.evidence.source] : []),
|
|
464
474
|
]),
|
|
@@ -576,7 +586,8 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
|
|
|
576
586
|
{
|
|
577
587
|
id: "value",
|
|
578
588
|
label: valueHeader,
|
|
579
|
-
|
|
589
|
+
// A tail loss reads in money beside its percent: 2.60% ($5,735).
|
|
590
|
+
width: sharedUnit || attributionParts ? Math.max(9, valueHeader.length) : rows.some((row) => row.amount != null) ? 18 : 16,
|
|
580
591
|
align: "right",
|
|
581
592
|
},
|
|
582
593
|
...(attributionParts
|
|
@@ -601,7 +612,7 @@ export function PortfolioRiskPane({ focused, width, height }: PaneProps) {
|
|
|
601
612
|
]
|
|
602
613
|
: []),
|
|
603
614
|
],
|
|
604
|
-
[width, view, valueHeader, sharedUnit, attributionParts, sharedEvidence, showPercentile, sharedDate],
|
|
615
|
+
[width, view, valueHeader, sharedUnit, attributionParts, sharedEvidence, showPercentile, sharedDate, rows],
|
|
605
616
|
);
|
|
606
617
|
const selectView = (value: string) => {
|
|
607
618
|
setView(value);
|
|
@@ -4,6 +4,7 @@ import { attentionWindow } from "./model";
|
|
|
4
4
|
import { attentionHeadless } from "./headless";
|
|
5
5
|
import { TrendingPane } from "./trending";
|
|
6
6
|
import { AttentionPane } from "./pane";
|
|
7
|
+
import { ATTENTION_SERIES } from "./series";
|
|
7
8
|
export const attentionModule: PluginModule = {
|
|
8
9
|
panes: [{ id: "attention", name: "Research Attention", icon: "A", component: AttentionPane, defaultPosition: "right", defaultMode: "floating",
|
|
9
10
|
defaultFloatingSize: { width: 126, height: 32 }, tableExport: true, headless: attentionHeadless },
|
|
@@ -13,6 +14,7 @@ export const attentionModule: PluginModule = {
|
|
|
13
14
|
keywords: ["attention", "trending", "research", "activity"], shortcut: { prefix: "ATTN", argKind: "text", argPlaceholder: "TICKER", argOptional: true },
|
|
14
15
|
headless: attentionHeadless, createInstance: (_ctx, options) => ({ placement: "floating", settings: { window: attentionWindow(options?.values?.window), symbol: (options?.arg ?? options?.symbol)?.trim().toUpperCase() ?? "" } }) },
|
|
15
16
|
{ id: "attention-trending-pane", paneId: "attention-trending", label: "Gloom Trending", description: "Compact daily research attention for a home workspace.", keywords: ["trending", "home"], createInstance: () => ({ placement: "floating" }) }],
|
|
17
|
+
series: ATTENTION_SERIES,
|
|
16
18
|
setup(ctx) { attentionCache.attach(ctx.persistence); },
|
|
17
19
|
dispose() { attentionCache.reset(); },
|
|
18
20
|
};
|
|
@@ -12,6 +12,7 @@ import type { PaneProps } from "../../../types/plugin";
|
|
|
12
12
|
import { Box, ScrollBox, Text, TextAttributes, useRendererHost, useUiCapabilities } from "../../../ui";
|
|
13
13
|
import { SignInWall } from "../cloud/auth-actions";
|
|
14
14
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
15
|
+
import { useOpenDescription } from "../shared/open-description";
|
|
15
16
|
import { Blurred, LockedOverlay } from "../shared/locked-rows";
|
|
16
17
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
17
18
|
import { useAttentionEvidence } from "./evidence";
|
|
@@ -87,6 +88,7 @@ export function AttentionPane({ width, height, focused }: PaneProps) {
|
|
|
87
88
|
const desktop = !!useUiCapabilities().nativePaneChrome;
|
|
88
89
|
const host = useRendererHost();
|
|
89
90
|
const { createPaneFromTemplate } = usePluginAppActions();
|
|
91
|
+
const openDescription = useOpenDescription();
|
|
90
92
|
const session = useResearchCloudSession();
|
|
91
93
|
const access = usePlanAccess();
|
|
92
94
|
const accessKey = `${session.requestKey}:${access.hasProAccess ? "pro" : "preview"}`;
|
|
@@ -126,7 +128,7 @@ export function AttentionPane({ width, height, focused }: PaneProps) {
|
|
|
126
128
|
usePaneRefreshKey(() => { void resource.reload(); if (detailMode) void detail.reload(); }, { focused });
|
|
127
129
|
const hints: PaneHint[] = [
|
|
128
130
|
...(selected && !groupMode ? [
|
|
129
|
-
{ id: "description", key: "d", label: "es", onPress: () =>
|
|
131
|
+
{ id: "description", key: "d", label: "es", onPress: () => openDescription(selected.symbol) },
|
|
130
132
|
{ id: "financials", key: "f", label: "a", onPress: () => createPaneFromTemplate("financial-analysis-pane", { symbol: selected.symbol }) },
|
|
131
133
|
{ id: "chart", key: "g", label: "raph", onPress: () => createPaneFromTemplate("chart-composer-pane", { arg: selected.symbol }) },
|
|
132
134
|
{ id: "news", key: "n", label: "ews", onPress: () => createPaneFromTemplate("ticker-news-pane", { symbol: selected.symbol }) },
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
2
|
+
import { fetchAttention } from "./client";
|
|
3
|
+
import { emptyAttention, historyPoints } from "./model";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The hourly research attention ATTN charts for one ticker. A Pro reading
|
|
7
|
+
* served per account: the free preview carries no history, so it fails with
|
|
8
|
+
* the pane's own words instead of drawing an empty chart.
|
|
9
|
+
*/
|
|
10
|
+
export const ATTENTION_SERIES: readonly SeriesDefinition[] = [{
|
|
11
|
+
id: "attention:research-hours",
|
|
12
|
+
name: "Research attention",
|
|
13
|
+
unit: "hours",
|
|
14
|
+
frequency: "intraday",
|
|
15
|
+
group: "Alternative data",
|
|
16
|
+
tags: ["attention", "research", "trending", "researcher-hours"],
|
|
17
|
+
description: "Rounded researcher-hours opt-in users spent on the ticker in each published hour, as ATTN charts them; an hour below the privacy threshold is a gap. Needs Pro.",
|
|
18
|
+
input: "ticker",
|
|
19
|
+
load: async ({ ticker }) => {
|
|
20
|
+
const data = await fetchAttention("now", ticker!);
|
|
21
|
+
if (data.entitlement === "preview") throw new Error("Pro unlocks published history.");
|
|
22
|
+
if (data.status === "disabled") throw new Error(emptyAttention(data));
|
|
23
|
+
if (!data.history?.length) throw new Error("No privacy-qualified hours for this ticker.");
|
|
24
|
+
return historyPoints(data.history).map((point) => ({ date: point.date, value: point.value }));
|
|
25
|
+
},
|
|
26
|
+
}];
|
|
@@ -2,8 +2,10 @@ import type { PluginModule } from "../plugin-module";
|
|
|
2
2
|
import { awardDetailCache, awardsCache } from "./client";
|
|
3
3
|
import { awardsHeadless } from "./headless";
|
|
4
4
|
import { AwardsPane } from "./pane";
|
|
5
|
+
import { AWARD_SERIES } from "./series";
|
|
5
6
|
|
|
6
7
|
export const awardsModule: PluginModule = {
|
|
8
|
+
series: AWARD_SERIES,
|
|
7
9
|
setup(ctx) { awardsCache.attach(ctx.persistence); awardDetailCache.attach(ctx.persistence); },
|
|
8
10
|
dispose() { awardsCache.reset(); awardDetailCache.reset(); },
|
|
9
11
|
panes: [{ id: "awards", name: "Government Awards", icon: "A", component: AwardsPane, defaultPosition: "right", defaultMode: "floating",
|
|
@@ -16,6 +16,7 @@ import { publicTickerKey } from "../../../utils/exchanges";
|
|
|
16
16
|
import { truncateToDisplayWidth } from "../../../utils/format";
|
|
17
17
|
import { SignInWall } from "../cloud/auth-actions";
|
|
18
18
|
import { CLOUD_PLAN_KEY, useCloudUpgradeAction } from "../shared/cloud-upgrade";
|
|
19
|
+
import { useOpenDescription } from "../shared/open-description";
|
|
19
20
|
import { Blurred, LockedOverlay, UpgradeLabel } from "../shared/locked-rows";
|
|
20
21
|
import { isCloudSessionRequired, useResearchCloudSession } from "../shared/research-cloud-session";
|
|
21
22
|
import { AwardDetail } from "./detail";
|
|
@@ -72,6 +73,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
72
73
|
const accessKey = `${session.requestKey}:${access.hasProAccess ? "full" : "preview"}`;
|
|
73
74
|
const openUpgrade = useCloudUpgradeAction("awards");
|
|
74
75
|
const { createPaneFromTemplate } = usePluginAppActions();
|
|
76
|
+
const openDescription = useOpenDescription();
|
|
75
77
|
const [initialTab] = usePaneSettingValue("tab", symbol ? "company" : "feed");
|
|
76
78
|
const [savedTab, setTab] = usePluginPaneState<string>("awards:tab", initialTab);
|
|
77
79
|
const tab = awardTab(savedTab);
|
|
@@ -157,7 +159,7 @@ function AwardsView({ width, height, focused, symbol }: PaneProps & { symbol: st
|
|
|
157
159
|
...(current ? [{ id: "source", key: "o", label: "pen source", onPress: () => void host.openExternal(current.sourceUrl) }] : []),
|
|
158
160
|
...(current && !openId ? [{ id: "evidence", key: "e", label: "vidence", onPress: () => setOpen(current.id) }] : []),
|
|
159
161
|
...(selectedEntity ? [
|
|
160
|
-
{ id: "description", key: "d", label: "es", onPress: () =>
|
|
162
|
+
{ id: "description", key: "d", label: "es", onPress: () => openDescription(selectedEntity.ticker, selectedEntity.exchange ?? undefined) },
|
|
161
163
|
{ id: "financials", key: "f", label: "a", onPress: () => navigate("financial-analysis-pane") },
|
|
162
164
|
{ id: "graph", key: "g", label: "raph", onPress: () => navigate("chart-composer-pane") },
|
|
163
165
|
{ id: "supply", key: "s", label: "plc", onPress: () => navigate("supply-chain-pane") },
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SeriesDefinition } from "../../../series/types";
|
|
2
|
+
import { fetchAwards } from "./client";
|
|
3
|
+
|
|
4
|
+
/** The scope AWARDS calls "US federal contracts": one source, one currency and prime awards, so no total counts a contract twice. */
|
|
5
|
+
const US_FEDERAL = { source: "usaspending", currency: "USD", awardType: "prime" } as const;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A company's US federal contract obligations by month, as AWARDS charts its
|
|
9
|
+
* company history. Pro: the free preview is one shared view, not the
|
|
10
|
+
* company's history, so it fails with the pane's own words.
|
|
11
|
+
*/
|
|
12
|
+
export const AWARD_SERIES: readonly SeriesDefinition[] = [{
|
|
13
|
+
id: "awards:us-federal-obligations",
|
|
14
|
+
name: "US federal contract obligations",
|
|
15
|
+
unit: "USD",
|
|
16
|
+
frequency: "monthly",
|
|
17
|
+
group: "Alternative data",
|
|
18
|
+
tags: ["government awards", "contracts", "procurement", "defense", "obligations"],
|
|
19
|
+
description: "Obligated dollars on US federal prime contracts awarded to the company, by award month, as AWARDS charts them. Needs Pro.",
|
|
20
|
+
input: "ticker",
|
|
21
|
+
style: "columns",
|
|
22
|
+
load: async ({ ticker, signal }) => {
|
|
23
|
+
const data = await fetchAwards({ ticker: ticker!, ...US_FEDERAL, limit: 1 }, undefined, signal);
|
|
24
|
+
if (data.locked || data.access === "preview") throw new Error("Full award history requires Pro.");
|
|
25
|
+
const rows = data.history.filter((row) => row.source === US_FEDERAL.source && row.currency === US_FEDERAL.currency && row.awardType === US_FEDERAL.awardType);
|
|
26
|
+
if (!rows.length) throw new Error(`No US federal contracts awarded to ${ticker}.`);
|
|
27
|
+
return rows.map((row) => ({ date: `${row.month.slice(0, 7)}-01`, value: row.obligatedAmount === null ? null : Number(row.obligatedAmount) }));
|
|
28
|
+
},
|
|
29
|
+
}];
|
|
@@ -146,7 +146,7 @@ export function BacktestPane({ width, height, focused }: PaneProps) {
|
|
|
146
146
|
}), [history.loading, result, view, paneId, symbol]);
|
|
147
147
|
|
|
148
148
|
const { strip: tabStrip, rows: tabRows } = usePaneTabs(symbol ? { tabs: TABS, activeValue: view, onSelect: setView, focused, dense: true } : null);
|
|
149
|
-
if (!symbol) return <EmptyState title="
|
|
149
|
+
if (!symbol) return <EmptyState title="Select a ticker." hint="Open BT with a symbol, for example BT AAPL." />;
|
|
150
150
|
const bodyHeight = Math.max(4, height - 1 - tabRows);
|
|
151
151
|
const wide = width - SUMMARY_WIDTH - 1 >= MIN_WIDE_CHART_COLS;
|
|
152
152
|
const summaryTable = (tableWidth: number, tableHeight: number, before?: ReactNode) => (
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { numberErrorMessage } from "../../../utils/decimal-comma";
|
|
1
2
|
import { priceBond, solveBondYield, treasurySpread, type BondTerms, type TreasuryBenchmarkPoint } from "./math";
|
|
2
3
|
|
|
3
4
|
export interface BondDraft {
|
|
@@ -20,7 +21,7 @@ export function defaultBondDraft(now = new Date()): BondDraft {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
function inputNumber(value: string, label: string): number {
|
|
23
|
-
if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(`${label} must be a number
|
|
24
|
+
if (!value.trim() || !/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(value.trim())) throw new Error(numberErrorMessage(`${label} must be a number`, value));
|
|
24
25
|
const number = Number(value);
|
|
25
26
|
if (!Number.isFinite(number)) throw new Error(`${label} must be finite`);
|
|
26
27
|
return number;
|
|
@@ -14,6 +14,7 @@ import { formatCurrency, truncateToDisplayWidth } from "../../../utils/format";
|
|
|
14
14
|
import { t, tf } from "../../../i18n";
|
|
15
15
|
import type { BrokerProfileRow } from "./model";
|
|
16
16
|
import type { BrokerManagerMessage } from "./pane-actions";
|
|
17
|
+
import { signInEndNote } from "./sign-in-end";
|
|
17
18
|
import { stateColor } from "./table";
|
|
18
19
|
|
|
19
20
|
export type BrokerEditKey = "label" | "enabled" | string;
|
|
@@ -277,6 +278,9 @@ export function BrokerDetailContent({
|
|
|
277
278
|
>
|
|
278
279
|
{detailStatusMessage}
|
|
279
280
|
</Text>
|
|
281
|
+
{row.signInEndsAt !== null && (
|
|
282
|
+
<Text fg={colors.warning} width={width} wrapText>{signInEndNote(row.signInEndsAt)}</Text>
|
|
283
|
+
)}
|
|
280
284
|
<Text fg={colors.textMuted}>{tf("Last sync {time}", { time: formatRelativeAge(row.lastSyncedAt) })}</Text>
|
|
281
285
|
<Text fg={colors.textMuted}>{tf("Status updated {time}", { time: formatRelativeAge(row.updatedAt) })}</Text>
|
|
282
286
|
<Box height={1} />
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
type BrokerProfileRow,
|
|
38
38
|
} from "./model";
|
|
39
39
|
import { useBrokerManagerActions } from "./pane-actions";
|
|
40
|
+
import { useSignInEnds } from "./sign-in-end";
|
|
40
41
|
import {
|
|
41
42
|
buildBrokerColumns,
|
|
42
43
|
renderBrokerCell,
|
|
@@ -78,9 +79,10 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
|
|
|
78
79
|
|
|
79
80
|
// Signed-in profiles take their broker's name from the connector list.
|
|
80
81
|
const signedInBrokers = useSyncExternalStore(subscribeSignedInBrokers, getSignedInBrokers, getSignedInBrokers);
|
|
82
|
+
const { ends: signInEnds, reload: reloadSignInEnds } = useSignInEnds(config.brokerInstances);
|
|
81
83
|
const rows = useMemo(
|
|
82
|
-
() => buildBrokerProfileRows(config, adapters, brokerAccounts),
|
|
83
|
-
[adapters, brokerAccounts, config, language, signedInBrokers, statusVersion],
|
|
84
|
+
() => buildBrokerProfileRows(config, adapters, brokerAccounts, signInEnds),
|
|
85
|
+
[adapters, brokerAccounts, config, language, signInEnds, signedInBrokers, statusVersion],
|
|
84
86
|
);
|
|
85
87
|
const selectedIndex = Math.max(0, rows.findIndex((row) => row.id === selectedId));
|
|
86
88
|
const selectedRow = rows[selectedIndex] ?? null;
|
|
@@ -107,9 +109,11 @@ export function BrokersPane({ focused, width, height }: PaneProps) {
|
|
|
107
109
|
if (!editKeys.includes(activeEditKey)) setActiveEditKey(editKeys[0] ?? "label");
|
|
108
110
|
}, [activeEditKey, editDraft, editKeys]);
|
|
109
111
|
|
|
112
|
+
// After a connect or sync, which can renew a sign-in or find it ended.
|
|
110
113
|
const refreshStatuses = useCallback(() => {
|
|
111
114
|
setStatusVersion((version) => version + 1);
|
|
112
|
-
|
|
115
|
+
reloadSignInEnds();
|
|
116
|
+
}, [reloadSignInEnds]);
|
|
113
117
|
|
|
114
118
|
const {
|
|
115
119
|
busy,
|
|
@@ -3,6 +3,7 @@ import type { AppConfig, BrokerInstanceConfig } from "../../../types/config";
|
|
|
3
3
|
import type { BrokerAccount } from "../../../types/trading";
|
|
4
4
|
import { formatCurrency } from "../../../utils/format";
|
|
5
5
|
import { t } from "../../../i18n";
|
|
6
|
+
import type { SignInEnds } from "./sign-in-end";
|
|
6
7
|
|
|
7
8
|
export type BrokerDisplayState =
|
|
8
9
|
| "disabled"
|
|
@@ -24,6 +25,8 @@ export interface BrokerProfileRow {
|
|
|
24
25
|
accountCount: number;
|
|
25
26
|
accountSummary: string;
|
|
26
27
|
accountIds: string[];
|
|
28
|
+
/** When the broker ends this profile's sign-in, once Gloom says it is time to connect again. */
|
|
29
|
+
signInEndsAt: number | null;
|
|
27
30
|
instance: BrokerInstanceConfig;
|
|
28
31
|
adapter: BrokerAdapter | null;
|
|
29
32
|
}
|
|
@@ -107,6 +110,7 @@ export function buildBrokerProfileRows(
|
|
|
107
110
|
config: AppConfig,
|
|
108
111
|
adapters: ReadonlyMap<string, BrokerAdapter | null>,
|
|
109
112
|
brokerAccounts: Record<string, BrokerAccount[]>,
|
|
113
|
+
signInEnds: SignInEnds = new Map(),
|
|
110
114
|
): BrokerProfileRow[] {
|
|
111
115
|
return config.brokerInstances.map((instance) => {
|
|
112
116
|
const adapter = adapters.get(instance.brokerType) ?? null;
|
|
@@ -139,6 +143,10 @@ export function buildBrokerProfileRows(
|
|
|
139
143
|
accountCount: accounts.length,
|
|
140
144
|
accountSummary: summarizeBrokerAccounts(accounts),
|
|
141
145
|
accountIds: accounts.map((account) => account.accountId),
|
|
146
|
+
// Say nothing next to a failure or a profile that does not connect.
|
|
147
|
+
signInEndsAt: state.state === "error" || state.state === "disabled" || state.state === "unavailable"
|
|
148
|
+
? null
|
|
149
|
+
: signInEnds.get(instance.id) ?? null,
|
|
142
150
|
instance,
|
|
143
151
|
adapter,
|
|
144
152
|
};
|
|
@@ -114,8 +114,14 @@ export function useBrokerManagerActions({
|
|
|
114
114
|
const broker = signedInBrokerForProfile(selectedRow.instance, selectedRow.brokerName);
|
|
115
115
|
try {
|
|
116
116
|
setBusy(t("Connecting…"));
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
// A connected broker is connected again only by a new sign-in: this renews it before the broker ends it.
|
|
118
|
+
// A row that says when the sign-in ends is renewable before this session's first sync too.
|
|
119
|
+
const renew = selectedRow.state === "connected" || selectedRow.signInEndsAt !== null;
|
|
120
|
+
if (!await requestBrokerSignIn(broker, { renew })) {
|
|
121
|
+
// Backing out of a renewal leaves the broker connected, for now.
|
|
122
|
+
setMessage(infoMessage(renew
|
|
123
|
+
? tf("{broker} sign-in was not renewed.", { broker: broker.name })
|
|
124
|
+
: tf("{broker} was not connected.", { broker: broker.name })));
|
|
119
125
|
return;
|
|
120
126
|
}
|
|
121
127
|
await syncBrokerInstance(selectedRow.id);
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useCallback, useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
import { apiClient } from "../../../api-client";
|
|
3
|
+
import { fetchSignedInBrokerConnection, type SignedInBrokerConnection } from "../../../brokers/signed-in/client";
|
|
4
|
+
import { isSignedInBrokerProfile, signedInBrokerId } from "../../../brokers/signed-in/profile";
|
|
5
|
+
import { tf } from "../../../i18n";
|
|
6
|
+
import { useAsyncResource } from "../../../react/async-resource";
|
|
7
|
+
import type { BrokerInstanceConfig } from "../../../types/config";
|
|
8
|
+
import { formatDetailDate, formatShortDate } from "../../../utils/datetime-format";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Some brokers end a sign-in on their own clock, however often it was
|
|
12
|
+
* refreshed, and Gloom flags it a day before. Only that case shows anything: a
|
|
13
|
+
* server that predates the flag, or a sign-in with no end in sight, adds nothing.
|
|
14
|
+
*/
|
|
15
|
+
export type SignInEnds = ReadonlyMap<string, number>;
|
|
16
|
+
|
|
17
|
+
/** When the broker ends the sign-in, if Gloom says it is time to connect again. */
|
|
18
|
+
export function signInEndOf(connection: Pick<SignedInBrokerConnection, "expiresAt" | "expiresSoon">): number | null {
|
|
19
|
+
if (connection.expiresSoon !== true || !connection.expiresAt) return null;
|
|
20
|
+
const endsAt = Date.parse(connection.expiresAt);
|
|
21
|
+
return Number.isFinite(endsAt) ? endsAt : null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The profile row's status, in the place of "Connected": "Ends Oct 10". */
|
|
25
|
+
export function signInEndStatus(endsAt: number, now = Date.now()): string {
|
|
26
|
+
const date = formatShortDate(endsAt, { year: false });
|
|
27
|
+
return endsAt > now ? tf("Ends {date}", { date }) : tf("Ended {date}", { date });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** The profile detail's note: "Sign-in ends Oct 10, 2026 at 3:00 PM". */
|
|
31
|
+
export function signInEndNote(endsAt: number, now = Date.now()): string {
|
|
32
|
+
const when = formatDetailDate(endsAt);
|
|
33
|
+
return endsAt > now ? tf("Sign-in ends {when}", { when }) : tf("Sign-in ended {when}", { when });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* When each signed-in profile's sign-in ends, by instance id, for the profiles
|
|
38
|
+
* whose broker is about to end it. Read from Gloom when the pane opens and
|
|
39
|
+
* after a connect or sync; a failed read is the same as nothing to say.
|
|
40
|
+
*/
|
|
41
|
+
export function useSignInEnds(
|
|
42
|
+
instances: readonly BrokerInstanceConfig[],
|
|
43
|
+
): { ends: SignInEnds; reload: () => void } {
|
|
44
|
+
const profiles = useMemo(
|
|
45
|
+
() => instances.flatMap((instance) => isSignedInBrokerProfile(instance) && instance.enabled !== false
|
|
46
|
+
? [{ id: instance.id, broker: signedInBrokerId(instance) }]
|
|
47
|
+
: []),
|
|
48
|
+
[instances],
|
|
49
|
+
);
|
|
50
|
+
// One read per broker, however many profiles name it.
|
|
51
|
+
const brokers = useMemo(() => [...new Set(profiles.map((profile) => profile.broker).filter(Boolean))].sort(), [profiles]);
|
|
52
|
+
const brokerKey = brokers.join(",");
|
|
53
|
+
const signedIn = useSyncExternalStore(
|
|
54
|
+
(listener) => apiClient.subscribeCurrentUser(listener),
|
|
55
|
+
() => apiClient.isSignedIn(),
|
|
56
|
+
() => apiClient.isSignedIn(),
|
|
57
|
+
);
|
|
58
|
+
const loader = useMemo(() => brokerKey && signedIn
|
|
59
|
+
? async () => {
|
|
60
|
+
const reads = await Promise.all(brokerKey.split(",").map(async (broker) => {
|
|
61
|
+
try {
|
|
62
|
+
return [broker, signInEndOf(await fetchSignedInBrokerConnection(broker))] as const;
|
|
63
|
+
} catch {
|
|
64
|
+
return [broker, null] as const;
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
return new Map(reads);
|
|
68
|
+
}
|
|
69
|
+
: null, [brokerKey, signedIn]);
|
|
70
|
+
const { data, reload } = useAsyncResource(loader, { keepPreviousData: true });
|
|
71
|
+
|
|
72
|
+
const ends = useMemo<SignInEnds>(() => {
|
|
73
|
+
const byInstance = new Map<string, number>();
|
|
74
|
+
for (const profile of profiles) {
|
|
75
|
+
const endsAt = data?.get(profile.broker);
|
|
76
|
+
if (endsAt != null) byInstance.set(profile.id, endsAt);
|
|
77
|
+
}
|
|
78
|
+
return byInstance;
|
|
79
|
+
}, [data, profiles]);
|
|
80
|
+
const refresh = useCallback(() => { void reload(); }, [reload]);
|
|
81
|
+
return { ends, reload: refresh };
|
|
82
|
+
}
|
|
@@ -4,6 +4,7 @@ import { colors } from "../../../theme/colors";
|
|
|
4
4
|
import { formatRelativeAge } from "../../../utils/datetime-format";
|
|
5
5
|
import type { BrokerDisplayState, BrokerProfileRow } from "./model";
|
|
6
6
|
import { t } from "../../../i18n";
|
|
7
|
+
import { signInEndStatus } from "./sign-in-end";
|
|
7
8
|
|
|
8
9
|
type BrokerColumnId = "profile" | "status" | "broker" | "mode" | "accounts" | "updated";
|
|
9
10
|
export type BrokerColumn = DataTableColumn & { id: BrokerColumnId };
|
|
@@ -45,6 +46,10 @@ export function renderBrokerCell(row: BrokerProfileRow, column: BrokerColumn): D
|
|
|
45
46
|
attributes: TextAttributes.BOLD,
|
|
46
47
|
};
|
|
47
48
|
case "status":
|
|
49
|
+
// A sign-in the broker is about to end replaces "Connected" until it is renewed.
|
|
50
|
+
if (row.signInEndsAt !== null) {
|
|
51
|
+
return { text: signInEndStatus(row.signInEndsAt), color: colors.warning };
|
|
52
|
+
}
|
|
48
53
|
return {
|
|
49
54
|
text: row.stateLabel,
|
|
50
55
|
color: stateColor(row.state),
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
// the browser catalog (catalog-browser.ts). Keep this file import-free so the
|
|
3
3
|
// browser catalog can read it without pulling in native-only modules.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
6
|
-
// them
|
|
5
|
+
// Screeners & Movers, Ownership & Insiders and Earnings ship fewer panes on
|
|
6
|
+
// the web, so each catalog gives them their own description rather than
|
|
7
|
+
// advertising panes they lack.
|
|
7
8
|
|
|
8
9
|
export const applicationPluginMeta = {
|
|
9
10
|
id: "application",
|
|
@@ -20,11 +21,44 @@ export const portfolioPluginMeta = {
|
|
|
20
21
|
toggleable: true,
|
|
21
22
|
};
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
// Ticker Research's successors. Every module keeps the `ticker-research`
|
|
25
|
+
// state namespace: these four declare it, Alt Data and Quant default to it,
|
|
26
|
+
// and Credit & Bonds and Earnings compose theirs with an override.
|
|
27
|
+
// `ticker-research` itself now stands for all eight in disabledPlugins (see
|
|
28
|
+
// ownership.ts). The core keeps the name people know.
|
|
29
|
+
|
|
30
|
+
export const tickerCorePluginMeta = {
|
|
31
|
+
id: "ticker-core",
|
|
32
|
+
stateId: "ticker-research",
|
|
25
33
|
name: "Ticker Research",
|
|
26
34
|
version: "1.0.0",
|
|
27
|
-
description: "Company
|
|
35
|
+
description: "Company overview, charts, financials, quotes and returns, analyst research and estimates, KPIs and segments, valuation, dividends, executives, and time and sales.",
|
|
36
|
+
toggleable: true,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const optionsVolatilityPluginMeta = {
|
|
40
|
+
id: "options-volatility",
|
|
41
|
+
stateId: "ticker-research",
|
|
42
|
+
name: "Options & Volatility",
|
|
43
|
+
version: "1.0.0",
|
|
44
|
+
description: "Option chains and positioning, a pricing calculator, scenarios, the volatility surface, and realized and implied volatility history.",
|
|
45
|
+
toggleable: true,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const ownershipPluginMeta = {
|
|
49
|
+
id: "ownership",
|
|
50
|
+
stateId: "ticker-research",
|
|
51
|
+
name: "Ownership & Insiders",
|
|
52
|
+
version: "1.0.0",
|
|
53
|
+
toggleable: true,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const filingsPluginMeta = {
|
|
57
|
+
id: "filings",
|
|
58
|
+
stateId: "ticker-research",
|
|
59
|
+
name: "Filings & Events",
|
|
60
|
+
version: "1.0.0",
|
|
61
|
+
description: "SEC filings, risk factors, 8-K events, catalysts and litigation, and M&A and distress.",
|
|
28
62
|
toggleable: true,
|
|
29
63
|
};
|
|
30
64
|
|
|
@@ -36,16 +70,92 @@ export const newsPluginMeta = {
|
|
|
36
70
|
toggleable: true,
|
|
37
71
|
};
|
|
38
72
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
73
|
+
// Market Overview's successors. Its modules keep the `market-overview` state
|
|
74
|
+
// namespace; Alt Data and Quant default to `ticker-research`, where their
|
|
75
|
+
// Ticker Research modules keep theirs, and compose their Market Overview
|
|
76
|
+
// modules with a `market-overview` override. `market-overview` itself
|
|
77
|
+
// now stands for all six in disabledPlugins (see ownership.ts).
|
|
78
|
+
|
|
79
|
+
export const globalMarketsPluginMeta = {
|
|
80
|
+
id: "global-markets",
|
|
81
|
+
stateId: "market-overview",
|
|
82
|
+
name: "Global Markets",
|
|
83
|
+
version: "1.0.0",
|
|
84
|
+
description: "World indices, the world map with chokepoint transits, sector and thematic performance, the FX matrix, and relative rotation.",
|
|
85
|
+
toggleable: true,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const screenersPluginMeta = {
|
|
89
|
+
id: "screeners",
|
|
90
|
+
stateId: "market-overview",
|
|
91
|
+
name: "Screeners & Movers",
|
|
92
|
+
version: "1.0.0",
|
|
93
|
+
toggleable: true,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const futuresCommoditiesPluginMeta = {
|
|
97
|
+
id: "futures-commodities",
|
|
98
|
+
stateId: "market-overview",
|
|
99
|
+
name: "Futures & Commodities",
|
|
100
|
+
version: "1.0.0",
|
|
101
|
+
description: "Futures board and curves, CFTC positioning, and EIA petroleum and gas storage.",
|
|
102
|
+
toggleable: true,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const cryptoPluginMeta = {
|
|
106
|
+
id: "crypto",
|
|
107
|
+
stateId: "market-overview",
|
|
108
|
+
name: "Crypto & Perps",
|
|
109
|
+
version: "1.0.0",
|
|
110
|
+
description: "Top crypto assets by market cap, and perpetual funding, open interest and premiums.",
|
|
111
|
+
toggleable: true,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const altDataPluginMeta = {
|
|
115
|
+
id: "alt-data",
|
|
116
|
+
stateId: "ticker-research",
|
|
117
|
+
name: "Supply Chain & Alt Data",
|
|
118
|
+
version: "1.0.0",
|
|
119
|
+
description: "Supply chains and exposure, government awards, hiring, apps and job postings, social mentions, research attention, GPU prices, and power queues.",
|
|
120
|
+
toggleable: true,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const quantPluginMeta = {
|
|
124
|
+
id: "quant",
|
|
125
|
+
stateId: "ticker-research",
|
|
126
|
+
name: "Quant",
|
|
127
|
+
version: "1.0.0",
|
|
128
|
+
description: "Correlation matrix and relationship graphs, backtests, seasonality, and moves on macro release days.",
|
|
129
|
+
toggleable: true,
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Macro's successors keep its state namespace, so the pane state, settings and
|
|
133
|
+
// caches saved while they were one plugin stay theirs; the Ticker Research
|
|
134
|
+
// modules Credit & Bonds and Earnings hold keep `ticker-research`. `macro` itself now
|
|
135
|
+
// stands for all three in disabledPlugins (see ownership.ts).
|
|
136
|
+
|
|
137
|
+
export const ratesMacroPluginMeta = {
|
|
138
|
+
id: "rates-macro",
|
|
139
|
+
stateId: "macro",
|
|
140
|
+
name: "Rates & Macro",
|
|
141
|
+
version: "1.0.0",
|
|
142
|
+
description: "Economic calendar and statistics, consumer prices, yield curve, rate path, money markets, central bank rates, volatility, and market valuation.",
|
|
143
|
+
toggleable: true,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export const creditPluginMeta = {
|
|
147
|
+
id: "credit",
|
|
148
|
+
stateId: "macro",
|
|
149
|
+
name: "Credit & Bonds",
|
|
42
150
|
version: "1.0.0",
|
|
151
|
+
description: "Single-name, index and sovereign CDS, credit spreads, Treasury auctions, a bond calculator, credit documents and covenants, and debt maturities.",
|
|
43
152
|
toggleable: true,
|
|
44
153
|
};
|
|
45
154
|
|
|
46
|
-
export const
|
|
47
|
-
id: "
|
|
48
|
-
|
|
155
|
+
export const earningsPluginMeta = {
|
|
156
|
+
id: "earnings",
|
|
157
|
+
stateId: "macro",
|
|
158
|
+
name: "Earnings",
|
|
49
159
|
version: "1.0.0",
|
|
50
160
|
toggleable: true,
|
|
51
161
|
};
|