@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,122 @@
1
+ /**
2
+ * DOM update gate — prevents state updates and re-renders during tab inactivity.
3
+ *
4
+ * Wraps an UpdateBatcher to intercept `schedule()` calls when the tab is hidden.
5
+ * Instead of creating RAF callbacks in background tabs (which still fire at
6
+ * reduced frequency, wasting CPU and triggering unnecessary re-renders), the
7
+ * gate queues all pending updaters per-setter and replays them in a single
8
+ * batch when the tab becomes visible again.
9
+ *
10
+ * Pipeline position:
11
+ *
12
+ * ... → coalescer.onMessage → **dom-update-gate**.schedule() → batcher → RAF → render
13
+ *
14
+ * When visible: schedule() → batcher.schedule() (normal flow)
15
+ * When hidden: schedule() → internal queue (no RAF, no render)
16
+ * On resume: internal queue → batcher → flush → single render
17
+ *
18
+ * Lifecycle:
19
+ *
20
+ * Tab goes hidden:
21
+ * 1. Flush the underlying batcher (apply any pending updates immediately
22
+ * so state is consistent up to the point of suspension).
23
+ * 2. Switch to queuing mode — all future schedule() calls are captured
24
+ * in an internal per-setter queue.
25
+ *
26
+ * Tab becomes visible (after resume debounce):
27
+ * 1. Replay all queued updaters through the batcher (preserving
28
+ * per-setter composition order).
29
+ * 2. Immediately flush the batcher to apply them in one RAF frame.
30
+ * 3. Call onResume if any updates were deferred.
31
+ *
32
+ * This module complements the response-buffer-gate (which drops WebSocket
33
+ * messages during suspension) by also gating the DOM update pathway. Without
34
+ * this, polling callbacks, optimistic updates, or any late-arriving schedule()
35
+ * calls would still trigger RAF and re-renders in background tabs.
36
+ *
37
+ * Designed as a standalone module with zero framework dependencies.
38
+ * The Preact integration lives in the consumer (views/prd.ts etc.).
39
+ */
40
+ import type { UpdateBatcher } from "./update-batcher.js";
41
+ /** Configuration for the DOM update gate. */
42
+ export interface DomUpdateGateConfig {
43
+ /**
44
+ * The underlying batcher to delegate to when the gate is open.
45
+ * The gate does NOT own this batcher — the caller is responsible
46
+ * for disposal of the batcher separately.
47
+ */
48
+ batcher: UpdateBatcher;
49
+ /**
50
+ * Called when the gate re-opens after suspension, but only if updates
51
+ * were deferred while the gate was closed. Use this to trigger any
52
+ * additional reconciliation work needed after deferred updates are applied.
53
+ *
54
+ * Optional — most consumers rely on the deferred updates themselves.
55
+ */
56
+ onResume?: (() => void) | undefined;
57
+ /**
58
+ * Debounce delay in milliseconds before re-opening the gate after the
59
+ * tab becomes visible. Prevents thrashing on rapid tab switches.
60
+ * Default: 100ms (matches polling-manager and buffer-gate debounce).
61
+ */
62
+ resumeDebounceMs?: number | undefined;
63
+ }
64
+ /** Read-only snapshot of the gate's current state. */
65
+ export interface DomUpdateGateSnapshot {
66
+ /** Whether the gate is currently open (delegating to the batcher). */
67
+ readonly isOpen: boolean;
68
+ /** Number of updaters queued during the current or most recent suspension. */
69
+ readonly queuedCount: number;
70
+ /** Total updaters deferred across all suspensions since creation. */
71
+ readonly totalDeferred: number;
72
+ /** Number of times the gate has been suspended. */
73
+ readonly suspensionCount: number;
74
+ }
75
+ /** A DOM update gate instance. Extends UpdateBatcher with visibility gating. */
76
+ export interface DomUpdateGate {
77
+ /**
78
+ * Schedule a state update.
79
+ *
80
+ * When the gate is open (tab visible): delegates to the underlying batcher.
81
+ * When the gate is closed (tab hidden): queues the updater internally.
82
+ * Multiple updates for the same setter are composed in order on replay.
83
+ */
84
+ schedule<T>(setter: (updater: (prev: T) => T) => void, updater: (prev: T) => T): void;
85
+ /**
86
+ * Force-flush all pending updates synchronously.
87
+ *
88
+ * When the gate is open: flushes the underlying batcher.
89
+ * When the gate is closed: composes queued updaters per-setter and applies
90
+ * them directly (bypassing the batcher), then flushes the batcher.
91
+ */
92
+ flush(): void;
93
+ /** Whether updates are pending (in the batcher or in the deferred queue). */
94
+ hasPending(): boolean;
95
+ /** Whether the gate is currently open (tab visible, accepting updates). */
96
+ isOpen(): boolean;
97
+ /** Get a snapshot of the gate's current state. */
98
+ getSnapshot(): DomUpdateGateSnapshot;
99
+ /** Dispose: unsubscribe from visibility events, clear queue, clear timers. */
100
+ dispose(): void;
101
+ }
102
+ /**
103
+ * Create a new DOM update gate.
104
+ *
105
+ * Usage:
106
+ * ```ts
107
+ * const batcher = createUpdateBatcher();
108
+ * const gate = createDomUpdateGate({ batcher });
109
+ *
110
+ * // Use gate.schedule() instead of batcher.schedule()
111
+ * coalescer.onMessage = (msg) => {
112
+ * if (msg.type === "rex:item-updated") {
113
+ * gate.schedule(setData, (prev) => applyItemUpdate(prev, msg));
114
+ * }
115
+ * };
116
+ *
117
+ * // On component unmount:
118
+ * gate.dispose();
119
+ * batcher.dispose();
120
+ * ```
121
+ */
122
+ export declare function createDomUpdateGate(config: DomUpdateGateConfig): DomUpdateGate;
@@ -0,0 +1,229 @@
1
+ /**
2
+ * DOM update gate — prevents state updates and re-renders during tab inactivity.
3
+ *
4
+ * Wraps an UpdateBatcher to intercept `schedule()` calls when the tab is hidden.
5
+ * Instead of creating RAF callbacks in background tabs (which still fire at
6
+ * reduced frequency, wasting CPU and triggering unnecessary re-renders), the
7
+ * gate queues all pending updaters per-setter and replays them in a single
8
+ * batch when the tab becomes visible again.
9
+ *
10
+ * Pipeline position:
11
+ *
12
+ * ... → coalescer.onMessage → **dom-update-gate**.schedule() → batcher → RAF → render
13
+ *
14
+ * When visible: schedule() → batcher.schedule() (normal flow)
15
+ * When hidden: schedule() → internal queue (no RAF, no render)
16
+ * On resume: internal queue → batcher → flush → single render
17
+ *
18
+ * Lifecycle:
19
+ *
20
+ * Tab goes hidden:
21
+ * 1. Flush the underlying batcher (apply any pending updates immediately
22
+ * so state is consistent up to the point of suspension).
23
+ * 2. Switch to queuing mode — all future schedule() calls are captured
24
+ * in an internal per-setter queue.
25
+ *
26
+ * Tab becomes visible (after resume debounce):
27
+ * 1. Replay all queued updaters through the batcher (preserving
28
+ * per-setter composition order).
29
+ * 2. Immediately flush the batcher to apply them in one RAF frame.
30
+ * 3. Call onResume if any updates were deferred.
31
+ *
32
+ * This module complements the response-buffer-gate (which drops WebSocket
33
+ * messages during suspension) by also gating the DOM update pathway. Without
34
+ * this, polling callbacks, optimistic updates, or any late-arriving schedule()
35
+ * calls would still trigger RAF and re-renders in background tabs.
36
+ *
37
+ * Designed as a standalone module with zero framework dependencies.
38
+ * The Preact integration lives in the consumer (views/prd.ts etc.).
39
+ */
40
+ import { onVisibilityChange, isTabVisible, } from "../polling/index.js";
41
+ // ─── Constants ───────────────────────────────────────────────────────────────
42
+ const DEFAULT_RESUME_DEBOUNCE_MS = 100;
43
+ // ─── Factory ─────────────────────────────────────────────────────────────────
44
+ /**
45
+ * Create a new DOM update gate.
46
+ *
47
+ * Usage:
48
+ * ```ts
49
+ * const batcher = createUpdateBatcher();
50
+ * const gate = createDomUpdateGate({ batcher });
51
+ *
52
+ * // Use gate.schedule() instead of batcher.schedule()
53
+ * coalescer.onMessage = (msg) => {
54
+ * if (msg.type === "rex:item-updated") {
55
+ * gate.schedule(setData, (prev) => applyItemUpdate(prev, msg));
56
+ * }
57
+ * };
58
+ *
59
+ * // On component unmount:
60
+ * gate.dispose();
61
+ * batcher.dispose();
62
+ * ```
63
+ */
64
+ export function createDomUpdateGate(config) {
65
+ const batcher = config.batcher;
66
+ const onResume = config.onResume;
67
+ const resumeDebounceMs = config.resumeDebounceMs ?? DEFAULT_RESUME_DEBOUNCE_MS;
68
+ let open = true;
69
+ let deferredQueue = new Map();
70
+ let queuedCount = 0;
71
+ let totalDeferred = 0;
72
+ let suspensionCount = 0;
73
+ let resumeTimer = null;
74
+ let disposed = false;
75
+ // ─── Internal helpers ─────────────────────────────────────────────
76
+ function clearResumeTimer() {
77
+ if (resumeTimer !== null) {
78
+ clearTimeout(resumeTimer);
79
+ resumeTimer = null;
80
+ }
81
+ }
82
+ /**
83
+ * Compose all queued updaters for a single setter into one function call.
84
+ * Each updater receives the output of the previous — identical to
85
+ * sequential application, just like the update-batcher's composition.
86
+ */
87
+ function composeUpdaters(updaters) {
88
+ return (prev) => {
89
+ let current = prev;
90
+ for (const updater of updaters) {
91
+ current = updater(current);
92
+ }
93
+ return current;
94
+ };
95
+ }
96
+ /**
97
+ * Replay all queued updates through the batcher, then flush.
98
+ * This ensures all deferred updates are applied in a single synchronous
99
+ * block, producing exactly one re-render per setter.
100
+ */
101
+ function replayQueue() {
102
+ const entries = deferredQueue;
103
+ const hadDeferred = entries.size > 0;
104
+ deferredQueue = new Map();
105
+ queuedCount = 0;
106
+ // Replay each setter's accumulated updaters through the batcher.
107
+ for (const entry of entries.values()) {
108
+ batcher.schedule(entry.setter, composeUpdaters(entry.updaters));
109
+ }
110
+ // Flush immediately to apply in one synchronous block.
111
+ if (hadDeferred) {
112
+ batcher.flush();
113
+ }
114
+ // Notify consumer that deferred updates were applied.
115
+ if (hadDeferred && onResume) {
116
+ try {
117
+ onResume();
118
+ }
119
+ catch {
120
+ // Swallow errors from the resume callback.
121
+ }
122
+ }
123
+ }
124
+ /** Close the gate: flush the batcher and switch to queuing mode. */
125
+ function suspend() {
126
+ if (!open)
127
+ return;
128
+ open = false;
129
+ queuedCount = 0;
130
+ suspensionCount++;
131
+ // Flush the underlying batcher so any pending updates are applied
132
+ // before we go into suspension. This ensures state is consistent
133
+ // up to the point of the tab going hidden.
134
+ batcher.flush();
135
+ }
136
+ /** Re-open the gate and replay any deferred updates. */
137
+ function resume() {
138
+ if (open)
139
+ return;
140
+ open = true;
141
+ replayQueue();
142
+ }
143
+ function handleVisibilityChange(snapshot) {
144
+ if (disposed)
145
+ return;
146
+ if (snapshot.isVisible) {
147
+ // Tab became visible — resume with debounce to prevent thrash.
148
+ clearResumeTimer();
149
+ resumeTimer = setTimeout(() => {
150
+ resumeTimer = null;
151
+ resume();
152
+ }, resumeDebounceMs);
153
+ }
154
+ else {
155
+ // Tab became hidden — suspend immediately.
156
+ clearResumeTimer();
157
+ suspend();
158
+ }
159
+ }
160
+ // Subscribe to tab visibility changes.
161
+ const unsubVisibility = onVisibilityChange(handleVisibilityChange);
162
+ // If the tab is currently hidden, suspend immediately.
163
+ if (!isTabVisible()) {
164
+ suspend();
165
+ }
166
+ // ─── Public methods ─────────────────────────────────────────────────
167
+ function schedule(setter, updater) {
168
+ if (disposed)
169
+ return;
170
+ if (open) {
171
+ // Gate is open — delegate to the batcher (normal flow).
172
+ batcher.schedule(setter, updater);
173
+ return;
174
+ }
175
+ // Gate is closed — queue the updater for replay on resume.
176
+ const key = setter;
177
+ let entry = deferredQueue.get(key);
178
+ if (!entry) {
179
+ entry = { setter: key, updaters: [] };
180
+ deferredQueue.set(key, entry);
181
+ }
182
+ entry.updaters.push(updater);
183
+ queuedCount++;
184
+ totalDeferred++;
185
+ }
186
+ function flush() {
187
+ if (disposed)
188
+ return;
189
+ if (open) {
190
+ // Gate is open — just flush the batcher.
191
+ batcher.flush();
192
+ return;
193
+ }
194
+ // Gate is closed — compose queued updaters per-setter and apply
195
+ // them directly, bypassing the batcher (since we don't want to
196
+ // schedule RAF in a background tab).
197
+ const entries = deferredQueue;
198
+ deferredQueue = new Map();
199
+ queuedCount = 0;
200
+ for (const entry of entries.values()) {
201
+ entry.setter(composeUpdaters(entry.updaters));
202
+ }
203
+ // Also flush the batcher in case it has anything pending.
204
+ batcher.flush();
205
+ }
206
+ function hasPending() {
207
+ return deferredQueue.size > 0 || batcher.hasPending();
208
+ }
209
+ function isOpenFn() {
210
+ return open;
211
+ }
212
+ function getSnapshot() {
213
+ return {
214
+ isOpen: open,
215
+ queuedCount,
216
+ totalDeferred,
217
+ suspensionCount,
218
+ };
219
+ }
220
+ function dispose() {
221
+ disposed = true;
222
+ clearResumeTimer();
223
+ unsubVisibility();
224
+ deferredQueue = new Map();
225
+ queuedCount = 0;
226
+ }
227
+ return { schedule, flush, hasPending, isOpen: isOpenFn, getSnapshot, dispose };
228
+ }
229
+ //# sourceMappingURL=dom-update-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-update-gate.js","sourceRoot":"","sources":["../../../src/viewer/performance/dom-update-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EACL,kBAAkB,EAClB,YAAY,GAEb,MAAM,qBAAqB,CAAC;AA0F7B,gFAAgF;AAEhF,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAE/E,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,WAAW,GAAyC,IAAI,CAAC;IAC7D,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,qEAAqE;IAErE,SAAS,gBAAgB;QACvB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,YAAY,CAAC,WAAW,CAAC,CAAC;YAC1B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,SAAS,eAAe,CAAC,QAAsB;QAC7C,OAAO,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,WAAW;QAClB,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QAErC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,WAAW,GAAG,CAAC,CAAC;QAEhB,iEAAiE;QACjE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,uDAAuD;QACvD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAED,sDAAsD;QACtD,IAAI,WAAW,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,SAAS,OAAO;QACd,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,GAAG,KAAK,CAAC;QACb,WAAW,GAAG,CAAC,CAAC;QAChB,eAAe,EAAE,CAAC;QAElB,kEAAkE;QAClE,iEAAiE;QACjE,2CAA2C;QAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,wDAAwD;IACxD,SAAS,MAAM;QACb,IAAI,IAAI;YAAE,OAAO;QAEjB,IAAI,GAAG,IAAI,CAAC;QACZ,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,SAAS,sBAAsB,CAAC,QAA+B;QAC7D,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,+DAA+D;YAC/D,gBAAgB,EAAE,CAAC;YACnB,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM,EAAE,CAAC;YACX,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,gBAAgB,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,eAAe,GAAG,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAEnE,uDAAuD;IACvD,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,uEAAuE;IAEvE,SAAS,QAAQ,CACf,MAAyC,EACzC,OAAuB;QAEvB,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,IAAI,EAAE,CAAC;YACT,wDAAwD;YACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,2DAA2D;QAC3D,MAAM,GAAG,GAAG,MAAmB,CAAC;QAChC,IAAI,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YACtC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAqB,CAAC,CAAC;QAC3C,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,SAAS,KAAK;QACZ,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,IAAI,EAAE,CAAC;YACT,yCAAyC;YACzC,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,gEAAgE;QAChE,+DAA+D;QAC/D,qCAAqC;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,WAAW,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,0DAA0D;QAC1D,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,SAAS,UAAU;QACjB,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IACxD,CAAC;IAED,SAAS,QAAQ;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,WAAW;QAClB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,WAAW;YACX,aAAa;YACb,eAAe;SAChB,CAAC;IACJ,CAAC;IAED,SAAS,OAAO;QACd,QAAQ,GAAG,IAAI,CAAC;QAChB,gBAAgB,EAAE,CAAC;QACnB,eAAe,EAAE,CAAC;QAClB,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,WAAW,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Graceful degradation manager for memory-constrained environments.
3
+ *
4
+ * Subscribes to the memory monitor and progressively disables non-essential
5
+ * features as memory usage rises through threshold levels. Features are
6
+ * re-enabled automatically when memory pressure subsides.
7
+ *
8
+ * Degradation tiers (cumulative — each tier includes all previous restrictions):
9
+ *
10
+ * normal → All features active.
11
+ * elevated → Pause data polling, skip deferred module loading.
12
+ * warning → Disable graph rendering & CSS animations.
13
+ * critical → Disable detail panel, reduce to minimal UI.
14
+ *
15
+ * Designed as a standalone module with zero framework dependencies —
16
+ * the Preact hook (`useGracefulDegradation`) is provided separately.
17
+ */
18
+ import type { MemoryLevel } from "./memory-monitor.js";
19
+ /**
20
+ * Features that can be individually degraded.
21
+ *
22
+ * Each feature maps to a user-facing capability that consumes significant
23
+ * memory or CPU. The degradation manager disables features from the bottom
24
+ * of the list upwards as memory pressure increases.
25
+ */
26
+ export type DegradableFeature = "autoRefresh" | "deferredLoading" | "graphRendering" | "animations" | "detailPanel";
27
+ /** Read-only snapshot of the current degradation state. */
28
+ export interface DegradationState {
29
+ /** Current degradation tier, mirrors the memory level. */
30
+ readonly tier: MemoryLevel;
31
+ /** Set of features currently disabled due to memory pressure. */
32
+ readonly disabledFeatures: ReadonlySet<DegradableFeature>;
33
+ /** Whether *any* degradation is active (tier !== "normal"). */
34
+ readonly isDegraded: boolean;
35
+ /** Human-readable summary of what's disabled and why. */
36
+ readonly summary: string;
37
+ }
38
+ /** Callback invoked when the degradation state changes. */
39
+ export type DegradationChangeHandler = (state: DegradationState, previousTier: MemoryLevel) => void;
40
+ /** Configuration for the degradation manager. */
41
+ export interface DegradationConfig {
42
+ /** Called when the degradation tier changes. */
43
+ onChange: DegradationChangeHandler | null;
44
+ }
45
+ /**
46
+ * Compute the disabled feature set for a given memory level.
47
+ * Exported for testing.
48
+ */
49
+ export declare function featuresForTier(tier: MemoryLevel): Set<DegradableFeature>;
50
+ /**
51
+ * Get the human-readable summary for a given memory level.
52
+ * Exported for testing.
53
+ */
54
+ export declare function summaryForTier(tier: MemoryLevel): string;
55
+ /**
56
+ * Start the degradation manager. Subscribes to the memory monitor and
57
+ * immediately evaluates the current memory level.
58
+ *
59
+ * Safe to call multiple times — restarts with new config.
60
+ */
61
+ export declare function startDegradation(overrides?: Partial<DegradationConfig>): void;
62
+ /** Stop the degradation manager and clean up subscriptions. */
63
+ export declare function stopDegradation(): void;
64
+ /** Subscribe to degradation state changes. Returns an unsubscribe function. */
65
+ export declare function onDegradationChange(listener: (state: DegradationState) => void): () => void;
66
+ /** Check whether a specific feature is currently disabled. */
67
+ export declare function isFeatureDisabled(feature: DegradableFeature): boolean;
68
+ /** Get the current degradation state. */
69
+ export declare function getDegradationState(): DegradationState;
70
+ /** Get the current degradation tier. */
71
+ export declare function getCurrentTier(): MemoryLevel;
72
+ /** Reset all module state (for testing). */
73
+ export declare function resetDegradation(): void;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Graceful degradation manager for memory-constrained environments.
3
+ *
4
+ * Subscribes to the memory monitor and progressively disables non-essential
5
+ * features as memory usage rises through threshold levels. Features are
6
+ * re-enabled automatically when memory pressure subsides.
7
+ *
8
+ * Degradation tiers (cumulative — each tier includes all previous restrictions):
9
+ *
10
+ * normal → All features active.
11
+ * elevated → Pause data polling, skip deferred module loading.
12
+ * warning → Disable graph rendering & CSS animations.
13
+ * critical → Disable detail panel, reduce to minimal UI.
14
+ *
15
+ * Designed as a standalone module with zero framework dependencies —
16
+ * the Preact hook (`useGracefulDegradation`) is provided separately.
17
+ */
18
+ import { onSnapshot, getLatestSnapshot } from "./memory-monitor.js";
19
+ // ─── Constants ───────────────────────────────────────────────────────────────
20
+ /**
21
+ * Which features to disable at each memory level.
22
+ *
23
+ * Degradation is cumulative: "warning" includes everything from "elevated"
24
+ * plus its own additions.
25
+ */
26
+ const TIER_FEATURES = {
27
+ normal: [],
28
+ elevated: ["autoRefresh", "deferredLoading"],
29
+ warning: ["autoRefresh", "deferredLoading", "graphRendering", "animations"],
30
+ critical: ["autoRefresh", "deferredLoading", "graphRendering", "animations", "detailPanel"],
31
+ };
32
+ const TIER_SUMMARIES = {
33
+ normal: "",
34
+ elevated: "Memory usage is elevated. Auto-refresh and background data loading have been paused to conserve memory.",
35
+ warning: "High memory usage detected. The graph view and animations have been disabled. Close unused tabs or refresh the page.",
36
+ critical: "Critical memory pressure. Most features are disabled to prevent a crash. Refresh the page to restore full functionality.",
37
+ };
38
+ const SEVERITY_ORDER = {
39
+ normal: 0,
40
+ elevated: 1,
41
+ warning: 2,
42
+ critical: 3,
43
+ };
44
+ // ─── Module state ────────────────────────────────────────────────────────────
45
+ let currentTier = "normal";
46
+ let disabledFeatures = new Set();
47
+ let config = { onChange: null };
48
+ let unsubscribeMonitor = null;
49
+ let listeners = [];
50
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
51
+ /** Build the DegradationState snapshot from current module state. */
52
+ function buildState() {
53
+ return {
54
+ tier: currentTier,
55
+ disabledFeatures: new Set(disabledFeatures),
56
+ isDegraded: currentTier !== "normal",
57
+ summary: TIER_SUMMARIES[currentTier],
58
+ };
59
+ }
60
+ function notifyListeners(state) {
61
+ for (const listener of listeners) {
62
+ try {
63
+ listener(state);
64
+ }
65
+ catch (err) {
66
+ console.error("[graceful-degradation] listener error:", err);
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Compute the disabled feature set for a given memory level.
72
+ * Exported for testing.
73
+ */
74
+ export function featuresForTier(tier) {
75
+ return new Set(TIER_FEATURES[tier]);
76
+ }
77
+ /**
78
+ * Get the human-readable summary for a given memory level.
79
+ * Exported for testing.
80
+ */
81
+ export function summaryForTier(tier) {
82
+ return TIER_SUMMARIES[tier];
83
+ }
84
+ // ─── Snapshot handler ────────────────────────────────────────────────────────
85
+ function handleMemorySnapshot(snapshot) {
86
+ const newTier = snapshot.level;
87
+ if (newTier === currentTier)
88
+ return;
89
+ const previousTier = currentTier;
90
+ currentTier = newTier;
91
+ disabledFeatures = featuresForTier(newTier);
92
+ const state = buildState();
93
+ if (config.onChange) {
94
+ config.onChange(state, previousTier);
95
+ }
96
+ notifyListeners(state);
97
+ }
98
+ // ─── Public API ──────────────────────────────────────────────────────────────
99
+ /**
100
+ * Start the degradation manager. Subscribes to the memory monitor and
101
+ * immediately evaluates the current memory level.
102
+ *
103
+ * Safe to call multiple times — restarts with new config.
104
+ */
105
+ export function startDegradation(overrides = {}) {
106
+ stopDegradation();
107
+ config = {
108
+ onChange: overrides.onChange ?? null,
109
+ };
110
+ // Subscribe to ongoing memory snapshots.
111
+ unsubscribeMonitor = onSnapshot(handleMemorySnapshot);
112
+ // Evaluate current state immediately from the latest snapshot.
113
+ const latest = getLatestSnapshot();
114
+ if (latest) {
115
+ handleMemorySnapshot(latest);
116
+ }
117
+ }
118
+ /** Stop the degradation manager and clean up subscriptions. */
119
+ export function stopDegradation() {
120
+ if (unsubscribeMonitor) {
121
+ unsubscribeMonitor();
122
+ unsubscribeMonitor = null;
123
+ }
124
+ }
125
+ /** Subscribe to degradation state changes. Returns an unsubscribe function. */
126
+ export function onDegradationChange(listener) {
127
+ listeners.push(listener);
128
+ return () => {
129
+ listeners = listeners.filter((l) => l !== listener);
130
+ };
131
+ }
132
+ /** Check whether a specific feature is currently disabled. */
133
+ export function isFeatureDisabled(feature) {
134
+ return disabledFeatures.has(feature);
135
+ }
136
+ /** Get the current degradation state. */
137
+ export function getDegradationState() {
138
+ return buildState();
139
+ }
140
+ /** Get the current degradation tier. */
141
+ export function getCurrentTier() {
142
+ return currentTier;
143
+ }
144
+ /** Reset all module state (for testing). */
145
+ export function resetDegradation() {
146
+ stopDegradation();
147
+ currentTier = "normal";
148
+ disabledFeatures = new Set();
149
+ config = { onChange: null };
150
+ listeners = [];
151
+ }
152
+ //# sourceMappingURL=graceful-degradation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graceful-degradation.js","sourceRoot":"","sources":["../../../src/viewer/performance/graceful-degradation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Performance zone public interface.
3
+ *
4
+ * All cross-zone consumers should import from this barrel rather than
5
+ * individual implementation files. Type-only imports are excluded per
6
+ * the gateway pattern (erased at compile time, stay at call-site).
7
+ */
8
+ export { isFeatureDisabled, onDegradationChange, type DegradableFeature, type DegradationState, type DegradationChangeHandler, } from "./graceful-degradation.js";
9
+ export { formatBytes, formatRatio, type MemorySnapshot, type MemoryLevel, } from "./memory-monitor.js";
10
+ export { createDomUpdateGate, type DomUpdateGate, type DomUpdateGateConfig, } from "./dom-update-gate.js";
11
+ export { createResponseBufferGate, type ResponseBufferGate, type ResponseBufferGateConfig, } from "./response-buffer-gate.js";
12
+ export { createUpdateBatcher, type UpdateBatcher, type UpdateBatcherConfig, } from "./update-batcher.js";
13
+ export { type RefreshQueueState, type RefreshPriority, } from "./refresh-throttle.js";
14
+ export { countDOMNodes, readHeapUsage, formatDuration, formatNodeCount, formatDelta, recordRender, recordUpdate, measureOperation, takeDOMSnapshot, computeSummary, onDOMSnapshot, setObservedContainer, startDOMPerformanceMonitor, stopDOMPerformanceMonitor, getLatestDOMSnapshot, getDOMSnapshotHistory, getRenderTimings, getUpdateComparisons, getObservedContainer, resetDOMPerformanceMonitor, type DOMNodeSnapshot, type RenderTiming, type UpdateComparison, type PerformanceSummary, type DOMPerformanceConfig, type DOMSnapshotHandler, } from "./dom-performance-monitor.js";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Performance zone public interface.
3
+ *
4
+ * All cross-zone consumers should import from this barrel rather than
5
+ * individual implementation files. Type-only imports are excluded per
6
+ * the gateway pattern (erased at compile time, stay at call-site).
7
+ */
8
+ // ── Graceful degradation ──────────────────────────────────────────────────────
9
+ export { isFeatureDisabled, onDegradationChange, } from "./graceful-degradation.js";
10
+ // ── Memory monitor ────────────────────────────────────────────────────────────
11
+ export { formatBytes, formatRatio, } from "./memory-monitor.js";
12
+ // ── DOM update gate ───────────────────────────────────────────────────────────
13
+ export { createDomUpdateGate, } from "./dom-update-gate.js";
14
+ // ── Response buffer gate ──────────────────────────────────────────────────────
15
+ export { createResponseBufferGate, } from "./response-buffer-gate.js";
16
+ // ── Update batcher ────────────────────────────────────────────────────────────
17
+ export { createUpdateBatcher, } from "./update-batcher.js";
18
+ // ── DOM performance monitor ──────────────────────────────────────────────────
19
+ export { countDOMNodes, readHeapUsage, formatDuration, formatNodeCount, formatDelta, recordRender, recordUpdate, measureOperation, takeDOMSnapshot, computeSummary, onDOMSnapshot, setObservedContainer, startDOMPerformanceMonitor, stopDOMPerformanceMonitor, getLatestDOMSnapshot, getDOMSnapshotHistory, getRenderTimings, getUpdateComparisons, getObservedContainer, resetDOMPerformanceMonitor, } from "./dom-performance-monitor.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/viewer/performance/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iFAAiF;AAEjF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAIpB,MAAM,2BAA2B,CAAC;AAEnC,iFAAiF;AAEjF,OAAO,EACL,WAAW,EACX,WAAW,GAGZ,MAAM,qBAAqB,CAAC;AAE7B,iFAAiF;AAEjF,OAAO,EACL,mBAAmB,GAGpB,MAAM,sBAAsB,CAAC;AAE9B,iFAAiF;AAEjF,OAAO,EACL,wBAAwB,GAGzB,MAAM,2BAA2B,CAAC;AAEnC,iFAAiF;AAEjF,OAAO,EACL,mBAAmB,GAGpB,MAAM,qBAAqB,CAAC;AAS7B,gFAAgF;AAEhF,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,GAO3B,MAAM,8BAA8B,CAAC"}