@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,115 @@
1
+ /**
2
+ * Route state management hook for the viewer app.
3
+ *
4
+ * Manages the active view, selected entity IDs (file, zone, run, task),
5
+ * URL history synchronisation, and backward-compat migration of legacy hash URLs.
6
+ */
7
+ import { useState, useCallback, useEffect } from "preact/hooks";
8
+ import { parseLegacyHashRoute, resolveLocationRoute } from "../route-state.js";
9
+ function defaultView(validViews) {
10
+ return validViews.values().next().value;
11
+ }
12
+ function getInitialView(validViews) {
13
+ const parsed = resolveLocationRoute(location.pathname, location.hash, validViews);
14
+ return parsed?.view ?? defaultView(validViews);
15
+ }
16
+ function getInitialRunId(validViews) {
17
+ const parsed = resolveLocationRoute(location.pathname, location.hash, validViews);
18
+ if (!parsed || parsed.view !== "hench-runs")
19
+ return null;
20
+ return parsed.subId;
21
+ }
22
+ function getInitialTaskId(validViews) {
23
+ const parsed = resolveLocationRoute(location.pathname, location.hash, validViews);
24
+ if (!parsed || parsed.view !== "prd")
25
+ return null;
26
+ return parsed.subId;
27
+ }
28
+ export function useRouteState(validViews) {
29
+ const [view, setView] = useState(() => getInitialView(validViews));
30
+ const [selectedRunId, setSelectedRunId] = useState(() => getInitialRunId(validViews));
31
+ const [selectedTaskId, setSelectedTaskId] = useState(() => getInitialTaskId(validViews));
32
+ const [selectedFile, setSelectedFile] = useState(null);
33
+ const [selectedZone, setSelectedZone] = useState(null);
34
+ const navigateTo = useCallback((targetView, opts) => {
35
+ const file = opts?.file ?? null;
36
+ const zone = opts?.zone ?? null;
37
+ const runId = opts?.runId ?? null;
38
+ const taskId = opts?.taskId ?? null;
39
+ setSelectedFile(file);
40
+ setSelectedZone(zone);
41
+ setSelectedRunId(runId);
42
+ setSelectedTaskId(taskId);
43
+ setView(targetView);
44
+ const subId = runId ?? taskId;
45
+ const urlPath = subId ? `/${targetView}/${subId}` : `/${targetView}`;
46
+ history.pushState({ view: targetView, file, zone, runId, taskId }, "", urlPath);
47
+ }, []);
48
+ const handleSidebarNav = useCallback((id) => {
49
+ setSelectedFile(null);
50
+ setSelectedZone(null);
51
+ setSelectedRunId(null);
52
+ setSelectedTaskId(null);
53
+ setView(id);
54
+ history.pushState({ view: id, file: null, zone: null, runId: null, taskId: null }, "", `/${id}`);
55
+ }, []);
56
+ useEffect(() => {
57
+ // Backward compat: migrate old hash URLs to path URLs
58
+ const hashRoute = parseLegacyHashRoute(location.hash, validViews);
59
+ if (hashRoute) {
60
+ const isRunView = hashRoute.view === "hench-runs";
61
+ const isTaskView = hashRoute.view === "prd";
62
+ const runId = isRunView ? hashRoute.subId : null;
63
+ const taskId = isTaskView ? hashRoute.subId : null;
64
+ setView(hashRoute.view);
65
+ setSelectedFile(null);
66
+ setSelectedZone(null);
67
+ setSelectedRunId(runId);
68
+ setSelectedTaskId(taskId);
69
+ const hashUrl = hashRoute.subId ? `/${hashRoute.view}/${hashRoute.subId}` : `/${hashRoute.view}`;
70
+ history.replaceState({ view: hashRoute.view, file: null, zone: null, runId, taskId }, "", hashUrl);
71
+ }
72
+ else {
73
+ // Seed the initial history entry — preserve deep-link path if present
74
+ const subId = selectedRunId ?? selectedTaskId;
75
+ const initialUrl = subId ? `/${view}/${subId}` : `/${view}`;
76
+ history.replaceState({ view, file: selectedFile, zone: selectedZone, runId: selectedRunId, taskId: selectedTaskId }, "", initialUrl);
77
+ }
78
+ const handlePopState = (e) => {
79
+ if (e.state) {
80
+ const s = e.state;
81
+ if (s.view && validViews.has(s.view)) {
82
+ setView(s.view);
83
+ setSelectedFile(s.file ?? null);
84
+ setSelectedZone(s.zone ?? null);
85
+ setSelectedRunId(s.runId ?? null);
86
+ setSelectedTaskId(s.taskId ?? null);
87
+ return;
88
+ }
89
+ }
90
+ const parsed = resolveLocationRoute(location.pathname, location.hash, validViews)
91
+ ?? { view: defaultView(validViews), subId: null };
92
+ setView(parsed.view);
93
+ setSelectedFile(null);
94
+ setSelectedZone(null);
95
+ const isRunView = parsed.view === "hench-runs";
96
+ const isTaskView = parsed.view === "prd";
97
+ setSelectedRunId(isRunView ? parsed.subId : null);
98
+ setSelectedTaskId(isTaskView ? parsed.subId : null);
99
+ const fallbackUrl = parsed.subId ? `/${parsed.view}/${parsed.subId}` : `/${parsed.view}`;
100
+ history.replaceState({
101
+ view: parsed.view,
102
+ file: null,
103
+ zone: null,
104
+ runId: isRunView ? parsed.subId : null,
105
+ taskId: isTaskView ? parsed.subId : null,
106
+ }, "", fallbackUrl);
107
+ };
108
+ window.addEventListener("popstate", handlePopState);
109
+ return () => {
110
+ window.removeEventListener("popstate", handlePopState);
111
+ };
112
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
113
+ return { view, selectedFile, setSelectedFile, selectedZone, selectedRunId, selectedTaskId, navigateTo, handleSidebarNav };
114
+ }
115
+ //# sourceMappingURL=use-route-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-route-state.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-route-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * useSubZoneEdges — Compute subzone-level edges for the zone diagram.
3
+ *
4
+ * When a zone with subzones is expanded inline, this hook produces:
5
+ * 1. Internal subCrossing edges (dashed arcs between subzone rows)
6
+ * 2. External-to-subzone edges (from external zone boxes to specific subzone rows)
7
+ */
8
+ import type { ZoneData, FlowEdge, BoxRect, FileConnectionMap, ExpandedSubZones } from "../views/zone-types.js";
9
+ interface SubZoneEdgeElement {
10
+ key: string;
11
+ d: string;
12
+ color: string;
13
+ weight: number;
14
+ dashed?: boolean;
15
+ }
16
+ export interface SubZoneEdgesResult {
17
+ subZoneEdgeElements: SubZoneEdgeElement[];
18
+ hiddenZoneEdges: Set<string>;
19
+ }
20
+ export declare function useSubZoneEdges(edges: FlowEdge[], boxes: Map<string, BoxRect>, expandedZones: Set<string>, expandedSubZones: ExpandedSubZones, zoneById: Map<string, ZoneData>, fileConnections: FileConnectionMap): SubZoneEdgesResult;
21
+ export {};
@@ -0,0 +1,147 @@
1
+ /**
2
+ * useSubZoneEdges — Compute subzone-level edges for the zone diagram.
3
+ *
4
+ * When a zone with subzones is expanded inline, this hook produces:
5
+ * 1. Internal subCrossing edges (dashed arcs between subzone rows)
6
+ * 2. External-to-subzone edges (from external zone boxes to specific subzone rows)
7
+ */
8
+ import { useMemo } from "preact/hooks";
9
+ const BOX_H_COLLAPSED = 80;
10
+ const SUBZONE_ROW_H = 28;
11
+ const SUBZONE_ROWS_MAX = 10;
12
+ const FILE_ROW_H = 22;
13
+ const FILE_ROWS_MAX = 15;
14
+ /**
15
+ * Get the Y center of a subzone row within an expanded zone box,
16
+ * accounting for any expanded subzones above it that show nested files.
17
+ */
18
+ function subZoneRowY(box, subZones, targetIndex, expandedSubZoneIds) {
19
+ let y = box.y + BOX_H_COLLAPSED - 4;
20
+ const limit = Math.min(targetIndex, SUBZONE_ROWS_MAX);
21
+ for (let i = 0; i < limit; i++) {
22
+ y += SUBZONE_ROW_H;
23
+ if (expandedSubZoneIds?.has(subZones[i].id)) {
24
+ const fileRows = Math.min(subZones[i].files.length, FILE_ROWS_MAX);
25
+ y += fileRows * FILE_ROW_H + (subZones[i].files.length > FILE_ROWS_MAX ? 20 : 0);
26
+ }
27
+ }
28
+ return y + SUBZONE_ROW_H / 2;
29
+ }
30
+ function boxEdgeAnchor(box, tx, ty) {
31
+ const cx = box.x + box.w / 2;
32
+ const cy = box.y + box.h / 2;
33
+ const dx = tx - cx;
34
+ const dy = ty - cy;
35
+ if (dx === 0 && dy === 0)
36
+ return { x: cx, y: cy };
37
+ const hw = box.w / 2;
38
+ const hh = box.h / 2;
39
+ const sx = dx !== 0 ? hw / Math.abs(dx) : Infinity;
40
+ const sy = dy !== 0 ? hh / Math.abs(dy) : Infinity;
41
+ const s = Math.min(sx, sy);
42
+ return { x: cx + dx * s, y: cy + dy * s };
43
+ }
44
+ export function useSubZoneEdges(edges, boxes, expandedZones, expandedSubZones, zoneById, fileConnections) {
45
+ const subZoneEdgeElements = useMemo(() => {
46
+ const elements = [];
47
+ for (const [zoneId, zone] of zoneById) {
48
+ if (!expandedZones.has(zoneId))
49
+ continue;
50
+ if (!zone.subZones || zone.subZones.length === 0)
51
+ continue;
52
+ const box = boxes.get(zoneId);
53
+ if (!box)
54
+ continue;
55
+ const szIds = expandedSubZones.get(zoneId);
56
+ const visibleSz = zone.subZones.slice(0, SUBZONE_ROWS_MAX);
57
+ const szIndexMap = new Map(visibleSz.map((sz, i) => [sz.id, i]));
58
+ // 1. Internal subCrossing edges (dashed arcs between subzone rows)
59
+ if (zone.subCrossings) {
60
+ for (const crossing of zone.subCrossings) {
61
+ const fromIdx = szIndexMap.get(crossing.from);
62
+ const toIdx = szIndexMap.get(crossing.to);
63
+ if (fromIdx === undefined || toIdx === undefined)
64
+ continue;
65
+ const fromY = subZoneRowY(box, visibleSz, fromIdx, szIds);
66
+ const toY = subZoneRowY(box, visibleSz, toIdx, szIds);
67
+ // Arc looping to the right of the parent box
68
+ const arcX = box.x + box.w + 30;
69
+ const d = `M ${box.x + box.w} ${fromY} C ${arcX} ${fromY} ${arcX} ${toY} ${box.x + box.w} ${toY}`;
70
+ const fromSz = visibleSz[fromIdx];
71
+ elements.push({
72
+ key: `szc-${zoneId}-${crossing.from}-${crossing.to}`,
73
+ d,
74
+ color: fromSz.color,
75
+ weight: crossing.weight,
76
+ dashed: true,
77
+ });
78
+ }
79
+ }
80
+ // 2. External-to-subzone edges
81
+ // Build file→subzone index map
82
+ const fileToSzIdx = new Map();
83
+ for (let i = 0; i < visibleSz.length; i++) {
84
+ for (const file of visibleSz[i].files) {
85
+ fileToSzIdx.set(file.path, i);
86
+ }
87
+ }
88
+ for (const edge of edges) {
89
+ const isFrom = edge.from === zoneId;
90
+ const isTo = edge.to === zoneId;
91
+ if (!isFrom && !isTo)
92
+ continue;
93
+ const otherZoneId = isFrom ? edge.to : edge.from;
94
+ const otherBox = boxes.get(otherZoneId);
95
+ if (!otherBox)
96
+ continue;
97
+ // Aggregate weights per subzone
98
+ const szWeights = new Map();
99
+ for (const [filePath, conns] of fileConnections) {
100
+ const szIdx = fileToSzIdx.get(filePath);
101
+ if (szIdx === undefined)
102
+ continue;
103
+ for (const conn of conns) {
104
+ if (conn.targetZoneId === otherZoneId) {
105
+ szWeights.set(szIdx, (szWeights.get(szIdx) ?? 0) + conn.weight);
106
+ }
107
+ }
108
+ }
109
+ for (const [szIdx, weight] of szWeights) {
110
+ const szY = subZoneRowY(box, visibleSz, szIdx, szIds);
111
+ const fromX = otherBox.x > box.x ? box.x + box.w : box.x;
112
+ const clampedY = Math.max(box.y + 4, Math.min(szY, box.y + box.h - 4));
113
+ const to = boxEdgeAnchor(otherBox, fromX, clampedY);
114
+ const dx = to.x - fromX;
115
+ const cp1x = fromX + dx * 0.4;
116
+ const cp2x = fromX + dx * 0.6;
117
+ const d = `M ${fromX} ${clampedY} C ${cp1x} ${clampedY} ${cp2x} ${to.y} ${to.x} ${to.y}`;
118
+ const sz = visibleSz[szIdx];
119
+ elements.push({
120
+ key: `sze-${zoneId}-${sz.id}-${otherZoneId}`,
121
+ d,
122
+ color: sz.color,
123
+ weight,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ return elements;
129
+ }, [edges, boxes, expandedZones, expandedSubZones, zoneById, fileConnections]);
130
+ const hiddenZoneEdges = useMemo(() => {
131
+ const hidden = new Set();
132
+ for (const edge of edges) {
133
+ const fromZone = zoneById.get(edge.from);
134
+ const toZone = zoneById.get(edge.to);
135
+ const fromHasSubZones = expandedZones.has(edge.from) && fromZone?.subZones?.length;
136
+ const toHasSubZones = expandedZones.has(edge.to) && toZone?.subZones?.length;
137
+ if (fromHasSubZones || toHasSubZones) {
138
+ const hasSubEdges = subZoneEdgeElements.some((se) => se.key.includes(edge.from) || se.key.includes(edge.to));
139
+ if (hasSubEdges)
140
+ hidden.add(`${edge.from}->${edge.to}`);
141
+ }
142
+ }
143
+ return hidden;
144
+ }, [edges, expandedZones, zoneById, subZoneEdgeElements]);
145
+ return { subZoneEdgeElements, hiddenZoneEdges };
146
+ }
147
+ //# sourceMappingURL=use-subzone-edges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-subzone-edges.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-subzone-edges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Preact hook for tab visibility state management.
3
+ *
4
+ * Provides reactive tab visibility state to components. Starts the
5
+ * tab visibility monitor on mount, cleans up on unmount, and triggers
6
+ * re-renders only when the visibility state changes.
7
+ */
8
+ import { type TabVisibilityState, type TabVisibilitySnapshot, type VisibilityAPICapabilities } from "../polling/index.js";
9
+ export interface UseTabVisibilityResult {
10
+ /** Current tab visibility state ("visible" or "hidden"). */
11
+ state: TabVisibilityState;
12
+ /** Whether the tab is currently visible (convenience boolean). */
13
+ isVisible: boolean;
14
+ /** Full visibility snapshot with timing information. */
15
+ snapshot: TabVisibilitySnapshot;
16
+ /** Browser API capabilities for the Page Visibility API. */
17
+ capabilities: VisibilityAPICapabilities;
18
+ }
19
+ /**
20
+ * Hook that provides real-time tab visibility state.
21
+ *
22
+ * Usage:
23
+ * ```tsx
24
+ * const { isVisible, state, capabilities } = useTabVisibility();
25
+ * if (!isVisible) return null; // skip rendering when hidden
26
+ * if (capabilities.usingFallback) {
27
+ * console.warn("Using focus/blur fallback — precision is reduced");
28
+ * }
29
+ * ```
30
+ */
31
+ export declare function useTabVisibility(): UseTabVisibilityResult;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Preact hook for tab visibility state management.
3
+ *
4
+ * Provides reactive tab visibility state to components. Starts the
5
+ * tab visibility monitor on mount, cleans up on unmount, and triggers
6
+ * re-renders only when the visibility state changes.
7
+ */
8
+ import { useState, useEffect } from "preact/hooks";
9
+ import { startTabVisibilityMonitor, stopTabVisibilityMonitor, onVisibilityChange, getTabVisibilitySnapshot, getVisibilityCapabilities, } from "../polling/index.js";
10
+ /**
11
+ * Hook that provides real-time tab visibility state.
12
+ *
13
+ * Usage:
14
+ * ```tsx
15
+ * const { isVisible, state, capabilities } = useTabVisibility();
16
+ * if (!isVisible) return null; // skip rendering when hidden
17
+ * if (capabilities.usingFallback) {
18
+ * console.warn("Using focus/blur fallback — precision is reduced");
19
+ * }
20
+ * ```
21
+ */
22
+ export function useTabVisibility() {
23
+ const [snapshot, setSnapshot] = useState(getTabVisibilitySnapshot);
24
+ useEffect(() => {
25
+ startTabVisibilityMonitor();
26
+ const unsubscribe = onVisibilityChange((newSnapshot) => {
27
+ setSnapshot(newSnapshot);
28
+ });
29
+ // Sync with current state in case it changed between render and effect.
30
+ setSnapshot(getTabVisibilitySnapshot());
31
+ return () => {
32
+ unsubscribe();
33
+ stopTabVisibilityMonitor();
34
+ };
35
+ }, []);
36
+ return {
37
+ state: snapshot.state,
38
+ isVisible: snapshot.isVisible,
39
+ snapshot,
40
+ capabilities: getVisibilityCapabilities(),
41
+ };
42
+ }
43
+ //# sourceMappingURL=use-tab-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tab-visibility.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-tab-visibility.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,GAI1B,MAAM,qBAAqB,CAAC;AAa7B;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CACtC,wBAAwB,CACzB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,yBAAyB,EAAE,CAAC;QAE5B,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,EAAE;YACrD,WAAW,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,wEAAwE;QACxE,WAAW,CAAC,wBAAwB,EAAE,CAAC,CAAC;QAExC,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,wBAAwB,EAAE,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ;QACR,YAAY,EAAE,yBAAyB,EAAE;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Preact hook for shared elapsed-time tick updates.
3
+ *
4
+ * Wraps the batched tick dispatcher to provide a simple hook interface for
5
+ * components that display live elapsed durations (e.g. task cards with
6
+ * running timers). All components share a single 1-second setInterval via
7
+ * the tick timer, and state updates are batched into a single
8
+ * requestAnimationFrame callback via the batched tick dispatcher.
9
+ *
10
+ * When 20+ task cards are visible simultaneously, this reduces re-renders
11
+ * from N individual setState calls to one batched reconciliation per tick.
12
+ *
13
+ * Usage:
14
+ * ```tsx
15
+ * // Replace:
16
+ * // const [elapsed, setElapsed] = useState(() => formatElapsed(startedAt));
17
+ * // useEffect(() => {
18
+ * // const id = setInterval(() => setElapsed(formatElapsed(startedAt)), 1000);
19
+ * // return () => clearInterval(id);
20
+ * // }, [startedAt]);
21
+ * //
22
+ * // With:
23
+ * const elapsed = useTick(startedAt, formatElapsed);
24
+ * ```
25
+ */
26
+ /**
27
+ * Subscribe to batched 1-second tick updates and return a formatted
28
+ * elapsed-time string that updates every second.
29
+ *
30
+ * State updates are batched across all `useTick` instances via RAF,
31
+ * so Preact reconciles all elapsed time displays in a single pass.
32
+ *
33
+ * Includes an equality check to skip redundant re-renders when the
34
+ * formatted value hasn't changed (e.g. timer precision edge cases,
35
+ * or formatters that produce the same string across consecutive ticks).
36
+ *
37
+ * @param startedAt - ISO 8601 timestamp of when the timer began.
38
+ * @param formatter - Pure function that converts a start timestamp to a
39
+ * display string. Called once per tick.
40
+ * Receives the ISO string and returns the formatted output.
41
+ * @returns The current formatted elapsed-time string.
42
+ */
43
+ export declare function useTick(startedAt: string, formatter: (startedAt: string) => string): string;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Preact hook for shared elapsed-time tick updates.
3
+ *
4
+ * Wraps the batched tick dispatcher to provide a simple hook interface for
5
+ * components that display live elapsed durations (e.g. task cards with
6
+ * running timers). All components share a single 1-second setInterval via
7
+ * the tick timer, and state updates are batched into a single
8
+ * requestAnimationFrame callback via the batched tick dispatcher.
9
+ *
10
+ * When 20+ task cards are visible simultaneously, this reduces re-renders
11
+ * from N individual setState calls to one batched reconciliation per tick.
12
+ *
13
+ * Usage:
14
+ * ```tsx
15
+ * // Replace:
16
+ * // const [elapsed, setElapsed] = useState(() => formatElapsed(startedAt));
17
+ * // useEffect(() => {
18
+ * // const id = setInterval(() => setElapsed(formatElapsed(startedAt)), 1000);
19
+ * // return () => clearInterval(id);
20
+ * // }, [startedAt]);
21
+ * //
22
+ * // With:
23
+ * const elapsed = useTick(startedAt, formatElapsed);
24
+ * ```
25
+ */
26
+ import { useState, useEffect, useRef, useCallback } from "preact/hooks";
27
+ import { registerTickUpdater } from "../polling/index.js";
28
+ /**
29
+ * Subscribe to batched 1-second tick updates and return a formatted
30
+ * elapsed-time string that updates every second.
31
+ *
32
+ * State updates are batched across all `useTick` instances via RAF,
33
+ * so Preact reconciles all elapsed time displays in a single pass.
34
+ *
35
+ * Includes an equality check to skip redundant re-renders when the
36
+ * formatted value hasn't changed (e.g. timer precision edge cases,
37
+ * or formatters that produce the same string across consecutive ticks).
38
+ *
39
+ * @param startedAt - ISO 8601 timestamp of when the timer began.
40
+ * @param formatter - Pure function that converts a start timestamp to a
41
+ * display string. Called once per tick.
42
+ * Receives the ISO string and returns the formatted output.
43
+ * @returns The current formatted elapsed-time string.
44
+ */
45
+ export function useTick(startedAt, formatter) {
46
+ // Keep refs current so the tick callback always uses the latest values
47
+ // without resubscribing to the timer.
48
+ const startedAtRef = useRef(startedAt);
49
+ startedAtRef.current = startedAt;
50
+ const formatterRef = useRef(formatter);
51
+ formatterRef.current = formatter;
52
+ const compute = useCallback(() => formatterRef.current(startedAtRef.current), []);
53
+ const [display, setDisplay] = useState(compute);
54
+ // Track the last emitted value so we can skip redundant setState calls.
55
+ // This ref is shared with the batched tick dispatcher — both sides
56
+ // read and write it to stay in sync.
57
+ const lastValueRef = useRef(display);
58
+ // Re-compute immediately when startedAt changes.
59
+ // This provides instant feedback (e.g. "0s" when a new task starts)
60
+ // without waiting for the next tick cycle.
61
+ useEffect(() => {
62
+ const next = compute();
63
+ if (next !== lastValueRef.current) {
64
+ lastValueRef.current = next;
65
+ setDisplay(next);
66
+ }
67
+ }, [startedAt, compute]);
68
+ // Register with the batched tick dispatcher.
69
+ // The dispatcher subscribes to onTick once and batches all registered
70
+ // setState calls into a single RAF frame.
71
+ useEffect(() => {
72
+ return registerTickUpdater(compute, setDisplay, lastValueRef);
73
+ }, [compute]);
74
+ return display;
75
+ }
76
+ //# sourceMappingURL=use-tick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tick.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-tick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CACrB,SAAiB,EACjB,SAAwC;IAExC,uEAAuE;IACvE,sCAAsC;IACtC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IAEjC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IAEjC,MAAM,OAAO,GAAG,WAAW,CACzB,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAChD,EAAE,CACH,CAAC;IAEF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEhD,wEAAwE;IACxE,mEAAmE;IACnE,qCAAqC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAErC,iDAAiD;IACjD,oEAAoE;IACpE,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YAClC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzB,6CAA6C;IAC7C,sEAAsE;IACtE,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Simple toast notification state hook.
3
+ *
4
+ * Manages a single toast message with configurable type (success/error)
5
+ * and auto-dismiss duration. Extracted from PRDView to enable reuse
6
+ * across views that need lightweight user feedback.
7
+ */
8
+ export type ToastType = "success" | "error";
9
+ export interface ToastState {
10
+ /** Currently visible toast message, or null when hidden. */
11
+ toast: string | null;
12
+ /** Visual variant — green for success, red for error. */
13
+ toastType: ToastType;
14
+ /** Show a toast that auto-dismisses after `duration` ms (default 3000). */
15
+ showToast: (message: string, type?: ToastType, duration?: number) => void;
16
+ }
17
+ /**
18
+ * Hook providing toast notification state and display logic.
19
+ *
20
+ * Returns a stable `showToast` callback that sets the message, type,
21
+ * and schedules auto-dismissal. Only one toast is visible at a time —
22
+ * calling `showToast` again replaces the current toast.
23
+ */
24
+ export declare function useToast(): ToastState;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Simple toast notification state hook.
3
+ *
4
+ * Manages a single toast message with configurable type (success/error)
5
+ * and auto-dismiss duration. Extracted from PRDView to enable reuse
6
+ * across views that need lightweight user feedback.
7
+ */
8
+ import { useState, useCallback } from "preact/hooks";
9
+ /**
10
+ * Hook providing toast notification state and display logic.
11
+ *
12
+ * Returns a stable `showToast` callback that sets the message, type,
13
+ * and schedules auto-dismissal. Only one toast is visible at a time —
14
+ * calling `showToast` again replaces the current toast.
15
+ */
16
+ export function useToast() {
17
+ const [toast, setToast] = useState(null);
18
+ const [toastType, setToastType] = useState("success");
19
+ const showToast = useCallback((message, type = "success", duration = 3000) => {
20
+ setToast(message);
21
+ setToastType(type);
22
+ setTimeout(() => setToast(null), duration);
23
+ }, []);
24
+ return { toast, toastType, showToast };
25
+ }
26
+ //# sourceMappingURL=use-toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-toast.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-toast.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAarD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,CAAC;IAEjE,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,OAAe,EAAE,OAAkB,SAAS,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE;QAChE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,EACD,EAAE,CACH,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * useZoneDrag — Zone box drag-and-drop positioning hook.
3
+ *
4
+ * Handles dragging zone boxes within the SVG diagram. Tracks drag offsets
5
+ * per zone and distinguishes between click (toggle) and drag gestures.
6
+ */
7
+ import type { RefObject } from "preact";
8
+ import type { ViewBox } from "./use-pan-zoom.js";
9
+ export interface ZoneDragState {
10
+ /** Per-zone position offsets from drag operations */
11
+ dragOffsets: Map<string, {
12
+ dx: number;
13
+ dy: number;
14
+ }>;
15
+ /** Whether a zone drag is currently active */
16
+ isDragging: () => boolean;
17
+ /** Start a zone drag from mousedown on a zone box */
18
+ startDrag: (zoneId: string, e: MouseEvent) => void;
19
+ /** Continue a zone drag during mousemove */
20
+ moveDrag: (e: MouseEvent) => void;
21
+ /** End a zone drag on mouseup, returning the zone ID if it was a click (not drag) */
22
+ endDrag: () => string | null;
23
+ }
24
+ /**
25
+ * Hook that manages zone box dragging within the SVG diagram.
26
+ *
27
+ * @param svgRef - Ref to the SVG element for coordinate conversion
28
+ * @param viewBox - Current viewBox for screen-to-SVG coordinate scaling
29
+ */
30
+ export declare function useZoneDrag(svgRef: RefObject<SVGSVGElement>, viewBox: ViewBox): ZoneDragState;