@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,183 @@
1
+ /**
2
+ * Batched tick dispatcher for elapsed time state updates.
3
+ *
4
+ * Sits between the shared tick timer and individual `useTick` hook instances.
5
+ * Instead of N separate `onTick` listeners each calling `setState` independently,
6
+ * this dispatcher:
7
+ *
8
+ * 1. Subscribes to the tick timer **once** (regardless of how many components
9
+ * display elapsed time).
10
+ * 2. On each tick, computes all new values synchronously (read-only phase).
11
+ * 3. Filters out unchanged values via equality check (skip phase).
12
+ * 4. Schedules a single `requestAnimationFrame` to apply all state updates
13
+ * in one synchronous block (write phase).
14
+ *
15
+ * This two-phase (compute → RAF write) approach ensures:
16
+ *
17
+ * - All `setState` calls occur within the same synchronous execution context
18
+ * inside the RAF callback, allowing Preact to batch them into a single
19
+ * reconciliation pass.
20
+ * - State updates are aligned with the browser's paint cycle, eliminating
21
+ * wasted intermediate renders.
22
+ * - With 20+ visible task cards, the re-render count drops from N individual
23
+ * renders to one batched reconciliation per tick.
24
+ *
25
+ * Auto-lifecycle: subscribes to the tick timer when the first component
26
+ * registers, unsubscribes when the last one unregisters. Zero overhead
27
+ * when no elapsed time displays are mounted.
28
+ *
29
+ * Designed as a standalone module with zero framework dependencies —
30
+ * the Preact integration lives in the `useTick` hook.
31
+ */
32
+ import { onTick } from "./tick-timer.js";
33
+ // ─── Module state ────────────────────────────────────────────────────────────
34
+ let registrations = [];
35
+ let tickUnsub = null;
36
+ let rafId = null;
37
+ let pendingBatch = null;
38
+ // ─── Internal helpers ────────────────────────────────────────────────────────
39
+ /** Phase 1 (tick callback): compute values, filter unchanged, queue RAF. */
40
+ function onTickFired() {
41
+ const batch = [];
42
+ // Snapshot registrations to protect against mid-iteration unregister.
43
+ const snapshot = registrations.slice();
44
+ for (const reg of snapshot) {
45
+ try {
46
+ const next = reg.compute();
47
+ if (next !== reg.lastValueRef.current) {
48
+ batch.push({ setDisplay: reg.setDisplay, value: next, reg });
49
+ }
50
+ }
51
+ catch {
52
+ // Swallow errors from individual computations to prevent one bad
53
+ // registration from breaking all others.
54
+ }
55
+ }
56
+ if (batch.length === 0)
57
+ return;
58
+ // Commit lastValueRef immediately so the next tick won't re-queue
59
+ // the same update if RAF hasn't fired yet.
60
+ for (const { reg, value } of batch) {
61
+ reg.lastValueRef.current = value;
62
+ }
63
+ // Queue state updates for the next animation frame.
64
+ // If a previous batch is still pending (unlikely at 1s intervals),
65
+ // merge into it.
66
+ if (pendingBatch) {
67
+ for (const { setDisplay, value } of batch) {
68
+ pendingBatch.push({ setDisplay, value });
69
+ }
70
+ }
71
+ else {
72
+ pendingBatch = batch.map(({ setDisplay, value }) => ({
73
+ setDisplay,
74
+ value,
75
+ }));
76
+ }
77
+ if (rafId === null) {
78
+ rafId = requestAnimationFrame(applyBatch);
79
+ }
80
+ }
81
+ /** Phase 2 (RAF callback): apply all state updates in one synchronous block. */
82
+ function applyBatch() {
83
+ rafId = null;
84
+ const batch = pendingBatch;
85
+ pendingBatch = null;
86
+ if (!batch)
87
+ return;
88
+ // All setDisplay calls happen synchronously within this frame →
89
+ // Preact batches them into a single reconciliation pass.
90
+ for (const { setDisplay, value } of batch) {
91
+ try {
92
+ setDisplay(value);
93
+ }
94
+ catch {
95
+ // Swallow errors from individual setters.
96
+ }
97
+ }
98
+ }
99
+ // ─── Public API ──────────────────────────────────────────────────────────────
100
+ /**
101
+ * Register an elapsed time updater with the batched dispatcher.
102
+ *
103
+ * The dispatcher will call `compute()` on each tick, compare the result
104
+ * against `lastValueRef.current`, and — if changed — schedule a batched
105
+ * RAF update that calls `setDisplay(newValue)`.
106
+ *
107
+ * The `lastValueRef` is shared with the calling hook so that both the
108
+ * dispatcher and the hook's immediate-update effect (for `startedAt`
109
+ * prop changes) stay in sync.
110
+ *
111
+ * Returns an unregister function. When the last registration is removed,
112
+ * the dispatcher unsubscribes from the tick timer automatically.
113
+ *
114
+ * @param compute - Pure function returning the current formatted string.
115
+ * @param setDisplay - Preact state setter for the display value.
116
+ * @param lastValueRef - Mutable ref tracking the last emitted value.
117
+ * @returns Unregister function (safe to call multiple times).
118
+ */
119
+ export function registerTickUpdater(compute, setDisplay, lastValueRef) {
120
+ const reg = { compute, setDisplay, lastValueRef };
121
+ registrations.push(reg);
122
+ // Auto-start: subscribe to the tick timer on first registration.
123
+ if (registrations.length === 1 && tickUnsub === null) {
124
+ tickUnsub = onTick(onTickFired);
125
+ }
126
+ let removed = false;
127
+ return () => {
128
+ if (removed)
129
+ return; // idempotent unregister
130
+ removed = true;
131
+ registrations = registrations.filter((r) => r !== reg);
132
+ // Auto-stop: unsubscribe from tick timer when no registrations remain.
133
+ if (registrations.length === 0) {
134
+ if (tickUnsub) {
135
+ tickUnsub();
136
+ tickUnsub = null;
137
+ }
138
+ if (rafId !== null) {
139
+ cancelAnimationFrame(rafId);
140
+ rafId = null;
141
+ pendingBatch = null;
142
+ }
143
+ }
144
+ };
145
+ }
146
+ /**
147
+ * Get the current state of the batched tick dispatcher (for testing/monitoring).
148
+ */
149
+ export function getBatchedTickDispatcherState() {
150
+ return {
151
+ registrationCount: registrations.length,
152
+ hasPendingRAF: rafId !== null,
153
+ pendingUpdateCount: pendingBatch?.length ?? 0,
154
+ };
155
+ }
156
+ /**
157
+ * Force-flush all pending RAF updates synchronously.
158
+ * Cancels any pending RAF. No-op if nothing is pending.
159
+ */
160
+ export function flushBatchedTicks() {
161
+ if (rafId !== null) {
162
+ cancelAnimationFrame(rafId);
163
+ rafId = null;
164
+ }
165
+ applyBatch();
166
+ }
167
+ /**
168
+ * Reset all dispatcher state (for testing). Unsubscribes from the tick
169
+ * timer, cancels pending RAF, and clears all registrations.
170
+ */
171
+ export function resetBatchedTickDispatcher() {
172
+ if (tickUnsub) {
173
+ tickUnsub();
174
+ tickUnsub = null;
175
+ }
176
+ if (rafId !== null) {
177
+ cancelAnimationFrame(rafId);
178
+ rafId = null;
179
+ }
180
+ registrations = [];
181
+ pendingBatch = null;
182
+ }
183
+ //# sourceMappingURL=batched-tick-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batched-tick-dispatcher.js","sourceRoot":"","sources":["../../../src/viewer/polling/batched-tick-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Polling zone public interface.
3
+ *
4
+ * All cross-zone consumers should import from this barrel rather than
5
+ * individual implementation files.
6
+ */
7
+ export { startPollingManager, stopPollingManager, registerPoller, unregisterPoller, suspendAll, resumeAll, isSuspended, isPollerActive, getRegisteredPollers, getPollerCount, resetPollingManager, } from "./polling-manager.js";
8
+ export { startPollingRestart, stopPollingRestart, } from "./polling-restart.js";
9
+ export { createTickVisibilityGate, } from "./tick-visibility-gate.js";
10
+ export { onTick, suspendTickTimer, resumeTickTimer, getTickTimerState, resetTickTimer, } from "./tick-timer.js";
11
+ export { registerTickUpdater, } from "./batched-tick-dispatcher.js";
12
+ export { registerPollingSource, onPollingStateChange, getPollingState, resetPollingState, type PollingSourceCallbacks, type PollingSourceConfig, type PollingStateSnapshot, type PollingStateChangeHandler, } from "./polling-state.js";
13
+ export { startTabVisibilityMonitor, stopTabVisibilityMonitor, onVisibilityChange, getTabVisibility, getTabVisibilitySnapshot, isTabVisible, getVisibilityCapabilities, getTransitionHistory, resetTabVisibility, detectVisibilityAPI, type TabVisibilityState, type TabVisibilitySnapshot, type VisibilityChangeHandler, type TabVisibilityConfig, type VisibilityDetectionMethod, type VisibilityAPICapabilities, type VisibilityTransition, } from "./tab-visibility.js";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Polling zone public interface.
3
+ *
4
+ * All cross-zone consumers should import from this barrel rather than
5
+ * individual implementation files.
6
+ */
7
+ export { startPollingManager, stopPollingManager, registerPoller, unregisterPoller, suspendAll, resumeAll, isSuspended, isPollerActive, getRegisteredPollers, getPollerCount, resetPollingManager, } from "./polling-manager.js";
8
+ export { startPollingRestart, stopPollingRestart, } from "./polling-restart.js";
9
+ export { createTickVisibilityGate, } from "./tick-visibility-gate.js";
10
+ export { onTick, suspendTickTimer, resumeTickTimer, getTickTimerState, resetTickTimer, } from "./tick-timer.js";
11
+ export { registerTickUpdater, } from "./batched-tick-dispatcher.js";
12
+ // ── Polling state — cross-zone API ───────────────────────────────────────────
13
+ export { registerPollingSource, onPollingStateChange, getPollingState, resetPollingState, } from "./polling-state.js";
14
+ // ── Tab visibility ──────────────────────────────────────────────────────────
15
+ export { startTabVisibilityMonitor, stopTabVisibilityMonitor, onVisibilityChange, getTabVisibility, getTabVisibilitySnapshot, isTabVisible, getVisibilityCapabilities, getTransitionHistory, resetTabVisibility, detectVisibilityAPI, } from "./tab-visibility.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/viewer/polling/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,gFAAgF;AAEhF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GAKlB,MAAM,oBAAoB,CAAC;AAE5B,+EAA+E;AAE/E,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GAQpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Centralized polling manager with tab visibility integration.
3
+ *
4
+ * Provides a registry for all polling intervals across the application.
5
+ * When the browser tab is backgrounded, all registered pollers are
6
+ * suspended to conserve resources. When the tab regains focus, pollers
7
+ * are resumed with their original intervals.
8
+ *
9
+ * Rapid visibility changes (e.g. quick alt-tab sequences) are debounced
10
+ * to avoid thrashing interval creation/destruction.
11
+ *
12
+ * Designed as a standalone module with zero framework dependencies —
13
+ * the Preact hook (`usePolling`) is provided separately.
14
+ */
15
+ /** Read-only view of a registered poller for external inspection. */
16
+ export interface PollerInfo {
17
+ readonly key: string;
18
+ readonly intervalMs: number;
19
+ readonly active: boolean;
20
+ }
21
+ /**
22
+ * Start the polling manager. Subscribes to tab visibility changes
23
+ * and enables automatic suspend/resume of registered pollers.
24
+ *
25
+ * Safe to call multiple times — restarts cleanly.
26
+ */
27
+ export declare function startPollingManager(): void;
28
+ /**
29
+ * Stop the polling manager. Unsubscribes from visibility changes
30
+ * but does NOT clear registered pollers or their timers.
31
+ */
32
+ export declare function stopPollingManager(): void;
33
+ /**
34
+ * Register a polling interval. The callback will be called every
35
+ * `intervalMs` milliseconds while the tab is visible.
36
+ *
37
+ * If the tab is currently hidden and the manager is started,
38
+ * the poller is registered but not activated until the tab becomes visible.
39
+ *
40
+ * Returns an unregister function for cleanup.
41
+ *
42
+ * @param key - Unique identifier for this poller. Re-registering with the
43
+ * same key replaces the previous entry.
44
+ * @param callback - Function to call on each tick.
45
+ * @param intervalMs - Polling interval in milliseconds.
46
+ */
47
+ export declare function registerPoller(key: string, callback: () => void, intervalMs: number): () => void;
48
+ /**
49
+ * Remove a poller from the registry and clear its interval.
50
+ */
51
+ export declare function unregisterPoller(key: string): void;
52
+ /**
53
+ * Suspend all registered pollers. Clears their interval timers
54
+ * but keeps them in the registry for later resumption.
55
+ */
56
+ export declare function suspendAll(): void;
57
+ /**
58
+ * Resume all registered pollers. Restarts their interval timers
59
+ * with their original intervals.
60
+ */
61
+ export declare function resumeAll(): void;
62
+ /**
63
+ * Check if the polling manager is currently in a suspended state.
64
+ */
65
+ export declare function isSuspended(): boolean;
66
+ /**
67
+ * Check if a specific poller is actively running (has a timer).
68
+ */
69
+ export declare function isPollerActive(key: string): boolean;
70
+ /**
71
+ * Get read-only information about all registered pollers.
72
+ */
73
+ export declare function getRegisteredPollers(): readonly PollerInfo[];
74
+ /**
75
+ * Get the number of registered pollers.
76
+ */
77
+ export declare function getPollerCount(): number;
78
+ /**
79
+ * Reset all module state (for testing). Clears all pollers, stops the
80
+ * manager, and resets the suspended flag.
81
+ */
82
+ export declare function resetPollingManager(): void;
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Centralized polling manager with tab visibility integration.
3
+ *
4
+ * Provides a registry for all polling intervals across the application.
5
+ * When the browser tab is backgrounded, all registered pollers are
6
+ * suspended to conserve resources. When the tab regains focus, pollers
7
+ * are resumed with their original intervals.
8
+ *
9
+ * Rapid visibility changes (e.g. quick alt-tab sequences) are debounced
10
+ * to avoid thrashing interval creation/destruction.
11
+ *
12
+ * Designed as a standalone module with zero framework dependencies —
13
+ * the Preact hook (`usePolling`) is provided separately.
14
+ */
15
+ import { onVisibilityChange, isTabVisible, } from "./tab-visibility.js";
16
+ import { registerPollingSource, } from "./polling-state.js";
17
+ // ─── Constants ───────────────────────────────────────────────────────────────
18
+ /**
19
+ * Debounce delay for visibility-triggered resume (ms).
20
+ * Prevents thrashing when the user rapidly switches between tabs.
21
+ * Suspension is immediate (no debounce) to stop work quickly.
22
+ */
23
+ const RESUME_DEBOUNCE_MS = 100;
24
+ // ─── Constants (polling-state integration) ───────────────────────────────────
25
+ const POLLING_STATE_KEY = "polling-manager";
26
+ // ─── Module state ────────────────────────────────────────────────────────────
27
+ const pollers = new Map();
28
+ let visibilityUnsub = null;
29
+ let stateUnsub = null;
30
+ let started = false;
31
+ let suspended = false;
32
+ let resumeDebounceTimer = null;
33
+ // ─── Internal helpers ────────────────────────────────────────────────────────
34
+ /**
35
+ * Clean up the polling manager's own resources (visibility subscription,
36
+ * debounce timer, poller intervals). Does NOT touch polling-state
37
+ * registration — callers are responsible for that coordination.
38
+ */
39
+ function cleanupOwnResources() {
40
+ if (visibilityUnsub) {
41
+ visibilityUnsub();
42
+ visibilityUnsub = null;
43
+ }
44
+ if (resumeDebounceTimer !== null) {
45
+ clearTimeout(resumeDebounceTimer);
46
+ resumeDebounceTimer = null;
47
+ }
48
+ }
49
+ /** Start a poller's interval timer. */
50
+ function activatePoller(entry) {
51
+ if (entry.timerId !== null)
52
+ return; // already active
53
+ entry.timerId = setInterval(entry.callback, entry.intervalMs);
54
+ }
55
+ /** Stop a poller's interval timer without removing it from the registry. */
56
+ function deactivatePoller(entry) {
57
+ if (entry.timerId === null)
58
+ return; // already inactive
59
+ clearInterval(entry.timerId);
60
+ entry.timerId = null;
61
+ }
62
+ /** Handle visibility change events from the tab-visibility module. */
63
+ function handleVisibilityChange(snapshot) {
64
+ if (snapshot.isVisible) {
65
+ // Tab became visible — resume with debounce to handle rapid toggling.
66
+ if (resumeDebounceTimer !== null) {
67
+ clearTimeout(resumeDebounceTimer);
68
+ }
69
+ resumeDebounceTimer = setTimeout(() => {
70
+ resumeDebounceTimer = null;
71
+ resumeAll();
72
+ }, RESUME_DEBOUNCE_MS);
73
+ }
74
+ else {
75
+ // Tab became hidden — suspend immediately.
76
+ // Cancel any pending resume first.
77
+ if (resumeDebounceTimer !== null) {
78
+ clearTimeout(resumeDebounceTimer);
79
+ resumeDebounceTimer = null;
80
+ }
81
+ suspendAll();
82
+ }
83
+ }
84
+ // ─── Public API ──────────────────────────────────────────────────────────────
85
+ /**
86
+ * Start the polling manager. Subscribes to tab visibility changes
87
+ * and enables automatic suspend/resume of registered pollers.
88
+ *
89
+ * Safe to call multiple times — restarts cleanly.
90
+ */
91
+ export function startPollingManager() {
92
+ if (started)
93
+ stopPollingManager();
94
+ started = true;
95
+ suspended = false;
96
+ // Subscribe to tab visibility changes.
97
+ visibilityUnsub = onVisibilityChange(handleVisibilityChange);
98
+ // If the tab is currently hidden, start in suspended state.
99
+ if (!isTabVisible()) {
100
+ suspended = true;
101
+ }
102
+ // Register with centralized polling state for coordinated lifecycle.
103
+ // The dispose callback cleans up own resources without calling
104
+ // stopPollingManager (which would re-entrantly unregister from
105
+ // polling-state, causing a loop).
106
+ stateUnsub = registerPollingSource(POLLING_STATE_KEY, {
107
+ suspend: () => suspendAll(),
108
+ resume: () => resumeAll(),
109
+ dispose: () => {
110
+ for (const entry of pollers.values()) {
111
+ deactivatePoller(entry);
112
+ }
113
+ cleanupOwnResources();
114
+ started = false;
115
+ stateUnsub = null; // Already being disposed by polling-state.
116
+ },
117
+ getStatus: () => {
118
+ if (!started)
119
+ return "idle";
120
+ return suspended ? "suspended" : "active";
121
+ },
122
+ });
123
+ }
124
+ /**
125
+ * Stop the polling manager. Unsubscribes from visibility changes
126
+ * but does NOT clear registered pollers or their timers.
127
+ */
128
+ export function stopPollingManager() {
129
+ cleanupOwnResources();
130
+ started = false;
131
+ // Deregister from centralized polling state. Nullify stateUnsub first
132
+ // to prevent re-entrant dispose (unregisterPollingSource calls dispose,
133
+ // which would otherwise try to call stateUnsub again).
134
+ if (stateUnsub) {
135
+ const unsub = stateUnsub;
136
+ stateUnsub = null;
137
+ unsub();
138
+ }
139
+ }
140
+ /**
141
+ * Register a polling interval. The callback will be called every
142
+ * `intervalMs` milliseconds while the tab is visible.
143
+ *
144
+ * If the tab is currently hidden and the manager is started,
145
+ * the poller is registered but not activated until the tab becomes visible.
146
+ *
147
+ * Returns an unregister function for cleanup.
148
+ *
149
+ * @param key - Unique identifier for this poller. Re-registering with the
150
+ * same key replaces the previous entry.
151
+ * @param callback - Function to call on each tick.
152
+ * @param intervalMs - Polling interval in milliseconds.
153
+ */
154
+ export function registerPoller(key, callback, intervalMs) {
155
+ // If a poller with this key already exists, clean it up first.
156
+ const existing = pollers.get(key);
157
+ if (existing) {
158
+ deactivatePoller(existing);
159
+ }
160
+ const entry = {
161
+ key,
162
+ callback,
163
+ intervalMs,
164
+ timerId: null,
165
+ };
166
+ pollers.set(key, entry);
167
+ // Only activate if the manager is started and not suspended.
168
+ if (started && !suspended) {
169
+ activatePoller(entry);
170
+ }
171
+ else if (!started) {
172
+ // Manager not started — activate immediately (unmanaged mode).
173
+ activatePoller(entry);
174
+ }
175
+ return () => unregisterPoller(key);
176
+ }
177
+ /**
178
+ * Remove a poller from the registry and clear its interval.
179
+ */
180
+ export function unregisterPoller(key) {
181
+ const entry = pollers.get(key);
182
+ if (!entry)
183
+ return;
184
+ deactivatePoller(entry);
185
+ pollers.delete(key);
186
+ }
187
+ /**
188
+ * Suspend all registered pollers. Clears their interval timers
189
+ * but keeps them in the registry for later resumption.
190
+ */
191
+ export function suspendAll() {
192
+ suspended = true;
193
+ for (const entry of pollers.values()) {
194
+ deactivatePoller(entry);
195
+ }
196
+ }
197
+ /**
198
+ * Resume all registered pollers. Restarts their interval timers
199
+ * with their original intervals.
200
+ */
201
+ export function resumeAll() {
202
+ suspended = false;
203
+ for (const entry of pollers.values()) {
204
+ activatePoller(entry);
205
+ }
206
+ }
207
+ /**
208
+ * Check if the polling manager is currently in a suspended state.
209
+ */
210
+ export function isSuspended() {
211
+ return suspended;
212
+ }
213
+ /**
214
+ * Check if a specific poller is actively running (has a timer).
215
+ */
216
+ export function isPollerActive(key) {
217
+ const entry = pollers.get(key);
218
+ return entry !== null && entry !== undefined && entry.timerId !== null;
219
+ }
220
+ /**
221
+ * Get read-only information about all registered pollers.
222
+ */
223
+ export function getRegisteredPollers() {
224
+ const result = [];
225
+ for (const entry of pollers.values()) {
226
+ result.push({
227
+ key: entry.key,
228
+ intervalMs: entry.intervalMs,
229
+ active: entry.timerId !== null,
230
+ });
231
+ }
232
+ return result;
233
+ }
234
+ /**
235
+ * Get the number of registered pollers.
236
+ */
237
+ export function getPollerCount() {
238
+ return pollers.size;
239
+ }
240
+ /**
241
+ * Reset all module state (for testing). Clears all pollers, stops the
242
+ * manager, and resets the suspended flag.
243
+ */
244
+ export function resetPollingManager() {
245
+ // Clear all pollers.
246
+ for (const entry of pollers.values()) {
247
+ deactivatePoller(entry);
248
+ }
249
+ pollers.clear();
250
+ // Stop the manager.
251
+ stopPollingManager();
252
+ suspended = false;
253
+ }
254
+ //# sourceMappingURL=polling-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling-manager.js","sourceRoot":"","sources":["../../../src/viewer/polling/polling-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Polling restart coordinator.
3
+ *
4
+ * Bridges the graceful-degradation system to the centralized polling-state
5
+ * manager. When memory pressure disables the `autoRefresh` feature, this
6
+ * module calls `suspendAllSources()` to halt all non-essential polling
7
+ * sources in one atomic operation. When pressure subsides and `autoRefresh`
8
+ * is re-enabled, it calls `resumeAllSources()` to restart everything at
9
+ * original intervals.
10
+ *
11
+ * This provides a safety net that ensures **all** polling loops stop and
12
+ * restart together, even if an individual component forgets to handle
13
+ * degradation on its own. Components that also track degradation individually
14
+ * (e.g. status-indicators, use-app-data) coexist harmlessly — suspending
15
+ * an already-suspended source or resuming an already-active one is a no-op
16
+ * in both polling-state and polling-manager.
17
+ *
18
+ * Flow:
19
+ *
20
+ * memory-monitor → graceful-degradation → polling-restart
21
+ * ↓
22
+ * polling-state
23
+ * ↓ ↓
24
+ * polling-manager tick-timer
25
+ *
26
+ * Designed as a standalone module with zero framework dependencies.
27
+ */
28
+ /**
29
+ * Start the polling restart coordinator.
30
+ *
31
+ * Subscribes to degradation changes and evaluates the current state
32
+ * immediately. If `autoRefresh` is already disabled (e.g. the coordinator
33
+ * is started after memory pressure began), sources are suspended at once.
34
+ *
35
+ * Safe to call multiple times — restarts cleanly.
36
+ */
37
+ export declare function startPollingRestart(): void;
38
+ /**
39
+ * Stop the polling restart coordinator.
40
+ *
41
+ * Unsubscribes from degradation changes. If the coordinator had
42
+ * triggered a global suspension, sources are resumed to avoid
43
+ * leaving polling permanently frozen.
44
+ */
45
+ export declare function stopPollingRestart(): void;