@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.
Files changed (671) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +5 -0
  3. package/build.js +243 -0
  4. package/dist/cli/index.d.ts +8 -0
  5. package/dist/cli/index.js +50 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/landing/index.html +325 -0
  8. package/dist/landing/landing.d.ts +38 -0
  9. package/dist/landing/landing.js +299 -0
  10. package/dist/landing/landing.js.map +1 -0
  11. package/dist/public.d.ts +55 -0
  12. package/dist/public.js +51 -0
  13. package/dist/public.js.map +1 -0
  14. package/dist/schema/features.d.ts +28 -0
  15. package/dist/schema/features.js +9 -0
  16. package/dist/schema/features.js.map +1 -0
  17. package/dist/schema/v1.d.ts +317 -0
  18. package/dist/schema/v1.js +3 -0
  19. package/dist/schema/v1.js.map +1 -0
  20. package/dist/server/aggregation-cache.d.ts +105 -0
  21. package/dist/server/aggregation-cache.js +163 -0
  22. package/dist/server/aggregation-cache.js.map +1 -0
  23. package/dist/server/concurrent-execution-metrics.d.ts +103 -0
  24. package/dist/server/concurrent-execution-metrics.js +253 -0
  25. package/dist/server/concurrent-execution-metrics.js.map +1 -0
  26. package/dist/server/domain-gateway.d.ts +18 -0
  27. package/dist/server/domain-gateway.js +19 -0
  28. package/dist/server/domain-gateway.js.map +1 -0
  29. package/dist/server/incremental-task-usage.d.ts +92 -0
  30. package/dist/server/incremental-task-usage.js +251 -0
  31. package/dist/server/incremental-task-usage.js.map +1 -0
  32. package/dist/server/index.d.ts +39 -0
  33. package/dist/server/index.js +36 -0
  34. package/dist/server/index.js.map +1 -0
  35. package/dist/server/port.d.ts +96 -0
  36. package/dist/server/port.js +134 -0
  37. package/dist/server/port.js.map +1 -0
  38. package/dist/server/pr-markdown-refresh-diagnostics.d.ts +59 -0
  39. package/dist/server/pr-markdown-refresh-diagnostics.js +429 -0
  40. package/dist/server/pr-markdown-refresh-diagnostics.js.map +1 -0
  41. package/dist/server/prd-io.d.ts +40 -0
  42. package/dist/server/prd-io.js +66 -0
  43. package/dist/server/prd-io.js.map +1 -0
  44. package/dist/server/process-memory-tracker.d.ts +79 -0
  45. package/dist/server/process-memory-tracker.js +194 -0
  46. package/dist/server/process-memory-tracker.js.map +1 -0
  47. package/dist/server/register-scheduler.d.ts +53 -0
  48. package/dist/server/register-scheduler.js +36 -0
  49. package/dist/server/register-scheduler.js.map +1 -0
  50. package/dist/server/rex-gateway.d.ts +39 -0
  51. package/dist/server/rex-gateway.js +47 -0
  52. package/dist/server/rex-gateway.js.map +1 -0
  53. package/dist/server/routes-adaptive.d.ts +21 -0
  54. package/dist/server/routes-adaptive.js +659 -0
  55. package/dist/server/routes-adaptive.js.map +1 -0
  56. package/dist/server/routes-config.d.ts +47 -0
  57. package/dist/server/routes-config.js +222 -0
  58. package/dist/server/routes-config.js.map +1 -0
  59. package/dist/server/routes-data.d.ts +14 -0
  60. package/dist/server/routes-data.js +129 -0
  61. package/dist/server/routes-data.js.map +1 -0
  62. package/dist/server/routes-features.d.ts +14 -0
  63. package/dist/server/routes-features.js +245 -0
  64. package/dist/server/routes-features.js.map +1 -0
  65. package/dist/server/routes-hench.d.ts +116 -0
  66. package/dist/server/routes-hench.js +2016 -0
  67. package/dist/server/routes-hench.js.map +1 -0
  68. package/dist/server/routes-integrations.d.ts +23 -0
  69. package/dist/server/routes-integrations.js +277 -0
  70. package/dist/server/routes-integrations.js.map +1 -0
  71. package/dist/server/routes-mcp.d.ts +31 -0
  72. package/dist/server/routes-mcp.js +175 -0
  73. package/dist/server/routes-mcp.js.map +1 -0
  74. package/dist/server/routes-notion.d.ts +23 -0
  75. package/dist/server/routes-notion.js +723 -0
  76. package/dist/server/routes-notion.js.map +1 -0
  77. package/dist/server/routes-project.d.ts +47 -0
  78. package/dist/server/routes-project.js +128 -0
  79. package/dist/server/routes-project.js.map +1 -0
  80. package/dist/server/routes-rex/analysis.d.ts +11 -0
  81. package/dist/server/routes-rex/analysis.js +583 -0
  82. package/dist/server/routes-rex/analysis.js.map +1 -0
  83. package/dist/server/routes-rex/execution.d.ts +37 -0
  84. package/dist/server/routes-rex/execution.js +355 -0
  85. package/dist/server/routes-rex/execution.js.map +1 -0
  86. package/dist/server/routes-rex/health.d.ts +8 -0
  87. package/dist/server/routes-rex/health.js +136 -0
  88. package/dist/server/routes-rex/health.js.map +1 -0
  89. package/dist/server/routes-rex/index.d.ts +35 -0
  90. package/dist/server/routes-rex/index.js +72 -0
  91. package/dist/server/routes-rex/index.js.map +1 -0
  92. package/dist/server/routes-rex/items.d.ts +8 -0
  93. package/dist/server/routes-rex/items.js +359 -0
  94. package/dist/server/routes-rex/items.js.map +1 -0
  95. package/dist/server/routes-rex/prune.d.ts +11 -0
  96. package/dist/server/routes-rex/prune.js +379 -0
  97. package/dist/server/routes-rex/prune.js.map +1 -0
  98. package/dist/server/routes-rex/reads.d.ts +9 -0
  99. package/dist/server/routes-rex/reads.js +119 -0
  100. package/dist/server/routes-rex/reads.js.map +1 -0
  101. package/dist/server/routes-rex/requirements.d.ts +10 -0
  102. package/dist/server/routes-rex/requirements.js +408 -0
  103. package/dist/server/routes-rex/requirements.js.map +1 -0
  104. package/dist/server/routes-rex/shared.d.ts +37 -0
  105. package/dist/server/routes-rex/shared.js +73 -0
  106. package/dist/server/routes-rex/shared.js.map +1 -0
  107. package/dist/server/routes-search.d.ts +26 -0
  108. package/dist/server/routes-search.js +82 -0
  109. package/dist/server/routes-search.js.map +1 -0
  110. package/dist/server/routes-sourcevision.d.ts +18 -0
  111. package/dist/server/routes-sourcevision.js +444 -0
  112. package/dist/server/routes-sourcevision.js.map +1 -0
  113. package/dist/server/routes-static.d.ts +20 -0
  114. package/dist/server/routes-static.js +168 -0
  115. package/dist/server/routes-static.js.map +1 -0
  116. package/dist/server/routes-status.d.ts +58 -0
  117. package/dist/server/routes-status.js +191 -0
  118. package/dist/server/routes-status.js.map +1 -0
  119. package/dist/server/routes-token-usage.d.ts +63 -0
  120. package/dist/server/routes-token-usage.js +720 -0
  121. package/dist/server/routes-token-usage.js.map +1 -0
  122. package/dist/server/routes-validation.d.ts +10 -0
  123. package/dist/server/routes-validation.js +365 -0
  124. package/dist/server/routes-validation.js.map +1 -0
  125. package/dist/server/routes-workflow.d.ts +15 -0
  126. package/dist/server/routes-workflow.js +498 -0
  127. package/dist/server/routes-workflow.js.map +1 -0
  128. package/dist/server/search-index.d.ts +111 -0
  129. package/dist/server/search-index.js +348 -0
  130. package/dist/server/search-index.js.map +1 -0
  131. package/dist/server/shared-types.d.ts +65 -0
  132. package/dist/server/shared-types.js +31 -0
  133. package/dist/server/shared-types.js.map +1 -0
  134. package/dist/server/start.d.ts +68 -0
  135. package/dist/server/start.js +568 -0
  136. package/dist/server/start.js.map +1 -0
  137. package/dist/server/task-usage.d.ts +17 -0
  138. package/dist/server/task-usage.js +20 -0
  139. package/dist/server/task-usage.js.map +1 -0
  140. package/dist/server/types.d.ts +27 -0
  141. package/dist/server/types.js +26 -0
  142. package/dist/server/types.js.map +1 -0
  143. package/dist/server/usage-cleanup-scheduler.d.ts +107 -0
  144. package/dist/server/usage-cleanup-scheduler.js +232 -0
  145. package/dist/server/usage-cleanup-scheduler.js.map +1 -0
  146. package/dist/server/websocket.d.ts +131 -0
  147. package/dist/server/websocket.js +512 -0
  148. package/dist/server/websocket.js.map +1 -0
  149. package/dist/shared/data-files.d.ts +17 -0
  150. package/dist/shared/data-files.js +18 -0
  151. package/dist/shared/data-files.js.map +1 -0
  152. package/dist/shared/index.d.ts +9 -0
  153. package/dist/shared/index.js +9 -0
  154. package/dist/shared/index.js.map +1 -0
  155. package/dist/shared/view-id.d.ts +8 -0
  156. package/dist/shared/view-id.js +9 -0
  157. package/dist/shared/view-id.js.map +1 -0
  158. package/dist/viewer/Hench-F.png +0 -0
  159. package/dist/viewer/Rex-F.png +0 -0
  160. package/dist/viewer/SourceVision-F.png +0 -0
  161. package/dist/viewer/SourceVision.png +0 -0
  162. package/dist/viewer/api.d.ts +19 -0
  163. package/dist/viewer/api.js +17 -0
  164. package/dist/viewer/api.js.map +1 -0
  165. package/dist/viewer/bootstrap.d.ts +13 -0
  166. package/dist/viewer/bootstrap.js +40 -0
  167. package/dist/viewer/bootstrap.js.map +1 -0
  168. package/dist/viewer/components/active-tasks-panel.d.ts +36 -0
  169. package/dist/viewer/components/active-tasks-panel.js +183 -0
  170. package/dist/viewer/components/active-tasks-panel.js.map +1 -0
  171. package/dist/viewer/components/breadcrumb.d.ts +21 -0
  172. package/dist/viewer/components/breadcrumb.js +117 -0
  173. package/dist/viewer/components/breadcrumb.js.map +1 -0
  174. package/dist/viewer/components/concurrency-panel.d.ts +18 -0
  175. package/dist/viewer/components/concurrency-panel.js +175 -0
  176. package/dist/viewer/components/concurrency-panel.js.map +1 -0
  177. package/dist/viewer/components/config-footer.d.ts +11 -0
  178. package/dist/viewer/components/config-footer.js +132 -0
  179. package/dist/viewer/components/config-footer.js.map +1 -0
  180. package/dist/viewer/components/constants.d.ts +10 -0
  181. package/dist/viewer/components/constants.js +11 -0
  182. package/dist/viewer/components/constants.js.map +1 -0
  183. package/dist/viewer/components/copy-link-button.d.ts +30 -0
  184. package/dist/viewer/components/copy-link-button.js +74 -0
  185. package/dist/viewer/components/copy-link-button.js.map +1 -0
  186. package/dist/viewer/components/crash-recovery-banner.d.ts +28 -0
  187. package/dist/viewer/components/crash-recovery-banner.js +47 -0
  188. package/dist/viewer/components/crash-recovery-banner.js.map +1 -0
  189. package/dist/viewer/components/data-display/collapsible-section.d.ts +14 -0
  190. package/dist/viewer/components/data-display/collapsible-section.js +66 -0
  191. package/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
  192. package/dist/viewer/components/data-display/findings-list.d.ts +13 -0
  193. package/dist/viewer/components/data-display/findings-list.js +136 -0
  194. package/dist/viewer/components/data-display/findings-list.js.map +1 -0
  195. package/dist/viewer/components/data-display/health-gauge.d.ts +37 -0
  196. package/dist/viewer/components/data-display/health-gauge.js +62 -0
  197. package/dist/viewer/components/data-display/health-gauge.js.map +1 -0
  198. package/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
  199. package/dist/viewer/components/data-display/mini-charts.js +124 -0
  200. package/dist/viewer/components/data-display/mini-charts.js.map +1 -0
  201. package/dist/viewer/components/data-display/tree-view.d.ts +18 -0
  202. package/dist/viewer/components/data-display/tree-view.js +107 -0
  203. package/dist/viewer/components/data-display/tree-view.js.map +1 -0
  204. package/dist/viewer/components/data-display/zone-map.d.ts +28 -0
  205. package/dist/viewer/components/data-display/zone-map.js +197 -0
  206. package/dist/viewer/components/data-display/zone-map.js.map +1 -0
  207. package/dist/viewer/components/degradation-banner.d.ts +28 -0
  208. package/dist/viewer/components/degradation-banner.js +47 -0
  209. package/dist/viewer/components/degradation-banner.js.map +1 -0
  210. package/dist/viewer/components/detail-panel.d.ts +12 -0
  211. package/dist/viewer/components/detail-panel.js +166 -0
  212. package/dist/viewer/components/detail-panel.js.map +1 -0
  213. package/dist/viewer/components/elapsed-time.d.ts +38 -0
  214. package/dist/viewer/components/elapsed-time.js +35 -0
  215. package/dist/viewer/components/elapsed-time.js.map +1 -0
  216. package/dist/viewer/components/faq.d.ts +12 -0
  217. package/dist/viewer/components/faq.js +237 -0
  218. package/dist/viewer/components/faq.js.map +1 -0
  219. package/dist/viewer/components/favicon.d.ts +30 -0
  220. package/dist/viewer/components/favicon.js +90 -0
  221. package/dist/viewer/components/favicon.js.map +1 -0
  222. package/dist/viewer/components/guide.d.ts +5 -0
  223. package/dist/viewer/components/guide.js +116 -0
  224. package/dist/viewer/components/guide.js.map +1 -0
  225. package/dist/viewer/components/index.d.ts +37 -0
  226. package/dist/viewer/components/index.js +46 -0
  227. package/dist/viewer/components/index.js.map +1 -0
  228. package/dist/viewer/components/logos.d.ts +42 -0
  229. package/dist/viewer/components/logos.js +46 -0
  230. package/dist/viewer/components/logos.js.map +1 -0
  231. package/dist/viewer/components/memory-panel.d.ts +19 -0
  232. package/dist/viewer/components/memory-panel.js +181 -0
  233. package/dist/viewer/components/memory-panel.js.map +1 -0
  234. package/dist/viewer/components/memory-warning.d.ts +23 -0
  235. package/dist/viewer/components/memory-warning.js +42 -0
  236. package/dist/viewer/components/memory-warning.js.map +1 -0
  237. package/dist/viewer/components/notion-schema-wizard.d.ts +16 -0
  238. package/dist/viewer/components/notion-schema-wizard.js +263 -0
  239. package/dist/viewer/components/notion-schema-wizard.js.map +1 -0
  240. package/dist/viewer/components/polling-suspension-indicator.d.ts +24 -0
  241. package/dist/viewer/components/polling-suspension-indicator.js +31 -0
  242. package/dist/viewer/components/polling-suspension-indicator.js.map +1 -0
  243. package/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
  244. package/dist/viewer/components/prd-tree/add-item-form.js +231 -0
  245. package/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
  246. package/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
  247. package/dist/viewer/components/prd-tree/analyze-panel.js +245 -0
  248. package/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
  249. package/dist/viewer/components/prd-tree/batch-import-panel.d.ts +34 -0
  250. package/dist/viewer/components/prd-tree/batch-import-panel.js +415 -0
  251. package/dist/viewer/components/prd-tree/batch-import-panel.js.map +1 -0
  252. package/dist/viewer/components/prd-tree/bulk-actions.d.ts +19 -0
  253. package/dist/viewer/components/prd-tree/bulk-actions.js +90 -0
  254. package/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
  255. package/dist/viewer/components/prd-tree/compute.d.ts +32 -0
  256. package/dist/viewer/components/prd-tree/compute.js +129 -0
  257. package/dist/viewer/components/prd-tree/compute.js.map +1 -0
  258. package/dist/viewer/components/prd-tree/delete-confirmation.d.ts +23 -0
  259. package/dist/viewer/components/prd-tree/delete-confirmation.js +83 -0
  260. package/dist/viewer/components/prd-tree/delete-confirmation.js.map +1 -0
  261. package/dist/viewer/components/prd-tree/execution-panel.d.ts +14 -0
  262. package/dist/viewer/components/prd-tree/execution-panel.js +291 -0
  263. package/dist/viewer/components/prd-tree/execution-panel.js.map +1 -0
  264. package/dist/viewer/components/prd-tree/facet-filter.d.ts +40 -0
  265. package/dist/viewer/components/prd-tree/facet-filter.js +188 -0
  266. package/dist/viewer/components/prd-tree/facet-filter.js.map +1 -0
  267. package/dist/viewer/components/prd-tree/index.d.ts +24 -0
  268. package/dist/viewer/components/prd-tree/index.js +16 -0
  269. package/dist/viewer/components/prd-tree/index.js.map +1 -0
  270. package/dist/viewer/components/prd-tree/inline-add-form.d.ts +32 -0
  271. package/dist/viewer/components/prd-tree/inline-add-form.js +175 -0
  272. package/dist/viewer/components/prd-tree/inline-add-form.js.map +1 -0
  273. package/dist/viewer/components/prd-tree/inline-status-picker.d.ts +31 -0
  274. package/dist/viewer/components/prd-tree/inline-status-picker.js +110 -0
  275. package/dist/viewer/components/prd-tree/inline-status-picker.js.map +1 -0
  276. package/dist/viewer/components/prd-tree/lazy-children.d.ts +40 -0
  277. package/dist/viewer/components/prd-tree/lazy-children.js +73 -0
  278. package/dist/viewer/components/prd-tree/lazy-children.js.map +1 -0
  279. package/dist/viewer/components/prd-tree/levels.d.ts +31 -0
  280. package/dist/viewer/components/prd-tree/levels.js +72 -0
  281. package/dist/viewer/components/prd-tree/levels.js.map +1 -0
  282. package/dist/viewer/components/prd-tree/listener-lifecycle.d.ts +105 -0
  283. package/dist/viewer/components/prd-tree/listener-lifecycle.js +173 -0
  284. package/dist/viewer/components/prd-tree/listener-lifecycle.js.map +1 -0
  285. package/dist/viewer/components/prd-tree/merge-preview.d.ts +25 -0
  286. package/dist/viewer/components/prd-tree/merge-preview.js +181 -0
  287. package/dist/viewer/components/prd-tree/merge-preview.js.map +1 -0
  288. package/dist/viewer/components/prd-tree/prd-tree.d.ts +91 -0
  289. package/dist/viewer/components/prd-tree/prd-tree.js +565 -0
  290. package/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
  291. package/dist/viewer/components/prd-tree/proposal-editor.d.ts +44 -0
  292. package/dist/viewer/components/prd-tree/proposal-editor.js +438 -0
  293. package/dist/viewer/components/prd-tree/proposal-editor.js.map +1 -0
  294. package/dist/viewer/components/prd-tree/prune-confirmation.d.ts +25 -0
  295. package/dist/viewer/components/prd-tree/prune-confirmation.js +336 -0
  296. package/dist/viewer/components/prd-tree/prune-confirmation.js.map +1 -0
  297. package/dist/viewer/components/prd-tree/prune-diff-tree.d.ts +39 -0
  298. package/dist/viewer/components/prd-tree/prune-diff-tree.js +319 -0
  299. package/dist/viewer/components/prd-tree/prune-diff-tree.js.map +1 -0
  300. package/dist/viewer/components/prd-tree/reorganize-panel.d.ts +16 -0
  301. package/dist/viewer/components/prd-tree/reorganize-panel.js +213 -0
  302. package/dist/viewer/components/prd-tree/reorganize-panel.js.map +1 -0
  303. package/dist/viewer/components/prd-tree/smart-add-input.d.ts +19 -0
  304. package/dist/viewer/components/prd-tree/smart-add-input.js +383 -0
  305. package/dist/viewer/components/prd-tree/smart-add-input.js.map +1 -0
  306. package/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
  307. package/dist/viewer/components/prd-tree/status-filter.js +131 -0
  308. package/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
  309. package/dist/viewer/components/prd-tree/task-detail.d.ts +41 -0
  310. package/dist/viewer/components/prd-tree/task-detail.js +1205 -0
  311. package/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
  312. package/dist/viewer/components/prd-tree/task-utilization.d.ts +7 -0
  313. package/dist/viewer/components/prd-tree/task-utilization.js +25 -0
  314. package/dist/viewer/components/prd-tree/task-utilization.js.map +1 -0
  315. package/dist/viewer/components/prd-tree/tree-differ.d.ts +59 -0
  316. package/dist/viewer/components/prd-tree/tree-differ.js +200 -0
  317. package/dist/viewer/components/prd-tree/tree-differ.js.map +1 -0
  318. package/dist/viewer/components/prd-tree/tree-event-delegate.d.ts +70 -0
  319. package/dist/viewer/components/prd-tree/tree-event-delegate.js +176 -0
  320. package/dist/viewer/components/prd-tree/tree-event-delegate.js.map +1 -0
  321. package/dist/viewer/components/prd-tree/tree-search.d.ts +65 -0
  322. package/dist/viewer/components/prd-tree/tree-search.js +178 -0
  323. package/dist/viewer/components/prd-tree/tree-search.js.map +1 -0
  324. package/dist/viewer/components/prd-tree/tree-utils.d.ts +38 -0
  325. package/dist/viewer/components/prd-tree/tree-utils.js +107 -0
  326. package/dist/viewer/components/prd-tree/tree-utils.js.map +1 -0
  327. package/dist/viewer/components/prd-tree/types.d.ts +93 -0
  328. package/dist/viewer/components/prd-tree/types.js +16 -0
  329. package/dist/viewer/components/prd-tree/types.js.map +1 -0
  330. package/dist/viewer/components/prd-tree/virtual-scroll.d.ts +119 -0
  331. package/dist/viewer/components/prd-tree/virtual-scroll.js +169 -0
  332. package/dist/viewer/components/prd-tree/virtual-scroll.js.map +1 -0
  333. package/dist/viewer/components/progressive-loader.d.ts +114 -0
  334. package/dist/viewer/components/progressive-loader.js +225 -0
  335. package/dist/viewer/components/progressive-loader.js.map +1 -0
  336. package/dist/viewer/components/refresh-queue-status.d.ts +20 -0
  337. package/dist/viewer/components/refresh-queue-status.js +65 -0
  338. package/dist/viewer/components/refresh-queue-status.js.map +1 -0
  339. package/dist/viewer/components/rex-task-link.d.ts +50 -0
  340. package/dist/viewer/components/rex-task-link.js +218 -0
  341. package/dist/viewer/components/rex-task-link.js.map +1 -0
  342. package/dist/viewer/components/search-filter.d.ts +20 -0
  343. package/dist/viewer/components/search-filter.js +28 -0
  344. package/dist/viewer/components/search-filter.js.map +1 -0
  345. package/dist/viewer/components/search-overlay.d.ts +31 -0
  346. package/dist/viewer/components/search-overlay.js +472 -0
  347. package/dist/viewer/components/search-overlay.js.map +1 -0
  348. package/dist/viewer/components/sidebar.d.ts +18 -0
  349. package/dist/viewer/components/sidebar.js +357 -0
  350. package/dist/viewer/components/sidebar.js.map +1 -0
  351. package/dist/viewer/components/status-indicators.d.ts +63 -0
  352. package/dist/viewer/components/status-indicators.js +136 -0
  353. package/dist/viewer/components/status-indicators.js.map +1 -0
  354. package/dist/viewer/components/theme-toggle.d.ts +8 -0
  355. package/dist/viewer/components/theme-toggle.js +28 -0
  356. package/dist/viewer/components/theme-toggle.js.map +1 -0
  357. package/dist/viewer/components/throttle-controls.d.ts +18 -0
  358. package/dist/viewer/components/throttle-controls.js +304 -0
  359. package/dist/viewer/components/throttle-controls.js.map +1 -0
  360. package/dist/viewer/components/ws-health-panel.d.ts +18 -0
  361. package/dist/viewer/components/ws-health-panel.js +250 -0
  362. package/dist/viewer/components/ws-health-panel.js.map +1 -0
  363. package/dist/viewer/components/zone-slideout.d.ts +17 -0
  364. package/dist/viewer/components/zone-slideout.js +162 -0
  365. package/dist/viewer/components/zone-slideout.js.map +1 -0
  366. package/dist/viewer/crash/crash-detector.d.ts +69 -0
  367. package/dist/viewer/crash/crash-detector.js +239 -0
  368. package/dist/viewer/crash/crash-detector.js.map +1 -0
  369. package/dist/viewer/crash/index.d.ts +7 -0
  370. package/dist/viewer/crash/index.js +8 -0
  371. package/dist/viewer/crash/index.js.map +1 -0
  372. package/dist/viewer/deployed-mode.d.ts +37 -0
  373. package/dist/viewer/deployed-mode.js +94 -0
  374. package/dist/viewer/deployed-mode.js.map +1 -0
  375. package/dist/viewer/external.d.ts +17 -0
  376. package/dist/viewer/external.js +17 -0
  377. package/dist/viewer/external.js.map +1 -0
  378. package/dist/viewer/graph/index.d.ts +9 -0
  379. package/dist/viewer/graph/index.js +12 -0
  380. package/dist/viewer/graph/index.js.map +1 -0
  381. package/dist/viewer/graph/physics.d.ts +96 -0
  382. package/dist/viewer/graph/physics.js +366 -0
  383. package/dist/viewer/graph/physics.js.map +1 -0
  384. package/dist/viewer/graph/renderer.d.ts +184 -0
  385. package/dist/viewer/graph/renderer.js +1438 -0
  386. package/dist/viewer/graph/renderer.js.map +1 -0
  387. package/dist/viewer/hooks/index.d.ts +27 -0
  388. package/dist/viewer/hooks/index.js +28 -0
  389. package/dist/viewer/hooks/index.js.map +1 -0
  390. package/dist/viewer/hooks/use-app-data.d.ts +31 -0
  391. package/dist/viewer/hooks/use-app-data.js +152 -0
  392. package/dist/viewer/hooks/use-app-data.js.map +1 -0
  393. package/dist/viewer/hooks/use-crash-recovery.d.ts +50 -0
  394. package/dist/viewer/hooks/use-crash-recovery.js +76 -0
  395. package/dist/viewer/hooks/use-crash-recovery.js.map +1 -0
  396. package/dist/viewer/hooks/use-delete-actions.d.ts +48 -0
  397. package/dist/viewer/hooks/use-delete-actions.js +103 -0
  398. package/dist/viewer/hooks/use-delete-actions.js.map +1 -0
  399. package/dist/viewer/hooks/use-dom-performance-monitor.d.ts +68 -0
  400. package/dist/viewer/hooks/use-dom-performance-monitor.js +71 -0
  401. package/dist/viewer/hooks/use-dom-performance-monitor.js.map +1 -0
  402. package/dist/viewer/hooks/use-facet-state.d.ts +32 -0
  403. package/dist/viewer/hooks/use-facet-state.js +119 -0
  404. package/dist/viewer/hooks/use-facet-state.js.map +1 -0
  405. package/dist/viewer/hooks/use-feature-toggle.d.ts +18 -0
  406. package/dist/viewer/hooks/use-feature-toggle.js +57 -0
  407. package/dist/viewer/hooks/use-feature-toggle.js.map +1 -0
  408. package/dist/viewer/hooks/use-file-edges.d.ts +23 -0
  409. package/dist/viewer/hooks/use-file-edges.js +221 -0
  410. package/dist/viewer/hooks/use-file-edges.js.map +1 -0
  411. package/dist/viewer/hooks/use-graceful-degradation.d.ts +30 -0
  412. package/dist/viewer/hooks/use-graceful-degradation.js +45 -0
  413. package/dist/viewer/hooks/use-graceful-degradation.js.map +1 -0
  414. package/dist/viewer/hooks/use-item-selection.d.ts +49 -0
  415. package/dist/viewer/hooks/use-item-selection.js +117 -0
  416. package/dist/viewer/hooks/use-item-selection.js.map +1 -0
  417. package/dist/viewer/hooks/use-memory-monitor.d.ts +39 -0
  418. package/dist/viewer/hooks/use-memory-monitor.js +73 -0
  419. package/dist/viewer/hooks/use-memory-monitor.js.map +1 -0
  420. package/dist/viewer/hooks/use-pan-zoom.d.ts +33 -0
  421. package/dist/viewer/hooks/use-pan-zoom.js +110 -0
  422. package/dist/viewer/hooks/use-pan-zoom.js.map +1 -0
  423. package/dist/viewer/hooks/use-persistent-filter.d.ts +24 -0
  424. package/dist/viewer/hooks/use-persistent-filter.js +37 -0
  425. package/dist/viewer/hooks/use-persistent-filter.js.map +1 -0
  426. package/dist/viewer/hooks/use-polling-suspension.d.ts +32 -0
  427. package/dist/viewer/hooks/use-polling-suspension.js +41 -0
  428. package/dist/viewer/hooks/use-polling-suspension.js.map +1 -0
  429. package/dist/viewer/hooks/use-polling.d.ts +39 -0
  430. package/dist/viewer/hooks/use-polling.js +55 -0
  431. package/dist/viewer/hooks/use-polling.js.map +1 -0
  432. package/dist/viewer/hooks/use-prd-actions.d.ts +126 -0
  433. package/dist/viewer/hooks/use-prd-actions.js +250 -0
  434. package/dist/viewer/hooks/use-prd-actions.js.map +1 -0
  435. package/dist/viewer/hooks/use-prd-data.d.ts +45 -0
  436. package/dist/viewer/hooks/use-prd-data.js +159 -0
  437. package/dist/viewer/hooks/use-prd-data.js.map +1 -0
  438. package/dist/viewer/hooks/use-prd-deep-link.d.ts +45 -0
  439. package/dist/viewer/hooks/use-prd-deep-link.js +60 -0
  440. package/dist/viewer/hooks/use-prd-deep-link.js.map +1 -0
  441. package/dist/viewer/hooks/use-prd-websocket.d.ts +47 -0
  442. package/dist/viewer/hooks/use-prd-websocket.js +139 -0
  443. package/dist/viewer/hooks/use-prd-websocket.js.map +1 -0
  444. package/dist/viewer/hooks/use-project-metadata.d.ts +25 -0
  445. package/dist/viewer/hooks/use-project-metadata.js +55 -0
  446. package/dist/viewer/hooks/use-project-metadata.js.map +1 -0
  447. package/dist/viewer/hooks/use-project-status.d.ts +60 -0
  448. package/dist/viewer/hooks/use-project-status.js +133 -0
  449. package/dist/viewer/hooks/use-project-status.js.map +1 -0
  450. package/dist/viewer/hooks/use-refresh-throttle.d.ts +45 -0
  451. package/dist/viewer/hooks/use-refresh-throttle.js +52 -0
  452. package/dist/viewer/hooks/use-refresh-throttle.js.map +1 -0
  453. package/dist/viewer/hooks/use-route-state.d.ts +18 -0
  454. package/dist/viewer/hooks/use-route-state.js +115 -0
  455. package/dist/viewer/hooks/use-route-state.js.map +1 -0
  456. package/dist/viewer/hooks/use-subzone-edges.d.ts +21 -0
  457. package/dist/viewer/hooks/use-subzone-edges.js +147 -0
  458. package/dist/viewer/hooks/use-subzone-edges.js.map +1 -0
  459. package/dist/viewer/hooks/use-tab-visibility.d.ts +31 -0
  460. package/dist/viewer/hooks/use-tab-visibility.js +43 -0
  461. package/dist/viewer/hooks/use-tab-visibility.js.map +1 -0
  462. package/dist/viewer/hooks/use-tick.d.ts +43 -0
  463. package/dist/viewer/hooks/use-tick.js +76 -0
  464. package/dist/viewer/hooks/use-tick.js.map +1 -0
  465. package/dist/viewer/hooks/use-toast.d.ts +24 -0
  466. package/dist/viewer/hooks/use-toast.js +26 -0
  467. package/dist/viewer/hooks/use-toast.js.map +1 -0
  468. package/dist/viewer/hooks/use-zone-drag.d.ts +30 -0
  469. package/dist/viewer/hooks/use-zone-drag.js +60 -0
  470. package/dist/viewer/hooks/use-zone-drag.js.map +1 -0
  471. package/dist/viewer/index.html +36 -0
  472. package/dist/viewer/loader.d.ts +33 -0
  473. package/dist/viewer/loader.js +195 -0
  474. package/dist/viewer/loader.js.map +1 -0
  475. package/dist/viewer/main.d.ts +1 -0
  476. package/dist/viewer/main.js +121 -0
  477. package/dist/viewer/main.js.map +1 -0
  478. package/dist/viewer/messaging/call-rate-limiter.d.ts +50 -0
  479. package/dist/viewer/messaging/call-rate-limiter.js +103 -0
  480. package/dist/viewer/messaging/call-rate-limiter.js.map +1 -0
  481. package/dist/viewer/messaging/fetch-pipeline.d.ts +58 -0
  482. package/dist/viewer/messaging/fetch-pipeline.js +58 -0
  483. package/dist/viewer/messaging/fetch-pipeline.js.map +1 -0
  484. package/dist/viewer/messaging/index.d.ts +43 -0
  485. package/dist/viewer/messaging/index.js +46 -0
  486. package/dist/viewer/messaging/index.js.map +1 -0
  487. package/dist/viewer/messaging/message-coalescer.d.ts +96 -0
  488. package/dist/viewer/messaging/message-coalescer.js +121 -0
  489. package/dist/viewer/messaging/message-coalescer.js.map +1 -0
  490. package/dist/viewer/messaging/message-throttle.d.ts +95 -0
  491. package/dist/viewer/messaging/message-throttle.js +147 -0
  492. package/dist/viewer/messaging/message-throttle.js.map +1 -0
  493. package/dist/viewer/messaging/request-dedup.d.ts +43 -0
  494. package/dist/viewer/messaging/request-dedup.js +55 -0
  495. package/dist/viewer/messaging/request-dedup.js.map +1 -0
  496. package/dist/viewer/messaging/ws-pipeline.d.ts +85 -0
  497. package/dist/viewer/messaging/ws-pipeline.js +68 -0
  498. package/dist/viewer/messaging/ws-pipeline.js.map +1 -0
  499. package/dist/viewer/n-dx.png +0 -0
  500. package/dist/viewer/performance/dom-performance-monitor.d.ts +157 -0
  501. package/dist/viewer/performance/dom-performance-monitor.js +341 -0
  502. package/dist/viewer/performance/dom-performance-monitor.js.map +1 -0
  503. package/dist/viewer/performance/dom-update-gate.d.ts +122 -0
  504. package/dist/viewer/performance/dom-update-gate.js +229 -0
  505. package/dist/viewer/performance/dom-update-gate.js.map +1 -0
  506. package/dist/viewer/performance/graceful-degradation.d.ts +73 -0
  507. package/dist/viewer/performance/graceful-degradation.js +152 -0
  508. package/dist/viewer/performance/graceful-degradation.js.map +1 -0
  509. package/dist/viewer/performance/index.d.ts +14 -0
  510. package/dist/viewer/performance/index.js +20 -0
  511. package/dist/viewer/performance/index.js.map +1 -0
  512. package/dist/viewer/performance/memory-monitor.d.ts +78 -0
  513. package/dist/viewer/performance/memory-monitor.js +218 -0
  514. package/dist/viewer/performance/memory-monitor.js.map +1 -0
  515. package/dist/viewer/performance/refresh-throttle.d.ts +90 -0
  516. package/dist/viewer/performance/refresh-throttle.js +266 -0
  517. package/dist/viewer/performance/refresh-throttle.js.map +1 -0
  518. package/dist/viewer/performance/response-buffer-gate.d.ts +108 -0
  519. package/dist/viewer/performance/response-buffer-gate.js +170 -0
  520. package/dist/viewer/performance/response-buffer-gate.js.map +1 -0
  521. package/dist/viewer/performance/update-batcher.d.ts +79 -0
  522. package/dist/viewer/performance/update-batcher.js +119 -0
  523. package/dist/viewer/performance/update-batcher.js.map +1 -0
  524. package/dist/viewer/polling/batched-tick-dispatcher.d.ts +83 -0
  525. package/dist/viewer/polling/batched-tick-dispatcher.js +183 -0
  526. package/dist/viewer/polling/batched-tick-dispatcher.js.map +1 -0
  527. package/dist/viewer/polling/index.d.ts +13 -0
  528. package/dist/viewer/polling/index.js +16 -0
  529. package/dist/viewer/polling/index.js.map +1 -0
  530. package/dist/viewer/polling/polling-manager.d.ts +82 -0
  531. package/dist/viewer/polling/polling-manager.js +254 -0
  532. package/dist/viewer/polling/polling-manager.js.map +1 -0
  533. package/dist/viewer/polling/polling-restart.d.ts +45 -0
  534. package/dist/viewer/polling/polling-restart.js +98 -0
  535. package/dist/viewer/polling/polling-restart.js.map +1 -0
  536. package/dist/viewer/polling/polling-state.d.ts +182 -0
  537. package/dist/viewer/polling/polling-state.js +306 -0
  538. package/dist/viewer/polling/polling-state.js.map +1 -0
  539. package/dist/viewer/polling/tab-visibility.d.ts +112 -0
  540. package/dist/viewer/polling/tab-visibility.js +276 -0
  541. package/dist/viewer/polling/tab-visibility.js.map +1 -0
  542. package/dist/viewer/polling/tick-timer.d.ts +70 -0
  543. package/dist/viewer/polling/tick-timer.js +168 -0
  544. package/dist/viewer/polling/tick-timer.js.map +1 -0
  545. package/dist/viewer/polling/tick-visibility-gate.d.ts +92 -0
  546. package/dist/viewer/polling/tick-visibility-gate.js +146 -0
  547. package/dist/viewer/polling/tick-visibility-gate.js.map +1 -0
  548. package/dist/viewer/route-state.d.ts +8 -0
  549. package/dist/viewer/route-state.js +77 -0
  550. package/dist/viewer/route-state.js.map +1 -0
  551. package/dist/viewer/schema-compat.d.ts +17 -0
  552. package/dist/viewer/schema-compat.js +49 -0
  553. package/dist/viewer/schema-compat.js.map +1 -0
  554. package/dist/viewer/types.d.ts +66 -0
  555. package/dist/viewer/types.js +2 -0
  556. package/dist/viewer/types.js.map +1 -0
  557. package/dist/viewer/usage/constants.d.ts +14 -0
  558. package/dist/viewer/usage/constants.js +14 -0
  559. package/dist/viewer/usage/constants.js.map +1 -0
  560. package/dist/viewer/usage/index.d.ts +7 -0
  561. package/dist/viewer/usage/index.js +8 -0
  562. package/dist/viewer/usage/index.js.map +1 -0
  563. package/dist/viewer/utils.d.ts +25 -0
  564. package/dist/viewer/utils.js +48 -0
  565. package/dist/viewer/utils.js.map +1 -0
  566. package/dist/viewer/validate.d.ts +23 -0
  567. package/dist/viewer/validate.js +275 -0
  568. package/dist/viewer/validate.js.map +1 -0
  569. package/dist/viewer/views/analysis.d.ts +10 -0
  570. package/dist/viewer/views/analysis.js +109 -0
  571. package/dist/viewer/views/analysis.js.map +1 -0
  572. package/dist/viewer/views/architecture.d.ts +10 -0
  573. package/dist/viewer/views/architecture.js +44 -0
  574. package/dist/viewer/views/architecture.js.map +1 -0
  575. package/dist/viewer/views/domain-hench.d.ts +13 -0
  576. package/dist/viewer/views/domain-hench.js +14 -0
  577. package/dist/viewer/views/domain-hench.js.map +1 -0
  578. package/dist/viewer/views/domain-rex.d.ts +17 -0
  579. package/dist/viewer/views/domain-rex.js +18 -0
  580. package/dist/viewer/views/domain-rex.js.map +1 -0
  581. package/dist/viewer/views/domain-settings.d.ts +12 -0
  582. package/dist/viewer/views/domain-settings.js +13 -0
  583. package/dist/viewer/views/domain-settings.js.map +1 -0
  584. package/dist/viewer/views/domain-sourcevision.d.ts +20 -0
  585. package/dist/viewer/views/domain-sourcevision.js +21 -0
  586. package/dist/viewer/views/domain-sourcevision.js.map +1 -0
  587. package/dist/viewer/views/enrichment-thresholds.d.ts +11 -0
  588. package/dist/viewer/views/enrichment-thresholds.js +12 -0
  589. package/dist/viewer/views/enrichment-thresholds.js.map +1 -0
  590. package/dist/viewer/views/feature-toggles.d.ts +13 -0
  591. package/dist/viewer/views/feature-toggles.js +185 -0
  592. package/dist/viewer/views/feature-toggles.js.map +1 -0
  593. package/dist/viewer/views/files.d.ts +13 -0
  594. package/dist/viewer/views/files.js +174 -0
  595. package/dist/viewer/views/files.js.map +1 -0
  596. package/dist/viewer/views/graph.d.ts +12 -0
  597. package/dist/viewer/views/graph.js +316 -0
  598. package/dist/viewer/views/graph.js.map +1 -0
  599. package/dist/viewer/views/hench-config.d.ts +39 -0
  600. package/dist/viewer/views/hench-config.js +473 -0
  601. package/dist/viewer/views/hench-config.js.map +1 -0
  602. package/dist/viewer/views/hench-runs.d.ts +19 -0
  603. package/dist/viewer/views/hench-runs.js +460 -0
  604. package/dist/viewer/views/hench-runs.js.map +1 -0
  605. package/dist/viewer/views/hench-templates.d.ts +17 -0
  606. package/dist/viewer/views/hench-templates.js +262 -0
  607. package/dist/viewer/views/hench-templates.js.map +1 -0
  608. package/dist/viewer/views/integration-config.d.ts +73 -0
  609. package/dist/viewer/views/integration-config.js +524 -0
  610. package/dist/viewer/views/integration-config.js.map +1 -0
  611. package/dist/viewer/views/notion-config.d.ts +16 -0
  612. package/dist/viewer/views/notion-config.js +357 -0
  613. package/dist/viewer/views/notion-config.js.map +1 -0
  614. package/dist/viewer/views/overview.d.ts +10 -0
  615. package/dist/viewer/views/overview.js +187 -0
  616. package/dist/viewer/views/overview.js.map +1 -0
  617. package/dist/viewer/views/pr-markdown.d.ts +3 -0
  618. package/dist/viewer/views/pr-markdown.js +350 -0
  619. package/dist/viewer/views/pr-markdown.js.map +1 -0
  620. package/dist/viewer/views/prd.d.ts +34 -0
  621. package/dist/viewer/views/prd.js +257 -0
  622. package/dist/viewer/views/prd.js.map +1 -0
  623. package/dist/viewer/views/problems.d.ts +8 -0
  624. package/dist/viewer/views/problems.js +50 -0
  625. package/dist/viewer/views/problems.js.map +1 -0
  626. package/dist/viewer/views/rex-dashboard.d.ts +14 -0
  627. package/dist/viewer/views/rex-dashboard.js +334 -0
  628. package/dist/viewer/views/rex-dashboard.js.map +1 -0
  629. package/dist/viewer/views/routes.d.ts +8 -0
  630. package/dist/viewer/views/routes.js +216 -0
  631. package/dist/viewer/views/routes.js.map +1 -0
  632. package/dist/viewer/views/sourcevision-tabs.d.ts +18 -0
  633. package/dist/viewer/views/sourcevision-tabs.js +14 -0
  634. package/dist/viewer/views/sourcevision-tabs.js.map +1 -0
  635. package/dist/viewer/views/suggestions.d.ts +8 -0
  636. package/dist/viewer/views/suggestions.js +36 -0
  637. package/dist/viewer/views/suggestions.js.map +1 -0
  638. package/dist/viewer/views/task-audit.d.ts +18 -0
  639. package/dist/viewer/views/task-audit.js +413 -0
  640. package/dist/viewer/views/task-audit.js.map +1 -0
  641. package/dist/viewer/views/token-usage.d.ts +10 -0
  642. package/dist/viewer/views/token-usage.js +410 -0
  643. package/dist/viewer/views/token-usage.js.map +1 -0
  644. package/dist/viewer/views/validation.d.ts +11 -0
  645. package/dist/viewer/views/validation.js +475 -0
  646. package/dist/viewer/views/validation.js.map +1 -0
  647. package/dist/viewer/views/view-registry.d.ts +27 -0
  648. package/dist/viewer/views/view-registry.js +70 -0
  649. package/dist/viewer/views/view-registry.js.map +1 -0
  650. package/dist/viewer/views/workflow-optimization.d.ts +12 -0
  651. package/dist/viewer/views/workflow-optimization.js +311 -0
  652. package/dist/viewer/views/workflow-optimization.js.map +1 -0
  653. package/dist/viewer/views/zone-types.d.ts +69 -0
  654. package/dist/viewer/views/zone-types.js +5 -0
  655. package/dist/viewer/views/zone-types.js.map +1 -0
  656. package/dist/viewer/views/zones.d.ts +50 -0
  657. package/dist/viewer/views/zones.js +1438 -0
  658. package/dist/viewer/views/zones.js.map +1 -0
  659. package/dist/viewer/visualization/colors.d.ts +16 -0
  660. package/dist/viewer/visualization/colors.js +31 -0
  661. package/dist/viewer/visualization/colors.js.map +1 -0
  662. package/dist/viewer/visualization/flow.d.ts +54 -0
  663. package/dist/viewer/visualization/flow.js +123 -0
  664. package/dist/viewer/visualization/flow.js.map +1 -0
  665. package/dist/viewer/visualization/index.d.ts +34 -0
  666. package/dist/viewer/visualization/index.js +40 -0
  667. package/dist/viewer/visualization/index.js.map +1 -0
  668. package/dist/viewer/visualization/metrics.d.ts +8 -0
  669. package/dist/viewer/visualization/metrics.js +16 -0
  670. package/dist/viewer/visualization/metrics.js.map +1 -0
  671. package/package.json +54 -0
