@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,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental task usage aggregator.
|
|
3
|
+
*
|
|
4
|
+
* Maintains an in-memory cache of per-task token usage aggregation.
|
|
5
|
+
* On each refresh, only processes new/modified run files using
|
|
6
|
+
* mtime+size change detection, keeping aggregation time constant
|
|
7
|
+
* regardless of total run history size.
|
|
8
|
+
*
|
|
9
|
+
* ## Design
|
|
10
|
+
*
|
|
11
|
+
* Each run file's contribution (taskId + totalTokens) is tracked
|
|
12
|
+
* individually so that modifications and deletions can be applied
|
|
13
|
+
* as incremental deltas rather than requiring a full re-scan.
|
|
14
|
+
*
|
|
15
|
+
* Change detection uses mtime + file size — the same strategy as
|
|
16
|
+
* hench's `RunChangeDetector` — to avoid reading unchanged files.
|
|
17
|
+
*
|
|
18
|
+
* @module web/server/incremental-task-usage
|
|
19
|
+
*/
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
22
|
+
import { gunzipSync } from "node:zlib";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// IncrementalTaskUsageAggregator
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Incrementally aggregates per-task token usage from `.hench/runs/` files.
|
|
28
|
+
*
|
|
29
|
+
* First call processes all existing run files (full scan). Subsequent calls
|
|
30
|
+
* detect filesystem changes via mtime+size comparison and only read the
|
|
31
|
+
* files that were added, modified, or deleted — keeping aggregation time
|
|
32
|
+
* constant regardless of total run history size.
|
|
33
|
+
*
|
|
34
|
+
* Usage:
|
|
35
|
+
* ```ts
|
|
36
|
+
* const aggregator = new IncrementalTaskUsageAggregator(runsDir);
|
|
37
|
+
* const usage = await aggregator.getTaskUsage();
|
|
38
|
+
* // { "task-123": { totalTokens: 5000, runCount: 2 }, ... }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class IncrementalTaskUsageAggregator {
|
|
42
|
+
runsDir;
|
|
43
|
+
/** Current snapshot of each file's mtime + size. */
|
|
44
|
+
fileSnapshots = new Map();
|
|
45
|
+
/** Per-file contribution to the aggregation (for subtract-on-change). */
|
|
46
|
+
fileContributions = new Map();
|
|
47
|
+
/** Aggregated usage per task ID. */
|
|
48
|
+
taskUsage = new Map();
|
|
49
|
+
/** Whether the initial full scan has been completed. */
|
|
50
|
+
initialized = false;
|
|
51
|
+
constructor(runsDir) {
|
|
52
|
+
this.runsDir = runsDir;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get current per-task token usage, incrementally updating from filesystem.
|
|
56
|
+
*
|
|
57
|
+
* First call processes all files; subsequent calls only process changes.
|
|
58
|
+
* Returns a plain object keyed by task ID.
|
|
59
|
+
*/
|
|
60
|
+
async getTaskUsage() {
|
|
61
|
+
await this.refresh();
|
|
62
|
+
return Object.fromEntries(this.taskUsage);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Force a full rebuild on the next `getTaskUsage()` call.
|
|
66
|
+
* Useful for testing or when external state is known to have changed.
|
|
67
|
+
*/
|
|
68
|
+
reset() {
|
|
69
|
+
this.fileSnapshots.clear();
|
|
70
|
+
this.fileContributions.clear();
|
|
71
|
+
this.taskUsage.clear();
|
|
72
|
+
this.initialized = false;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Remove aggregation entries for task IDs not present in `validTaskIds`.
|
|
76
|
+
*
|
|
77
|
+
* Cleans up both the `taskUsage` accumulator and corresponding
|
|
78
|
+
* `fileContributions` entries. File snapshots are preserved so that
|
|
79
|
+
* the underlying run files are not re-processed on the next refresh
|
|
80
|
+
* (they are still on disk, just no longer contributing to results).
|
|
81
|
+
*
|
|
82
|
+
* Call this after `getTaskUsage()` — or let the route handler call it
|
|
83
|
+
* before returning results — to ensure the UI never sees usage data
|
|
84
|
+
* for tasks that have been deleted from the PRD.
|
|
85
|
+
*
|
|
86
|
+
* @returns The number of stale task IDs that were pruned.
|
|
87
|
+
*/
|
|
88
|
+
pruneStaleEntries(validTaskIds) {
|
|
89
|
+
// Identify stale task IDs
|
|
90
|
+
const staleIds = [];
|
|
91
|
+
for (const taskId of this.taskUsage.keys()) {
|
|
92
|
+
if (!validTaskIds.has(taskId)) {
|
|
93
|
+
staleIds.push(taskId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (staleIds.length === 0)
|
|
97
|
+
return 0;
|
|
98
|
+
const staleSet = new Set(staleIds);
|
|
99
|
+
// Remove from taskUsage
|
|
100
|
+
for (const taskId of staleIds) {
|
|
101
|
+
this.taskUsage.delete(taskId);
|
|
102
|
+
}
|
|
103
|
+
// Remove matching fileContributions (but keep fileSnapshots so
|
|
104
|
+
// the run files are not treated as "new" on the next refresh)
|
|
105
|
+
for (const [file, contribution] of this.fileContributions) {
|
|
106
|
+
if (staleSet.has(contribution.taskId)) {
|
|
107
|
+
this.fileContributions.delete(file);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return staleIds.length;
|
|
111
|
+
}
|
|
112
|
+
// ---- Core refresh logic --------------------------------------------------
|
|
113
|
+
async refresh() {
|
|
114
|
+
const currentFiles = await this.scanRunFiles();
|
|
115
|
+
// Categorize changes
|
|
116
|
+
const added = [];
|
|
117
|
+
const modified = [];
|
|
118
|
+
const deleted = [];
|
|
119
|
+
for (const [file, snapshot] of currentFiles) {
|
|
120
|
+
const prev = this.fileSnapshots.get(file);
|
|
121
|
+
if (!prev) {
|
|
122
|
+
added.push(file);
|
|
123
|
+
}
|
|
124
|
+
else if (prev.mtimeMs !== snapshot.mtimeMs || prev.size !== snapshot.size) {
|
|
125
|
+
modified.push(file);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const file of this.fileSnapshots.keys()) {
|
|
129
|
+
if (!currentFiles.has(file)) {
|
|
130
|
+
deleted.push(file);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Short-circuit: no changes after initial scan
|
|
134
|
+
if (this.initialized && added.length === 0 && modified.length === 0 && deleted.length === 0) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Process deletions: subtract old contributions
|
|
138
|
+
for (const file of deleted) {
|
|
139
|
+
this.subtractContribution(file);
|
|
140
|
+
this.fileSnapshots.delete(file);
|
|
141
|
+
}
|
|
142
|
+
// Process modifications: subtract old → re-read → add new
|
|
143
|
+
for (const file of modified) {
|
|
144
|
+
this.subtractContribution(file);
|
|
145
|
+
const contribution = await this.readFileContribution(file);
|
|
146
|
+
if (contribution) {
|
|
147
|
+
this.applyContribution(file, contribution);
|
|
148
|
+
}
|
|
149
|
+
this.fileSnapshots.set(file, currentFiles.get(file));
|
|
150
|
+
}
|
|
151
|
+
// Process additions: read and add
|
|
152
|
+
for (const file of added) {
|
|
153
|
+
const contribution = await this.readFileContribution(file);
|
|
154
|
+
if (contribution) {
|
|
155
|
+
this.applyContribution(file, contribution);
|
|
156
|
+
}
|
|
157
|
+
this.fileSnapshots.set(file, currentFiles.get(file));
|
|
158
|
+
}
|
|
159
|
+
this.initialized = true;
|
|
160
|
+
}
|
|
161
|
+
// ---- Contribution tracking -----------------------------------------------
|
|
162
|
+
/** Subtract a file's previously tracked contribution from the task total. */
|
|
163
|
+
subtractContribution(file) {
|
|
164
|
+
const contribution = this.fileContributions.get(file);
|
|
165
|
+
if (!contribution)
|
|
166
|
+
return;
|
|
167
|
+
const current = this.taskUsage.get(contribution.taskId);
|
|
168
|
+
if (current) {
|
|
169
|
+
current.totalTokens -= contribution.totalTokens;
|
|
170
|
+
current.runCount -= 1;
|
|
171
|
+
if (current.runCount <= 0) {
|
|
172
|
+
this.taskUsage.delete(contribution.taskId);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
this.fileContributions.delete(file);
|
|
176
|
+
}
|
|
177
|
+
/** Add a file's contribution to the task total. */
|
|
178
|
+
applyContribution(file, contribution) {
|
|
179
|
+
this.fileContributions.set(file, contribution);
|
|
180
|
+
const current = this.taskUsage.get(contribution.taskId) ?? { totalTokens: 0, runCount: 0 };
|
|
181
|
+
current.totalTokens += contribution.totalTokens;
|
|
182
|
+
current.runCount += 1;
|
|
183
|
+
this.taskUsage.set(contribution.taskId, current);
|
|
184
|
+
}
|
|
185
|
+
// ---- File I/O ------------------------------------------------------------
|
|
186
|
+
/**
|
|
187
|
+
* Read a single run file (plain JSON or gzip-compressed) and extract
|
|
188
|
+
* its task usage contribution.
|
|
189
|
+
* Returns null for files that cannot be read or lack a taskId.
|
|
190
|
+
*/
|
|
191
|
+
async readFileContribution(file) {
|
|
192
|
+
try {
|
|
193
|
+
let data;
|
|
194
|
+
if (file.endsWith(".gz")) {
|
|
195
|
+
const compressed = await readFile(join(this.runsDir, file));
|
|
196
|
+
const decompressed = gunzipSync(compressed);
|
|
197
|
+
data = JSON.parse(decompressed.toString("utf-8"));
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const raw = await readFile(join(this.runsDir, file), "utf-8");
|
|
201
|
+
data = JSON.parse(raw);
|
|
202
|
+
}
|
|
203
|
+
const taskId = data.taskId;
|
|
204
|
+
if (typeof taskId !== "string" || !taskId)
|
|
205
|
+
return null;
|
|
206
|
+
const tokenUsage = data.tokenUsage;
|
|
207
|
+
const totalTokens = (tokenUsage?.input ?? 0) +
|
|
208
|
+
(tokenUsage?.output ?? 0) +
|
|
209
|
+
(tokenUsage?.cacheCreationInput ?? 0) +
|
|
210
|
+
(tokenUsage?.cacheReadInput ?? 0);
|
|
211
|
+
return { taskId, totalTokens };
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Scan the runs directory and return a snapshot map of all run files
|
|
219
|
+
* (`.json` and `.json.gz`). Hidden files (prefixed with `.`) are
|
|
220
|
+
* excluded to avoid picking up checkpoint or metadata files.
|
|
221
|
+
*/
|
|
222
|
+
async scanRunFiles() {
|
|
223
|
+
const snapshots = new Map();
|
|
224
|
+
let files;
|
|
225
|
+
try {
|
|
226
|
+
files = await readdir(this.runsDir);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return snapshots;
|
|
230
|
+
}
|
|
231
|
+
const runFiles = files.filter((f) => (f.endsWith(".json") || f.endsWith(".json.gz")) && !f.startsWith("."));
|
|
232
|
+
// Stat files in parallel for performance
|
|
233
|
+
const entries = await Promise.all(runFiles.map(async (file) => {
|
|
234
|
+
try {
|
|
235
|
+
const st = await stat(join(this.runsDir, file));
|
|
236
|
+
return { file, snapshot: { mtimeMs: st.mtimeMs, size: st.size } };
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// File disappeared between readdir and stat — skip
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
}));
|
|
243
|
+
for (const entry of entries) {
|
|
244
|
+
if (entry) {
|
|
245
|
+
snapshots.set(entry.file, entry.snapshot);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return snapshots;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=incremental-task-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-task-usage.js","sourceRoot":"","sources":["../../src/server/incremental-task-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web server for the n-dx dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Serves the sourcevision viewer, provides REST API endpoints for
|
|
5
|
+
* Rex (PRD data), sourcevision (analysis data), and Hench (agent runs),
|
|
6
|
+
* and supports WebSocket connections for real-time updates.
|
|
7
|
+
*
|
|
8
|
+
* ## Route architecture
|
|
9
|
+
*
|
|
10
|
+
* ```
|
|
11
|
+
* Static assets → routes-static.ts
|
|
12
|
+
* /data/* → routes-data.ts (sourcevision data files, live-reload)
|
|
13
|
+
* /api/rex/* → routes-rex.ts (PRD CRUD, stats, next task, log)
|
|
14
|
+
* /api/sv/* → routes-sourcevision.ts (analysis data endpoints)
|
|
15
|
+
* /api/hench/* → routes-hench.ts (agent run history, run detail)
|
|
16
|
+
* /mcp/rex → routes-mcp.ts (Rex MCP over Streamable HTTP)
|
|
17
|
+
* /mcp/sourcevision→ routes-mcp.ts (Sourcevision MCP over Streamable HTTP)
|
|
18
|
+
* WebSocket → websocket.ts (upgrade handler, broadcast)
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* ## Coupling strategy
|
|
22
|
+
*
|
|
23
|
+
* REST/API routes access domain data through **filesystem reads** and
|
|
24
|
+
* **subprocess calls**. Rex domain types and constants are imported from
|
|
25
|
+
* the canonical source through the gateway (`domain-gateway.ts`), eliminating
|
|
26
|
+
* the previous duplication in `rex-domain.ts`.
|
|
27
|
+
*
|
|
28
|
+
* MCP server factories and rex domain constants are funnelled through
|
|
29
|
+
* `domain-gateway.ts` — a single gateway module that mirrors the pattern
|
|
30
|
+
* in `packages/hench/src/prd/rex-gateway.ts`.
|
|
31
|
+
*
|
|
32
|
+
* @see ./domain-gateway.ts — runtime import gateway (all cross-package imports)
|
|
33
|
+
*/
|
|
34
|
+
export { startServer, PORT_FILE } from "./start.js";
|
|
35
|
+
export type { ServerOptions, StartResult } from "./start.js";
|
|
36
|
+
export type { ServerContext, RouteHandler } from "./types.js";
|
|
37
|
+
export type { WebSocketBroadcaster } from "./websocket.js";
|
|
38
|
+
export { checkPort, checkPortWithRetry, findAvailablePort } from "./port.js";
|
|
39
|
+
export type { PortCheckResult, PortAllocationResult, PortRetryOptions } from "./port.js";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web server for the n-dx dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Serves the sourcevision viewer, provides REST API endpoints for
|
|
5
|
+
* Rex (PRD data), sourcevision (analysis data), and Hench (agent runs),
|
|
6
|
+
* and supports WebSocket connections for real-time updates.
|
|
7
|
+
*
|
|
8
|
+
* ## Route architecture
|
|
9
|
+
*
|
|
10
|
+
* ```
|
|
11
|
+
* Static assets → routes-static.ts
|
|
12
|
+
* /data/* → routes-data.ts (sourcevision data files, live-reload)
|
|
13
|
+
* /api/rex/* → routes-rex.ts (PRD CRUD, stats, next task, log)
|
|
14
|
+
* /api/sv/* → routes-sourcevision.ts (analysis data endpoints)
|
|
15
|
+
* /api/hench/* → routes-hench.ts (agent run history, run detail)
|
|
16
|
+
* /mcp/rex → routes-mcp.ts (Rex MCP over Streamable HTTP)
|
|
17
|
+
* /mcp/sourcevision→ routes-mcp.ts (Sourcevision MCP over Streamable HTTP)
|
|
18
|
+
* WebSocket → websocket.ts (upgrade handler, broadcast)
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* ## Coupling strategy
|
|
22
|
+
*
|
|
23
|
+
* REST/API routes access domain data through **filesystem reads** and
|
|
24
|
+
* **subprocess calls**. Rex domain types and constants are imported from
|
|
25
|
+
* the canonical source through the gateway (`domain-gateway.ts`), eliminating
|
|
26
|
+
* the previous duplication in `rex-domain.ts`.
|
|
27
|
+
*
|
|
28
|
+
* MCP server factories and rex domain constants are funnelled through
|
|
29
|
+
* `domain-gateway.ts` — a single gateway module that mirrors the pattern
|
|
30
|
+
* in `packages/hench/src/prd/rex-gateway.ts`.
|
|
31
|
+
*
|
|
32
|
+
* @see ./domain-gateway.ts — runtime import gateway (all cross-package imports)
|
|
33
|
+
*/
|
|
34
|
+
export { startServer, PORT_FILE } from "./start.js";
|
|
35
|
+
export { checkPort, checkPortWithRetry, findAvailablePort } from "./port.js";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port availability detection and dynamic allocation.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for checking whether a TCP port is available and
|
|
5
|
+
* finding the next available port within a configurable range.
|
|
6
|
+
*
|
|
7
|
+
* Used by the server startup code to gracefully fall back when the
|
|
8
|
+
* configured port (default 3117) is already occupied.
|
|
9
|
+
*/
|
|
10
|
+
/** Default port range for fallback allocation. */
|
|
11
|
+
export declare const DEFAULT_PORT = 3117;
|
|
12
|
+
export declare const PORT_RANGE_START = 3117;
|
|
13
|
+
export declare const PORT_RANGE_END = 3200;
|
|
14
|
+
export interface PortCheckResult {
|
|
15
|
+
/** Whether the requested port is available. */
|
|
16
|
+
available: boolean;
|
|
17
|
+
/** The port that was checked. */
|
|
18
|
+
port: number;
|
|
19
|
+
/** Error details if the port is unavailable (e.g. "EADDRINUSE", "EACCES"). */
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PortAllocationResult {
|
|
23
|
+
/** The port that is available and should be used. */
|
|
24
|
+
port: number;
|
|
25
|
+
/** Whether this is the originally requested port (true) or a fallback (false). */
|
|
26
|
+
isOriginal: boolean;
|
|
27
|
+
/** The originally requested port. */
|
|
28
|
+
requestedPort: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Options controlling the retry behaviour of {@link checkPortWithRetry}
|
|
32
|
+
* and the preferred-port phase of {@link findAvailablePort}.
|
|
33
|
+
*/
|
|
34
|
+
export interface PortRetryOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Maximum number of retries after the first failure.
|
|
37
|
+
* @default 5
|
|
38
|
+
*/
|
|
39
|
+
maxRetries?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Initial delay between retries in milliseconds.
|
|
42
|
+
* Subsequent delays grow by `backoffFactor` (exponential backoff).
|
|
43
|
+
* @default 100
|
|
44
|
+
*/
|
|
45
|
+
retryDelayMs?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Multiplier applied to the delay after each retry attempt.
|
|
48
|
+
* A value of `2` doubles the delay each time.
|
|
49
|
+
* @default 2
|
|
50
|
+
*/
|
|
51
|
+
backoffFactor?: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if a specific port is available for binding.
|
|
55
|
+
*
|
|
56
|
+
* Uses a two-phase approach:
|
|
57
|
+
* 1. Try to connect — if something is already listening, report unavailable.
|
|
58
|
+
* 2. If nothing is listening, try to bind — catches EACCES and other bind errors.
|
|
59
|
+
*
|
|
60
|
+
* This avoids SO_REUSEADDR false positives where a bind-only check might
|
|
61
|
+
* succeed even though the port is already occupied by another process.
|
|
62
|
+
*/
|
|
63
|
+
export declare function checkPort(port: number): Promise<PortCheckResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a port is available, retrying on transient failures.
|
|
66
|
+
*
|
|
67
|
+
* Wraps {@link checkPort} with a configurable retry loop to handle timing
|
|
68
|
+
* issues during process transitions. When a server has just been stopped, its
|
|
69
|
+
* port may remain in OS TIME_WAIT state for a short period and appear
|
|
70
|
+
* unavailable even though no process is actively listening. Retrying with
|
|
71
|
+
* exponential back-off gives the OS time to release the port without forcing
|
|
72
|
+
* the caller to fall back to a different port number.
|
|
73
|
+
*
|
|
74
|
+
* Retries are skipped immediately for non-transient errors such as `EACCES`
|
|
75
|
+
* (permission denied), since those require external intervention and will
|
|
76
|
+
* not resolve on their own.
|
|
77
|
+
*
|
|
78
|
+
* @param port TCP port number to check.
|
|
79
|
+
* @param opts Retry configuration. Defaults suit most startup scenarios.
|
|
80
|
+
*/
|
|
81
|
+
export declare function checkPortWithRetry(port: number, opts?: PortRetryOptions): Promise<PortCheckResult>;
|
|
82
|
+
/**
|
|
83
|
+
* Find the next available port in a range.
|
|
84
|
+
*
|
|
85
|
+
* Tries the `preferred` port first (with optional retries to handle transient
|
|
86
|
+
* unavailability during process transitions), then scans sequentially from
|
|
87
|
+
* `rangeStart` to `rangeEnd` (inclusive). Skips the preferred port during the
|
|
88
|
+
* scan since it was already tried.
|
|
89
|
+
*
|
|
90
|
+
* Pass `retryOpts` to give the preferred port several retry attempts before
|
|
91
|
+
* falling back to the range scan. This is useful when the preferred port was
|
|
92
|
+
* just released by a recently stopped server (TIME_WAIT state).
|
|
93
|
+
*
|
|
94
|
+
* @throws {Error} If no port is available in the entire range.
|
|
95
|
+
*/
|
|
96
|
+
export declare function findAvailablePort(preferred: number, rangeStart?: number, rangeEnd?: number, retryOpts?: PortRetryOptions): Promise<PortAllocationResult>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port availability detection and dynamic allocation.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for checking whether a TCP port is available and
|
|
5
|
+
* finding the next available port within a configurable range.
|
|
6
|
+
*
|
|
7
|
+
* Used by the server startup code to gracefully fall back when the
|
|
8
|
+
* configured port (default 3117) is already occupied.
|
|
9
|
+
*/
|
|
10
|
+
import { createServer, createConnection } from "node:net";
|
|
11
|
+
/** Default port range for fallback allocation. */
|
|
12
|
+
export const DEFAULT_PORT = 3117;
|
|
13
|
+
export const PORT_RANGE_START = 3117;
|
|
14
|
+
export const PORT_RANGE_END = 3200;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a specific port is available for binding.
|
|
17
|
+
*
|
|
18
|
+
* Uses a two-phase approach:
|
|
19
|
+
* 1. Try to connect — if something is already listening, report unavailable.
|
|
20
|
+
* 2. If nothing is listening, try to bind — catches EACCES and other bind errors.
|
|
21
|
+
*
|
|
22
|
+
* This avoids SO_REUSEADDR false positives where a bind-only check might
|
|
23
|
+
* succeed even though the port is already occupied by another process.
|
|
24
|
+
*/
|
|
25
|
+
export function checkPort(port) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
// Phase 1: try to connect — detects if a server is already listening
|
|
28
|
+
const sock = createConnection({ port, host: "127.0.0.1" });
|
|
29
|
+
sock.once("connect", () => {
|
|
30
|
+
sock.destroy();
|
|
31
|
+
resolve({ available: false, port, error: "EADDRINUSE" });
|
|
32
|
+
});
|
|
33
|
+
sock.once("error", (connErr) => {
|
|
34
|
+
sock.destroy();
|
|
35
|
+
if (connErr.code === "ECONNREFUSED") {
|
|
36
|
+
// Nothing listening — phase 2: try to bind to catch permission errors
|
|
37
|
+
const server = createServer();
|
|
38
|
+
server.once("error", (err) => {
|
|
39
|
+
resolve({ available: false, port, error: err.code ?? err.message });
|
|
40
|
+
});
|
|
41
|
+
server.listen(port, () => {
|
|
42
|
+
server.close(() => {
|
|
43
|
+
resolve({ available: true, port });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Other connection error (e.g., timeout) — treat as unavailable
|
|
49
|
+
resolve({ available: false, port, error: connErr.code ?? connErr.message });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a port is available, retrying on transient failures.
|
|
56
|
+
*
|
|
57
|
+
* Wraps {@link checkPort} with a configurable retry loop to handle timing
|
|
58
|
+
* issues during process transitions. When a server has just been stopped, its
|
|
59
|
+
* port may remain in OS TIME_WAIT state for a short period and appear
|
|
60
|
+
* unavailable even though no process is actively listening. Retrying with
|
|
61
|
+
* exponential back-off gives the OS time to release the port without forcing
|
|
62
|
+
* the caller to fall back to a different port number.
|
|
63
|
+
*
|
|
64
|
+
* Retries are skipped immediately for non-transient errors such as `EACCES`
|
|
65
|
+
* (permission denied), since those require external intervention and will
|
|
66
|
+
* not resolve on their own.
|
|
67
|
+
*
|
|
68
|
+
* @param port TCP port number to check.
|
|
69
|
+
* @param opts Retry configuration. Defaults suit most startup scenarios.
|
|
70
|
+
*/
|
|
71
|
+
export async function checkPortWithRetry(port, opts = {}) {
|
|
72
|
+
const maxRetries = opts.maxRetries ?? 5;
|
|
73
|
+
const initialDelayMs = opts.retryDelayMs ?? 100;
|
|
74
|
+
const backoffFactor = opts.backoffFactor ?? 2;
|
|
75
|
+
let result = await checkPort(port);
|
|
76
|
+
if (result.available)
|
|
77
|
+
return result;
|
|
78
|
+
// Permission errors won't resolve with retries — fail fast.
|
|
79
|
+
if (result.error === "EACCES")
|
|
80
|
+
return result;
|
|
81
|
+
let delay = initialDelayMs;
|
|
82
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
83
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
84
|
+
result = await checkPort(port);
|
|
85
|
+
if (result.available)
|
|
86
|
+
return result;
|
|
87
|
+
// Stop retrying if we hit a non-transient error.
|
|
88
|
+
if (result.error === "EACCES")
|
|
89
|
+
return result;
|
|
90
|
+
delay = Math.round(delay * backoffFactor);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Find the next available port in a range.
|
|
96
|
+
*
|
|
97
|
+
* Tries the `preferred` port first (with optional retries to handle transient
|
|
98
|
+
* unavailability during process transitions), then scans sequentially from
|
|
99
|
+
* `rangeStart` to `rangeEnd` (inclusive). Skips the preferred port during the
|
|
100
|
+
* scan since it was already tried.
|
|
101
|
+
*
|
|
102
|
+
* Pass `retryOpts` to give the preferred port several retry attempts before
|
|
103
|
+
* falling back to the range scan. This is useful when the preferred port was
|
|
104
|
+
* just released by a recently stopped server (TIME_WAIT state).
|
|
105
|
+
*
|
|
106
|
+
* @throws {Error} If no port is available in the entire range.
|
|
107
|
+
*/
|
|
108
|
+
export async function findAvailablePort(preferred, rangeStart = PORT_RANGE_START, rangeEnd = PORT_RANGE_END, retryOpts) {
|
|
109
|
+
// Try the preferred port first (with retries if opts provided)
|
|
110
|
+
const check = retryOpts !== undefined
|
|
111
|
+
? await checkPortWithRetry(preferred, retryOpts)
|
|
112
|
+
: await checkPort(preferred);
|
|
113
|
+
if (check.available) {
|
|
114
|
+
return { port: preferred, isOriginal: true, requestedPort: preferred };
|
|
115
|
+
}
|
|
116
|
+
// If the error is a permission issue, don't try other ports in the same range
|
|
117
|
+
// — the user likely needs elevated privileges
|
|
118
|
+
if (check.error === "EACCES") {
|
|
119
|
+
throw new Error(`Permission denied for port ${preferred}. ` +
|
|
120
|
+
`Try a port above 1024 or run with elevated privileges.`);
|
|
121
|
+
}
|
|
122
|
+
// Scan the range for an available port
|
|
123
|
+
for (let p = rangeStart; p <= rangeEnd; p++) {
|
|
124
|
+
if (p === preferred)
|
|
125
|
+
continue; // already tried
|
|
126
|
+
const result = await checkPort(p);
|
|
127
|
+
if (result.available) {
|
|
128
|
+
return { port: p, isOriginal: false, requestedPort: preferred };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`No available port found in range ${rangeStart}–${rangeEnd}. ` +
|
|
132
|
+
`All ports are in use.`);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/server/port.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE1D,kDAAkD;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AA4CnC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,qEAAqE;QACrE,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAA8B,EAAE,EAAE;YACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACpC,sEAAsE;gBACtE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;oBAClD,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;oBACvB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;wBAChB,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,gEAAgE;gBAChE,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,OAAyB,EAAE;IAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;IAE9C,IAAI,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IAEpC,4DAA4D;IAC5D,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAE7C,IAAI,KAAK,GAAG,cAAc,CAAC;IAC3B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACrD,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,MAAM,CAAC;QACpC,iDAAiD;QACjD,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC7C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,aAAqB,gBAAgB,EACrC,WAAmB,cAAc,EACjC,SAA4B;IAE5B,+DAA+D;IAC/D,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS;QACnC,CAAC,CAAC,MAAM,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC;QAChD,CAAC,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAE/B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IACzE,CAAC;IAED,8EAA8E;IAC9E,8CAA8C;IAC9C,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,8BAA8B,SAAS,IAAI;YAC3C,wDAAwD,CACzD,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS,CAAC,gBAAgB;QAE/C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,oCAAoC,UAAU,IAAI,QAAQ,IAAI;QAC9D,uBAAuB,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type PRMarkdownRefreshDiagnosticCode = "missing_git" | "not_repo" | "unresolved_main_or_origin_main" | "auth_fetch_denied" | "network_dns_error" | "fetch_failed" | "rev_parse_failed" | "diff_failed";
|
|
2
|
+
export type PRMarkdownRefreshPreflightFailureCode = "NOT_A_REPO" | "MISSING_BASE_REF" | "FETCH_DENIED" | "NETWORK_DNS_ERROR" | "DETACHED_HEAD" | "SHALLOW_CLONE";
|
|
3
|
+
export type PRMarkdownRefreshFailureCode = PRMarkdownRefreshDiagnosticCode | PRMarkdownRefreshPreflightFailureCode;
|
|
4
|
+
export type PRMarkdownRefreshFailureStage = "preflight" | "fetch" | "rev-parse" | "diff" | "semantic-diff" | "mixed";
|
|
5
|
+
export type PRMarkdownRefreshDiffStageStatus = "succeeded" | "failed" | "not_run";
|
|
6
|
+
export type PRMarkdownRefreshGuidanceCategory = "environment_fix" | "fetch_retry" | "local_history_remediation";
|
|
7
|
+
export type PRMarkdownRefreshGitSubcommand = "version" | "rev-parse" | "fetch" | "diff";
|
|
8
|
+
export type PRMarkdownRefreshFailureCommandStageId = "preflight" | "fetch" | "rev_parse" | "name_status_diff" | "semantic_diff_numstat";
|
|
9
|
+
export interface PRMarkdownRefreshFailureCommandExecution {
|
|
10
|
+
stderr?: string;
|
|
11
|
+
exitCode?: number | null;
|
|
12
|
+
}
|
|
13
|
+
export interface PRMarkdownRefreshGuidance {
|
|
14
|
+
category: PRMarkdownRefreshGuidanceCategory;
|
|
15
|
+
summary: string;
|
|
16
|
+
commands: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface PRMarkdownRefreshFailure {
|
|
19
|
+
type: "pr_markdown_refresh_failure";
|
|
20
|
+
code: PRMarkdownRefreshFailureCode;
|
|
21
|
+
stage: PRMarkdownRefreshFailureStage;
|
|
22
|
+
stageStatuses?: {
|
|
23
|
+
nameStatusDiff: PRMarkdownRefreshDiffStageStatus;
|
|
24
|
+
semanticDiff: PRMarkdownRefreshDiffStageStatus;
|
|
25
|
+
};
|
|
26
|
+
summary: string;
|
|
27
|
+
remediationCommands: string[];
|
|
28
|
+
guidanceCategory: PRMarkdownRefreshGuidanceCategory;
|
|
29
|
+
commandSuggestions: string[];
|
|
30
|
+
command: {
|
|
31
|
+
gitSubcommand: PRMarkdownRefreshGitSubcommand;
|
|
32
|
+
subcommand?: string;
|
|
33
|
+
stageId?: PRMarkdownRefreshFailureCommandStageId;
|
|
34
|
+
stderr?: string;
|
|
35
|
+
exitCode?: number | null;
|
|
36
|
+
stderrExcerpt: string;
|
|
37
|
+
reproduce: string[];
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare const GIT_CREDENTIAL_HELPER_COMMAND = "sourcevision git-credential-helper";
|
|
41
|
+
interface PRMarkdownRefreshPreflightErrorContract {
|
|
42
|
+
code: PRMarkdownRefreshPreflightFailureCode;
|
|
43
|
+
summary: string;
|
|
44
|
+
remediationCommands: string[];
|
|
45
|
+
}
|
|
46
|
+
export declare function classifyPRMarkdownRefreshFailureCode(input: unknown): PRMarkdownRefreshDiagnosticCode | null;
|
|
47
|
+
export declare function classifyPRMarkdownRefreshPreflightCode(input: unknown, diagnosticCode?: PRMarkdownRefreshDiagnosticCode | null): PRMarkdownRefreshPreflightFailureCode | null;
|
|
48
|
+
export declare function resolvePRMarkdownRefreshPreflightErrorContract(input: unknown, diagnosticCode?: PRMarkdownRefreshDiagnosticCode | null): PRMarkdownRefreshPreflightErrorContract | null;
|
|
49
|
+
export declare function validatePRMarkdownRefreshPreflightErrorContract(input: unknown): boolean;
|
|
50
|
+
export declare function shouldUsePRMarkdownFallbackForCode(code: PRMarkdownRefreshDiagnosticCode): boolean;
|
|
51
|
+
export declare function shouldUsePRMarkdownFallback(input: unknown): boolean;
|
|
52
|
+
export declare function getPRMarkdownRefreshRemediationHints(code: PRMarkdownRefreshDiagnosticCode): string[];
|
|
53
|
+
export declare function resolvePRMarkdownRefreshGuidance(code: PRMarkdownRefreshDiagnosticCode): PRMarkdownRefreshGuidance;
|
|
54
|
+
export declare function buildPRMarkdownRefreshFailure(code: PRMarkdownRefreshDiagnosticCode, details: string, options: {
|
|
55
|
+
semanticDiffInspection: boolean;
|
|
56
|
+
nameStatusDiffSucceeded: boolean;
|
|
57
|
+
commandExecution?: PRMarkdownRefreshFailureCommandExecution;
|
|
58
|
+
}): PRMarkdownRefreshFailure;
|
|
59
|
+
export {};
|