@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,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD CRUD action hooks — item update, add, delete, merge, and prune.
|
|
3
|
+
*
|
|
4
|
+
* Composes focused sub-hooks for selection and deletion, adding
|
|
5
|
+
* mutation handlers (update, add, execute) and detail panel sync.
|
|
6
|
+
*
|
|
7
|
+
* Each handler follows the optimistic update pattern:
|
|
8
|
+
*
|
|
9
|
+
* 1. Apply the change locally for instant UI feedback
|
|
10
|
+
* 2. Send the request to the server
|
|
11
|
+
* 3. Reconcile with authoritative server state
|
|
12
|
+
* 4. On failure, revert by re-fetching from server
|
|
13
|
+
*
|
|
14
|
+
* @see ./use-item-selection.ts — selection, bulk select, navigation
|
|
15
|
+
* @see ./use-delete-actions.ts — optimistic delete, modal, detail panel remove
|
|
16
|
+
* @see ../components/prd-tree/tree-differ.ts — applyItemUpdate (structural sharing)
|
|
17
|
+
*/
|
|
18
|
+
import { useState, useCallback } from "preact/hooks";
|
|
19
|
+
import { h } from "preact";
|
|
20
|
+
import { TaskDetail } from "../components/prd-tree/task-detail.js";
|
|
21
|
+
import { findItemById } from "../components/prd-tree/tree-utils.js";
|
|
22
|
+
import { applyItemUpdate } from "../components/prd-tree/tree-differ.js";
|
|
23
|
+
import { useItemSelection } from "./use-item-selection.js";
|
|
24
|
+
import { useDeleteActions } from "./use-delete-actions.js";
|
|
25
|
+
/**
|
|
26
|
+
* Hook providing all PRD CRUD action handlers and related UI state.
|
|
27
|
+
*
|
|
28
|
+
* Composes {@link useItemSelection} for selection/navigation and
|
|
29
|
+
* {@link useDeleteActions} for optimistic deletion, then adds
|
|
30
|
+
* mutation handlers and detail panel synchronization.
|
|
31
|
+
*/
|
|
32
|
+
export function usePRDActions({ data, setData, fetchPRDData, fetchTaskUsage, showToast, onSelectItem, onDetailContent, taskUsageById, weeklyBudget, showTokenBudget, navigateTo, }) {
|
|
33
|
+
const [activeTab, setActiveTab] = useState(null);
|
|
34
|
+
const [addParentId, setAddParentId] = useState(null);
|
|
35
|
+
// ── Selection (delegated to sub-hook) ─────────────────────────────
|
|
36
|
+
const { selectedItemId, setSelectedItemId, bulkSelectedIds, setBulkSelectedIds, selectedItems, handleSelectItem, handleBulkSelect, clearBulkSelection, handleNavigateToItem, } = useItemSelection({ data, onSelectItem });
|
|
37
|
+
// ── Deletion (delegated to sub-hook) ──────────────────────────────
|
|
38
|
+
const { deleteTarget, setDeleteTarget, deletingItemId, handleRemoveItemFromTree, handleConfirmDelete, handleRemoveFromDetail, } = useDeleteActions({
|
|
39
|
+
data,
|
|
40
|
+
setData,
|
|
41
|
+
fetchPRDData,
|
|
42
|
+
fetchTaskUsage,
|
|
43
|
+
showToast,
|
|
44
|
+
selectedItemId,
|
|
45
|
+
setSelectedItemId,
|
|
46
|
+
setBulkSelectedIds,
|
|
47
|
+
onDetailContent,
|
|
48
|
+
});
|
|
49
|
+
// ── Item update (optimistic + reconcile) ─────────────────────────
|
|
50
|
+
const handleItemUpdate = useCallback(async (id, updates) => {
|
|
51
|
+
setData((prev) => {
|
|
52
|
+
if (!prev)
|
|
53
|
+
return prev;
|
|
54
|
+
const newItems = applyItemUpdate(prev.items, id, updates);
|
|
55
|
+
return newItems === prev.items ? prev : { ...prev, items: newItems };
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
const res = await fetch(`/api/rex/items/${id}`, {
|
|
59
|
+
method: "PATCH",
|
|
60
|
+
headers: { "Content-Type": "application/json" },
|
|
61
|
+
body: JSON.stringify(updates),
|
|
62
|
+
});
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
console.error("Failed to update item:", await res.text());
|
|
65
|
+
await fetchPRDData();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
await fetchPRDData();
|
|
69
|
+
await fetchTaskUsage();
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error("Failed to update item:", err);
|
|
73
|
+
await fetchPRDData();
|
|
74
|
+
}
|
|
75
|
+
}, [setData, fetchPRDData, fetchTaskUsage]);
|
|
76
|
+
// ── Add child (from detail panel) ────────────────────────────────
|
|
77
|
+
const handleAddChild = useCallback(async (input) => {
|
|
78
|
+
const res = await fetch("/api/rex/items", {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: { "Content-Type": "application/json" },
|
|
81
|
+
body: JSON.stringify(input),
|
|
82
|
+
});
|
|
83
|
+
if (!res.ok) {
|
|
84
|
+
const errBody = await res.json().catch(() => ({ error: "Failed to add item" }));
|
|
85
|
+
throw new Error(errBody.error || `HTTP ${res.status}`);
|
|
86
|
+
}
|
|
87
|
+
const result = await res.json();
|
|
88
|
+
showToast(`Created ${result.level}: ${result.title}`);
|
|
89
|
+
await fetchPRDData();
|
|
90
|
+
await fetchTaskUsage();
|
|
91
|
+
}, [fetchPRDData, fetchTaskUsage, showToast]);
|
|
92
|
+
// ── Execute task ─────────────────────────────────────────────────
|
|
93
|
+
const handleExecuteTask = useCallback(async (taskId) => {
|
|
94
|
+
const res = await fetch("/api/hench/execute", {
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: { "Content-Type": "application/json" },
|
|
97
|
+
body: JSON.stringify({ taskId }),
|
|
98
|
+
});
|
|
99
|
+
const body = await res.json();
|
|
100
|
+
if (!res.ok) {
|
|
101
|
+
throw new Error(body.error || `HTTP ${res.status}`);
|
|
102
|
+
}
|
|
103
|
+
showToast(`Hench execution started for task`);
|
|
104
|
+
}, [showToast]);
|
|
105
|
+
// ── Add item (command bar form) ──────────────────────────────────
|
|
106
|
+
const handleAddItem = useCallback(async (input) => {
|
|
107
|
+
const res = await fetch("/api/rex/items", {
|
|
108
|
+
method: "POST",
|
|
109
|
+
headers: { "Content-Type": "application/json" },
|
|
110
|
+
body: JSON.stringify(input),
|
|
111
|
+
});
|
|
112
|
+
if (!res.ok) {
|
|
113
|
+
const errBody = await res.json().catch(() => ({ error: "Failed to add item" }));
|
|
114
|
+
throw new Error(errBody.error || `HTTP ${res.status}`);
|
|
115
|
+
}
|
|
116
|
+
const result = await res.json();
|
|
117
|
+
showToast(`Created ${result.level}: ${result.title}`);
|
|
118
|
+
setActiveTab(null);
|
|
119
|
+
setAddParentId(null);
|
|
120
|
+
await fetchPRDData();
|
|
121
|
+
await fetchTaskUsage();
|
|
122
|
+
}, [fetchPRDData, fetchTaskUsage, showToast]);
|
|
123
|
+
// ── Inline add item (tree node form) ─────────────────────────────
|
|
124
|
+
const handleInlineAddItem = useCallback(async (input) => {
|
|
125
|
+
const res = await fetch("/api/rex/items", {
|
|
126
|
+
method: "POST",
|
|
127
|
+
headers: { "Content-Type": "application/json" },
|
|
128
|
+
body: JSON.stringify(input),
|
|
129
|
+
});
|
|
130
|
+
if (!res.ok) {
|
|
131
|
+
const errBody = await res.json().catch(() => ({ error: "Failed to add item" }));
|
|
132
|
+
throw new Error(errBody.error || `HTTP ${res.status}`);
|
|
133
|
+
}
|
|
134
|
+
const result = await res.json();
|
|
135
|
+
showToast(`Created ${result.level}: ${result.title}`);
|
|
136
|
+
await fetchPRDData();
|
|
137
|
+
await fetchTaskUsage();
|
|
138
|
+
}, [fetchPRDData, fetchTaskUsage, showToast]);
|
|
139
|
+
// ── Merge/prune completion ───────────────────────────────────────
|
|
140
|
+
const handleMergeComplete = useCallback(() => {
|
|
141
|
+
setActiveTab(null);
|
|
142
|
+
setBulkSelectedIds(new Set());
|
|
143
|
+
showToast("Items merged successfully");
|
|
144
|
+
fetchPRDData();
|
|
145
|
+
fetchTaskUsage();
|
|
146
|
+
}, [setBulkSelectedIds, fetchPRDData, fetchTaskUsage, showToast]);
|
|
147
|
+
const handlePruneComplete = useCallback(() => {
|
|
148
|
+
setActiveTab(null);
|
|
149
|
+
showToast("Completed items pruned and archived");
|
|
150
|
+
fetchPRDData();
|
|
151
|
+
fetchTaskUsage();
|
|
152
|
+
}, [fetchPRDData, fetchTaskUsage, showToast]);
|
|
153
|
+
const handleOpenMerge = useCallback(() => {
|
|
154
|
+
setActiveTab("merge");
|
|
155
|
+
}, []);
|
|
156
|
+
// ── Detail panel sync ────────────────────────────────────────────
|
|
157
|
+
// This is called as a side effect to keep the detail panel in sync
|
|
158
|
+
// with the current selection and data state.
|
|
159
|
+
const syncDetailContent = useCallback(() => {
|
|
160
|
+
if (!data || !selectedItemId || !onDetailContent) {
|
|
161
|
+
if (onDetailContent)
|
|
162
|
+
onDetailContent(null);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const item = findItemById(data.items, selectedItemId);
|
|
166
|
+
if (!item) {
|
|
167
|
+
onDetailContent(null);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// Keep the detail header in sync with the current item title
|
|
171
|
+
if (onSelectItem) {
|
|
172
|
+
onSelectItem({
|
|
173
|
+
type: "prd",
|
|
174
|
+
title: item.title,
|
|
175
|
+
id: item.id,
|
|
176
|
+
level: item.level,
|
|
177
|
+
status: item.status,
|
|
178
|
+
description: item.description,
|
|
179
|
+
acceptanceCriteria: item.acceptanceCriteria,
|
|
180
|
+
priority: item.priority,
|
|
181
|
+
tags: item.tags,
|
|
182
|
+
blockedBy: item.blockedBy,
|
|
183
|
+
startedAt: item.startedAt,
|
|
184
|
+
completedAt: item.completedAt,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
onDetailContent(h(TaskDetail, {
|
|
188
|
+
item,
|
|
189
|
+
taskUsage: taskUsageById[item.id],
|
|
190
|
+
weeklyBudget,
|
|
191
|
+
showTokenBudget: showTokenBudget ?? false,
|
|
192
|
+
allItems: data.items,
|
|
193
|
+
onUpdate: handleItemUpdate,
|
|
194
|
+
onNavigateToItem: handleNavigateToItem,
|
|
195
|
+
onExecuteTask: handleExecuteTask,
|
|
196
|
+
onPrdChanged: () => {
|
|
197
|
+
fetchPRDData();
|
|
198
|
+
fetchTaskUsage();
|
|
199
|
+
},
|
|
200
|
+
onAddChild: handleAddChild,
|
|
201
|
+
onRemove: handleRemoveFromDetail,
|
|
202
|
+
navigateTo,
|
|
203
|
+
}));
|
|
204
|
+
}, [
|
|
205
|
+
data,
|
|
206
|
+
selectedItemId,
|
|
207
|
+
taskUsageById,
|
|
208
|
+
weeklyBudget,
|
|
209
|
+
showTokenBudget,
|
|
210
|
+
onSelectItem,
|
|
211
|
+
onDetailContent,
|
|
212
|
+
handleItemUpdate,
|
|
213
|
+
handleNavigateToItem,
|
|
214
|
+
handleExecuteTask,
|
|
215
|
+
fetchPRDData,
|
|
216
|
+
fetchTaskUsage,
|
|
217
|
+
handleAddChild,
|
|
218
|
+
handleRemoveFromDetail,
|
|
219
|
+
navigateTo,
|
|
220
|
+
]);
|
|
221
|
+
return {
|
|
222
|
+
selectedItemId,
|
|
223
|
+
activeTab,
|
|
224
|
+
setActiveTab,
|
|
225
|
+
addParentId,
|
|
226
|
+
setAddParentId,
|
|
227
|
+
bulkSelectedIds,
|
|
228
|
+
selectedItems,
|
|
229
|
+
deleteTarget,
|
|
230
|
+
setDeleteTarget,
|
|
231
|
+
deletingItemId,
|
|
232
|
+
handleItemUpdate,
|
|
233
|
+
handleSelectItem,
|
|
234
|
+
handleBulkSelect,
|
|
235
|
+
clearBulkSelection,
|
|
236
|
+
handleNavigateToItem,
|
|
237
|
+
handleAddChild,
|
|
238
|
+
handleExecuteTask,
|
|
239
|
+
handleAddItem,
|
|
240
|
+
handleInlineAddItem,
|
|
241
|
+
handleRemoveItemFromTree,
|
|
242
|
+
handleConfirmDelete,
|
|
243
|
+
handleRemoveFromDetail,
|
|
244
|
+
handleMergeComplete,
|
|
245
|
+
handlePruneComplete,
|
|
246
|
+
handleOpenMerge,
|
|
247
|
+
syncDetailContent,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=use-prd-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-prd-actions.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD data fetching hook with structural sharing, dedup, and rate limiting.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates all PRD + task-usage data fetching logic extracted from
|
|
5
|
+
* PRDView. Manages:
|
|
6
|
+
*
|
|
7
|
+
* - PRD document state (data, loading, error)
|
|
8
|
+
* - Task usage and weekly budget state
|
|
9
|
+
* - Request deduplication (concurrent callers share one in-flight request)
|
|
10
|
+
* - Rate limiting (max 2 requests/sec per endpoint)
|
|
11
|
+
* - Structural sharing via diffDocument (unchanged items keep references)
|
|
12
|
+
* - Visibility-aware polling for task usage
|
|
13
|
+
* - Cleanup of rate limiter timers on unmount
|
|
14
|
+
*
|
|
15
|
+
* @see ../components/prd-tree/tree-differ.ts — structural sharing implementation
|
|
16
|
+
* @see ../messaging/fetch-pipeline.ts — composed dedup + rate limiting
|
|
17
|
+
*/
|
|
18
|
+
import type { PRDDocumentData } from "../components/prd-tree/types.js";
|
|
19
|
+
import type { TaskUsageSummary, WeeklyBudgetResolution } from "../components/prd-tree/types.js";
|
|
20
|
+
export interface PRDDataState {
|
|
21
|
+
/** Current PRD document, or null if not yet loaded. */
|
|
22
|
+
data: PRDDocumentData | null;
|
|
23
|
+
/** Setter for optimistic updates from WebSocket/actions. */
|
|
24
|
+
setData: (updater: PRDDocumentData | null | ((prev: PRDDocumentData | null) => PRDDocumentData | null)) => void;
|
|
25
|
+
/** True while the initial fetch is in flight. */
|
|
26
|
+
loading: boolean;
|
|
27
|
+
/** Error message, or null. */
|
|
28
|
+
error: string | null;
|
|
29
|
+
/** Setter for error state (used by WebSocket pipeline). */
|
|
30
|
+
setError: (error: string | null) => void;
|
|
31
|
+
/** Per-task usage summaries keyed by task ID. */
|
|
32
|
+
taskUsageById: Record<string, TaskUsageSummary>;
|
|
33
|
+
/** Resolved weekly budget (for utilization calculations). */
|
|
34
|
+
weeklyBudget: WeeklyBudgetResolution | null;
|
|
35
|
+
/** Fetch/reconcile PRD data from server. Rate-limited and deduped. */
|
|
36
|
+
fetchPRDData: () => Promise<void>;
|
|
37
|
+
/** Fetch/reconcile task usage data from server. Rate-limited and deduped. */
|
|
38
|
+
fetchTaskUsage: () => Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hook managing all PRD data loading, polling, and state.
|
|
42
|
+
*
|
|
43
|
+
* @param prdData - Optional pre-loaded PRD data (skips initial fetch).
|
|
44
|
+
*/
|
|
45
|
+
export declare function usePRDData(prdData?: PRDDocumentData | null): PRDDataState;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD data fetching hook with structural sharing, dedup, and rate limiting.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates all PRD + task-usage data fetching logic extracted from
|
|
5
|
+
* PRDView. Manages:
|
|
6
|
+
*
|
|
7
|
+
* - PRD document state (data, loading, error)
|
|
8
|
+
* - Task usage and weekly budget state
|
|
9
|
+
* - Request deduplication (concurrent callers share one in-flight request)
|
|
10
|
+
* - Rate limiting (max 2 requests/sec per endpoint)
|
|
11
|
+
* - Structural sharing via diffDocument (unchanged items keep references)
|
|
12
|
+
* - Visibility-aware polling for task usage
|
|
13
|
+
* - Cleanup of rate limiter timers on unmount
|
|
14
|
+
*
|
|
15
|
+
* @see ../components/prd-tree/tree-differ.ts — structural sharing implementation
|
|
16
|
+
* @see ../messaging/fetch-pipeline.ts — composed dedup + rate limiting
|
|
17
|
+
*/
|
|
18
|
+
import { useState, useEffect, useCallback, useRef } from "preact/hooks";
|
|
19
|
+
import { resolveTaskUtilization } from "../components/prd-tree/task-utilization.js";
|
|
20
|
+
import { diffDocument } from "../components/prd-tree/tree-differ.js";
|
|
21
|
+
import { usePolling } from "./use-polling.js";
|
|
22
|
+
import { createFetchPipeline } from "../messaging/index.js";
|
|
23
|
+
function normalizeWeeklyBudgetResolution(value) {
|
|
24
|
+
const source = value?.source;
|
|
25
|
+
const budget = value?.budget;
|
|
26
|
+
return {
|
|
27
|
+
budget: typeof budget === "number" && Number.isFinite(budget) ? budget : null,
|
|
28
|
+
source: source ?? "missing_budget",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Convert server-side incremental task usage into client-side summaries
|
|
33
|
+
* with utilization metadata applied.
|
|
34
|
+
*/
|
|
35
|
+
function applyUtilizationToTaskUsage(serverUsage, weeklyBudget) {
|
|
36
|
+
const byTask = {};
|
|
37
|
+
for (const [taskId, usage] of Object.entries(serverUsage)) {
|
|
38
|
+
byTask[taskId] = {
|
|
39
|
+
totalTokens: usage.totalTokens,
|
|
40
|
+
runCount: usage.runCount,
|
|
41
|
+
utilization: resolveTaskUtilization(usage.totalTokens, weeklyBudget),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return byTask;
|
|
45
|
+
}
|
|
46
|
+
function applyWeeklyBudget(taskUsageById, weeklyBudget) {
|
|
47
|
+
const next = {};
|
|
48
|
+
for (const [taskId, summary] of Object.entries(taskUsageById)) {
|
|
49
|
+
next[taskId] = {
|
|
50
|
+
...summary,
|
|
51
|
+
utilization: resolveTaskUtilization(summary.totalTokens, weeklyBudget),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return next;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hook managing all PRD data loading, polling, and state.
|
|
58
|
+
*
|
|
59
|
+
* @param prdData - Optional pre-loaded PRD data (skips initial fetch).
|
|
60
|
+
*/
|
|
61
|
+
export function usePRDData(prdData) {
|
|
62
|
+
const [data, setData] = useState(prdData ?? null);
|
|
63
|
+
const [loading, setLoading] = useState(!prdData);
|
|
64
|
+
const [error, setError] = useState(null);
|
|
65
|
+
const [taskUsageById, setTaskUsageById] = useState({});
|
|
66
|
+
const [weeklyBudget, setWeeklyBudget] = useState(null);
|
|
67
|
+
/** Mutable ref so the dedup-wrapped fetchTaskUsage always reads the latest budget. */
|
|
68
|
+
const weeklyBudgetRef = useRef(weeklyBudget);
|
|
69
|
+
weeklyBudgetRef.current = weeklyBudget;
|
|
70
|
+
// ── PRD data fetching (dedup + rate-limited) ─────────────────────
|
|
71
|
+
const prdPipeline = useRef(createFetchPipeline(async () => {
|
|
72
|
+
try {
|
|
73
|
+
const res = await fetch("/data/prd.json");
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
if (res.status === 404) {
|
|
76
|
+
setError("No PRD data found. Run 'rex init' then 'rex analyze' to create one.");
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
setError(`Failed to load PRD data (${res.status})`);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const json = await res.json();
|
|
84
|
+
setData((prev) => diffDocument(prev, json));
|
|
85
|
+
setError(null);
|
|
86
|
+
}
|
|
87
|
+
catch (_err) {
|
|
88
|
+
setError("Could not fetch PRD data. Is the server running?");
|
|
89
|
+
}
|
|
90
|
+
}, { minIntervalMs: 500 }));
|
|
91
|
+
const fetchPRDData = useCallback(async () => {
|
|
92
|
+
await prdPipeline.current.execute();
|
|
93
|
+
}, []);
|
|
94
|
+
// ── Task usage fetching (dedup + rate-limited) ─────────────────
|
|
95
|
+
const usagePipeline = useRef(createFetchPipeline(async () => {
|
|
96
|
+
const [taskUsageResult, utilizationResult] = await Promise.allSettled([
|
|
97
|
+
fetch("/api/hench/task-usage"),
|
|
98
|
+
fetch("/api/token/utilization"),
|
|
99
|
+
]);
|
|
100
|
+
let resolvedWeeklyBudget = weeklyBudgetRef.current;
|
|
101
|
+
if (utilizationResult.status === "fulfilled" && utilizationResult.value.ok) {
|
|
102
|
+
try {
|
|
103
|
+
const json = await utilizationResult.value.json();
|
|
104
|
+
resolvedWeeklyBudget = normalizeWeeklyBudgetResolution(json.weeklyBudget);
|
|
105
|
+
setWeeklyBudget(resolvedWeeklyBudget);
|
|
106
|
+
setTaskUsageById((prev) => applyWeeklyBudget(prev, resolvedWeeklyBudget));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Keep prior budget state on parse errors.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (taskUsageResult.status === "fulfilled" && taskUsageResult.value.ok) {
|
|
113
|
+
try {
|
|
114
|
+
const json = await taskUsageResult.value.json();
|
|
115
|
+
setTaskUsageById(applyUtilizationToTaskUsage(json.taskUsage ?? {}, resolvedWeeklyBudget));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Keep existing values on parse errors.
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}, { minIntervalMs: 500 }));
|
|
122
|
+
const fetchTaskUsage = useCallback(async () => {
|
|
123
|
+
await usagePipeline.current.execute();
|
|
124
|
+
}, []);
|
|
125
|
+
// ── Initial fetch ────────────────────────────────────────────────
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
if (prdData) {
|
|
128
|
+
setData(prdData);
|
|
129
|
+
setLoading(false);
|
|
130
|
+
fetchTaskUsage();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
fetchPRDData().then(() => setLoading(false));
|
|
134
|
+
fetchTaskUsage();
|
|
135
|
+
}, [prdData, fetchPRDData, fetchTaskUsage]);
|
|
136
|
+
// ── Visibility-aware polling ─────────────────────────────────────
|
|
137
|
+
usePolling("prd:task-usage", fetchTaskUsage, 10_000);
|
|
138
|
+
// ── Cleanup ──────────────────────────────────────────────────────
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
const prd = prdPipeline.current;
|
|
141
|
+
const usage = usagePipeline.current;
|
|
142
|
+
return () => {
|
|
143
|
+
prd.dispose();
|
|
144
|
+
usage.dispose();
|
|
145
|
+
};
|
|
146
|
+
}, []);
|
|
147
|
+
return {
|
|
148
|
+
data,
|
|
149
|
+
setData,
|
|
150
|
+
loading,
|
|
151
|
+
error,
|
|
152
|
+
setError,
|
|
153
|
+
taskUsageById,
|
|
154
|
+
weeklyBudget,
|
|
155
|
+
fetchPRDData,
|
|
156
|
+
fetchTaskUsage,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=use-prd-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-prd-data.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD deep-link resolution hook.
|
|
3
|
+
*
|
|
4
|
+
* Handles auto-selection and highlighting of a specific task when the
|
|
5
|
+
* view loads with an initialTaskId (from a shareable URL like /prd/:id).
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - Finds the target item in the tree once data is loaded
|
|
9
|
+
* - Expands ancestor nodes so the target is visible
|
|
10
|
+
* - Selects and highlights the target with a timed animation
|
|
11
|
+
* - Shows an error banner if the task ID is not found
|
|
12
|
+
* - Cleans up the URL on error (reverts to /prd)
|
|
13
|
+
*
|
|
14
|
+
* Extracted from PRDView to isolate deep-link side effects from the
|
|
15
|
+
* component's render and CRUD logic.
|
|
16
|
+
*/
|
|
17
|
+
import type { PRDDocumentData, PRDItemData } from "../components/prd-tree/types.js";
|
|
18
|
+
export interface PRDDeepLinkDeps {
|
|
19
|
+
/** Task ID from the URL, or null if no deep link. */
|
|
20
|
+
initialTaskId?: string | null;
|
|
21
|
+
/** True while the initial data fetch is in flight. */
|
|
22
|
+
loading: boolean;
|
|
23
|
+
/** Current PRD document data. */
|
|
24
|
+
data: PRDDocumentData | null;
|
|
25
|
+
/** Callback to select/open a PRD item. */
|
|
26
|
+
onSelectItem: (item: PRDItemData) => void;
|
|
27
|
+
}
|
|
28
|
+
export interface PRDDeepLinkState {
|
|
29
|
+
/** Error message when the deep-linked task is not found. */
|
|
30
|
+
deepLinkError: string | null;
|
|
31
|
+
/** Dismiss the deep-link error banner. */
|
|
32
|
+
setDeepLinkError: (error: string | null) => void;
|
|
33
|
+
/** Task ID currently highlighted by the deep-link animation. */
|
|
34
|
+
highlightedTaskId: string | null;
|
|
35
|
+
/** IDs to force-expand in the tree (ancestors of the deep-linked task). */
|
|
36
|
+
deepLinkExpandIds: Set<string> | null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Hook that resolves deep-link navigation for PRD tasks.
|
|
40
|
+
*
|
|
41
|
+
* Consumes the initialTaskId exactly once after data loads. If the
|
|
42
|
+
* target exists, it expands ancestors, selects the item, and runs a
|
|
43
|
+
* highlight animation. If not found, shows an error banner.
|
|
44
|
+
*/
|
|
45
|
+
export declare function usePRDDeepLink({ initialTaskId, loading, data, onSelectItem, }: PRDDeepLinkDeps): PRDDeepLinkState;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD deep-link resolution hook.
|
|
3
|
+
*
|
|
4
|
+
* Handles auto-selection and highlighting of a specific task when the
|
|
5
|
+
* view loads with an initialTaskId (from a shareable URL like /prd/:id).
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - Finds the target item in the tree once data is loaded
|
|
9
|
+
* - Expands ancestor nodes so the target is visible
|
|
10
|
+
* - Selects and highlights the target with a timed animation
|
|
11
|
+
* - Shows an error banner if the task ID is not found
|
|
12
|
+
* - Cleans up the URL on error (reverts to /prd)
|
|
13
|
+
*
|
|
14
|
+
* Extracted from PRDView to isolate deep-link side effects from the
|
|
15
|
+
* component's render and CRUD logic.
|
|
16
|
+
*/
|
|
17
|
+
import { useState, useEffect, useRef } from "preact/hooks";
|
|
18
|
+
import { findItemById, getAncestorIds } from "../components/prd-tree/tree-utils.js";
|
|
19
|
+
/**
|
|
20
|
+
* Hook that resolves deep-link navigation for PRD tasks.
|
|
21
|
+
*
|
|
22
|
+
* Consumes the initialTaskId exactly once after data loads. If the
|
|
23
|
+
* target exists, it expands ancestors, selects the item, and runs a
|
|
24
|
+
* highlight animation. If not found, shows an error banner.
|
|
25
|
+
*/
|
|
26
|
+
export function usePRDDeepLink({ initialTaskId, loading, data, onSelectItem, }) {
|
|
27
|
+
const [deepLinkError, setDeepLinkError] = useState(null);
|
|
28
|
+
const [highlightedTaskId, setHighlightedTaskId] = useState(null);
|
|
29
|
+
const [deepLinkExpandIds, setDeepLinkExpandIds] = useState(null);
|
|
30
|
+
/** Whether the initial deep-link has been consumed. */
|
|
31
|
+
const deepLinkConsumedRef = useRef(false);
|
|
32
|
+
// Wrap onSelectItem in a ref to avoid re-triggering the effect
|
|
33
|
+
const onSelectItemRef = useRef(onSelectItem);
|
|
34
|
+
onSelectItemRef.current = onSelectItem;
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (deepLinkConsumedRef.current || !initialTaskId || loading || !data)
|
|
37
|
+
return;
|
|
38
|
+
deepLinkConsumedRef.current = true;
|
|
39
|
+
const item = findItemById(data.items, initialTaskId);
|
|
40
|
+
if (!item) {
|
|
41
|
+
setDeepLinkError(`Task "${initialTaskId}" not found`);
|
|
42
|
+
// Clean URL back to /prd
|
|
43
|
+
history.replaceState({ view: "prd", file: null, zone: null, runId: null, taskId: null }, "", "/prd");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Expand ancestor nodes so the target is visible
|
|
47
|
+
const ancestors = getAncestorIds(data.items, initialTaskId);
|
|
48
|
+
if (ancestors.length > 0) {
|
|
49
|
+
setDeepLinkExpandIds(new Set(ancestors));
|
|
50
|
+
}
|
|
51
|
+
// Select and highlight the item
|
|
52
|
+
setHighlightedTaskId(initialTaskId);
|
|
53
|
+
onSelectItemRef.current(item);
|
|
54
|
+
// Clear highlight after animation completes
|
|
55
|
+
const timer = setTimeout(() => setHighlightedTaskId(null), 3000);
|
|
56
|
+
return () => clearTimeout(timer);
|
|
57
|
+
}, [initialTaskId, loading, data]);
|
|
58
|
+
return { deepLinkError, setDeepLinkError, highlightedTaskId, deepLinkExpandIds };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=use-prd-deep-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-prd-deep-link.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-deep-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAe,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAwBpF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,OAAO,EACP,IAAI,EACJ,YAAY,GACI;IAChB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAErF,uDAAuD;IACvD,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1C,+DAA+D;IAC/D,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7C,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,mBAAmB,CAAC,OAAO,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,IAAI;YAAE,OAAO;QAC9E,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,gBAAgB,CAAC,SAAS,aAAa,aAAa,CAAC,CAAC;YACtD,yBAAyB;YACzB,OAAO,CAAC,YAAY,CAClB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAClE,EAAE,EACF,MAAM,CACP,CAAC;YACF,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,oBAAoB,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,gCAAgC;QAChC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACpC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9B,4CAA4C;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEnC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD WebSocket real-time update hook.
|
|
3
|
+
*
|
|
4
|
+
* Sets up a five-layer message processing pipeline for real-time PRD
|
|
5
|
+
* updates via WebSocket:
|
|
6
|
+
*
|
|
7
|
+
* raw WS → buffer gate → throttle → coalescer → DOM gate → batcher → RAF → render
|
|
8
|
+
*
|
|
9
|
+
* Each layer has a specific role:
|
|
10
|
+
*
|
|
11
|
+
* 0. **Response buffer gate** — drops messages when tab is hidden, flushes
|
|
12
|
+
* downstream buffers to free memory, reconciles on resume.
|
|
13
|
+
* 1. **Throttle** — per-type trailing-edge debounce for high-frequency
|
|
14
|
+
* rex message types (prd-changed, item-updated, item-deleted).
|
|
15
|
+
* 2. **Coalescer** — batches throttled output into a single reconciliation
|
|
16
|
+
* flush instead of N separate fetches.
|
|
17
|
+
* 3. **DOM update gate** — queues state updates when tab is hidden,
|
|
18
|
+
* replays them in a single batch when visible again.
|
|
19
|
+
* 4. **Update batcher** — collects setData calls into a single RAF
|
|
20
|
+
* callback per animation frame.
|
|
21
|
+
*
|
|
22
|
+
* Extracted from PRDView to isolate WebSocket side effects from the
|
|
23
|
+
* component's render logic.
|
|
24
|
+
*
|
|
25
|
+
* @see ../messaging/message-coalescer.ts
|
|
26
|
+
* @see ../messaging/message-throttle.ts
|
|
27
|
+
* @see ../performance/dom-update-gate.ts
|
|
28
|
+
* @see ../performance/update-batcher.ts
|
|
29
|
+
* @see ../performance/response-buffer-gate.ts
|
|
30
|
+
*/
|
|
31
|
+
import type { PRDDocumentData } from "../components/prd-tree/types.js";
|
|
32
|
+
export interface PRDWebSocketDeps {
|
|
33
|
+
/** Setter for PRD document state (supports functional updates). */
|
|
34
|
+
setData: (updater: PRDDocumentData | null | ((prev: PRDDocumentData | null) => PRDDocumentData | null)) => void;
|
|
35
|
+
/** Fetch/reconcile PRD data from server. */
|
|
36
|
+
fetchPRDData: () => Promise<void>;
|
|
37
|
+
/** Fetch/reconcile task usage data from server. */
|
|
38
|
+
fetchTaskUsage: () => Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hook that manages the WebSocket connection and message processing
|
|
42
|
+
* pipeline for real-time PRD updates.
|
|
43
|
+
*
|
|
44
|
+
* All parameters are expected to be stable references (wrapped in
|
|
45
|
+
* useCallback or similar). The effect re-runs when any dependency changes.
|
|
46
|
+
*/
|
|
47
|
+
export declare function usePRDWebSocket({ setData, fetchPRDData, fetchTaskUsage }: PRDWebSocketDeps): void;
|