@@ -0,0 +1,85 @@
1
+ /**
2
+ * WebSocket message processing pipeline — composed throttle + coalescer.
3
+ *
4
+ * Both `usePRDWebSocket` and `useProjectStatus` build the same two-layer
5
+ * pipeline: per-type throttle → message coalescer. This module captures
6
+ * that pattern as a single factory, reducing the coupling surface from
7
+ * two individual messaging imports to one composed import.
8
+ *
9
+ * The pipeline handles:
10
+ * 1. **Throttle** — per-type trailing-edge debounce with independent timers.
11
+ * 2. **Coalescer** — batches throttled output into a single flush.
12
+ *
13
+ * Consumers configure which message types to throttle, their delays, and
14
+ * provide an `onMessage` (immediate/optimistic) and `onFlush` (batched
15
+ * reconciliation) callback.
16
+ *
17
+ * Standalone module with zero framework dependencies.
18
+ */
19
+ import { type ParsedWSMessage, type CoalescedBatch } from "./message-coalescer.js";
20
+ /** Configuration for the WebSocket message pipeline. */
21
+ export interface WSPipelineConfig {
22
+ /**
23
+ * Called once per debounce window with the coalesced batch.
24
+ * Use this to trigger reconciliation fetches.
25
+ */
26
+ onFlush: (batch: CoalescedBatch) => void;
27
+ /**
28
+ * Called immediately for each incoming message (before throttling/batching).
29
+ * Use this for optimistic local state updates.
30
+ */
31
+ onMessage?: ((msg: ParsedWSMessage) => void) | undefined;
32
+ /**
33
+ * Default throttle debounce delay in milliseconds.
34
+ * Default: 250ms.
35
+ */
36
+ defaultDelayMs?: number | undefined;
37
+ /**
38
+ * Per-message-type delay overrides for the throttle layer.
39
+ */
40
+ delays?: Partial<Record<string, number>> | undefined;
41
+ /**
42
+ * Message types to throttle. Types not in this set pass through
43
+ * to the coalescer immediately (zero delay).
44
+ */
45
+ throttledTypes?: readonly string[] | undefined;
46
+ /**
47
+ * Maximum pending messages per type before force-flushing the throttle.
48
+ * Default: 20.
49
+ */
50
+ maxPendingPerType?: number | undefined;
51
+ /**
52
+ * Coalescer trailing-edge debounce window in milliseconds.
53
+ * Default: 150ms.
54
+ */
55
+ coalescerWindowMs?: number | undefined;
56
+ }
57
+ /** A composed WebSocket message pipeline (throttle → coalescer). */
58
+ export interface WSPipeline {
59
+ /** Push a parsed WebSocket message into the pipeline. */
60
+ push(msg: ParsedWSMessage): void;
61
+ /** Force-flush both throttle and coalescer. */
62
+ flush(): void;
63
+ /** Dispose all timers and state. Safe to call multiple times. */
64
+ dispose(): void;
65
+ }
66
+ /**
67
+ * Create a WebSocket message processing pipeline.
68
+ *
69
+ * Usage:
70
+ * ```ts
71
+ * const pipeline = createWSPipeline({
72
+ * onMessage: (msg) => applyOptimisticUpdate(msg),
73
+ * onFlush: (batch) => {
74
+ * if (batch.types.has("rex:prd-changed")) fetchPRDData();
75
+ * },
76
+ * throttledTypes: ["rex:prd-changed", "rex:item-updated"],
77
+ * delays: { "rex:prd-changed": 300, "rex:item-updated": 200 },
78
+ * });
79
+ *
80
+ * ws.onmessage = (event) => {
81
+ * pipeline.push(JSON.parse(event.data));
82
+ * };
83
+ * ```
84
+ */
85
+ export declare function createWSPipeline(config: WSPipelineConfig): WSPipeline;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * WebSocket message processing pipeline — composed throttle + coalescer.
3
+ *
4
+ * Both `usePRDWebSocket` and `useProjectStatus` build the same two-layer
5
+ * pipeline: per-type throttle → message coalescer. This module captures
6
+ * that pattern as a single factory, reducing the coupling surface from
7
+ * two individual messaging imports to one composed import.
8
+ *
9
+ * The pipeline handles:
10
+ * 1. **Throttle** — per-type trailing-edge debounce with independent timers.
11
+ * 2. **Coalescer** — batches throttled output into a single flush.
12
+ *
13
+ * Consumers configure which message types to throttle, their delays, and
14
+ * provide an `onMessage` (immediate/optimistic) and `onFlush` (batched
15
+ * reconciliation) callback.
16
+ *
17
+ * Standalone module with zero framework dependencies.
18
+ */
19
+ import { createMessageThrottle } from "./message-throttle.js";
20
+ import { createMessageCoalescer } from "./message-coalescer.js";
21
+ // ─── Factory ─────────────────────────────────────────────────────────────────
22
+ /**
23
+ * Create a WebSocket message processing pipeline.
24
+ *
25
+ * Usage:
26
+ * ```ts
27
+ * const pipeline = createWSPipeline({
28
+ * onMessage: (msg) => applyOptimisticUpdate(msg),
29
+ * onFlush: (batch) => {
30
+ * if (batch.types.has("rex:prd-changed")) fetchPRDData();
31
+ * },
32
+ * throttledTypes: ["rex:prd-changed", "rex:item-updated"],
33
+ * delays: { "rex:prd-changed": 300, "rex:item-updated": 200 },
34
+ * });
35
+ *
36
+ * ws.onmessage = (event) => {
37
+ * pipeline.push(JSON.parse(event.data));
38
+ * };
39
+ * ```
40
+ */
41
+ export function createWSPipeline(config) {
42
+ const coalescer = createMessageCoalescer({
43
+ onMessage: config.onMessage,
44
+ onFlush: config.onFlush,
45
+ windowMs: config.coalescerWindowMs,
46
+ });
47
+ const throttle = createMessageThrottle({
48
+ onMessage: (msg) => coalescer.push(msg),
49
+ defaultDelayMs: config.defaultDelayMs,
50
+ delays: config.delays,
51
+ throttledTypes: config.throttledTypes,
52
+ maxPendingPerType: config.maxPendingPerType,
53
+ });
54
+ return {
55
+ push(msg) {
56
+ throttle.push(msg);
57
+ },
58
+ flush() {
59
+ throttle.flush();
60
+ coalescer.flush();
61
+ },
62
+ dispose() {
63
+ throttle.dispose();
64
+ coalescer.dispose();
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=ws-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-pipeline.js","sourceRoot":"","sources":["../../../src/viewer/messaging/ws-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAoE,MAAM,wBAAwB,CAAC;AA0DlI,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,SAAS,GAAqB,sBAAsB,CAAC;QACzD,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,iBAAiB;KACnC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAoB,qBAAqB,CAAC;QACtD,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KAC5C,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,CAAC,GAAoB;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,KAAK;YACH,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAED,OAAO;YACL,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnB,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
Binary file
@@ -0,0 +1,157 @@
1
+ /**
2
+ * DOM performance monitoring for tree components.
3
+ *
4
+ * Tracks active DOM node counts, render/update timing, and memory usage
5
+ * for tree operations. Provides before/after comparison data for measuring
6
+ * the impact of DOM optimizations (progressive loading, node culling, etc.).
7
+ *
8
+ * Designed as a standalone module with zero framework dependencies —
9
+ * the Preact hook (`useDOMPerformanceMonitor`) is provided separately.
10
+ *
11
+ * @see ./memory-monitor.ts — complementary heap-level memory monitoring
12
+ * @see ./components/progressive-loader.ts — progressive load integration
13
+ */
14
+ /** DOM node count snapshot at a point in time. */
15
+ export interface DOMNodeSnapshot {
16
+ /** Total DOM node count within the observed container. */
17
+ totalNodes: number;
18
+ /** Number of element nodes (excludes text, comment nodes). */
19
+ elementNodes: number;
20
+ /** Number of tree item elements (role="treeitem"). */
21
+ treeItemCount: number;
22
+ /** Maximum nesting depth within the container. */
23
+ maxDepth: number;
24
+ /** ISO timestamp of when this snapshot was taken. */
25
+ timestamp: string;
26
+ }
27
+ /** Timing data for a single render or update operation. */
28
+ export interface RenderTiming {
29
+ /** Label identifying the operation (e.g. "initial-render", "filter-change"). */
30
+ label: string;
31
+ /** Duration in milliseconds. */
32
+ durationMs: number;
33
+ /** DOM node count after the operation completed. */
34
+ nodeCountAfter: number;
35
+ /** ISO timestamp of when the operation was measured. */
36
+ timestamp: string;
37
+ }
38
+ /** Before/after comparison for a tree operation. */
39
+ export interface UpdateComparison {
40
+ /** Label identifying the operation. */
41
+ label: string;
42
+ /** DOM node count before the operation. */
43
+ nodesBefore: number;
44
+ /** DOM node count after the operation. */
45
+ nodesAfter: number;
46
+ /** Change in DOM node count (positive = growth, negative = reduction). */
47
+ nodeDelta: number;
48
+ /** Duration of the operation in milliseconds. */
49
+ durationMs: number;
50
+ /** Memory usage before (bytes, -1 if unavailable). */
51
+ memoryBefore: number;
52
+ /** Memory usage after (bytes, -1 if unavailable). */
53
+ memoryAfter: number;
54
+ /** Change in memory usage (bytes, -1 if unavailable). */
55
+ memoryDelta: number;
56
+ /** ISO timestamp of the operation. */
57
+ timestamp: string;
58
+ }
59
+ /** Aggregate performance summary computed from collected metrics. */
60
+ export interface PerformanceSummary {
61
+ /** Average render time across all recorded timings. */
62
+ avgRenderMs: number;
63
+ /** Peak render time across all recorded timings. */
64
+ peakRenderMs: number;
65
+ /** Average DOM node count across snapshots. */
66
+ avgNodeCount: number;
67
+ /** Peak DOM node count across snapshots. */
68
+ peakNodeCount: number;
69
+ /** Total number of recorded render timings. */
70
+ renderCount: number;
71
+ /** Total number of recorded update comparisons. */
72
+ updateCount: number;
73
+ /** Total number of DOM snapshots taken. */
74
+ snapshotCount: number;
75
+ }
76
+ /** Configuration for the DOM performance monitor. */
77
+ export interface DOMPerformanceConfig {
78
+ /** Polling interval in milliseconds for automatic snapshots (default: 2000). */
79
+ intervalMs: number;
80
+ /** Maximum number of snapshots to retain in history (default: 120). */
81
+ maxSnapshots: number;
82
+ /** Maximum number of render timings to retain (default: 200). */
83
+ maxTimings: number;
84
+ /** Maximum number of update comparisons to retain (default: 100). */
85
+ maxComparisons: number;
86
+ }
87
+ /** Callback invoked when a new DOM snapshot is taken. */
88
+ export type DOMSnapshotHandler = (snapshot: DOMNodeSnapshot) => void;
89
+ /**
90
+ * Count all DOM nodes within a container element.
91
+ *
92
+ * Walks the subtree using a non-recursive stack to avoid
93
+ * stack overflow on very deep trees. Returns counts for
94
+ * total nodes, element-only nodes, and tree items.
95
+ */
96
+ export declare function countDOMNodes(container: Element): DOMNodeSnapshot;
97
+ /** Read current JS heap usage in bytes, or -1 if unavailable. */
98
+ export declare function readHeapUsage(): number;
99
+ /** Format a duration in milliseconds (e.g. "12.3 ms"). */
100
+ export declare function formatDuration(ms: number): string;
101
+ /** Format a node count with thousands separator. */
102
+ export declare function formatNodeCount(count: number): string;
103
+ /** Format a delta with sign prefix (e.g. "+42" or "−18"). */
104
+ export declare function formatDelta(delta: number): string;
105
+ /**
106
+ * Record a render timing measurement.
107
+ *
108
+ * Call this after a render completes with the operation label,
109
+ * elapsed time, and current DOM node count.
110
+ */
111
+ export declare function recordRender(label: string, durationMs: number, nodeCountAfter: number): void;
112
+ /**
113
+ * Record a before/after update comparison.
114
+ *
115
+ * Call this after a tree operation completes to capture the
116
+ * DOM node delta, timing, and memory change.
117
+ */
118
+ export declare function recordUpdate(label: string, durationMs: number, nodesBefore: number, nodesAfter: number, memoryBefore?: number, memoryAfter?: number): void;
119
+ /**
120
+ * Measure a tree operation end-to-end.
121
+ *
122
+ * Captures DOM node count and memory before/after executing `fn`,
123
+ * records the comparison, and returns the function's result.
124
+ *
125
+ * The container must be set via `startDOMPerformanceMonitor` or
126
+ * `setObservedContainer` before calling this function.
127
+ */
128
+ export declare function measureOperation<T>(label: string, fn: () => T): T;
129
+ /** Take a DOM performance snapshot of the observed container. */
130
+ export declare function takeDOMSnapshot(): DOMNodeSnapshot | null;
131
+ /** Compute an aggregate performance summary from collected metrics. */
132
+ export declare function computeSummary(): PerformanceSummary;
133
+ /** Subscribe to every new DOM snapshot. Returns an unsubscribe function. */
134
+ export declare function onDOMSnapshot(listener: DOMSnapshotHandler): () => void;
135
+ /** Set the container element to observe for DOM metrics. */
136
+ export declare function setObservedContainer(container: Element | null): void;
137
+ /**
138
+ * Start the DOM performance monitor.
139
+ *
140
+ * Begins periodic DOM node counting on the specified container.
141
+ * Safe to call multiple times — restarts with new config if already running.
142
+ */
143
+ export declare function startDOMPerformanceMonitor(container: Element, overrides?: Partial<DOMPerformanceConfig>): void;
144
+ /** Stop the DOM performance monitor and clean up polling. */
145
+ export declare function stopDOMPerformanceMonitor(): void;
146
+ /** Get the most recent DOM snapshot, or null if not yet taken. */
147
+ export declare function getLatestDOMSnapshot(): DOMNodeSnapshot | null;
148
+ /** Get the DOM snapshot history (bounded ring buffer). */
149
+ export declare function getDOMSnapshotHistory(): readonly DOMNodeSnapshot[];
150
+ /** Get all recorded render timings (bounded ring buffer). */
151
+ export declare function getRenderTimings(): readonly RenderTiming[];
152
+ /** Get all recorded update comparisons (bounded ring buffer). */
153
+ export declare function getUpdateComparisons(): readonly UpdateComparison[];
154
+ /** Get the currently observed container element, or null. */
155
+ export declare function getObservedContainer(): Element | null;
156
+ /** Reset all module state (for testing). */
157
+ export declare function resetDOMPerformanceMonitor(): void;
@@ -0,0 +1,341 @@
1
+ /**
2
+ * DOM performance monitoring for tree components.
3
+ *
4
+ * Tracks active DOM node counts, render/update timing, and memory usage
5
+ * for tree operations. Provides before/after comparison data for measuring
6
+ * the impact of DOM optimizations (progressive loading, node culling, etc.).
7
+ *
8
+ * Designed as a standalone module with zero framework dependencies —
9
+ * the Preact hook (`useDOMPerformanceMonitor`) is provided separately.
10
+ *
11
+ * @see ./memory-monitor.ts — complementary heap-level memory monitoring
12
+ * @see ./components/progressive-loader.ts — progressive load integration
13
+ */
14
+ import { registerPollingSource, } from "../polling/index.js";
15
+ // ─── Constants ───────────────────────────────────────────────────────────────
16
+ const DEFAULT_INTERVAL_MS = 2000;
17
+ const DEFAULT_MAX_SNAPSHOTS = 120;
18
+ const DEFAULT_MAX_TIMINGS = 200;
19
+ const DEFAULT_MAX_COMPARISONS = 100;
20
+ /** Key used to register with the centralized polling state manager. */
21
+ const POLLING_STATE_KEY = "dom-performance-monitor";
22
+ // ─── Module state ────────────────────────────────────────────────────────────
23
+ let config = {
24
+ intervalMs: DEFAULT_INTERVAL_MS,
25
+ maxSnapshots: DEFAULT_MAX_SNAPSHOTS,
26
+ maxTimings: DEFAULT_MAX_TIMINGS,
27
+ maxComparisons: DEFAULT_MAX_COMPARISONS,
28
+ };
29
+ let pollTimer = null;
30
+ let stateUnsub = null;
31
+ let observedContainer = null;
32
+ let latestSnapshot = null;
33
+ let snapshotHistory = [];
34
+ let renderTimings = [];
35
+ let updateComparisons = [];
36
+ let snapshotListeners = [];
37
+ // ─── DOM counting ────────────────────────────────────────────────────────────
38
+ /**
39
+ * Count all DOM nodes within a container element.
40
+ *
41
+ * Walks the subtree using a non-recursive stack to avoid
42
+ * stack overflow on very deep trees. Returns counts for
43
+ * total nodes, element-only nodes, and tree items.
44
+ */
45
+ export function countDOMNodes(container) {
46
+ let totalNodes = 0;
47
+ let elementNodes = 0;
48
+ let treeItemCount = 0;
49
+ let maxDepth = 0;
50
+ // Non-recursive DFS using an explicit stack: [node, depth]
51
+ const stack = [[container, 0]];
52
+ while (stack.length > 0) {
53
+ const [node, depth] = stack.pop();
54
+ totalNodes++;
55
+ if (depth > maxDepth) {
56
+ maxDepth = depth;
57
+ }
58
+ if (node.nodeType === Node.ELEMENT_NODE) {
59
+ elementNodes++;
60
+ const el = node;
61
+ if (el.getAttribute("role") === "treeitem") {
62
+ treeItemCount++;
63
+ }
64
+ }
65
+ // Push children in reverse so the first child is processed first
66
+ const children = node.childNodes;
67
+ for (let i = children.length - 1; i >= 0; i--) {
68
+ stack.push([children[i], depth + 1]);
69
+ }
70
+ }
71
+ return {
72
+ totalNodes,
73
+ elementNodes,
74
+ treeItemCount,
75
+ maxDepth,
76
+ timestamp: new Date().toISOString(),
77
+ };
78
+ }
79
+ // ─── Memory reading ──────────────────────────────────────────────────────────
80
+ /** Read current JS heap usage in bytes, or -1 if unavailable. */
81
+ export function readHeapUsage() {
82
+ const perf = performance;
83
+ if (perf.memory && typeof perf.memory.usedJSHeapSize === "number") {
84
+ return perf.memory.usedJSHeapSize;
85
+ }
86
+ return -1;
87
+ }
88
+ // ─── Formatting ──────────────────────────────────────────────────────────────
89
+ /** Format a duration in milliseconds (e.g. "12.3 ms"). */
90
+ export function formatDuration(ms) {
91
+ if (ms < 0)
92
+ return "N/A";
93
+ if (ms < 1)
94
+ return `${(ms * 1000).toFixed(0)} µs`;
95
+ if (ms < 1000)
96
+ return `${ms.toFixed(1)} ms`;
97
+ return `${(ms / 1000).toFixed(2)} s`;
98
+ }
99
+ /** Format a node count with thousands separator. */
100
+ export function formatNodeCount(count) {
101
+ if (count < 0)
102
+ return "N/A";
103
+ return count.toLocaleString("en-US");
104
+ }
105
+ /** Format a delta with sign prefix (e.g. "+42" or "−18"). */
106
+ export function formatDelta(delta) {
107
+ if (delta > 0)
108
+ return `+${delta.toLocaleString("en-US")}`;
109
+ if (delta < 0)
110
+ return `−${Math.abs(delta).toLocaleString("en-US")}`;
111
+ return "0";
112
+ }
113
+ // ─── Recording operations ────────────────────────────────────────────────────
114
+ /**
115
+ * Record a render timing measurement.
116
+ *
117
+ * Call this after a render completes with the operation label,
118
+ * elapsed time, and current DOM node count.
119
+ */
120
+ export function recordRender(label, durationMs, nodeCountAfter) {
121
+ const timing = {
122
+ label,
123
+ durationMs,
124
+ nodeCountAfter,
125
+ timestamp: new Date().toISOString(),
126
+ };
127
+ renderTimings.push(timing);
128
+ if (renderTimings.length > config.maxTimings) {
129
+ renderTimings = renderTimings.slice(-config.maxTimings);
130
+ }
131
+ }
132
+ /**
133
+ * Record a before/after update comparison.
134
+ *
135
+ * Call this after a tree operation completes to capture the
136
+ * DOM node delta, timing, and memory change.
137
+ */
138
+ export function recordUpdate(label, durationMs, nodesBefore, nodesAfter, memoryBefore = -1, memoryAfter = -1) {
139
+ const comparison = {
140
+ label,
141
+ nodesBefore,
142
+ nodesAfter,
143
+ nodeDelta: nodesAfter - nodesBefore,
144
+ durationMs,
145
+ memoryBefore,
146
+ memoryAfter,
147
+ memoryDelta: memoryBefore >= 0 && memoryAfter >= 0
148
+ ? memoryAfter - memoryBefore
149
+ : -1,
150
+ timestamp: new Date().toISOString(),
151
+ };
152
+ updateComparisons.push(comparison);
153
+ if (updateComparisons.length > config.maxComparisons) {
154
+ updateComparisons = updateComparisons.slice(-config.maxComparisons);
155
+ }
156
+ }
157
+ /**
158
+ * Measure a tree operation end-to-end.
159
+ *
160
+ * Captures DOM node count and memory before/after executing `fn`,
161
+ * records the comparison, and returns the function's result.
162
+ *
163
+ * The container must be set via `startDOMPerformanceMonitor` or
164
+ * `setObservedContainer` before calling this function.
165
+ */
166
+ export function measureOperation(label, fn) {
167
+ const container = observedContainer;
168
+ const memBefore = readHeapUsage();
169
+ const nodesBefore = container ? countDOMNodes(container).totalNodes : -1;
170
+ const start = performance.now();
171
+ const result = fn();
172
+ const elapsed = performance.now() - start;
173
+ const nodesAfter = container ? countDOMNodes(container).totalNodes : -1;
174
+ const memAfter = readHeapUsage();
175
+ if (nodesBefore >= 0 && nodesAfter >= 0) {
176
+ recordUpdate(label, elapsed, nodesBefore, nodesAfter, memBefore, memAfter);
177
+ }
178
+ recordRender(label, elapsed, nodesAfter >= 0 ? nodesAfter : 0);
179
+ return result;
180
+ }
181
+ // ─── Snapshot ────────────────────────────────────────────────────────────────
182
+ /** Take a DOM performance snapshot of the observed container. */
183
+ export function takeDOMSnapshot() {
184
+ if (!observedContainer)
185
+ return null;
186
+ return countDOMNodes(observedContainer);
187
+ }
188
+ // ─── Summary ─────────────────────────────────────────────────────────────────
189
+ /** Compute an aggregate performance summary from collected metrics. */
190
+ export function computeSummary() {
191
+ const timings = renderTimings;
192
+ const snapshots = snapshotHistory;
193
+ let avgRenderMs = 0;
194
+ let peakRenderMs = 0;
195
+ if (timings.length > 0) {
196
+ let sum = 0;
197
+ for (const t of timings) {
198
+ sum += t.durationMs;
199
+ if (t.durationMs > peakRenderMs)
200
+ peakRenderMs = t.durationMs;
201
+ }
202
+ avgRenderMs = sum / timings.length;
203
+ }
204
+ let avgNodeCount = 0;
205
+ let peakNodeCount = 0;
206
+ if (snapshots.length > 0) {
207
+ let sum = 0;
208
+ for (const s of snapshots) {
209
+ sum += s.totalNodes;
210
+ if (s.totalNodes > peakNodeCount)
211
+ peakNodeCount = s.totalNodes;
212
+ }
213
+ avgNodeCount = sum / snapshots.length;
214
+ }
215
+ return {
216
+ avgRenderMs,
217
+ peakRenderMs,
218
+ avgNodeCount,
219
+ peakNodeCount,
220
+ renderCount: timings.length,
221
+ updateCount: updateComparisons.length,
222
+ snapshotCount: snapshots.length,
223
+ };
224
+ }
225
+ // ─── Monitor lifecycle ───────────────────────────────────────────────────────
226
+ /** Subscribe to every new DOM snapshot. Returns an unsubscribe function. */
227
+ export function onDOMSnapshot(listener) {
228
+ snapshotListeners.push(listener);
229
+ return () => {
230
+ snapshotListeners = snapshotListeners.filter((l) => l !== listener);
231
+ };
232
+ }
233
+ function notifyListeners(snapshot) {
234
+ for (const listener of snapshotListeners) {
235
+ listener(snapshot);
236
+ }
237
+ }
238
+ function poll() {
239
+ const snapshot = takeDOMSnapshot();
240
+ if (!snapshot)
241
+ return;
242
+ latestSnapshot = snapshot;
243
+ snapshotHistory.push(snapshot);
244
+ if (snapshotHistory.length > config.maxSnapshots) {
245
+ snapshotHistory = snapshotHistory.slice(-config.maxSnapshots);
246
+ }
247
+ notifyListeners(snapshot);
248
+ }
249
+ /** Set the container element to observe for DOM metrics. */
250
+ export function setObservedContainer(container) {
251
+ observedContainer = container;
252
+ }
253
+ /**
254
+ * Start the DOM performance monitor.
255
+ *
256
+ * Begins periodic DOM node counting on the specified container.
257
+ * Safe to call multiple times — restarts with new config if already running.
258
+ */
259
+ export function startDOMPerformanceMonitor(container, overrides = {}) {
260
+ stopDOMPerformanceMonitor();
261
+ observedContainer = container;
262
+ config = {
263
+ intervalMs: overrides.intervalMs ?? DEFAULT_INTERVAL_MS,
264
+ maxSnapshots: overrides.maxSnapshots ?? DEFAULT_MAX_SNAPSHOTS,
265
+ maxTimings: overrides.maxTimings ?? DEFAULT_MAX_TIMINGS,
266
+ maxComparisons: overrides.maxComparisons ?? DEFAULT_MAX_COMPARISONS,
267
+ };
268
+ // Take an immediate snapshot on start.
269
+ poll();
270
+ pollTimer = setInterval(poll, config.intervalMs);
271
+ // Register with centralized polling state for coordinated lifecycle.
272
+ stateUnsub = registerPollingSource(POLLING_STATE_KEY, {
273
+ suspend: () => stopPollTimer(),
274
+ resume: () => {
275
+ if (pollTimer === null && observedContainer) {
276
+ pollTimer = setInterval(poll, config.intervalMs);
277
+ }
278
+ },
279
+ dispose: () => {
280
+ stopPollTimer();
281
+ stateUnsub = null;
282
+ },
283
+ getStatus: () => (pollTimer !== null ? "active" : "idle"),
284
+ });
285
+ }
286
+ /** Stop the poll interval timer without touching polling-state registration. */
287
+ function stopPollTimer() {
288
+ if (pollTimer) {
289
+ clearInterval(pollTimer);
290
+ pollTimer = null;
291
+ }
292
+ }
293
+ /** Stop the DOM performance monitor and clean up polling. */
294
+ export function stopDOMPerformanceMonitor() {
295
+ stopPollTimer();
296
+ // Deregister from centralized polling state. Nullify first to
297
+ // prevent re-entrant dispose.
298
+ if (stateUnsub) {
299
+ const unsub = stateUnsub;
300
+ stateUnsub = null;
301
+ unsub();
302
+ }
303
+ }
304
+ /** Get the most recent DOM snapshot, or null if not yet taken. */
305
+ export function getLatestDOMSnapshot() {
306
+ return latestSnapshot;
307
+ }
308
+ /** Get the DOM snapshot history (bounded ring buffer). */
309
+ export function getDOMSnapshotHistory() {
310
+ return snapshotHistory;
311
+ }
312
+ /** Get all recorded render timings (bounded ring buffer). */
313
+ export function getRenderTimings() {
314
+ return renderTimings;
315
+ }
316
+ /** Get all recorded update comparisons (bounded ring buffer). */
317
+ export function getUpdateComparisons() {
318
+ return updateComparisons;
319
+ }
320
+ /** Get the currently observed container element, or null. */
321
+ export function getObservedContainer() {
322
+ return observedContainer;
323
+ }
324
+ /** Reset all module state (for testing). */
325
+ export function resetDOMPerformanceMonitor() {
326
+ stopDOMPerformanceMonitor();
327
+ observedContainer = null;
328
+ stateUnsub = null;
329
+ latestSnapshot = null;
330
+ snapshotHistory = [];
331
+ renderTimings = [];
332
+ updateComparisons = [];
333
+ snapshotListeners = [];
334
+ config = {
335
+ intervalMs: DEFAULT_INTERVAL_MS,
336
+ maxSnapshots: DEFAULT_MAX_SNAPSHOTS,
337
+ maxTimings: DEFAULT_MAX_TIMINGS,
338
+ maxComparisons: DEFAULT_MAX_COMPARISONS,
339
+ };
340
+ }
341
+ //# sourceMappingURL=dom-performance-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-performance-monitor.js","sourceRoot":"","sources":["../../../src/viewer/performance/dom-performance-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqFH,OAAO,EACL,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAc7B,gFAAgF;AAEhF,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,uEAAuE;AACvE,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD,gFAAgF;AAEhF,IAAI,MAAM,GAAyB;IACjC,UAAU,EAAE,mBAAmB;IAC/B,YAAY,EAAE,qBAAqB;IACnC,UAAU,EAAE,mBAAmB;IAC/B,cAAc,EAAE,uBAAuB;CACxC,CAAC;AAEF,IAAI,SAAS,GAA0C,IAAI,CAAC;AAC5D,IAAI,UAAU,GAAwB,IAAI,CAAC;AAC3C,IAAI,iBAAiB,GAAmB,IAAI,CAAC;AAC7C,IAAI,cAAc,GAA2B,IAAI,CAAC;AAClD,IAAI,eAAe,GAAsB,EAAE,CAAC;AAC5C,IAAI,aAAa,GAAmB,EAAE,CAAC;AACvC,IAAI,iBAAiB,GAAuB,EAAE,CAAC;AAC/C,IAAI,iBAAiB,GAAyB,EAAE,CAAC;AAEjD,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC9C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,2DAA2D;IAC3D,MAAM,KAAK,GAA0B,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACnC,UAAU,EAAE,CAAC;QAEb,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,IAAe,CAAC;YAC3B,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;gBAC3C,aAAa,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,YAAY;QACZ,aAAa;QACb,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,iEAAiE;AACjE,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,WAAoC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,gFAAgF;AAEhF,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IACpE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,UAAkB,EAClB,cAAsB;IAEtB,MAAM,MAAM,GAAiB;QAC3B,KAAK;QACL,UAAU;QACV,cAAc;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,UAAkB,EAClB,WAAmB,EACnB,UAAkB,EAClB,eAAuB,CAAC,CAAC,EACzB,cAAsB,CAAC,CAAC;IAExB,MAAM,UAAU,GAAqB;QACnC,KAAK;QACL,WAAW;QACX,UAAU;QACV,SAAS,EAAE,UAAU,GAAG,WAAW;QACnC,UAAU;QACV,YAAY;QACZ,WAAW;QACX,WAAW,EAAE,YAAY,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC;YAChD,CAAC,CAAC,WAAW,GAAG,YAAY;YAC5B,CAAC,CAAC,CAAC,CAAC;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACrD,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAI,KAAa,EAAE,EAAW;IAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC;IACpC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEhC,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;IAEpB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IAEjC,IAAI,WAAW,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACxC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IACD,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAEhF,iEAAiE;AACjE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC;AAED,gFAAgF;AAEhF,uEAAuE;AACvE,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,aAAa,CAAC;IAC9B,MAAM,SAAS,GAAG,eAAe,CAAC;IAElC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;YACpB,IAAI,CAAC,CAAC,UAAU,GAAG,YAAY;gBAAE,YAAY,GAAG,CAAC,CAAC,UAAU,CAAC;QAC/D,CAAC;QACD,WAAW,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACrC,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;YACpB,IAAI,CAAC,CAAC,UAAU,GAAG,aAAa;gBAAE,aAAa,GAAG,CAAC,CAAC,UAAU,CAAC;QACjE,CAAC;QACD,YAAY,GAAG,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,OAAO;QACL,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,aAAa;QACb,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,WAAW,EAAE,iBAAiB,CAAC,MAAM;QACrC,aAAa,EAAE,SAAS,CAAC,MAAM;KAChC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,QAA4B;IACxD,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,GAAG,EAAE;QACV,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IACtE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAyB;IAChD,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QACzC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,IAAI;IACX,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,cAAc,GAAG,QAAQ,CAAC;IAE1B,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACjD,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC;IAED,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,oBAAoB,CAAC,SAAyB;IAC5D,iBAAiB,GAAG,SAAS,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAkB,EAClB,YAA2C,EAAE;IAE7C,yBAAyB,EAAE,CAAC;IAE5B,iBAAiB,GAAG,SAAS,CAAC;IAC9B,MAAM,GAAG;QACP,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,mBAAmB;QACvD,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,qBAAqB;QAC7D,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,mBAAmB;QACvD,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,uBAAuB;KACpE,CAAC;IAEF,uCAAuC;IACvC,IAAI,EAAE,CAAC;IAEP,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAEjD,qEAAqE;IACrE,UAAU,GAAG,qBAAqB,CAChC,iBAAiB,EACjB;QACE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE;QAC9B,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,SAAS,KAAK,IAAI,IAAI,iBAAiB,EAAE,CAAC;gBAC5C,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,aAAa,EAAE,CAAC;YAChB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;KAC1D,CACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,aAAa;IACpB,IAAI,SAAS,EAAE,CAAC;QACd,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,yBAAyB;IACvC,aAAa,EAAE,CAAC;IAEhB,8DAA8D;IAC9D,8BAA8B;IAC9B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;QAClB,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,oBAAoB;IAClC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,qBAAqB;IACnC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,oBAAoB;IAClC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,oBAAoB;IAClC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,0BAA0B;IACxC,yBAAyB,EAAE,CAAC;IAC5B,iBAAiB,GAAG,IAAI,CAAC;IACzB,UAAU,GAAG,IAAI,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;IACtB,eAAe,GAAG,EAAE,CAAC;IACrB,aAAa,GAAG,EAAE,CAAC;IACnB,iBAAiB,GAAG,EAAE,CAAC;IACvB,iBAAiB,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG;QACP,UAAU,EAAE,mBAAmB;QAC/B,YAAY,EAAE,qBAAqB;QACnC,UAAU,EAAE,mBAAmB;QAC/B,cAAc,EAAE,uBAAuB;KACxC,CAAC;AACJ,CAAC"}