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
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { resolvePriceBasis } from "../market/price-basis";
|
|
2
|
+
import { isAlwaysOpenExchange } from "../market/freshness";
|
|
2
3
|
import type {
|
|
4
|
+
MarketState,
|
|
3
5
|
Quote,
|
|
4
6
|
QuoteContribution,
|
|
5
7
|
QuoteContributionMap,
|
|
6
8
|
SessionConfidence,
|
|
7
9
|
TickerFinancials,
|
|
8
10
|
} from "../../types/financials";
|
|
11
|
+
import { classifyInstrumentType } from "../../tickers/instrument-kind";
|
|
9
12
|
import { quoteTradingDay, reconcileQuoteDayRange } from "./day-range";
|
|
10
13
|
|
|
11
14
|
const RETAINED_DESCRIPTIVE_FIELDS = ["high52w", "low52w", "marketCap", "name", "instrumentType"] as const;
|
|
@@ -48,6 +51,17 @@ function inferSessionConfidence(
|
|
|
48
51
|
return "unknown";
|
|
49
52
|
}
|
|
50
53
|
|
|
54
|
+
/**
|
|
55
|
+
* A CCC coin trades through the equity close. The live tape often leaves the
|
|
56
|
+
* session off, and a copied equity close would paint the coin shut.
|
|
57
|
+
*/
|
|
58
|
+
function alwaysOpenSession(quote: Pick<Quote, "listingExchangeName" | "exchangeName" | "instrumentType" | "marketState">): { marketState: MarketState; sessionConfidence: SessionConfidence } | null {
|
|
59
|
+
const open = isAlwaysOpenExchange(quote.listingExchangeName ?? quote.exchangeName)
|
|
60
|
+
|| classifyInstrumentType(quote.instrumentType) === "crypto";
|
|
61
|
+
if (!open || quote.marketState === "REGULAR") return null;
|
|
62
|
+
return { marketState: "REGULAR", sessionConfidence: "derived" };
|
|
63
|
+
}
|
|
64
|
+
|
|
51
65
|
function normalizeListingExchange(
|
|
52
66
|
quote: Quote | QuoteContribution,
|
|
53
67
|
providerId: string,
|
|
@@ -110,6 +124,7 @@ export function finalizeSessionFields(
|
|
|
110
124
|
postMarketPrice: undefined,
|
|
111
125
|
postMarketChange: undefined,
|
|
112
126
|
postMarketChangePercent: undefined,
|
|
127
|
+
extendedSessionPrint: undefined,
|
|
113
128
|
};
|
|
114
129
|
}
|
|
115
130
|
|
|
@@ -128,6 +143,8 @@ export function normalizeQuoteContribution(
|
|
|
128
143
|
const { listingExchangeName, listingExchangeFullName } = normalizeListingExchange(quote, providerId);
|
|
129
144
|
const routingExchangeName = quote.routingExchangeName;
|
|
130
145
|
const routingExchangeFullName = quote.routingExchangeFullName ?? routingExchangeName;
|
|
146
|
+
const exchangeName = listingExchangeName ?? quote.exchangeName;
|
|
147
|
+
const session = alwaysOpenSession({ ...quote, listingExchangeName, exchangeName });
|
|
131
148
|
|
|
132
149
|
return finalizeSessionFields(reconcileQuoteDayRange({
|
|
133
150
|
...quote,
|
|
@@ -136,9 +153,10 @@ export function normalizeQuoteContribution(
|
|
|
136
153
|
listingExchangeFullName,
|
|
137
154
|
routingExchangeName,
|
|
138
155
|
routingExchangeFullName,
|
|
139
|
-
exchangeName
|
|
156
|
+
exchangeName,
|
|
140
157
|
fullExchangeName: listingExchangeFullName ?? quote.fullExchangeName,
|
|
141
|
-
|
|
158
|
+
...session,
|
|
159
|
+
sessionConfidence: session?.sessionConfidence ?? inferSessionConfidence(quote, providerId),
|
|
142
160
|
}));
|
|
143
161
|
}
|
|
144
162
|
|
|
@@ -175,6 +193,8 @@ export function mergeQuoteContribution(
|
|
|
175
193
|
postMarketChangePercent: next.postMarketChangePercent,
|
|
176
194
|
} : {}),
|
|
177
195
|
priceBasis: next.priceBasis,
|
|
196
|
+
// Said of this observation's price; a tick that does not say leaves it unknown.
|
|
197
|
+
extendedSessionPrint: next.extendedSessionPrint,
|
|
178
198
|
regularClose: next.regularClose,
|
|
179
199
|
regularCloseSessionDate: next.regularClose != null ? next.regularCloseSessionDate : undefined,
|
|
180
200
|
regularChange: next.regularClose != null ? next.regularChange : undefined,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Quote, QuoteMetadata } from "../../types/financials";
|
|
2
2
|
import { canonicalExchange, parsePublicTickerKey } from "../../utils/exchanges";
|
|
3
3
|
import { getListingSymbolsToTry } from "../../sources/listing-symbols";
|
|
4
|
+
import { currencyPairCode } from "../../utils/currency-pair";
|
|
4
5
|
|
|
5
6
|
export function quoteMetadataFromQuote(quote: Quote): QuoteMetadata {
|
|
6
7
|
return {
|
|
@@ -32,22 +33,20 @@ export function mergeQuoteMetadata(known: QuoteMetadata | null | undefined, load
|
|
|
32
33
|
return Object.keys(fields).length ? { ...merged, fieldSources: fields } : merged;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
/** A provider's listing name establishes identity, not a session calendar. */
|
|
36
|
-
function metadataExchange(value?: string): string {
|
|
37
|
-
const exchange = canonicalExchange(value);
|
|
38
|
-
return exchange === "NY MERCANTILE" ? "NYMEX" : exchange;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
36
|
/** Qualified listings must agree; provider suffix spellings use the existing exact-listing normalizer. */
|
|
42
37
|
export function quoteMetadataMatchesTarget(metadata: QuoteMetadata, symbol: string, exchange?: string): boolean {
|
|
43
38
|
const target = parsePublicTickerKey(symbol);
|
|
44
39
|
const actual = parsePublicTickerKey(metadata.symbol);
|
|
45
|
-
const requestedExchange =
|
|
46
|
-
const symbolExchange =
|
|
47
|
-
const actualExchange =
|
|
40
|
+
const requestedExchange = canonicalExchange(target.exchange || exchange);
|
|
41
|
+
const symbolExchange = canonicalExchange(actual.exchange);
|
|
42
|
+
const actualExchange = canonicalExchange(metadata.listingExchangeName) || symbolExchange;
|
|
48
43
|
if (symbolExchange && actualExchange && symbolExchange !== actualExchange) return false;
|
|
49
44
|
if (requestedExchange && actualExchange !== requestedExchange) return false;
|
|
50
45
|
if (target.symbol === actual.symbol) return true;
|
|
46
|
+
// Gloom Cloud answers a currency pair in one spelling however it was asked
|
|
47
|
+
// for: EUR/USD and EURUSD:CCY come back as EURUSD=X on its currency venue.
|
|
48
|
+
const pair = actualExchange === "CCY" ? currencyPairCode(actual.symbol, actualExchange) : null;
|
|
49
|
+
if (pair && pair === currencyPairCode(target.symbol, requestedExchange)) return true;
|
|
51
50
|
const listing = requestedExchange || actualExchange;
|
|
52
51
|
if (!listing) return false;
|
|
53
52
|
const candidates = getListingSymbolsToTry(target.symbol, listing, { exactExchange: true });
|
|
@@ -523,6 +523,8 @@ export function resolveCanonicalQuote(
|
|
|
523
523
|
postMarketPrice: resolved.postMarketPrice as Quote["postMarketPrice"],
|
|
524
524
|
postMarketChange: resolved.postMarketChange as Quote["postMarketChange"],
|
|
525
525
|
postMarketChangePercent: resolved.postMarketChangePercent as Quote["postMarketChangePercent"],
|
|
526
|
+
// Said of the price, so it comes with it.
|
|
527
|
+
extendedSessionPrint: priceProvider?.extendedSessionPrint,
|
|
526
528
|
bid: resolved.bid as Quote["bid"],
|
|
527
529
|
ask: resolved.ask as Quote["ask"],
|
|
528
530
|
bidSize: resolved.bidSize as Quote["bidSize"],
|
|
@@ -5,7 +5,8 @@ import { buildQuoteKey, resolveEntryData } from "../selectors";
|
|
|
5
5
|
import type { QueryEntry } from "../result-types";
|
|
6
6
|
import { resolveCurrencyUnit } from "../../utils/currency-units";
|
|
7
7
|
import { isFiniteNumber } from "../../utils/guards";
|
|
8
|
-
import { getCompletedRegularSessionDisplay,
|
|
8
|
+
import { getCompletedRegularSessionDisplay, getTradedSessionMoveDisplay, type ExtendedSession } from "../market/status";
|
|
9
|
+
import { quoteTradingDay } from "./day-range";
|
|
9
10
|
|
|
10
11
|
const STREAM_FRESHNESS_MS = 2 * 60_000;
|
|
11
12
|
const STREAM_CONNECTING_GRACE_MS = 15_000;
|
|
@@ -30,8 +31,9 @@ export interface ScreenerQuoteRow {
|
|
|
30
31
|
export interface ScreenerQuoteOverlayOptions {
|
|
31
32
|
/**
|
|
32
33
|
* While a pre-market or after-hours session is open, show its price and its
|
|
33
|
-
* move from the regular close, marked with `extendedSession`; otherwise
|
|
34
|
-
*
|
|
34
|
+
* move from the regular close, marked with `extendedSession`; otherwise, or
|
|
35
|
+
* while the quote says nothing has traded in that session yet, the regular
|
|
36
|
+
* session's, which stops at the close. Without it a row shows the
|
|
35
37
|
* live price against the previous close. A row that is a completed regular
|
|
36
38
|
* session's close and move (`regularChangePercent`) keeps them outside the
|
|
37
39
|
* regular session when its quote has neither an open extended print nor
|
|
@@ -39,6 +41,21 @@ export interface ScreenerQuoteOverlayOptions {
|
|
|
39
41
|
* two different days.
|
|
40
42
|
*/
|
|
41
43
|
extendedSessions?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Only the regular session, never an extended print, whatever
|
|
46
|
+
* `extendedSessions` says: the live quote while the session trades, then
|
|
47
|
+
* the completed session's close and its move, given as
|
|
48
|
+
* `regularChangePercent`. A quote that cannot say which close that is
|
|
49
|
+
* leaves its row as it was.
|
|
50
|
+
*/
|
|
51
|
+
regularSession?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* With `regularSession`, the completed regular session the rows already
|
|
54
|
+
* are (a New York date) when they were taken outside the session. A quote
|
|
55
|
+
* replaces such a row only with that session's close or a later one, and a
|
|
56
|
+
* live quote only once a later session trades.
|
|
57
|
+
*/
|
|
58
|
+
completedSessionDate?: string | null;
|
|
42
59
|
}
|
|
43
60
|
|
|
44
61
|
export interface ScreenerQuoteFreshness {
|
|
@@ -83,14 +100,18 @@ function overlayCurrency(row: ScreenerQuoteRow, quote: Quote): string {
|
|
|
83
100
|
* entries map, but most rows' quotes did not move; returning the same row
|
|
84
101
|
* object for those lets memoized table rows skip the render.
|
|
85
102
|
*/
|
|
86
|
-
const overlayCache = new WeakMap<object, { quote: Quote;
|
|
103
|
+
const overlayCache = new WeakMap<object, { quote: Quote; basis: string; row: ScreenerQuoteRow }>();
|
|
87
104
|
|
|
88
105
|
export function overlayScreenerQuoteEntries<T extends ScreenerQuoteRow>(
|
|
89
106
|
rows: readonly T[],
|
|
90
107
|
entries: ReadonlyMap<string, QueryEntry<Quote>>,
|
|
91
108
|
options: ScreenerQuoteOverlayOptions = {},
|
|
92
109
|
): T[] {
|
|
93
|
-
const
|
|
110
|
+
const regular = options.regularSession === true;
|
|
111
|
+
const completedSessionDate = regular ? options.completedSessionDate ?? null : null;
|
|
112
|
+
const extended = !regular && options.extendedSessions === true;
|
|
113
|
+
// The cached row is reused only for the same quote under the same options.
|
|
114
|
+
const basis = regular ? `regular:${completedSessionDate ?? ""}` : extended ? "extended" : "plain";
|
|
94
115
|
return rows.map((row) => {
|
|
95
116
|
const quote = resolveEntryData(entries.get(quoteKey(row)));
|
|
96
117
|
if (!quote || !isFiniteNumber(quote.price)) return row;
|
|
@@ -102,9 +123,11 @@ export function overlayScreenerQuoteEntries<T extends ScreenerQuoteRow>(
|
|
|
102
123
|
return row;
|
|
103
124
|
}
|
|
104
125
|
const cached = overlayCache.get(row);
|
|
105
|
-
if (cached?.quote === quote && cached.
|
|
106
|
-
const overlaid =
|
|
107
|
-
|
|
126
|
+
if (cached?.quote === quote && cached.basis === basis) return cached.row as T;
|
|
127
|
+
const overlaid = regular
|
|
128
|
+
? overlayRegularSessionQuote(row, quote, completedSessionDate)
|
|
129
|
+
: extended ? overlaySessionQuote(row, quote) : overlayQuote(row, quote);
|
|
130
|
+
overlayCache.set(row, { quote, basis, row: overlaid });
|
|
108
131
|
return overlaid;
|
|
109
132
|
});
|
|
110
133
|
}
|
|
@@ -129,7 +152,7 @@ function overlayQuote<T extends ScreenerQuoteRow>(row: T, quote: Quote): T {
|
|
|
129
152
|
|
|
130
153
|
function overlaySessionQuote<T extends ScreenerQuoteRow>(row: T, quote: Quote): T {
|
|
131
154
|
const overlaid = overlayQuote(row, quote);
|
|
132
|
-
const display =
|
|
155
|
+
const display = getTradedSessionMoveDisplay(quote);
|
|
133
156
|
if (!display || !isFiniteNumber(display.price)) return overlaid;
|
|
134
157
|
if (
|
|
135
158
|
!display.session
|
|
@@ -149,6 +172,35 @@ function overlaySessionQuote<T extends ScreenerQuoteRow>(row: T, quote: Quote):
|
|
|
149
172
|
};
|
|
150
173
|
}
|
|
151
174
|
|
|
175
|
+
function overlayRegularSessionQuote<T extends ScreenerQuoteRow>(row: T, quote: Quote, completedSessionDate: string | null): T {
|
|
176
|
+
const state = quote.marketState;
|
|
177
|
+
if (state == null || state === "REGULAR") {
|
|
178
|
+
// On a board of a completed session, only a session that trades after it is news.
|
|
179
|
+
if (completedSessionDate) {
|
|
180
|
+
const day = state === "REGULAR" ? quoteTradingDay(quote) : null;
|
|
181
|
+
if (day == null || day <= completedSessionDate) return row;
|
|
182
|
+
}
|
|
183
|
+
return overlayQuote(row, quote);
|
|
184
|
+
}
|
|
185
|
+
const display = getCompletedRegularSessionDisplay(quote);
|
|
186
|
+
const closeDate = quote.regularCloseSessionDate;
|
|
187
|
+
if (
|
|
188
|
+
!display
|
|
189
|
+
|| !(isFiniteNumber(display.price) && display.price > 0)
|
|
190
|
+
|| !isFiniteNumber(display.changePercent)
|
|
191
|
+
|| (completedSessionDate != null && closeDate != null && closeDate < completedSessionDate)
|
|
192
|
+
) {
|
|
193
|
+
return row;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
...overlayQuote(row, quote),
|
|
197
|
+
price: display.price,
|
|
198
|
+
change: isFiniteNumber(display.change) ? display.change : null,
|
|
199
|
+
changePercent: display.changePercent,
|
|
200
|
+
regularChangePercent: display.changePercent,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
152
204
|
function freshQuote(
|
|
153
205
|
entry: QueryEntry<Quote> | undefined,
|
|
154
206
|
freshness: ScreenerQuoteFreshness,
|
|
@@ -32,6 +32,8 @@ export interface QueryEntry<T> {
|
|
|
32
32
|
/** Accepted source response order in this runtime, preserved through cache projections. */
|
|
33
33
|
responseSequence?: number;
|
|
34
34
|
asOf?: number;
|
|
35
|
+
/** Exchange rates: how far the snapshot runs behind the market, in minutes; 0 for a real-time one. */
|
|
36
|
+
delayMinutes?: number;
|
|
35
37
|
staleAt: number | null;
|
|
36
38
|
error: { reasonCode: string; message: string } | null;
|
|
37
39
|
attempts: ProviderAttempt[];
|
|
@@ -22,6 +22,7 @@ export function useAccountManagementKeyboard({
|
|
|
22
22
|
draftRef,
|
|
23
23
|
fieldOrder,
|
|
24
24
|
focused,
|
|
25
|
+
openAssistants,
|
|
25
26
|
openPasswordDialog,
|
|
26
27
|
openPortfolioDialog,
|
|
27
28
|
openUpgrade,
|
|
@@ -38,6 +39,7 @@ export function useAccountManagementKeyboard({
|
|
|
38
39
|
/** The active tab's ring, in reading order. */
|
|
39
40
|
fieldOrder: readonly AccountFieldKey[];
|
|
40
41
|
focused: boolean;
|
|
42
|
+
openAssistants: () => void;
|
|
41
43
|
openPasswordDialog: () => void;
|
|
42
44
|
openPortfolioDialog: () => Promise<void>;
|
|
43
45
|
openUpgrade: () => void;
|
|
@@ -52,6 +54,7 @@ export function useAccountManagementKeyboard({
|
|
|
52
54
|
sharedPortfolioId: () => { void openPortfolioDialog(); },
|
|
53
55
|
passwordAction: openPasswordDialog,
|
|
54
56
|
upgradeAction: openUpgrade,
|
|
57
|
+
assistantsAction: openAssistants,
|
|
55
58
|
deleteAccountAction: () => { void deleteAccount(); },
|
|
56
59
|
emailAlertsOffAction: () => { void turnOffEmailAlerts(); },
|
|
57
60
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChoiceDialogChoice } from "../../../components";
|
|
2
|
-
import type { AccountProfile,
|
|
2
|
+
import type { AccountProfile, PublicPortfolioAnalytics } from "../../../api-client";
|
|
3
3
|
import type { Portfolio, TickerRecord } from "../../../types/ticker";
|
|
4
4
|
import { formatNumber } from "../../../utils/format";
|
|
5
5
|
import { t, tf } from "../../../i18n";
|
|
@@ -21,6 +21,7 @@ export type AccountFieldKey =
|
|
|
21
21
|
| "chatEmailNotificationsEnabled"
|
|
22
22
|
| "emailAlertsOffAction"
|
|
23
23
|
| "upgradeAction"
|
|
24
|
+
| "assistantsAction"
|
|
24
25
|
| "passwordAction"
|
|
25
26
|
| "deleteAccountAction";
|
|
26
27
|
|
|
@@ -85,61 +86,6 @@ export function formatPlan(plan: AccountProfile["plan"] | null | undefined): str
|
|
|
85
86
|
return plan === "pro" ? t("Pro") : t("Free");
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
const DEFAULT_TRIAL_DAYS = 7;
|
|
89
|
-
|
|
90
|
-
function formatUsdCents(cents: number): string {
|
|
91
|
-
const dollars = cents / 100;
|
|
92
|
-
return Number.isInteger(dollars) ? `$${dollars}` : `$${dollars.toFixed(2)}`;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export type CloudBillingInterval = "month" | "year";
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Pro price for one billing interval, suffixed with the period. Falls back to
|
|
99
|
-
* the current price when `/pricing` is unreachable so the table never renders
|
|
100
|
-
* a blank cell.
|
|
101
|
-
*/
|
|
102
|
-
export function formatCloudPrice(
|
|
103
|
-
pricing: CloudPricing | null | undefined,
|
|
104
|
-
interval: CloudBillingInterval = "month",
|
|
105
|
-
): string {
|
|
106
|
-
const yearly = interval === "year";
|
|
107
|
-
if (!pricing) return yearly ? t("$630/yr") : t("$70/mo");
|
|
108
|
-
const amount = formatUsdCents((yearly ? pricing.yearly : pricing.monthly).amount);
|
|
109
|
-
return yearly ? tf("{amount}/yr", { amount }) : tf("{amount}/mo", { amount });
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function formatCloudMonthlyPrice(pricing: CloudPricing | null | undefined): string {
|
|
113
|
-
return formatCloudPrice(pricing, "month");
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** Whole months of the monthly price the yearly price leaves unpaid, e.g. 3. */
|
|
117
|
-
export function monthsFreeYearly(pricing: CloudPricing | null | undefined): number {
|
|
118
|
-
if (!pricing || pricing.monthly.amount <= 0) return 0;
|
|
119
|
-
const saved = (pricing.monthly.amount * 12 - pricing.yearly.amount) / pricing.monthly.amount;
|
|
120
|
-
return saved > 0 ? Math.round(saved) : 0;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Short calendar date for the trial countdown, e.g. "Aug 11". */
|
|
124
|
-
export function formatTrialEnd(endsAt: Date | null | undefined): string | null {
|
|
125
|
-
if (!endsAt || Number.isNaN(endsAt.getTime())) return null;
|
|
126
|
-
return endsAt.toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Pro-column note for the plan comparison, e.g. "7-day free trial". The trial
|
|
131
|
-
* is part of the Pro subscription (card required, cancel before it converts),
|
|
132
|
-
* so it is never advertised as something the free plan includes.
|
|
133
|
-
*/
|
|
134
|
-
export function formatTrialOffer(pricing: CloudPricing | null | undefined): string {
|
|
135
|
-
return tf("{days}-day free trial", { days: trialDaysOf(pricing) });
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/** The trial length `/pricing` gives, or today's length when it is unreachable. */
|
|
139
|
-
export function trialDaysOf(pricing: CloudPricing | null | undefined): number {
|
|
140
|
-
return pricing?.trialDays ?? DEFAULT_TRIAL_DAYS;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
89
|
export function countPortfolioHoldings(tickers: ReadonlyMap<string, TickerRecord>): Record<string, number> {
|
|
144
90
|
const counts: Record<string, number> = {};
|
|
145
91
|
for (const record of tickers.values()) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createPaneRequestChannel } from "../shared/pane-request";
|
|
2
2
|
|
|
3
|
-
export type AccountManagementTab = "profile" | "emails" | "calendar" | "pro" | "teams" | "advanced";
|
|
3
|
+
export type AccountManagementTab = "profile" | "emails" | "calendar" | "pro" | "teams" | "agents" | "advanced";
|
|
4
4
|
|
|
5
5
|
const tabRequests = createPaneRequestChannel<AccountManagementTab>();
|
|
6
6
|
|
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
type StatItem,
|
|
13
13
|
} from "../../../components";
|
|
14
14
|
import { useAppSelector, usePaneAppConfig } from "../../../state/app/context";
|
|
15
|
+
import { useViewport } from "../../../react/input";
|
|
16
|
+
import { displayWidth } from "../../../utils/format";
|
|
15
17
|
import { useChartQueries, useFxRatesMap } from "../../../market-data/hooks";
|
|
16
18
|
import { buildPortfolioFinancialsMap } from "../../../market-data/portfolio-financials";
|
|
17
19
|
import { useLiveTickerFinancialsMap, useSampledValue } from "../../../state/hooks/live-ticker-financials";
|
|
@@ -32,8 +34,10 @@ import { FRAMED_TEXTAREA_DESKTOP_STYLE } from "../../../components/ui/fields";
|
|
|
32
34
|
import { apiClient, type AccountProfile, type CloudPricing } from "../../../api-client";
|
|
33
35
|
import { chatController } from "../chat/controller";
|
|
34
36
|
import { SignInWall } from "../cloud/auth-actions";
|
|
35
|
-
import { loadUpgradeOffer } from "
|
|
37
|
+
import { loadUpgradeOffer } from "../../../account/upgrade-dialog";
|
|
38
|
+
import { openMcpConnectDialog } from "../cloud/mcp-connect/dialog";
|
|
36
39
|
import { TeamsAccountTab } from "../cloud/team/acm-tab";
|
|
40
|
+
import { AgentsAccountTab } from "../cloud/terminal-relay/acm-tab";
|
|
37
41
|
import {
|
|
38
42
|
CheckboxRow,
|
|
39
43
|
FieldRow,
|
|
@@ -48,15 +52,17 @@ import {
|
|
|
48
52
|
computeCumulativeReturn,
|
|
49
53
|
countPortfolioHoldings,
|
|
50
54
|
emptyToNull,
|
|
51
|
-
formatCloudMonthlyPrice,
|
|
52
55
|
formatPlan,
|
|
53
|
-
formatTrialEnd,
|
|
54
|
-
formatTrialOffer,
|
|
55
56
|
portfolioOptionIds,
|
|
56
57
|
profileToDraft,
|
|
57
58
|
type AccountDraft,
|
|
58
59
|
type AccountFieldKey,
|
|
59
60
|
} from "./model";
|
|
61
|
+
import {
|
|
62
|
+
formatCloudMonthlyPrice,
|
|
63
|
+
formatTrialEnd,
|
|
64
|
+
formatTrialOffer,
|
|
65
|
+
} from "../../../account/billing";
|
|
60
66
|
import { PasswordChangeDialog } from "./password-dialog";
|
|
61
67
|
import { CalendarAccountTab } from "./calendar-tab";
|
|
62
68
|
import { useAccountManagementFooter } from "./footer";
|
|
@@ -87,6 +93,7 @@ const ACCOUNT_TAB_DEFS: Array<{ label: string; value: AccountManagementTab }> =
|
|
|
87
93
|
{ label: "Calendar", value: "calendar" },
|
|
88
94
|
{ label: "Pro", value: "pro" },
|
|
89
95
|
{ label: "Teams", value: "teams" },
|
|
96
|
+
{ label: "Agents", value: "agents" },
|
|
90
97
|
{ label: "Advanced", value: "advanced" },
|
|
91
98
|
];
|
|
92
99
|
|
|
@@ -114,7 +121,9 @@ const ACCOUNT_TAB_FIELD_ORDER: Record<AccountManagementTab, AccountFieldKey[]> =
|
|
|
114
121
|
pro: ["upgradeAction"],
|
|
115
122
|
// The Teams tab owns its own keyboard handling (a list, not form fields).
|
|
116
123
|
teams: [],
|
|
117
|
-
|
|
124
|
+
// Remote assistants allowed to drive this terminal; a list with its own footer.
|
|
125
|
+
agents: [],
|
|
126
|
+
advanced: ["assistantsAction", "passwordAction", "deleteAccountAction"],
|
|
118
127
|
};
|
|
119
128
|
|
|
120
129
|
const PROFILE_PREVIEW_SAMPLE_MS = 10_000;
|
|
@@ -562,6 +571,12 @@ export function AccountManagementPane({ focused, width, height }: PaneProps) {
|
|
|
562
571
|
}).catch(() => {});
|
|
563
572
|
}, [busy, dialog]);
|
|
564
573
|
|
|
574
|
+
const viewport = useViewport();
|
|
575
|
+
const openAssistants = useCallback(() => {
|
|
576
|
+
setActiveField("assistantsAction");
|
|
577
|
+
void openMcpConnectDialog(dialog, { viewportWidth: viewport.width });
|
|
578
|
+
}, [dialog, viewport.width]);
|
|
579
|
+
|
|
565
580
|
const openPortfolioPicker = useCallback(async () => {
|
|
566
581
|
setActiveField("sharedPortfolioId");
|
|
567
582
|
portfolioSelectRef.current?.open();
|
|
@@ -705,8 +720,8 @@ export function AccountManagementPane({ focused, width, height }: PaneProps) {
|
|
|
705
720
|
|
|
706
721
|
useAccountManagementFooter({
|
|
707
722
|
busy,
|
|
708
|
-
// The Calendar
|
|
709
|
-
enabled: activeTab !== "calendar",
|
|
723
|
+
// The Calendar and Agents tabs save nothing and show their own status.
|
|
724
|
+
enabled: activeTab !== "calendar" && activeTab !== "agents",
|
|
710
725
|
hasSession,
|
|
711
726
|
message,
|
|
712
727
|
saveProfile,
|
|
@@ -719,7 +734,8 @@ export function AccountManagementPane({ focused, width, height }: PaneProps) {
|
|
|
719
734
|
draftRef,
|
|
720
735
|
fieldOrder,
|
|
721
736
|
// Behind the sign-in wall the fields are not there, and Enter is the wall's.
|
|
722
|
-
focused: focused && activeTab !== "teams" && activeTab !== "calendar" && (hasSession || apiClient.isSignedIn()),
|
|
737
|
+
focused: focused && activeTab !== "teams" && activeTab !== "calendar" && activeTab !== "agents" && (hasSession || apiClient.isSignedIn()),
|
|
738
|
+
openAssistants,
|
|
723
739
|
openPasswordDialog,
|
|
724
740
|
openPortfolioDialog: openPortfolioPicker,
|
|
725
741
|
openUpgrade,
|
|
@@ -927,8 +943,21 @@ export function AccountManagementPane({ focused, width, height }: PaneProps) {
|
|
|
927
943
|
{activeTab === "teams" ? (
|
|
928
944
|
<TeamsAccountTab focused={focused} width={contentWidth} />
|
|
929
945
|
) : null}
|
|
946
|
+
{activeTab === "agents" ? (
|
|
947
|
+
<AgentsAccountTab focused={focused} width={contentWidth} />
|
|
948
|
+
) : null}
|
|
930
949
|
{activeTab === "advanced" ? (
|
|
931
950
|
<>
|
|
951
|
+
<Box ref={fieldNodeRef("assistantsAction")} flexDirection="row" gap={1} alignItems="center">
|
|
952
|
+
{/* The only label on the tab, so it takes the room it needs, with the terminal's "> " marker. */}
|
|
953
|
+
<FieldLabel label={t("Assistants (MCP)")} active={activeField === "assistantsAction"} width={displayWidth(t("Assistants (MCP)")) + 3} />
|
|
954
|
+
<Button
|
|
955
|
+
label={t("Connect an AI Assistant")}
|
|
956
|
+
active={activeField === "assistantsAction"}
|
|
957
|
+
onPress={openAssistants}
|
|
958
|
+
disabled={!!busy}
|
|
959
|
+
/>
|
|
960
|
+
</Box>
|
|
932
961
|
<Box flexDirection="row" gap={1}>
|
|
933
962
|
<Button
|
|
934
963
|
label={t("Change Password")}
|
|
@@ -7,7 +7,7 @@ import { colors } from "../../../theme/colors";
|
|
|
7
7
|
import { isPlainKey } from "../../../utils/keyboard";
|
|
8
8
|
import { truncateWithEllipsis } from "../../../utils/text-wrap";
|
|
9
9
|
import { t } from "../../../i18n";
|
|
10
|
-
import { MIN_ACCOUNT_PASSWORD_LENGTH } from "
|
|
10
|
+
import { MIN_ACCOUNT_PASSWORD_LENGTH } from "../../../account/auth-model";
|
|
11
11
|
|
|
12
12
|
type PasswordDialogField = "current" | "new" | "confirm";
|
|
13
13
|
|