@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,112 @@
1
+ /**
2
+ * Centralized tab visibility state manager.
3
+ *
4
+ * Wraps the Page Visibility API to provide a single source of truth for
5
+ * browser tab visibility state. All polling components subscribe to this
6
+ * module instead of independently listening for visibility changes.
7
+ *
8
+ * Browser compatibility:
9
+ *
10
+ * 1. Standard API — `document.visibilityState` + `visibilitychange`
11
+ * 2. Webkit prefix — `document.webkitVisibilityState` + `webkitvisibilitychange`
12
+ * 3. MS prefix — `document.msVisibilityState` + `msvisibilitychange`
13
+ * 4. Focus/blur — `window.focus` / `window.blur` (fallback when no API)
14
+ *
15
+ * State transitions:
16
+ *
17
+ * visible -> hidden Tab is backgrounded, minimized, or screen-locked.
18
+ * hidden -> visible Tab regains focus or is foregrounded.
19
+ *
20
+ * Designed as a standalone module with zero framework dependencies —
21
+ * the Preact hook (`useTabVisibility`) is provided separately.
22
+ */
23
+ /** Tab visibility state, mirrors `document.visibilityState`. */
24
+ export type TabVisibilityState = "visible" | "hidden";
25
+ /** Snapshot of the current tab visibility state at a point in time. */
26
+ export interface TabVisibilitySnapshot {
27
+ /** Current visibility state. */
28
+ readonly state: TabVisibilityState;
29
+ /** Whether the tab is currently visible (convenience boolean). */
30
+ readonly isVisible: boolean;
31
+ /** ISO timestamp of when the current state began. */
32
+ readonly since: string;
33
+ /** Milliseconds spent in the current state. */
34
+ readonly durationMs: number;
35
+ /** ISO timestamp of when this snapshot was taken. */
36
+ readonly timestamp: string;
37
+ }
38
+ /** Callback invoked when tab visibility changes. */
39
+ export type VisibilityChangeHandler = (snapshot: TabVisibilitySnapshot, previousState: TabVisibilityState) => void;
40
+ /** Configuration for the tab visibility monitor. */
41
+ export interface TabVisibilityConfig {
42
+ /** Called when tab visibility changes. */
43
+ onChange: VisibilityChangeHandler | null;
44
+ }
45
+ /** Detection method used for tab visibility tracking. */
46
+ export type VisibilityDetectionMethod = "standard" | "webkit" | "ms" | "focus-blur" | "none";
47
+ /** Browser capability report for the Page Visibility API. */
48
+ export interface VisibilityAPICapabilities {
49
+ /** Whether any visibility detection method is available. */
50
+ readonly supported: boolean;
51
+ /** Which detection method is in use. */
52
+ readonly method: VisibilityDetectionMethod;
53
+ /** Whether the native Page Visibility API is available (standard or prefixed). */
54
+ readonly nativeAPI: boolean;
55
+ /** Whether using the focus/blur fallback instead of the native API. */
56
+ readonly usingFallback: boolean;
57
+ /** The event name being listened to (e.g. "visibilitychange", "webkitvisibilitychange"). */
58
+ readonly eventName: string | null;
59
+ }
60
+ /** A single state transition record for history tracking. */
61
+ export interface VisibilityTransition {
62
+ /** The state that was entered. */
63
+ readonly state: TabVisibilityState;
64
+ /** The state that was left. */
65
+ readonly from: TabVisibilityState;
66
+ /** ISO timestamp of the transition. */
67
+ readonly timestamp: string;
68
+ }
69
+ /**
70
+ * Probe the runtime environment for the best available Page Visibility API
71
+ * variant. Called once on first use, result is cached.
72
+ *
73
+ * Priority:
74
+ * 1. Standard API (`document.visibilityState`)
75
+ * 2. Webkit prefix (`document.webkitVisibilityState`)
76
+ * 3. MS prefix (`document.msVisibilityState`)
77
+ * 4. Focus/blur fallback (window events)
78
+ * 5. None (SSR or non-browser environment)
79
+ */
80
+ export declare function detectVisibilityAPI(): {
81
+ method: VisibilityDetectionMethod;
82
+ eventName: string | null;
83
+ };
84
+ /**
85
+ * Start the tab visibility monitor. Detects the best available browser API
86
+ * and begins listening for state changes.
87
+ *
88
+ * Safe to call multiple times — restarts with new config.
89
+ */
90
+ export declare function startTabVisibilityMonitor(overrides?: Partial<TabVisibilityConfig>): void;
91
+ /** Stop the tab visibility monitor and remove all event listeners. */
92
+ export declare function stopTabVisibilityMonitor(): void;
93
+ /** Subscribe to visibility change events. Returns an unsubscribe function. */
94
+ export declare function onVisibilityChange(listener: (snapshot: TabVisibilitySnapshot) => void): () => void;
95
+ /** Get the current tab visibility state. */
96
+ export declare function getTabVisibility(): TabVisibilityState;
97
+ /** Get a full snapshot of the current tab visibility state. */
98
+ export declare function getTabVisibilitySnapshot(): TabVisibilitySnapshot;
99
+ /** Convenience check: is the tab currently visible? */
100
+ export declare function isTabVisible(): boolean;
101
+ /**
102
+ * Get the browser's Page Visibility API capabilities.
103
+ * Reports which detection method is in use and whether fallbacks are active.
104
+ */
105
+ export declare function getVisibilityCapabilities(): VisibilityAPICapabilities;
106
+ /**
107
+ * Get the recent transition history (up to 50 entries).
108
+ * Useful for debugging visibility state patterns.
109
+ */
110
+ export declare function getTransitionHistory(): readonly VisibilityTransition[];
111
+ /** Reset all module state (for testing). */
112
+ export declare function resetTabVisibility(): void;
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Centralized tab visibility state manager.
3
+ *
4
+ * Wraps the Page Visibility API to provide a single source of truth for
5
+ * browser tab visibility state. All polling components subscribe to this
6
+ * module instead of independently listening for visibility changes.
7
+ *
8
+ * Browser compatibility:
9
+ *
10
+ * 1. Standard API — `document.visibilityState` + `visibilitychange`
11
+ * 2. Webkit prefix — `document.webkitVisibilityState` + `webkitvisibilitychange`
12
+ * 3. MS prefix — `document.msVisibilityState` + `msvisibilitychange`
13
+ * 4. Focus/blur — `window.focus` / `window.blur` (fallback when no API)
14
+ *
15
+ * State transitions:
16
+ *
17
+ * visible -> hidden Tab is backgrounded, minimized, or screen-locked.
18
+ * hidden -> visible Tab regains focus or is foregrounded.
19
+ *
20
+ * Designed as a standalone module with zero framework dependencies —
21
+ * the Preact hook (`useTabVisibility`) is provided separately.
22
+ */
23
+ // ─── Constants ───────────────────────────────────────────────────────────────
24
+ /** Maximum number of transitions kept in history for debugging. */
25
+ const MAX_TRANSITION_HISTORY = 50;
26
+ // ─── Module state ────────────────────────────────────────────────────────────
27
+ let currentState = "visible";
28
+ let stateChangedAt = Date.now();
29
+ let config = { onChange: null };
30
+ let listeners = [];
31
+ let boundHandler = null;
32
+ let boundFocusHandler = null;
33
+ let boundBlurHandler = null;
34
+ let transitionHistory = [];
35
+ let detectedMethod = "none";
36
+ let detectedEventName = null;
37
+ // ─── Browser API detection ──────────────────────────────────────────────────
38
+ /**
39
+ * Probe the runtime environment for the best available Page Visibility API
40
+ * variant. Called once on first use, result is cached.
41
+ *
42
+ * Priority:
43
+ * 1. Standard API (`document.visibilityState`)
44
+ * 2. Webkit prefix (`document.webkitVisibilityState`)
45
+ * 3. MS prefix (`document.msVisibilityState`)
46
+ * 4. Focus/blur fallback (window events)
47
+ * 5. None (SSR or non-browser environment)
48
+ */
49
+ export function detectVisibilityAPI() {
50
+ if (typeof document === "undefined") {
51
+ return { method: "none", eventName: null };
52
+ }
53
+ // Standard API
54
+ if ("visibilityState" in document) {
55
+ return { method: "standard", eventName: "visibilitychange" };
56
+ }
57
+ const doc = document;
58
+ // Webkit prefix (Safari < 14, older Chrome)
59
+ if ("webkitVisibilityState" in doc) {
60
+ return { method: "webkit", eventName: "webkitvisibilitychange" };
61
+ }
62
+ // MS prefix (IE 10)
63
+ if ("msVisibilityState" in doc) {
64
+ return { method: "ms", eventName: "msvisibilitychange" };
65
+ }
66
+ // Focus/blur fallback — available in all window-bearing environments
67
+ if (typeof window !== "undefined") {
68
+ return { method: "focus-blur", eventName: null };
69
+ }
70
+ return { method: "none", eventName: null };
71
+ }
72
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
73
+ /** Build a snapshot from current module state. */
74
+ function buildSnapshot() {
75
+ const now = Date.now();
76
+ return {
77
+ state: currentState,
78
+ isVisible: currentState === "visible",
79
+ since: new Date(stateChangedAt).toISOString(),
80
+ durationMs: now - stateChangedAt,
81
+ timestamp: new Date(now).toISOString(),
82
+ };
83
+ }
84
+ function notifyListeners(snapshot) {
85
+ for (const listener of listeners) {
86
+ listener(snapshot);
87
+ }
88
+ }
89
+ /** Record a state transition in the bounded history ring. */
90
+ function recordTransition(from, to) {
91
+ transitionHistory.push({
92
+ state: to,
93
+ from,
94
+ timestamp: new Date().toISOString(),
95
+ });
96
+ if (transitionHistory.length > MAX_TRANSITION_HISTORY) {
97
+ transitionHistory = transitionHistory.slice(-MAX_TRANSITION_HISTORY);
98
+ }
99
+ }
100
+ /**
101
+ * Read the current visibility state from the best available API.
102
+ * Handles standard, vendor-prefixed, and fallback scenarios.
103
+ */
104
+ function readDocumentVisibility() {
105
+ if (typeof document === "undefined")
106
+ return "visible";
107
+ switch (detectedMethod) {
108
+ case "standard":
109
+ return document.visibilityState === "visible" ? "visible" : "hidden";
110
+ case "webkit": {
111
+ const doc = document;
112
+ return doc.webkitVisibilityState === "visible" ? "visible" : "hidden";
113
+ }
114
+ case "ms": {
115
+ const doc = document;
116
+ return doc.msVisibilityState === "visible" ? "visible" : "hidden";
117
+ }
118
+ // Focus/blur and none: return current tracked state (updated by focus/blur handlers)
119
+ default:
120
+ return currentState;
121
+ }
122
+ }
123
+ // ─── Event handlers ─────────────────────────────────────────────────────────
124
+ function handleVisibilityChange() {
125
+ const newState = readDocumentVisibility();
126
+ if (newState === currentState)
127
+ return;
128
+ const previousState = currentState;
129
+ currentState = newState;
130
+ stateChangedAt = Date.now();
131
+ recordTransition(previousState, newState);
132
+ const snapshot = buildSnapshot();
133
+ if (config.onChange) {
134
+ config.onChange(snapshot, previousState);
135
+ }
136
+ notifyListeners(snapshot);
137
+ }
138
+ /** Focus handler for the fallback detection path. */
139
+ function handleWindowFocus() {
140
+ if (currentState === "visible")
141
+ return;
142
+ const previousState = currentState;
143
+ currentState = "visible";
144
+ stateChangedAt = Date.now();
145
+ recordTransition(previousState, "visible");
146
+ const snapshot = buildSnapshot();
147
+ if (config.onChange) {
148
+ config.onChange(snapshot, previousState);
149
+ }
150
+ notifyListeners(snapshot);
151
+ }
152
+ /** Blur handler for the fallback detection path. */
153
+ function handleWindowBlur() {
154
+ if (currentState === "hidden")
155
+ return;
156
+ const previousState = currentState;
157
+ currentState = "hidden";
158
+ stateChangedAt = Date.now();
159
+ recordTransition(previousState, "hidden");
160
+ const snapshot = buildSnapshot();
161
+ if (config.onChange) {
162
+ config.onChange(snapshot, previousState);
163
+ }
164
+ notifyListeners(snapshot);
165
+ }
166
+ // ─── Cleanup helpers ────────────────────────────────────────────────────────
167
+ /** Remove all event listeners regardless of detection method. */
168
+ function removeAllListeners() {
169
+ // Remove visibilitychange listener (standard or prefixed)
170
+ if (boundHandler && detectedEventName && typeof document !== "undefined") {
171
+ document.removeEventListener(detectedEventName, boundHandler);
172
+ boundHandler = null;
173
+ }
174
+ // Remove focus/blur listeners
175
+ if (typeof window !== "undefined") {
176
+ if (boundFocusHandler) {
177
+ window.removeEventListener("focus", boundFocusHandler);
178
+ boundFocusHandler = null;
179
+ }
180
+ if (boundBlurHandler) {
181
+ window.removeEventListener("blur", boundBlurHandler);
182
+ boundBlurHandler = null;
183
+ }
184
+ }
185
+ }
186
+ // ─── Public API ──────────────────────────────────────────────────────────────
187
+ /**
188
+ * Start the tab visibility monitor. Detects the best available browser API
189
+ * and begins listening for state changes.
190
+ *
191
+ * Safe to call multiple times — restarts with new config.
192
+ */
193
+ export function startTabVisibilityMonitor(overrides = {}) {
194
+ stopTabVisibilityMonitor();
195
+ config = {
196
+ onChange: overrides.onChange ?? null,
197
+ };
198
+ // Detect the best available API on first start.
199
+ const detection = detectVisibilityAPI();
200
+ detectedMethod = detection.method;
201
+ detectedEventName = detection.eventName;
202
+ // Capture the current state immediately.
203
+ currentState = readDocumentVisibility();
204
+ stateChangedAt = Date.now();
205
+ // Bind and register event listeners based on detected method.
206
+ if (detectedEventName && typeof document !== "undefined") {
207
+ // Standard or vendor-prefixed Page Visibility API.
208
+ boundHandler = handleVisibilityChange;
209
+ document.addEventListener(detectedEventName, boundHandler);
210
+ }
211
+ else if (detectedMethod === "focus-blur" && typeof window !== "undefined") {
212
+ // Focus/blur fallback — less precise but universally supported.
213
+ boundFocusHandler = handleWindowFocus;
214
+ boundBlurHandler = handleWindowBlur;
215
+ window.addEventListener("focus", boundFocusHandler);
216
+ window.addEventListener("blur", boundBlurHandler);
217
+ }
218
+ // "none" method: SSR — no events to listen to.
219
+ }
220
+ /** Stop the tab visibility monitor and remove all event listeners. */
221
+ export function stopTabVisibilityMonitor() {
222
+ removeAllListeners();
223
+ }
224
+ /** Subscribe to visibility change events. Returns an unsubscribe function. */
225
+ export function onVisibilityChange(listener) {
226
+ listeners.push(listener);
227
+ return () => {
228
+ listeners = listeners.filter((l) => l !== listener);
229
+ };
230
+ }
231
+ /** Get the current tab visibility state. */
232
+ export function getTabVisibility() {
233
+ return currentState;
234
+ }
235
+ /** Get a full snapshot of the current tab visibility state. */
236
+ export function getTabVisibilitySnapshot() {
237
+ return buildSnapshot();
238
+ }
239
+ /** Convenience check: is the tab currently visible? */
240
+ export function isTabVisible() {
241
+ return currentState === "visible";
242
+ }
243
+ /**
244
+ * Get the browser's Page Visibility API capabilities.
245
+ * Reports which detection method is in use and whether fallbacks are active.
246
+ */
247
+ export function getVisibilityCapabilities() {
248
+ return {
249
+ supported: detectedMethod !== "none",
250
+ method: detectedMethod,
251
+ nativeAPI: detectedMethod === "standard" ||
252
+ detectedMethod === "webkit" ||
253
+ detectedMethod === "ms",
254
+ usingFallback: detectedMethod === "focus-blur",
255
+ eventName: detectedEventName,
256
+ };
257
+ }
258
+ /**
259
+ * Get the recent transition history (up to 50 entries).
260
+ * Useful for debugging visibility state patterns.
261
+ */
262
+ export function getTransitionHistory() {
263
+ return transitionHistory;
264
+ }
265
+ /** Reset all module state (for testing). */
266
+ export function resetTabVisibility() {
267
+ stopTabVisibilityMonitor();
268
+ currentState = "visible";
269
+ stateChangedAt = Date.now();
270
+ config = { onChange: null };
271
+ listeners = [];
272
+ transitionHistory = [];
273
+ detectedMethod = "none";
274
+ detectedEventName = null;
275
+ }
276
+ //# sourceMappingURL=tab-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-visibility.js","sourceRoot":"","sources":["../../../src/viewer/polling/tab-visibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared tick timer service for elapsed time updates.
3
+ *
4
+ * Manages a single setInterval that fires every second and distributes
5
+ * tick events to all subscribed components. This eliminates the need for
6
+ * individual per-component timers, reducing CPU overhead when many task
7
+ * cards are visible simultaneously.
8
+ *
9
+ * The timer automatically starts when the first subscriber joins and
10
+ * stops when the last subscriber leaves, ensuring zero overhead when
11
+ * no components need elapsed time updates.
12
+ *
13
+ * Designed as a standalone module with zero framework dependencies —
14
+ * the Preact hook (`useTick`) is provided separately.
15
+ */
16
+ /** Callback invoked on each tick with the current timestamp (Date.now()). */
17
+ export type TickListener = (now: number) => void;
18
+ /** Read-only view of the tick timer's current state. */
19
+ export interface TickTimerState {
20
+ /** Number of active subscribers. */
21
+ readonly subscriberCount: number;
22
+ /** Whether the shared interval is currently running. */
23
+ readonly running: boolean;
24
+ }
25
+ /**
26
+ * Subscribe to 1-second tick events.
27
+ *
28
+ * The listener receives the current `Date.now()` timestamp on each tick.
29
+ * The shared interval starts automatically when the first subscriber joins.
30
+ *
31
+ * Returns an unsubscribe function. When the last subscriber unsubscribes,
32
+ * the shared interval is stopped.
33
+ *
34
+ * @param listener - Callback invoked on each tick.
35
+ * @returns Unsubscribe function (safe to call multiple times).
36
+ */
37
+ export declare function onTick(listener: TickListener): () => void;
38
+ /**
39
+ * Suspend the tick timer.
40
+ *
41
+ * Clears the shared interval but keeps all listeners registered. The timer
42
+ * can be resumed later with `resumeTickTimer()`. Used by the tick visibility
43
+ * gate to pause elapsed time updates when the browser tab is hidden.
44
+ *
45
+ * No-op if the timer is already stopped.
46
+ */
47
+ export declare function suspendTickTimer(): void;
48
+ /**
49
+ * Resume a suspended tick timer.
50
+ *
51
+ * Restarts the shared interval if listeners exist. Fires an **immediate tick**
52
+ * before restarting the interval so that elapsed time displays catch up to
53
+ * the current wall-clock time without waiting up to 1 second for the next
54
+ * regular tick.
55
+ *
56
+ * Used by the tick visibility gate to resume elapsed time updates when the
57
+ * browser tab becomes visible again.
58
+ *
59
+ * No-op if the timer is already running or no listeners are registered.
60
+ */
61
+ export declare function resumeTickTimer(): void;
62
+ /**
63
+ * Get the current state of the tick timer.
64
+ */
65
+ export declare function getTickTimerState(): TickTimerState;
66
+ /**
67
+ * Reset all module state (for testing). Clears all listeners and
68
+ * stops the interval.
69
+ */
70
+ export declare function resetTickTimer(): void;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Shared tick timer service for elapsed time updates.
3
+ *
4
+ * Manages a single setInterval that fires every second and distributes
5
+ * tick events to all subscribed components. This eliminates the need for
6
+ * individual per-component timers, reducing CPU overhead when many task
7
+ * cards are visible simultaneously.
8
+ *
9
+ * The timer automatically starts when the first subscriber joins and
10
+ * stops when the last subscriber leaves, ensuring zero overhead when
11
+ * no components need elapsed time updates.
12
+ *
13
+ * Designed as a standalone module with zero framework dependencies —
14
+ * the Preact hook (`useTick`) is provided separately.
15
+ */
16
+ import { registerPollingSource, } from "./polling-state.js";
17
+ // ─── Constants ───────────────────────────────────────────────────────────────
18
+ /** Tick interval in milliseconds. */
19
+ const TICK_INTERVAL_MS = 1000;
20
+ /** Key used to register with the centralized polling state manager. */
21
+ const POLLING_STATE_KEY = "tick-timer";
22
+ // ─── Module state ────────────────────────────────────────────────────────────
23
+ let listeners = [];
24
+ let timerId = null;
25
+ let stateUnsub = null;
26
+ // ─── Internal helpers ────────────────────────────────────────────────────────
27
+ /** Start the shared interval if not already running. */
28
+ function startTimer() {
29
+ if (timerId !== null)
30
+ return;
31
+ timerId = setInterval(tick, TICK_INTERVAL_MS);
32
+ // Register with centralized polling state when the timer starts.
33
+ if (stateUnsub === null) {
34
+ stateUnsub = registerPollingSource(POLLING_STATE_KEY, {
35
+ suspend: () => clearTimer(),
36
+ resume: () => {
37
+ if (timerId === null && listeners.length > 0) {
38
+ timerId = setInterval(tick, TICK_INTERVAL_MS);
39
+ }
40
+ },
41
+ dispose: () => {
42
+ clearTimer();
43
+ stateUnsub = null;
44
+ },
45
+ getStatus: () => (timerId !== null ? "active" : "idle"),
46
+ });
47
+ }
48
+ }
49
+ /** Clear the interval timer without touching polling-state registration. */
50
+ function clearTimer() {
51
+ if (timerId === null)
52
+ return;
53
+ clearInterval(timerId);
54
+ timerId = null;
55
+ }
56
+ /** Stop the shared interval and deregister from polling-state. */
57
+ function stopTimer() {
58
+ clearTimer();
59
+ // Deregister from centralized polling state when no subscribers remain.
60
+ if (stateUnsub) {
61
+ const unsub = stateUnsub;
62
+ stateUnsub = null;
63
+ unsub();
64
+ }
65
+ }
66
+ /** Fire a tick event to all current listeners. */
67
+ function tick() {
68
+ const now = Date.now();
69
+ // Snapshot the listener array so that subscribe/unsubscribe during
70
+ // iteration doesn't cause skips or double-fires within a single tick.
71
+ const snapshot = listeners.slice();
72
+ for (const listener of snapshot) {
73
+ try {
74
+ listener(now);
75
+ }
76
+ catch {
77
+ // Swallow errors from individual listeners to prevent one bad
78
+ // subscriber from breaking all others.
79
+ }
80
+ }
81
+ }
82
+ // ─── Public API ──────────────────────────────────────────────────────────────
83
+ /**
84
+ * Subscribe to 1-second tick events.
85
+ *
86
+ * The listener receives the current `Date.now()` timestamp on each tick.
87
+ * The shared interval starts automatically when the first subscriber joins.
88
+ *
89
+ * Returns an unsubscribe function. When the last subscriber unsubscribes,
90
+ * the shared interval is stopped.
91
+ *
92
+ * @param listener - Callback invoked on each tick.
93
+ * @returns Unsubscribe function (safe to call multiple times).
94
+ */
95
+ export function onTick(listener) {
96
+ listeners.push(listener);
97
+ // Start the timer if this is the first subscriber.
98
+ if (listeners.length === 1) {
99
+ startTimer();
100
+ }
101
+ let removed = false;
102
+ return () => {
103
+ if (removed)
104
+ return; // idempotent unsubscribe
105
+ removed = true;
106
+ listeners = listeners.filter((l) => l !== listener);
107
+ // Stop the timer if no subscribers remain.
108
+ if (listeners.length === 0) {
109
+ stopTimer();
110
+ }
111
+ };
112
+ }
113
+ /**
114
+ * Suspend the tick timer.
115
+ *
116
+ * Clears the shared interval but keeps all listeners registered. The timer
117
+ * can be resumed later with `resumeTickTimer()`. Used by the tick visibility
118
+ * gate to pause elapsed time updates when the browser tab is hidden.
119
+ *
120
+ * No-op if the timer is already stopped.
121
+ */
122
+ export function suspendTickTimer() {
123
+ clearTimer();
124
+ }
125
+ /**
126
+ * Resume a suspended tick timer.
127
+ *
128
+ * Restarts the shared interval if listeners exist. Fires an **immediate tick**
129
+ * before restarting the interval so that elapsed time displays catch up to
130
+ * the current wall-clock time without waiting up to 1 second for the next
131
+ * regular tick.
132
+ *
133
+ * Used by the tick visibility gate to resume elapsed time updates when the
134
+ * browser tab becomes visible again.
135
+ *
136
+ * No-op if the timer is already running or no listeners are registered.
137
+ */
138
+ export function resumeTickTimer() {
139
+ if (timerId !== null)
140
+ return; // already running
141
+ if (listeners.length === 0)
142
+ return; // no subscribers
143
+ // Fire an immediate tick for catch-up. Elapsed time formatters compute
144
+ // from an absolute start timestamp, so a single tick is enough for all
145
+ // displays to jump to the correct current value.
146
+ tick();
147
+ // Restart the periodic interval.
148
+ timerId = setInterval(tick, TICK_INTERVAL_MS);
149
+ }
150
+ /**
151
+ * Get the current state of the tick timer.
152
+ */
153
+ export function getTickTimerState() {
154
+ return {
155
+ subscriberCount: listeners.length,
156
+ running: timerId !== null,
157
+ };
158
+ }
159
+ /**
160
+ * Reset all module state (for testing). Clears all listeners and
161
+ * stops the interval.
162
+ */
163
+ export function resetTickTimer() {
164
+ stopTimer();
165
+ listeners = [];
166
+ stateUnsub = null;
167
+ }
168
+ //# sourceMappingURL=tick-timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-timer.js","sourceRoot":"","sources":["../../../src/viewer/polling/tick-timer.ts"],"names":[],"mappings":"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"}