@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,27 @@
1
+ /**
2
+ * Shared types for the web server.
3
+ */
4
+ import type { IncomingMessage, ServerResponse } from "node:http";
5
+ /** Valid scope identifiers for standalone package viewers. */
6
+ export type ViewerScope = "sourcevision" | "rex" | "hench";
7
+ /** Server configuration passed to route handlers. */
8
+ export interface ServerContext {
9
+ /** Absolute path to the project directory. */
10
+ projectDir: string;
11
+ /** Absolute path to .sourcevision/ directory. */
12
+ svDir: string;
13
+ /** Absolute path to .rex/ directory. */
14
+ rexDir: string;
15
+ /** Whether dev mode (live reload) is enabled. */
16
+ dev: boolean;
17
+ /** When set, restricts the dashboard to a single package's views and APIs. */
18
+ scope?: ViewerScope;
19
+ }
20
+ /** A route handler receives the request, response, and server context. */
21
+ export type RouteHandler = (req: IncomingMessage, res: ServerResponse, ctx: ServerContext) => boolean | Promise<boolean>;
22
+ /** JSON API response helper. */
23
+ export declare function jsonResponse(res: ServerResponse, status: number, data: unknown): void;
24
+ /** Plain-text error response helper. */
25
+ export declare function errorResponse(res: ServerResponse, status: number, message: string): void;
26
+ /** Read the full request body as a string. */
27
+ export declare function readBody(req: IncomingMessage): Promise<string>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared types for the web server.
3
+ */
4
+ /** JSON API response helper. */
5
+ export function jsonResponse(res, status, data) {
6
+ res.writeHead(status, {
7
+ "Content-Type": "application/json",
8
+ "Cache-Control": "no-cache",
9
+ });
10
+ res.end(JSON.stringify(data));
11
+ }
12
+ /** Plain-text error response helper. */
13
+ export function errorResponse(res, status, message) {
14
+ res.writeHead(status, { "Content-Type": "application/json" });
15
+ res.end(JSON.stringify({ error: message }));
16
+ }
17
+ /** Read the full request body as a string. */
18
+ export function readBody(req) {
19
+ return new Promise((resolve, reject) => {
20
+ const chunks = [];
21
+ req.on("data", (chunk) => chunks.push(chunk));
22
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
23
+ req.on("error", reject);
24
+ });
25
+ }
26
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,gCAAgC;AAChC,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,MAAc,EACd,IAAa;IAEb,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,aAAa,CAC3B,GAAmB,EACnB,MAAc,EACd,OAAe;IAEf,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,GAAoB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Periodic cleanup scheduler for orphaned usage records.
3
+ *
4
+ * Cross-references in-memory usage aggregation with the current PRD state
5
+ * to identify and prune entries whose tasks no longer exist. Only prunes
6
+ * the in-memory aggregation cache — run files on disk are preserved as
7
+ * the source of truth, ensuring critical data survives PRD restructuring.
8
+ *
9
+ * ## Design
10
+ *
11
+ * The cleanup cycle:
12
+ * 1. Reads current aggregated task usage from the IncrementalTaskUsageAggregator
13
+ * 2. Loads valid task IDs from the PRD via `collectAllIds()`
14
+ * 3. Identifies orphaned entries (usage for tasks not in PRD)
15
+ * 4. Prunes them from the aggregator's in-memory state
16
+ * 5. Logs removed entries to a JSONL audit file for auditability
17
+ * 6. Broadcasts a WebSocket event so the dashboard can react
18
+ *
19
+ * Graceful degradation: if the PRD is unavailable (not initialized, corrupt,
20
+ * etc.), the cleanup cycle is skipped entirely — no data is removed.
21
+ *
22
+ * ## Configuration
23
+ *
24
+ * The cleanup interval is read from `.n-dx.json`:
25
+ * ```json
26
+ * { "cleanup": { "intervalMs": 604800000 } }
27
+ * ```
28
+ * Default: 604800000 ms (7 days / weekly).
29
+ *
30
+ * @module web/server/usage-cleanup-scheduler
31
+ */
32
+ import type { IncrementalTaskUsageAggregator } from "./incremental-task-usage.js";
33
+ import type { TaskUsageAccumulator, CollectAllIdsFn, OrphanedEntry, CleanupResult, CleanupLogEntry, CleanupConfig } from "./shared-types.js";
34
+ export type { CollectAllIdsFn, OrphanedEntry, CleanupResult, CleanupLogEntry, CleanupConfig } from "./shared-types.js";
35
+ /** Default cleanup interval: 7 days (weekly). */
36
+ export declare const DEFAULT_CLEANUP_INTERVAL_MS: number;
37
+ /**
38
+ * Identify orphaned usage entries by cross-referencing with valid PRD task IDs.
39
+ *
40
+ * Returns entries from `taskUsage` whose task IDs are not in `validTaskIds`.
41
+ * Pure function — no side effects.
42
+ */
43
+ export declare function identifyOrphanedEntries(taskUsage: Record<string, TaskUsageAccumulator>, validTaskIds: Set<string>): OrphanedEntry[];
44
+ /**
45
+ * Write a cleanup log entry to the JSONL audit file.
46
+ *
47
+ * Creates parent directories if they do not exist. Failures are silently
48
+ * swallowed — log writes are best-effort and must not break the cleanup cycle.
49
+ */
50
+ export declare function writeCleanupLog(logPath: string, entry: CleanupLogEntry): void;
51
+ /**
52
+ * Load cleanup configuration from `.n-dx.json`.
53
+ *
54
+ * Reads the `cleanup.intervalMs` key. Returns defaults for missing,
55
+ * malformed, or invalid configuration.
56
+ */
57
+ export declare function loadCleanupConfig(projectDir: string): CleanupConfig;
58
+ /** Signature for PRD loaders compatible with `loadPRDSync`. */
59
+ export type LoadPRDFn = (rexDir: string) => unknown;
60
+ /**
61
+ * Execute a single cleanup cycle.
62
+ *
63
+ * Cross-references current aggregated usage with the PRD to find orphaned
64
+ * entries, prunes them from the aggregator, and optionally logs and broadcasts
65
+ * the result.
66
+ *
67
+ * **Critical data preservation**: only in-memory aggregation state is pruned.
68
+ * Run files on disk (`.hench/runs/*.json`) are never modified or deleted,
69
+ * ensuring usage data can always be recovered via `aggregator.reset()`.
70
+ *
71
+ * @param options.aggregator The incremental task usage aggregator to clean
72
+ * @param options.rexDir Path to the `.rex/` directory containing `prd.json`
73
+ * @param options.collectAllIds Injected function to extract IDs from PRD items
74
+ * @param options.logPath Optional path for the JSONL audit log
75
+ * @param options.broadcast Optional WebSocket broadcast function
76
+ * @param options.loadPRD PRD loader function (injected to avoid cross-zone coupling; required when collectAllIds is provided)
77
+ */
78
+ export declare function runCleanupCycle(options: {
79
+ aggregator: IncrementalTaskUsageAggregator;
80
+ rexDir: string;
81
+ collectAllIds?: CollectAllIdsFn;
82
+ logPath?: string;
83
+ broadcast?: (data: unknown) => void;
84
+ loadPRD?: LoadPRDFn;
85
+ }): Promise<CleanupResult>;
86
+ /**
87
+ * Start the periodic usage cleanup scheduler.
88
+ *
89
+ * Runs cleanup cycles on a configurable interval (read from `.n-dx.json`,
90
+ * default weekly). Each cycle cross-references usage data with the PRD
91
+ * and prunes orphaned entries.
92
+ *
93
+ * The returned interval handle should be stored in `watcherHandles.monitorIntervals`
94
+ * for proper cleanup during server shutdown.
95
+ *
96
+ * The timer is unref'd so it won't prevent process exit.
97
+ *
98
+ * @param ctx Server context with project paths
99
+ * @param getAggregator Factory to get the aggregator singleton for the runs directory
100
+ * @param broadcast Optional WebSocket broadcast function
101
+ * @param overrideIntervalMs Override interval (used for testing; takes precedence over config)
102
+ * @returns The setInterval handle
103
+ */
104
+ export declare function startUsageCleanupScheduler(ctx: {
105
+ rexDir: string;
106
+ projectDir: string;
107
+ }, getAggregator: () => IncrementalTaskUsageAggregator, broadcast?: (data: unknown) => void, overrideIntervalMs?: number, collectAllIds?: CollectAllIdsFn, loadPRD?: LoadPRDFn): ReturnType<typeof setInterval>;
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Periodic cleanup scheduler for orphaned usage records.
3
+ *
4
+ * Cross-references in-memory usage aggregation with the current PRD state
5
+ * to identify and prune entries whose tasks no longer exist. Only prunes
6
+ * the in-memory aggregation cache — run files on disk are preserved as
7
+ * the source of truth, ensuring critical data survives PRD restructuring.
8
+ *
9
+ * ## Design
10
+ *
11
+ * The cleanup cycle:
12
+ * 1. Reads current aggregated task usage from the IncrementalTaskUsageAggregator
13
+ * 2. Loads valid task IDs from the PRD via `collectAllIds()`
14
+ * 3. Identifies orphaned entries (usage for tasks not in PRD)
15
+ * 4. Prunes them from the aggregator's in-memory state
16
+ * 5. Logs removed entries to a JSONL audit file for auditability
17
+ * 6. Broadcasts a WebSocket event so the dashboard can react
18
+ *
19
+ * Graceful degradation: if the PRD is unavailable (not initialized, corrupt,
20
+ * etc.), the cleanup cycle is skipped entirely — no data is removed.
21
+ *
22
+ * ## Configuration
23
+ *
24
+ * The cleanup interval is read from `.n-dx.json`:
25
+ * ```json
26
+ * { "cleanup": { "intervalMs": 604800000 } }
27
+ * ```
28
+ * Default: 604800000 ms (7 days / weekly).
29
+ *
30
+ * @module web/server/usage-cleanup-scheduler
31
+ */
32
+ import { readFileSync, appendFileSync, existsSync, mkdirSync } from "node:fs";
33
+ import { join, dirname } from "node:path";
34
+ // ---------------------------------------------------------------------------
35
+ // Constants
36
+ // ---------------------------------------------------------------------------
37
+ /** Default cleanup interval: 7 days (weekly). */
38
+ export const DEFAULT_CLEANUP_INTERVAL_MS = 7 * 24 * 60 * 60 * 1000;
39
+ // ---------------------------------------------------------------------------
40
+ // Pure functions
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * Identify orphaned usage entries by cross-referencing with valid PRD task IDs.
44
+ *
45
+ * Returns entries from `taskUsage` whose task IDs are not in `validTaskIds`.
46
+ * Pure function — no side effects.
47
+ */
48
+ export function identifyOrphanedEntries(taskUsage, validTaskIds) {
49
+ const orphaned = [];
50
+ for (const [taskId, acc] of Object.entries(taskUsage)) {
51
+ if (!validTaskIds.has(taskId)) {
52
+ orphaned.push({
53
+ taskId,
54
+ totalTokens: acc.totalTokens,
55
+ runCount: acc.runCount,
56
+ });
57
+ }
58
+ }
59
+ return orphaned;
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // I/O helpers
63
+ // ---------------------------------------------------------------------------
64
+ /**
65
+ * Write a cleanup log entry to the JSONL audit file.
66
+ *
67
+ * Creates parent directories if they do not exist. Failures are silently
68
+ * swallowed — log writes are best-effort and must not break the cleanup cycle.
69
+ */
70
+ export function writeCleanupLog(logPath, entry) {
71
+ try {
72
+ const dir = dirname(logPath);
73
+ if (!existsSync(dir))
74
+ mkdirSync(dir, { recursive: true });
75
+ appendFileSync(logPath, JSON.stringify(entry) + "\n", "utf-8");
76
+ }
77
+ catch {
78
+ // Non-fatal: log write failure should not break cleanup
79
+ }
80
+ }
81
+ /**
82
+ * Load cleanup configuration from `.n-dx.json`.
83
+ *
84
+ * Reads the `cleanup.intervalMs` key. Returns defaults for missing,
85
+ * malformed, or invalid configuration.
86
+ */
87
+ export function loadCleanupConfig(projectDir) {
88
+ const defaults = { intervalMs: DEFAULT_CLEANUP_INTERVAL_MS };
89
+ const configPath = join(projectDir, ".n-dx.json");
90
+ if (!existsSync(configPath))
91
+ return defaults;
92
+ try {
93
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
94
+ const cleanup = raw.cleanup;
95
+ if (typeof cleanup !== "object" || cleanup === null)
96
+ return defaults;
97
+ const intervalMs = cleanup.intervalMs;
98
+ if (typeof intervalMs === "number" && intervalMs > 0) {
99
+ return { intervalMs };
100
+ }
101
+ return defaults;
102
+ }
103
+ catch {
104
+ return defaults;
105
+ }
106
+ }
107
+ /**
108
+ * Load valid task IDs from the PRD file.
109
+ *
110
+ * Returns null if the PRD cannot be read, allowing callers to degrade
111
+ * gracefully (skip cleanup rather than removing everything).
112
+ */
113
+ function loadValidTaskIds(rexDir, collectAllIds, loadPRD) {
114
+ const doc = loadPRD(rexDir);
115
+ if (!doc || !Array.isArray(doc.items))
116
+ return null;
117
+ return collectAllIds(doc.items);
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // Core cleanup logic
121
+ // ---------------------------------------------------------------------------
122
+ /**
123
+ * Execute a single cleanup cycle.
124
+ *
125
+ * Cross-references current aggregated usage with the PRD to find orphaned
126
+ * entries, prunes them from the aggregator, and optionally logs and broadcasts
127
+ * the result.
128
+ *
129
+ * **Critical data preservation**: only in-memory aggregation state is pruned.
130
+ * Run files on disk (`.hench/runs/*.json`) are never modified or deleted,
131
+ * ensuring usage data can always be recovered via `aggregator.reset()`.
132
+ *
133
+ * @param options.aggregator The incremental task usage aggregator to clean
134
+ * @param options.rexDir Path to the `.rex/` directory containing `prd.json`
135
+ * @param options.collectAllIds Injected function to extract IDs from PRD items
136
+ * @param options.logPath Optional path for the JSONL audit log
137
+ * @param options.broadcast Optional WebSocket broadcast function
138
+ * @param options.loadPRD PRD loader function (injected to avoid cross-zone coupling; required when collectAllIds is provided)
139
+ */
140
+ export async function runCleanupCycle(options) {
141
+ const { aggregator, rexDir, collectAllIds: collectIds, logPath, broadcast, loadPRD } = options;
142
+ // Ensure aggregator is populated before checking for orphans
143
+ const taskUsage = await aggregator.getTaskUsage();
144
+ const validIds = collectIds && loadPRD ? loadValidTaskIds(rexDir, collectIds, loadPRD) : null;
145
+ const result = {
146
+ timestamp: new Date().toISOString(),
147
+ prdAvailable: validIds !== null,
148
+ orphanedEntries: [],
149
+ totalOrphaned: 0,
150
+ totalTokensRemoved: 0,
151
+ totalRunsRemoved: 0,
152
+ };
153
+ // Skip cleanup if PRD is unavailable — we cannot determine which tasks
154
+ // are valid, so removing anything would risk data loss.
155
+ if (!validIds) {
156
+ return result;
157
+ }
158
+ const orphaned = identifyOrphanedEntries(taskUsage, validIds);
159
+ if (orphaned.length === 0) {
160
+ return result;
161
+ }
162
+ // Prune from aggregator's in-memory state
163
+ aggregator.pruneStaleEntries(validIds);
164
+ result.orphanedEntries = orphaned;
165
+ result.totalOrphaned = orphaned.length;
166
+ result.totalTokensRemoved = orphaned.reduce((sum, e) => sum + e.totalTokens, 0);
167
+ result.totalRunsRemoved = orphaned.reduce((sum, e) => sum + e.runCount, 0);
168
+ // Write audit log for accountability
169
+ if (logPath) {
170
+ writeCleanupLog(logPath, { event: "usage_cleanup", ...result });
171
+ }
172
+ // Broadcast so the dashboard knows cleanup occurred
173
+ if (broadcast) {
174
+ broadcast({
175
+ type: "hench:usage-cleanup",
176
+ ...result,
177
+ });
178
+ }
179
+ return result;
180
+ }
181
+ // ---------------------------------------------------------------------------
182
+ // Scheduler
183
+ // ---------------------------------------------------------------------------
184
+ /**
185
+ * Start the periodic usage cleanup scheduler.
186
+ *
187
+ * Runs cleanup cycles on a configurable interval (read from `.n-dx.json`,
188
+ * default weekly). Each cycle cross-references usage data with the PRD
189
+ * and prunes orphaned entries.
190
+ *
191
+ * The returned interval handle should be stored in `watcherHandles.monitorIntervals`
192
+ * for proper cleanup during server shutdown.
193
+ *
194
+ * The timer is unref'd so it won't prevent process exit.
195
+ *
196
+ * @param ctx Server context with project paths
197
+ * @param getAggregator Factory to get the aggregator singleton for the runs directory
198
+ * @param broadcast Optional WebSocket broadcast function
199
+ * @param overrideIntervalMs Override interval (used for testing; takes precedence over config)
200
+ * @returns The setInterval handle
201
+ */
202
+ export function startUsageCleanupScheduler(ctx, getAggregator, broadcast, overrideIntervalMs, collectAllIds, loadPRD) {
203
+ const logPath = join(ctx.projectDir, ".hench", "usage-cleanup.jsonl");
204
+ // Determine interval: explicit override > .n-dx.json config > default
205
+ const intervalMs = overrideIntervalMs ?? loadCleanupConfig(ctx.projectDir).intervalMs;
206
+ const timer = setInterval(async () => {
207
+ try {
208
+ const aggregator = getAggregator();
209
+ const result = await runCleanupCycle({
210
+ aggregator,
211
+ rexDir: ctx.rexDir,
212
+ collectAllIds,
213
+ logPath,
214
+ broadcast,
215
+ loadPRD,
216
+ });
217
+ if (result.totalOrphaned > 0) {
218
+ console.log(`[usage-cleanup] Removed ${result.totalOrphaned} orphaned task(s): ` +
219
+ `${result.totalTokensRemoved} tokens across ${result.totalRunsRemoved} run(s)`);
220
+ }
221
+ }
222
+ catch (err) {
223
+ // Non-fatal: cleanup errors must not crash the server
224
+ console.error("[usage-cleanup] Error during cleanup cycle:", err);
225
+ }
226
+ }, intervalMs);
227
+ if (timer.unref) {
228
+ timer.unref();
229
+ }
230
+ return timer;
231
+ }
232
+ //# sourceMappingURL=usage-cleanup-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-cleanup-scheduler.js","sourceRoot":"","sources":["../../src/server/usage-cleanup-scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * WebSocket support for real-time updates.
3
+ *
4
+ * Implements the WebSocket protocol (RFC 6455) using only Node.js built-in
5
+ * modules — no external dependencies required.
6
+ *
7
+ * Supports:
8
+ * - Broadcasting PRD item changes to connected clients
9
+ * - Broadcasting file-change events (sourcevision data updates)
10
+ * - Immediate disconnect detection via socket events + pre-broadcast pruning
11
+ * - Ping/pong keepalive (reduced interval safety net)
12
+ * - Connection health tracking and lifecycle metrics
13
+ */
14
+ import type { IncomingMessage } from "node:http";
15
+ import type { Duplex } from "node:stream";
16
+ /** Reason a client was removed from the connection set. */
17
+ export type CleanupReason = "close" | "error" | "end" | "ping_timeout" | "prune" | "shutdown" | "write_fail";
18
+ /** Health level derived from cleanup failure rate and connection trends. */
19
+ export type WsHealthLevel = "healthy" | "degraded" | "unhealthy";
20
+ /** Snapshot of WebSocket health metrics for API/broadcast consumption. */
21
+ export interface WsHealthSnapshot {
22
+ /** Current number of active connections. */
23
+ activeConnections: number;
24
+ /** Peak concurrent connections seen since server start. */
25
+ peakConnections: number;
26
+ /** Total connections accepted since server start. */
27
+ totalConnectionsAccepted: number;
28
+ /** Total connections removed (for any reason) since server start. */
29
+ totalConnectionsRemoved: number;
30
+ /** Cleanup metrics broken down by reason. */
31
+ cleanupsByReason: Record<CleanupReason, number>;
32
+ /** Number of cleanups in the last 60 seconds. */
33
+ recentCleanups: number;
34
+ /** Average connection duration (ms) for connections closed in the last 5 minutes. */
35
+ avgConnectionDurationMs: number;
36
+ /** Total broadcasts sent since server start. */
37
+ totalBroadcasts: number;
38
+ /** Total failed writes during broadcasts. */
39
+ totalBroadcastWriteFailures: number;
40
+ /** Cleanup success rate (0–1): successful cleanups / total cleanups. */
41
+ cleanupSuccessRate: number;
42
+ /** Average cleanup timing (ms): how quickly dead connections are detected. */
43
+ avgCleanupLatencyMs: number;
44
+ /** Overall health level. */
45
+ health: WsHealthLevel;
46
+ /** Server uptime in milliseconds. */
47
+ uptimeMs: number;
48
+ /** ISO timestamp of this snapshot. */
49
+ timestamp: string;
50
+ }
51
+ /**
52
+ * WebSocket connection health tracker — records connection lifecycle events,
53
+ * cleanup metrics, and resource usage for dashboard monitoring.
54
+ *
55
+ * Instruments the WebSocket manager to collect:
56
+ * - Active vs total (historical peak) connection counts
57
+ * - Cleanup events: successful removals, reasons, timing
58
+ * - Broadcast statistics: total broadcasts, failed writes
59
+ * - Connection duration tracking
60
+ *
61
+ * Designed as a singleton that accumulates metrics over the server lifetime.
62
+ * Provides a snapshot API consumed by the REST endpoint and WS broadcast.
63
+ */
64
+ export declare class WsHealthTracker {
65
+ private readonly startedAt;
66
+ private activeConnectionCount;
67
+ private peakConnectionCount;
68
+ private totalAccepted;
69
+ private totalRemoved;
70
+ private readonly connectionStartTimes;
71
+ private connectionIdCounter;
72
+ private readonly cleanupHistory;
73
+ private readonly cleanupsByReason;
74
+ private totalBroadcasts;
75
+ private totalWriteFailures;
76
+ private cleanupLatencySum;
77
+ private cleanupLatencyCount;
78
+ /**
79
+ * Record a new connection being accepted.
80
+ * Returns a connection ID to pass to `recordDisconnect()`.
81
+ */
82
+ recordConnect(): string;
83
+ /**
84
+ * Record a connection being removed.
85
+ */
86
+ recordDisconnect(connectionId: string, reason: CleanupReason): void;
87
+ /** Record a broadcast attempt. */
88
+ recordBroadcast(): void;
89
+ /** Record a failed write during broadcast. */
90
+ recordBroadcastWriteFailure(): void;
91
+ /**
92
+ * Sync the active connection count with the actual client set size.
93
+ * Called periodically to correct any drift from missed events.
94
+ */
95
+ syncActiveCount(actualCount: number): void;
96
+ /** Get a snapshot of current health metrics. */
97
+ getSnapshot(): WsHealthSnapshot;
98
+ /** Reset all counters (for testing). */
99
+ reset(): void;
100
+ private computeHealth;
101
+ }
102
+ /** A broadcast function that sends a message to all connected clients. */
103
+ export type WebSocketBroadcaster = (data: unknown) => void;
104
+ /** Options for the WebSocket manager. */
105
+ export interface WebSocketManagerOptions {
106
+ /** Optional health tracker for connection lifecycle metrics. */
107
+ healthTracker?: WsHealthTracker;
108
+ }
109
+ /**
110
+ * Keepalive ping interval (ms). Reduced from 30 s for faster detection
111
+ * of silently dropped connections. Primary disconnect detection is
112
+ * event-driven (close/error/end handlers); pings are a safety net for
113
+ * connections that go silent without a TCP FIN/RST.
114
+ */
115
+ export declare const PING_INTERVAL_MS = 5000;
116
+ /**
117
+ * Create a WebSocket manager that handles upgrades and broadcasting.
118
+ *
119
+ * Usage:
120
+ * ```ts
121
+ * const ws = createWebSocketManager();
122
+ * server.on("upgrade", ws.handleUpgrade);
123
+ * ws.broadcast({ type: "rex:item-updated", itemId: "..." });
124
+ * ```
125
+ */
126
+ export declare function createWebSocketManager(opts?: WebSocketManagerOptions): {
127
+ handleUpgrade: (req: IncomingMessage, socket: Duplex, head: Buffer) => void;
128
+ broadcast: WebSocketBroadcaster;
129
+ clientCount: () => number;
130
+ shutdown: () => void;
131
+ };