@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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD WebSocket real-time update hook.
|
|
3
|
+
*
|
|
4
|
+
* Sets up a five-layer message processing pipeline for real-time PRD
|
|
5
|
+
* updates via WebSocket:
|
|
6
|
+
*
|
|
7
|
+
* raw WS → buffer gate → throttle → coalescer → DOM gate → batcher → RAF → render
|
|
8
|
+
*
|
|
9
|
+
* Each layer has a specific role:
|
|
10
|
+
*
|
|
11
|
+
* 0. **Response buffer gate** — drops messages when tab is hidden, flushes
|
|
12
|
+
* downstream buffers to free memory, reconciles on resume.
|
|
13
|
+
* 1. **Throttle** — per-type trailing-edge debounce for high-frequency
|
|
14
|
+
* rex message types (prd-changed, item-updated, item-deleted).
|
|
15
|
+
* 2. **Coalescer** — batches throttled output into a single reconciliation
|
|
16
|
+
* flush instead of N separate fetches.
|
|
17
|
+
* 3. **DOM update gate** — queues state updates when tab is hidden,
|
|
18
|
+
* replays them in a single batch when visible again.
|
|
19
|
+
* 4. **Update batcher** — collects setData calls into a single RAF
|
|
20
|
+
* callback per animation frame.
|
|
21
|
+
*
|
|
22
|
+
* Extracted from PRDView to isolate WebSocket side effects from the
|
|
23
|
+
* component's render logic.
|
|
24
|
+
*
|
|
25
|
+
* @see ../messaging/message-coalescer.ts
|
|
26
|
+
* @see ../messaging/message-throttle.ts
|
|
27
|
+
* @see ../performance/dom-update-gate.ts
|
|
28
|
+
* @see ../performance/update-batcher.ts
|
|
29
|
+
* @see ../performance/response-buffer-gate.ts
|
|
30
|
+
*/
|
|
31
|
+
import { useEffect } from "preact/hooks";
|
|
32
|
+
import { applyItemUpdate } from "../components/prd-tree/tree-differ.js";
|
|
33
|
+
import { removeItemById } from "../components/prd-tree/tree-utils.js";
|
|
34
|
+
import { createWSPipeline } from "../messaging/index.js";
|
|
35
|
+
import { createUpdateBatcher, createDomUpdateGate, createResponseBufferGate } from "../performance/index.js";
|
|
36
|
+
/**
|
|
37
|
+
* Hook that manages the WebSocket connection and message processing
|
|
38
|
+
* pipeline for real-time PRD updates.
|
|
39
|
+
*
|
|
40
|
+
* All parameters are expected to be stable references (wrapped in
|
|
41
|
+
* useCallback or similar). The effect re-runs when any dependency changes.
|
|
42
|
+
*/
|
|
43
|
+
export function usePRDWebSocket({ setData, fetchPRDData, fetchTaskUsage }) {
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
let ws = null;
|
|
46
|
+
// RAF-based update batcher: ensures at most one setData call per
|
|
47
|
+
// animation frame during rapid WebSocket message bursts.
|
|
48
|
+
const batcher = createUpdateBatcher();
|
|
49
|
+
// DOM update gate: wraps the batcher to prevent state updates and
|
|
50
|
+
// re-renders when the tab is hidden.
|
|
51
|
+
const updateGate = createDomUpdateGate({ batcher });
|
|
52
|
+
// Composed throttle → coalescer pipeline for WebSocket messages.
|
|
53
|
+
const pipeline = createWSPipeline({
|
|
54
|
+
// Immediate per-message handler — optimistic UI updates are gated
|
|
55
|
+
// by tab visibility and batched into the next animation frame.
|
|
56
|
+
onMessage: (msg) => {
|
|
57
|
+
if (msg.type === "rex:item-updated" && msg.itemId && msg.updates) {
|
|
58
|
+
updateGate.schedule(setData, (prev) => {
|
|
59
|
+
if (!prev)
|
|
60
|
+
return prev;
|
|
61
|
+
const newItems = applyItemUpdate(prev.items, msg.itemId, msg.updates);
|
|
62
|
+
return newItems === prev.items ? prev : { ...prev, items: newItems };
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (msg.type === "rex:item-deleted" && msg.itemId) {
|
|
67
|
+
updateGate.schedule(setData, (prev) => {
|
|
68
|
+
if (!prev)
|
|
69
|
+
return prev;
|
|
70
|
+
const newItems = removeItemById(prev.items, msg.itemId);
|
|
71
|
+
return newItems === prev.items ? prev : { ...prev, items: newItems };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
// Coalesced flush — fires once per debounce window for reconciliation.
|
|
76
|
+
onFlush: (batch) => {
|
|
77
|
+
updateGate.flush();
|
|
78
|
+
const needsReconciliation = batch.types.has("rex:item-updated") ||
|
|
79
|
+
batch.types.has("rex:item-deleted") ||
|
|
80
|
+
batch.types.has("rex:prd-changed");
|
|
81
|
+
if (needsReconciliation) {
|
|
82
|
+
fetchPRDData();
|
|
83
|
+
fetchTaskUsage();
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
defaultDelayMs: 250,
|
|
87
|
+
delays: {
|
|
88
|
+
"rex:prd-changed": 300, // heavier — full tree reconciliation
|
|
89
|
+
"rex:item-updated": 200, // lighter — targeted node patch
|
|
90
|
+
"rex:item-deleted": 200, // lighter — targeted node removal
|
|
91
|
+
},
|
|
92
|
+
throttledTypes: ["rex:prd-changed", "rex:item-updated", "rex:item-deleted"],
|
|
93
|
+
maxPendingPerType: 20,
|
|
94
|
+
});
|
|
95
|
+
// Response buffer gate: drops messages while tab is hidden,
|
|
96
|
+
// reconciles on resume.
|
|
97
|
+
const bufferGate = createResponseBufferGate({
|
|
98
|
+
flushDownstream: [
|
|
99
|
+
() => pipeline.flush(),
|
|
100
|
+
() => updateGate.flush(),
|
|
101
|
+
],
|
|
102
|
+
onResume: () => {
|
|
103
|
+
fetchPRDData();
|
|
104
|
+
fetchTaskUsage();
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
try {
|
|
108
|
+
const proto = location.protocol === "https:" ? "wss:" : "ws:";
|
|
109
|
+
ws = new WebSocket(`${proto}//${location.host}`);
|
|
110
|
+
ws.onmessage = (event) => {
|
|
111
|
+
try {
|
|
112
|
+
const msg = JSON.parse(event.data);
|
|
113
|
+
if (!bufferGate.accept())
|
|
114
|
+
return; // Tab hidden — drop message
|
|
115
|
+
pipeline.push(msg);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Ignore malformed messages
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// WebSocket not available — polling still works as fallback
|
|
124
|
+
}
|
|
125
|
+
return () => {
|
|
126
|
+
bufferGate.dispose();
|
|
127
|
+
pipeline.dispose();
|
|
128
|
+
updateGate.dispose();
|
|
129
|
+
batcher.dispose();
|
|
130
|
+
if (ws) {
|
|
131
|
+
try {
|
|
132
|
+
ws.close();
|
|
133
|
+
}
|
|
134
|
+
catch { /* ignore */ }
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}, [setData, fetchPRDData, fetchTaskUsage]);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=use-prd-websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-prd-websocket.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared hook + cache for project metadata from `/api/project`.
|
|
3
|
+
*
|
|
4
|
+
* Used by both the sidebar header (project name display) and the
|
|
5
|
+
* breadcrumb component.
|
|
6
|
+
*/
|
|
7
|
+
export interface GitInfo {
|
|
8
|
+
branch: string | null;
|
|
9
|
+
sha: string | null;
|
|
10
|
+
remoteUrl: string | null;
|
|
11
|
+
repoName: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectMetadata {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string | null;
|
|
16
|
+
version: string | null;
|
|
17
|
+
git: GitInfo | null;
|
|
18
|
+
nameSource: "package.json" | "directory";
|
|
19
|
+
}
|
|
20
|
+
/** Fetch with dedup — concurrent calls share one in-flight request. */
|
|
21
|
+
export declare function getProjectMetadata(): Promise<ProjectMetadata | null>;
|
|
22
|
+
/** Return the cached value synchronously (may be null if not yet fetched). */
|
|
23
|
+
export declare function getCachedProjectMetadata(): ProjectMetadata | null;
|
|
24
|
+
/** Preact hook — returns project metadata (fetches once, shares cache). */
|
|
25
|
+
export declare function useProjectMetadata(): ProjectMetadata | null;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared hook + cache for project metadata from `/api/project`.
|
|
3
|
+
*
|
|
4
|
+
* Used by both the sidebar header (project name display) and the
|
|
5
|
+
* breadcrumb component.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useEffect } from "preact/hooks";
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Singleton fetch + cache
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
let cachedMeta = null;
|
|
12
|
+
let fetchPromise = null;
|
|
13
|
+
async function fetchProjectMetadata() {
|
|
14
|
+
try {
|
|
15
|
+
const res = await fetch("/api/project");
|
|
16
|
+
if (!res.ok)
|
|
17
|
+
return null;
|
|
18
|
+
return (await res.json());
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Fetch with dedup — concurrent calls share one in-flight request. */
|
|
25
|
+
export function getProjectMetadata() {
|
|
26
|
+
if (cachedMeta)
|
|
27
|
+
return Promise.resolve(cachedMeta);
|
|
28
|
+
if (!fetchPromise) {
|
|
29
|
+
fetchPromise = fetchProjectMetadata().then((m) => {
|
|
30
|
+
cachedMeta = m;
|
|
31
|
+
fetchPromise = null;
|
|
32
|
+
return m;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return fetchPromise;
|
|
36
|
+
}
|
|
37
|
+
/** Return the cached value synchronously (may be null if not yet fetched). */
|
|
38
|
+
export function getCachedProjectMetadata() {
|
|
39
|
+
return cachedMeta;
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Hook
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/** Preact hook — returns project metadata (fetches once, shares cache). */
|
|
45
|
+
export function useProjectMetadata() {
|
|
46
|
+
const [project, setProject] = useState(cachedMeta);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
getProjectMetadata().then((m) => {
|
|
49
|
+
if (m)
|
|
50
|
+
setProject(m);
|
|
51
|
+
});
|
|
52
|
+
}, []);
|
|
53
|
+
return project;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=use-project-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-project-metadata.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-project-metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAqBnD,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,IAAI,UAAU,GAA2B,IAAI,CAAC;AAC9C,IAAI,YAAY,GAA2C,IAAI,CAAC;AAEhE,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,kBAAkB;IAChC,IAAI,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/C,UAAU,GAAG,CAAC,CAAC;YACf,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,wBAAwB;IACtC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAyB,UAAU,CAAC,CAAC;IAE3E,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,IAAI,CAAC;gBAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for project-wide status polling + WebSocket instant updates.
|
|
3
|
+
*
|
|
4
|
+
* Fetches `/api/status` with dedup + visibility-aware polling, and listens
|
|
5
|
+
* for WebSocket events (hench:run-changed, rex:prd-changed) to refresh
|
|
6
|
+
* immediately when backend state changes.
|
|
7
|
+
*
|
|
8
|
+
* Polling is automatically suspended when memory pressure disables the
|
|
9
|
+
* `autoRefresh` feature (elevated tier and above). The last-known status
|
|
10
|
+
* is preserved and displayed without updates until pressure subsides.
|
|
11
|
+
*
|
|
12
|
+
* Follows the same hook-over-infrastructure pattern as use-prd-websocket,
|
|
13
|
+
* use-memory-monitor, etc. — all infrastructure coupling (WebSocket,
|
|
14
|
+
* ws-pipeline, graceful-degradation) lives here rather than in a
|
|
15
|
+
* presentation component.
|
|
16
|
+
*/
|
|
17
|
+
type AnalysisFreshness = "fresh" | "stale" | "unavailable";
|
|
18
|
+
export interface SourceVisionStatus {
|
|
19
|
+
freshness: AnalysisFreshness;
|
|
20
|
+
analyzedAt: string | null;
|
|
21
|
+
minutesAgo: number | null;
|
|
22
|
+
modulesComplete: number;
|
|
23
|
+
modulesTotal: number;
|
|
24
|
+
}
|
|
25
|
+
export interface TreeStats {
|
|
26
|
+
total: number;
|
|
27
|
+
completed: number;
|
|
28
|
+
inProgress: number;
|
|
29
|
+
pending: number;
|
|
30
|
+
deferred: number;
|
|
31
|
+
blocked: number;
|
|
32
|
+
}
|
|
33
|
+
export interface RexStatus {
|
|
34
|
+
exists: boolean;
|
|
35
|
+
percentComplete: number;
|
|
36
|
+
stats: TreeStats | null;
|
|
37
|
+
hasInProgress: boolean;
|
|
38
|
+
hasPending: boolean;
|
|
39
|
+
nextTaskTitle: string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface HenchStatus {
|
|
42
|
+
configured: boolean;
|
|
43
|
+
totalRuns: number;
|
|
44
|
+
activeRuns: number;
|
|
45
|
+
staleRuns: number;
|
|
46
|
+
}
|
|
47
|
+
export interface ProjectStatus {
|
|
48
|
+
sv: SourceVisionStatus;
|
|
49
|
+
rex: RexStatus;
|
|
50
|
+
hench: HenchStatus;
|
|
51
|
+
}
|
|
52
|
+
/** Hook that returns project status, polling at a regular interval.
|
|
53
|
+
* Also listens for WebSocket events (hench:run-changed, rex:prd-changed)
|
|
54
|
+
* to refresh immediately when runs or PRD data change on disk.
|
|
55
|
+
*
|
|
56
|
+
* Polling is automatically suspended when memory pressure disables the
|
|
57
|
+
* `autoRefresh` feature (elevated tier and above). The last-known status
|
|
58
|
+
* is preserved and displayed without updates until pressure subsides. */
|
|
59
|
+
export declare function useProjectStatus(): ProjectStatus | null;
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for project-wide status polling + WebSocket instant updates.
|
|
3
|
+
*
|
|
4
|
+
* Fetches `/api/status` with dedup + visibility-aware polling, and listens
|
|
5
|
+
* for WebSocket events (hench:run-changed, rex:prd-changed) to refresh
|
|
6
|
+
* immediately when backend state changes.
|
|
7
|
+
*
|
|
8
|
+
* Polling is automatically suspended when memory pressure disables the
|
|
9
|
+
* `autoRefresh` feature (elevated tier and above). The last-known status
|
|
10
|
+
* is preserved and displayed without updates until pressure subsides.
|
|
11
|
+
*
|
|
12
|
+
* Follows the same hook-over-infrastructure pattern as use-prd-websocket,
|
|
13
|
+
* use-memory-monitor, etc. — all infrastructure coupling (WebSocket,
|
|
14
|
+
* ws-pipeline, graceful-degradation) lives here rather than in a
|
|
15
|
+
* presentation component.
|
|
16
|
+
*/
|
|
17
|
+
import { useState, useEffect, useCallback, useRef } from "preact/hooks";
|
|
18
|
+
import { usePolling } from "./use-polling.js";
|
|
19
|
+
import { createWSPipeline } from "../messaging/index.js";
|
|
20
|
+
import { isFeatureDisabled, onDegradationChange } from "../performance/index.js";
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Status fetcher with dedup + polling
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const POLL_INTERVAL_MS = 10_000;
|
|
25
|
+
let cachedStatus = null;
|
|
26
|
+
let fetchPromise = null;
|
|
27
|
+
async function fetchStatus() {
|
|
28
|
+
if (fetchPromise)
|
|
29
|
+
return fetchPromise;
|
|
30
|
+
fetchPromise = (async () => {
|
|
31
|
+
try {
|
|
32
|
+
const res = await fetch("/api/status");
|
|
33
|
+
if (!res.ok)
|
|
34
|
+
return null;
|
|
35
|
+
const data = await res.json();
|
|
36
|
+
cachedStatus = data;
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
fetchPromise = null;
|
|
44
|
+
}
|
|
45
|
+
})();
|
|
46
|
+
return fetchPromise;
|
|
47
|
+
}
|
|
48
|
+
/** Hook that returns project status, polling at a regular interval.
|
|
49
|
+
* Also listens for WebSocket events (hench:run-changed, rex:prd-changed)
|
|
50
|
+
* to refresh immediately when runs or PRD data change on disk.
|
|
51
|
+
*
|
|
52
|
+
* Polling is automatically suspended when memory pressure disables the
|
|
53
|
+
* `autoRefresh` feature (elevated tier and above). The last-known status
|
|
54
|
+
* is preserved and displayed without updates until pressure subsides. */
|
|
55
|
+
export function useProjectStatus() {
|
|
56
|
+
const [status, setStatus] = useState(cachedStatus);
|
|
57
|
+
const mountedRef = useRef(true);
|
|
58
|
+
// Track memory-pressure state reactively so usePolling's `enabled`
|
|
59
|
+
// parameter updates when the degradation tier changes.
|
|
60
|
+
const [autoRefreshDisabled, setAutoRefreshDisabled] = useState(() => isFeatureDisabled("autoRefresh"));
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
const unsubscribe = onDegradationChange((state) => {
|
|
63
|
+
setAutoRefreshDisabled(state.disabledFeatures.has("autoRefresh"));
|
|
64
|
+
});
|
|
65
|
+
return unsubscribe;
|
|
66
|
+
}, []);
|
|
67
|
+
const refresh = useCallback(async () => {
|
|
68
|
+
const data = await fetchStatus();
|
|
69
|
+
if (mountedRef.current)
|
|
70
|
+
setStatus(data);
|
|
71
|
+
}, []);
|
|
72
|
+
// Initial fetch + WebSocket for instant updates
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
mountedRef.current = true;
|
|
75
|
+
refresh();
|
|
76
|
+
// Connect to WebSocket for instant status updates when runs/PRD change.
|
|
77
|
+
// Composed throttle → coalescer pipeline debounces high-frequency
|
|
78
|
+
// message types independently before batching into a single refresh.
|
|
79
|
+
let ws = null;
|
|
80
|
+
const pipeline = createWSPipeline({
|
|
81
|
+
onFlush: (batch) => {
|
|
82
|
+
if (!mountedRef.current)
|
|
83
|
+
return;
|
|
84
|
+
const needsRefresh = batch.types.has("hench:run-changed") ||
|
|
85
|
+
batch.types.has("hench:task-execution-progress") ||
|
|
86
|
+
batch.types.has("rex:prd-changed");
|
|
87
|
+
if (needsRefresh) {
|
|
88
|
+
refresh();
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
defaultDelayMs: 250,
|
|
92
|
+
delays: {
|
|
93
|
+
"rex:prd-changed": 300,
|
|
94
|
+
"hench:task-execution-progress": 200,
|
|
95
|
+
},
|
|
96
|
+
throttledTypes: ["rex:prd-changed", "hench:task-execution-progress"],
|
|
97
|
+
maxPendingPerType: 20,
|
|
98
|
+
});
|
|
99
|
+
try {
|
|
100
|
+
const proto = location.protocol === "https:" ? "wss:" : "ws:";
|
|
101
|
+
ws = new WebSocket(`${proto}//${location.host}`);
|
|
102
|
+
ws.onmessage = (event) => {
|
|
103
|
+
if (!mountedRef.current)
|
|
104
|
+
return;
|
|
105
|
+
try {
|
|
106
|
+
const msg = JSON.parse(event.data);
|
|
107
|
+
pipeline.push(msg);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// ignore malformed messages
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// WebSocket not available — polling still works as fallback
|
|
116
|
+
}
|
|
117
|
+
return () => {
|
|
118
|
+
mountedRef.current = false;
|
|
119
|
+
pipeline.dispose();
|
|
120
|
+
if (ws) {
|
|
121
|
+
try {
|
|
122
|
+
ws.close();
|
|
123
|
+
}
|
|
124
|
+
catch { /* ignore */ }
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}, [refresh]);
|
|
128
|
+
// Visibility-aware polling via polling manager.
|
|
129
|
+
// Disabled during memory pressure (autoRefresh feature disabled).
|
|
130
|
+
usePolling("status-indicators", refresh, POLL_INTERVAL_MS, !autoRefreshDisabled);
|
|
131
|
+
return status;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=use-project-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-project-status.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-project-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preact hook for memory-aware refresh throttling.
|
|
3
|
+
*
|
|
4
|
+
* Provides reactive queue state to components so they can display
|
|
5
|
+
* queue progress, memory-adjusted intervals, and estimated completion
|
|
6
|
+
* times. Starts the refresh throttle on mount and cleans up on unmount.
|
|
7
|
+
*/
|
|
8
|
+
import type { MemoryLevel, RefreshQueueState, RefreshPriority } from "../performance/index.js";
|
|
9
|
+
export interface UseRefreshThrottleOptions {
|
|
10
|
+
/** Base polling interval in milliseconds (default: 5000). */
|
|
11
|
+
baseIntervalMs?: number;
|
|
12
|
+
/** Average time a single refresh takes, for ETA estimation (default: 800ms). */
|
|
13
|
+
avgRefreshMs?: number;
|
|
14
|
+
/** Whether to start the throttle immediately (default: true). */
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface UseRefreshThrottleResult {
|
|
18
|
+
/** Current queue state snapshot. */
|
|
19
|
+
state: RefreshQueueState;
|
|
20
|
+
/** Number of items waiting in the queue. */
|
|
21
|
+
queueLength: number;
|
|
22
|
+
/** Whether any refresh operations are active. */
|
|
23
|
+
isProcessing: boolean;
|
|
24
|
+
/** Whether the queue is paused due to memory pressure. */
|
|
25
|
+
paused: boolean;
|
|
26
|
+
/** Current memory level informing throttle decisions. */
|
|
27
|
+
memoryLevel: MemoryLevel;
|
|
28
|
+
/** Recommended polling interval for the current memory level. */
|
|
29
|
+
recommendedIntervalMs: number;
|
|
30
|
+
/** Estimated milliseconds until the queue is fully drained (-1 if unknown). */
|
|
31
|
+
estimatedCompletionMs: number;
|
|
32
|
+
/** Enqueue a refresh operation. Returns true if queued. */
|
|
33
|
+
enqueue: (key: string, execute: () => Promise<void>, priority?: RefreshPriority) => boolean;
|
|
34
|
+
/** Get the recommended interval for a given base interval. */
|
|
35
|
+
getInterval: (baseMs?: number) => number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Hook that provides memory-aware refresh throttling state.
|
|
39
|
+
*
|
|
40
|
+
* Usage:
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const { queueLength, paused, estimatedCompletionMs, enqueue } = useRefreshThrottle();
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function useRefreshThrottle(options?: UseRefreshThrottleOptions): UseRefreshThrottleResult;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preact hook for memory-aware refresh throttling.
|
|
3
|
+
*
|
|
4
|
+
* Provides reactive queue state to components so they can display
|
|
5
|
+
* queue progress, memory-adjusted intervals, and estimated completion
|
|
6
|
+
* times. Starts the refresh throttle on mount and cleans up on unmount.
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useEffect, useCallback } from "preact/hooks";
|
|
9
|
+
import { startRefreshThrottle, stopRefreshThrottle, onQueueChange, getQueueState, enqueueRefresh, getRecommendedInterval, } from "../performance/refresh-throttle.js";
|
|
10
|
+
/**
|
|
11
|
+
* Hook that provides memory-aware refresh throttling state.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const { queueLength, paused, estimatedCompletionMs, enqueue } = useRefreshThrottle();
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function useRefreshThrottle(options = {}) {
|
|
19
|
+
const { baseIntervalMs = 5000, avgRefreshMs = 800, enabled = true } = options;
|
|
20
|
+
const [queueState, setQueueState] = useState(getQueueState);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (!enabled)
|
|
23
|
+
return;
|
|
24
|
+
startRefreshThrottle({ baseIntervalMs, avgRefreshMs });
|
|
25
|
+
const unsubscribe = onQueueChange((newState) => {
|
|
26
|
+
setQueueState(newState);
|
|
27
|
+
});
|
|
28
|
+
// Sync in case state changed between render and effect.
|
|
29
|
+
setQueueState(getQueueState());
|
|
30
|
+
return () => {
|
|
31
|
+
unsubscribe();
|
|
32
|
+
stopRefreshThrottle();
|
|
33
|
+
};
|
|
34
|
+
}, [enabled, baseIntervalMs, avgRefreshMs]);
|
|
35
|
+
const enqueue = useCallback((key, execute, priority) => enqueueRefresh(key, execute, priority), []);
|
|
36
|
+
const getInterval = useCallback((baseMs) => getRecommendedInterval(baseMs),
|
|
37
|
+
// Re-create when state changes so the closure captures fresh module state.
|
|
38
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
39
|
+
[queueState]);
|
|
40
|
+
return {
|
|
41
|
+
state: queueState,
|
|
42
|
+
queueLength: queueState.queueLength,
|
|
43
|
+
isProcessing: queueState.activeCount > 0,
|
|
44
|
+
paused: queueState.paused,
|
|
45
|
+
memoryLevel: queueState.memoryLevel,
|
|
46
|
+
recommendedIntervalMs: queueState.recommendedIntervalMs,
|
|
47
|
+
estimatedCompletionMs: queueState.estimatedCompletionMs,
|
|
48
|
+
enqueue,
|
|
49
|
+
getInterval,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=use-refresh-throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-refresh-throttle.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-refresh-throttle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,EACd,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAgC5C;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAqC,EAAE;IAEvC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,YAAY,GAAG,GAAG,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAoB,aAAa,CAAC,CAAC;IAE/E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,oBAAoB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7C,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,wDAAwD;QACxD,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;QAE/B,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,mBAAmB,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,GAAW,EAAE,OAA4B,EAAE,QAA0B,EAAE,EAAE,CACxE,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,EACxC,EAAE,CACH,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,MAAe,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC;IACnD,2EAA2E;IAC3E,uDAAuD;IACvD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,YAAY,EAAE,UAAU,CAAC,WAAW,GAAG,CAAC;QACxC,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;QACvD,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;QACvD,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route state management hook for the viewer app.
|
|
3
|
+
*
|
|
4
|
+
* Manages the active view, selected entity IDs (file, zone, run, task),
|
|
5
|
+
* URL history synchronisation, and backward-compat migration of legacy hash URLs.
|
|
6
|
+
*/
|
|
7
|
+
import type { ViewId, NavigateTo } from "../types.js";
|
|
8
|
+
export interface RouteState {
|
|
9
|
+
view: ViewId;
|
|
10
|
+
selectedFile: string | null;
|
|
11
|
+
setSelectedFile: (file: string | null) => void;
|
|
12
|
+
selectedZone: string | null;
|
|
13
|
+
selectedRunId: string | null;
|
|
14
|
+
selectedTaskId: string | null;
|
|
15
|
+
navigateTo: NavigateTo;
|
|
16
|
+
handleSidebarNav: (id: ViewId) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function useRouteState(validViews: Set<ViewId>): RouteState;
|