gloomberb 0.18.3 → 0.18.4
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 +8 -8
- package/README.zh-CN.md +11 -11
- package/bin/{gloomberb → gloom} +3 -1
- package/package.json +6 -2
- package/src/account/checkout-handoff.tsx +225 -0
- package/src/account/device-signin-dialog.tsx +2 -2
- package/src/account/device-signin.ts +2 -2
- package/src/account/upgrade-dialog.tsx +1 -1
- package/src/api-client/askg.ts +2 -2
- package/src/api-client/auth.ts +2 -2
- package/src/api-client/central-bank-rates.ts +6 -0
- package/src/api-client/collections.ts +5 -1
- package/src/api-client/cot.ts +2 -0
- package/src/api-client/crypto-etf-flows.ts +37 -0
- package/src/api-client/crypto-markets.ts +60 -0
- package/src/api-client/data.ts +84 -5
- package/src/api-client/doe.ts +15 -0
- package/src/api-client/equity-screener.ts +28 -0
- package/src/api-client/exchange-announcements.ts +38 -0
- package/src/api-client/fund-facts.ts +39 -0
- package/src/api-client/futures-curve.ts +9 -1
- package/src/api-client/hiring.ts +301 -0
- package/src/api-client/index.ts +22 -5
- package/src/api-client/market-discovery.ts +14 -0
- package/src/api-client/members.ts +6 -0
- package/src/api-client/mna.ts +6 -0
- package/src/api-client/paths.ts +18 -1
- package/src/api-client/request.ts +21 -4
- package/src/api-client/short-side-publications.ts +37 -0
- package/src/api-client/socket.ts +64 -4
- package/src/api-client/swap-curve.ts +35 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/pane-runtime/plugin-bindings.ts +9 -2
- package/src/app/runtime/desktop-deeplink.ts +5 -5
- package/src/app/runtime/plugin-bindings.ts +2 -2
- package/src/app/runtime/startup.ts +13 -0
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/ui-literals-allowlist.json +3 -3
- package/src/architecture/ui-tokens-allowlist.json +1 -1
- package/src/brokers/broker-portfolio-sync.ts +37 -0
- package/src/brokers/directory.ts +11 -0
- package/src/brokers/logos.ts +3 -1
- package/src/brokers/signed-in/adapter.ts +304 -26
- package/src/brokers/signed-in/client.ts +14 -2
- package/src/brokers/signed-in/connect.ts +10 -2
- package/src/brokers/sync-broker-instance.ts +9 -1
- package/src/capabilities/chart-series.ts +22 -6
- package/src/cli/bank-section.ts +1 -1
- package/src/cli/base-converter.ts +23 -14
- package/src/cli/central-bank-events.ts +1 -1
- package/src/cli/command-options.ts +59 -4
- package/src/cli/commands/api.ts +9 -6
- package/src/cli/commands/broker.ts +2 -2
- package/src/cli/commands/command-utils.ts +2 -2
- package/src/cli/commands/crypto-hints.ts +7 -20
- package/src/cli/commands/fred-series.ts +4 -2
- package/src/cli/commands/keybindings.ts +2 -2
- package/src/cli/commands/market.ts +1117 -264
- package/src/cli/commands/news-hints.ts +2 -2
- package/src/cli/commands/news-search.ts +59 -6
- package/src/cli/commands/options-leaps.ts +41 -26
- package/src/cli/commands/overview.ts +121 -48
- package/src/cli/commands/plugins.ts +9 -9
- package/src/cli/commands/remote.ts +13 -10
- package/src/cli/commands/search.ts +64 -44
- package/src/cli/commands/system.ts +27 -19
- package/src/cli/commands/themes.ts +1 -1
- package/src/cli/commands/ticker.ts +192 -47
- package/src/cli/context.ts +3 -2
- package/src/cli/desktop-pane-shot-view.ts +2 -2
- package/src/cli/desktop-pane-shot.ts +1 -1
- package/src/cli/earnings-calendar.ts +4 -4
- package/src/cli/entry.ts +18 -1
- package/src/cli/errors.ts +20 -2
- package/src/cli/exit-codes.ts +1 -1
- package/src/cli/export-source.ts +10 -4
- package/src/cli/freshness.ts +2 -8
- package/src/cli/fx-forward.ts +130 -0
- package/src/cli/fx-pair.ts +10 -9
- package/src/cli/glossary.ts +64 -20
- package/src/cli/help.ts +19 -13
- package/src/cli/history-export.ts +126 -0
- package/src/cli/history-rows.ts +196 -43
- package/src/cli/index-roots.ts +5 -45
- package/src/cli/index.ts +24 -18
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +300 -41
- package/src/cli/name-entries.ts +30 -18
- package/src/cli/native-smoke.ts +2 -0
- package/src/cli/not-a-ticker.ts +19 -9
- package/src/cli/opentui-libc.ts +5 -0
- package/src/cli/options.ts +12 -0
- package/src/cli/pane-functions/capabilities.ts +75 -20
- package/src/cli/pane-functions/catalog.ts +24 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +10 -7
- package/src/cli/pane-functions/financial-ratio-shot.ts +2 -2
- package/src/cli/pane-functions/freshness.ts +174 -23
- package/src/cli/pane-functions/function-help.ts +66 -27
- package/src/cli/pane-functions/headless.ts +24 -11
- package/src/cli/pane-functions/index.ts +18 -16
- package/src/cli/pane-functions/options.ts +22 -2
- package/src/cli/pane-functions/report-notices.ts +12 -4
- package/src/cli/pane-functions/report.ts +5 -5
- package/src/cli/pane-functions/resolver.ts +47 -10
- package/src/cli/pane-functions/screenshot-assessment.ts +322 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +152 -0
- package/src/cli/pane-functions/screenshot-chart-evidence.ts +396 -0
- package/src/cli/pane-functions/screenshot-data-evidence.ts +383 -0
- package/src/cli/pane-functions/screenshot-evidence.ts +1 -1
- package/src/cli/pane-functions/screenshot-payload.ts +453 -0
- package/src/cli/pane-functions/screenshot-render.ts +316 -0
- package/src/cli/pane-functions/screenshot-types.ts +162 -0
- package/src/cli/pane-functions/shot-options.ts +8 -3
- package/src/cli/peso-dollar-rates.ts +79 -0
- package/src/cli/quote-answer.ts +38 -3
- package/src/cli/report-tables.ts +61 -16
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +111 -22
- package/src/cli/series-search.ts +5 -5
- package/src/cli/statement-filings.ts +19 -0
- package/src/cli/suffixed-listing-rows.ts +49 -0
- package/src/cli/symbol-args.ts +50 -15
- package/src/cli/symbol-cells.ts +120 -0
- package/src/cli/symbol-list.ts +198 -68
- package/src/cli/symbol-rows.ts +131 -25
- package/src/cli/ticker-resolution.ts +108 -11
- package/src/cli/treasury-yields.ts +5 -5
- package/src/cli/types.ts +2 -0
- package/src/cli/uncovered-instrument.ts +3 -3
- package/src/cli/unknown-command.ts +6 -6
- package/src/components/chart/composite/chart-layout.ts +131 -0
- package/src/components/chart/composite/composite-chart.tsx +373 -16
- package/src/components/chart/composite/interactions.ts +7 -2
- package/src/components/chart/composite/legend.tsx +75 -3
- package/src/components/chart/composite/levels.ts +5 -0
- package/src/components/chart/composite/panel-gestures.ts +41 -0
- package/src/components/chart/composite/panel-labels.ts +2 -1
- package/src/components/chart/composite/panel-surface.tsx +305 -11
- package/src/components/chart/composite/price-axis-labels.tsx +27 -3
- package/src/components/chart/composite/rasterizer.ts +44 -19
- package/src/components/chart/composite/scene.ts +16 -4
- package/src/components/chart/composite/text-renderer.ts +48 -21
- package/src/components/chart/composite/toolbar.tsx +52 -5
- package/src/components/chart/composite/types.ts +13 -0
- package/src/components/chart/composite/use-composite-chart-keyboard.ts +120 -13
- package/src/components/chart/composite/use-composite-value-scales.ts +44 -0
- package/src/components/chart/composite/use-composite-viewport.ts +12 -3
- package/src/components/chart/composite/value-scale.ts +149 -0
- package/src/components/chart/composite/volume-profile-paint.ts +6 -3
- package/src/components/chart/core/pointer.ts +2 -0
- package/src/components/chart-table/index.ts +2 -0
- package/src/components/chart-table/read.tsx +74 -0
- package/src/components/command-bar/commands/collection-list.ts +41 -19
- package/src/components/command-bar/commands/collection.ts +9 -3
- package/src/components/command-bar/commands/direct/index.ts +1 -1
- package/src/components/command-bar/commands/direct/runtime.ts +3 -2
- package/src/components/command-bar/pane-templates/items.ts +59 -6
- package/src/components/command-bar/pane-templates/workflow.ts +10 -1
- package/src/components/command-bar/routes/root/plugin-install.ts +1 -1
- package/src/components/command-bar/routes/root/provider-search.ts +42 -11
- package/src/components/command-bar/routes/root/results.ts +18 -4
- package/src/components/command-bar/routes/root/runtime.ts +15 -3
- package/src/components/command-bar/routes/root/search-providers.ts +25 -2
- package/src/components/command-bar/routes/root/selection.ts +6 -1
- package/src/components/command-bar/routes/root/shortcut-feedback.ts +4 -1
- package/src/components/command-bar/routes/root/shortcuts.ts +30 -3
- package/src/components/command-bar/routes/ticker-search/results.ts +73 -4
- package/src/components/command-bar/selection-runtime.ts +50 -10
- package/src/components/command-bar/surface/index.tsx +24 -2
- package/src/components/command-bar/view-model.ts +7 -0
- package/src/components/command-bar/workflow/broker.ts +2 -2
- package/src/components/command-bar/workflow/collection-actions.ts +46 -7
- package/src/components/command-bar/workflow/collection-ticker.ts +32 -4
- package/src/components/command-bar/workflow/fields.ts +8 -2
- package/src/components/command-bar/workflow/ops.ts +18 -4
- package/src/components/command-bar/workflow/portfolio-position.ts +53 -4
- package/src/components/command-bar/workflow/submit.ts +3 -2
- package/src/components/command-bar/workflow/tickers.ts +5 -1
- package/src/components/company-logo.tsx +39 -0
- package/src/components/data-table/sections.ts +4 -2
- package/src/components/form-modal/confirm.tsx +2 -1
- package/src/components/form-modal/request.ts +5 -0
- package/src/components/form-modal/routes.ts +4 -1
- package/src/components/index.ts +12 -6
- package/src/components/layout/header.tsx +7 -6
- package/src/components/layout/market-summary.ts +9 -6
- package/src/components/layout/pane/capture-status.ts +1 -1
- package/src/components/layout/pane/footer/model.ts +11 -5
- package/src/components/layout/shell/chrome.ts +19 -6
- package/src/components/layout/shell/index.tsx +2 -1
- package/src/components/layout/shell/pane/layers.tsx +19 -1
- package/src/components/layout/status-bar.tsx +2 -2
- package/src/components/market-board/index.tsx +11 -3
- package/src/components/onboarding/onboarding-wizard.tsx +1 -0
- package/src/components/onboarding/portfolio-step/broker-setup-panel.tsx +2 -2
- package/src/components/onboarding/wizard-broker-sync.ts +4 -1
- package/src/components/pane-settings-dialog/desktop.tsx +20 -7
- package/src/components/pane-settings-dialog/tui.tsx +17 -9
- package/src/components/pane-settings-dialog/value.ts +8 -1
- package/src/components/pane-settings-dialog.tsx +44 -13
- package/src/components/sign-in-code-panel.tsx +27 -19
- package/src/components/ui/column-grid.tsx +48 -4
- package/src/components/ui/country-flag-art.tsx +180 -0
- package/src/components/ui/country-flag.tsx +118 -12
- package/src/components/ui/data-table/opentui/index.tsx +61 -2
- package/src/components/ui/data-table/opentui/model.ts +109 -2
- package/src/components/ui/data-table/types.ts +1 -1
- package/src/components/ui/display.tsx +5 -1
- package/src/components/ui/index.ts +3 -1
- package/src/components/ui/logo-mark.tsx +11 -2
- package/src/components/ui/query-bar.tsx +1 -1
- package/src/components/ui/row-notes.ts +79 -0
- package/src/core/state/app/layout.ts +4 -4
- package/src/data/cached-query.ts +8 -1
- package/src/data/config/chart-settings.ts +3 -3
- package/src/data/config/home.ts +10 -2
- package/src/data/config/layout.ts +4 -1
- package/src/data/config/store/node.ts +4 -0
- package/src/data/config/store/normalize.ts +13 -3
- package/src/data/config/store/portfolio-as-of-column.ts +2 -2
- package/src/data/json-storage.ts +2 -0
- package/src/data/saved-copies.ts +84 -0
- package/src/docs/snapshot.json +65 -32
- package/src/i18n/es.ts +29 -12
- package/src/i18n/ja.ts +29 -12
- package/src/i18n/ko.ts +29 -12
- package/src/i18n/zh-cn.ts +29 -12
- package/src/i18n/zh-tw.ts +29 -12
- package/src/layout/desks.ts +1 -1
- package/src/layout/launch-layout.ts +1 -1
- package/src/layout/pane-manager/floating-actions.ts +5 -3
- package/src/layout/pane-manager/floating.ts +43 -1
- package/src/layout/pane-manager/index.ts +2 -0
- package/src/layout/selected-ticker.ts +74 -0
- package/src/market-data/depositary-pair.ts +251 -0
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +124 -40
- package/src/market-data/fx-closes.ts +17 -2
- package/src/market-data/hooks.tsx +19 -11
- package/src/market-data/market/change-basis.ts +49 -7
- package/src/market-data/market/freshness.ts +34 -5
- package/src/market-data/market/period-return.ts +163 -0
- package/src/market-data/market/trading-sessions.ts +13 -0
- package/src/market-data/market/year-to-date.ts +8 -13
- package/src/market-data/performance.ts +20 -14
- package/src/market-data/perpetual-premium.ts +32 -0
- package/src/market-data/published-apac-sessions.ts +2 -1
- package/src/market-data/published-futures-sessions.ts +69 -0
- package/src/market-data/quotes/contributions.ts +5 -1
- package/src/market-data/quotes/freshness.ts +42 -0
- package/src/market-data/quotes/intraday-bar.ts +37 -0
- package/src/market-data/quotes/regular-session-valuation.ts +13 -8
- package/src/market-data/quotes/resolution.ts +4 -2
- package/src/market-data/tax-equivalent.ts +1 -1
- package/src/market-data/ticker-price-returns.ts +3 -1
- package/src/news/aggregator.ts +5 -1
- package/src/news/news-model.ts +4 -0
- package/src/news/types.ts +11 -0
- package/src/notifications/app-notifier.ts +1 -1
- package/src/plugins/auto-update.ts +2 -2
- package/src/plugins/builtin/account-management/index.tsx +1 -0
- package/src/plugins/builtin/account-management/pane.tsx +9 -8
- package/src/plugins/builtin/alerts/alert-engine.ts +29 -19
- package/src/plugins/builtin/alerts/calendar-events.ts +378 -0
- package/src/plugins/builtin/alerts/cli.ts +485 -76
- package/src/plugins/builtin/alerts/command.ts +5 -10
- package/src/plugins/builtin/alerts/event-rows.ts +9 -5
- package/src/plugins/builtin/alerts/events-pane.tsx +71 -56
- package/src/plugins/builtin/alerts/events.ts +107 -5
- package/src/plugins/builtin/alerts/fired-log.ts +78 -0
- package/src/plugins/builtin/alerts/format.ts +2 -1
- package/src/plugins/builtin/alerts/headless.ts +100 -39
- package/src/plugins/builtin/alerts/history-pane.tsx +105 -62
- package/src/plugins/builtin/alerts/history-rows.ts +89 -0
- package/src/plugins/builtin/alerts/index.tsx +45 -18
- package/src/plugins/builtin/alerts/iv-level.ts +365 -0
- package/src/plugins/builtin/alerts/levels.ts +3 -3
- package/src/plugins/builtin/alerts/pane.tsx +97 -29
- package/src/plugins/builtin/alerts/price.ts +35 -0
- package/src/plugins/builtin/alerts/quotes.ts +24 -0
- package/src/plugins/builtin/alerts/research-builder.ts +84 -11
- package/src/plugins/builtin/alerts/research-rules.ts +76 -3
- package/src/plugins/builtin/alerts/scheduled-check.ts +206 -32
- package/src/plugins/builtin/alerts/scheduled-sources.ts +26 -3
- package/src/plugins/builtin/alerts/scheduled.ts +188 -29
- package/src/plugins/builtin/alerts/storage.ts +13 -10
- package/src/plugins/builtin/alerts/targets.ts +12 -3
- package/src/plugins/builtin/analytics/index.tsx +8 -2
- package/src/plugins/builtin/analytics/metrics.ts +1 -1
- package/src/plugins/builtin/analytics/risk-book.ts +215 -0
- package/src/plugins/builtin/analytics/risk-client.ts +13 -6
- package/src/plugins/builtin/analytics/risk-headless.ts +55 -21
- package/src/plugins/builtin/analytics/risk-math.ts +6 -3
- package/src/plugins/builtin/analytics/risk-model.ts +297 -104
- package/src/plugins/builtin/analytics/risk-options.ts +17 -2
- package/src/plugins/builtin/analytics/risk-pane.tsx +97 -36
- package/src/plugins/builtin/attention/pane.tsx +6 -2
- package/src/plugins/builtin/awards/headless.ts +7 -3
- package/src/plugins/builtin/awards/model.ts +18 -0
- package/src/plugins/builtin/awards/pane.tsx +6 -3
- package/src/plugins/builtin/backtest/headless.ts +3 -3
- package/src/plugins/builtin/backtest/rules.ts +41 -5
- package/src/plugins/builtin/broker-manager/add-flow.tsx +12 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +47 -19
- package/src/plugins/builtin/broker-manager/footer.ts +27 -11
- package/src/plugins/builtin/broker-manager/index.tsx +21 -12
- package/src/plugins/builtin/broker-manager/keyboard.ts +1 -1
- package/src/plugins/builtin/broker-manager/model.ts +12 -2
- package/src/plugins/builtin/broker-manager/pane-actions.tsx +183 -57
- package/src/plugins/builtin/broker-manager/table.ts +28 -12
- package/src/plugins/builtin/broker-trading/account-picker.tsx +2 -1
- package/src/plugins/builtin/broker-trading/chart-levels.ts +82 -13
- package/src/plugins/builtin/broker-trading/controller.ts +45 -13
- package/src/plugins/builtin/broker-trading/dock.tsx +22 -4
- package/src/plugins/builtin/broker-trading/headless.ts +2 -1
- package/src/plugins/builtin/broker-trading/index.tsx +7 -1
- package/src/plugins/builtin/broker-trading/linked-orders.ts +148 -0
- package/src/plugins/builtin/broker-trading/order-feed.ts +75 -7
- package/src/plugins/builtin/broker-trading/orders.tsx +109 -31
- package/src/plugins/builtin/broker-trading/overview-orders.tsx +9 -3
- package/src/plugins/builtin/broker-trading/pane-model.ts +30 -2
- package/src/plugins/builtin/broker-trading/pane.tsx +110 -23
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +112 -31
- package/src/plugins/builtin/buildout/cells.tsx +4 -0
- package/src/plugins/builtin/buildout/detail/index.tsx +5 -1
- package/src/plugins/builtin/buildout/detail/ui.tsx +7 -4
- package/src/plugins/builtin/buildout/pane/index.tsx +25 -12
- package/src/plugins/builtin/buildout/pane/status.tsx +0 -4
- package/src/plugins/builtin/builtin-plugin-meta.ts +1 -1
- package/src/plugins/builtin/catalysts/detail.tsx +3 -2
- package/src/plugins/builtin/catalysts/index.tsx +1 -1
- package/src/plugins/builtin/catalysts/model.ts +49 -4
- package/src/plugins/builtin/catalysts/pane.tsx +6 -8
- package/src/plugins/builtin/central-bank-rates/client.ts +5 -0
- package/src/plugins/builtin/central-bank-rates/headless.ts +36 -10
- package/src/plugins/builtin/central-bank-rates/model.ts +33 -8
- package/src/plugins/builtin/changelog/index.tsx +1 -0
- package/src/plugins/builtin/chart-composer/catalog-inventory.ts +1 -0
- package/src/plugins/builtin/chart-composer/chart-spec-edit.ts +2 -1
- package/src/plugins/builtin/chart-composer/chart-spec.ts +7 -0
- package/src/plugins/builtin/chart-composer/cli-options.ts +2 -5
- package/src/plugins/builtin/chart-composer/data-catalog-pane.tsx +2 -1
- package/src/plugins/builtin/chart-composer/editor/controller.ts +2 -0
- package/src/plugins/builtin/chart-composer/editor.tsx +4 -1
- package/src/plugins/builtin/chart-composer/headless-schema.ts +28 -26
- package/src/plugins/builtin/chart-composer/headless.ts +253 -35
- package/src/plugins/builtin/chart-composer/index.tsx +12 -2
- package/src/plugins/builtin/chart-composer/leverage-overlay.ts +142 -0
- package/src/plugins/builtin/chart-composer/pane.tsx +127 -28
- package/src/plugins/builtin/chart-composer/series-catalog.ts +1 -0
- package/src/plugins/builtin/chart-composer/series-expression.ts +65 -6
- package/src/plugins/builtin/chart-composer/session-history.ts +15 -21
- package/src/plugins/builtin/chart-composer/session-range.ts +4 -2
- package/src/plugins/builtin/chart-composer/settings.ts +31 -19
- package/src/plugins/builtin/chart-composer/use-series-catalog.ts +5 -6
- package/src/plugins/builtin/chart-composer/viewport-labels.ts +18 -8
- package/src/plugins/builtin/chat/attachments/model.ts +3 -1
- package/src/plugins/builtin/chat/content/index.tsx +1 -1
- package/src/plugins/builtin/chat/pane-links/open.ts +1 -1
- package/src/plugins/builtin/chat/people.ts +1 -1
- package/src/plugins/builtin/clinical-trials/client.ts +5 -2
- package/src/plugins/builtin/clinical-trials/model.ts +13 -4
- package/src/plugins/builtin/clinical-trials/pane.tsx +32 -12
- package/src/plugins/builtin/clinical-trials/ticker-sponsor.ts +17 -0
- package/src/plugins/builtin/cloud/askg/controller.ts +1 -1
- package/src/plugins/builtin/cloud/askg/lock-note.ts +1 -1
- package/src/plugins/builtin/cloud/askg/tool-display.ts +1 -1
- package/src/plugins/builtin/cloud/auth-commands.ts +3 -3
- package/src/plugins/builtin/cloud/team/pane-sections.tsx +105 -47
- package/src/plugins/builtin/cloud/team/pane-ui.tsx +42 -4
- package/src/plugins/builtin/cloud/team/pane.tsx +204 -64
- package/src/plugins/builtin/cloud/thesis/store.ts +45 -22
- package/src/plugins/builtin/cloud-tweets/registration.ts +1 -0
- package/src/plugins/builtin/commodities-energy/index.tsx +29 -2
- package/src/plugins/builtin/commodities-energy/view-state.ts +2 -0
- package/src/plugins/builtin/commodity-balances/pane.tsx +11 -4
- package/src/plugins/builtin/company-attention/app-rank.tsx +7 -5
- package/src/plugins/builtin/company-attention/building-model.ts +222 -0
- package/src/plugins/builtin/company-attention/building.tsx +172 -0
- package/src/plugins/builtin/company-attention/client.ts +117 -1
- package/src/plugins/builtin/company-attention/evidence.ts +16 -3
- package/src/plugins/builtin/company-attention/headless.ts +101 -5
- package/src/plugins/builtin/company-attention/index.tsx +6 -3
- package/src/plugins/builtin/company-attention/model.ts +33 -7
- package/src/plugins/builtin/company-attention/moves-model.ts +253 -0
- package/src/plugins/builtin/company-attention/moves.tsx +159 -0
- package/src/plugins/builtin/company-attention/pane.tsx +79 -23
- package/src/plugins/builtin/company-attention/signals-model.ts +229 -0
- package/src/plugins/builtin/company-attention/signals.tsx +160 -0
- package/src/plugins/builtin/company-kpis/headless.ts +3 -2
- package/src/plugins/builtin/company-kpis/model.ts +2 -2
- package/src/plugins/builtin/company-kpis/pane.tsx +1 -1
- package/src/plugins/builtin/composite-plugins.ts +2 -1
- package/src/plugins/builtin/congress-trades/headless.ts +1 -1
- package/src/plugins/builtin/connections/index.ts +1 -0
- package/src/plugins/builtin/correlation/headless-schema.ts +3 -2
- package/src/plugins/builtin/correlation/headless.ts +5 -3
- package/src/plugins/builtin/cot/headless.ts +28 -6
- package/src/plugins/builtin/cot/model.ts +12 -0
- package/src/plugins/builtin/cot/pane.tsx +3 -2
- package/src/plugins/builtin/cpi/headless.ts +5 -1
- package/src/plugins/builtin/cpi/pane.tsx +11 -9
- package/src/plugins/builtin/credit-boards/model.ts +2 -0
- package/src/plugins/builtin/credit-documents/headless.ts +1 -1
- package/src/plugins/builtin/crypto-board/client.ts +86 -0
- package/src/plugins/builtin/crypto-board/defi-view.tsx +218 -0
- package/src/plugins/builtin/crypto-board/defi.ts +239 -0
- package/src/plugins/builtin/crypto-board/headless.ts +117 -6
- package/src/plugins/builtin/crypto-board/index.tsx +8 -3
- package/src/plugins/builtin/crypto-board/model.ts +40 -8
- package/src/plugins/builtin/crypto-board/pane.tsx +55 -21
- package/src/plugins/builtin/crypto-board/series.ts +19 -1
- package/src/plugins/builtin/crypto-etf-flows/client.ts +60 -0
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +132 -0
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +44 -0
- package/src/plugins/builtin/crypto-etf-flows/model.ts +121 -0
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +193 -0
- package/src/plugins/builtin/debug/index.tsx +1 -0
- package/src/plugins/builtin/dividend-yield/index.tsx +1 -1
- package/src/plugins/builtin/docs/index.tsx +1 -1
- package/src/plugins/builtin/docs/pane.tsx +2 -2
- package/src/plugins/builtin/docs/targets.ts +1 -1
- package/src/plugins/builtin/doe/client.ts +5 -1
- package/src/plugins/builtin/doe/headless.ts +12 -6
- package/src/plugins/builtin/doe/model.ts +43 -6
- package/src/plugins/builtin/doe/pane.tsx +18 -11
- package/src/plugins/builtin/earnings/board-model.ts +13 -6
- package/src/plugins/builtin/earnings/board-table.ts +4 -1
- package/src/plugins/builtin/earnings/board.tsx +253 -50
- package/src/plugins/builtin/earnings/calendar-model.ts +188 -0
- package/src/plugins/builtin/earnings/calendar.tsx +338 -0
- package/src/plugins/builtin/earnings/client.ts +4 -3
- package/src/plugins/builtin/earnings/headless.ts +53 -15
- package/src/plugins/builtin/earnings/history-model.ts +53 -36
- package/src/plugins/builtin/earnings/index.tsx +15 -22
- package/src/plugins/builtin/earnings/model.ts +17 -12
- package/src/plugins/builtin/earnings/scope.ts +89 -0
- package/src/plugins/builtin/earnings-calls/calendar.tsx +310 -0
- package/src/plugins/builtin/earnings-calls/data.ts +146 -2
- package/src/plugins/builtin/earnings-calls/headless.ts +151 -9
- package/src/plugins/builtin/earnings-calls/index.tsx +3 -3
- package/src/plugins/builtin/earnings-calls/lock-note.ts +1 -1
- package/src/plugins/builtin/earnings-calls/pane.tsx +149 -31
- package/src/plugins/builtin/earnings-calls/upcoming.ts +195 -0
- package/src/plugins/builtin/earnings-ripple/pane.tsx +10 -5
- package/src/plugins/builtin/econ/calendar-model.ts +132 -20
- package/src/plugins/builtin/econ/detail-view.tsx +48 -10
- package/src/plugins/builtin/econ/fred-catalog.ts +23 -6
- package/src/plugins/builtin/econ/fred-series-map.ts +4 -0
- package/src/plugins/builtin/econ/index.tsx +112 -25
- package/src/plugins/builtin/econ/print-watch.ts +2 -1
- package/src/plugins/builtin/econ/types.ts +32 -1
- package/src/plugins/builtin/econ-statistics/client.ts +16 -3
- package/src/plugins/builtin/econ-statistics/defs.ts +4 -0
- package/src/plugins/builtin/econ-statistics/detail.tsx +2 -2
- package/src/plugins/builtin/econ-statistics/headless.ts +13 -2
- package/src/plugins/builtin/econ-statistics/index.tsx +3 -3
- package/src/plugins/builtin/econ-statistics/pane.tsx +2 -1
- package/src/plugins/builtin/econ-statistics/stats.ts +103 -0
- package/src/plugins/builtin/econ-statistics/view.ts +16 -1
- package/src/plugins/builtin/equity-screener/client.ts +21 -3
- package/src/plugins/builtin/equity-screener/headless.ts +68 -6
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +6 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +45 -10
- package/src/plugins/builtin/equity-screener/screen-check.ts +90 -0
- package/src/plugins/builtin/equity-screener/ticker-check.tsx +148 -0
- package/src/plugins/builtin/estimate-revisions/headless.ts +3 -1
- package/src/plugins/builtin/estimate-revisions/lock-note.ts +3 -3
- package/src/plugins/builtin/estimate-revisions/model.ts +8 -10
- package/src/plugins/builtin/exposure/headless.ts +51 -6
- package/src/plugins/builtin/exposure/index.tsx +28 -2
- package/src/plugins/builtin/exposure/model.ts +7 -0
- package/src/plugins/builtin/exposure/pane.tsx +6 -1
- package/src/plugins/builtin/fear-greed/index.tsx +1 -1
- package/src/plugins/builtin/filing-events/index.tsx +1 -1
- package/src/plugins/builtin/futures/model.ts +10 -9
- package/src/plugins/builtin/futures/returns.ts +8 -36
- package/src/plugins/builtin/futures/table.tsx +1 -1
- package/src/plugins/builtin/futures-curve/client.ts +40 -9
- package/src/plugins/builtin/futures-curve/headless.ts +39 -17
- package/src/plugins/builtin/futures-curve/model.ts +258 -69
- package/src/plugins/builtin/futures-curve/pane.tsx +46 -17
- package/src/plugins/builtin/fx-matrix/client.ts +15 -8
- package/src/plugins/builtin/fx-matrix/headless.ts +32 -14
- package/src/plugins/builtin/fx-matrix/index.tsx +13 -11
- package/src/plugins/builtin/fx-matrix/live-legs.ts +22 -0
- package/src/plugins/builtin/fx-matrix/settings.ts +2 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/help/index.tsx +13 -3
- package/src/plugins/builtin/holders/beneficial-model.ts +8 -11
- package/src/plugins/builtin/holders/beneficial-report.ts +6 -5
- package/src/plugins/builtin/holders/beneficial-view.tsx +7 -3
- package/src/plugins/builtin/holders/client.ts +13 -1
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +46 -7
- package/src/plugins/builtin/holders/index-holders.ts +264 -0
- package/src/plugins/builtin/holders/pane.tsx +79 -15
- package/src/plugins/builtin/holders/report-rows.ts +35 -7
- package/src/plugins/builtin/holders/table-model.ts +2 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/headless.ts +1 -1
- package/src/plugins/builtin/insider/signals-client.ts +1 -1
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/ipo-calendar/pane.tsx +7 -4
- package/src/plugins/builtin/iv-history/client.ts +20 -0
- package/src/plugins/builtin/iv-history/headless.ts +4 -4
- package/src/plugins/builtin/iv-history/index.tsx +1 -1
- package/src/plugins/builtin/iv-history/model.ts +13 -4
- package/src/plugins/builtin/iv-history/series.ts +3 -1
- package/src/plugins/builtin/jobs/lock-note.ts +1 -1
- package/src/plugins/builtin/jobs/model.ts +4 -15
- package/src/plugins/builtin/jobs/pane.tsx +7 -5
- package/src/plugins/builtin/jobs/share-bars.tsx +11 -5
- package/src/plugins/builtin/jodi/pane.tsx +10 -4
- package/src/plugins/builtin/layout-manager/index.tsx +1 -0
- package/src/plugins/builtin/macro-day/headless.ts +20 -7
- package/src/plugins/builtin/macro-day/index.tsx +3 -2
- package/src/plugins/builtin/macro-day/model.ts +29 -8
- package/src/plugins/builtin/macro-day/pane.tsx +46 -10
- package/src/plugins/builtin/macro-day/releases.ts +55 -13
- package/src/plugins/builtin/market-heatmap/data.ts +9 -2
- package/src/plugins/builtin/market-heatmap/evidence.ts +1 -1
- package/src/plugins/builtin/market-heatmap/headless.ts +9 -6
- package/src/plugins/builtin/market-heatmap/index.tsx +3 -3
- package/src/plugins/builtin/market-heatmap/model.ts +10 -7
- package/src/plugins/builtin/market-movers/client.ts +33 -19
- package/src/plugins/builtin/market-movers/headless.ts +8 -2
- package/src/plugins/builtin/market-movers/index.tsx +16 -10
- package/src/plugins/builtin/market-movers/screener.ts +29 -8
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -2
- package/src/plugins/builtin/market-movers/session-table.ts +4 -2
- package/src/plugins/builtin/market-movers/table.ts +4 -1
- package/src/plugins/builtin/market-valuation/headless.ts +2 -0
- package/src/plugins/builtin/market-valuation/view.ts +5 -0
- package/src/plugins/builtin/members/headless.ts +6 -5
- package/src/plugins/builtin/members/pane.tsx +11 -4
- package/src/plugins/builtin/mna/client.ts +1 -0
- package/src/plugins/builtin/mna/detail.tsx +20 -32
- package/src/plugins/builtin/mna/distress/detail.tsx +16 -4
- package/src/plugins/builtin/mna/distress/model.ts +3 -2
- package/src/plugins/builtin/mna/distress/pane.tsx +7 -4
- package/src/plugins/builtin/mna/headless.ts +6 -13
- package/src/plugins/builtin/mna/model.ts +93 -15
- package/src/plugins/builtin/mna/pane.tsx +5 -4
- package/src/plugins/builtin/news/headless.ts +12 -6
- package/src/plugins/builtin/news/index.tsx +10 -1
- package/src/plugins/builtin/news/wire/index.tsx +3 -2
- package/src/plugins/builtin/news/wire/news/command-bar-search.ts +26 -10
- package/src/plugins/builtin/news/wire/news/query-presets.ts +6 -2
- package/src/plugins/builtin/news/wire/rss/cli.ts +3 -3
- package/src/plugins/builtin/notes/cli.ts +49 -14
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/view.tsx +10 -10
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-scenario/client.ts +123 -28
- package/src/plugins/builtin/options-scenario/collar.ts +8 -6
- package/src/plugins/builtin/options-scenario/csp-screen-headless.ts +127 -0
- package/src/plugins/builtin/options-scenario/csp-screen-pane.tsx +165 -0
- package/src/plugins/builtin/options-scenario/csp-screen.ts +258 -0
- package/src/plugins/builtin/options-scenario/csp.ts +101 -21
- package/src/plugins/builtin/options-scenario/headless.ts +36 -15
- package/src/plugins/builtin/options-scenario/hedge.ts +20 -14
- package/src/plugins/builtin/options-scenario/index.tsx +28 -3
- package/src/plugins/builtin/options-scenario/model.ts +13 -0
- package/src/plugins/builtin/options-scenario/pane.tsx +9 -5
- package/src/plugins/builtin/perps/equity-row.tsx +11 -3
- package/src/plugins/builtin/perps/freshness.ts +8 -5
- package/src/plugins/builtin/perps/headless.ts +3 -1
- package/src/plugins/builtin/perps/list-perpetuals.ts +25 -4
- package/src/plugins/builtin/perps/live-rows.ts +161 -0
- package/src/plugins/builtin/perps/markets-section.tsx +154 -0
- package/src/plugins/builtin/perps/pane.tsx +36 -17
- package/src/plugins/builtin/perps/venue-markets.ts +96 -0
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -1
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +143 -59
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +72 -24
- package/src/plugins/builtin/portfolio-list/cli/portfolio-command.ts +158 -141
- package/src/plugins/builtin/portfolio-list/cli/render.ts +49 -20
- package/src/plugins/builtin/portfolio-list/cli/shared.ts +3 -3
- package/src/plugins/builtin/portfolio-list/cli/watchlist-command.ts +29 -24
- package/src/plugins/builtin/portfolio-list/headless.ts +6 -3
- package/src/plugins/builtin/portfolio-list/income.ts +13 -2
- package/src/plugins/builtin/portfolio-list/index.tsx +9 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +21 -8
- package/src/plugins/builtin/portfolio-list/pane/purchase-date-fx.ts +46 -0
- package/src/plugins/builtin/portfolio-list/summary/live-accounts.ts +16 -9
- package/src/plugins/builtin/portfolio-list/summary/totals.ts +2 -15
- package/src/plugins/builtin/power/client.ts +4 -1
- package/src/plugins/builtin/power/evidence.ts +22 -7
- package/src/plugins/builtin/power/gas.tsx +5 -1
- package/src/plugins/builtin/power/pane.tsx +8 -1
- package/src/plugins/builtin/power/prices.tsx +10 -3
- package/src/plugins/builtin/research/analyst-headless.ts +25 -8
- package/src/plugins/builtin/research/analyst-model.ts +68 -3
- package/src/plugins/builtin/research/corporate-actions-pane.tsx +63 -14
- package/src/plugins/builtin/research/event-model.ts +3 -1
- package/src/plugins/builtin/research/event-sources.ts +12 -4
- package/src/plugins/builtin/research/index.tsx +2 -1
- package/src/plugins/builtin/research/relative-valuation-basis.ts +58 -0
- package/src/plugins/builtin/research/relative-valuation-columns.ts +31 -2
- package/src/plugins/builtin/research/relative-valuation-currency.ts +12 -5
- package/src/plugins/builtin/research/relative-valuation-headless.ts +84 -26
- package/src/plugins/builtin/research/relative-valuation-model.ts +88 -19
- package/src/plugins/builtin/research/relative-valuation-pane.tsx +76 -9
- package/src/plugins/builtin/research/relative-valuation-peers.ts +1 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +6 -2
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/sec/forms.ts +13 -0
- package/src/plugins/builtin/sec/fund-abroad.ts +32 -0
- package/src/plugins/builtin/sec/fund-facts.ts +68 -8
- package/src/plugins/builtin/sec/headless.ts +85 -8
- package/src/plugins/builtin/sec/index.tsx +58 -12
- package/src/plugins/builtin/sectors/client.ts +2 -1
- package/src/plugins/builtin/sectors/sector-model.ts +11 -15
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/broker-reconnect.ts +107 -22
- package/src/plugins/builtin/shared/cloud-upgrade.ts +34 -6
- package/src/plugins/builtin/shared/earnings-calendar.ts +375 -0
- package/src/plugins/builtin/{earnings/estimate-basis.ts → shared/earnings-estimate-basis.ts} +1 -1
- package/src/plugins/builtin/shared/earnings-report.ts +3 -3
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +23 -1
- package/src/plugins/builtin/shared/job-posting.ts +129 -0
- package/src/plugins/builtin/shared/pro-lock-note.ts +3 -3
- package/src/plugins/builtin/shared/report-freshness.ts +3 -0
- package/src/plugins/builtin/shared/research-trading.tsx +21 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/short-interest/client.ts +2 -0
- package/src/plugins/builtin/short-interest/headless.ts +41 -12
- package/src/plugins/builtin/short-interest/index.tsx +23 -1
- package/src/plugins/builtin/short-interest/model.ts +70 -19
- package/src/plugins/builtin/short-interest/pane.tsx +19 -2
- package/src/plugins/builtin/short-interest/publications-client.ts +82 -0
- package/src/plugins/builtin/short-interest/publications-headless.ts +29 -0
- package/src/plugins/builtin/short-interest/publications-model.ts +50 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +66 -0
- package/src/plugins/builtin/short-interest/schedule.ts +35 -2
- package/src/plugins/builtin/short-interest/surface.tsx +11 -4
- package/src/plugins/builtin/short-interest/types.ts +9 -0
- package/src/plugins/builtin/short-interest/watch-client.ts +14 -8
- package/src/plugins/builtin/short-interest/watch-model.ts +12 -25
- package/src/plugins/builtin/short-interest/watch-pane.tsx +5 -1
- package/src/plugins/builtin/supply-chain/flow.tsx +33 -9
- package/src/plugins/builtin/supply-chain/model.ts +51 -3
- package/src/plugins/builtin/supply-chain/pane.tsx +78 -39
- package/src/plugins/builtin/supply-chain/row-evidence.tsx +1 -1
- package/src/plugins/builtin/themes/headless.ts +8 -5
- package/src/plugins/builtin/themes/model.ts +14 -4
- package/src/plugins/builtin/themes/pane.tsx +24 -5
- package/src/plugins/builtin/thirteenf/headless.ts +5 -5
- package/src/plugins/builtin/thirteenf/signals.ts +3 -1
- package/src/plugins/builtin/ticker-detail/adr-pair/headless.ts +123 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/model.ts +132 -0
- package/src/plugins/builtin/ticker-detail/adr-pair/tab.tsx +87 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +40 -26
- package/src/plugins/builtin/ticker-detail/data-panes/history-bars.ts +8 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +67 -3
- package/src/plugins/builtin/ticker-detail/data-panes/returns-model.ts +112 -5
- package/src/plugins/builtin/ticker-detail/data-panes/returns-pane.tsx +17 -2
- package/src/plugins/builtin/ticker-detail/financials/aggregation.ts +21 -7
- package/src/plugins/builtin/ticker-detail/financials/model.ts +36 -1
- package/src/plugins/builtin/ticker-detail/financials/offerings.ts +56 -0
- package/src/plugins/builtin/ticker-detail/financials/ratios.ts +62 -13
- package/src/plugins/builtin/ticker-detail/financials/tab.tsx +30 -4
- package/src/plugins/builtin/ticker-detail/headless-schema.ts +14 -2
- package/src/plugins/builtin/ticker-detail/headless.ts +148 -35
- package/src/plugins/builtin/ticker-detail/index.tsx +37 -5
- package/src/plugins/builtin/ticker-detail/overview/model.ts +65 -10
- package/src/plugins/builtin/ticker-detail/overview/pane.tsx +9 -1
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +68 -11
- package/src/plugins/builtin/ticker-detail/pane.tsx +11 -0
- package/src/plugins/builtin/ticker-detail/quote-footer.ts +8 -3
- package/src/plugins/builtin/ticker-detail/research-tabs.ts +11 -0
- package/src/plugins/builtin/vol-surface/client.ts +5 -4
- package/src/plugins/builtin/vol-surface/headless.ts +12 -3
- package/src/plugins/builtin/vol-surface/model.ts +4 -2
- package/src/plugins/builtin/volatility/model.ts +5 -10
- package/src/plugins/builtin/world-venue-map/basemap-layer.tsx +4 -3
- package/src/plugins/builtin/world-venue-map/basemap.ts +3 -1
- package/src/plugins/builtin/world-venue-map/chokepoint-chart.ts +40 -0
- package/src/plugins/builtin/world-venue-map/evidence.ts +1 -1
- package/src/plugins/builtin/world-venue-map/geo-series.ts +90 -11
- package/src/plugins/builtin/world-venue-map/headless.ts +1 -1
- package/src/plugins/builtin/world-venue-map/index.ts +3 -26
- package/src/plugins/builtin/world-venue-map/layers.ts +1 -1
- package/src/plugins/builtin/world-venue-map/map.tsx +2 -1
- package/src/plugins/builtin/world-venue-map/pane.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/venue-header.tsx +15 -4
- package/src/plugins/builtin/yield-curve/client.ts +25 -0
- package/src/plugins/builtin/yield-curve/curves.ts +7 -4
- package/src/plugins/builtin/yield-curve/headless.ts +38 -4
- package/src/plugins/builtin/yield-curve/history.ts +4 -3
- package/src/plugins/builtin/yield-curve/index.tsx +12 -6
- package/src/plugins/builtin/yield-curve/swaps-model.ts +93 -0
- package/src/plugins/builtin/yield-curve/swaps.tsx +99 -0
- package/src/plugins/bundle.ts +1 -1
- package/src/plugins/catalog-browser.ts +2 -1
- package/src/plugins/compat.ts +3 -3
- package/src/plugins/dependencies.ts +75 -14
- package/src/plugins/extracted-plugins.ts +132 -34
- package/src/plugins/host-link.ts +149 -34
- package/src/plugins/installer.ts +35 -10
- package/src/plugins/loader.ts +206 -38
- package/src/plugins/manager-node.ts +2 -2
- package/src/plugins/marketplace/deactivation.ts +22 -0
- package/src/plugins/marketplace/model.ts +2 -2
- package/src/plugins/marketplace/packs.ts +1 -1
- package/src/plugins/ownership.ts +1 -1
- package/src/plugins/peer-retry.ts +155 -0
- package/src/plugins/registry/contributions.ts +3 -1
- package/src/plugins/registry/index.ts +4 -3
- package/src/plugins/registry/plugin-state.ts +3 -0
- package/src/plugins/seed-notice.ts +20 -0
- package/src/plugins/shortcut-argument.ts +39 -0
- package/src/portfolio/allocation.ts +1 -1
- package/src/portfolio/collection-name.ts +31 -0
- package/src/portfolio/column-values.ts +10 -8
- package/src/portfolio/cost-fx.ts +296 -19
- package/src/portfolio/manual-lots.ts +75 -0
- package/src/portfolio/mutations.ts +60 -22
- package/src/portfolio/suffixed-listings.ts +209 -0
- package/src/portfolio/totals-currency.ts +24 -0
- package/src/public/__snapshots__/public-api.test.ts.snap +14 -0
- package/src/public/time-series.ts +11 -8
- package/src/remote/schema.ts +1 -1
- package/src/renderers/browser/config-host.ts +3 -0
- package/src/renderers/browser/main.tsx +23 -3
- package/src/renderers/dom/boot-frame-page.ts +187 -0
- package/src/renderers/dom/boot-frame.ts +237 -0
- package/src/renderers/dom/build-assets.ts +46 -8
- package/src/renderers/dom/dom-ui-host.tsx +4 -29
- package/src/renderers/dom/host/ascii-text.ts +16 -2
- package/src/renderers/dom/host/box.tsx +43 -2
- package/src/renderers/dom/host/chart-surface.tsx +2 -0
- package/src/renderers/dom/host/hls.chunk.ts +3 -0
- package/src/renderers/dom/host/image-surface.tsx +49 -0
- package/src/renderers/dom/host/media-surface.tsx +24 -18
- package/src/renderers/dom/host/mouse.ts +30 -0
- package/src/renderers/dom/host/size-observer.ts +1 -1
- package/src/renderers/dom/host/style.ts +1 -1
- package/src/renderers/dom/styles.css +76 -0
- package/src/renderers/dom/test-utils.tsx +2 -1
- package/src/renderers/electrobun/bun/application-menu/index.ts +3 -3
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +46 -3
- package/src/renderers/electrobun/bun/desktop/detached-windows.ts +1 -1
- package/src/renderers/electrobun/bun/desktop/host-requests.ts +9 -3
- package/src/renderers/electrobun/bun/desktop/initialization.ts +81 -18
- package/src/renderers/electrobun/bun/external-plugins.ts +29 -7
- package/src/renderers/electrobun/bun/index.ts +11 -1
- package/src/renderers/electrobun/bun/window/boot-frame.ts +67 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -1
- package/src/renderers/electrobun/shared/boot-frame.ts +7 -0
- package/src/renderers/electrobun/shared/protocol.ts +6 -1
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +1 -1
- package/src/renderers/electrobun/view/config-host.ts +3 -0
- package/src/renderers/electrobun/view/fatal-screen.tsx +1 -1
- package/src/renderers/electrobun/view/main.tsx +30 -4
- package/src/renderers/electrobun/view/news-source.ts +5 -5
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -1
- package/src/renderers/electrobun/view/ui-host.tsx +1 -1
- package/src/renderers/opentui/browser-open.ts +88 -0
- package/src/renderers/opentui/host.tsx +5 -14
- package/src/renderers/opentui/image/loader.ts +3 -2
- package/src/renderers/opentui/native-smoke.ts +10 -1
- package/src/renderers/opentui/pane-image/index.ts +2 -1
- package/src/renderers/opentui/render-lib.ts +253 -0
- package/src/renderers/opentui/render-timing-smoke.ts +1 -1
- package/src/renderers/opentui/start.tsx +1 -1
- package/src/renderers/share/layout-view.tsx +2 -2
- package/src/renderers/share/main.tsx +4 -4
- package/src/renderers/share/view.tsx +1 -1
- package/src/series/resolve.ts +22 -6
- package/src/series/standalone.ts +30 -2
- package/src/series/types.ts +8 -1
- package/src/shares/api.ts +4 -1
- package/src/shares/pane.ts +1 -1
- package/src/sources/gloomberb-cloud/fred-series.ts +46 -1
- package/src/sources/gloomberb-cloud/index.ts +32 -16
- package/src/sources/gloomberb-cloud/news.ts +39 -0
- package/src/sources/gloomberb-cloud/normalizers.ts +14 -1
- package/src/sources/gloomberb-cloud/perpetuals.ts +49 -1
- package/src/sources/listing-symbols.ts +37 -0
- package/src/sources/provider-errors.ts +16 -2
- package/src/sources/provider-router/financial-routes.ts +21 -3
- package/src/sources/provider-router/financials.ts +15 -2
- package/src/sources/provider-router/history.ts +30 -8
- package/src/sources/provider-router/primary.ts +1 -1
- package/src/state/app/bootstrap.ts +23 -0
- package/src/state/hooks/inline-tickers.ts +30 -5
- package/src/sync/controller.ts +1 -1
- package/src/sync/core-contributors.ts +46 -14
- package/src/team/collections-sync.ts +2 -1
- package/src/team/collections.ts +178 -17
- package/src/telemetry/crash-reports.ts +17 -4
- package/src/test-support/builtin-panes.ts +1 -1
- package/src/theme/colors.ts +3 -30
- package/src/theme/ui-tokens.ts +37 -1
- package/src/tickers/company-name-listing.ts +210 -33
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/metadata.ts +10 -0
- package/src/tickers/perpetual-listing.ts +5 -2
- package/src/tickers/search/home-listing.ts +75 -0
- package/src/tickers/search/index.ts +76 -27
- package/src/tickers/search/ranking.ts +54 -4
- package/src/tickers/search/upsert.ts +29 -0
- package/src/tickers/terminal-codes.ts +416 -40
- package/src/time-series/bar-aggregation.ts +243 -0
- package/src/time-series/base-series.ts +307 -0
- package/src/time-series/chart-bounds.ts +349 -0
- package/src/time-series/chart-seed.ts +142 -0
- package/src/time-series/economic.ts +5 -0
- package/src/time-series/fundamentals.ts +18 -3
- package/src/time-series/history-acquisition.ts +499 -0
- package/src/time-series/leverage.ts +100 -0
- package/src/time-series/market-resolution.ts +4 -2
- package/src/time-series/market.ts +2 -1
- package/src/time-series/price-comparison.ts +175 -30
- package/src/time-series/range.ts +9 -1
- package/src/time-series/resolution.ts +174 -16
- package/src/time-series/resolve-context.ts +157 -0
- package/src/time-series/resolve.ts +126 -1577
- package/src/time-series/series-name.ts +38 -0
- package/src/time-series/series-presentation.ts +208 -0
- package/src/time-series/spec.ts +11 -6
- package/src/time-series/studies.ts +109 -12
- package/src/time-series/tail-reconcile.ts +121 -0
- package/src/time-series/types.ts +29 -2
- package/src/time-series/use-chart-resolution.ts +4 -5
- package/src/types/broker.ts +10 -0
- package/src/types/config.ts +14 -0
- package/src/types/data-provider.ts +14 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +76 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/plugin.ts +65 -8
- package/src/types/price-history.ts +2 -0
- package/src/types/ticker.ts +13 -0
- package/src/types/trading.ts +59 -1
- package/src/ui/ascii-font.ts +13 -1
- package/src/ui/host.tsx +6 -1
- package/src/updater/command-names.ts +175 -0
- package/src/updater/index.ts +10 -5
- package/src/utils/calendar-date.ts +32 -15
- package/src/utils/cash-runway.ts +241 -0
- package/src/utils/central-banks.ts +42 -0
- package/src/utils/cli-output.ts +259 -80
- package/src/utils/contract-month.ts +16 -0
- package/src/utils/crypto-pair.ts +61 -3
- package/src/utils/currency-units.ts +29 -0
- package/src/utils/datetime-format.ts +10 -0
- package/src/utils/debug-log.ts +1 -1
- package/src/utils/decimal-comma.ts +39 -6
- package/src/utils/exchange-announcements.ts +71 -0
- package/src/utils/exchange-rate-snapshot.ts +10 -0
- package/src/utils/financial-statements.ts +83 -4
- package/src/utils/format.ts +34 -16
- package/src/utils/fundamentals.ts +150 -34
- package/src/utils/fx-market-hours.ts +10 -1
- package/src/utils/latest-financial-period.ts +8 -0
- package/src/utils/linux-libc.ts +54 -0
- package/src/utils/market-capitalization.ts +111 -15
- package/src/utils/max-drawdown.ts +64 -0
- package/src/utils/network-failure.ts +83 -0
- package/src/utils/option-expiry.ts +139 -7
- package/src/utils/price-earnings.ts +11 -5
- package/src/utils/price-history.ts +18 -8
- package/src/utils/price-window.ts +131 -0
- package/src/utils/release-date.ts +47 -0
- package/src/utils/sec.ts +3 -0
- package/src/utils/throttled-fetch.ts +11 -4
- package/src/utils/trailing-eps.ts +67 -0
- package/src/utils/typed-text.ts +21 -0
- package/src/utils/utc-time.ts +24 -1
- package/src/version.ts +6 -0
- package/src/cli/pane-functions/screenshot.ts +0 -2122
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { HeadlessPaneEntry } from "../../../types/headless";
|
|
2
2
|
import type { PricePoint } from "../../../types/financials";
|
|
3
|
+
import { cleanFloat32Price } from "../../../cli/history-rows";
|
|
3
4
|
import { exportNumber } from "../../../cli/report-tables";
|
|
4
5
|
import { publicTickerKey } from "../../../utils/exchanges";
|
|
5
6
|
import { formatUtcTime } from "../../../utils/utc-time";
|
|
@@ -64,8 +65,9 @@ export function sessionRangeReport(windows: readonly SessionRangeWindow[]): Sess
|
|
|
64
65
|
const listing = publicTickerKey(window.symbol, window.exchange);
|
|
65
66
|
const span = (window.sessionDates?.length ?? 1) > 1 ? "" : "session ";
|
|
66
67
|
const currency = window.quote?.currency?.trim();
|
|
67
|
-
|
|
68
|
-
const
|
|
68
|
+
// As the bars export them: the decimal the feed's float stands for (85.1, not 85.099998).
|
|
69
|
+
const low = cleanFloat32Price(exportNumber(range.low.price));
|
|
70
|
+
const high = cleanFloat32Price(exportNumber(range.high.price));
|
|
69
71
|
const entry = (side: "low" | "high", price: number, at: Date): HeadlessPaneEntry => ({
|
|
70
72
|
key: side === "low" ? "sessionLow" : "sessionHigh",
|
|
71
73
|
label: `${listing} ${span}${side}`,
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { ChartResolution, TimeRange } from "../../../components/chart/core/types";
|
|
2
2
|
import { CHART_RESOLUTIONS, TIME_RANGES as CHART_RANGES } from "../../../time-series/range";
|
|
3
3
|
import { formatChartResolution } from "./viewport-labels";
|
|
4
|
+
import { CHART_BAR_SIZE_PRESETS, parseChartResolution, sortChartBarSizes, type ChartBarSize } from "../../../time-series/resolution";
|
|
5
|
+
|
|
6
|
+
export { CHART_BAR_SIZE_PRESETS };
|
|
4
7
|
import type {
|
|
5
8
|
PaneSettingField,
|
|
6
9
|
PaneSettingOption,
|
|
@@ -32,6 +35,7 @@ import {
|
|
|
32
35
|
type BuiltinStudySelection,
|
|
33
36
|
type PairStudySelection,
|
|
34
37
|
} from "./studies";
|
|
38
|
+
import { dateOptionError, readCalendarDate } from "../../../utils/calendar-date";
|
|
35
39
|
import { buildCustomChartPreset, buildEmptyChartPreset, buildPriceChartPreset } from "./presets";
|
|
36
40
|
import {
|
|
37
41
|
CHART_SPEC_SETTING_KEY,
|
|
@@ -40,6 +44,11 @@ import {
|
|
|
40
44
|
|
|
41
45
|
export { CHART_RANGES, CHART_RESOLUTIONS };
|
|
42
46
|
|
|
47
|
+
/** `sizes` with `current` among them in order of length, when the chart is set to one they lack. */
|
|
48
|
+
export function withChartBarSize<T extends ChartBarSize>(sizes: readonly T[], current: ChartResolution): Array<T | ChartBarSize> {
|
|
49
|
+
return current === "auto" || sizes.includes(current as T) ? [...sizes] : sortChartBarSizes([...sizes, current]);
|
|
50
|
+
}
|
|
51
|
+
|
|
43
52
|
/** Full name and short form for each builtin indicator; the label adds its period. */
|
|
44
53
|
const CHART_STUDY_NAMES: Record<BuiltinStudySelection, { name: string; short?: string; description: string }> = {
|
|
45
54
|
volume: { name: "Volume", description: "Volume columns in a lower panel." },
|
|
@@ -220,27 +229,30 @@ function formatDateWindow(spec: ChartSpec): string {
|
|
|
220
229
|
}
|
|
221
230
|
|
|
222
231
|
function parseDate(value: string): string {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
232
|
+
const date = readCalendarDate(value);
|
|
233
|
+
if (!date) throw new Error(dateOptionError(value.trim(), "", { subject: "a date" }));
|
|
234
|
+
return date;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const WINDOW_SEPARATOR = /\s+(?:to|through)\s+|\s*(?:\.\.|–|—)\s*/i;
|
|
238
|
+
|
|
239
|
+
/** The two dates of a window: around "to", "through", ".." or a dash, or around a comma between dates that have none of their own (2026-10-01, 2026-10-20). */
|
|
240
|
+
function splitDateWindow(text: string): string[] | null {
|
|
241
|
+
const words = text.split(WINDOW_SEPARATOR);
|
|
242
|
+
if (words.length === 2 && words.every(Boolean)) return words;
|
|
243
|
+
const commas = text.split(/\s*,\s*/);
|
|
244
|
+
return commas.length === 2 && commas.every((part) => readCalendarDate(part) != null) ? commas : null;
|
|
231
245
|
}
|
|
232
246
|
|
|
233
247
|
function parseDateWindow(value: string): { start: string; end: string } | undefined {
|
|
234
248
|
const trimmed = value.trim();
|
|
235
249
|
if (!trimmed) return undefined;
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
if (!match) {
|
|
240
|
-
throw new Error("Use YYYY-MM-DD to YYYY-MM-DD, or leave blank for the preset range.");
|
|
250
|
+
const parts = splitDateWindow(trimmed);
|
|
251
|
+
if (!parts) {
|
|
252
|
+
throw new Error("Use two dates as YYYY-MM-DD to YYYY-MM-DD, or leave blank for the preset range.");
|
|
241
253
|
}
|
|
242
|
-
const start = parseDate(
|
|
243
|
-
const end = parseDate(
|
|
254
|
+
const start = parseDate(parts[0]!);
|
|
255
|
+
const end = parseDate(parts[1]!);
|
|
244
256
|
if (start > end) throw new Error("The start date must be before the end date.");
|
|
245
257
|
return { start, end };
|
|
246
258
|
}
|
|
@@ -355,8 +367,8 @@ export function applyChartComposerPaneSetting(
|
|
|
355
367
|
break;
|
|
356
368
|
}
|
|
357
369
|
case CHART_SETTING_KEYS.resolution: {
|
|
358
|
-
const resolution = requireString(value, "Resolution")
|
|
359
|
-
if (!
|
|
370
|
+
const resolution = parseChartResolution(requireString(value, "Resolution"));
|
|
371
|
+
if (!resolution) throw new Error("Choose a valid chart resolution.");
|
|
360
372
|
nextSpec = { ...spec, viewport: { ...spec.viewport, resolution } };
|
|
361
373
|
break;
|
|
362
374
|
}
|
|
@@ -452,7 +464,7 @@ export function buildChartComposerPaneSettingsDef(
|
|
|
452
464
|
{
|
|
453
465
|
key: CHART_SETTING_KEYS.dateWindow,
|
|
454
466
|
label: "Date Window",
|
|
455
|
-
description: "Enter
|
|
467
|
+
description: "Enter two dates, such as 2026-10-01 to 2026-10-20. Leave blank to use the preset range.",
|
|
456
468
|
type: "text",
|
|
457
469
|
placeholder: "2025-01-01 to 2026-01-01",
|
|
458
470
|
},
|
|
@@ -468,7 +480,7 @@ export function buildChartComposerPaneSettingsDef(
|
|
|
468
480
|
label: "Resolution",
|
|
469
481
|
description: "Choose the observation interval, or let the chart select it automatically.",
|
|
470
482
|
type: "select",
|
|
471
|
-
options:
|
|
483
|
+
options: ["auto" as const, ...withChartBarSize(CHART_BAR_SIZE_PRESETS, spec.viewport.resolution)].map((resolution) => ({
|
|
472
484
|
value: resolution,
|
|
473
485
|
label: formatChartResolution(resolution),
|
|
474
486
|
})),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logFailure } from "../../../utils/log-failure";
|
|
1
2
|
import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
|
|
2
3
|
import {
|
|
3
4
|
buildTickerSearchCandidates,
|
|
@@ -5,7 +6,7 @@ import {
|
|
|
5
6
|
} from "../../../tickers/search";
|
|
6
7
|
import { useOptionalAppSelector } from "../../../state/app/context";
|
|
7
8
|
import type { TickerRecord } from "../../../types/ticker";
|
|
8
|
-
import {
|
|
9
|
+
import { searchChartSeriesCatalogs } from "../../../capabilities/chart-series";
|
|
9
10
|
import { SERIES_CATALOG_CAPABILITY_ID } from "../../../series/capability";
|
|
10
11
|
import type { SeriesCatalogEntry } from "../../../series/types";
|
|
11
12
|
import { getSharedRegistry } from "../../registry";
|
|
@@ -105,9 +106,7 @@ export function useRegisteredSeries(): readonly SeriesCatalogEntry[] {
|
|
|
105
106
|
.then((result) => {
|
|
106
107
|
if (!cancelled && Array.isArray(result?.entries)) setRemote(result.entries);
|
|
107
108
|
})
|
|
108
|
-
.catch((
|
|
109
|
-
// The view's own series still list; only the Bun process's extras are missing.
|
|
110
|
-
});
|
|
109
|
+
.catch(logFailure("chart-composer.use-series-catalog", "Load remote chart series catalog failed"));
|
|
111
110
|
return () => { cancelled = true; };
|
|
112
111
|
}, [registry, series]);
|
|
113
112
|
|
|
@@ -274,12 +273,12 @@ export function useSeriesCatalogSuggestions({
|
|
|
274
273
|
const controller = new AbortController();
|
|
275
274
|
setProviderSearch({ query: normalizedQuery, suggestions: [], loading: true, error: null });
|
|
276
275
|
const timer = setTimeout(() => {
|
|
277
|
-
void
|
|
276
|
+
void searchChartSeriesCatalogs(registry, normalizedQuery, MAX_SERIES_SUGGESTIONS, controller.signal).then(({ items, errors }) => {
|
|
278
277
|
if (!cancelled) setProviderSearch({
|
|
279
278
|
query: normalizedQuery,
|
|
280
279
|
suggestions: buildCapabilitySeriesSuggestions(items),
|
|
281
280
|
loading: false,
|
|
282
|
-
error: null,
|
|
281
|
+
error: errors.join(" ") || null,
|
|
283
282
|
});
|
|
284
283
|
}).catch((error: unknown) => {
|
|
285
284
|
if (controller.signal.aborted || cancelled) return;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ChartResolution } from "../../../components/chart/core/types";
|
|
2
|
+
import { chartBarSizeParts, isManualChartResolution, type ManualChartResolution } from "../../../time-series/resolution";
|
|
2
3
|
|
|
3
|
-
const RESOLUTION_LABELS: Record<
|
|
4
|
+
const RESOLUTION_LABELS: Record<ManualChartResolution | "auto", string> = {
|
|
4
5
|
auto: "Auto",
|
|
5
6
|
"1m": "1m",
|
|
6
7
|
"5m": "5m",
|
|
@@ -13,7 +14,7 @@ const RESOLUTION_LABELS: Record<ChartResolution, string> = {
|
|
|
13
14
|
"1mo": "M",
|
|
14
15
|
};
|
|
15
16
|
|
|
16
|
-
const RESOLUTION_NAMES: Record<
|
|
17
|
+
const RESOLUTION_NAMES: Record<ManualChartResolution, string> = {
|
|
17
18
|
"1m": "1-minute",
|
|
18
19
|
"5m": "5-minute",
|
|
19
20
|
"15m": "15-minute",
|
|
@@ -25,19 +26,27 @@ const RESOLUTION_NAMES: Record<Exclude<ChartResolution, "auto">, string> = {
|
|
|
25
26
|
"1mo": "monthly",
|
|
26
27
|
};
|
|
27
28
|
|
|
29
|
+
// Months take MO beyond one (3MO), as 3M and 6M are ranges in the same bar.
|
|
30
|
+
const BUILT_UNIT_LABELS = { m: "m", h: "h", d: "D", wk: "W", mo: "MO" } as const;
|
|
31
|
+
const BUILT_UNIT_NAMES = { m: "minute", h: "hour", d: "day", wk: "week", mo: "month" } as const;
|
|
32
|
+
|
|
28
33
|
/**
|
|
29
34
|
* The one way chart intervals are labelled. Intraday reads in lowercase units
|
|
30
|
-
* (1m, 1h) and daily and longer as D W M,
|
|
31
|
-
*
|
|
35
|
+
* (1m, 1h, 4h) and daily and longer as D W M, with a count when there are
|
|
36
|
+
* several (2D, 2W), so an interval never collides with a range such as 1M
|
|
37
|
+
* (one month) in the same bar.
|
|
32
38
|
*/
|
|
33
39
|
export function formatChartResolution(resolution: ChartResolution): string {
|
|
34
|
-
return RESOLUTION_LABELS[resolution]
|
|
40
|
+
if (resolution === "auto" || isManualChartResolution(resolution)) return RESOLUTION_LABELS[resolution];
|
|
41
|
+
const parts = chartBarSizeParts(resolution);
|
|
42
|
+
return parts ? `${parts.count}${BUILT_UNIT_LABELS[parts.unit]}` : resolution;
|
|
35
43
|
}
|
|
36
44
|
|
|
37
45
|
export function describeChartResolution(resolution: ChartResolution): string {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
if (resolution === "auto") return "Choose an interval automatically for the active range.";
|
|
47
|
+
if (isManualChartResolution(resolution)) return `Use ${RESOLUTION_NAMES[resolution]} observations.`;
|
|
48
|
+
const parts = chartBarSizeParts(resolution);
|
|
49
|
+
return parts ? `Use ${parts.count}-${BUILT_UNIT_NAMES[parts.unit]} observations.` : `Use ${resolution} observations.`;
|
|
41
50
|
}
|
|
42
51
|
|
|
43
52
|
function calendarParts(date: Date, timeZone: string): { key: string; year: number; label: string } {
|
|
@@ -72,6 +81,7 @@ export function formatChartDateWindow(
|
|
|
72
81
|
try {
|
|
73
82
|
new Intl.DateTimeFormat("en-US", { timeZone: zone });
|
|
74
83
|
} catch {
|
|
84
|
+
// Intentional ignore: unsupported exchange time zones use UTC so the date label remains readable.
|
|
75
85
|
zone = "UTC";
|
|
76
86
|
}
|
|
77
87
|
const first = calendarParts(start, zone);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ApiRequestError } from "../../../../api-client/errors";
|
|
2
2
|
import type { ChatAttachment, ChatMessage } from "../../../../api-client";
|
|
3
3
|
import { chatPlainText } from "../markdown";
|
|
4
|
+
import { isNetworkFailure } from "../../../../utils/network-failure";
|
|
4
5
|
|
|
5
6
|
/** What the server takes: four images a message, each up to 5 MB, as PNG, JPEG, WebP or GIF. */
|
|
6
7
|
export const MAX_CHAT_IMAGES = 4;
|
|
@@ -152,7 +153,8 @@ export function describeChatImageError(error: unknown, fallback = "The image cou
|
|
|
152
153
|
if (error.status === 429) return UPLOAD_ERROR_SENTENCES.upload_rate_limited!;
|
|
153
154
|
return fallback;
|
|
154
155
|
}
|
|
155
|
-
|
|
156
|
+
// No answer at all: a browser's TypeError, or the Cloud client's own word for it.
|
|
157
|
+
if (error instanceof TypeError || isNetworkFailure(error)) return `${fallback.replace(/\.$/, "")}. Check your connection and try again.`;
|
|
156
158
|
if (error instanceof Error && error.message.trim()) return error.message.trim();
|
|
157
159
|
return fallback;
|
|
158
160
|
}
|
|
@@ -578,7 +578,7 @@ export function ChatContent({
|
|
|
578
578
|
}, [createPaneFromTemplate, notify, rendererHost]);
|
|
579
579
|
|
|
580
580
|
const handleDiscordCommand = useCallback((command: DiscordComposerCommand) => {
|
|
581
|
-
void runDiscordCommand(command, { openUrl: (url) => rendererHost.openExternal(url) }).then(notify);
|
|
581
|
+
void runDiscordCommand(command, { openUrl: async (url) => { await rendererHost.openExternal(url); } }).then(notify);
|
|
582
582
|
}, [notify, rendererHost]);
|
|
583
583
|
|
|
584
584
|
// The terminal: a pasted or dropped path to an image file attaches the file
|
|
@@ -22,7 +22,7 @@ export function openChatPaneLink(link: ChatMessagePaneLink, actions: PaneLinkAct
|
|
|
22
22
|
}
|
|
23
23
|
const target = wirePaneTarget(link.link);
|
|
24
24
|
if (!chatPaneLinkPane(target.paneId)) {
|
|
25
|
-
actions.notify({ body: "That pane is not available in this version of
|
|
25
|
+
actions.notify({ body: "That pane is not available in this version of Gloom.", type: "info" });
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
actions.createPaneFromTemplate(target.templateId, target.arg ? { arg: target.arg } : undefined);
|
|
@@ -8,7 +8,7 @@ import { isManagedBot } from "./ghost-user";
|
|
|
8
8
|
/**
|
|
9
9
|
* Who someone is in chat, at a glance: a bot's own colour, the icons their
|
|
10
10
|
* account earns, their local time and what they trade. The server derives
|
|
11
|
-
* each from the account
|
|
11
|
+
* each from the account; a field it leaves out shows nothing.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
type ChatPersonIconId = "bot" | "team" | "pro";
|
|
@@ -62,6 +62,8 @@ export interface ClinicalTrial {
|
|
|
62
62
|
firstSubmitDate: Date | null;
|
|
63
63
|
/** When the registry first posted the study. */
|
|
64
64
|
firstPostDate: Date | null;
|
|
65
|
+
/** When the registry last posted a change to the study; the list is newest first by it. */
|
|
66
|
+
lastUpdatePostDate: Date | null;
|
|
65
67
|
/** Deep link to the study page for [o]pen. */
|
|
66
68
|
url: string;
|
|
67
69
|
}
|
|
@@ -173,6 +175,7 @@ export function parseClinicalTrial(raw: unknown): ClinicalTrial | null {
|
|
|
173
175
|
completionDateType: completion.type,
|
|
174
176
|
firstSubmitDate: asDate(statusModule.studyFirstSubmitDate),
|
|
175
177
|
firstPostDate: asDate(moduleOf(statusModule, "studyFirstPostDateStruct").date),
|
|
178
|
+
lastUpdatePostDate: asDate(moduleOf(statusModule, "lastUpdatePostDateStruct").date),
|
|
176
179
|
url: `${CLINICAL_TRIALS_STUDY_BASE_URL}/${nctId}`,
|
|
177
180
|
};
|
|
178
181
|
}
|
|
@@ -221,7 +224,7 @@ function areaClause(area: string, values: string[]): string | null {
|
|
|
221
224
|
|
|
222
225
|
/**
|
|
223
226
|
* Build the v2 studies URL. Pure: no network, no API key. The most recently
|
|
224
|
-
*
|
|
227
|
+
* updated studies come first, the order the pane lists them in, so each page
|
|
225
228
|
* continues the one before it. Filters go to the registry with the search, so
|
|
226
229
|
* every page it returns already matches them.
|
|
227
230
|
*/
|
|
@@ -229,7 +232,7 @@ export function buildStudiesUrl(query: StudiesQuery = {}): string {
|
|
|
229
232
|
const params = new URLSearchParams();
|
|
230
233
|
params.set("format", "json");
|
|
231
234
|
params.set("pageSize", String(query.pageSize ?? DEFAULT_PAGE_SIZE));
|
|
232
|
-
params.set("sort", "
|
|
235
|
+
params.set("sort", "LastUpdatePostDate:desc");
|
|
233
236
|
params.set("fields", STUDY_FIELDS);
|
|
234
237
|
const term = query.term?.trim();
|
|
235
238
|
if (term) params.set("query.term", term);
|
|
@@ -228,7 +228,7 @@ export const TRIAL_REPORT_OPTIONS: readonly PaneReportOptionDef[] = [
|
|
|
228
228
|
},
|
|
229
229
|
];
|
|
230
230
|
|
|
231
|
-
type TrialColumnId = "
|
|
231
|
+
type TrialColumnId = "updated" | "phase" | "status" | "title" | "sponsor" | "ticker";
|
|
232
232
|
export type TrialColumn = DataTableColumn & { id: TrialColumnId };
|
|
233
233
|
|
|
234
234
|
export interface TrialLayout {
|
|
@@ -251,12 +251,12 @@ const TABLE_CHROME = 1 + 2;
|
|
|
251
251
|
export function trialLayout(width: number): TrialLayout {
|
|
252
252
|
const compact = width < 90;
|
|
253
253
|
const wide = width >= 140;
|
|
254
|
-
// Narrower than a terminal, the
|
|
254
|
+
// Narrower than a terminal, the update date gives way to the title: the list
|
|
255
255
|
// is newest first and the detail has the date.
|
|
256
256
|
const timed = width >= 76;
|
|
257
257
|
const fixed: TrialColumn[] = [
|
|
258
|
-
//
|
|
259
|
-
...(timed ? [{ id: "
|
|
258
|
+
// An ISO day, as every date column reads.
|
|
259
|
+
...(timed ? [{ id: "updated" as const, label: "Updated", width: 10, align: "left" as const }] : []),
|
|
260
260
|
{ id: "phase", label: "Phase", width: compact ? 7 : 9, align: "left" },
|
|
261
261
|
{ id: "status", label: "Status", width: wide ? 23 : 11, align: "left" },
|
|
262
262
|
{ id: "sponsor", label: "Sponsor", width: wide ? 30 : compact ? 15 : 22, align: "left" },
|
|
@@ -267,3 +267,12 @@ export function trialLayout(width: number): TrialLayout {
|
|
|
267
267
|
const statusAt = fixed.findIndex((column) => column.id === "status") + 1;
|
|
268
268
|
return { compact, showVenue: wide, columns: [...fixed.slice(0, statusAt), title, ...fixed.slice(statusAt)] };
|
|
269
269
|
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* A search typed as a ticker (`TRIAL VKTX`): one to five letters, with a
|
|
273
|
+
* share class. The registry knows sponsors by name, so a symbol no study
|
|
274
|
+
* mentions is looked up as its company.
|
|
275
|
+
*/
|
|
276
|
+
export function looksLikeTicker(term: string): boolean {
|
|
277
|
+
return /^[A-Za-z]{1,5}(?:[.-][A-Za-z])?$/.test(term.trim());
|
|
278
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
2
|
import {
|
|
3
3
|
DataTableStackView,
|
|
4
4
|
PaneLinkMenu,
|
|
@@ -22,6 +22,7 @@ import { usePaneRefreshKey } from "../../../components/data-table/table-pane";
|
|
|
22
22
|
import { DetailReader, type DetailFact } from "../../../components/reader/detail-reader";
|
|
23
23
|
import { tf } from "../../../i18n";
|
|
24
24
|
import {
|
|
25
|
+
useAssetData,
|
|
25
26
|
useDebouncedPluginPaneState,
|
|
26
27
|
usePaneSettingValue,
|
|
27
28
|
usePluginPaneState,
|
|
@@ -30,7 +31,6 @@ import { useThemeColors } from "../../../theme/theme-context";
|
|
|
30
31
|
import type { ThemeColors } from "../../../theme/colors";
|
|
31
32
|
import type { PaneProps } from "../../../types/plugin";
|
|
32
33
|
import { Box, Text, TextAttributes, type ScrollBoxRenderable } from "../../../ui";
|
|
33
|
-
import { formatTimeAgo } from "../../../utils/datetime-format";
|
|
34
34
|
import { isPlainArrowUp, stopSearchFocusNavigation } from "../../../utils/search-focus-navigation";
|
|
35
35
|
import { useOpenDescription } from "../shared/open-description";
|
|
36
36
|
import { useResearchCloudSession } from "../shared/research-cloud-session";
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
SPONSOR_FILTER_OPTIONS,
|
|
42
42
|
STATUS_FILTER_OPTIONS,
|
|
43
43
|
keepsToneWhenSelected,
|
|
44
|
+
looksLikeTicker,
|
|
44
45
|
normalizeTrialFilters,
|
|
45
46
|
sponsorClassLabel,
|
|
46
47
|
trialFiltersNarrow,
|
|
@@ -56,6 +57,7 @@ import {
|
|
|
56
57
|
type TrialFilters,
|
|
57
58
|
} from "./model";
|
|
58
59
|
import { useSponsorTickers, type SponsorTicker } from "./sponsor-tickers";
|
|
60
|
+
import { tickerSponsorName } from "./ticker-sponsor";
|
|
59
61
|
import { CLINICAL_TRIALS_PANE_ID } from "./types";
|
|
60
62
|
|
|
61
63
|
const SEARCH_DEBOUNCE_MS = 250;
|
|
@@ -68,8 +70,8 @@ function formatDate(date: Date | null, precision: DatePrecision = "day", type?:
|
|
|
68
70
|
return type === "ESTIMATED" ? `${text} (est.)` : text;
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
/** When the study was posted
|
|
72
|
-
function
|
|
73
|
+
/** When the study was posted. */
|
|
74
|
+
function trialPosted(trial: ClinicalTrial): Date | null {
|
|
73
75
|
return trial.firstPostDate ?? trial.firstSubmitDate;
|
|
74
76
|
}
|
|
75
77
|
|
|
@@ -123,7 +125,8 @@ function trialFacts(trial: ClinicalTrial, ticker: SponsorTicker | undefined, col
|
|
|
123
125
|
{ label: "Enrollment", value: trial.enrollment != null ? trial.enrollment.toLocaleString("en-US") : "-" },
|
|
124
126
|
{ label: "Registry ID", value: trial.nctId },
|
|
125
127
|
{ label: "Start", value: formatDate(trial.startDate, trial.startDatePrecision, trial.startDateType) },
|
|
126
|
-
{ label: "Posted", value: formatDate(
|
|
128
|
+
{ label: "Posted", value: formatDate(trialPosted(trial)) },
|
|
129
|
+
{ label: "Updated", value: formatDate(trial.lastUpdatePostDate) },
|
|
127
130
|
{ label: "Primary completion", value: formatDate(trial.primaryCompletionDate, trial.primaryCompletionDatePrecision, trial.primaryCompletionDateType) },
|
|
128
131
|
{ label: "Completion", value: formatDate(trial.completionDate, trial.completionDatePrecision, trial.completionDateType) },
|
|
129
132
|
{ label: "Conditions", value: trial.conditions.length > 0 ? trial.conditions.join(", ") : "None listed" },
|
|
@@ -137,6 +140,7 @@ function filterOptions(options: readonly TrialFilterOption[], colors: ThemeColor
|
|
|
137
140
|
export function TrialsPane({ width, height, focused }: PaneProps) {
|
|
138
141
|
const colors = useThemeColors();
|
|
139
142
|
const client = useMemo(() => new ClinicalTrialsClient(), []);
|
|
143
|
+
const dataProvider = useAssetData();
|
|
140
144
|
const openDescription = useOpenDescription();
|
|
141
145
|
const session = useResearchCloudSession();
|
|
142
146
|
|
|
@@ -156,7 +160,7 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
|
|
|
156
160
|
|
|
157
161
|
const [selectedId, setSelectedId] = useDebouncedPluginPaneState<string | null>("selectedId", null);
|
|
158
162
|
// The open study is what the pane shows, so a reload or a shared layout opens it again.
|
|
159
|
-
// `open` (a share, `
|
|
163
|
+
// `open` (a share, `gloom shot TRIAL obesity --open NCT07868939`) opens one study first.
|
|
160
164
|
const [initialOpen] = usePaneSettingValue("open", "");
|
|
161
165
|
const [openItemId, setOpenItemId] = usePluginPaneState<string | null>("openItemId", String(initialOpen ?? "").trim() || null);
|
|
162
166
|
const { active: searchFocused, focus: focusSearch, searchProps } = useQueryBarSearch();
|
|
@@ -230,7 +234,24 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
|
|
|
230
234
|
studies.reload();
|
|
231
235
|
sponsorTickers.retry();
|
|
232
236
|
}, [sponsorTickers, studies]);
|
|
233
|
-
|
|
237
|
+
// `TRIAL VKTX`: no study names a symbol, so one that finds nothing is
|
|
238
|
+
// searched as its company's name, quoted so the registry matches the whole
|
|
239
|
+
// name as a sponsor files it, and the search box then shows it. Each term
|
|
240
|
+
// is looked up once.
|
|
241
|
+
const [looked, setLooked] = useState<ReadonlySet<string>>(() => new Set());
|
|
242
|
+
const resolvingTicker = studies.status === "loaded" && trials.length === 0 && !studies.error
|
|
243
|
+
&& looksLikeTicker(term) && !looked.has(term.toUpperCase());
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
if (!resolvingTicker) return;
|
|
246
|
+
let live = true;
|
|
247
|
+
void tickerSponsorName(dataProvider, term).catch(() => null).then((name) => {
|
|
248
|
+
if (!live) return;
|
|
249
|
+
setLooked((current) => new Set([...current, term.toUpperCase()]));
|
|
250
|
+
if (name) updateQuery(`"${name}"`);
|
|
251
|
+
});
|
|
252
|
+
return () => { live = false; };
|
|
253
|
+
}, [dataProvider, resolvingTicker, term, updateQuery]);
|
|
254
|
+
const loading = (studies.loading && trials.length === 0) || resolvingTicker;
|
|
234
255
|
usePaneRefreshKey(reload, { focused, enabled: !searchFocused && !openItemId });
|
|
235
256
|
|
|
236
257
|
const detailTicker = detailTrial ? tickerOf(detailTrial) : undefined;
|
|
@@ -291,10 +312,9 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
|
|
|
291
312
|
const layout = useMemo(() => trialLayout(width), [width]);
|
|
292
313
|
const renderCell = useCallback((trial: ClinicalTrial, column: TrialColumn, _index: number, rowState: { selected: boolean }): DataTableCell => {
|
|
293
314
|
switch (column.id) {
|
|
294
|
-
case "
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
return { text: posted ? formatTimeAgo(posted) : "", value: posted ? posted.toISOString().slice(0, 10) : null, color: colors.textDim };
|
|
315
|
+
case "updated": {
|
|
316
|
+
const updated = formatDate(trial.lastUpdatePostDate);
|
|
317
|
+
return trial.lastUpdatePostDate ? { text: updated, value: updated, color: colors.textDim } : { text: "--", value: null, color: colors.textMuted };
|
|
298
318
|
}
|
|
299
319
|
case "phase": {
|
|
300
320
|
const text = trialPhaseLabel(trial.phases, layout.compact);
|
|
@@ -404,7 +424,7 @@ export function TrialsPane({ width, height, focused }: PaneProps) {
|
|
|
404
424
|
emptyStateTitle={term
|
|
405
425
|
? `No trials match ${term}${narrowed ? " with these filters" : ""}.`
|
|
406
426
|
: narrowed ? "No trials match these filters." : "No trials loaded."}
|
|
407
|
-
emptyStateHint={narrowed ? "Clear a filter to see more…" : "Press / to search…"}
|
|
427
|
+
emptyStateHint={narrowed ? "Clear a filter to see more…" : term ? "Try the company or drug name…" : "Press / to search…"}
|
|
408
428
|
/>
|
|
409
429
|
);
|
|
410
430
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DataProvider } from "../../../types/data-provider";
|
|
2
|
+
import { shortCompanyName } from "../../../tickers/company-name";
|
|
3
|
+
import { classifyInstrumentKind } from "../../../tickers/search/ranking";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The company a ticker is, by the name a registry files its studies under:
|
|
7
|
+
* VKTX is "Viking Therapeutics". Read from the listing's quote, which names
|
|
8
|
+
* it; a fund or a contract is no sponsor. Null when no share trades under it.
|
|
9
|
+
*/
|
|
10
|
+
export async function tickerSponsorName(dataProvider: Pick<DataProvider, "getQuote"> | null, ticker: string): Promise<string | null> {
|
|
11
|
+
const symbol = ticker.trim().toUpperCase();
|
|
12
|
+
if (!dataProvider || !symbol) return null;
|
|
13
|
+
const quote = await dataProvider.getQuote(symbol).catch(() => null);
|
|
14
|
+
const name = quote?.name?.trim();
|
|
15
|
+
const kind = classifyInstrumentKind(quote?.instrumentType);
|
|
16
|
+
return name && kind !== "fund" && kind !== "derivative" ? shortCompanyName(name) : null;
|
|
17
|
+
}
|
|
@@ -460,7 +460,7 @@ export class ASKGSessionController {
|
|
|
460
460
|
this.manifest = manifest;
|
|
461
461
|
const executor = this.options.getExecutor(manifest);
|
|
462
462
|
if (!executor) {
|
|
463
|
-
await this.deliver(failure("This window cannot run
|
|
463
|
+
await this.deliver(failure("This window cannot run Gloom tools."));
|
|
464
464
|
return;
|
|
465
465
|
}
|
|
466
466
|
const payload = await executor.execute(call, {
|
|
@@ -11,6 +11,6 @@ export function askgLockNote({ verifyEmail }: PaneLock): string {
|
|
|
11
11
|
: "log in or sign up free in the app (Ctrl+P, Log In or Sign Up)";
|
|
12
12
|
return [
|
|
13
13
|
`Ask Gloom (ASKG in the app) needs only a free, verified Gloom account: ${account}.`,
|
|
14
|
-
"Without AI: `
|
|
14
|
+
"Without AI: `gloom catalog <topic>` finds the function for a question, e.g. `gloom catalog dividends`.",
|
|
15
15
|
].join("\n");
|
|
16
16
|
}
|
|
@@ -198,7 +198,7 @@ function countText(count: number | undefined): string {
|
|
|
198
198
|
/** Words Gloom needs and the reader does not: field paths and pointers for the model. */
|
|
199
199
|
const INTERNAL_CLAUSE = /\bmetadata\.[a-z_]+|\blists each with its reason\b|\bsee (?:the )?(?:result|payload|rows)\b/i;
|
|
200
200
|
/** A service the app already worked around. Never a warning, only a detail. */
|
|
201
|
-
const SERVICE_FAILURE = /internal server error|server error|bad gateway|service unavailable|gateway time-?out|\b(?:http|status)\s*\d{3}\b|\b50[0-9]\b|econn\w+|etimedout|fetch failed|network error|socket hang up|too many requests|rate.?limit|request failed|unexpected token|not valid json|cannot read propert|is not a function|undefined is not/i;
|
|
201
|
+
const SERVICE_FAILURE = /internal server error|server error|bad gateway|service unavailable|gateway time-?out|\b(?:http|status)\s*\d{3}\b|\b50[0-9]\b|econn\w+|etimedout|fetch failed|network error|couldn't reach its data service|socket hang up|too many requests|rate.?limit|request failed|unexpected token|not valid json|cannot read propert|is not a function|undefined is not/i;
|
|
202
202
|
/** What the client did to fit the result through the wire. Gloom's business. */
|
|
203
203
|
const TRANSPORT_CLAUSE = /^(?:trimmed to fit|result exceeded the client payload limit|result was too large)/i;
|
|
204
204
|
/** Text that is not for people: payloads, identifiers, URIs, stack frames. */
|
|
@@ -25,7 +25,7 @@ export function registerCloudAuthCommands(ctx: GloomPluginContext): void {
|
|
|
25
25
|
ctx.registerCommand({
|
|
26
26
|
id: "auth-login",
|
|
27
27
|
label: "Log In",
|
|
28
|
-
description: "Log in to your
|
|
28
|
+
description: "Log in to your Gloom account",
|
|
29
29
|
keywords: ["login", "sign in", "auth", "account"],
|
|
30
30
|
category: "config",
|
|
31
31
|
hidden: () => apiClient.isSignedIn(),
|
|
@@ -43,7 +43,7 @@ export function registerCloudAuthCommands(ctx: GloomPluginContext): void {
|
|
|
43
43
|
ctx.registerCommand({
|
|
44
44
|
id: "auth-signup",
|
|
45
45
|
label: "Sign Up",
|
|
46
|
-
description: "Create a
|
|
46
|
+
description: "Create a Gloom account",
|
|
47
47
|
keywords: ["signup", "register", "create account"],
|
|
48
48
|
category: "config",
|
|
49
49
|
hidden: () => apiClient.isSignedIn(),
|
|
@@ -77,7 +77,7 @@ export function registerCloudAuthCommands(ctx: GloomPluginContext): void {
|
|
|
77
77
|
ctx.registerCommand({
|
|
78
78
|
id: "auth-logout",
|
|
79
79
|
label: "Logout",
|
|
80
|
-
description: "Log out of your
|
|
80
|
+
description: "Log out of your Gloom account",
|
|
81
81
|
keywords: ["logout", "sign out"],
|
|
82
82
|
category: "config",
|
|
83
83
|
execute: async () => {
|