@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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the web server.
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
5
|
+
/** Valid scope identifiers for standalone package viewers. */
|
|
6
|
+
export type ViewerScope = "sourcevision" | "rex" | "hench";
|
|
7
|
+
/** Server configuration passed to route handlers. */
|
|
8
|
+
export interface ServerContext {
|
|
9
|
+
/** Absolute path to the project directory. */
|
|
10
|
+
projectDir: string;
|
|
11
|
+
/** Absolute path to .sourcevision/ directory. */
|
|
12
|
+
svDir: string;
|
|
13
|
+
/** Absolute path to .rex/ directory. */
|
|
14
|
+
rexDir: string;
|
|
15
|
+
/** Whether dev mode (live reload) is enabled. */
|
|
16
|
+
dev: boolean;
|
|
17
|
+
/** When set, restricts the dashboard to a single package's views and APIs. */
|
|
18
|
+
scope?: ViewerScope;
|
|
19
|
+
}
|
|
20
|
+
/** A route handler receives the request, response, and server context. */
|
|
21
|
+
export type RouteHandler = (req: IncomingMessage, res: ServerResponse, ctx: ServerContext) => boolean | Promise<boolean>;
|
|
22
|
+
/** JSON API response helper. */
|
|
23
|
+
export declare function jsonResponse(res: ServerResponse, status: number, data: unknown): void;
|
|
24
|
+
/** Plain-text error response helper. */
|
|
25
|
+
export declare function errorResponse(res: ServerResponse, status: number, message: string): void;
|
|
26
|
+
/** Read the full request body as a string. */
|
|
27
|
+
export declare function readBody(req: IncomingMessage): Promise<string>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the web server.
|
|
3
|
+
*/
|
|
4
|
+
/** JSON API response helper. */
|
|
5
|
+
export function jsonResponse(res, status, data) {
|
|
6
|
+
res.writeHead(status, {
|
|
7
|
+
"Content-Type": "application/json",
|
|
8
|
+
"Cache-Control": "no-cache",
|
|
9
|
+
});
|
|
10
|
+
res.end(JSON.stringify(data));
|
|
11
|
+
}
|
|
12
|
+
/** Plain-text error response helper. */
|
|
13
|
+
export function errorResponse(res, status, message) {
|
|
14
|
+
res.writeHead(status, { "Content-Type": "application/json" });
|
|
15
|
+
res.end(JSON.stringify({ error: message }));
|
|
16
|
+
}
|
|
17
|
+
/** Read the full request body as a string. */
|
|
18
|
+
export function readBody(req) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const chunks = [];
|
|
21
|
+
req.on("data", (chunk) => chunks.push(chunk));
|
|
22
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
23
|
+
req.on("error", reject);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,gCAAgC;AAChC,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,MAAc,EACd,IAAa;IAEb,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,aAAa,CAC3B,GAAmB,EACnB,MAAc,EACd,OAAe;IAEf,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,GAAoB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Periodic cleanup scheduler for orphaned usage records.
|
|
3
|
+
*
|
|
4
|
+
* Cross-references in-memory usage aggregation with the current PRD state
|
|
5
|
+
* to identify and prune entries whose tasks no longer exist. Only prunes
|
|
6
|
+
* the in-memory aggregation cache — run files on disk are preserved as
|
|
7
|
+
* the source of truth, ensuring critical data survives PRD restructuring.
|
|
8
|
+
*
|
|
9
|
+
* ## Design
|
|
10
|
+
*
|
|
11
|
+
* The cleanup cycle:
|
|
12
|
+
* 1. Reads current aggregated task usage from the IncrementalTaskUsageAggregator
|
|
13
|
+
* 2. Loads valid task IDs from the PRD via `collectAllIds()`
|
|
14
|
+
* 3. Identifies orphaned entries (usage for tasks not in PRD)
|
|
15
|
+
* 4. Prunes them from the aggregator's in-memory state
|
|
16
|
+
* 5. Logs removed entries to a JSONL audit file for auditability
|
|
17
|
+
* 6. Broadcasts a WebSocket event so the dashboard can react
|
|
18
|
+
*
|
|
19
|
+
* Graceful degradation: if the PRD is unavailable (not initialized, corrupt,
|
|
20
|
+
* etc.), the cleanup cycle is skipped entirely — no data is removed.
|
|
21
|
+
*
|
|
22
|
+
* ## Configuration
|
|
23
|
+
*
|
|
24
|
+
* The cleanup interval is read from `.n-dx.json`:
|
|
25
|
+
* ```json
|
|
26
|
+
* { "cleanup": { "intervalMs": 604800000 } }
|
|
27
|
+
* ```
|
|
28
|
+
* Default: 604800000 ms (7 days / weekly).
|
|
29
|
+
*
|
|
30
|
+
* @module web/server/usage-cleanup-scheduler
|
|
31
|
+
*/
|
|
32
|
+
import type { IncrementalTaskUsageAggregator } from "./incremental-task-usage.js";
|
|
33
|
+
import type { TaskUsageAccumulator, CollectAllIdsFn, OrphanedEntry, CleanupResult, CleanupLogEntry, CleanupConfig } from "./shared-types.js";
|
|
34
|
+
export type { CollectAllIdsFn, OrphanedEntry, CleanupResult, CleanupLogEntry, CleanupConfig } from "./shared-types.js";
|
|
35
|
+
/** Default cleanup interval: 7 days (weekly). */
|
|
36
|
+
export declare const DEFAULT_CLEANUP_INTERVAL_MS: number;
|
|
37
|
+
/**
|
|
38
|
+
* Identify orphaned usage entries by cross-referencing with valid PRD task IDs.
|
|
39
|
+
*
|
|
40
|
+
* Returns entries from `taskUsage` whose task IDs are not in `validTaskIds`.
|
|
41
|
+
* Pure function — no side effects.
|
|
42
|
+
*/
|
|
43
|
+
export declare function identifyOrphanedEntries(taskUsage: Record<string, TaskUsageAccumulator>, validTaskIds: Set<string>): OrphanedEntry[];
|
|
44
|
+
/**
|
|
45
|
+
* Write a cleanup log entry to the JSONL audit file.
|
|
46
|
+
*
|
|
47
|
+
* Creates parent directories if they do not exist. Failures are silently
|
|
48
|
+
* swallowed — log writes are best-effort and must not break the cleanup cycle.
|
|
49
|
+
*/
|
|
50
|
+
export declare function writeCleanupLog(logPath: string, entry: CleanupLogEntry): void;
|
|
51
|
+
/**
|
|
52
|
+
* Load cleanup configuration from `.n-dx.json`.
|
|
53
|
+
*
|
|
54
|
+
* Reads the `cleanup.intervalMs` key. Returns defaults for missing,
|
|
55
|
+
* malformed, or invalid configuration.
|
|
56
|
+
*/
|
|
57
|
+
export declare function loadCleanupConfig(projectDir: string): CleanupConfig;
|
|
58
|
+
/** Signature for PRD loaders compatible with `loadPRDSync`. */
|
|
59
|
+
export type LoadPRDFn = (rexDir: string) => unknown;
|
|
60
|
+
/**
|
|
61
|
+
* Execute a single cleanup cycle.
|
|
62
|
+
*
|
|
63
|
+
* Cross-references current aggregated usage with the PRD to find orphaned
|
|
64
|
+
* entries, prunes them from the aggregator, and optionally logs and broadcasts
|
|
65
|
+
* the result.
|
|
66
|
+
*
|
|
67
|
+
* **Critical data preservation**: only in-memory aggregation state is pruned.
|
|
68
|
+
* Run files on disk (`.hench/runs/*.json`) are never modified or deleted,
|
|
69
|
+
* ensuring usage data can always be recovered via `aggregator.reset()`.
|
|
70
|
+
*
|
|
71
|
+
* @param options.aggregator The incremental task usage aggregator to clean
|
|
72
|
+
* @param options.rexDir Path to the `.rex/` directory containing `prd.json`
|
|
73
|
+
* @param options.collectAllIds Injected function to extract IDs from PRD items
|
|
74
|
+
* @param options.logPath Optional path for the JSONL audit log
|
|
75
|
+
* @param options.broadcast Optional WebSocket broadcast function
|
|
76
|
+
* @param options.loadPRD PRD loader function (injected to avoid cross-zone coupling; required when collectAllIds is provided)
|
|
77
|
+
*/
|
|
78
|
+
export declare function runCleanupCycle(options: {
|
|
79
|
+
aggregator: IncrementalTaskUsageAggregator;
|
|
80
|
+
rexDir: string;
|
|
81
|
+
collectAllIds?: CollectAllIdsFn;
|
|
82
|
+
logPath?: string;
|
|
83
|
+
broadcast?: (data: unknown) => void;
|
|
84
|
+
loadPRD?: LoadPRDFn;
|
|
85
|
+
}): Promise<CleanupResult>;
|
|
86
|
+
/**
|
|
87
|
+
* Start the periodic usage cleanup scheduler.
|
|
88
|
+
*
|
|
89
|
+
* Runs cleanup cycles on a configurable interval (read from `.n-dx.json`,
|
|
90
|
+
* default weekly). Each cycle cross-references usage data with the PRD
|
|
91
|
+
* and prunes orphaned entries.
|
|
92
|
+
*
|
|
93
|
+
* The returned interval handle should be stored in `watcherHandles.monitorIntervals`
|
|
94
|
+
* for proper cleanup during server shutdown.
|
|
95
|
+
*
|
|
96
|
+
* The timer is unref'd so it won't prevent process exit.
|
|
97
|
+
*
|
|
98
|
+
* @param ctx Server context with project paths
|
|
99
|
+
* @param getAggregator Factory to get the aggregator singleton for the runs directory
|
|
100
|
+
* @param broadcast Optional WebSocket broadcast function
|
|
101
|
+
* @param overrideIntervalMs Override interval (used for testing; takes precedence over config)
|
|
102
|
+
* @returns The setInterval handle
|
|
103
|
+
*/
|
|
104
|
+
export declare function startUsageCleanupScheduler(ctx: {
|
|
105
|
+
rexDir: string;
|
|
106
|
+
projectDir: string;
|
|
107
|
+
}, getAggregator: () => IncrementalTaskUsageAggregator, broadcast?: (data: unknown) => void, overrideIntervalMs?: number, collectAllIds?: CollectAllIdsFn, loadPRD?: LoadPRDFn): ReturnType<typeof setInterval>;
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Periodic cleanup scheduler for orphaned usage records.
|
|
3
|
+
*
|
|
4
|
+
* Cross-references in-memory usage aggregation with the current PRD state
|
|
5
|
+
* to identify and prune entries whose tasks no longer exist. Only prunes
|
|
6
|
+
* the in-memory aggregation cache — run files on disk are preserved as
|
|
7
|
+
* the source of truth, ensuring critical data survives PRD restructuring.
|
|
8
|
+
*
|
|
9
|
+
* ## Design
|
|
10
|
+
*
|
|
11
|
+
* The cleanup cycle:
|
|
12
|
+
* 1. Reads current aggregated task usage from the IncrementalTaskUsageAggregator
|
|
13
|
+
* 2. Loads valid task IDs from the PRD via `collectAllIds()`
|
|
14
|
+
* 3. Identifies orphaned entries (usage for tasks not in PRD)
|
|
15
|
+
* 4. Prunes them from the aggregator's in-memory state
|
|
16
|
+
* 5. Logs removed entries to a JSONL audit file for auditability
|
|
17
|
+
* 6. Broadcasts a WebSocket event so the dashboard can react
|
|
18
|
+
*
|
|
19
|
+
* Graceful degradation: if the PRD is unavailable (not initialized, corrupt,
|
|
20
|
+
* etc.), the cleanup cycle is skipped entirely — no data is removed.
|
|
21
|
+
*
|
|
22
|
+
* ## Configuration
|
|
23
|
+
*
|
|
24
|
+
* The cleanup interval is read from `.n-dx.json`:
|
|
25
|
+
* ```json
|
|
26
|
+
* { "cleanup": { "intervalMs": 604800000 } }
|
|
27
|
+
* ```
|
|
28
|
+
* Default: 604800000 ms (7 days / weekly).
|
|
29
|
+
*
|
|
30
|
+
* @module web/server/usage-cleanup-scheduler
|
|
31
|
+
*/
|
|
32
|
+
import { readFileSync, appendFileSync, existsSync, mkdirSync } from "node:fs";
|
|
33
|
+
import { join, dirname } from "node:path";
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Constants
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/** Default cleanup interval: 7 days (weekly). */
|
|
38
|
+
export const DEFAULT_CLEANUP_INTERVAL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Pure functions
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Identify orphaned usage entries by cross-referencing with valid PRD task IDs.
|
|
44
|
+
*
|
|
45
|
+
* Returns entries from `taskUsage` whose task IDs are not in `validTaskIds`.
|
|
46
|
+
* Pure function — no side effects.
|
|
47
|
+
*/
|
|
48
|
+
export function identifyOrphanedEntries(taskUsage, validTaskIds) {
|
|
49
|
+
const orphaned = [];
|
|
50
|
+
for (const [taskId, acc] of Object.entries(taskUsage)) {
|
|
51
|
+
if (!validTaskIds.has(taskId)) {
|
|
52
|
+
orphaned.push({
|
|
53
|
+
taskId,
|
|
54
|
+
totalTokens: acc.totalTokens,
|
|
55
|
+
runCount: acc.runCount,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return orphaned;
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// I/O helpers
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Write a cleanup log entry to the JSONL audit file.
|
|
66
|
+
*
|
|
67
|
+
* Creates parent directories if they do not exist. Failures are silently
|
|
68
|
+
* swallowed — log writes are best-effort and must not break the cleanup cycle.
|
|
69
|
+
*/
|
|
70
|
+
export function writeCleanupLog(logPath, entry) {
|
|
71
|
+
try {
|
|
72
|
+
const dir = dirname(logPath);
|
|
73
|
+
if (!existsSync(dir))
|
|
74
|
+
mkdirSync(dir, { recursive: true });
|
|
75
|
+
appendFileSync(logPath, JSON.stringify(entry) + "\n", "utf-8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Non-fatal: log write failure should not break cleanup
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Load cleanup configuration from `.n-dx.json`.
|
|
83
|
+
*
|
|
84
|
+
* Reads the `cleanup.intervalMs` key. Returns defaults for missing,
|
|
85
|
+
* malformed, or invalid configuration.
|
|
86
|
+
*/
|
|
87
|
+
export function loadCleanupConfig(projectDir) {
|
|
88
|
+
const defaults = { intervalMs: DEFAULT_CLEANUP_INTERVAL_MS };
|
|
89
|
+
const configPath = join(projectDir, ".n-dx.json");
|
|
90
|
+
if (!existsSync(configPath))
|
|
91
|
+
return defaults;
|
|
92
|
+
try {
|
|
93
|
+
const raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
94
|
+
const cleanup = raw.cleanup;
|
|
95
|
+
if (typeof cleanup !== "object" || cleanup === null)
|
|
96
|
+
return defaults;
|
|
97
|
+
const intervalMs = cleanup.intervalMs;
|
|
98
|
+
if (typeof intervalMs === "number" && intervalMs > 0) {
|
|
99
|
+
return { intervalMs };
|
|
100
|
+
}
|
|
101
|
+
return defaults;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return defaults;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Load valid task IDs from the PRD file.
|
|
109
|
+
*
|
|
110
|
+
* Returns null if the PRD cannot be read, allowing callers to degrade
|
|
111
|
+
* gracefully (skip cleanup rather than removing everything).
|
|
112
|
+
*/
|
|
113
|
+
function loadValidTaskIds(rexDir, collectAllIds, loadPRD) {
|
|
114
|
+
const doc = loadPRD(rexDir);
|
|
115
|
+
if (!doc || !Array.isArray(doc.items))
|
|
116
|
+
return null;
|
|
117
|
+
return collectAllIds(doc.items);
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Core cleanup logic
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
/**
|
|
123
|
+
* Execute a single cleanup cycle.
|
|
124
|
+
*
|
|
125
|
+
* Cross-references current aggregated usage with the PRD to find orphaned
|
|
126
|
+
* entries, prunes them from the aggregator, and optionally logs and broadcasts
|
|
127
|
+
* the result.
|
|
128
|
+
*
|
|
129
|
+
* **Critical data preservation**: only in-memory aggregation state is pruned.
|
|
130
|
+
* Run files on disk (`.hench/runs/*.json`) are never modified or deleted,
|
|
131
|
+
* ensuring usage data can always be recovered via `aggregator.reset()`.
|
|
132
|
+
*
|
|
133
|
+
* @param options.aggregator The incremental task usage aggregator to clean
|
|
134
|
+
* @param options.rexDir Path to the `.rex/` directory containing `prd.json`
|
|
135
|
+
* @param options.collectAllIds Injected function to extract IDs from PRD items
|
|
136
|
+
* @param options.logPath Optional path for the JSONL audit log
|
|
137
|
+
* @param options.broadcast Optional WebSocket broadcast function
|
|
138
|
+
* @param options.loadPRD PRD loader function (injected to avoid cross-zone coupling; required when collectAllIds is provided)
|
|
139
|
+
*/
|
|
140
|
+
export async function runCleanupCycle(options) {
|
|
141
|
+
const { aggregator, rexDir, collectAllIds: collectIds, logPath, broadcast, loadPRD } = options;
|
|
142
|
+
// Ensure aggregator is populated before checking for orphans
|
|
143
|
+
const taskUsage = await aggregator.getTaskUsage();
|
|
144
|
+
const validIds = collectIds && loadPRD ? loadValidTaskIds(rexDir, collectIds, loadPRD) : null;
|
|
145
|
+
const result = {
|
|
146
|
+
timestamp: new Date().toISOString(),
|
|
147
|
+
prdAvailable: validIds !== null,
|
|
148
|
+
orphanedEntries: [],
|
|
149
|
+
totalOrphaned: 0,
|
|
150
|
+
totalTokensRemoved: 0,
|
|
151
|
+
totalRunsRemoved: 0,
|
|
152
|
+
};
|
|
153
|
+
// Skip cleanup if PRD is unavailable — we cannot determine which tasks
|
|
154
|
+
// are valid, so removing anything would risk data loss.
|
|
155
|
+
if (!validIds) {
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
const orphaned = identifyOrphanedEntries(taskUsage, validIds);
|
|
159
|
+
if (orphaned.length === 0) {
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
// Prune from aggregator's in-memory state
|
|
163
|
+
aggregator.pruneStaleEntries(validIds);
|
|
164
|
+
result.orphanedEntries = orphaned;
|
|
165
|
+
result.totalOrphaned = orphaned.length;
|
|
166
|
+
result.totalTokensRemoved = orphaned.reduce((sum, e) => sum + e.totalTokens, 0);
|
|
167
|
+
result.totalRunsRemoved = orphaned.reduce((sum, e) => sum + e.runCount, 0);
|
|
168
|
+
// Write audit log for accountability
|
|
169
|
+
if (logPath) {
|
|
170
|
+
writeCleanupLog(logPath, { event: "usage_cleanup", ...result });
|
|
171
|
+
}
|
|
172
|
+
// Broadcast so the dashboard knows cleanup occurred
|
|
173
|
+
if (broadcast) {
|
|
174
|
+
broadcast({
|
|
175
|
+
type: "hench:usage-cleanup",
|
|
176
|
+
...result,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// Scheduler
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
/**
|
|
185
|
+
* Start the periodic usage cleanup scheduler.
|
|
186
|
+
*
|
|
187
|
+
* Runs cleanup cycles on a configurable interval (read from `.n-dx.json`,
|
|
188
|
+
* default weekly). Each cycle cross-references usage data with the PRD
|
|
189
|
+
* and prunes orphaned entries.
|
|
190
|
+
*
|
|
191
|
+
* The returned interval handle should be stored in `watcherHandles.monitorIntervals`
|
|
192
|
+
* for proper cleanup during server shutdown.
|
|
193
|
+
*
|
|
194
|
+
* The timer is unref'd so it won't prevent process exit.
|
|
195
|
+
*
|
|
196
|
+
* @param ctx Server context with project paths
|
|
197
|
+
* @param getAggregator Factory to get the aggregator singleton for the runs directory
|
|
198
|
+
* @param broadcast Optional WebSocket broadcast function
|
|
199
|
+
* @param overrideIntervalMs Override interval (used for testing; takes precedence over config)
|
|
200
|
+
* @returns The setInterval handle
|
|
201
|
+
*/
|
|
202
|
+
export function startUsageCleanupScheduler(ctx, getAggregator, broadcast, overrideIntervalMs, collectAllIds, loadPRD) {
|
|
203
|
+
const logPath = join(ctx.projectDir, ".hench", "usage-cleanup.jsonl");
|
|
204
|
+
// Determine interval: explicit override > .n-dx.json config > default
|
|
205
|
+
const intervalMs = overrideIntervalMs ?? loadCleanupConfig(ctx.projectDir).intervalMs;
|
|
206
|
+
const timer = setInterval(async () => {
|
|
207
|
+
try {
|
|
208
|
+
const aggregator = getAggregator();
|
|
209
|
+
const result = await runCleanupCycle({
|
|
210
|
+
aggregator,
|
|
211
|
+
rexDir: ctx.rexDir,
|
|
212
|
+
collectAllIds,
|
|
213
|
+
logPath,
|
|
214
|
+
broadcast,
|
|
215
|
+
loadPRD,
|
|
216
|
+
});
|
|
217
|
+
if (result.totalOrphaned > 0) {
|
|
218
|
+
console.log(`[usage-cleanup] Removed ${result.totalOrphaned} orphaned task(s): ` +
|
|
219
|
+
`${result.totalTokensRemoved} tokens across ${result.totalRunsRemoved} run(s)`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
// Non-fatal: cleanup errors must not crash the server
|
|
224
|
+
console.error("[usage-cleanup] Error during cleanup cycle:", err);
|
|
225
|
+
}
|
|
226
|
+
}, intervalMs);
|
|
227
|
+
if (timer.unref) {
|
|
228
|
+
timer.unref();
|
|
229
|
+
}
|
|
230
|
+
return timer;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=usage-cleanup-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-cleanup-scheduler.js","sourceRoot":"","sources":["../../src/server/usage-cleanup-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAM1C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,iDAAiD;AACjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnE,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,SAA+C,EAC/C,YAAyB;IAEzB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM;gBACN,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAsB;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,MAAM,QAAQ,GAAkB,EAAE,UAAU,EAAE,2BAA2B,EAAE,CAAC;IAE5E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;QACrF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC;QAErE,MAAM,UAAU,GAAI,OAAmC,CAAC,UAAU,CAAC;QACnE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,UAAU,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAYD;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,MAAc,EACd,aAA8B,EAC9B,OAAkB;IAElB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAoB,CAAC;IAC/C,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAOrC;IACC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE/F,6DAA6D;IAC7D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9F,MAAM,MAAM,GAAkB;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,YAAY,EAAE,QAAQ,KAAK,IAAI;QAC/B,eAAe,EAAE,EAAE;QACnB,aAAa,EAAE,CAAC;QAChB,kBAAkB,EAAE,CAAC;QACrB,gBAAgB,EAAE,CAAC;KACpB,CAAC;IAEF,uEAAuE;IACvE,wDAAwD;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0CAA0C;IAC1C,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEvC,MAAM,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;IACvC,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE3E,qCAAqC;IACrC,IAAI,OAAO,EAAE,CAAC;QACZ,eAAe,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,oDAAoD;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC;YACR,IAAI,EAAE,qBAAqB;YAC3B,GAAG,MAAM;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,0BAA0B,CACxC,GAA2C,EAC3C,aAAmD,EACnD,SAAmC,EACnC,kBAA2B,EAC3B,aAA+B,EAC/B,OAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAEtE,sEAAsE;IACtE,MAAM,UAAU,GAAG,kBAAkB,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC;IAEtF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,UAAU;gBACV,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,aAAa;gBACb,OAAO;gBACP,SAAS;gBACT,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CACT,2BAA2B,MAAM,CAAC,aAAa,qBAAqB;oBACpE,GAAG,MAAM,CAAC,kBAAkB,kBAAkB,MAAM,CAAC,gBAAgB,SAAS,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sDAAsD;YACtD,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket support for real-time updates.
|
|
3
|
+
*
|
|
4
|
+
* Implements the WebSocket protocol (RFC 6455) using only Node.js built-in
|
|
5
|
+
* modules — no external dependencies required.
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - Broadcasting PRD item changes to connected clients
|
|
9
|
+
* - Broadcasting file-change events (sourcevision data updates)
|
|
10
|
+
* - Immediate disconnect detection via socket events + pre-broadcast pruning
|
|
11
|
+
* - Ping/pong keepalive (reduced interval safety net)
|
|
12
|
+
* - Connection health tracking and lifecycle metrics
|
|
13
|
+
*/
|
|
14
|
+
import type { IncomingMessage } from "node:http";
|
|
15
|
+
import type { Duplex } from "node:stream";
|
|
16
|
+
/** Reason a client was removed from the connection set. */
|
|
17
|
+
export type CleanupReason = "close" | "error" | "end" | "ping_timeout" | "prune" | "shutdown" | "write_fail";
|
|
18
|
+
/** Health level derived from cleanup failure rate and connection trends. */
|
|
19
|
+
export type WsHealthLevel = "healthy" | "degraded" | "unhealthy";
|
|
20
|
+
/** Snapshot of WebSocket health metrics for API/broadcast consumption. */
|
|
21
|
+
export interface WsHealthSnapshot {
|
|
22
|
+
/** Current number of active connections. */
|
|
23
|
+
activeConnections: number;
|
|
24
|
+
/** Peak concurrent connections seen since server start. */
|
|
25
|
+
peakConnections: number;
|
|
26
|
+
/** Total connections accepted since server start. */
|
|
27
|
+
totalConnectionsAccepted: number;
|
|
28
|
+
/** Total connections removed (for any reason) since server start. */
|
|
29
|
+
totalConnectionsRemoved: number;
|
|
30
|
+
/** Cleanup metrics broken down by reason. */
|
|
31
|
+
cleanupsByReason: Record<CleanupReason, number>;
|
|
32
|
+
/** Number of cleanups in the last 60 seconds. */
|
|
33
|
+
recentCleanups: number;
|
|
34
|
+
/** Average connection duration (ms) for connections closed in the last 5 minutes. */
|
|
35
|
+
avgConnectionDurationMs: number;
|
|
36
|
+
/** Total broadcasts sent since server start. */
|
|
37
|
+
totalBroadcasts: number;
|
|
38
|
+
/** Total failed writes during broadcasts. */
|
|
39
|
+
totalBroadcastWriteFailures: number;
|
|
40
|
+
/** Cleanup success rate (0–1): successful cleanups / total cleanups. */
|
|
41
|
+
cleanupSuccessRate: number;
|
|
42
|
+
/** Average cleanup timing (ms): how quickly dead connections are detected. */
|
|
43
|
+
avgCleanupLatencyMs: number;
|
|
44
|
+
/** Overall health level. */
|
|
45
|
+
health: WsHealthLevel;
|
|
46
|
+
/** Server uptime in milliseconds. */
|
|
47
|
+
uptimeMs: number;
|
|
48
|
+
/** ISO timestamp of this snapshot. */
|
|
49
|
+
timestamp: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* WebSocket connection health tracker — records connection lifecycle events,
|
|
53
|
+
* cleanup metrics, and resource usage for dashboard monitoring.
|
|
54
|
+
*
|
|
55
|
+
* Instruments the WebSocket manager to collect:
|
|
56
|
+
* - Active vs total (historical peak) connection counts
|
|
57
|
+
* - Cleanup events: successful removals, reasons, timing
|
|
58
|
+
* - Broadcast statistics: total broadcasts, failed writes
|
|
59
|
+
* - Connection duration tracking
|
|
60
|
+
*
|
|
61
|
+
* Designed as a singleton that accumulates metrics over the server lifetime.
|
|
62
|
+
* Provides a snapshot API consumed by the REST endpoint and WS broadcast.
|
|
63
|
+
*/
|
|
64
|
+
export declare class WsHealthTracker {
|
|
65
|
+
private readonly startedAt;
|
|
66
|
+
private activeConnectionCount;
|
|
67
|
+
private peakConnectionCount;
|
|
68
|
+
private totalAccepted;
|
|
69
|
+
private totalRemoved;
|
|
70
|
+
private readonly connectionStartTimes;
|
|
71
|
+
private connectionIdCounter;
|
|
72
|
+
private readonly cleanupHistory;
|
|
73
|
+
private readonly cleanupsByReason;
|
|
74
|
+
private totalBroadcasts;
|
|
75
|
+
private totalWriteFailures;
|
|
76
|
+
private cleanupLatencySum;
|
|
77
|
+
private cleanupLatencyCount;
|
|
78
|
+
/**
|
|
79
|
+
* Record a new connection being accepted.
|
|
80
|
+
* Returns a connection ID to pass to `recordDisconnect()`.
|
|
81
|
+
*/
|
|
82
|
+
recordConnect(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Record a connection being removed.
|
|
85
|
+
*/
|
|
86
|
+
recordDisconnect(connectionId: string, reason: CleanupReason): void;
|
|
87
|
+
/** Record a broadcast attempt. */
|
|
88
|
+
recordBroadcast(): void;
|
|
89
|
+
/** Record a failed write during broadcast. */
|
|
90
|
+
recordBroadcastWriteFailure(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Sync the active connection count with the actual client set size.
|
|
93
|
+
* Called periodically to correct any drift from missed events.
|
|
94
|
+
*/
|
|
95
|
+
syncActiveCount(actualCount: number): void;
|
|
96
|
+
/** Get a snapshot of current health metrics. */
|
|
97
|
+
getSnapshot(): WsHealthSnapshot;
|
|
98
|
+
/** Reset all counters (for testing). */
|
|
99
|
+
reset(): void;
|
|
100
|
+
private computeHealth;
|
|
101
|
+
}
|
|
102
|
+
/** A broadcast function that sends a message to all connected clients. */
|
|
103
|
+
export type WebSocketBroadcaster = (data: unknown) => void;
|
|
104
|
+
/** Options for the WebSocket manager. */
|
|
105
|
+
export interface WebSocketManagerOptions {
|
|
106
|
+
/** Optional health tracker for connection lifecycle metrics. */
|
|
107
|
+
healthTracker?: WsHealthTracker;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Keepalive ping interval (ms). Reduced from 30 s for faster detection
|
|
111
|
+
* of silently dropped connections. Primary disconnect detection is
|
|
112
|
+
* event-driven (close/error/end handlers); pings are a safety net for
|
|
113
|
+
* connections that go silent without a TCP FIN/RST.
|
|
114
|
+
*/
|
|
115
|
+
export declare const PING_INTERVAL_MS = 5000;
|
|
116
|
+
/**
|
|
117
|
+
* Create a WebSocket manager that handles upgrades and broadcasting.
|
|
118
|
+
*
|
|
119
|
+
* Usage:
|
|
120
|
+
* ```ts
|
|
121
|
+
* const ws = createWebSocketManager();
|
|
122
|
+
* server.on("upgrade", ws.handleUpgrade);
|
|
123
|
+
* ws.broadcast({ type: "rex:item-updated", itemId: "..." });
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export declare function createWebSocketManager(opts?: WebSocketManagerOptions): {
|
|
127
|
+
handleUpgrade: (req: IncomingMessage, socket: Duplex, head: Buffer) => void;
|
|
128
|
+
broadcast: WebSocketBroadcaster;
|
|
129
|
+
clientCount: () => number;
|
|
130
|
+
shutdown: () => void;
|
|
131
|
+
};
|