gloomberb 0.18.2 → 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/patches/electrobun@1.18.1.patch +106 -5
- 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 +99 -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 +24 -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 +26 -7
- 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/telemetry.ts +17 -0
- package/src/api-client/themes.ts +7 -1
- package/src/api-client/types.ts +90 -2
- package/src/app/global-shortcuts.ts +1 -16
- 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/runtime/update.ts +28 -8
- package/src/app/star-prompt/status-line.tsx +2 -2
- package/src/architecture/core-builtin-allowlist.json +5 -2
- package/src/architecture/pane-tabs-allowlist.json +65 -0
- 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 +1189 -296
- 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 +272 -70
- 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 +20 -14
- 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 +32 -18
- package/src/cli/issuer-membership.ts +103 -0
- package/src/cli/known-gaps.ts +118 -25
- package/src/cli/listing-arg.ts +315 -43
- package/src/cli/name-entries.ts +73 -22
- 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 +77 -20
- package/src/cli/pane-functions/catalog.ts +40 -23
- package/src/cli/pane-functions/discovery.ts +1 -1
- package/src/cli/pane-functions/dom.ts +12 -8
- 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 +48 -16
- package/src/cli/pane-functions/index.ts +82 -21
- 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 +65 -14
- 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 +190 -27
- package/src/cli/restore-plugins.ts +29 -14
- package/src/cli/result.ts +122 -25
- 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 +226 -60
- 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 +387 -21
- package/src/components/chart/composite/drawing-store.ts +26 -6
- package/src/components/chart/composite/interactions.ts +9 -3
- 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 +316 -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 +19 -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/command-items.ts +32 -6
- 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/data-table/view.tsx +23 -3
- 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 +13 -6
- package/src/components/layout/detached-pane-shell.tsx +1 -0
- package/src/components/layout/floating-pane.tsx +1 -0
- package/src/components/layout/header.tsx +234 -60
- 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/pane/header.tsx +10 -3
- package/src/components/layout/pane/index.tsx +1 -0
- package/src/components/layout/pane/pane-tabs.tsx +9 -1
- 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/components/ui/stat-grid.tsx +28 -3
- package/src/components/ui/status.tsx +3 -1
- package/src/core/app-services.ts +4 -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 +51 -12
- package/src/i18n/ja.ts +51 -12
- package/src/i18n/ko.ts +51 -12
- package/src/i18n/zh-cn.ts +51 -12
- package/src/i18n/zh-tw.ts +51 -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 +30 -18
- 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 +108 -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 +77 -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 +107 -43
- package/src/plugins/builtin/attention/pane.tsx +22 -16
- 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 +12 -9
- package/src/plugins/builtin/backtest/export.ts +1 -1
- 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 +24 -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 +115 -26
- package/src/plugins/builtin/broker-trading/ticket-parts.tsx +36 -7
- package/src/plugins/builtin/broker-trading/ticket.tsx +122 -36
- 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 +34 -18
- 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/client.ts +2 -2
- 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 +9 -11
- 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 +128 -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 +14 -8
- package/src/plugins/builtin/company-attention/app-rank.tsx +11 -10
- 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 +89 -31
- 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 +5 -4
- 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 +7 -4
- package/src/plugins/builtin/correlation/relationship/model.ts +1 -0
- package/src/plugins/builtin/correlation/settings.ts +1 -0
- 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 +7 -5
- 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/credit-documents/pane.tsx +8 -7
- 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/debt-maturities/pane.tsx +4 -3
- 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 +19 -12
- 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 +77 -5
- package/src/plugins/builtin/equity-screener/live.ts +1 -1
- package/src/plugins/builtin/equity-screener/model.ts +34 -0
- package/src/plugins/builtin/equity-screener/pane.tsx +148 -106
- 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 +16 -10
- 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/board.tsx +4 -1
- package/src/plugins/builtin/gpu/changes.tsx +10 -10
- package/src/plugins/builtin/gpu/equities.tsx +4 -1
- package/src/plugins/builtin/gpu/headless.ts +9 -4
- package/src/plugins/builtin/gpu/history.tsx +4 -2
- package/src/plugins/builtin/gpu/pane.tsx +5 -3
- 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 +15 -2
- package/src/plugins/builtin/holders/format.ts +28 -17
- package/src/plugins/builtin/holders/headless.ts +48 -8
- 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/thirteenf-match.ts +3 -1
- package/src/plugins/builtin/holders/treemap.tsx +2 -2
- package/src/plugins/builtin/insider/base-values.ts +11 -7
- package/src/plugins/builtin/insider/client.ts +3 -0
- package/src/plugins/builtin/insider/headless.ts +20 -7
- package/src/plugins/builtin/insider/index.tsx +17 -8
- package/src/plugins/builtin/insider/issuer.ts +34 -4
- package/src/plugins/builtin/insider/signals-client.ts +3 -3
- package/src/plugins/builtin/insider/signals.tsx +1 -1
- package/src/plugins/builtin/insider/table-model.ts +35 -13
- package/src/plugins/builtin/insider/table.tsx +5 -2
- 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/events.ts +145 -0
- package/src/plugins/builtin/iv-history/format.ts +3 -0
- package/src/plugins/builtin/iv-history/headless.ts +91 -7
- 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 +14 -8
- 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 +36 -21
- 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 +33 -11
- 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 +50 -15
- package/src/plugins/builtin/notes/export.ts +17 -6
- package/src/plugins/builtin/notes/files.ts +16 -5
- package/src/plugins/builtin/openfda/pane.tsx +1 -1
- package/src/plugins/builtin/options/carry.ts +2 -2
- package/src/plugins/builtin/options/enrichment-model.ts +10 -9
- package/src/plugins/builtin/options/index.tsx +1 -1
- package/src/plugins/builtin/options/model-spot.ts +70 -4
- package/src/plugins/builtin/options/view.tsx +51 -23
- package/src/plugins/builtin/options-calculator/headless.ts +46 -7
- package/src/plugins/builtin/options-calculator/pane.tsx +3 -2
- package/src/plugins/builtin/options-positioning/headless.ts +11 -3
- package/src/plugins/builtin/options-positioning/model.ts +24 -0
- package/src/plugins/builtin/options-positioning/pane.tsx +10 -12
- package/src/plugins/builtin/options-scenario/client.ts +142 -29
- 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 +49 -21
- 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 +22 -10
- 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 +145 -60
- package/src/plugins/builtin/portfolio-list/cli/bulk-symbols.ts +78 -27
- 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 +6 -3
- 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 +44 -32
- 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/client.ts +2 -1
- package/src/plugins/builtin/reverse-dcf/model.ts +10 -5
- package/src/plugins/builtin/risk-factors/index.tsx +2 -2
- package/src/plugins/builtin/scanner/lock-note.ts +1 -1
- package/src/plugins/builtin/seasonality/client.ts +2 -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 +6 -4
- 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-resource.ts +15 -2
- 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 +23 -0
- package/src/plugins/builtin/shared/series-cache.ts +2 -0
- package/src/plugins/builtin/shared/series-list-detail.tsx +3 -1
- package/src/plugins/builtin/shared/ticker-surface.ts +2 -1
- package/src/plugins/builtin/shared/volatility/options.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/social-mentions/client.ts +2 -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 +28 -7
- package/src/plugins/builtin/vol-surface/headless.ts +43 -15
- package/src/plugins/builtin/vol-surface/model.ts +34 -12
- package/src/plugins/builtin/vol-surface/pane.tsx +33 -13
- package/src/plugins/builtin/vol-surface/stored.ts +34 -3
- package/src/plugins/builtin/vol-surface/tables.ts +14 -0
- 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/desktop/controls.tsx +1 -1
- package/src/renderers/dom/desktop/query-bar.tsx +2 -0
- 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/host/tabs.tsx +16 -5
- package/src/renderers/dom/host/top-surface.ts +127 -0
- package/src/renderers/dom/styles.css +115 -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/core-capabilities.ts +9 -1
- package/src/renderers/electrobun/bun/desktop/backend-requests.ts +3 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +56 -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/desktop/update.ts +210 -30
- 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 +9 -7
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +9 -2
- 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 +8 -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 +39 -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/index.ts +16 -0
- 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 +21 -4
- package/src/telemetry/update-failures-node.ts +59 -0
- package/src/telemetry/update-failures.ts +307 -0
- 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 +215 -36
- package/src/tickers/company-name.ts +43 -0
- package/src/tickers/index-roots.ts +47 -0
- package/src/tickers/instrument-label.ts +5 -1
- package/src/tickers/listing-fate.ts +30 -0
- 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 +20 -0
- package/src/types/exchange-rate.ts +6 -0
- package/src/types/financials.ts +104 -7
- package/src/types/headless.ts +83 -6
- package/src/types/instrument.ts +3 -0
- package/src/types/issuer-listings.ts +28 -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/failure.ts +163 -0
- package/src/updater/index.ts +97 -28
- 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-pair.ts +26 -0
- 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 +71 -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
|
@@ -26,6 +26,7 @@ import { installElectrobunUpdateHost } from "./update-host";
|
|
|
26
26
|
import { installScreenshotWatermark } from "./screenshot-watermark";
|
|
27
27
|
import { installElectrobunWindowFullscreenTracking } from "./window-fullscreen";
|
|
28
28
|
import { installDomMarketDataFrames } from "../../dom/data-frames";
|
|
29
|
+
import { releaseBootFrameWhenDrawn, startBootFrameRecorder } from "../../dom/boot-frame";
|
|
29
30
|
import { DomErrorBoundary, DomHostProviders } from "../../dom/dom-host-providers";
|
|
30
31
|
import { DesktopFatalScreen } from "./fatal-screen";
|
|
31
32
|
import { resolveRendererWindowError } from "./renderer-window-error";
|
|
@@ -45,6 +46,7 @@ import { getMarketplaceHost, setPluginManager, type PluginManager } from "../../
|
|
|
45
46
|
import { remoteNotesFilesIO, setNotesFilesIO } from "../../../plugins/builtin/notes/files";
|
|
46
47
|
import { NOTES_FILES_CAPABILITY_ID } from "../../../capabilities";
|
|
47
48
|
import { loadOfficialPluginIds } from "../../../plugins/marketplace/feed";
|
|
49
|
+
import { setPluginSeedNotice } from "../../../plugins/seed-notice";
|
|
48
50
|
import { crashReportsEnabled, installCrashReporter, reportCrash } from "../../../telemetry/crash-reports";
|
|
49
51
|
import { browserDoNotTrack, installWindowCrashListeners } from "../../../telemetry/crash-reports-dom";
|
|
50
52
|
import { currentTelemetryConfig } from "../../../telemetry/live-config";
|
|
@@ -72,9 +74,14 @@ const bootLog = debugLog.createLogger("electrobun-web-boot");
|
|
|
72
74
|
let appMounted = false;
|
|
73
75
|
|
|
74
76
|
appRootElement.tabIndex = -1;
|
|
75
|
-
|
|
77
|
+
// The page drew the layout this window last drew, or the bare shell, before
|
|
78
|
+
// this script loaded (dom/boot-frame.ts); it stays until the app has drawn its own.
|
|
79
|
+
const releaseBootFrame = releaseBootFrameWhenDrawn(document, appRootElement);
|
|
80
|
+
/** How long after the app mounts the launch frame stays at most. */
|
|
81
|
+
const BOOT_FRAME_RELEASE_FALLBACK_MS = 4_000;
|
|
76
82
|
|
|
77
|
-
function renderFatalError(error: unknown, details?: string, title = "
|
|
83
|
+
function renderFatalError(error: unknown, details?: string, title = "Gloom failed to start"): void {
|
|
84
|
+
releaseBootFrame();
|
|
78
85
|
root.render(
|
|
79
86
|
<DesktopFatalScreen
|
|
80
87
|
title={title}
|
|
@@ -94,7 +101,7 @@ window.__gloomRenderFatalError = (error, details, source) => {
|
|
|
94
101
|
}) === "ignore") {
|
|
95
102
|
return;
|
|
96
103
|
}
|
|
97
|
-
renderFatalError(error, details, "
|
|
104
|
+
renderFatalError(error, details, "Gloom crashed");
|
|
98
105
|
};
|
|
99
106
|
|
|
100
107
|
function focusWebSurface(): void {
|
|
@@ -113,9 +120,13 @@ function requestStartupFocus(): void {
|
|
|
113
120
|
|
|
114
121
|
async function boot() {
|
|
115
122
|
bootLog.info("boot started");
|
|
123
|
+
// Both asked for at once: the Bun process compiles the plugins while it
|
|
124
|
+
// answers `init`, rather than after this view asks a second time.
|
|
116
125
|
const backendInitPromise = initElectrobunBackend();
|
|
126
|
+
const externalBundlesPromise = backendRequest("plugins.listExternal");
|
|
117
127
|
// Avoid a premature global unhandled-rejection render while UI chunks load.
|
|
118
128
|
void backendInitPromise.catch(() => {});
|
|
129
|
+
void externalBundlesPromise.catch(() => {});
|
|
119
130
|
|
|
120
131
|
installElectrobunConfigStoreHost();
|
|
121
132
|
installElectrobunBrokerRemoteClient();
|
|
@@ -156,6 +167,8 @@ async function boot() {
|
|
|
156
167
|
: init.desktopSnapshot;
|
|
157
168
|
const config = desktopSnapshot?.config ?? init.config;
|
|
158
169
|
applyLanguageFromConfig(config);
|
|
170
|
+
// Said by the app once it is up, as the terminal says it.
|
|
171
|
+
setPluginSeedNotice(init.pluginSeedNotice ?? null);
|
|
159
172
|
const desktopWindowBridge = createDesktopWindowBridge(init.windowKind, init.paneId);
|
|
160
173
|
const desktopApplicationMenuBridge: DesktopApplicationMenuBridge = {
|
|
161
174
|
subscribe: (listener) => onBackendMessage("application-menu.select", ({ command }) => listener(command)),
|
|
@@ -172,7 +185,11 @@ async function boot() {
|
|
|
172
185
|
"startup.electrobun.load-external-plugins",
|
|
173
186
|
async () => {
|
|
174
187
|
try {
|
|
175
|
-
|
|
188
|
+
// Asked once more if the early request failed: it waits for the
|
|
189
|
+
// whole launch, which a first run's plugin downloads can stretch past
|
|
190
|
+
// the request's time limit.
|
|
191
|
+
const bundles = await externalBundlesPromise.catch(() => backendRequest("plugins.listExternal"));
|
|
192
|
+
return await loadDesktopExternalPlugins(bundles);
|
|
176
193
|
} catch (error) {
|
|
177
194
|
debugLog.createLogger("desktop-plugins").error(`External plugin load failed: ${error}`);
|
|
178
195
|
return [];
|
|
@@ -245,6 +262,15 @@ async function boot() {
|
|
|
245
262
|
);
|
|
246
263
|
appMounted = true;
|
|
247
264
|
});
|
|
265
|
+
// A layout with neither panes nor a status bar has nothing to wait for.
|
|
266
|
+
window.setTimeout(releaseBootFrame, BOOT_FRAME_RELEASE_FALLBACK_MS);
|
|
267
|
+
if (init.windowKind === "main") {
|
|
268
|
+
startBootFrameRecorder({
|
|
269
|
+
doc: document,
|
|
270
|
+
root: appRootElement,
|
|
271
|
+
save: (frame) => { void backendRequest("host.saveBootFrame", { frame }).catch(() => {}); },
|
|
272
|
+
});
|
|
273
|
+
}
|
|
248
274
|
requestStartupFocus();
|
|
249
275
|
bootLog.info("root render scheduled", {
|
|
250
276
|
layoutPanes: config.layout.instances.length,
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { apiClient } from "../../../api-client";
|
|
2
2
|
import { newsProvider, type NewsCapability } from "../../../capabilities";
|
|
3
|
-
import {
|
|
4
|
-
import type { NewsArticle, NewsQuery } from "../../../types
|
|
3
|
+
import { cloudNewsReadArticles, mapCloudNewsArticle, readCloudNews } from "../../../sources/gloomberb-cloud/news";
|
|
4
|
+
import type { NewsArticle, NewsPage, NewsQuery } from "../../../news/types";
|
|
5
5
|
|
|
6
6
|
interface BackendNews {
|
|
7
7
|
id: string;
|
|
8
8
|
name: string;
|
|
9
9
|
getNews(query: NewsQuery): Promise<NewsArticle[]>;
|
|
10
|
+
getNewsPage(query: NewsQuery): Promise<NewsPage>;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
type CloudNewsClient = Pick<typeof apiClient, "getCloudNews" | "getCloudNewsStory">;
|
|
13
|
+
type CloudNewsClient = Pick<typeof apiClient, "getCloudNews" | "getCloudNewsStory" | "searchCloudNews">;
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* The view's only news source: the desktop view runs without capability
|
|
@@ -27,13 +28,14 @@ export function createDesktopNewsSource(backend: BackendNews, client: CloudNewsC
|
|
|
27
28
|
fetchNews: (query) => backend.getNews(query),
|
|
28
29
|
fetchNewsPage: async (query) => {
|
|
29
30
|
try {
|
|
30
|
-
const
|
|
31
|
+
const read = await readCloudNews(client, query);
|
|
31
32
|
return {
|
|
32
|
-
articles:
|
|
33
|
-
nextCursor:
|
|
33
|
+
articles: cloudNewsReadArticles(read, query.ticker),
|
|
34
|
+
nextCursor: read.nextCursor ?? null,
|
|
34
35
|
};
|
|
35
36
|
} catch {
|
|
36
|
-
|
|
37
|
+
// The aggregate page keeps RSS failures beside any usable stories.
|
|
38
|
+
return backend.getNewsPage(query);
|
|
37
39
|
}
|
|
38
40
|
},
|
|
39
41
|
fetchNewsStory: async (storyId) => mapCloudNewsArticle(await client.getCloudNewsStory(storyId)),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CapabilityManifest } from "../../../../capabilities";
|
|
2
|
-
import type { NewsArticle, NewsQuery } from "../../../../news/types";
|
|
2
|
+
import type { NewsArticle, NewsPage, NewsQuery } from "../../../../news/types";
|
|
3
3
|
import type { DataProvider } from "../../../../types/data-provider";
|
|
4
4
|
import type { TickerFinancials } from "../../../../types/financials";
|
|
5
5
|
import { backendRequest, getElectrobunBackendInitSnapshot, subscribeBackendCapability } from "../backend-rpc";
|
|
@@ -14,6 +14,7 @@ const ASSET_DATA_REQUEST_TIMEOUT_MS = 115_000;
|
|
|
14
14
|
|
|
15
15
|
export type RemoteAssetDataClient = DataProvider & {
|
|
16
16
|
getNews(query: NewsQuery): Promise<NewsArticle[]>;
|
|
17
|
+
getNewsPage(query: NewsQuery): Promise<NewsPage>;
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
interface RemoteAssetDataClientBase {
|
|
@@ -21,6 +22,7 @@ interface RemoteAssetDataClientBase {
|
|
|
21
22
|
name: string;
|
|
22
23
|
getCachedFinancialsForTargets: NonNullable<DataProvider["getCachedFinancialsForTargets"]>;
|
|
23
24
|
getNews(query: NewsQuery): Promise<NewsArticle[]>;
|
|
25
|
+
getNewsPage(query: NewsQuery): Promise<NewsPage>;
|
|
24
26
|
subscribeQuotes: NonNullable<DataProvider["subscribeQuotes"]>;
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -119,7 +121,7 @@ export function createRemoteAssetDataClient(): RemoteAssetDataClient {
|
|
|
119
121
|
|
|
120
122
|
const base: RemoteAssetDataClientBase = {
|
|
121
123
|
id: "desktop-backend",
|
|
122
|
-
name: "
|
|
124
|
+
name: "Gloom Backend",
|
|
123
125
|
getCachedFinancialsForTargets: (targets, options) => (
|
|
124
126
|
hasRendererOperation(assetDataOperations, "getCachedFinancialsForTargets")
|
|
125
127
|
? invoke<Map<string, TickerFinancials>>(ASSET_DATA_CAPABILITY_ID, "getCachedFinancialsForTargets", { targets, options })
|
|
@@ -130,6 +132,11 @@ export function createRemoteAssetDataClient(): RemoteAssetDataClient {
|
|
|
130
132
|
? invoke<NewsArticle[]>(NEWS_CAPABILITY_ID, "fetchNews", { query })
|
|
131
133
|
: Promise.resolve([])
|
|
132
134
|
),
|
|
135
|
+
getNewsPage: (query) => (
|
|
136
|
+
hasRendererOperation(newsOperations, "fetchNewsPage")
|
|
137
|
+
? invoke<NewsPage>(NEWS_CAPABILITY_ID, "fetchNewsPage", { query })
|
|
138
|
+
: Promise.reject(new Error("News is unavailable."))
|
|
139
|
+
),
|
|
133
140
|
subscribeQuotes: (targets, onQuote) => {
|
|
134
141
|
if (!hasRendererOperation(assetDataOperations, "subscribeQuotes")) return () => {};
|
|
135
142
|
return quoteSubscriptions.subscribe(targets, onQuote);
|
|
@@ -33,7 +33,7 @@ export const webRendererHost: RendererHost = {
|
|
|
33
33
|
await backendRequest("host.windowControl", { action });
|
|
34
34
|
},
|
|
35
35
|
async openExternal(url) {
|
|
36
|
-
await backendRequest("host.openExternal", { url });
|
|
36
|
+
return await backendRequest("host.openExternal", { url });
|
|
37
37
|
},
|
|
38
38
|
async copyText(text) {
|
|
39
39
|
try {
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opening a link in a browser the person can see, from a terminal. The
|
|
3
|
+
* terminal often runs somewhere else: over SSH, a browser started on that
|
|
4
|
+
* machine shows on its screen or nowhere, and `open` or `xdg-open` still
|
|
5
|
+
* report success. Those cases get no command at all, so the caller knows
|
|
6
|
+
* nothing opened and can show the link instead.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
type Env = Readonly<Record<string, string | undefined>>;
|
|
10
|
+
|
|
11
|
+
function present(value: string | undefined): boolean {
|
|
12
|
+
return !!value?.trim();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The command `$BROWSER` names, with the link in it. Editors with a remote
|
|
17
|
+
* terminal (VS Code over SSH, Codespaces) point it at a helper that opens the
|
|
18
|
+
* link on the person's own machine. A `:` separated list takes its first entry.
|
|
19
|
+
*/
|
|
20
|
+
function envBrowserCommand(browser: string, url: string): string[] | null {
|
|
21
|
+
const entry = browser.split(":")[0]?.trim();
|
|
22
|
+
if (!entry) return null;
|
|
23
|
+
const parts = entry.split(/\s+/);
|
|
24
|
+
return parts.some((part) => part.includes("%s"))
|
|
25
|
+
? parts.map((part) => part.replaceAll("%s", url))
|
|
26
|
+
: [...parts, url];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The commands to try in order, each with the link as its last argument.
|
|
31
|
+
* Empty when this terminal cannot show a browser to the person using it.
|
|
32
|
+
*/
|
|
33
|
+
export function browserOpenCommands(url: string, env: Env, platform: NodeJS.Platform): string[][] {
|
|
34
|
+
const remote = present(env.SSH_CONNECTION) || present(env.SSH_CLIENT) || present(env.SSH_TTY);
|
|
35
|
+
const forwarded = present(env.BROWSER) ? envBrowserCommand(env.BROWSER!, url) : null;
|
|
36
|
+
|
|
37
|
+
if (platform === "darwin") {
|
|
38
|
+
if (!remote) return [["open", url]];
|
|
39
|
+
return forwarded ? [forwarded] : [];
|
|
40
|
+
}
|
|
41
|
+
if (platform === "win32") {
|
|
42
|
+
if (!remote) return [["cmd", "/c", "start", "", url]];
|
|
43
|
+
return forwarded ? [forwarded] : [];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Linux and the other unixes. WSL has no Linux browser, but Windows can
|
|
47
|
+
// open the link: `wslview` when wslu is installed, else Windows' own handler.
|
|
48
|
+
if (present(env.WSL_DISTRO_NAME) || present(env.WSL_INTEROP)) {
|
|
49
|
+
return [
|
|
50
|
+
...(forwarded ? [forwarded] : []),
|
|
51
|
+
["wslview", url],
|
|
52
|
+
["rundll32.exe", "url.dll,FileProtocolHandler", url],
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
const display = present(env.DISPLAY) || present(env.WAYLAND_DISPLAY);
|
|
56
|
+
// xdg-open reads $BROWSER itself, so a forwarding helper still applies.
|
|
57
|
+
if (remote && !display && !forwarded) return [];
|
|
58
|
+
return [["xdg-open", url]];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** How long an opener may run before it counts as having opened the browser. */
|
|
62
|
+
const OPENER_SETTLE_MS = 5_000;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Runs one opener. Exit 0 opened the link; a missing command or another exit
|
|
66
|
+
* code did not. An opener still running after a few seconds is a browser
|
|
67
|
+
* started in the foreground of the command, which has opened the link.
|
|
68
|
+
*/
|
|
69
|
+
export async function runBrowserOpener(command: string[]): Promise<boolean> {
|
|
70
|
+
try {
|
|
71
|
+
const proc = Bun.spawn(command, { stdin: "ignore", stdout: "ignore", stderr: "ignore" });
|
|
72
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
73
|
+
const settled = new Promise<"running">((resolve) => {
|
|
74
|
+
timer = setTimeout(() => resolve("running"), OPENER_SETTLE_MS);
|
|
75
|
+
timer.unref?.();
|
|
76
|
+
});
|
|
77
|
+
const result = await Promise.race([proc.exited, settled]);
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
if (result === "running") {
|
|
80
|
+
proc.unref();
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
return result === 0;
|
|
84
|
+
} catch {
|
|
85
|
+
// The command is not installed (xdg-open is missing on minimal Linux).
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -6,6 +6,7 @@ import type { KeyEventLike } from "../../react/input";
|
|
|
6
6
|
import type { NativeRendererHost, PixelResolution, RendererHost } from "../../ui/host";
|
|
7
7
|
import { colors } from "../../theme/colors";
|
|
8
8
|
import { safeExternalUrl } from "../../utils/external-url";
|
|
9
|
+
import { browserOpenCommands, runBrowserOpener } from "./browser-open";
|
|
9
10
|
import { buildTerminalMediaArgs, createTerminalMediaReaper, terminalMediaStateFile } from "./terminal-media";
|
|
10
11
|
import { saveTextFileToDownloads } from "../../utils/save-text-file";
|
|
11
12
|
import { installInteractionPerformanceRecorder } from "./interaction-performance";
|
|
@@ -129,23 +130,13 @@ export async function createOpenTuiHost(): Promise<OpenTuiHost> {
|
|
|
129
130
|
requestExit: () => renderer.destroy(),
|
|
130
131
|
async openExternal(rawUrl) {
|
|
131
132
|
const url = safeExternalUrl(rawUrl);
|
|
132
|
-
if (!url) return;
|
|
133
|
-
const command
|
|
134
|
-
|
|
135
|
-
: process.platform === "win32"
|
|
136
|
-
? ["cmd", "/c", "start", "", url]
|
|
137
|
-
: ["xdg-open", url];
|
|
138
|
-
try {
|
|
139
|
-
const proc = Bun.spawn(command, {
|
|
140
|
-
stdout: "ignore",
|
|
141
|
-
stderr: "ignore",
|
|
142
|
-
});
|
|
143
|
-
if (await proc.exited === 0) return;
|
|
144
|
-
} catch {
|
|
145
|
-
// No opener installed (xdg-open is missing on minimal Linux and WSL).
|
|
133
|
+
if (!url) return false;
|
|
134
|
+
for (const command of browserOpenCommands(url, process.env, process.platform)) {
|
|
135
|
+
if (await runBrowserOpener(command)) return true;
|
|
146
136
|
}
|
|
147
137
|
// Leave the link on the clipboard, so it can at least be pasted.
|
|
148
138
|
renderer.copyToClipboardOSC52(url);
|
|
139
|
+
return false;
|
|
149
140
|
},
|
|
150
141
|
async copyText(text) {
|
|
151
142
|
if (!text) return;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Jimp } from "jimp";
|
|
2
1
|
import type { NativeChartBitmap } from "../../../components/chart/native/chart-rasterizer";
|
|
3
2
|
|
|
4
3
|
type ImageObjectFit = "contain" | "cover";
|
|
@@ -67,7 +66,9 @@ function loadSourceImage(src: string): Promise<JimpImageLike> {
|
|
|
67
66
|
if (cached) return cached;
|
|
68
67
|
|
|
69
68
|
const promise = fetchImageBytes(src)
|
|
70
|
-
|
|
69
|
+
// Loaded with the first image: the decoder is a large part of what the
|
|
70
|
+
// terminal would otherwise load before it draws anything.
|
|
71
|
+
.then(async (bytes) => (await import("jimp")).Jimp.read(bytes))
|
|
71
72
|
.then(adaptJimpImage)
|
|
72
73
|
.catch((error) => {
|
|
73
74
|
sourceImageCache.delete(src);
|
|
@@ -1 +1,10 @@
|
|
|
1
|
-
import "@opentui/core";
|
|
1
|
+
import { resolveRenderLib } from "@opentui/core";
|
|
2
|
+
import { loadRenderLib } from "./render-lib";
|
|
3
|
+
|
|
4
|
+
// Loaded the way a launch loads it, so the smoke covers the cache folder used
|
|
5
|
+
// when the temp folder cannot run the library.
|
|
6
|
+
await loadRenderLib();
|
|
7
|
+
// Importing @opentui/core swallows a render library that fails to load and
|
|
8
|
+
// throws only on first use, so load it here: the glibc library on a musl
|
|
9
|
+
// system fails this way ("getcontext: symbol not found").
|
|
10
|
+
resolveRenderLib();
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { CliRenderer } from "@opentui/core";
|
|
2
|
-
import { Jimp } from "jimp";
|
|
3
2
|
import type { NativeSurfaceManager } from "../../../components/chart/native/surface/manager";
|
|
4
3
|
import type { CellRect } from "../../../components/chart/native/chart-rasterizer";
|
|
5
4
|
import { intersectCellRects } from "../../../components/chart/native/chart-rasterizer";
|
|
@@ -95,6 +94,8 @@ export async function captureTerminalPaneImage(
|
|
|
95
94
|
const base = hexRgb(background);
|
|
96
95
|
const layers = imageLayers(manager, clipRect(rect, renderer.currentRenderBuffer.width, renderer.currentRenderBuffer.height)!);
|
|
97
96
|
const image = rasterizeFrame(frame, layers, base);
|
|
97
|
+
// Loaded on the first capture rather than with the terminal.
|
|
98
|
+
const { Jimp } = await import("jimp");
|
|
98
99
|
const jimp = new Jimp({ width: image.width, height: image.height, data: Buffer.from(image.pixels.buffer, image.pixels.byteOffset, image.pixels.byteLength) });
|
|
99
100
|
const png = await jimp.getBuffer("image/png");
|
|
100
101
|
return {
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads OpenTUI's native render library before the terminal starts, and
|
|
3
|
+
* keeps the standalone binary starting when its temp folder cannot run it.
|
|
4
|
+
*
|
|
5
|
+
* A Bun-compiled binary carries the library inside itself. Bun's dlopen
|
|
6
|
+
* writes it to a new file in the temp folder on every launch and loads that
|
|
7
|
+
* file. When the folder is full or read-only the write fails and the load
|
|
8
|
+
* fails on the path inside the binary ("/$bunfs/root/libopentui-*.so: cannot
|
|
9
|
+
* open shared object file"); when it is mounted noexec the file is written
|
|
10
|
+
* but cannot be mapped ("failed to map segment from shared object"). Either
|
|
11
|
+
* way the library is copied once into the native cache folder and loaded
|
|
12
|
+
* from there on every later launch. The copy is named after the embedded
|
|
13
|
+
* file, whose name carries a hash of its contents, so an upgrade never loads
|
|
14
|
+
* an older library.
|
|
15
|
+
*
|
|
16
|
+
* Bun never deletes the files it writes, so each launch would leave 8 MB in
|
|
17
|
+
* the temp folder until it fills up. On Linux the one this launch mapped is
|
|
18
|
+
* removed once it is loaded: the mapping keeps it usable until exit.
|
|
19
|
+
*/
|
|
20
|
+
import { mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
|
|
21
|
+
import { basename, dirname, join } from "path";
|
|
22
|
+
import { getGloomberbDirs } from "../../data/config/home";
|
|
23
|
+
|
|
24
|
+
/** Where the render library sits inside a standalone binary. */
|
|
25
|
+
interface EmbeddedRenderLib {
|
|
26
|
+
/** The library @opentui/core loads by default. */
|
|
27
|
+
path: string;
|
|
28
|
+
/** Linux: the musl library, which it loads instead when `OPENTUI_LIBC` is `musl`. */
|
|
29
|
+
musl?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let embeddedRenderLib: EmbeddedRenderLib | null = null;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Where the standalone binary carries its render library. A package or a
|
|
36
|
+
* checkout has none.
|
|
37
|
+
* @knipignore Called by the module scripts/build.ts writes for the release binary.
|
|
38
|
+
*/
|
|
39
|
+
export function useEmbeddedRenderLib(lib: EmbeddedRenderLib): void {
|
|
40
|
+
embeddedRenderLib = lib;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The embedded library @opentui/core picks, by the same rule it uses. */
|
|
44
|
+
function embeddedRenderLibPath(env: NodeJS.ProcessEnv): string | null {
|
|
45
|
+
if (!embeddedRenderLib) return null;
|
|
46
|
+
return env.OPENTUI_LIBC === "musl" && embeddedRenderLib.musl ? embeddedRenderLib.musl : embeddedRenderLib.path;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The folder Bun writes embedded libraries to before loading them: a
|
|
51
|
+
* non-empty `BUN_TMPDIR`, else `TMPDIR`, `TMP` or `TEMP`, else the platform's
|
|
52
|
+
* (Bun 1.3, `RealFS.tmpdirPath`).
|
|
53
|
+
*/
|
|
54
|
+
function bunTempDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string {
|
|
55
|
+
const dir = env.BUN_TMPDIR || env.TMPDIR || env.TMP || env.TEMP;
|
|
56
|
+
if (dir) return dir.length > 1 && /[\\/]$/.test(dir) ? dir.slice(0, -1) : dir;
|
|
57
|
+
if (platform === "darwin") return "/private/tmp";
|
|
58
|
+
if (platform === "win32") return `${(env.SYSTEMROOT || env.WINDIR || "C:\\Windows").replace(/\\$/, "")}\\Temp`;
|
|
59
|
+
return "/tmp";
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** How Bun names the copy it writes: `.<hex>-<HEX>.so` (`.dylib`, `.dll`). */
|
|
63
|
+
const BUN_EXTRACTED_NAME = /^\.[0-9a-f]+-[0-9A-F]+\.(?:so|dylib|dll)$/;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The temp folder copies this process has mapped, read from
|
|
67
|
+
* `/proc/self/maps`: `address perms offset dev inode path`, with
|
|
68
|
+
* ` (deleted)` after a path that is gone.
|
|
69
|
+
*/
|
|
70
|
+
function mappedExtractedCopies(maps: string, tempDir: string): string[] {
|
|
71
|
+
const copies = new Set<string>();
|
|
72
|
+
for (const line of maps.split("\n")) {
|
|
73
|
+
const path = /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\/.*)$/.exec(line)?.[1];
|
|
74
|
+
if (!path || path.endsWith(" (deleted)")) continue;
|
|
75
|
+
if (dirname(path) === tempDir && BUN_EXTRACTED_NAME.test(basename(path))) copies.add(path);
|
|
76
|
+
}
|
|
77
|
+
return [...copies];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Copies of the library Bun wrote to the temp folder during this launch and
|
|
82
|
+
* could not load: a noexec folder holds a whole copy for every attempt, a
|
|
83
|
+
* full one a cut-off copy. Matched by Bun's naming, a size up to the
|
|
84
|
+
* library's and a write time after this process started.
|
|
85
|
+
*/
|
|
86
|
+
function failedExtractedCopies(tempDir: string, size: number, sinceMs: number): string[] {
|
|
87
|
+
return listDir(tempDir).filter((name) => BUN_EXTRACTED_NAME.test(name)).map((name) => join(tempDir, name)).filter((path) => {
|
|
88
|
+
try {
|
|
89
|
+
const stat = statSync(path);
|
|
90
|
+
return stat.isFile() && stat.size <= size && stat.mtimeMs >= sinceMs;
|
|
91
|
+
} catch {
|
|
92
|
+
// Intentional ignore: a copy that vanished needs no removal.
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function listDir(dir: string): string[] {
|
|
99
|
+
try {
|
|
100
|
+
return readdirSync(dir);
|
|
101
|
+
} catch {
|
|
102
|
+
// Intentional ignore: an unreadable folder holds nothing we could remove.
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function removeFiles(paths: readonly string[]): void {
|
|
108
|
+
for (const path of paths) {
|
|
109
|
+
try {
|
|
110
|
+
rmSync(path, { force: true });
|
|
111
|
+
} catch {
|
|
112
|
+
// Intentional ignore: a copy left behind only costs disk space.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Puts the embedded library in the cache folder unless an intact copy is there, and returns its path. */
|
|
118
|
+
function cachedCopy(embeddedPath: string, size: number, cacheDir: string): string {
|
|
119
|
+
const name = basename(embeddedPath);
|
|
120
|
+
const target = join(cacheDir, name);
|
|
121
|
+
try {
|
|
122
|
+
if (statSync(target).size === size) return target;
|
|
123
|
+
} catch {
|
|
124
|
+
// Intentional ignore: no copy yet, written below.
|
|
125
|
+
}
|
|
126
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
127
|
+
const partial = join(cacheDir, `.${name}.${process.pid}.partial`);
|
|
128
|
+
try {
|
|
129
|
+
writeFileSync(partial, readFileSync(embeddedPath), { mode: 0o755 });
|
|
130
|
+
renameSync(partial, target);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
removeFiles([partial]);
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
// The copy an earlier version left, now unused. Another launch's partial
|
|
136
|
+
// copy (dot-named) is still being written and stays.
|
|
137
|
+
removeFiles(listDir(cacheDir).filter((entry) => entry !== name && entry.startsWith("libopentui")).map((entry) => join(cacheDir, entry)));
|
|
138
|
+
return target;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* A failed load the folder the library was in explains: it never left the
|
|
143
|
+
* binary because the temp folder took no file (`$bunfs`, `~BUN` on Windows),
|
|
144
|
+
* or the folder does not let code run from it (glibc: "failed to map
|
|
145
|
+
* segment", musl: "Operation not permitted"). A missing symbol or dependency
|
|
146
|
+
* fails wherever the file sits.
|
|
147
|
+
*/
|
|
148
|
+
function isFolderFailure(error: unknown): boolean {
|
|
149
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
150
|
+
return /\$bunfs|~BUN|failed to map segment|operation not permitted|permission denied/i.test(message);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Neither the temp folder nor the cache folder can hold and run the library. */
|
|
154
|
+
export class RenderLibUnavailableError extends Error {
|
|
155
|
+
constructor(tempDir: string, cacheDir: string) {
|
|
156
|
+
super(
|
|
157
|
+
`Gloom can't load its render library: neither the temp folder ${tempDir} nor ${cacheDir} can hold and run it. `
|
|
158
|
+
+ "Start it with TMPDIR set to a writable folder that allows running programs: TMPDIR=/path/to/folder gloom",
|
|
159
|
+
);
|
|
160
|
+
this.name = "RenderLibUnavailableError";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export interface RenderLibLoadOptions {
|
|
165
|
+
/** Points @opentui/core at a library file (undefined: the one it picks) and loads it, throwing what loading threw. */
|
|
166
|
+
load(path?: string): void;
|
|
167
|
+
/** The library inside a standalone binary; null for a package or a checkout. */
|
|
168
|
+
embeddedPath: string | null;
|
|
169
|
+
tempDir: string;
|
|
170
|
+
cacheDir: string;
|
|
171
|
+
/** `/proc/self/maps`, or null where there is none. */
|
|
172
|
+
readMaps(): string | null;
|
|
173
|
+
/** When this process started, in epoch milliseconds. */
|
|
174
|
+
startedAtMs: number;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Loads the library from the temp folder, and from the cache folder when
|
|
179
|
+
* the temp folder cannot hold or run it. Anything this cannot help with is
|
|
180
|
+
* left as it was: the terminal then fails on it where it always did.
|
|
181
|
+
* Throws {@link RenderLibUnavailableError} when both folders fail.
|
|
182
|
+
*/
|
|
183
|
+
export function loadRenderLibWith(options: RenderLibLoadOptions): void {
|
|
184
|
+
const { load, embeddedPath, tempDir, cacheDir } = options;
|
|
185
|
+
let tempError: unknown;
|
|
186
|
+
try {
|
|
187
|
+
load();
|
|
188
|
+
if (embeddedPath) removeFiles(mappedExtractedCopies(options.readMaps() ?? "", realPath(tempDir)));
|
|
189
|
+
return;
|
|
190
|
+
} catch (error) {
|
|
191
|
+
if (!embeddedPath) return;
|
|
192
|
+
tempError = error;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
let size: number;
|
|
196
|
+
try {
|
|
197
|
+
size = statSync(embeddedPath).size;
|
|
198
|
+
} catch {
|
|
199
|
+
// Intentional ignore: without the embedded file there is nothing to copy, so the original failure stands.
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// The margin allows for file systems with coarse times.
|
|
203
|
+
removeFiles(failedExtractedCopies(tempDir, size, options.startedAtMs - 2_000));
|
|
204
|
+
|
|
205
|
+
let cachePath: string;
|
|
206
|
+
try {
|
|
207
|
+
cachePath = cachedCopy(embeddedPath, size, cacheDir);
|
|
208
|
+
} catch {
|
|
209
|
+
// The cache folder cannot hold it either. Only the temp folder's fault is reported as such.
|
|
210
|
+
if (isFolderFailure(tempError)) throw new RenderLibUnavailableError(tempDir, cacheDir);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
load(cachePath);
|
|
215
|
+
} catch (cacheError) {
|
|
216
|
+
if (isFolderFailure(tempError) && isFolderFailure(cacheError)) throw new RenderLibUnavailableError(tempDir, cacheDir);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function realPath(path: string): string {
|
|
221
|
+
try {
|
|
222
|
+
return realpathSync(path);
|
|
223
|
+
} catch {
|
|
224
|
+
// Intentional ignore: a temp folder that does not resolve holds nothing mapped.
|
|
225
|
+
return path;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function readProcessMaps(): string | null {
|
|
230
|
+
if (process.platform !== "linux") return null;
|
|
231
|
+
try {
|
|
232
|
+
return readFileSync("/proc/self/maps", "utf8");
|
|
233
|
+
} catch {
|
|
234
|
+
// Intentional ignore: without /proc the copy stays, as it always did.
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** Loads the render library for this process; see {@link loadRenderLibWith}. */
|
|
240
|
+
export async function loadRenderLib(): Promise<void> {
|
|
241
|
+
const { resolveRenderLib, setRenderLibPath } = await import("@opentui/core");
|
|
242
|
+
loadRenderLibWith({
|
|
243
|
+
load(path) {
|
|
244
|
+
if (path) setRenderLibPath(path);
|
|
245
|
+
resolveRenderLib();
|
|
246
|
+
},
|
|
247
|
+
embeddedPath: embeddedRenderLibPath(process.env),
|
|
248
|
+
tempDir: bunTempDir(process.env, process.platform),
|
|
249
|
+
cacheDir: getGloomberbDirs().nativeCache,
|
|
250
|
+
readMaps: readProcessMaps,
|
|
251
|
+
startedAtMs: performance.timeOrigin,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
@@ -3,7 +3,7 @@ import { testRender } from "@opentui/react/test-utils";
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* A global install runs react-reconciler without its patch (see
|
|
6
|
-
* bin/
|
|
6
|
+
* bin/gloom). If the dev build's user timing turns back on, every render
|
|
7
7
|
* adds a performance.measure entry that Bun never frees (#452).
|
|
8
8
|
*/
|
|
9
9
|
export async function assertRendersLeaveNoTimingEntries(): Promise<void> {
|
|
@@ -37,6 +37,9 @@ import {
|
|
|
37
37
|
readOrCreateInstallId,
|
|
38
38
|
} from "../../telemetry/crash-reports-node";
|
|
39
39
|
import { currentTelemetryConfig } from "../../telemetry/live-config";
|
|
40
|
+
import { installUpdateFailureReporter } from "../../telemetry/update-failures";
|
|
41
|
+
import { createNodeUpdateFailureHost } from "../../telemetry/update-failures-node";
|
|
42
|
+
import { terminalInstallKind } from "../../updater";
|
|
40
43
|
import { flushUsageCounts, installUsageCounter, usageCountsEnabled } from "../../telemetry/usage-counts";
|
|
41
44
|
import { attentionCountsEnabled, installAttentionCounter } from "../../telemetry/attention-counts";
|
|
42
45
|
import { starPromptEnvironmentAllows } from "../../app/star-prompt/model";
|
|
@@ -57,7 +60,7 @@ export async function startOpenTuiApp({ externalPlugins, cliLaunchRequest }: Sta
|
|
|
57
60
|
debugLog.interceptConsole();
|
|
58
61
|
|
|
59
62
|
const appLog = debugLog.createLogger("app");
|
|
60
|
-
appLog.info("
|
|
63
|
+
appLog.info("Gloom starting");
|
|
61
64
|
const remoteControlAdapter: RemoteControlAdapter = {
|
|
62
65
|
terminalDevice: { kind: "tui", name: hostname() },
|
|
63
66
|
startServer: ({ dataDir, handle }) => {
|
|
@@ -117,6 +120,10 @@ export async function startOpenTuiApp({ externalPlugins, cliLaunchRequest }: Sta
|
|
|
117
120
|
surface: "terminal",
|
|
118
121
|
getConfig: () => ({ dataDir: config.dataDir, telemetry: currentTelemetryConfig(config)?.telemetry }),
|
|
119
122
|
}));
|
|
123
|
+
installUpdateFailureReporter(createNodeUpdateFailureHost({
|
|
124
|
+
installKind: terminalInstallKind(),
|
|
125
|
+
getDataDir: () => config.dataDir,
|
|
126
|
+
}));
|
|
120
127
|
installUsageCounter({
|
|
121
128
|
surface: "terminal",
|
|
122
129
|
os: describeNodeOs(),
|