@n-dx/web 0.1.0
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/LICENSE +96 -0
- package/README.md +5 -0
- package/build.js +243 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/landing/index.html +325 -0
- package/dist/landing/landing.d.ts +38 -0
- package/dist/landing/landing.js +299 -0
- package/dist/landing/landing.js.map +1 -0
- package/dist/public.d.ts +55 -0
- package/dist/public.js +51 -0
- package/dist/public.js.map +1 -0
- package/dist/schema/features.d.ts +28 -0
- package/dist/schema/features.js +9 -0
- package/dist/schema/features.js.map +1 -0
- package/dist/schema/v1.d.ts +317 -0
- package/dist/schema/v1.js +3 -0
- package/dist/schema/v1.js.map +1 -0
- package/dist/server/aggregation-cache.d.ts +105 -0
- package/dist/server/aggregation-cache.js +163 -0
- package/dist/server/aggregation-cache.js.map +1 -0
- package/dist/server/concurrent-execution-metrics.d.ts +103 -0
- package/dist/server/concurrent-execution-metrics.js +253 -0
- package/dist/server/concurrent-execution-metrics.js.map +1 -0
- package/dist/server/domain-gateway.d.ts +18 -0
- package/dist/server/domain-gateway.js +19 -0
- package/dist/server/domain-gateway.js.map +1 -0
- package/dist/server/incremental-task-usage.d.ts +92 -0
- package/dist/server/incremental-task-usage.js +251 -0
- package/dist/server/incremental-task-usage.js.map +1 -0
- package/dist/server/index.d.ts +39 -0
- package/dist/server/index.js +36 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/port.d.ts +96 -0
- package/dist/server/port.js +134 -0
- package/dist/server/port.js.map +1 -0
- package/dist/server/pr-markdown-refresh-diagnostics.d.ts +59 -0
- package/dist/server/pr-markdown-refresh-diagnostics.js +429 -0
- package/dist/server/pr-markdown-refresh-diagnostics.js.map +1 -0
- package/dist/server/prd-io.d.ts +40 -0
- package/dist/server/prd-io.js +66 -0
- package/dist/server/prd-io.js.map +1 -0
- package/dist/server/process-memory-tracker.d.ts +79 -0
- package/dist/server/process-memory-tracker.js +194 -0
- package/dist/server/process-memory-tracker.js.map +1 -0
- package/dist/server/register-scheduler.d.ts +53 -0
- package/dist/server/register-scheduler.js +36 -0
- package/dist/server/register-scheduler.js.map +1 -0
- package/dist/server/rex-gateway.d.ts +39 -0
- package/dist/server/rex-gateway.js +47 -0
- package/dist/server/rex-gateway.js.map +1 -0
- package/dist/server/routes-adaptive.d.ts +21 -0
- package/dist/server/routes-adaptive.js +659 -0
- package/dist/server/routes-adaptive.js.map +1 -0
- package/dist/server/routes-config.d.ts +47 -0
- package/dist/server/routes-config.js +222 -0
- package/dist/server/routes-config.js.map +1 -0
- package/dist/server/routes-data.d.ts +14 -0
- package/dist/server/routes-data.js +129 -0
- package/dist/server/routes-data.js.map +1 -0
- package/dist/server/routes-features.d.ts +14 -0
- package/dist/server/routes-features.js +245 -0
- package/dist/server/routes-features.js.map +1 -0
- package/dist/server/routes-hench.d.ts +116 -0
- package/dist/server/routes-hench.js +2016 -0
- package/dist/server/routes-hench.js.map +1 -0
- package/dist/server/routes-integrations.d.ts +23 -0
- package/dist/server/routes-integrations.js +277 -0
- package/dist/server/routes-integrations.js.map +1 -0
- package/dist/server/routes-mcp.d.ts +31 -0
- package/dist/server/routes-mcp.js +175 -0
- package/dist/server/routes-mcp.js.map +1 -0
- package/dist/server/routes-notion.d.ts +23 -0
- package/dist/server/routes-notion.js +723 -0
- package/dist/server/routes-notion.js.map +1 -0
- package/dist/server/routes-project.d.ts +47 -0
- package/dist/server/routes-project.js +128 -0
- package/dist/server/routes-project.js.map +1 -0
- package/dist/server/routes-rex/analysis.d.ts +11 -0
- package/dist/server/routes-rex/analysis.js +583 -0
- package/dist/server/routes-rex/analysis.js.map +1 -0
- package/dist/server/routes-rex/execution.d.ts +37 -0
- package/dist/server/routes-rex/execution.js +355 -0
- package/dist/server/routes-rex/execution.js.map +1 -0
- package/dist/server/routes-rex/health.d.ts +8 -0
- package/dist/server/routes-rex/health.js +136 -0
- package/dist/server/routes-rex/health.js.map +1 -0
- package/dist/server/routes-rex/index.d.ts +35 -0
- package/dist/server/routes-rex/index.js +72 -0
- package/dist/server/routes-rex/index.js.map +1 -0
- package/dist/server/routes-rex/items.d.ts +8 -0
- package/dist/server/routes-rex/items.js +359 -0
- package/dist/server/routes-rex/items.js.map +1 -0
- package/dist/server/routes-rex/prune.d.ts +11 -0
- package/dist/server/routes-rex/prune.js +379 -0
- package/dist/server/routes-rex/prune.js.map +1 -0
- package/dist/server/routes-rex/reads.d.ts +9 -0
- package/dist/server/routes-rex/reads.js +119 -0
- package/dist/server/routes-rex/reads.js.map +1 -0
- package/dist/server/routes-rex/requirements.d.ts +10 -0
- package/dist/server/routes-rex/requirements.js +408 -0
- package/dist/server/routes-rex/requirements.js.map +1 -0
- package/dist/server/routes-rex/shared.d.ts +37 -0
- package/dist/server/routes-rex/shared.js +73 -0
- package/dist/server/routes-rex/shared.js.map +1 -0
- package/dist/server/routes-search.d.ts +26 -0
- package/dist/server/routes-search.js +82 -0
- package/dist/server/routes-search.js.map +1 -0
- package/dist/server/routes-sourcevision.d.ts +18 -0
- package/dist/server/routes-sourcevision.js +444 -0
- package/dist/server/routes-sourcevision.js.map +1 -0
- package/dist/server/routes-static.d.ts +20 -0
- package/dist/server/routes-static.js +168 -0
- package/dist/server/routes-static.js.map +1 -0
- package/dist/server/routes-status.d.ts +58 -0
- package/dist/server/routes-status.js +191 -0
- package/dist/server/routes-status.js.map +1 -0
- package/dist/server/routes-token-usage.d.ts +63 -0
- package/dist/server/routes-token-usage.js +720 -0
- package/dist/server/routes-token-usage.js.map +1 -0
- package/dist/server/routes-validation.d.ts +10 -0
- package/dist/server/routes-validation.js +365 -0
- package/dist/server/routes-validation.js.map +1 -0
- package/dist/server/routes-workflow.d.ts +15 -0
- package/dist/server/routes-workflow.js +498 -0
- package/dist/server/routes-workflow.js.map +1 -0
- package/dist/server/search-index.d.ts +111 -0
- package/dist/server/search-index.js +348 -0
- package/dist/server/search-index.js.map +1 -0
- package/dist/server/shared-types.d.ts +65 -0
- package/dist/server/shared-types.js +31 -0
- package/dist/server/shared-types.js.map +1 -0
- package/dist/server/start.d.ts +68 -0
- package/dist/server/start.js +568 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/task-usage.d.ts +17 -0
- package/dist/server/task-usage.js +20 -0
- package/dist/server/task-usage.js.map +1 -0
- package/dist/server/types.d.ts +27 -0
- package/dist/server/types.js +26 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/usage-cleanup-scheduler.d.ts +107 -0
- package/dist/server/usage-cleanup-scheduler.js +232 -0
- package/dist/server/usage-cleanup-scheduler.js.map +1 -0
- package/dist/server/websocket.d.ts +131 -0
- package/dist/server/websocket.js +512 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/shared/data-files.d.ts +17 -0
- package/dist/shared/data-files.js +18 -0
- package/dist/shared/data-files.js.map +1 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.js +9 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/view-id.d.ts +8 -0
- package/dist/shared/view-id.js +9 -0
- package/dist/shared/view-id.js.map +1 -0
- package/dist/viewer/Hench-F.png +0 -0
- package/dist/viewer/Rex-F.png +0 -0
- package/dist/viewer/SourceVision-F.png +0 -0
- package/dist/viewer/SourceVision.png +0 -0
- package/dist/viewer/api.d.ts +19 -0
- package/dist/viewer/api.js +17 -0
- package/dist/viewer/api.js.map +1 -0
- package/dist/viewer/bootstrap.d.ts +13 -0
- package/dist/viewer/bootstrap.js +40 -0
- package/dist/viewer/bootstrap.js.map +1 -0
- package/dist/viewer/components/active-tasks-panel.d.ts +36 -0
- package/dist/viewer/components/active-tasks-panel.js +183 -0
- package/dist/viewer/components/active-tasks-panel.js.map +1 -0
- package/dist/viewer/components/breadcrumb.d.ts +21 -0
- package/dist/viewer/components/breadcrumb.js +117 -0
- package/dist/viewer/components/breadcrumb.js.map +1 -0
- package/dist/viewer/components/concurrency-panel.d.ts +18 -0
- package/dist/viewer/components/concurrency-panel.js +175 -0
- package/dist/viewer/components/concurrency-panel.js.map +1 -0
- package/dist/viewer/components/config-footer.d.ts +11 -0
- package/dist/viewer/components/config-footer.js +132 -0
- package/dist/viewer/components/config-footer.js.map +1 -0
- package/dist/viewer/components/constants.d.ts +10 -0
- package/dist/viewer/components/constants.js +11 -0
- package/dist/viewer/components/constants.js.map +1 -0
- package/dist/viewer/components/copy-link-button.d.ts +30 -0
- package/dist/viewer/components/copy-link-button.js +74 -0
- package/dist/viewer/components/copy-link-button.js.map +1 -0
- package/dist/viewer/components/crash-recovery-banner.d.ts +28 -0
- package/dist/viewer/components/crash-recovery-banner.js +47 -0
- package/dist/viewer/components/crash-recovery-banner.js.map +1 -0
- package/dist/viewer/components/data-display/collapsible-section.d.ts +14 -0
- package/dist/viewer/components/data-display/collapsible-section.js +66 -0
- package/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
- package/dist/viewer/components/data-display/findings-list.d.ts +13 -0
- package/dist/viewer/components/data-display/findings-list.js +136 -0
- package/dist/viewer/components/data-display/findings-list.js.map +1 -0
- package/dist/viewer/components/data-display/health-gauge.d.ts +37 -0
- package/dist/viewer/components/data-display/health-gauge.js +62 -0
- package/dist/viewer/components/data-display/health-gauge.js.map +1 -0
- package/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
- package/dist/viewer/components/data-display/mini-charts.js +124 -0
- package/dist/viewer/components/data-display/mini-charts.js.map +1 -0
- package/dist/viewer/components/data-display/tree-view.d.ts +18 -0
- package/dist/viewer/components/data-display/tree-view.js +107 -0
- package/dist/viewer/components/data-display/tree-view.js.map +1 -0
- package/dist/viewer/components/data-display/zone-map.d.ts +28 -0
- package/dist/viewer/components/data-display/zone-map.js +197 -0
- package/dist/viewer/components/data-display/zone-map.js.map +1 -0
- package/dist/viewer/components/degradation-banner.d.ts +28 -0
- package/dist/viewer/components/degradation-banner.js +47 -0
- package/dist/viewer/components/degradation-banner.js.map +1 -0
- package/dist/viewer/components/detail-panel.d.ts +12 -0
- package/dist/viewer/components/detail-panel.js +166 -0
- package/dist/viewer/components/detail-panel.js.map +1 -0
- package/dist/viewer/components/elapsed-time.d.ts +38 -0
- package/dist/viewer/components/elapsed-time.js +35 -0
- package/dist/viewer/components/elapsed-time.js.map +1 -0
- package/dist/viewer/components/faq.d.ts +12 -0
- package/dist/viewer/components/faq.js +237 -0
- package/dist/viewer/components/faq.js.map +1 -0
- package/dist/viewer/components/favicon.d.ts +30 -0
- package/dist/viewer/components/favicon.js +90 -0
- package/dist/viewer/components/favicon.js.map +1 -0
- package/dist/viewer/components/guide.d.ts +5 -0
- package/dist/viewer/components/guide.js +116 -0
- package/dist/viewer/components/guide.js.map +1 -0
- package/dist/viewer/components/index.d.ts +37 -0
- package/dist/viewer/components/index.js +46 -0
- package/dist/viewer/components/index.js.map +1 -0
- package/dist/viewer/components/logos.d.ts +42 -0
- package/dist/viewer/components/logos.js +46 -0
- package/dist/viewer/components/logos.js.map +1 -0
- package/dist/viewer/components/memory-panel.d.ts +19 -0
- package/dist/viewer/components/memory-panel.js +181 -0
- package/dist/viewer/components/memory-panel.js.map +1 -0
- package/dist/viewer/components/memory-warning.d.ts +23 -0
- package/dist/viewer/components/memory-warning.js +42 -0
- package/dist/viewer/components/memory-warning.js.map +1 -0
- package/dist/viewer/components/notion-schema-wizard.d.ts +16 -0
- package/dist/viewer/components/notion-schema-wizard.js +263 -0
- package/dist/viewer/components/notion-schema-wizard.js.map +1 -0
- package/dist/viewer/components/polling-suspension-indicator.d.ts +24 -0
- package/dist/viewer/components/polling-suspension-indicator.js +31 -0
- package/dist/viewer/components/polling-suspension-indicator.js.map +1 -0
- package/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
- package/dist/viewer/components/prd-tree/add-item-form.js +231 -0
- package/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
- package/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
- package/dist/viewer/components/prd-tree/analyze-panel.js +245 -0
- package/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.d.ts +34 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.js +415 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/bulk-actions.d.ts +19 -0
- package/dist/viewer/components/prd-tree/bulk-actions.js +90 -0
- package/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
- package/dist/viewer/components/prd-tree/compute.d.ts +32 -0
- package/dist/viewer/components/prd-tree/compute.js +129 -0
- package/dist/viewer/components/prd-tree/compute.js.map +1 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.d.ts +23 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.js +83 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.js.map +1 -0
- package/dist/viewer/components/prd-tree/execution-panel.d.ts +14 -0
- package/dist/viewer/components/prd-tree/execution-panel.js +291 -0
- package/dist/viewer/components/prd-tree/execution-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/facet-filter.d.ts +40 -0
- package/dist/viewer/components/prd-tree/facet-filter.js +188 -0
- package/dist/viewer/components/prd-tree/facet-filter.js.map +1 -0
- package/dist/viewer/components/prd-tree/index.d.ts +24 -0
- package/dist/viewer/components/prd-tree/index.js +16 -0
- package/dist/viewer/components/prd-tree/index.js.map +1 -0
- package/dist/viewer/components/prd-tree/inline-add-form.d.ts +32 -0
- package/dist/viewer/components/prd-tree/inline-add-form.js +175 -0
- package/dist/viewer/components/prd-tree/inline-add-form.js.map +1 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.d.ts +31 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.js +110 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.js.map +1 -0
- package/dist/viewer/components/prd-tree/lazy-children.d.ts +40 -0
- package/dist/viewer/components/prd-tree/lazy-children.js +73 -0
- package/dist/viewer/components/prd-tree/lazy-children.js.map +1 -0
- package/dist/viewer/components/prd-tree/levels.d.ts +31 -0
- package/dist/viewer/components/prd-tree/levels.js +72 -0
- package/dist/viewer/components/prd-tree/levels.js.map +1 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.d.ts +105 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.js +173 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.js.map +1 -0
- package/dist/viewer/components/prd-tree/merge-preview.d.ts +25 -0
- package/dist/viewer/components/prd-tree/merge-preview.js +181 -0
- package/dist/viewer/components/prd-tree/merge-preview.js.map +1 -0
- package/dist/viewer/components/prd-tree/prd-tree.d.ts +91 -0
- package/dist/viewer/components/prd-tree/prd-tree.js +565 -0
- package/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
- package/dist/viewer/components/prd-tree/proposal-editor.d.ts +44 -0
- package/dist/viewer/components/prd-tree/proposal-editor.js +438 -0
- package/dist/viewer/components/prd-tree/proposal-editor.js.map +1 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.d.ts +25 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.js +336 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.js.map +1 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.d.ts +39 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.js +319 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.js.map +1 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.d.ts +16 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.js +213 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/smart-add-input.d.ts +19 -0
- package/dist/viewer/components/prd-tree/smart-add-input.js +383 -0
- package/dist/viewer/components/prd-tree/smart-add-input.js.map +1 -0
- package/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
- package/dist/viewer/components/prd-tree/status-filter.js +131 -0
- package/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
- package/dist/viewer/components/prd-tree/task-detail.d.ts +41 -0
- package/dist/viewer/components/prd-tree/task-detail.js +1205 -0
- package/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
- package/dist/viewer/components/prd-tree/task-utilization.d.ts +7 -0
- package/dist/viewer/components/prd-tree/task-utilization.js +25 -0
- package/dist/viewer/components/prd-tree/task-utilization.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-differ.d.ts +59 -0
- package/dist/viewer/components/prd-tree/tree-differ.js +200 -0
- package/dist/viewer/components/prd-tree/tree-differ.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.d.ts +70 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.js +176 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-search.d.ts +65 -0
- package/dist/viewer/components/prd-tree/tree-search.js +178 -0
- package/dist/viewer/components/prd-tree/tree-search.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-utils.d.ts +38 -0
- package/dist/viewer/components/prd-tree/tree-utils.js +107 -0
- package/dist/viewer/components/prd-tree/tree-utils.js.map +1 -0
- package/dist/viewer/components/prd-tree/types.d.ts +93 -0
- package/dist/viewer/components/prd-tree/types.js +16 -0
- package/dist/viewer/components/prd-tree/types.js.map +1 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.d.ts +119 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.js +169 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.js.map +1 -0
- package/dist/viewer/components/progressive-loader.d.ts +114 -0
- package/dist/viewer/components/progressive-loader.js +225 -0
- package/dist/viewer/components/progressive-loader.js.map +1 -0
- package/dist/viewer/components/refresh-queue-status.d.ts +20 -0
- package/dist/viewer/components/refresh-queue-status.js +65 -0
- package/dist/viewer/components/refresh-queue-status.js.map +1 -0
- package/dist/viewer/components/rex-task-link.d.ts +50 -0
- package/dist/viewer/components/rex-task-link.js +218 -0
- package/dist/viewer/components/rex-task-link.js.map +1 -0
- package/dist/viewer/components/search-filter.d.ts +20 -0
- package/dist/viewer/components/search-filter.js +28 -0
- package/dist/viewer/components/search-filter.js.map +1 -0
- package/dist/viewer/components/search-overlay.d.ts +31 -0
- package/dist/viewer/components/search-overlay.js +472 -0
- package/dist/viewer/components/search-overlay.js.map +1 -0
- package/dist/viewer/components/sidebar.d.ts +18 -0
- package/dist/viewer/components/sidebar.js +357 -0
- package/dist/viewer/components/sidebar.js.map +1 -0
- package/dist/viewer/components/status-indicators.d.ts +63 -0
- package/dist/viewer/components/status-indicators.js +136 -0
- package/dist/viewer/components/status-indicators.js.map +1 -0
- package/dist/viewer/components/theme-toggle.d.ts +8 -0
- package/dist/viewer/components/theme-toggle.js +28 -0
- package/dist/viewer/components/theme-toggle.js.map +1 -0
- package/dist/viewer/components/throttle-controls.d.ts +18 -0
- package/dist/viewer/components/throttle-controls.js +304 -0
- package/dist/viewer/components/throttle-controls.js.map +1 -0
- package/dist/viewer/components/ws-health-panel.d.ts +18 -0
- package/dist/viewer/components/ws-health-panel.js +250 -0
- package/dist/viewer/components/ws-health-panel.js.map +1 -0
- package/dist/viewer/components/zone-slideout.d.ts +17 -0
- package/dist/viewer/components/zone-slideout.js +162 -0
- package/dist/viewer/components/zone-slideout.js.map +1 -0
- package/dist/viewer/crash/crash-detector.d.ts +69 -0
- package/dist/viewer/crash/crash-detector.js +239 -0
- package/dist/viewer/crash/crash-detector.js.map +1 -0
- package/dist/viewer/crash/index.d.ts +7 -0
- package/dist/viewer/crash/index.js +8 -0
- package/dist/viewer/crash/index.js.map +1 -0
- package/dist/viewer/deployed-mode.d.ts +37 -0
- package/dist/viewer/deployed-mode.js +94 -0
- package/dist/viewer/deployed-mode.js.map +1 -0
- package/dist/viewer/external.d.ts +17 -0
- package/dist/viewer/external.js +17 -0
- package/dist/viewer/external.js.map +1 -0
- package/dist/viewer/graph/index.d.ts +9 -0
- package/dist/viewer/graph/index.js +12 -0
- package/dist/viewer/graph/index.js.map +1 -0
- package/dist/viewer/graph/physics.d.ts +96 -0
- package/dist/viewer/graph/physics.js +366 -0
- package/dist/viewer/graph/physics.js.map +1 -0
- package/dist/viewer/graph/renderer.d.ts +184 -0
- package/dist/viewer/graph/renderer.js +1438 -0
- package/dist/viewer/graph/renderer.js.map +1 -0
- package/dist/viewer/hooks/index.d.ts +27 -0
- package/dist/viewer/hooks/index.js +28 -0
- package/dist/viewer/hooks/index.js.map +1 -0
- package/dist/viewer/hooks/use-app-data.d.ts +31 -0
- package/dist/viewer/hooks/use-app-data.js +152 -0
- package/dist/viewer/hooks/use-app-data.js.map +1 -0
- package/dist/viewer/hooks/use-crash-recovery.d.ts +50 -0
- package/dist/viewer/hooks/use-crash-recovery.js +76 -0
- package/dist/viewer/hooks/use-crash-recovery.js.map +1 -0
- package/dist/viewer/hooks/use-delete-actions.d.ts +48 -0
- package/dist/viewer/hooks/use-delete-actions.js +103 -0
- package/dist/viewer/hooks/use-delete-actions.js.map +1 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.d.ts +68 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.js +71 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.js.map +1 -0
- package/dist/viewer/hooks/use-facet-state.d.ts +32 -0
- package/dist/viewer/hooks/use-facet-state.js +119 -0
- package/dist/viewer/hooks/use-facet-state.js.map +1 -0
- package/dist/viewer/hooks/use-feature-toggle.d.ts +18 -0
- package/dist/viewer/hooks/use-feature-toggle.js +57 -0
- package/dist/viewer/hooks/use-feature-toggle.js.map +1 -0
- package/dist/viewer/hooks/use-file-edges.d.ts +23 -0
- package/dist/viewer/hooks/use-file-edges.js +221 -0
- package/dist/viewer/hooks/use-file-edges.js.map +1 -0
- package/dist/viewer/hooks/use-graceful-degradation.d.ts +30 -0
- package/dist/viewer/hooks/use-graceful-degradation.js +45 -0
- package/dist/viewer/hooks/use-graceful-degradation.js.map +1 -0
- package/dist/viewer/hooks/use-item-selection.d.ts +49 -0
- package/dist/viewer/hooks/use-item-selection.js +117 -0
- package/dist/viewer/hooks/use-item-selection.js.map +1 -0
- package/dist/viewer/hooks/use-memory-monitor.d.ts +39 -0
- package/dist/viewer/hooks/use-memory-monitor.js +73 -0
- package/dist/viewer/hooks/use-memory-monitor.js.map +1 -0
- package/dist/viewer/hooks/use-pan-zoom.d.ts +33 -0
- package/dist/viewer/hooks/use-pan-zoom.js +110 -0
- package/dist/viewer/hooks/use-pan-zoom.js.map +1 -0
- package/dist/viewer/hooks/use-persistent-filter.d.ts +24 -0
- package/dist/viewer/hooks/use-persistent-filter.js +37 -0
- package/dist/viewer/hooks/use-persistent-filter.js.map +1 -0
- package/dist/viewer/hooks/use-polling-suspension.d.ts +32 -0
- package/dist/viewer/hooks/use-polling-suspension.js +41 -0
- package/dist/viewer/hooks/use-polling-suspension.js.map +1 -0
- package/dist/viewer/hooks/use-polling.d.ts +39 -0
- package/dist/viewer/hooks/use-polling.js +55 -0
- package/dist/viewer/hooks/use-polling.js.map +1 -0
- package/dist/viewer/hooks/use-prd-actions.d.ts +126 -0
- package/dist/viewer/hooks/use-prd-actions.js +250 -0
- package/dist/viewer/hooks/use-prd-actions.js.map +1 -0
- package/dist/viewer/hooks/use-prd-data.d.ts +45 -0
- package/dist/viewer/hooks/use-prd-data.js +159 -0
- package/dist/viewer/hooks/use-prd-data.js.map +1 -0
- package/dist/viewer/hooks/use-prd-deep-link.d.ts +45 -0
- package/dist/viewer/hooks/use-prd-deep-link.js +60 -0
- package/dist/viewer/hooks/use-prd-deep-link.js.map +1 -0
- package/dist/viewer/hooks/use-prd-websocket.d.ts +47 -0
- package/dist/viewer/hooks/use-prd-websocket.js +139 -0
- package/dist/viewer/hooks/use-prd-websocket.js.map +1 -0
- package/dist/viewer/hooks/use-project-metadata.d.ts +25 -0
- package/dist/viewer/hooks/use-project-metadata.js +55 -0
- package/dist/viewer/hooks/use-project-metadata.js.map +1 -0
- package/dist/viewer/hooks/use-project-status.d.ts +60 -0
- package/dist/viewer/hooks/use-project-status.js +133 -0
- package/dist/viewer/hooks/use-project-status.js.map +1 -0
- package/dist/viewer/hooks/use-refresh-throttle.d.ts +45 -0
- package/dist/viewer/hooks/use-refresh-throttle.js +52 -0
- package/dist/viewer/hooks/use-refresh-throttle.js.map +1 -0
- package/dist/viewer/hooks/use-route-state.d.ts +18 -0
- package/dist/viewer/hooks/use-route-state.js +115 -0
- package/dist/viewer/hooks/use-route-state.js.map +1 -0
- package/dist/viewer/hooks/use-subzone-edges.d.ts +21 -0
- package/dist/viewer/hooks/use-subzone-edges.js +147 -0
- package/dist/viewer/hooks/use-subzone-edges.js.map +1 -0
- package/dist/viewer/hooks/use-tab-visibility.d.ts +31 -0
- package/dist/viewer/hooks/use-tab-visibility.js +43 -0
- package/dist/viewer/hooks/use-tab-visibility.js.map +1 -0
- package/dist/viewer/hooks/use-tick.d.ts +43 -0
- package/dist/viewer/hooks/use-tick.js +76 -0
- package/dist/viewer/hooks/use-tick.js.map +1 -0
- package/dist/viewer/hooks/use-toast.d.ts +24 -0
- package/dist/viewer/hooks/use-toast.js +26 -0
- package/dist/viewer/hooks/use-toast.js.map +1 -0
- package/dist/viewer/hooks/use-zone-drag.d.ts +30 -0
- package/dist/viewer/hooks/use-zone-drag.js +60 -0
- package/dist/viewer/hooks/use-zone-drag.js.map +1 -0
- package/dist/viewer/index.html +36 -0
- package/dist/viewer/loader.d.ts +33 -0
- package/dist/viewer/loader.js +195 -0
- package/dist/viewer/loader.js.map +1 -0
- package/dist/viewer/main.d.ts +1 -0
- package/dist/viewer/main.js +121 -0
- package/dist/viewer/main.js.map +1 -0
- package/dist/viewer/messaging/call-rate-limiter.d.ts +50 -0
- package/dist/viewer/messaging/call-rate-limiter.js +103 -0
- package/dist/viewer/messaging/call-rate-limiter.js.map +1 -0
- package/dist/viewer/messaging/fetch-pipeline.d.ts +58 -0
- package/dist/viewer/messaging/fetch-pipeline.js +58 -0
- package/dist/viewer/messaging/fetch-pipeline.js.map +1 -0
- package/dist/viewer/messaging/index.d.ts +43 -0
- package/dist/viewer/messaging/index.js +46 -0
- package/dist/viewer/messaging/index.js.map +1 -0
- package/dist/viewer/messaging/message-coalescer.d.ts +96 -0
- package/dist/viewer/messaging/message-coalescer.js +121 -0
- package/dist/viewer/messaging/message-coalescer.js.map +1 -0
- package/dist/viewer/messaging/message-throttle.d.ts +95 -0
- package/dist/viewer/messaging/message-throttle.js +147 -0
- package/dist/viewer/messaging/message-throttle.js.map +1 -0
- package/dist/viewer/messaging/request-dedup.d.ts +43 -0
- package/dist/viewer/messaging/request-dedup.js +55 -0
- package/dist/viewer/messaging/request-dedup.js.map +1 -0
- package/dist/viewer/messaging/ws-pipeline.d.ts +85 -0
- package/dist/viewer/messaging/ws-pipeline.js +68 -0
- package/dist/viewer/messaging/ws-pipeline.js.map +1 -0
- package/dist/viewer/n-dx.png +0 -0
- package/dist/viewer/performance/dom-performance-monitor.d.ts +157 -0
- package/dist/viewer/performance/dom-performance-monitor.js +341 -0
- package/dist/viewer/performance/dom-performance-monitor.js.map +1 -0
- package/dist/viewer/performance/dom-update-gate.d.ts +122 -0
- package/dist/viewer/performance/dom-update-gate.js +229 -0
- package/dist/viewer/performance/dom-update-gate.js.map +1 -0
- package/dist/viewer/performance/graceful-degradation.d.ts +73 -0
- package/dist/viewer/performance/graceful-degradation.js +152 -0
- package/dist/viewer/performance/graceful-degradation.js.map +1 -0
- package/dist/viewer/performance/index.d.ts +14 -0
- package/dist/viewer/performance/index.js +20 -0
- package/dist/viewer/performance/index.js.map +1 -0
- package/dist/viewer/performance/memory-monitor.d.ts +78 -0
- package/dist/viewer/performance/memory-monitor.js +218 -0
- package/dist/viewer/performance/memory-monitor.js.map +1 -0
- package/dist/viewer/performance/refresh-throttle.d.ts +90 -0
- package/dist/viewer/performance/refresh-throttle.js +266 -0
- package/dist/viewer/performance/refresh-throttle.js.map +1 -0
- package/dist/viewer/performance/response-buffer-gate.d.ts +108 -0
- package/dist/viewer/performance/response-buffer-gate.js +170 -0
- package/dist/viewer/performance/response-buffer-gate.js.map +1 -0
- package/dist/viewer/performance/update-batcher.d.ts +79 -0
- package/dist/viewer/performance/update-batcher.js +119 -0
- package/dist/viewer/performance/update-batcher.js.map +1 -0
- package/dist/viewer/polling/batched-tick-dispatcher.d.ts +83 -0
- package/dist/viewer/polling/batched-tick-dispatcher.js +183 -0
- package/dist/viewer/polling/batched-tick-dispatcher.js.map +1 -0
- package/dist/viewer/polling/index.d.ts +13 -0
- package/dist/viewer/polling/index.js +16 -0
- package/dist/viewer/polling/index.js.map +1 -0
- package/dist/viewer/polling/polling-manager.d.ts +82 -0
- package/dist/viewer/polling/polling-manager.js +254 -0
- package/dist/viewer/polling/polling-manager.js.map +1 -0
- package/dist/viewer/polling/polling-restart.d.ts +45 -0
- package/dist/viewer/polling/polling-restart.js +98 -0
- package/dist/viewer/polling/polling-restart.js.map +1 -0
- package/dist/viewer/polling/polling-state.d.ts +182 -0
- package/dist/viewer/polling/polling-state.js +306 -0
- package/dist/viewer/polling/polling-state.js.map +1 -0
- package/dist/viewer/polling/tab-visibility.d.ts +112 -0
- package/dist/viewer/polling/tab-visibility.js +276 -0
- package/dist/viewer/polling/tab-visibility.js.map +1 -0
- package/dist/viewer/polling/tick-timer.d.ts +70 -0
- package/dist/viewer/polling/tick-timer.js +168 -0
- package/dist/viewer/polling/tick-timer.js.map +1 -0
- package/dist/viewer/polling/tick-visibility-gate.d.ts +92 -0
- package/dist/viewer/polling/tick-visibility-gate.js +146 -0
- package/dist/viewer/polling/tick-visibility-gate.js.map +1 -0
- package/dist/viewer/route-state.d.ts +8 -0
- package/dist/viewer/route-state.js +77 -0
- package/dist/viewer/route-state.js.map +1 -0
- package/dist/viewer/schema-compat.d.ts +17 -0
- package/dist/viewer/schema-compat.js +49 -0
- package/dist/viewer/schema-compat.js.map +1 -0
- package/dist/viewer/types.d.ts +66 -0
- package/dist/viewer/types.js +2 -0
- package/dist/viewer/types.js.map +1 -0
- package/dist/viewer/usage/constants.d.ts +14 -0
- package/dist/viewer/usage/constants.js +14 -0
- package/dist/viewer/usage/constants.js.map +1 -0
- package/dist/viewer/usage/index.d.ts +7 -0
- package/dist/viewer/usage/index.js +8 -0
- package/dist/viewer/usage/index.js.map +1 -0
- package/dist/viewer/utils.d.ts +25 -0
- package/dist/viewer/utils.js +48 -0
- package/dist/viewer/utils.js.map +1 -0
- package/dist/viewer/validate.d.ts +23 -0
- package/dist/viewer/validate.js +275 -0
- package/dist/viewer/validate.js.map +1 -0
- package/dist/viewer/views/analysis.d.ts +10 -0
- package/dist/viewer/views/analysis.js +109 -0
- package/dist/viewer/views/analysis.js.map +1 -0
- package/dist/viewer/views/architecture.d.ts +10 -0
- package/dist/viewer/views/architecture.js +44 -0
- package/dist/viewer/views/architecture.js.map +1 -0
- package/dist/viewer/views/domain-hench.d.ts +13 -0
- package/dist/viewer/views/domain-hench.js +14 -0
- package/dist/viewer/views/domain-hench.js.map +1 -0
- package/dist/viewer/views/domain-rex.d.ts +17 -0
- package/dist/viewer/views/domain-rex.js +18 -0
- package/dist/viewer/views/domain-rex.js.map +1 -0
- package/dist/viewer/views/domain-settings.d.ts +12 -0
- package/dist/viewer/views/domain-settings.js +13 -0
- package/dist/viewer/views/domain-settings.js.map +1 -0
- package/dist/viewer/views/domain-sourcevision.d.ts +20 -0
- package/dist/viewer/views/domain-sourcevision.js +21 -0
- package/dist/viewer/views/domain-sourcevision.js.map +1 -0
- package/dist/viewer/views/enrichment-thresholds.d.ts +11 -0
- package/dist/viewer/views/enrichment-thresholds.js +12 -0
- package/dist/viewer/views/enrichment-thresholds.js.map +1 -0
- package/dist/viewer/views/feature-toggles.d.ts +13 -0
- package/dist/viewer/views/feature-toggles.js +185 -0
- package/dist/viewer/views/feature-toggles.js.map +1 -0
- package/dist/viewer/views/files.d.ts +13 -0
- package/dist/viewer/views/files.js +174 -0
- package/dist/viewer/views/files.js.map +1 -0
- package/dist/viewer/views/graph.d.ts +12 -0
- package/dist/viewer/views/graph.js +316 -0
- package/dist/viewer/views/graph.js.map +1 -0
- package/dist/viewer/views/hench-config.d.ts +39 -0
- package/dist/viewer/views/hench-config.js +473 -0
- package/dist/viewer/views/hench-config.js.map +1 -0
- package/dist/viewer/views/hench-runs.d.ts +19 -0
- package/dist/viewer/views/hench-runs.js +460 -0
- package/dist/viewer/views/hench-runs.js.map +1 -0
- package/dist/viewer/views/hench-templates.d.ts +17 -0
- package/dist/viewer/views/hench-templates.js +262 -0
- package/dist/viewer/views/hench-templates.js.map +1 -0
- package/dist/viewer/views/integration-config.d.ts +73 -0
- package/dist/viewer/views/integration-config.js +524 -0
- package/dist/viewer/views/integration-config.js.map +1 -0
- package/dist/viewer/views/notion-config.d.ts +16 -0
- package/dist/viewer/views/notion-config.js +357 -0
- package/dist/viewer/views/notion-config.js.map +1 -0
- package/dist/viewer/views/overview.d.ts +10 -0
- package/dist/viewer/views/overview.js +187 -0
- package/dist/viewer/views/overview.js.map +1 -0
- package/dist/viewer/views/pr-markdown.d.ts +3 -0
- package/dist/viewer/views/pr-markdown.js +350 -0
- package/dist/viewer/views/pr-markdown.js.map +1 -0
- package/dist/viewer/views/prd.d.ts +34 -0
- package/dist/viewer/views/prd.js +257 -0
- package/dist/viewer/views/prd.js.map +1 -0
- package/dist/viewer/views/problems.d.ts +8 -0
- package/dist/viewer/views/problems.js +50 -0
- package/dist/viewer/views/problems.js.map +1 -0
- package/dist/viewer/views/rex-dashboard.d.ts +14 -0
- package/dist/viewer/views/rex-dashboard.js +334 -0
- package/dist/viewer/views/rex-dashboard.js.map +1 -0
- package/dist/viewer/views/routes.d.ts +8 -0
- package/dist/viewer/views/routes.js +216 -0
- package/dist/viewer/views/routes.js.map +1 -0
- package/dist/viewer/views/sourcevision-tabs.d.ts +18 -0
- package/dist/viewer/views/sourcevision-tabs.js +14 -0
- package/dist/viewer/views/sourcevision-tabs.js.map +1 -0
- package/dist/viewer/views/suggestions.d.ts +8 -0
- package/dist/viewer/views/suggestions.js +36 -0
- package/dist/viewer/views/suggestions.js.map +1 -0
- package/dist/viewer/views/task-audit.d.ts +18 -0
- package/dist/viewer/views/task-audit.js +413 -0
- package/dist/viewer/views/task-audit.js.map +1 -0
- package/dist/viewer/views/token-usage.d.ts +10 -0
- package/dist/viewer/views/token-usage.js +410 -0
- package/dist/viewer/views/token-usage.js.map +1 -0
- package/dist/viewer/views/validation.d.ts +11 -0
- package/dist/viewer/views/validation.js +475 -0
- package/dist/viewer/views/validation.js.map +1 -0
- package/dist/viewer/views/view-registry.d.ts +27 -0
- package/dist/viewer/views/view-registry.js +70 -0
- package/dist/viewer/views/view-registry.js.map +1 -0
- package/dist/viewer/views/workflow-optimization.d.ts +12 -0
- package/dist/viewer/views/workflow-optimization.js +311 -0
- package/dist/viewer/views/workflow-optimization.js.map +1 -0
- package/dist/viewer/views/zone-types.d.ts +69 -0
- package/dist/viewer/views/zone-types.js +5 -0
- package/dist/viewer/views/zone-types.js.map +1 -0
- package/dist/viewer/views/zones.d.ts +50 -0
- package/dist/viewer/views/zones.js +1438 -0
- package/dist/viewer/views/zones.js.map +1 -0
- package/dist/viewer/visualization/colors.d.ts +16 -0
- package/dist/viewer/visualization/colors.js +31 -0
- package/dist/viewer/visualization/colors.js.map +1 -0
- package/dist/viewer/visualization/flow.d.ts +54 -0
- package/dist/viewer/visualization/flow.js +123 -0
- package/dist/viewer/visualization/flow.js.map +1 -0
- package/dist/viewer/visualization/index.d.ts +34 -0
- package/dist/viewer/visualization/index.js +40 -0
- package/dist/viewer/visualization/index.js.map +1 -0
- package/dist/viewer/visualization/metrics.d.ts +8 -0
- package/dist/viewer/visualization/metrics.js +16 -0
- package/dist/viewer/visualization/metrics.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side memory usage monitoring and early warning system.
|
|
3
|
+
*
|
|
4
|
+
* Tracks browser memory consumption in real-time, detects approaching
|
|
5
|
+
* memory limits, and triggers graceful degradation before OOM crashes.
|
|
6
|
+
*
|
|
7
|
+
* Uses `performance.memory` (Chrome/Edge) for precise readings and
|
|
8
|
+
* falls back to heuristic-based estimation on other browsers.
|
|
9
|
+
*
|
|
10
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
11
|
+
* the Preact hook (`useMemoryMonitor`) is provided separately.
|
|
12
|
+
*/
|
|
13
|
+
/** Memory usage snapshot at a point in time. */
|
|
14
|
+
export interface MemorySnapshot {
|
|
15
|
+
/** JS heap currently used (bytes). -1 if unavailable. */
|
|
16
|
+
usedJSHeapSize: number;
|
|
17
|
+
/** Total JS heap allocated by the browser (bytes). -1 if unavailable. */
|
|
18
|
+
totalJSHeapSize: number;
|
|
19
|
+
/** JS heap size limit (bytes). -1 if unavailable. */
|
|
20
|
+
jsHeapSizeLimit: number;
|
|
21
|
+
/** Usage ratio: usedJSHeapSize / jsHeapSizeLimit (0–1). -1 if unavailable. */
|
|
22
|
+
usageRatio: number;
|
|
23
|
+
/** Current warning level based on threshold configuration. */
|
|
24
|
+
level: MemoryLevel;
|
|
25
|
+
/** ISO timestamp of when this snapshot was taken. */
|
|
26
|
+
timestamp: string;
|
|
27
|
+
/** Whether precise memory data is available (Chrome/Edge only). */
|
|
28
|
+
precise: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Warning levels ordered by severity. */
|
|
31
|
+
export type MemoryLevel = "normal" | "elevated" | "warning" | "critical";
|
|
32
|
+
/** Threshold configuration for memory warning levels. */
|
|
33
|
+
export interface MemoryThresholds {
|
|
34
|
+
/** Ratio above which level becomes "elevated" (default: 0.50). */
|
|
35
|
+
elevated: number;
|
|
36
|
+
/** Ratio above which level becomes "warning" (default: 0.70). */
|
|
37
|
+
warning: number;
|
|
38
|
+
/** Ratio above which level becomes "critical" (default: 0.85). */
|
|
39
|
+
critical: number;
|
|
40
|
+
}
|
|
41
|
+
/** Callback invoked when memory level changes. */
|
|
42
|
+
export type MemoryLevelChangeHandler = (snapshot: MemorySnapshot, previousLevel: MemoryLevel) => void;
|
|
43
|
+
/** Configuration for the memory monitor. */
|
|
44
|
+
export interface MemoryMonitorConfig {
|
|
45
|
+
/** Polling interval in milliseconds (default: 5000). */
|
|
46
|
+
intervalMs: number;
|
|
47
|
+
/** Warning thresholds (ratios 0–1). */
|
|
48
|
+
thresholds: MemoryThresholds;
|
|
49
|
+
/** Called when the memory level changes (e.g. normal → warning). */
|
|
50
|
+
onLevelChange: MemoryLevelChangeHandler | null;
|
|
51
|
+
}
|
|
52
|
+
/** Check if the browser exposes precise memory metrics. */
|
|
53
|
+
export declare function hasPerformanceMemory(): boolean;
|
|
54
|
+
/** Determine the memory level for a given usage ratio. */
|
|
55
|
+
export declare function classifyLevel(ratio: number, thresholds: MemoryThresholds): MemoryLevel;
|
|
56
|
+
/** Take a memory snapshot using the best available API. */
|
|
57
|
+
export declare function takeSnapshot(thresholds?: MemoryThresholds): MemorySnapshot;
|
|
58
|
+
/** Format bytes as a human-readable string (e.g. "142.5 MB"). */
|
|
59
|
+
export declare function formatBytes(bytes: number): string;
|
|
60
|
+
/** Format a usage ratio as a percentage string (e.g. "72.3%"). */
|
|
61
|
+
export declare function formatRatio(ratio: number): string;
|
|
62
|
+
/** Subscribe to every new snapshot. Returns an unsubscribe function. */
|
|
63
|
+
export declare function onSnapshot(listener: (snapshot: MemorySnapshot) => void): () => void;
|
|
64
|
+
/**
|
|
65
|
+
* Start the memory monitor with the given configuration overrides.
|
|
66
|
+
* Safe to call multiple times — restarts with new config if already running.
|
|
67
|
+
*/
|
|
68
|
+
export declare function startMemoryMonitor(overrides?: Partial<MemoryMonitorConfig>): void;
|
|
69
|
+
/** Stop the memory monitor and clean up. */
|
|
70
|
+
export declare function stopMemoryMonitor(): void;
|
|
71
|
+
/** Get the most recent memory snapshot, or null if the monitor has not run. */
|
|
72
|
+
export declare function getLatestSnapshot(): MemorySnapshot | null;
|
|
73
|
+
/** Get the snapshot history (up to MAX_HISTORY_LENGTH entries). */
|
|
74
|
+
export declare function getSnapshotHistory(): readonly MemorySnapshot[];
|
|
75
|
+
/** Get the current memory warning level. */
|
|
76
|
+
export declare function getCurrentLevel(): MemoryLevel;
|
|
77
|
+
/** Reset all module state (for testing). */
|
|
78
|
+
export declare function resetMemoryMonitor(): void;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side memory usage monitoring and early warning system.
|
|
3
|
+
*
|
|
4
|
+
* Tracks browser memory consumption in real-time, detects approaching
|
|
5
|
+
* memory limits, and triggers graceful degradation before OOM crashes.
|
|
6
|
+
*
|
|
7
|
+
* Uses `performance.memory` (Chrome/Edge) for precise readings and
|
|
8
|
+
* falls back to heuristic-based estimation on other browsers.
|
|
9
|
+
*
|
|
10
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
11
|
+
* the Preact hook (`useMemoryMonitor`) is provided separately.
|
|
12
|
+
*/
|
|
13
|
+
import { registerPollingSource, } from "../polling/polling-state.js";
|
|
14
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
15
|
+
const DEFAULT_THRESHOLDS = {
|
|
16
|
+
elevated: 0.50,
|
|
17
|
+
warning: 0.70,
|
|
18
|
+
critical: 0.85,
|
|
19
|
+
};
|
|
20
|
+
const DEFAULT_INTERVAL_MS = 5000;
|
|
21
|
+
/** Key used to register with the centralized polling state manager. */
|
|
22
|
+
const POLLING_STATE_KEY = "memory-monitor";
|
|
23
|
+
/** Heuristic heap limit for browsers without performance.memory (2 GB). */
|
|
24
|
+
const FALLBACK_HEAP_LIMIT = 2 * 1024 * 1024 * 1024;
|
|
25
|
+
/** Maximum number of snapshots kept in history for debugging. */
|
|
26
|
+
const MAX_HISTORY_LENGTH = 60;
|
|
27
|
+
// ─── Module state ────────────────────────────────────────────────────────────
|
|
28
|
+
let config = {
|
|
29
|
+
intervalMs: DEFAULT_INTERVAL_MS,
|
|
30
|
+
thresholds: { ...DEFAULT_THRESHOLDS },
|
|
31
|
+
onLevelChange: null,
|
|
32
|
+
};
|
|
33
|
+
let pollTimer = null;
|
|
34
|
+
let stateUnsub = null;
|
|
35
|
+
let currentLevel = "normal";
|
|
36
|
+
let latestSnapshot = null;
|
|
37
|
+
let snapshotHistory = [];
|
|
38
|
+
let changeListeners = [];
|
|
39
|
+
// ─── Detection ───────────────────────────────────────────────────────────────
|
|
40
|
+
/** Check if the browser exposes precise memory metrics. */
|
|
41
|
+
export function hasPerformanceMemory() {
|
|
42
|
+
const perf = performance;
|
|
43
|
+
return (typeof perf.memory !== "undefined" &&
|
|
44
|
+
typeof perf.memory.usedJSHeapSize === "number");
|
|
45
|
+
}
|
|
46
|
+
// ─── Snapshot ────────────────────────────────────────────────────────────────
|
|
47
|
+
/** Determine the memory level for a given usage ratio. */
|
|
48
|
+
export function classifyLevel(ratio, thresholds) {
|
|
49
|
+
if (ratio < 0)
|
|
50
|
+
return "normal"; // no data
|
|
51
|
+
if (ratio >= thresholds.critical)
|
|
52
|
+
return "critical";
|
|
53
|
+
if (ratio >= thresholds.warning)
|
|
54
|
+
return "warning";
|
|
55
|
+
if (ratio >= thresholds.elevated)
|
|
56
|
+
return "elevated";
|
|
57
|
+
return "normal";
|
|
58
|
+
}
|
|
59
|
+
/** Take a memory snapshot using the best available API. */
|
|
60
|
+
export function takeSnapshot(thresholds = config.thresholds) {
|
|
61
|
+
const perf = performance;
|
|
62
|
+
if (perf.memory) {
|
|
63
|
+
const { usedJSHeapSize, totalJSHeapSize, jsHeapSizeLimit } = perf.memory;
|
|
64
|
+
const usageRatio = jsHeapSizeLimit > 0 ? usedJSHeapSize / jsHeapSizeLimit : -1;
|
|
65
|
+
return {
|
|
66
|
+
usedJSHeapSize,
|
|
67
|
+
totalJSHeapSize,
|
|
68
|
+
jsHeapSizeLimit,
|
|
69
|
+
usageRatio,
|
|
70
|
+
level: classifyLevel(usageRatio, thresholds),
|
|
71
|
+
timestamp: new Date().toISOString(),
|
|
72
|
+
precise: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Fallback: no precise data available. Return unknowns.
|
|
76
|
+
return {
|
|
77
|
+
usedJSHeapSize: -1,
|
|
78
|
+
totalJSHeapSize: -1,
|
|
79
|
+
jsHeapSizeLimit: FALLBACK_HEAP_LIMIT,
|
|
80
|
+
usageRatio: -1,
|
|
81
|
+
level: "normal",
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
precise: false,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ─── Formatting ──────────────────────────────────────────────────────────────
|
|
87
|
+
/** Format bytes as a human-readable string (e.g. "142.5 MB"). */
|
|
88
|
+
export function formatBytes(bytes) {
|
|
89
|
+
if (bytes < 0)
|
|
90
|
+
return "N/A";
|
|
91
|
+
if (bytes < 1024)
|
|
92
|
+
return `${bytes} B`;
|
|
93
|
+
if (bytes < 1024 * 1024)
|
|
94
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
95
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
96
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
97
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
98
|
+
}
|
|
99
|
+
/** Format a usage ratio as a percentage string (e.g. "72.3%"). */
|
|
100
|
+
export function formatRatio(ratio) {
|
|
101
|
+
if (ratio < 0)
|
|
102
|
+
return "N/A";
|
|
103
|
+
return `${(ratio * 100).toFixed(1)}%`;
|
|
104
|
+
}
|
|
105
|
+
// ─── Monitor lifecycle ───────────────────────────────────────────────────────
|
|
106
|
+
/** Subscribe to every new snapshot. Returns an unsubscribe function. */
|
|
107
|
+
export function onSnapshot(listener) {
|
|
108
|
+
changeListeners.push(listener);
|
|
109
|
+
return () => {
|
|
110
|
+
changeListeners = changeListeners.filter((l) => l !== listener);
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function notifyListeners(snapshot) {
|
|
114
|
+
for (const listener of changeListeners) {
|
|
115
|
+
try {
|
|
116
|
+
listener(snapshot);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error("[memory-monitor] listener error:", err);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function poll() {
|
|
124
|
+
const snapshot = takeSnapshot(config.thresholds);
|
|
125
|
+
latestSnapshot = snapshot;
|
|
126
|
+
// Keep a bounded history ring for debugging.
|
|
127
|
+
snapshotHistory.push(snapshot);
|
|
128
|
+
if (snapshotHistory.length > MAX_HISTORY_LENGTH) {
|
|
129
|
+
snapshotHistory = snapshotHistory.slice(-MAX_HISTORY_LENGTH);
|
|
130
|
+
}
|
|
131
|
+
// Detect level transitions.
|
|
132
|
+
const previousLevel = currentLevel;
|
|
133
|
+
if (snapshot.level !== currentLevel) {
|
|
134
|
+
currentLevel = snapshot.level;
|
|
135
|
+
if (config.onLevelChange) {
|
|
136
|
+
config.onLevelChange(snapshot, previousLevel);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
notifyListeners(snapshot);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Start the memory monitor with the given configuration overrides.
|
|
143
|
+
* Safe to call multiple times — restarts with new config if already running.
|
|
144
|
+
*/
|
|
145
|
+
export function startMemoryMonitor(overrides = {}) {
|
|
146
|
+
// Stop any existing monitor before applying new config.
|
|
147
|
+
stopMemoryMonitor();
|
|
148
|
+
config = {
|
|
149
|
+
intervalMs: overrides.intervalMs ?? DEFAULT_INTERVAL_MS,
|
|
150
|
+
thresholds: overrides.thresholds
|
|
151
|
+
? { ...DEFAULT_THRESHOLDS, ...overrides.thresholds }
|
|
152
|
+
: { ...DEFAULT_THRESHOLDS },
|
|
153
|
+
onLevelChange: overrides.onLevelChange ?? null,
|
|
154
|
+
};
|
|
155
|
+
// Take an immediate snapshot on start.
|
|
156
|
+
poll();
|
|
157
|
+
pollTimer = setInterval(poll, config.intervalMs);
|
|
158
|
+
// Register with centralized polling state as ESSENTIAL — the memory
|
|
159
|
+
// monitor must keep running during memory pressure to detect recovery.
|
|
160
|
+
stateUnsub = registerPollingSource(POLLING_STATE_KEY, {
|
|
161
|
+
suspend: () => stopPollTimer(),
|
|
162
|
+
resume: () => {
|
|
163
|
+
if (pollTimer === null) {
|
|
164
|
+
pollTimer = setInterval(poll, config.intervalMs);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
dispose: () => {
|
|
168
|
+
stopPollTimer();
|
|
169
|
+
stateUnsub = null;
|
|
170
|
+
},
|
|
171
|
+
getStatus: () => (pollTimer !== null ? "active" : "idle"),
|
|
172
|
+
}, { essential: true });
|
|
173
|
+
}
|
|
174
|
+
/** Stop the poll interval timer without touching polling-state registration. */
|
|
175
|
+
function stopPollTimer() {
|
|
176
|
+
if (pollTimer) {
|
|
177
|
+
clearInterval(pollTimer);
|
|
178
|
+
pollTimer = null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** Stop the memory monitor and clean up. */
|
|
182
|
+
export function stopMemoryMonitor() {
|
|
183
|
+
stopPollTimer();
|
|
184
|
+
// Deregister from centralized polling state. Nullify first to
|
|
185
|
+
// prevent re-entrant dispose.
|
|
186
|
+
if (stateUnsub) {
|
|
187
|
+
const unsub = stateUnsub;
|
|
188
|
+
stateUnsub = null;
|
|
189
|
+
unsub();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Get the most recent memory snapshot, or null if the monitor has not run. */
|
|
193
|
+
export function getLatestSnapshot() {
|
|
194
|
+
return latestSnapshot;
|
|
195
|
+
}
|
|
196
|
+
/** Get the snapshot history (up to MAX_HISTORY_LENGTH entries). */
|
|
197
|
+
export function getSnapshotHistory() {
|
|
198
|
+
return snapshotHistory;
|
|
199
|
+
}
|
|
200
|
+
/** Get the current memory warning level. */
|
|
201
|
+
export function getCurrentLevel() {
|
|
202
|
+
return currentLevel;
|
|
203
|
+
}
|
|
204
|
+
/** Reset all module state (for testing). */
|
|
205
|
+
export function resetMemoryMonitor() {
|
|
206
|
+
stopMemoryMonitor();
|
|
207
|
+
currentLevel = "normal";
|
|
208
|
+
latestSnapshot = null;
|
|
209
|
+
snapshotHistory = [];
|
|
210
|
+
changeListeners = [];
|
|
211
|
+
stateUnsub = null;
|
|
212
|
+
config = {
|
|
213
|
+
intervalMs: DEFAULT_INTERVAL_MS,
|
|
214
|
+
thresholds: { ...DEFAULT_THRESHOLDS },
|
|
215
|
+
onLevelChange: null,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=memory-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-monitor.js","sourceRoot":"","sources":["../../../src/viewer/performance/memory-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-aware refresh throttling and queuing.
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent refresh scheduling that considers current memory usage
|
|
5
|
+
* and queues or delays refresh operations when memory pressure is high.
|
|
6
|
+
*
|
|
7
|
+
* Behaviour by memory level:
|
|
8
|
+
*
|
|
9
|
+
* normal → Full-speed refresh, max concurrency (3 parallel fetches).
|
|
10
|
+
* elevated → 2× interval, reduced concurrency (2 parallel fetches).
|
|
11
|
+
* warning → 4× interval, serial execution only (1 at a time).
|
|
12
|
+
* critical → All refreshes paused, queue frozen until memory subsides.
|
|
13
|
+
*
|
|
14
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
15
|
+
* the Preact hook (`useRefreshThrottle`) is provided separately.
|
|
16
|
+
*/
|
|
17
|
+
import type { MemoryLevel } from "./memory-monitor.js";
|
|
18
|
+
/** Priority levels for refresh operations — higher number = higher priority. */
|
|
19
|
+
export type RefreshPriority = "low" | "normal" | "high";
|
|
20
|
+
/** A single queued refresh operation. */
|
|
21
|
+
export interface QueuedRefresh {
|
|
22
|
+
/** Unique key to deduplicate same-resource refreshes. */
|
|
23
|
+
readonly key: string;
|
|
24
|
+
/** The async work to perform. */
|
|
25
|
+
readonly execute: () => Promise<void>;
|
|
26
|
+
/** Priority determines dequeue order (high first). */
|
|
27
|
+
readonly priority: RefreshPriority;
|
|
28
|
+
/** ISO timestamp when the request entered the queue. */
|
|
29
|
+
readonly enqueuedAt: string;
|
|
30
|
+
}
|
|
31
|
+
/** Read-only snapshot of the current queue state. */
|
|
32
|
+
export interface RefreshQueueState {
|
|
33
|
+
/** Number of items waiting in the queue. */
|
|
34
|
+
readonly queueLength: number;
|
|
35
|
+
/** Number of refresh operations currently in flight. */
|
|
36
|
+
readonly activeCount: number;
|
|
37
|
+
/** Whether the queue is paused due to memory pressure. */
|
|
38
|
+
readonly paused: boolean;
|
|
39
|
+
/** Current memory level informing throttle decisions. */
|
|
40
|
+
readonly memoryLevel: MemoryLevel;
|
|
41
|
+
/** Recommended polling interval in milliseconds for the current level. */
|
|
42
|
+
readonly recommendedIntervalMs: number;
|
|
43
|
+
/** Maximum concurrent refresh operations allowed at the current level. */
|
|
44
|
+
readonly maxConcurrency: number;
|
|
45
|
+
/** Estimated milliseconds until the queue is fully drained (-1 if unknown). */
|
|
46
|
+
readonly estimatedCompletionMs: number;
|
|
47
|
+
/** Total refreshes completed since the throttle was started. */
|
|
48
|
+
readonly completedCount: number;
|
|
49
|
+
}
|
|
50
|
+
/** Callback invoked when the queue state changes. */
|
|
51
|
+
export type QueueChangeHandler = (state: RefreshQueueState) => void;
|
|
52
|
+
/** Configuration for the refresh throttle. */
|
|
53
|
+
export interface RefreshThrottleConfig {
|
|
54
|
+
/** Base polling interval in milliseconds (default: 5000). */
|
|
55
|
+
baseIntervalMs: number;
|
|
56
|
+
/** Average time a single refresh takes, for ETA estimation (default: 800ms). */
|
|
57
|
+
avgRefreshMs: number;
|
|
58
|
+
/** Called when the queue state changes. */
|
|
59
|
+
onChange: QueueChangeHandler | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Start the refresh throttle. Subscribes to the memory monitor and
|
|
63
|
+
* immediately evaluates the current memory level.
|
|
64
|
+
*
|
|
65
|
+
* Safe to call multiple times — restarts with new config.
|
|
66
|
+
*/
|
|
67
|
+
export declare function startRefreshThrottle(overrides?: Partial<RefreshThrottleConfig>): void;
|
|
68
|
+
/** Stop the refresh throttle and clean up subscriptions. */
|
|
69
|
+
export declare function stopRefreshThrottle(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Enqueue a refresh operation. If an entry with the same key already exists
|
|
72
|
+
* in the queue, it is replaced (deduplication). The operation will be
|
|
73
|
+
* executed when concurrency allows and memory pressure permits.
|
|
74
|
+
*
|
|
75
|
+
* Returns `true` if the item was queued, `false` if executed immediately.
|
|
76
|
+
*/
|
|
77
|
+
export declare function enqueueRefresh(key: string, execute: () => Promise<void>, priority?: RefreshPriority): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Get the recommended polling interval for the current memory level.
|
|
80
|
+
* Callers can use this to dynamically adjust their setInterval timing.
|
|
81
|
+
*/
|
|
82
|
+
export declare function getRecommendedInterval(baseIntervalMs?: number): number;
|
|
83
|
+
/** Subscribe to queue state changes. Returns an unsubscribe function. */
|
|
84
|
+
export declare function onQueueChange(listener: (state: RefreshQueueState) => void): () => void;
|
|
85
|
+
/** Get the current queue state. */
|
|
86
|
+
export declare function getQueueState(): RefreshQueueState;
|
|
87
|
+
/** Get the current memory level being used for throttle decisions. */
|
|
88
|
+
export declare function getThrottleLevel(): MemoryLevel;
|
|
89
|
+
/** Reset all module state (for testing). */
|
|
90
|
+
export declare function resetRefreshThrottle(): void;
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-aware refresh throttling and queuing.
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent refresh scheduling that considers current memory usage
|
|
5
|
+
* and queues or delays refresh operations when memory pressure is high.
|
|
6
|
+
*
|
|
7
|
+
* Behaviour by memory level:
|
|
8
|
+
*
|
|
9
|
+
* normal → Full-speed refresh, max concurrency (3 parallel fetches).
|
|
10
|
+
* elevated → 2× interval, reduced concurrency (2 parallel fetches).
|
|
11
|
+
* warning → 4× interval, serial execution only (1 at a time).
|
|
12
|
+
* critical → All refreshes paused, queue frozen until memory subsides.
|
|
13
|
+
*
|
|
14
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
15
|
+
* the Preact hook (`useRefreshThrottle`) is provided separately.
|
|
16
|
+
*/
|
|
17
|
+
import { onSnapshot, getLatestSnapshot, getCurrentLevel } from "./memory-monitor.js";
|
|
18
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
19
|
+
const DEFAULT_BASE_INTERVAL_MS = 5000;
|
|
20
|
+
const DEFAULT_AVG_REFRESH_MS = 800;
|
|
21
|
+
/** Interval multiplier per memory level. */
|
|
22
|
+
const INTERVAL_MULTIPLIERS = {
|
|
23
|
+
normal: 1,
|
|
24
|
+
elevated: 2,
|
|
25
|
+
warning: 4,
|
|
26
|
+
critical: Infinity, // effectively paused
|
|
27
|
+
};
|
|
28
|
+
/** Maximum concurrent refresh operations per memory level. */
|
|
29
|
+
const CONCURRENCY_LIMITS = {
|
|
30
|
+
normal: 3,
|
|
31
|
+
elevated: 2,
|
|
32
|
+
warning: 1,
|
|
33
|
+
critical: 0,
|
|
34
|
+
};
|
|
35
|
+
const PRIORITY_ORDER = {
|
|
36
|
+
low: 0,
|
|
37
|
+
normal: 1,
|
|
38
|
+
high: 2,
|
|
39
|
+
};
|
|
40
|
+
// ─── Module state ────────────────────────────────────────────────────────────
|
|
41
|
+
let config = {
|
|
42
|
+
baseIntervalMs: DEFAULT_BASE_INTERVAL_MS,
|
|
43
|
+
avgRefreshMs: DEFAULT_AVG_REFRESH_MS,
|
|
44
|
+
onChange: null,
|
|
45
|
+
};
|
|
46
|
+
let queue = [];
|
|
47
|
+
let activeCount = 0;
|
|
48
|
+
let completedCount = 0;
|
|
49
|
+
let currentMemoryLevel = "normal";
|
|
50
|
+
let unsubscribeMonitor = null;
|
|
51
|
+
let drainTimer = null;
|
|
52
|
+
let listeners = [];
|
|
53
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
54
|
+
/** Get the recommended interval for the current memory level. */
|
|
55
|
+
function computeRecommendedInterval() {
|
|
56
|
+
const multiplier = INTERVAL_MULTIPLIERS[currentMemoryLevel];
|
|
57
|
+
if (!isFinite(multiplier))
|
|
58
|
+
return Infinity;
|
|
59
|
+
return config.baseIntervalMs * multiplier;
|
|
60
|
+
}
|
|
61
|
+
/** Get max concurrency for the current memory level. */
|
|
62
|
+
function computeMaxConcurrency() {
|
|
63
|
+
return CONCURRENCY_LIMITS[currentMemoryLevel];
|
|
64
|
+
}
|
|
65
|
+
/** Estimate milliseconds until the queue is fully drained. */
|
|
66
|
+
function computeEstimatedCompletion() {
|
|
67
|
+
const total = queue.length + activeCount;
|
|
68
|
+
if (total === 0)
|
|
69
|
+
return 0;
|
|
70
|
+
if (currentMemoryLevel === "critical")
|
|
71
|
+
return -1; // paused, unknown
|
|
72
|
+
const maxConcurrency = computeMaxConcurrency();
|
|
73
|
+
if (maxConcurrency === 0)
|
|
74
|
+
return -1;
|
|
75
|
+
const batches = Math.ceil(total / maxConcurrency);
|
|
76
|
+
return batches * config.avgRefreshMs;
|
|
77
|
+
}
|
|
78
|
+
/** Build the queue state snapshot from current module state. */
|
|
79
|
+
function buildState() {
|
|
80
|
+
return {
|
|
81
|
+
queueLength: queue.length,
|
|
82
|
+
activeCount,
|
|
83
|
+
paused: currentMemoryLevel === "critical",
|
|
84
|
+
memoryLevel: currentMemoryLevel,
|
|
85
|
+
recommendedIntervalMs: computeRecommendedInterval(),
|
|
86
|
+
maxConcurrency: computeMaxConcurrency(),
|
|
87
|
+
estimatedCompletionMs: computeEstimatedCompletion(),
|
|
88
|
+
completedCount,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function notifyListeners() {
|
|
92
|
+
const state = buildState();
|
|
93
|
+
if (config.onChange)
|
|
94
|
+
config.onChange(state);
|
|
95
|
+
for (const listener of listeners) {
|
|
96
|
+
listener(state);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Sort queue by priority (high first), then by enqueue time (FIFO within same priority). */
|
|
100
|
+
function sortQueue() {
|
|
101
|
+
queue.sort((a, b) => {
|
|
102
|
+
const priorityDiff = PRIORITY_ORDER[b.priority] - PRIORITY_ORDER[a.priority];
|
|
103
|
+
if (priorityDiff !== 0)
|
|
104
|
+
return priorityDiff;
|
|
105
|
+
return a.enqueuedAt.localeCompare(b.enqueuedAt);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// ─── Queue drain ─────────────────────────────────────────────────────────────
|
|
109
|
+
/**
|
|
110
|
+
* Attempt to drain the queue by starting as many operations as allowed
|
|
111
|
+
* by the current concurrency limit.
|
|
112
|
+
*/
|
|
113
|
+
function drain() {
|
|
114
|
+
const maxConcurrency = computeMaxConcurrency();
|
|
115
|
+
while (queue.length > 0 && activeCount < maxConcurrency) {
|
|
116
|
+
const item = queue.shift();
|
|
117
|
+
if (!item)
|
|
118
|
+
break;
|
|
119
|
+
activeCount++;
|
|
120
|
+
notifyListeners();
|
|
121
|
+
item
|
|
122
|
+
.execute()
|
|
123
|
+
.catch(() => {
|
|
124
|
+
// Swallow errors — individual refresh failures shouldn't break the queue.
|
|
125
|
+
})
|
|
126
|
+
.finally(() => {
|
|
127
|
+
activeCount--;
|
|
128
|
+
completedCount++;
|
|
129
|
+
notifyListeners();
|
|
130
|
+
// Continue draining after each completion.
|
|
131
|
+
scheduleDrain();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Schedule a drain attempt — debounced to avoid tight loops. */
|
|
136
|
+
function scheduleDrain() {
|
|
137
|
+
if (drainTimer !== null)
|
|
138
|
+
return;
|
|
139
|
+
drainTimer = setTimeout(() => {
|
|
140
|
+
drainTimer = null;
|
|
141
|
+
drain();
|
|
142
|
+
}, 0);
|
|
143
|
+
}
|
|
144
|
+
// ─── Memory snapshot handler ─────────────────────────────────────────────────
|
|
145
|
+
function handleMemorySnapshot(snapshot) {
|
|
146
|
+
const newLevel = snapshot.level;
|
|
147
|
+
if (newLevel === currentMemoryLevel)
|
|
148
|
+
return;
|
|
149
|
+
const previousLevel = currentMemoryLevel;
|
|
150
|
+
currentMemoryLevel = newLevel;
|
|
151
|
+
notifyListeners();
|
|
152
|
+
// If memory pressure eased, try to drain the queue.
|
|
153
|
+
if (PRIORITY_ORDER[newLevel] === undefined &&
|
|
154
|
+
computeMaxConcurrency() > 0) {
|
|
155
|
+
scheduleDrain();
|
|
156
|
+
}
|
|
157
|
+
// More reliably: if new concurrency > 0 and we have queued items, drain.
|
|
158
|
+
if (computeMaxConcurrency() > 0 && queue.length > 0) {
|
|
159
|
+
scheduleDrain();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
163
|
+
/**
|
|
164
|
+
* Start the refresh throttle. Subscribes to the memory monitor and
|
|
165
|
+
* immediately evaluates the current memory level.
|
|
166
|
+
*
|
|
167
|
+
* Safe to call multiple times — restarts with new config.
|
|
168
|
+
*/
|
|
169
|
+
export function startRefreshThrottle(overrides = {}) {
|
|
170
|
+
stopRefreshThrottle();
|
|
171
|
+
config = {
|
|
172
|
+
baseIntervalMs: overrides.baseIntervalMs ?? DEFAULT_BASE_INTERVAL_MS,
|
|
173
|
+
avgRefreshMs: overrides.avgRefreshMs ?? DEFAULT_AVG_REFRESH_MS,
|
|
174
|
+
onChange: overrides.onChange ?? null,
|
|
175
|
+
};
|
|
176
|
+
// Evaluate current memory level immediately.
|
|
177
|
+
const latest = getLatestSnapshot();
|
|
178
|
+
if (latest) {
|
|
179
|
+
currentMemoryLevel = latest.level;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
currentMemoryLevel = getCurrentLevel();
|
|
183
|
+
}
|
|
184
|
+
// Subscribe to ongoing memory snapshots.
|
|
185
|
+
unsubscribeMonitor = onSnapshot(handleMemorySnapshot);
|
|
186
|
+
notifyListeners();
|
|
187
|
+
// Drain any items that may have been enqueued before start.
|
|
188
|
+
if (queue.length > 0) {
|
|
189
|
+
scheduleDrain();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Stop the refresh throttle and clean up subscriptions. */
|
|
193
|
+
export function stopRefreshThrottle() {
|
|
194
|
+
if (unsubscribeMonitor) {
|
|
195
|
+
unsubscribeMonitor();
|
|
196
|
+
unsubscribeMonitor = null;
|
|
197
|
+
}
|
|
198
|
+
if (drainTimer !== null) {
|
|
199
|
+
clearTimeout(drainTimer);
|
|
200
|
+
drainTimer = null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Enqueue a refresh operation. If an entry with the same key already exists
|
|
205
|
+
* in the queue, it is replaced (deduplication). The operation will be
|
|
206
|
+
* executed when concurrency allows and memory pressure permits.
|
|
207
|
+
*
|
|
208
|
+
* Returns `true` if the item was queued, `false` if executed immediately.
|
|
209
|
+
*/
|
|
210
|
+
export function enqueueRefresh(key, execute, priority = "normal") {
|
|
211
|
+
// Deduplicate: remove any existing entry with the same key.
|
|
212
|
+
queue = queue.filter((item) => item.key !== key);
|
|
213
|
+
const item = {
|
|
214
|
+
key,
|
|
215
|
+
execute,
|
|
216
|
+
priority,
|
|
217
|
+
enqueuedAt: new Date().toISOString(),
|
|
218
|
+
};
|
|
219
|
+
queue.push(item);
|
|
220
|
+
sortQueue();
|
|
221
|
+
notifyListeners();
|
|
222
|
+
scheduleDrain();
|
|
223
|
+
// Return true if the item is still in the queue (queued, not immediately drained).
|
|
224
|
+
// Since drain is async, the item is always initially queued.
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get the recommended polling interval for the current memory level.
|
|
229
|
+
* Callers can use this to dynamically adjust their setInterval timing.
|
|
230
|
+
*/
|
|
231
|
+
export function getRecommendedInterval(baseIntervalMs = config.baseIntervalMs) {
|
|
232
|
+
const multiplier = INTERVAL_MULTIPLIERS[currentMemoryLevel];
|
|
233
|
+
if (!isFinite(multiplier))
|
|
234
|
+
return Infinity;
|
|
235
|
+
return baseIntervalMs * multiplier;
|
|
236
|
+
}
|
|
237
|
+
/** Subscribe to queue state changes. Returns an unsubscribe function. */
|
|
238
|
+
export function onQueueChange(listener) {
|
|
239
|
+
listeners.push(listener);
|
|
240
|
+
return () => {
|
|
241
|
+
listeners = listeners.filter((l) => l !== listener);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/** Get the current queue state. */
|
|
245
|
+
export function getQueueState() {
|
|
246
|
+
return buildState();
|
|
247
|
+
}
|
|
248
|
+
/** Get the current memory level being used for throttle decisions. */
|
|
249
|
+
export function getThrottleLevel() {
|
|
250
|
+
return currentMemoryLevel;
|
|
251
|
+
}
|
|
252
|
+
/** Reset all module state (for testing). */
|
|
253
|
+
export function resetRefreshThrottle() {
|
|
254
|
+
stopRefreshThrottle();
|
|
255
|
+
queue = [];
|
|
256
|
+
activeCount = 0;
|
|
257
|
+
completedCount = 0;
|
|
258
|
+
currentMemoryLevel = "normal";
|
|
259
|
+
listeners = [];
|
|
260
|
+
config = {
|
|
261
|
+
baseIntervalMs: DEFAULT_BASE_INTERVAL_MS,
|
|
262
|
+
avgRefreshMs: DEFAULT_AVG_REFRESH_MS,
|
|
263
|
+
onChange: null,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=refresh-throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-throttle.js","sourceRoot":"","sources":["../../../src/viewer/performance/refresh-throttle.ts"],"names":[],"mappings":"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"}
|