@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,250 @@
1
+ /**
2
+ * PRD CRUD action hooks — item update, add, delete, merge, and prune.
3
+ *
4
+ * Composes focused sub-hooks for selection and deletion, adding
5
+ * mutation handlers (update, add, execute) and detail panel sync.
6
+ *
7
+ * Each handler follows the optimistic update pattern:
8
+ *
9
+ * 1. Apply the change locally for instant UI feedback
10
+ * 2. Send the request to the server
11
+ * 3. Reconcile with authoritative server state
12
+ * 4. On failure, revert by re-fetching from server
13
+ *
14
+ * @see ./use-item-selection.ts — selection, bulk select, navigation
15
+ * @see ./use-delete-actions.ts — optimistic delete, modal, detail panel remove
16
+ * @see ../components/prd-tree/tree-differ.ts — applyItemUpdate (structural sharing)
17
+ */
18
+ import { useState, useCallback } from "preact/hooks";
19
+ import { h } from "preact";
20
+ import { TaskDetail } from "../components/prd-tree/task-detail.js";
21
+ import { findItemById } from "../components/prd-tree/tree-utils.js";
22
+ import { applyItemUpdate } from "../components/prd-tree/tree-differ.js";
23
+ import { useItemSelection } from "./use-item-selection.js";
24
+ import { useDeleteActions } from "./use-delete-actions.js";
25
+ /**
26
+ * Hook providing all PRD CRUD action handlers and related UI state.
27
+ *
28
+ * Composes {@link useItemSelection} for selection/navigation and
29
+ * {@link useDeleteActions} for optimistic deletion, then adds
30
+ * mutation handlers and detail panel synchronization.
31
+ */
32
+ export function usePRDActions({ data, setData, fetchPRDData, fetchTaskUsage, showToast, onSelectItem, onDetailContent, taskUsageById, weeklyBudget, showTokenBudget, navigateTo, }) {
33
+ const [activeTab, setActiveTab] = useState(null);
34
+ const [addParentId, setAddParentId] = useState(null);
35
+ // ── Selection (delegated to sub-hook) ─────────────────────────────
36
+ const { selectedItemId, setSelectedItemId, bulkSelectedIds, setBulkSelectedIds, selectedItems, handleSelectItem, handleBulkSelect, clearBulkSelection, handleNavigateToItem, } = useItemSelection({ data, onSelectItem });
37
+ // ── Deletion (delegated to sub-hook) ──────────────────────────────
38
+ const { deleteTarget, setDeleteTarget, deletingItemId, handleRemoveItemFromTree, handleConfirmDelete, handleRemoveFromDetail, } = useDeleteActions({
39
+ data,
40
+ setData,
41
+ fetchPRDData,
42
+ fetchTaskUsage,
43
+ showToast,
44
+ selectedItemId,
45
+ setSelectedItemId,
46
+ setBulkSelectedIds,
47
+ onDetailContent,
48
+ });
49
+ // ── Item update (optimistic + reconcile) ─────────────────────────
50
+ const handleItemUpdate = useCallback(async (id, updates) => {
51
+ setData((prev) => {
52
+ if (!prev)
53
+ return prev;
54
+ const newItems = applyItemUpdate(prev.items, id, updates);
55
+ return newItems === prev.items ? prev : { ...prev, items: newItems };
56
+ });
57
+ try {
58
+ const res = await fetch(`/api/rex/items/${id}`, {
59
+ method: "PATCH",
60
+ headers: { "Content-Type": "application/json" },
61
+ body: JSON.stringify(updates),
62
+ });
63
+ if (!res.ok) {
64
+ console.error("Failed to update item:", await res.text());
65
+ await fetchPRDData();
66
+ return;
67
+ }
68
+ await fetchPRDData();
69
+ await fetchTaskUsage();
70
+ }
71
+ catch (err) {
72
+ console.error("Failed to update item:", err);
73
+ await fetchPRDData();
74
+ }
75
+ }, [setData, fetchPRDData, fetchTaskUsage]);
76
+ // ── Add child (from detail panel) ────────────────────────────────
77
+ const handleAddChild = useCallback(async (input) => {
78
+ const res = await fetch("/api/rex/items", {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify(input),
82
+ });
83
+ if (!res.ok) {
84
+ const errBody = await res.json().catch(() => ({ error: "Failed to add item" }));
85
+ throw new Error(errBody.error || `HTTP ${res.status}`);
86
+ }
87
+ const result = await res.json();
88
+ showToast(`Created ${result.level}: ${result.title}`);
89
+ await fetchPRDData();
90
+ await fetchTaskUsage();
91
+ }, [fetchPRDData, fetchTaskUsage, showToast]);
92
+ // ── Execute task ─────────────────────────────────────────────────
93
+ const handleExecuteTask = useCallback(async (taskId) => {
94
+ const res = await fetch("/api/hench/execute", {
95
+ method: "POST",
96
+ headers: { "Content-Type": "application/json" },
97
+ body: JSON.stringify({ taskId }),
98
+ });
99
+ const body = await res.json();
100
+ if (!res.ok) {
101
+ throw new Error(body.error || `HTTP ${res.status}`);
102
+ }
103
+ showToast(`Hench execution started for task`);
104
+ }, [showToast]);
105
+ // ── Add item (command bar form) ──────────────────────────────────
106
+ const handleAddItem = useCallback(async (input) => {
107
+ const res = await fetch("/api/rex/items", {
108
+ method: "POST",
109
+ headers: { "Content-Type": "application/json" },
110
+ body: JSON.stringify(input),
111
+ });
112
+ if (!res.ok) {
113
+ const errBody = await res.json().catch(() => ({ error: "Failed to add item" }));
114
+ throw new Error(errBody.error || `HTTP ${res.status}`);
115
+ }
116
+ const result = await res.json();
117
+ showToast(`Created ${result.level}: ${result.title}`);
118
+ setActiveTab(null);
119
+ setAddParentId(null);
120
+ await fetchPRDData();
121
+ await fetchTaskUsage();
122
+ }, [fetchPRDData, fetchTaskUsage, showToast]);
123
+ // ── Inline add item (tree node form) ─────────────────────────────
124
+ const handleInlineAddItem = useCallback(async (input) => {
125
+ const res = await fetch("/api/rex/items", {
126
+ method: "POST",
127
+ headers: { "Content-Type": "application/json" },
128
+ body: JSON.stringify(input),
129
+ });
130
+ if (!res.ok) {
131
+ const errBody = await res.json().catch(() => ({ error: "Failed to add item" }));
132
+ throw new Error(errBody.error || `HTTP ${res.status}`);
133
+ }
134
+ const result = await res.json();
135
+ showToast(`Created ${result.level}: ${result.title}`);
136
+ await fetchPRDData();
137
+ await fetchTaskUsage();
138
+ }, [fetchPRDData, fetchTaskUsage, showToast]);
139
+ // ── Merge/prune completion ───────────────────────────────────────
140
+ const handleMergeComplete = useCallback(() => {
141
+ setActiveTab(null);
142
+ setBulkSelectedIds(new Set());
143
+ showToast("Items merged successfully");
144
+ fetchPRDData();
145
+ fetchTaskUsage();
146
+ }, [setBulkSelectedIds, fetchPRDData, fetchTaskUsage, showToast]);
147
+ const handlePruneComplete = useCallback(() => {
148
+ setActiveTab(null);
149
+ showToast("Completed items pruned and archived");
150
+ fetchPRDData();
151
+ fetchTaskUsage();
152
+ }, [fetchPRDData, fetchTaskUsage, showToast]);
153
+ const handleOpenMerge = useCallback(() => {
154
+ setActiveTab("merge");
155
+ }, []);
156
+ // ── Detail panel sync ────────────────────────────────────────────
157
+ // This is called as a side effect to keep the detail panel in sync
158
+ // with the current selection and data state.
159
+ const syncDetailContent = useCallback(() => {
160
+ if (!data || !selectedItemId || !onDetailContent) {
161
+ if (onDetailContent)
162
+ onDetailContent(null);
163
+ return;
164
+ }
165
+ const item = findItemById(data.items, selectedItemId);
166
+ if (!item) {
167
+ onDetailContent(null);
168
+ return;
169
+ }
170
+ // Keep the detail header in sync with the current item title
171
+ if (onSelectItem) {
172
+ onSelectItem({
173
+ type: "prd",
174
+ title: item.title,
175
+ id: item.id,
176
+ level: item.level,
177
+ status: item.status,
178
+ description: item.description,
179
+ acceptanceCriteria: item.acceptanceCriteria,
180
+ priority: item.priority,
181
+ tags: item.tags,
182
+ blockedBy: item.blockedBy,
183
+ startedAt: item.startedAt,
184
+ completedAt: item.completedAt,
185
+ });
186
+ }
187
+ onDetailContent(h(TaskDetail, {
188
+ item,
189
+ taskUsage: taskUsageById[item.id],
190
+ weeklyBudget,
191
+ showTokenBudget: showTokenBudget ?? false,
192
+ allItems: data.items,
193
+ onUpdate: handleItemUpdate,
194
+ onNavigateToItem: handleNavigateToItem,
195
+ onExecuteTask: handleExecuteTask,
196
+ onPrdChanged: () => {
197
+ fetchPRDData();
198
+ fetchTaskUsage();
199
+ },
200
+ onAddChild: handleAddChild,
201
+ onRemove: handleRemoveFromDetail,
202
+ navigateTo,
203
+ }));
204
+ }, [
205
+ data,
206
+ selectedItemId,
207
+ taskUsageById,
208
+ weeklyBudget,
209
+ showTokenBudget,
210
+ onSelectItem,
211
+ onDetailContent,
212
+ handleItemUpdate,
213
+ handleNavigateToItem,
214
+ handleExecuteTask,
215
+ fetchPRDData,
216
+ fetchTaskUsage,
217
+ handleAddChild,
218
+ handleRemoveFromDetail,
219
+ navigateTo,
220
+ ]);
221
+ return {
222
+ selectedItemId,
223
+ activeTab,
224
+ setActiveTab,
225
+ addParentId,
226
+ setAddParentId,
227
+ bulkSelectedIds,
228
+ selectedItems,
229
+ deleteTarget,
230
+ setDeleteTarget,
231
+ deletingItemId,
232
+ handleItemUpdate,
233
+ handleSelectItem,
234
+ handleBulkSelect,
235
+ clearBulkSelection,
236
+ handleNavigateToItem,
237
+ handleAddChild,
238
+ handleExecuteTask,
239
+ handleAddItem,
240
+ handleInlineAddItem,
241
+ handleRemoveItemFromTree,
242
+ handleConfirmDelete,
243
+ handleRemoveFromDetail,
244
+ handleMergeComplete,
245
+ handlePruneComplete,
246
+ handleOpenMerge,
247
+ syncDetailContent,
248
+ };
249
+ }
250
+ //# sourceMappingURL=use-prd-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-prd-actions.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAM3B,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AA+F3D;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,cAAc,EACd,SAAS,EACT,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,EACZ,eAAe,EACf,UAAU,GACK;IACf,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAa,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEpE,qEAAqE;IAErE,MAAM,EACJ,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAE7C,qEAAqE;IAErE,MAAM,EACJ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,GACvB,GAAG,gBAAgB,CAAC;QACnB,IAAI;QACJ,OAAO;QACP,YAAY;QACZ,cAAc;QACd,SAAS;QACT,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAClB,eAAe;KAChB,CAAC,CAAC;IAEH,oEAAoE;IAEpE,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,EAAU,EAAE,OAA6B,EAAE,EAAE;QAClD,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE,EAAE,EAAE;gBAC9C,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1D,MAAM,YAAY,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM,cAAc,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,CAAC,CACxC,CAAC;IAEF,oEAAoE;IAEpE,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EAAE,KAAkG,EAAE,EAAE;QAC3G,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,SAAS,CAAC,WAAW,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,EACD,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAC1C,CAAC;IAEF,oEAAoE;IAEpE,MAAM,iBAAiB,GAAG,WAAW,CACnC,KAAK,EAAE,MAAc,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;SACjC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAChD,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,oEAAoE;IAEpE,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EAAE,KAAmB,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,SAAS,CAAC,WAAW,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,EACD,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAC1C,CAAC;IAEF,oEAAoE;IAEpE,MAAM,mBAAmB,GAAG,WAAW,CACrC,KAAK,EAAE,KAAqB,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,SAAS,CAAC,WAAW,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,EACD,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAC1C,CAAC;IAEF,oEAAoE;IAEpE,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3C,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9B,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACvC,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAElE,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3C,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACjD,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,oEAAoE;IACpE,mEAAmE;IACnE,6CAA6C;IAE7C,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,CAAC;YACjD,IAAI,eAAe;gBAAE,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,6DAA6D;QAC7D,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC;gBACX,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,eAAe,CACb,CAAC,CAAC,UAAU,EAAE;YACZ,IAAI;YACJ,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,YAAY;YACZ,eAAe,EAAE,eAAe,IAAI,KAAK;YACzC,QAAQ,EAAE,IAAI,CAAC,KAAK;YACpB,QAAQ,EAAE,gBAAgB;YAC1B,gBAAgB,EAAE,oBAAoB;YACtC,aAAa,EAAE,iBAAiB;YAChC,YAAY,EAAE,GAAG,EAAE;gBACjB,YAAY,EAAE,CAAC;gBACf,cAAc,EAAE,CAAC;YACnB,CAAC;YACD,UAAU,EAAE,cAAc;YAC1B,QAAQ,EAAE,sBAAsB;YAChC,UAAU;SACX,CAAC,CACH,CAAC;IACJ,CAAC,EAAE;QACD,IAAI;QACJ,cAAc;QACd,aAAa;QACb,YAAY;QACZ,eAAe;QACf,YAAY;QACZ,eAAe;QACf,gBAAgB;QAChB,oBAAoB;QACpB,iBAAiB;QACjB,YAAY;QACZ,cAAc;QACd,cAAc;QACd,sBAAsB;QACtB,UAAU;KACX,CAAC,CAAC;IAEH,OAAO;QACL,cAAc;QACd,SAAS;QACT,YAAY;QACZ,WAAW;QACX,cAAc;QACd,eAAe;QACf,aAAa;QACb,YAAY;QACZ,eAAe;QACf,cAAc;QACd,gBAAgB;QAChB,gBAAgB;QAChB,gBAAgB;QAChB,kBAAkB;QAClB,oBAAoB;QACpB,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,mBAAmB;QACnB,wBAAwB;QACxB,mBAAmB;QACnB,sBAAsB;QACtB,mBAAmB;QACnB,mBAAmB;QACnB,eAAe;QACf,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * PRD data fetching hook with structural sharing, dedup, and rate limiting.
3
+ *
4
+ * Encapsulates all PRD + task-usage data fetching logic extracted from
5
+ * PRDView. Manages:
6
+ *
7
+ * - PRD document state (data, loading, error)
8
+ * - Task usage and weekly budget state
9
+ * - Request deduplication (concurrent callers share one in-flight request)
10
+ * - Rate limiting (max 2 requests/sec per endpoint)
11
+ * - Structural sharing via diffDocument (unchanged items keep references)
12
+ * - Visibility-aware polling for task usage
13
+ * - Cleanup of rate limiter timers on unmount
14
+ *
15
+ * @see ../components/prd-tree/tree-differ.ts — structural sharing implementation
16
+ * @see ../messaging/fetch-pipeline.ts — composed dedup + rate limiting
17
+ */
18
+ import type { PRDDocumentData } from "../components/prd-tree/types.js";
19
+ import type { TaskUsageSummary, WeeklyBudgetResolution } from "../components/prd-tree/types.js";
20
+ export interface PRDDataState {
21
+ /** Current PRD document, or null if not yet loaded. */
22
+ data: PRDDocumentData | null;
23
+ /** Setter for optimistic updates from WebSocket/actions. */
24
+ setData: (updater: PRDDocumentData | null | ((prev: PRDDocumentData | null) => PRDDocumentData | null)) => void;
25
+ /** True while the initial fetch is in flight. */
26
+ loading: boolean;
27
+ /** Error message, or null. */
28
+ error: string | null;
29
+ /** Setter for error state (used by WebSocket pipeline). */
30
+ setError: (error: string | null) => void;
31
+ /** Per-task usage summaries keyed by task ID. */
32
+ taskUsageById: Record<string, TaskUsageSummary>;
33
+ /** Resolved weekly budget (for utilization calculations). */
34
+ weeklyBudget: WeeklyBudgetResolution | null;
35
+ /** Fetch/reconcile PRD data from server. Rate-limited and deduped. */
36
+ fetchPRDData: () => Promise<void>;
37
+ /** Fetch/reconcile task usage data from server. Rate-limited and deduped. */
38
+ fetchTaskUsage: () => Promise<void>;
39
+ }
40
+ /**
41
+ * Hook managing all PRD data loading, polling, and state.
42
+ *
43
+ * @param prdData - Optional pre-loaded PRD data (skips initial fetch).
44
+ */
45
+ export declare function usePRDData(prdData?: PRDDocumentData | null): PRDDataState;
@@ -0,0 +1,159 @@
1
+ /**
2
+ * PRD data fetching hook with structural sharing, dedup, and rate limiting.
3
+ *
4
+ * Encapsulates all PRD + task-usage data fetching logic extracted from
5
+ * PRDView. Manages:
6
+ *
7
+ * - PRD document state (data, loading, error)
8
+ * - Task usage and weekly budget state
9
+ * - Request deduplication (concurrent callers share one in-flight request)
10
+ * - Rate limiting (max 2 requests/sec per endpoint)
11
+ * - Structural sharing via diffDocument (unchanged items keep references)
12
+ * - Visibility-aware polling for task usage
13
+ * - Cleanup of rate limiter timers on unmount
14
+ *
15
+ * @see ../components/prd-tree/tree-differ.ts — structural sharing implementation
16
+ * @see ../messaging/fetch-pipeline.ts — composed dedup + rate limiting
17
+ */
18
+ import { useState, useEffect, useCallback, useRef } from "preact/hooks";
19
+ import { resolveTaskUtilization } from "../components/prd-tree/task-utilization.js";
20
+ import { diffDocument } from "../components/prd-tree/tree-differ.js";
21
+ import { usePolling } from "./use-polling.js";
22
+ import { createFetchPipeline } from "../messaging/index.js";
23
+ function normalizeWeeklyBudgetResolution(value) {
24
+ const source = value?.source;
25
+ const budget = value?.budget;
26
+ return {
27
+ budget: typeof budget === "number" && Number.isFinite(budget) ? budget : null,
28
+ source: source ?? "missing_budget",
29
+ };
30
+ }
31
+ /**
32
+ * Convert server-side incremental task usage into client-side summaries
33
+ * with utilization metadata applied.
34
+ */
35
+ function applyUtilizationToTaskUsage(serverUsage, weeklyBudget) {
36
+ const byTask = {};
37
+ for (const [taskId, usage] of Object.entries(serverUsage)) {
38
+ byTask[taskId] = {
39
+ totalTokens: usage.totalTokens,
40
+ runCount: usage.runCount,
41
+ utilization: resolveTaskUtilization(usage.totalTokens, weeklyBudget),
42
+ };
43
+ }
44
+ return byTask;
45
+ }
46
+ function applyWeeklyBudget(taskUsageById, weeklyBudget) {
47
+ const next = {};
48
+ for (const [taskId, summary] of Object.entries(taskUsageById)) {
49
+ next[taskId] = {
50
+ ...summary,
51
+ utilization: resolveTaskUtilization(summary.totalTokens, weeklyBudget),
52
+ };
53
+ }
54
+ return next;
55
+ }
56
+ /**
57
+ * Hook managing all PRD data loading, polling, and state.
58
+ *
59
+ * @param prdData - Optional pre-loaded PRD data (skips initial fetch).
60
+ */
61
+ export function usePRDData(prdData) {
62
+ const [data, setData] = useState(prdData ?? null);
63
+ const [loading, setLoading] = useState(!prdData);
64
+ const [error, setError] = useState(null);
65
+ const [taskUsageById, setTaskUsageById] = useState({});
66
+ const [weeklyBudget, setWeeklyBudget] = useState(null);
67
+ /** Mutable ref so the dedup-wrapped fetchTaskUsage always reads the latest budget. */
68
+ const weeklyBudgetRef = useRef(weeklyBudget);
69
+ weeklyBudgetRef.current = weeklyBudget;
70
+ // ── PRD data fetching (dedup + rate-limited) ─────────────────────
71
+ const prdPipeline = useRef(createFetchPipeline(async () => {
72
+ try {
73
+ const res = await fetch("/data/prd.json");
74
+ if (!res.ok) {
75
+ if (res.status === 404) {
76
+ setError("No PRD data found. Run 'rex init' then 'rex analyze' to create one.");
77
+ }
78
+ else {
79
+ setError(`Failed to load PRD data (${res.status})`);
80
+ }
81
+ return;
82
+ }
83
+ const json = await res.json();
84
+ setData((prev) => diffDocument(prev, json));
85
+ setError(null);
86
+ }
87
+ catch (_err) {
88
+ setError("Could not fetch PRD data. Is the server running?");
89
+ }
90
+ }, { minIntervalMs: 500 }));
91
+ const fetchPRDData = useCallback(async () => {
92
+ await prdPipeline.current.execute();
93
+ }, []);
94
+ // ── Task usage fetching (dedup + rate-limited) ─────────────────
95
+ const usagePipeline = useRef(createFetchPipeline(async () => {
96
+ const [taskUsageResult, utilizationResult] = await Promise.allSettled([
97
+ fetch("/api/hench/task-usage"),
98
+ fetch("/api/token/utilization"),
99
+ ]);
100
+ let resolvedWeeklyBudget = weeklyBudgetRef.current;
101
+ if (utilizationResult.status === "fulfilled" && utilizationResult.value.ok) {
102
+ try {
103
+ const json = await utilizationResult.value.json();
104
+ resolvedWeeklyBudget = normalizeWeeklyBudgetResolution(json.weeklyBudget);
105
+ setWeeklyBudget(resolvedWeeklyBudget);
106
+ setTaskUsageById((prev) => applyWeeklyBudget(prev, resolvedWeeklyBudget));
107
+ }
108
+ catch {
109
+ // Keep prior budget state on parse errors.
110
+ }
111
+ }
112
+ if (taskUsageResult.status === "fulfilled" && taskUsageResult.value.ok) {
113
+ try {
114
+ const json = await taskUsageResult.value.json();
115
+ setTaskUsageById(applyUtilizationToTaskUsage(json.taskUsage ?? {}, resolvedWeeklyBudget));
116
+ }
117
+ catch {
118
+ // Keep existing values on parse errors.
119
+ }
120
+ }
121
+ }, { minIntervalMs: 500 }));
122
+ const fetchTaskUsage = useCallback(async () => {
123
+ await usagePipeline.current.execute();
124
+ }, []);
125
+ // ── Initial fetch ────────────────────────────────────────────────
126
+ useEffect(() => {
127
+ if (prdData) {
128
+ setData(prdData);
129
+ setLoading(false);
130
+ fetchTaskUsage();
131
+ return;
132
+ }
133
+ fetchPRDData().then(() => setLoading(false));
134
+ fetchTaskUsage();
135
+ }, [prdData, fetchPRDData, fetchTaskUsage]);
136
+ // ── Visibility-aware polling ─────────────────────────────────────
137
+ usePolling("prd:task-usage", fetchTaskUsage, 10_000);
138
+ // ── Cleanup ──────────────────────────────────────────────────────
139
+ useEffect(() => {
140
+ const prd = prdPipeline.current;
141
+ const usage = usagePipeline.current;
142
+ return () => {
143
+ prd.dispose();
144
+ usage.dispose();
145
+ };
146
+ }, []);
147
+ return {
148
+ data,
149
+ setData,
150
+ loading,
151
+ error,
152
+ setError,
153
+ taskUsageById,
154
+ weeklyBudget,
155
+ fetchPRDData,
156
+ fetchTaskUsage,
157
+ };
158
+ }
159
+ //# sourceMappingURL=use-prd-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-prd-data.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * PRD deep-link resolution hook.
3
+ *
4
+ * Handles auto-selection and highlighting of a specific task when the
5
+ * view loads with an initialTaskId (from a shareable URL like /prd/:id).
6
+ *
7
+ * Responsibilities:
8
+ * - Finds the target item in the tree once data is loaded
9
+ * - Expands ancestor nodes so the target is visible
10
+ * - Selects and highlights the target with a timed animation
11
+ * - Shows an error banner if the task ID is not found
12
+ * - Cleans up the URL on error (reverts to /prd)
13
+ *
14
+ * Extracted from PRDView to isolate deep-link side effects from the
15
+ * component's render and CRUD logic.
16
+ */
17
+ import type { PRDDocumentData, PRDItemData } from "../components/prd-tree/types.js";
18
+ export interface PRDDeepLinkDeps {
19
+ /** Task ID from the URL, or null if no deep link. */
20
+ initialTaskId?: string | null;
21
+ /** True while the initial data fetch is in flight. */
22
+ loading: boolean;
23
+ /** Current PRD document data. */
24
+ data: PRDDocumentData | null;
25
+ /** Callback to select/open a PRD item. */
26
+ onSelectItem: (item: PRDItemData) => void;
27
+ }
28
+ export interface PRDDeepLinkState {
29
+ /** Error message when the deep-linked task is not found. */
30
+ deepLinkError: string | null;
31
+ /** Dismiss the deep-link error banner. */
32
+ setDeepLinkError: (error: string | null) => void;
33
+ /** Task ID currently highlighted by the deep-link animation. */
34
+ highlightedTaskId: string | null;
35
+ /** IDs to force-expand in the tree (ancestors of the deep-linked task). */
36
+ deepLinkExpandIds: Set<string> | null;
37
+ }
38
+ /**
39
+ * Hook that resolves deep-link navigation for PRD tasks.
40
+ *
41
+ * Consumes the initialTaskId exactly once after data loads. If the
42
+ * target exists, it expands ancestors, selects the item, and runs a
43
+ * highlight animation. If not found, shows an error banner.
44
+ */
45
+ export declare function usePRDDeepLink({ initialTaskId, loading, data, onSelectItem, }: PRDDeepLinkDeps): PRDDeepLinkState;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * PRD deep-link resolution hook.
3
+ *
4
+ * Handles auto-selection and highlighting of a specific task when the
5
+ * view loads with an initialTaskId (from a shareable URL like /prd/:id).
6
+ *
7
+ * Responsibilities:
8
+ * - Finds the target item in the tree once data is loaded
9
+ * - Expands ancestor nodes so the target is visible
10
+ * - Selects and highlights the target with a timed animation
11
+ * - Shows an error banner if the task ID is not found
12
+ * - Cleans up the URL on error (reverts to /prd)
13
+ *
14
+ * Extracted from PRDView to isolate deep-link side effects from the
15
+ * component's render and CRUD logic.
16
+ */
17
+ import { useState, useEffect, useRef } from "preact/hooks";
18
+ import { findItemById, getAncestorIds } from "../components/prd-tree/tree-utils.js";
19
+ /**
20
+ * Hook that resolves deep-link navigation for PRD tasks.
21
+ *
22
+ * Consumes the initialTaskId exactly once after data loads. If the
23
+ * target exists, it expands ancestors, selects the item, and runs a
24
+ * highlight animation. If not found, shows an error banner.
25
+ */
26
+ export function usePRDDeepLink({ initialTaskId, loading, data, onSelectItem, }) {
27
+ const [deepLinkError, setDeepLinkError] = useState(null);
28
+ const [highlightedTaskId, setHighlightedTaskId] = useState(null);
29
+ const [deepLinkExpandIds, setDeepLinkExpandIds] = useState(null);
30
+ /** Whether the initial deep-link has been consumed. */
31
+ const deepLinkConsumedRef = useRef(false);
32
+ // Wrap onSelectItem in a ref to avoid re-triggering the effect
33
+ const onSelectItemRef = useRef(onSelectItem);
34
+ onSelectItemRef.current = onSelectItem;
35
+ useEffect(() => {
36
+ if (deepLinkConsumedRef.current || !initialTaskId || loading || !data)
37
+ return;
38
+ deepLinkConsumedRef.current = true;
39
+ const item = findItemById(data.items, initialTaskId);
40
+ if (!item) {
41
+ setDeepLinkError(`Task "${initialTaskId}" not found`);
42
+ // Clean URL back to /prd
43
+ history.replaceState({ view: "prd", file: null, zone: null, runId: null, taskId: null }, "", "/prd");
44
+ return;
45
+ }
46
+ // Expand ancestor nodes so the target is visible
47
+ const ancestors = getAncestorIds(data.items, initialTaskId);
48
+ if (ancestors.length > 0) {
49
+ setDeepLinkExpandIds(new Set(ancestors));
50
+ }
51
+ // Select and highlight the item
52
+ setHighlightedTaskId(initialTaskId);
53
+ onSelectItemRef.current(item);
54
+ // Clear highlight after animation completes
55
+ const timer = setTimeout(() => setHighlightedTaskId(null), 3000);
56
+ return () => clearTimeout(timer);
57
+ }, [initialTaskId, loading, data]);
58
+ return { deepLinkError, setDeepLinkError, highlightedTaskId, deepLinkExpandIds };
59
+ }
60
+ //# sourceMappingURL=use-prd-deep-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-prd-deep-link.js","sourceRoot":"","sources":["../../../src/viewer/hooks/use-prd-deep-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAe,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAwBpF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,OAAO,EACP,IAAI,EACJ,YAAY,GACI;IAChB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAErF,uDAAuD;IACvD,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1C,+DAA+D;IAC/D,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7C,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,mBAAmB,CAAC,OAAO,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,IAAI;YAAE,OAAO;QAC9E,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,gBAAgB,CAAC,SAAS,aAAa,aAAa,CAAC,CAAC;YACtD,yBAAyB;YACzB,OAAO,CAAC,YAAY,CAClB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAClE,EAAE,EACF,MAAM,CACP,CAAC;YACF,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,oBAAoB,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,gCAAgC;QAChC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACpC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9B,4CAA4C;QAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEnC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AACnF,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * PRD WebSocket real-time update hook.
3
+ *
4
+ * Sets up a five-layer message processing pipeline for real-time PRD
5
+ * updates via WebSocket:
6
+ *
7
+ * raw WS → buffer gate → throttle → coalescer → DOM gate → batcher → RAF → render
8
+ *
9
+ * Each layer has a specific role:
10
+ *
11
+ * 0. **Response buffer gate** — drops messages when tab is hidden, flushes
12
+ * downstream buffers to free memory, reconciles on resume.
13
+ * 1. **Throttle** — per-type trailing-edge debounce for high-frequency
14
+ * rex message types (prd-changed, item-updated, item-deleted).
15
+ * 2. **Coalescer** — batches throttled output into a single reconciliation
16
+ * flush instead of N separate fetches.
17
+ * 3. **DOM update gate** — queues state updates when tab is hidden,
18
+ * replays them in a single batch when visible again.
19
+ * 4. **Update batcher** — collects setData calls into a single RAF
20
+ * callback per animation frame.
21
+ *
22
+ * Extracted from PRDView to isolate WebSocket side effects from the
23
+ * component's render logic.
24
+ *
25
+ * @see ../messaging/message-coalescer.ts
26
+ * @see ../messaging/message-throttle.ts
27
+ * @see ../performance/dom-update-gate.ts
28
+ * @see ../performance/update-batcher.ts
29
+ * @see ../performance/response-buffer-gate.ts
30
+ */
31
+ import type { PRDDocumentData } from "../components/prd-tree/types.js";
32
+ export interface PRDWebSocketDeps {
33
+ /** Setter for PRD document state (supports functional updates). */
34
+ setData: (updater: PRDDocumentData | null | ((prev: PRDDocumentData | null) => PRDDocumentData | null)) => void;
35
+ /** Fetch/reconcile PRD data from server. */
36
+ fetchPRDData: () => Promise<void>;
37
+ /** Fetch/reconcile task usage data from server. */
38
+ fetchTaskUsage: () => Promise<void>;
39
+ }
40
+ /**
41
+ * Hook that manages the WebSocket connection and message processing
42
+ * pipeline for real-time PRD updates.
43
+ *
44
+ * All parameters are expected to be stable references (wrapped in
45
+ * useCallback or similar). The effect re-runs when any dependency changes.
46
+ */
47
+ export declare function usePRDWebSocket({ setData, fetchPRDData, fetchTaskUsage }: PRDWebSocketDeps): void;