@gloom-sh/terminal 0.19.2 → 0.19.3
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 +7 -1
- package/package.json +1 -1
- package/patches/electrobun@1.18.1.patch +108 -1
- package/src/account/upgrade-dialog.tsx +4 -23
- package/src/api-client/coalesce.ts +118 -0
- package/src/api-client/credit-boards.ts +13 -0
- package/src/api-client/crypto-etf-flows.ts +6 -0
- package/src/api-client/crypto-markets.ts +40 -0
- package/src/api-client/data.ts +201 -14
- package/src/api-client/equity-screener.ts +10 -0
- package/src/api-client/errors.ts +20 -0
- package/src/api-client/gpu.ts +29 -0
- package/src/api-client/index.ts +5 -2
- package/src/api-client/plan-access.ts +10 -1
- package/src/api-client/plan-rules.ts +35 -0
- package/src/api-client/research-activity.ts +1 -32
- package/src/api-client/types.ts +21 -1
- package/src/app/attention-notice.tsx +94 -0
- package/src/app.tsx +23 -1
- package/src/architecture/core-builtin-allowlist.json +2 -1
- package/src/capabilities/factories.ts +1 -0
- package/src/cli/ascii-output.ts +42 -0
- package/src/cli/base-converter.ts +10 -2
- package/src/cli/command-options.ts +16 -1
- package/src/cli/commands/crypto-hints.ts +23 -4
- package/src/cli/commands/market.ts +92 -23
- package/src/cli/commands/news-search.ts +24 -5
- package/src/cli/commands/overview.ts +9 -4
- package/src/cli/commands/search.ts +71 -12
- package/src/cli/commands/system.ts +22 -30
- package/src/cli/commands/ticker.ts +49 -9
- package/src/cli/commands/version.ts +33 -0
- package/src/cli/context.ts +5 -9
- package/src/cli/data-dir.ts +7 -0
- package/src/cli/desktop-pane-shot-api-policy.ts +85 -0
- package/src/cli/desktop-pane-shot-browser.ts +320 -0
- package/src/cli/desktop-pane-shot-routes.ts +26 -1
- package/src/cli/desktop-pane-shot.ts +196 -256
- package/src/cli/early-command.ts +42 -0
- package/src/cli/earnings-calendar.ts +9 -0
- package/src/cli/entry.ts +19 -13
- package/src/cli/errors.ts +12 -2
- package/src/cli/help.ts +1 -1
- package/src/cli/history-export.ts +22 -2
- package/src/cli/history-rows.ts +154 -4
- package/src/cli/index.ts +18 -1
- package/src/cli/known-gaps.ts +40 -5
- package/src/cli/listing-arg.ts +46 -9
- package/src/cli/options.ts +1 -1
- package/src/cli/output-file.ts +60 -13
- package/src/cli/pane-functions/catalog.ts +14 -3
- package/src/cli/pane-functions/data.ts +1 -1
- package/src/cli/pane-functions/dom.ts +45 -0
- package/src/cli/pane-functions/freshness.ts +46 -9
- package/src/cli/pane-functions/function-help.ts +17 -9
- package/src/cli/pane-functions/headless.ts +22 -14
- package/src/cli/pane-functions/index.ts +6 -2
- package/src/cli/pane-functions/options.ts +6 -2
- package/src/cli/pane-functions/resolver.ts +27 -5
- package/src/cli/pane-functions/screenshot-assessment.ts +33 -0
- package/src/cli/pane-functions/screenshot-bridge.ts +94 -13
- package/src/cli/pane-functions/screenshot-http.ts +70 -0
- package/src/cli/pane-functions/screenshot-render.ts +19 -5
- package/src/cli/quote-answer.ts +20 -0
- package/src/cli/registry.ts +41 -13
- package/src/cli/result.ts +12 -6
- package/src/cli/ticker-resolution.ts +2 -1
- package/src/cli/types.ts +2 -0
- package/src/components/chart/composite/format.ts +3 -0
- package/src/components/chart-table/header.tsx +1 -1
- package/src/components/chart-table/layout.ts +28 -11
- package/src/components/command-bar/action-runtime.ts +4 -0
- package/src/components/command-bar/commands/direct/index.ts +18 -33
- package/src/components/command-bar/commands/direct/runtime.ts +5 -0
- package/src/components/command-bar/commands/registry.ts +10 -1
- package/src/components/command-bar/routes/root/command-items.ts +9 -4
- package/src/components/command-bar/routes/root/runtime.ts +24 -1
- package/src/components/command-bar/surface/index.tsx +9 -3
- package/src/components/company-logo.tsx +2 -1
- package/src/components/layout/header.tsx +8 -3
- package/src/components/layout/market-summary.ts +25 -7
- package/src/components/layout/pane/footer/index.tsx +7 -2
- package/src/components/layout/pane/footer/model.ts +40 -5
- package/src/components/market-board/index.tsx +3 -2
- package/src/components/onboarding/desks-step.tsx +12 -4
- package/src/components/onboarding/first-run-workspace.ts +81 -4
- package/src/components/onboarding/onboarding-frame.tsx +2 -1
- package/src/components/onboarding/onboarding-keyboard.ts +8 -5
- package/src/components/onboarding/onboarding-wizard.tsx +54 -23
- package/src/components/onboarding/portfolio-step/positions-panel.tsx +7 -2
- package/src/components/onboarding/run-setup-again.ts +24 -0
- package/src/components/onboarding/use-onboarding-progress.ts +33 -15
- package/src/components/onboarding/use-onboarding-upgrade.ts +2 -6
- package/src/components/onboarding/wizard-model.ts +57 -3
- package/src/components/onboarding/wizard-positions.ts +1 -1
- package/src/components/ui/delayed-mark.tsx +56 -0
- package/src/components/ui/external-link.tsx +3 -6
- package/src/components/ui/icon.tsx +8 -1
- package/src/components/ui/logo-mark.tsx +8 -5
- package/src/components/ui/stat-grid.tsx +263 -19
- package/src/data/config/store/node.ts +11 -5
- package/src/data/config/store/normalize.ts +16 -3
- package/src/data/profile-permissions.ts +47 -0
- package/src/data/resource-store.ts +34 -31
- package/src/data/sqlite/access.ts +19 -8
- package/src/data/sqlite/checkpointer.ts +95 -8
- package/src/data/sqlite/database.ts +40 -7
- package/src/docs/snapshot.json +191 -78
- package/src/i18n/es.ts +18 -2
- package/src/i18n/ja.ts +18 -2
- package/src/i18n/ko.ts +18 -2
- package/src/i18n/zh-cn.ts +18 -2
- package/src/i18n/zh-tw.ts +18 -2
- package/src/layout/desk-keys.ts +4 -1
- package/src/layout/desks.ts +38 -5
- package/src/layout-marketplace/gallery-desktop.tsx +45 -16
- package/src/market-data/batched-reads.ts +16 -0
- package/src/market-data/coordinator/auxiliary.ts +4 -2
- package/src/market-data/coordinator/index.ts +11 -2
- package/src/market-data/futures-board.ts +1 -1
- package/src/market-data/futures-contract.ts +3 -1
- package/src/market-data/market/index-level.ts +6 -4
- package/src/market-data/published-apac-sessions.ts +6 -0
- package/src/news/aggregator.ts +7 -4
- package/src/news/news-model.ts +11 -0
- package/src/news/story-id.ts +22 -0
- package/src/news/ticker-symbols.ts +17 -1
- package/src/notifications/app-notifier.ts +35 -14
- package/src/plugins/builtin/account-management/form-components.tsx +1 -1
- package/src/plugins/builtin/account-management/index.tsx +2 -3
- package/src/plugins/builtin/account-management/model.ts +1 -1
- package/src/plugins/builtin/alerts/cli-forms.ts +15 -1
- package/src/plugins/builtin/alerts/events-pane.tsx +7 -5
- package/src/plugins/builtin/alerts/events.ts +10 -2
- package/src/plugins/builtin/alerts/index.tsx +5 -5
- package/src/plugins/builtin/alerts/research-builder.ts +5 -1
- package/src/plugins/builtin/alerts/research-rules.ts +18 -0
- package/src/plugins/builtin/alerts/targets.ts +4 -1
- package/src/plugins/builtin/attention/headless.ts +1 -1
- package/src/plugins/builtin/attention/index.tsx +2 -4
- package/src/plugins/builtin/attention/listing.ts +1 -1
- package/src/plugins/builtin/attention/series.ts +1 -1
- package/src/plugins/builtin/awards/index.tsx +1 -2
- package/src/plugins/builtin/backtest/client.ts +1 -0
- package/src/plugins/builtin/backtest/index.tsx +1 -2
- package/src/plugins/builtin/backtest/rules.ts +3 -1
- package/src/plugins/builtin/backtest/window.ts +8 -7
- package/src/plugins/builtin/broker-manager/detail.tsx +16 -3
- package/src/plugins/builtin/broker-manager/index.tsx +1 -1
- package/src/plugins/builtin/buildout/cells.tsx +5 -0
- package/src/plugins/builtin/buildout/company/flow.tsx +367 -0
- package/src/plugins/builtin/buildout/company/id.ts +2 -0
- package/src/plugins/builtin/buildout/company/model.ts +247 -0
- package/src/plugins/builtin/buildout/company/pane.tsx +317 -0
- package/src/plugins/builtin/buildout/data-runtime.ts +31 -10
- package/src/plugins/builtin/buildout/facilities.ts +309 -0
- package/src/plugins/builtin/buildout/format.ts +9 -0
- package/src/plugins/builtin/buildout/index.tsx +51 -5
- package/src/plugins/builtin/buildout/model/index.ts +62 -10
- package/src/plugins/builtin/buildout/model/normalizers.ts +5 -0
- package/src/plugins/builtin/buildout/model/types.ts +11 -2
- package/src/plugins/builtin/buildout/pane/index.tsx +91 -20
- package/src/plugins/builtin/buildout/pane/status.tsx +1 -1
- package/src/plugins/builtin/buildout/pane/themes.tsx +110 -0
- package/src/plugins/builtin/buildout/table-model.ts +26 -2
- package/src/plugins/builtin/builtin-plugin-meta.ts +16 -0
- package/src/plugins/builtin/cds/headless.ts +10 -2
- package/src/plugins/builtin/cds/model.ts +7 -3
- package/src/plugins/builtin/central-bank-rates/index.tsx +1 -2
- package/src/plugins/builtin/central-bank-rates/pane.tsx +2 -1
- package/src/plugins/builtin/changelog/index.tsx +3 -2
- package/src/plugins/builtin/chart-composer/headless-schema.ts +7 -2
- package/src/plugins/builtin/chart-composer/headless.ts +88 -21
- package/src/plugins/builtin/chart-composer/index.tsx +2 -3
- package/src/plugins/builtin/chart-composer/pane.tsx +26 -2
- package/src/plugins/builtin/chart-composer/series-expression.ts +3 -2
- package/src/plugins/builtin/chart-composer/studies.ts +1 -1
- package/src/plugins/builtin/chat/controller/index.ts +1 -1
- package/src/plugins/builtin/chat/controller/messages.ts +15 -4
- package/src/plugins/builtin/chat/ghost-user.ts +8 -0
- package/src/plugins/builtin/chat/index.tsx +5 -5
- package/src/plugins/builtin/clinical-trials/index.tsx +1 -2
- package/src/plugins/builtin/cloud/company-picker.tsx +1 -1
- package/src/plugins/builtin/cloud/index.tsx +1 -2
- package/src/plugins/builtin/cloud/plugin.tsx +6 -4
- package/src/plugins/builtin/cloud/team/module.tsx +1 -1
- package/src/plugins/builtin/cloud/thesis/module.tsx +1 -1
- package/src/plugins/builtin/cloud/trial-offer-status-widget.tsx +24 -1
- package/src/plugins/builtin/cloud/upgrade-status-widget.tsx +39 -15
- package/src/plugins/builtin/comment-letters/index.tsx +1 -2
- package/src/plugins/builtin/commodity-balances/index.tsx +3 -3
- package/src/plugins/builtin/commodity-balances/pane.tsx +2 -2
- package/src/plugins/builtin/congress-trades/aggregates.ts +13 -2
- package/src/plugins/builtin/congress-trades/detail.tsx +20 -4
- package/src/plugins/builtin/congress-trades/headless.ts +2 -0
- package/src/plugins/builtin/congress-trades/model.ts +92 -64
- package/src/plugins/builtin/congress-trades/table.tsx +14 -2
- package/src/plugins/builtin/connections/index.ts +2 -3
- package/src/plugins/builtin/cot/index.tsx +1 -2
- package/src/plugins/builtin/cpi/index.tsx +1 -2
- package/src/plugins/builtin/credit-boards/cdx-pane.tsx +2 -1
- package/src/plugins/builtin/credit-boards/client.ts +7 -2
- package/src/plugins/builtin/credit-boards/headless.ts +25 -12
- package/src/plugins/builtin/credit-boards/model.ts +29 -0
- package/src/plugins/builtin/credit-boards/sovr-pane.tsx +9 -4
- package/src/plugins/builtin/crypto-board/bitcoin-network.ts +143 -0
- package/src/plugins/builtin/crypto-board/headless.ts +4 -3
- package/src/plugins/builtin/crypto-board/index.tsx +4 -2
- package/src/plugins/builtin/crypto-board/series.ts +2 -0
- package/src/plugins/builtin/crypto-etf-flows/client.ts +9 -2
- package/src/plugins/builtin/crypto-etf-flows/headless.ts +61 -6
- package/src/plugins/builtin/crypto-etf-flows/index.tsx +1 -2
- package/src/plugins/builtin/crypto-etf-flows/model.ts +14 -1
- package/src/plugins/builtin/crypto-etf-flows/pane.tsx +8 -5
- package/src/plugins/builtin/debt-maturities/headless.ts +4 -3
- package/src/plugins/builtin/debt-maturities/model.ts +17 -1
- package/src/plugins/builtin/debt-maturities/pane.tsx +18 -4
- package/src/plugins/builtin/debug/index.tsx +1 -1
- package/src/plugins/builtin/dividend-yield/client.ts +32 -2
- package/src/plugins/builtin/dividend-yield/headless.ts +58 -33
- package/src/plugins/builtin/dividend-yield/index.tsx +37 -2
- package/src/plugins/builtin/dividend-yield/pane.tsx +32 -13
- package/src/plugins/builtin/dividend-yield/ranking-reads.ts +73 -0
- package/src/plugins/builtin/dividend-yield/ranking-view.tsx +163 -0
- package/src/plugins/builtin/dividend-yield/ranking.ts +1 -1
- package/src/plugins/builtin/dividend-yield/view.ts +21 -0
- package/src/plugins/builtin/docs/index.tsx +2 -3
- package/src/plugins/builtin/doe/headless.ts +16 -3
- package/src/plugins/builtin/doe/index.tsx +5 -4
- package/src/plugins/builtin/earnings/board.tsx +2 -1
- package/src/plugins/builtin/earnings/history.tsx +2 -1
- package/src/plugins/builtin/earnings-ripple/client.ts +32 -7
- package/src/plugins/builtin/earnings-ripple/index.tsx +1 -2
- package/src/plugins/builtin/econ/calendar-model.ts +29 -6
- package/src/plugins/builtin/econ-statistics/index.tsx +1 -2
- package/src/plugins/builtin/equity-screener/client.ts +1 -1
- package/src/plugins/builtin/equity-screener/headless.ts +1 -0
- package/src/plugins/builtin/equity-screener/ideas.ts +30 -1
- package/src/plugins/builtin/equity-screener/index.tsx +1 -2
- package/src/plugins/builtin/equity-screener/model.ts +28 -4
- package/src/plugins/builtin/equity-screener/pane.tsx +5 -0
- package/src/plugins/builtin/equity-screener/screen-check.ts +23 -1
- package/src/plugins/builtin/estimate-revisions/index.tsx +1 -2
- package/src/plugins/builtin/exposure/holdings.ts +35 -13
- package/src/plugins/builtin/exposure/index.tsx +1 -2
- package/src/plugins/builtin/fear-greed/cli.ts +44 -0
- package/src/plugins/builtin/fear-greed/index.tsx +5 -53
- package/src/plugins/builtin/fear-greed/pane.tsx +2 -1
- package/src/plugins/builtin/fixed-income/index.tsx +1 -2
- package/src/plugins/builtin/futures/board-reads.ts +25 -0
- package/src/plugins/builtin/futures/coalesced-bump.ts +44 -0
- package/src/plugins/builtin/futures/index.tsx +15 -0
- package/src/plugins/builtin/futures/model.ts +14 -0
- package/src/plugins/builtin/futures/use-board-terms.ts +22 -15
- package/src/plugins/builtin/futures/use-front-returns.ts +20 -14
- package/src/plugins/builtin/futures-curve/headless.ts +6 -1
- package/src/plugins/builtin/futures-curve/index.tsx +1 -2
- package/src/plugins/builtin/fx-matrix/index.tsx +2 -2
- package/src/plugins/builtin/gpu/board.tsx +51 -12
- package/src/plugins/builtin/gpu/client.ts +15 -2
- package/src/plugins/builtin/gpu/equities.tsx +5 -2
- package/src/plugins/builtin/gpu/headless.ts +14 -2
- package/src/plugins/builtin/gpu/index.tsx +1 -2
- package/src/plugins/builtin/gpu/model.ts +20 -2
- package/src/plugins/builtin/gpu/pane.tsx +1 -1
- package/src/plugins/builtin/help/index.tsx +1 -1
- package/src/plugins/builtin/holders/index-holders.ts +24 -12
- package/src/plugins/builtin/holders/index.tsx +2 -3
- package/src/plugins/builtin/ipo-calendar/index.tsx +1 -2
- package/src/plugins/builtin/iv-history/index.tsx +1 -2
- package/src/plugins/builtin/jodi/index.tsx +1 -2
- package/src/plugins/builtin/kelly-sizer/index.tsx +1 -2
- package/src/plugins/builtin/layout-manager/index.tsx +9 -8
- package/src/plugins/builtin/macro-day/pane.tsx +4 -2
- package/src/plugins/builtin/market-halts/index.tsx +1 -2
- package/src/plugins/builtin/market-heatmap/index.tsx +11 -2
- package/src/plugins/builtin/market-movers/index.tsx +7 -1
- package/src/plugins/builtin/market-movers/session-body.tsx +4 -1
- package/src/plugins/builtin/market-valuation/index.tsx +1 -2
- package/src/plugins/builtin/members/index.tsx +1 -2
- package/src/plugins/builtin/money-markets/index.tsx +1 -2
- package/src/plugins/builtin/money-markets/pane.tsx +2 -1
- package/src/plugins/builtin/news/headless.ts +7 -0
- package/src/plugins/builtin/news/wire/index.tsx +1 -1
- package/src/plugins/builtin/news/wire/news/pop-out.tsx +9 -3
- package/src/plugins/builtin/notes/index.tsx +3 -6
- package/src/plugins/builtin/openfda/index.tsx +1 -2
- package/src/plugins/builtin/options/view.tsx +6 -5
- package/src/plugins/builtin/options-calculator/index.tsx +1 -2
- package/src/plugins/builtin/options-positioning/index.tsx +1 -2
- package/src/plugins/builtin/options-scenario/index.tsx +2 -4
- package/src/plugins/builtin/perps/index.tsx +1 -2
- package/src/plugins/builtin/plugin-marketplace/index.tsx +2 -3
- package/src/plugins/builtin/plugin-marketplace/pane.tsx +2 -1
- package/src/plugins/builtin/plugin-module.ts +16 -2
- package/src/plugins/builtin/portfolio-list/cli/render.ts +53 -3
- package/src/plugins/builtin/portfolio-list/index.tsx +1 -2
- package/src/plugins/builtin/portfolio-list/pane/index.tsx +11 -0
- package/src/plugins/builtin/portfolio-list/quick-add/index.tsx +2 -2
- package/src/plugins/builtin/power/index.tsx +1 -2
- package/src/plugins/builtin/rate-path/index.tsx +1 -2
- package/src/plugins/builtin/realized-vol/headless.ts +2 -0
- package/src/plugins/builtin/realized-vol/index.tsx +1 -2
- package/src/plugins/builtin/realized-vol/model.ts +16 -2
- package/src/plugins/builtin/realized-vol/pane.tsx +3 -3
- package/src/plugins/builtin/relative-rotation/index.tsx +1 -2
- package/src/plugins/builtin/research/analyst-headless.ts +33 -6
- package/src/plugins/builtin/research/analyst-model.ts +37 -2
- package/src/plugins/builtin/research/analyst-pane.tsx +25 -5
- package/src/plugins/builtin/research/index.tsx +5 -8
- package/src/plugins/builtin/research-search/index.tsx +1 -2
- package/src/plugins/builtin/revenue-breakdown/headless.ts +22 -8
- package/src/plugins/builtin/revenue-breakdown/model.ts +23 -0
- package/src/plugins/builtin/reverse-dcf/pane.tsx +4 -2
- package/src/plugins/builtin/roadmap/index.tsx +2 -3
- package/src/plugins/builtin/roadmap/pane.tsx +49 -2
- package/src/plugins/builtin/scanner/hilo-model.ts +18 -1
- package/src/plugins/builtin/scanner/hilo-pane.tsx +12 -2
- package/src/plugins/builtin/scanner/live-pane.tsx +7 -4
- package/src/plugins/builtin/sec/filing-content.ts +38 -6
- package/src/plugins/builtin/sec/headless.ts +5 -1
- package/src/plugins/builtin/sec/index.tsx +4 -2
- package/src/plugins/builtin/sec/model.ts +2 -0
- package/src/plugins/builtin/sectors/index.tsx +11 -5
- package/src/plugins/builtin/series-inventory.ts +2 -0
- package/src/plugins/builtin/shared/cloud-resource.ts +60 -0
- package/src/plugins/builtin/shared/cloud-upgrade.ts +24 -1
- package/src/plugins/builtin/shared/forming-bars.ts +29 -0
- package/src/plugins/builtin/shared/fx-rate-freshness.ts +17 -0
- package/src/plugins/builtin/shared/series-detail-chart.tsx +4 -2
- package/src/plugins/builtin/shared/use-quote-board.ts +5 -0
- package/src/plugins/builtin/short-interest/publications-pane.tsx +2 -1
- package/src/plugins/builtin/short-volume/pane.tsx +2 -1
- package/src/plugins/builtin/social-mentions/index.tsx +1 -2
- package/src/plugins/builtin/social-mentions/pane.tsx +2 -1
- package/src/plugins/builtin/supply-chain/client.ts +22 -1
- package/src/plugins/builtin/supply-chain/graph-client.ts +22 -1
- package/src/plugins/builtin/supply-chain/index.tsx +1 -2
- package/src/plugins/builtin/thirteenf/api.ts +116 -13
- package/src/plugins/builtin/thirteenf/data.ts +132 -30
- package/src/plugins/builtin/thirteenf/index.tsx +2 -4
- package/src/plugins/builtin/thirteenf/model.ts +2 -0
- package/src/plugins/builtin/thirteenf/pane.tsx +20 -11
- package/src/plugins/builtin/thirteenf/types.ts +12 -0
- package/src/plugins/builtin/ticker-detail/data-panes/historical-prices.tsx +17 -4
- package/src/plugins/builtin/ticker-detail/data-panes/returns-history.ts +81 -11
- package/src/plugins/builtin/ticker-detail/headless.ts +11 -3
- package/src/plugins/builtin/ticker-detail/index.tsx +5 -10
- package/src/plugins/builtin/ticker-detail/overview-tab.tsx +16 -6
- package/src/plugins/builtin/time-sales/index.tsx +1 -2
- package/src/plugins/builtin/time-sales/pane.tsx +3 -1
- package/src/plugins/builtin/trace-bonds/headless.ts +11 -2
- package/src/plugins/builtin/trace-bonds/model.ts +44 -10
- package/src/plugins/builtin/trace-bonds/pane.tsx +12 -7
- package/src/plugins/builtin/treasury-auctions/pane.tsx +2 -2
- package/src/plugins/builtin/vol-surface/client.ts +18 -3
- package/src/plugins/builtin/vol-surface/index.tsx +1 -2
- package/src/plugins/builtin/volatility/index.tsx +1 -2
- package/src/plugins/builtin/world-indices/footer.ts +6 -1
- package/src/plugins/builtin/world-venue-map/client.ts +10 -1
- package/src/plugins/builtin/world-venue-map/index.ts +6 -2
- package/src/plugins/builtin/world-venue-map/layered-pane.tsx +48 -7
- package/src/plugins/builtin/world-venue-map/layers.ts +17 -0
- package/src/plugins/builtin/world-venue-map/local-layers.ts +141 -0
- package/src/plugins/builtin/world-venue-map/map-symbols.ts +18 -0
- package/src/plugins/builtin/world-venue-map/map.tsx +4 -2
- package/src/plugins/builtin/world-venue-map/scope.ts +63 -0
- package/src/plugins/builtin/yield-curve/curves.ts +16 -2
- package/src/plugins/builtin/yield-curve/headless.ts +3 -3
- package/src/plugins/bundle.ts +52 -2
- package/src/plugins/catalog-browser.ts +2 -2
- package/src/plugins/catalog-cli.ts +20 -0
- package/src/plugins/host-link.ts +13 -1
- package/src/plugins/installer.ts +15 -4
- package/src/plugins/loader.ts +43 -11
- package/src/plugins/peer-imports.ts +201 -0
- package/src/plugins/peer-retry.ts +26 -29
- package/src/plugins/plugin-process.ts +128 -0
- package/src/plugins/redirection-guard.ts +45 -0
- package/src/remote/endpoint.ts +16 -3
- package/src/renderers/browser/main.tsx +3 -2
- package/src/renderers/cloudflare/http-proxy.ts +7 -123
- package/src/renderers/dom/desktop/icons.tsx +2 -0
- package/src/renderers/dom/host/image-surface.tsx +46 -21
- package/src/renderers/dom/styles.css +7 -0
- package/src/renderers/dom/toast-host.tsx +2 -0
- package/src/renderers/electrobun/bun/desktop/backend.ts +7 -1
- package/src/renderers/electrobun/bun/desktop/initialization.ts +3 -2
- package/src/renderers/electrobun/bun/desktop/rpc-timing.ts +88 -0
- package/src/renderers/electrobun/bun/desktop/update.ts +20 -4
- package/src/renderers/electrobun/bun/desktop/view-ids.ts +8 -4
- package/src/renderers/electrobun/bun/external-plugins.ts +4 -0
- package/src/renderers/electrobun/bun/window/create.ts +4 -2
- package/src/renderers/electrobun/bun/window/native-timing.ts +48 -0
- package/src/renderers/electrobun/view/cli-pane-shot-entry.tsx +82 -4
- package/src/renderers/electrobun/view/cli-pane-shot-frame.tsx +13 -5
- package/src/renderers/electrobun/view/desktop/window/snapshot.ts +3 -0
- package/src/renderers/electrobun/view/main.tsx +7 -2
- package/src/renderers/electrobun/view/remote/asset-data-client.ts +1 -0
- package/src/renderers/opentui/browser-open.ts +10 -4
- package/src/renderers/opentui/image/surface.tsx +1 -1
- package/src/renderers/opentui/start.tsx +12 -6
- package/src/renderers/opentui/toast-host.tsx +2 -1
- package/src/series/registry.ts +18 -0
- package/src/series/standalone.ts +10 -1
- package/src/series/types.ts +7 -0
- package/src/series/validate.ts +11 -2
- package/src/sources/gloomberb-cloud/index.ts +28 -5
- package/src/sources/gloomberb-cloud/news.ts +24 -3
- package/src/sources/gloomberb-cloud/normalizers.ts +17 -2
- package/src/sources/provider-errors.ts +26 -3
- package/src/sources/provider-router/history.ts +5 -0
- package/src/sources/provider-router/index.ts +13 -0
- package/src/sync/core-contributors.ts +32 -0
- package/src/telemetry/attention-counts.ts +64 -6
- package/src/telemetry/attention-setting.ts +33 -0
- package/src/telemetry/crash-reports-node.ts +3 -1
- package/src/telemetry/stall-clocks.ts +93 -0
- package/src/telemetry/stall-reports-node.ts +12 -7
- package/src/telemetry/stall-reports.ts +34 -5
- package/src/test-support/preload.ts +9 -0
- package/src/tickers/company-name.ts +19 -0
- package/src/tickers/listing-fate.ts +14 -3
- package/src/tickers/saved-instrument.ts +17 -0
- package/src/tickers/search/home-listing.ts +13 -2
- package/src/tickers/search/index.ts +4 -1
- package/src/tickers/search/types.ts +6 -1
- package/src/time-series/bar-aggregation.ts +7 -1
- package/src/time-series/base-series.ts +3 -3
- package/src/time-series/chart-bounds.ts +1 -1
- package/src/time-series/chart-data.ts +5 -2
- package/src/time-series/chart-seed.ts +1 -1
- package/src/time-series/coin-session-close.ts +211 -0
- package/src/time-series/live-bars.ts +13 -2
- package/src/time-series/live-quotes.ts +1 -1
- package/src/time-series/official-close.ts +159 -0
- package/src/time-series/price-comparison.ts +55 -6
- package/src/time-series/resolve.ts +12 -3
- package/src/time-series/series-presentation.ts +1 -1
- package/src/time-series/studies/formula.ts +205 -0
- package/src/time-series/studies/indicators.ts +299 -0
- package/src/time-series/studies/leverage.ts +75 -0
- package/src/time-series/studies/pair.ts +138 -0
- package/src/time-series/studies/resolve.ts +333 -0
- package/src/time-series/studies/shared.ts +141 -0
- package/src/time-series/studies/units.ts +243 -0
- package/src/time-series/studies/vwap.ts +274 -0
- package/src/types/config.ts +18 -2
- package/src/types/data-provider.ts +23 -0
- package/src/types/financials.ts +22 -0
- package/src/types/headless.ts +42 -3
- package/src/types/plugin.ts +32 -3
- package/src/ui/host.tsx +11 -0
- package/src/ui/toast.tsx +26 -1
- package/src/utils/ascii-text.ts +140 -0
- package/src/utils/cli-output.ts +91 -18
- package/src/utils/concurrency.ts +24 -0
- package/src/utils/exchanges.ts +6 -0
- package/src/utils/external-url.ts +20 -7
- package/src/utils/futures-generic.ts +4 -4
- package/src/utils/http-proxy-upstream.ts +124 -0
- package/src/utils/main-thread-stall.ts +75 -3
- package/src/utils/perf-marks.ts +36 -2
- package/src/utils/private-files.ts +141 -0
- package/src/utils/public-address.ts +99 -0
- package/src/account/upgrade-personalization.ts +0 -57
- package/src/account/upgrade-tickers.ts +0 -124
- package/src/api-client/upgrade-experiment.ts +0 -91
- package/src/plugins/builtin/cloud/browser.tsx +0 -3
- package/src/renderers/electrobun/launcher/preload.ts +0 -13
- package/src/renderers/electrobun/launcher/windows-emulation.ts +0 -50
- package/src/time-series/studies.ts +0 -1628
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolve } from "path";
|
|
2
2
|
import { debugLog } from "../../utils/debug-log";
|
|
3
3
|
import { logFailure } from "../../utils/log-failure";
|
|
4
|
+
import { recordPerfSample } from "../../utils/perf-marks";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Pages SQLite lets the WAL grow to before the connection that commits
|
|
@@ -13,13 +14,25 @@ export const SQLITE_BACKSTOP_AUTOCHECKPOINT_PAGES = 10_000;
|
|
|
13
14
|
const CHECKPOINT_DELAY_MS = 1_000;
|
|
14
15
|
/** How long closing waits for the checkpointer to let go of the file (Windows cannot delete an open one). */
|
|
15
16
|
const CLOSE_WAIT_MS = 1_000;
|
|
17
|
+
/**
|
|
18
|
+
* How long the thread may go without answering while it owes an answer
|
|
19
|
+
* (opening its connection, or a checkpoint) before it counts as stuck. A
|
|
20
|
+
* stuck thread flushes nothing, and the app's commits of user data skip
|
|
21
|
+
* their flush while it runs, so past this they flush again. The slowest
|
|
22
|
+
* checkpoint measured on Windows took under a second, and the slowest
|
|
23
|
+
* flush in stall reports 8 s.
|
|
24
|
+
*/
|
|
25
|
+
const STUCK_AFTER_MS = 30_000;
|
|
16
26
|
|
|
17
27
|
const checkpointLog = debugLog.createLogger("sqlite");
|
|
18
28
|
|
|
19
29
|
/**
|
|
20
30
|
* Runs on its own thread with its own connection. A passive checkpoint
|
|
21
31
|
* copies what it can without waiting on a lock and never stops the app's
|
|
22
|
-
* connection from reading or writing meanwhile.
|
|
32
|
+
* connection from reading or writing meanwhile. It flushes the WAL to disk
|
|
33
|
+
* before copying it, and the database after: that flush is what makes the
|
|
34
|
+
* app's writes of user data durable (access.ts), so it never runs with
|
|
35
|
+
* `synchronous=OFF`.
|
|
23
36
|
*/
|
|
24
37
|
const WORKER_SOURCE = `
|
|
25
38
|
import { Database } from "bun:sqlite";
|
|
@@ -32,6 +45,7 @@ self.onmessage = (event) => {
|
|
|
32
45
|
try {
|
|
33
46
|
db = new Database(message.path);
|
|
34
47
|
db.exec("PRAGMA busy_timeout=1000");
|
|
48
|
+
db.exec("PRAGMA synchronous=FULL");
|
|
35
49
|
postMessage({ type: "ready" });
|
|
36
50
|
} catch (error) {
|
|
37
51
|
postMessage({ type: "failed", message: String(error && error.message || error) });
|
|
@@ -43,7 +57,15 @@ self.onmessage = (event) => {
|
|
|
43
57
|
const startedAt = performance.now();
|
|
44
58
|
try {
|
|
45
59
|
const result = db.query("PRAGMA wal_checkpoint(PASSIVE)").get();
|
|
46
|
-
|
|
60
|
+
const endedAt = performance.now();
|
|
61
|
+
// Wall-clock times, so a pause on the app's thread can be lined up with it.
|
|
62
|
+
postMessage({
|
|
63
|
+
type: "checkpointed",
|
|
64
|
+
ms: endedAt - startedAt,
|
|
65
|
+
startedAt: performance.timeOrigin + startedAt,
|
|
66
|
+
endedAt: performance.timeOrigin + endedAt,
|
|
67
|
+
result,
|
|
68
|
+
});
|
|
47
69
|
} catch (error) {
|
|
48
70
|
postMessage({ type: "failed", message: String(error && error.message || error) });
|
|
49
71
|
}
|
|
@@ -65,6 +87,13 @@ self.onmessage = (event) => {
|
|
|
65
87
|
};
|
|
66
88
|
`;
|
|
67
89
|
|
|
90
|
+
export interface WalCheckpointerOptions {
|
|
91
|
+
/** Overrides how long the thread may owe an answer before it counts as stuck. */
|
|
92
|
+
stuckAfterMs?: number;
|
|
93
|
+
/** Overrides the thread's code, so a test can run one that never answers. */
|
|
94
|
+
workerSource?: string;
|
|
95
|
+
}
|
|
96
|
+
|
|
68
97
|
export interface WalCheckpointer {
|
|
69
98
|
/** Writes were committed: the WAL is copied into the database shortly, off this thread. */
|
|
70
99
|
nudge(): void;
|
|
@@ -76,6 +105,8 @@ interface WorkerMessage {
|
|
|
76
105
|
type: "ready" | "failed" | "checkpointed";
|
|
77
106
|
message?: string;
|
|
78
107
|
ms?: number;
|
|
108
|
+
startedAt?: number;
|
|
109
|
+
endedAt?: number;
|
|
79
110
|
result?: { busy?: number; log?: number; checkpointed?: number };
|
|
80
111
|
}
|
|
81
112
|
|
|
@@ -87,15 +118,21 @@ interface WorkerMessage {
|
|
|
87
118
|
* disk, on the thread that asked for the write. That is the app's only
|
|
88
119
|
* thread, and the copy takes 150 ms to a second on a laptop, more under an
|
|
89
120
|
* antivirus. The app's connection leaves it to this instead (see
|
|
90
|
-
* database.ts),
|
|
91
|
-
* thread cannot
|
|
121
|
+
* database.ts), along with flushing what it commits, and `onFailure` puts
|
|
122
|
+
* SQLite's own schedule and the app's flushes back when the thread cannot
|
|
123
|
+
* run.
|
|
92
124
|
*
|
|
93
125
|
* Null where there is no Worker to run it on.
|
|
94
126
|
*/
|
|
95
|
-
export function startWalCheckpointer(
|
|
127
|
+
export function startWalCheckpointer(
|
|
128
|
+
dbPath: string,
|
|
129
|
+
onFailure: () => void,
|
|
130
|
+
options: WalCheckpointerOptions = {},
|
|
131
|
+
): WalCheckpointer | null {
|
|
96
132
|
if (typeof Worker === "undefined" || typeof Blob === "undefined" || typeof URL.createObjectURL !== "function") return null;
|
|
97
133
|
let worker: Worker;
|
|
98
|
-
const source = URL.createObjectURL(new Blob([WORKER_SOURCE], { type: "application/javascript" }));
|
|
134
|
+
const source = URL.createObjectURL(new Blob([options.workerSource ?? WORKER_SOURCE], { type: "application/javascript" }));
|
|
135
|
+
const stuckAfterMs = options.stuckAfterMs ?? STUCK_AFTER_MS;
|
|
99
136
|
try {
|
|
100
137
|
worker = new Worker(source);
|
|
101
138
|
} catch (error) {
|
|
@@ -110,10 +147,21 @@ export function startWalCheckpointer(dbPath: string, onFailure: () => void): Wal
|
|
|
110
147
|
let running = false;
|
|
111
148
|
let pending = false;
|
|
112
149
|
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
150
|
+
/** Messages the thread has yet to answer, and the clock on its next answer. */
|
|
151
|
+
let owed = 0;
|
|
152
|
+
let watchdog: ReturnType<typeof setTimeout> | null = null;
|
|
153
|
+
|
|
154
|
+
const stopWatching = () => {
|
|
155
|
+
if (watchdog) clearTimeout(watchdog);
|
|
156
|
+
watchdog = null;
|
|
157
|
+
};
|
|
113
158
|
|
|
114
159
|
const fail = (reason: string) => {
|
|
115
160
|
if (failed || stopped) return;
|
|
116
161
|
failed = true;
|
|
162
|
+
stopWatching();
|
|
163
|
+
if (timer) clearTimeout(timer);
|
|
164
|
+
timer = null;
|
|
117
165
|
checkpointLog.warn("The WAL checkpointer stopped; commits checkpoint themselves", { reason });
|
|
118
166
|
try {
|
|
119
167
|
onFailure();
|
|
@@ -141,13 +189,42 @@ export function startWalCheckpointer(dbPath: string, onFailure: () => void): Wal
|
|
|
141
189
|
}
|
|
142
190
|
};
|
|
143
191
|
|
|
192
|
+
/**
|
|
193
|
+
* Restarts the clock whenever the thread answers and still owes one. A
|
|
194
|
+
* thread stuck without an error event would otherwise leave user writes
|
|
195
|
+
* unflushed until the backstop checkpoint or close.
|
|
196
|
+
*/
|
|
197
|
+
const watch = () => {
|
|
198
|
+
stopWatching();
|
|
199
|
+
if (owed === 0 || failed || stopped) return;
|
|
200
|
+
watchdog = setTimeout(() => {
|
|
201
|
+
watchdog = null;
|
|
202
|
+
fail(`no answer in ${stuckAfterMs} ms`);
|
|
203
|
+
terminate();
|
|
204
|
+
URL.revokeObjectURL(source);
|
|
205
|
+
}, stuckAfterMs);
|
|
206
|
+
(watchdog as { unref?: () => void }).unref?.();
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
const ask = (message: { type: string; path?: string; closed?: SharedArrayBuffer }): boolean => {
|
|
210
|
+
if (!post(message)) return false;
|
|
211
|
+
owed += 1;
|
|
212
|
+
if (owed === 1) watch();
|
|
213
|
+
return true;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const answered = () => {
|
|
217
|
+
owed = Math.max(0, owed - 1);
|
|
218
|
+
watch();
|
|
219
|
+
};
|
|
220
|
+
|
|
144
221
|
const schedule = () => {
|
|
145
222
|
if (timer || running || failed || stopped) return;
|
|
146
223
|
timer = setTimeout(() => {
|
|
147
224
|
timer = null;
|
|
148
225
|
if (failed || stopped) return;
|
|
149
226
|
pending = false;
|
|
150
|
-
running =
|
|
227
|
+
running = ask({ type: "checkpoint" });
|
|
151
228
|
}, CHECKPOINT_DELAY_MS);
|
|
152
229
|
(timer as { unref?: () => void }).unref?.();
|
|
153
230
|
};
|
|
@@ -155,6 +232,7 @@ export function startWalCheckpointer(dbPath: string, onFailure: () => void): Wal
|
|
|
155
232
|
worker.onmessage = (event: MessageEvent<WorkerMessage>) => {
|
|
156
233
|
const message = event.data;
|
|
157
234
|
if (message.type === "ready") {
|
|
235
|
+
answered();
|
|
158
236
|
URL.revokeObjectURL(source);
|
|
159
237
|
return;
|
|
160
238
|
}
|
|
@@ -163,14 +241,22 @@ export function startWalCheckpointer(dbPath: string, onFailure: () => void): Wal
|
|
|
163
241
|
return;
|
|
164
242
|
}
|
|
165
243
|
if (message.type === "checkpointed") {
|
|
244
|
+
answered();
|
|
166
245
|
running = false;
|
|
246
|
+
// On its own thread, so never the step a stall of the app's names.
|
|
247
|
+
recordPerfSample("sqlite.checkpoint", message.ms ?? 0, {
|
|
248
|
+
pages: message.result?.log,
|
|
249
|
+
copied: message.result?.checkpointed,
|
|
250
|
+
startedAt: Math.round(message.startedAt ?? 0),
|
|
251
|
+
endedAt: Math.round(message.endedAt ?? 0),
|
|
252
|
+
}, { lastStep: false });
|
|
167
253
|
if (pending) schedule();
|
|
168
254
|
}
|
|
169
255
|
};
|
|
170
256
|
worker.onerror = (event) => {
|
|
171
257
|
fail(event.message);
|
|
172
258
|
};
|
|
173
|
-
if (!
|
|
259
|
+
if (!ask({ type: "open", path: resolve(dbPath), closed })) {
|
|
174
260
|
terminate();
|
|
175
261
|
URL.revokeObjectURL(source);
|
|
176
262
|
return null;
|
|
@@ -186,6 +272,7 @@ export function startWalCheckpointer(dbPath: string, onFailure: () => void): Wal
|
|
|
186
272
|
if (stopped) return;
|
|
187
273
|
if (timer) clearTimeout(timer);
|
|
188
274
|
timer = null;
|
|
275
|
+
stopWatching();
|
|
189
276
|
const asked = !failed && post({ type: "close" });
|
|
190
277
|
stopped = true;
|
|
191
278
|
if (!asked) {
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { Database } from "bun:sqlite";
|
|
2
|
+
import { closeSync, openSync } from "fs";
|
|
3
|
+
import { logFailure } from "../../utils/log-failure";
|
|
4
|
+
import { restrictFileSync } from "../../utils/private-files";
|
|
2
5
|
import { createSqliteAccess, type SqliteAccess } from "./access";
|
|
3
6
|
import {
|
|
4
7
|
SQLITE_BACKSTOP_AUTOCHECKPOINT_PAGES,
|
|
5
8
|
SQLITE_DEFAULT_AUTOCHECKPOINT_PAGES,
|
|
6
9
|
startWalCheckpointer,
|
|
7
10
|
type WalCheckpointer,
|
|
11
|
+
type WalCheckpointerOptions,
|
|
8
12
|
} from "./checkpointer";
|
|
9
13
|
import { SQLITE_BUSY_TIMEOUT_MS, withSqliteBusyRetry } from "./retry";
|
|
10
14
|
|
|
@@ -74,6 +78,8 @@ export interface SqliteDatabaseOptions {
|
|
|
74
78
|
* another program's lock (see access.ts). Commands and tests wait it out.
|
|
75
79
|
*/
|
|
76
80
|
interactive?: boolean;
|
|
81
|
+
/** Tests only: the WAL checkpointer's thread and how long it may go silent. */
|
|
82
|
+
checkpointer?: WalCheckpointerOptions;
|
|
77
83
|
}
|
|
78
84
|
|
|
79
85
|
export class SqliteDatabase {
|
|
@@ -82,6 +88,18 @@ export class SqliteDatabase {
|
|
|
82
88
|
private readonly checkpointer: WalCheckpointer | null = null;
|
|
83
89
|
|
|
84
90
|
constructor(dbPath: string, options: SqliteDatabaseOptions = {}) {
|
|
91
|
+
const onDisk = dbPath !== "" && dbPath !== ":memory:" && !dbPath.startsWith("file:");
|
|
92
|
+
// The database holds the Cloud session: created readable by the user
|
|
93
|
+
// alone, so the WAL and shared-memory files SQLite makes beside it with
|
|
94
|
+
// the same mode are too, and an older one made so.
|
|
95
|
+
if (onDisk) {
|
|
96
|
+
try {
|
|
97
|
+
closeSync(openSync(dbPath, "a", 0o600));
|
|
98
|
+
restrictFileSync(dbPath);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
logFailure("data.sqlite", "Restricting the database file to its user failed")(error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
85
103
|
this.connection = new Database(dbPath);
|
|
86
104
|
// Opening waits for another program's lock: it happens once, and the app
|
|
87
105
|
// has nothing to show without its data.
|
|
@@ -90,28 +108,43 @@ export class SqliteDatabase {
|
|
|
90
108
|
this.connection.query<{ journal_mode: string }, []>("PRAGMA journal_mode=WAL").get()?.journal_mode
|
|
91
109
|
));
|
|
92
110
|
// In WAL mode commits can stop flushing the disk and the database stays
|
|
93
|
-
// whole; user data
|
|
94
|
-
//
|
|
111
|
+
// whole; user data is flushed soon after by the checkpointer, or per write
|
|
112
|
+
// where it does not run (access.ts). Where WAL does not take (a network
|
|
113
|
+
// share, an in-memory database), every commit flushes.
|
|
95
114
|
const wal = journalMode?.toLowerCase() === "wal";
|
|
115
|
+
if (onDisk && wal) {
|
|
116
|
+
try {
|
|
117
|
+
restrictFileSync(`${dbPath}-wal`);
|
|
118
|
+
restrictFileSync(`${dbPath}-shm`);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
logFailure("data.sqlite", "Restricting the database's WAL files to their user failed")(error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
96
123
|
this.connection.exec(wal ? "PRAGMA synchronous=NORMAL" : "PRAGMA synchronous=FULL");
|
|
97
124
|
withSqliteBusyRetry("initialize sqlite schema", () => {
|
|
98
125
|
this.connection.exec(SCHEMA);
|
|
99
126
|
});
|
|
100
127
|
// The app's statements choose how long to wait for a lock themselves.
|
|
101
128
|
if (options.interactive) this.connection.exec("PRAGMA busy_timeout=0");
|
|
102
|
-
// The app's commits leave copying the WAL into the database
|
|
103
|
-
// of its own, and only
|
|
129
|
+
// The app's commits leave copying the WAL into the database, and flushing
|
|
130
|
+
// it, to a thread of its own, and only copy it themselves past a WAL ten
|
|
131
|
+
// times the usual.
|
|
132
|
+
let checkpointerRunning = false;
|
|
104
133
|
if (options.interactive && wal && dbPath !== ":memory:") {
|
|
105
134
|
this.checkpointer = startWalCheckpointer(dbPath, () => {
|
|
135
|
+
checkpointerRunning = false;
|
|
106
136
|
this.connection.exec(`PRAGMA wal_autocheckpoint=${SQLITE_DEFAULT_AUTOCHECKPOINT_PAGES}`);
|
|
107
|
-
});
|
|
108
|
-
if (this.checkpointer)
|
|
137
|
+
}, options.checkpointer);
|
|
138
|
+
if (this.checkpointer) {
|
|
139
|
+
checkpointerRunning = true;
|
|
140
|
+
this.connection.exec(`PRAGMA wal_autocheckpoint=${SQLITE_BACKSTOP_AUTOCHECKPOINT_PAGES}`);
|
|
141
|
+
}
|
|
109
142
|
}
|
|
110
143
|
const checkpointer = this.checkpointer;
|
|
111
144
|
this.access = createSqliteAccess(this.connection, {
|
|
112
145
|
interactive: options.interactive,
|
|
113
146
|
relaxedCommits: wal,
|
|
114
|
-
...(checkpointer ? { onCommit: () => checkpointer.nudge() } : {}),
|
|
147
|
+
...(checkpointer ? { onCommit: () => checkpointer.nudge(), flushedElsewhere: () => checkpointerRunning } : {}),
|
|
115
148
|
});
|
|
116
149
|
}
|
|
117
150
|
|