@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,251 @@
1
+ /**
2
+ * Incremental task usage aggregator.
3
+ *
4
+ * Maintains an in-memory cache of per-task token usage aggregation.
5
+ * On each refresh, only processes new/modified run files using
6
+ * mtime+size change detection, keeping aggregation time constant
7
+ * regardless of total run history size.
8
+ *
9
+ * ## Design
10
+ *
11
+ * Each run file's contribution (taskId + totalTokens) is tracked
12
+ * individually so that modifications and deletions can be applied
13
+ * as incremental deltas rather than requiring a full re-scan.
14
+ *
15
+ * Change detection uses mtime + file size — the same strategy as
16
+ * hench's `RunChangeDetector` — to avoid reading unchanged files.
17
+ *
18
+ * @module web/server/incremental-task-usage
19
+ */
20
+ import { join } from "node:path";
21
+ import { readFile, readdir, stat } from "node:fs/promises";
22
+ import { gunzipSync } from "node:zlib";
23
+ // ---------------------------------------------------------------------------
24
+ // IncrementalTaskUsageAggregator
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Incrementally aggregates per-task token usage from `.hench/runs/` files.
28
+ *
29
+ * First call processes all existing run files (full scan). Subsequent calls
30
+ * detect filesystem changes via mtime+size comparison and only read the
31
+ * files that were added, modified, or deleted — keeping aggregation time
32
+ * constant regardless of total run history size.
33
+ *
34
+ * Usage:
35
+ * ```ts
36
+ * const aggregator = new IncrementalTaskUsageAggregator(runsDir);
37
+ * const usage = await aggregator.getTaskUsage();
38
+ * // { "task-123": { totalTokens: 5000, runCount: 2 }, ... }
39
+ * ```
40
+ */
41
+ export class IncrementalTaskUsageAggregator {
42
+ runsDir;
43
+ /** Current snapshot of each file's mtime + size. */
44
+ fileSnapshots = new Map();
45
+ /** Per-file contribution to the aggregation (for subtract-on-change). */
46
+ fileContributions = new Map();
47
+ /** Aggregated usage per task ID. */
48
+ taskUsage = new Map();
49
+ /** Whether the initial full scan has been completed. */
50
+ initialized = false;
51
+ constructor(runsDir) {
52
+ this.runsDir = runsDir;
53
+ }
54
+ /**
55
+ * Get current per-task token usage, incrementally updating from filesystem.
56
+ *
57
+ * First call processes all files; subsequent calls only process changes.
58
+ * Returns a plain object keyed by task ID.
59
+ */
60
+ async getTaskUsage() {
61
+ await this.refresh();
62
+ return Object.fromEntries(this.taskUsage);
63
+ }
64
+ /**
65
+ * Force a full rebuild on the next `getTaskUsage()` call.
66
+ * Useful for testing or when external state is known to have changed.
67
+ */
68
+ reset() {
69
+ this.fileSnapshots.clear();
70
+ this.fileContributions.clear();
71
+ this.taskUsage.clear();
72
+ this.initialized = false;
73
+ }
74
+ /**
75
+ * Remove aggregation entries for task IDs not present in `validTaskIds`.
76
+ *
77
+ * Cleans up both the `taskUsage` accumulator and corresponding
78
+ * `fileContributions` entries. File snapshots are preserved so that
79
+ * the underlying run files are not re-processed on the next refresh
80
+ * (they are still on disk, just no longer contributing to results).
81
+ *
82
+ * Call this after `getTaskUsage()` — or let the route handler call it
83
+ * before returning results — to ensure the UI never sees usage data
84
+ * for tasks that have been deleted from the PRD.
85
+ *
86
+ * @returns The number of stale task IDs that were pruned.
87
+ */
88
+ pruneStaleEntries(validTaskIds) {
89
+ // Identify stale task IDs
90
+ const staleIds = [];
91
+ for (const taskId of this.taskUsage.keys()) {
92
+ if (!validTaskIds.has(taskId)) {
93
+ staleIds.push(taskId);
94
+ }
95
+ }
96
+ if (staleIds.length === 0)
97
+ return 0;
98
+ const staleSet = new Set(staleIds);
99
+ // Remove from taskUsage
100
+ for (const taskId of staleIds) {
101
+ this.taskUsage.delete(taskId);
102
+ }
103
+ // Remove matching fileContributions (but keep fileSnapshots so
104
+ // the run files are not treated as "new" on the next refresh)
105
+ for (const [file, contribution] of this.fileContributions) {
106
+ if (staleSet.has(contribution.taskId)) {
107
+ this.fileContributions.delete(file);
108
+ }
109
+ }
110
+ return staleIds.length;
111
+ }
112
+ // ---- Core refresh logic --------------------------------------------------
113
+ async refresh() {
114
+ const currentFiles = await this.scanRunFiles();
115
+ // Categorize changes
116
+ const added = [];
117
+ const modified = [];
118
+ const deleted = [];
119
+ for (const [file, snapshot] of currentFiles) {
120
+ const prev = this.fileSnapshots.get(file);
121
+ if (!prev) {
122
+ added.push(file);
123
+ }
124
+ else if (prev.mtimeMs !== snapshot.mtimeMs || prev.size !== snapshot.size) {
125
+ modified.push(file);
126
+ }
127
+ }
128
+ for (const file of this.fileSnapshots.keys()) {
129
+ if (!currentFiles.has(file)) {
130
+ deleted.push(file);
131
+ }
132
+ }
133
+ // Short-circuit: no changes after initial scan
134
+ if (this.initialized && added.length === 0 && modified.length === 0 && deleted.length === 0) {
135
+ return;
136
+ }
137
+ // Process deletions: subtract old contributions
138
+ for (const file of deleted) {
139
+ this.subtractContribution(file);
140
+ this.fileSnapshots.delete(file);
141
+ }
142
+ // Process modifications: subtract old → re-read → add new
143
+ for (const file of modified) {
144
+ this.subtractContribution(file);
145
+ const contribution = await this.readFileContribution(file);
146
+ if (contribution) {
147
+ this.applyContribution(file, contribution);
148
+ }
149
+ this.fileSnapshots.set(file, currentFiles.get(file));
150
+ }
151
+ // Process additions: read and add
152
+ for (const file of added) {
153
+ const contribution = await this.readFileContribution(file);
154
+ if (contribution) {
155
+ this.applyContribution(file, contribution);
156
+ }
157
+ this.fileSnapshots.set(file, currentFiles.get(file));
158
+ }
159
+ this.initialized = true;
160
+ }
161
+ // ---- Contribution tracking -----------------------------------------------
162
+ /** Subtract a file's previously tracked contribution from the task total. */
163
+ subtractContribution(file) {
164
+ const contribution = this.fileContributions.get(file);
165
+ if (!contribution)
166
+ return;
167
+ const current = this.taskUsage.get(contribution.taskId);
168
+ if (current) {
169
+ current.totalTokens -= contribution.totalTokens;
170
+ current.runCount -= 1;
171
+ if (current.runCount <= 0) {
172
+ this.taskUsage.delete(contribution.taskId);
173
+ }
174
+ }
175
+ this.fileContributions.delete(file);
176
+ }
177
+ /** Add a file's contribution to the task total. */
178
+ applyContribution(file, contribution) {
179
+ this.fileContributions.set(file, contribution);
180
+ const current = this.taskUsage.get(contribution.taskId) ?? { totalTokens: 0, runCount: 0 };
181
+ current.totalTokens += contribution.totalTokens;
182
+ current.runCount += 1;
183
+ this.taskUsage.set(contribution.taskId, current);
184
+ }
185
+ // ---- File I/O ------------------------------------------------------------
186
+ /**
187
+ * Read a single run file (plain JSON or gzip-compressed) and extract
188
+ * its task usage contribution.
189
+ * Returns null for files that cannot be read or lack a taskId.
190
+ */
191
+ async readFileContribution(file) {
192
+ try {
193
+ let data;
194
+ if (file.endsWith(".gz")) {
195
+ const compressed = await readFile(join(this.runsDir, file));
196
+ const decompressed = gunzipSync(compressed);
197
+ data = JSON.parse(decompressed.toString("utf-8"));
198
+ }
199
+ else {
200
+ const raw = await readFile(join(this.runsDir, file), "utf-8");
201
+ data = JSON.parse(raw);
202
+ }
203
+ const taskId = data.taskId;
204
+ if (typeof taskId !== "string" || !taskId)
205
+ return null;
206
+ const tokenUsage = data.tokenUsage;
207
+ const totalTokens = (tokenUsage?.input ?? 0) +
208
+ (tokenUsage?.output ?? 0) +
209
+ (tokenUsage?.cacheCreationInput ?? 0) +
210
+ (tokenUsage?.cacheReadInput ?? 0);
211
+ return { taskId, totalTokens };
212
+ }
213
+ catch {
214
+ return null;
215
+ }
216
+ }
217
+ /**
218
+ * Scan the runs directory and return a snapshot map of all run files
219
+ * (`.json` and `.json.gz`). Hidden files (prefixed with `.`) are
220
+ * excluded to avoid picking up checkpoint or metadata files.
221
+ */
222
+ async scanRunFiles() {
223
+ const snapshots = new Map();
224
+ let files;
225
+ try {
226
+ files = await readdir(this.runsDir);
227
+ }
228
+ catch {
229
+ return snapshots;
230
+ }
231
+ const runFiles = files.filter((f) => (f.endsWith(".json") || f.endsWith(".json.gz")) && !f.startsWith("."));
232
+ // Stat files in parallel for performance
233
+ const entries = await Promise.all(runFiles.map(async (file) => {
234
+ try {
235
+ const st = await stat(join(this.runsDir, file));
236
+ return { file, snapshot: { mtimeMs: st.mtimeMs, size: st.size } };
237
+ }
238
+ catch {
239
+ // File disappeared between readdir and stat — skip
240
+ return null;
241
+ }
242
+ }));
243
+ for (const entry of entries) {
244
+ if (entry) {
245
+ snapshots.set(entry.file, entry.snapshot);
246
+ }
247
+ }
248
+ return snapshots;
249
+ }
250
+ }
251
+ //# sourceMappingURL=incremental-task-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-task-usage.js","sourceRoot":"","sources":["../../src/server/incremental-task-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Web server for the n-dx dashboard.
3
+ *
4
+ * Serves the sourcevision viewer, provides REST API endpoints for
5
+ * Rex (PRD data), sourcevision (analysis data), and Hench (agent runs),
6
+ * and supports WebSocket connections for real-time updates.
7
+ *
8
+ * ## Route architecture
9
+ *
10
+ * ```
11
+ * Static assets → routes-static.ts
12
+ * /data/* → routes-data.ts (sourcevision data files, live-reload)
13
+ * /api/rex/* → routes-rex.ts (PRD CRUD, stats, next task, log)
14
+ * /api/sv/* → routes-sourcevision.ts (analysis data endpoints)
15
+ * /api/hench/* → routes-hench.ts (agent run history, run detail)
16
+ * /mcp/rex → routes-mcp.ts (Rex MCP over Streamable HTTP)
17
+ * /mcp/sourcevision→ routes-mcp.ts (Sourcevision MCP over Streamable HTTP)
18
+ * WebSocket → websocket.ts (upgrade handler, broadcast)
19
+ * ```
20
+ *
21
+ * ## Coupling strategy
22
+ *
23
+ * REST/API routes access domain data through **filesystem reads** and
24
+ * **subprocess calls**. Rex domain types and constants are imported from
25
+ * the canonical source through the gateway (`domain-gateway.ts`), eliminating
26
+ * the previous duplication in `rex-domain.ts`.
27
+ *
28
+ * MCP server factories and rex domain constants are funnelled through
29
+ * `domain-gateway.ts` — a single gateway module that mirrors the pattern
30
+ * in `packages/hench/src/prd/rex-gateway.ts`.
31
+ *
32
+ * @see ./domain-gateway.ts — runtime import gateway (all cross-package imports)
33
+ */
34
+ export { startServer, PORT_FILE } from "./start.js";
35
+ export type { ServerOptions, StartResult } from "./start.js";
36
+ export type { ServerContext, RouteHandler } from "./types.js";
37
+ export type { WebSocketBroadcaster } from "./websocket.js";
38
+ export { checkPort, checkPortWithRetry, findAvailablePort } from "./port.js";
39
+ export type { PortCheckResult, PortAllocationResult, PortRetryOptions } from "./port.js";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Web server for the n-dx dashboard.
3
+ *
4
+ * Serves the sourcevision viewer, provides REST API endpoints for
5
+ * Rex (PRD data), sourcevision (analysis data), and Hench (agent runs),
6
+ * and supports WebSocket connections for real-time updates.
7
+ *
8
+ * ## Route architecture
9
+ *
10
+ * ```
11
+ * Static assets → routes-static.ts
12
+ * /data/* → routes-data.ts (sourcevision data files, live-reload)
13
+ * /api/rex/* → routes-rex.ts (PRD CRUD, stats, next task, log)
14
+ * /api/sv/* → routes-sourcevision.ts (analysis data endpoints)
15
+ * /api/hench/* → routes-hench.ts (agent run history, run detail)
16
+ * /mcp/rex → routes-mcp.ts (Rex MCP over Streamable HTTP)
17
+ * /mcp/sourcevision→ routes-mcp.ts (Sourcevision MCP over Streamable HTTP)
18
+ * WebSocket → websocket.ts (upgrade handler, broadcast)
19
+ * ```
20
+ *
21
+ * ## Coupling strategy
22
+ *
23
+ * REST/API routes access domain data through **filesystem reads** and
24
+ * **subprocess calls**. Rex domain types and constants are imported from
25
+ * the canonical source through the gateway (`domain-gateway.ts`), eliminating
26
+ * the previous duplication in `rex-domain.ts`.
27
+ *
28
+ * MCP server factories and rex domain constants are funnelled through
29
+ * `domain-gateway.ts` — a single gateway module that mirrors the pattern
30
+ * in `packages/hench/src/prd/rex-gateway.ts`.
31
+ *
32
+ * @see ./domain-gateway.ts — runtime import gateway (all cross-package imports)
33
+ */
34
+ export { startServer, PORT_FILE } from "./start.js";
35
+ export { checkPort, checkPortWithRetry, findAvailablePort } from "./port.js";
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Port availability detection and dynamic allocation.
3
+ *
4
+ * Provides utilities for checking whether a TCP port is available and
5
+ * finding the next available port within a configurable range.
6
+ *
7
+ * Used by the server startup code to gracefully fall back when the
8
+ * configured port (default 3117) is already occupied.
9
+ */
10
+ /** Default port range for fallback allocation. */
11
+ export declare const DEFAULT_PORT = 3117;
12
+ export declare const PORT_RANGE_START = 3117;
13
+ export declare const PORT_RANGE_END = 3200;
14
+ export interface PortCheckResult {
15
+ /** Whether the requested port is available. */
16
+ available: boolean;
17
+ /** The port that was checked. */
18
+ port: number;
19
+ /** Error details if the port is unavailable (e.g. "EADDRINUSE", "EACCES"). */
20
+ error?: string;
21
+ }
22
+ export interface PortAllocationResult {
23
+ /** The port that is available and should be used. */
24
+ port: number;
25
+ /** Whether this is the originally requested port (true) or a fallback (false). */
26
+ isOriginal: boolean;
27
+ /** The originally requested port. */
28
+ requestedPort: number;
29
+ }
30
+ /**
31
+ * Options controlling the retry behaviour of {@link checkPortWithRetry}
32
+ * and the preferred-port phase of {@link findAvailablePort}.
33
+ */
34
+ export interface PortRetryOptions {
35
+ /**
36
+ * Maximum number of retries after the first failure.
37
+ * @default 5
38
+ */
39
+ maxRetries?: number;
40
+ /**
41
+ * Initial delay between retries in milliseconds.
42
+ * Subsequent delays grow by `backoffFactor` (exponential backoff).
43
+ * @default 100
44
+ */
45
+ retryDelayMs?: number;
46
+ /**
47
+ * Multiplier applied to the delay after each retry attempt.
48
+ * A value of `2` doubles the delay each time.
49
+ * @default 2
50
+ */
51
+ backoffFactor?: number;
52
+ }
53
+ /**
54
+ * Check if a specific port is available for binding.
55
+ *
56
+ * Uses a two-phase approach:
57
+ * 1. Try to connect — if something is already listening, report unavailable.
58
+ * 2. If nothing is listening, try to bind — catches EACCES and other bind errors.
59
+ *
60
+ * This avoids SO_REUSEADDR false positives where a bind-only check might
61
+ * succeed even though the port is already occupied by another process.
62
+ */
63
+ export declare function checkPort(port: number): Promise<PortCheckResult>;
64
+ /**
65
+ * Check if a port is available, retrying on transient failures.
66
+ *
67
+ * Wraps {@link checkPort} with a configurable retry loop to handle timing
68
+ * issues during process transitions. When a server has just been stopped, its
69
+ * port may remain in OS TIME_WAIT state for a short period and appear
70
+ * unavailable even though no process is actively listening. Retrying with
71
+ * exponential back-off gives the OS time to release the port without forcing
72
+ * the caller to fall back to a different port number.
73
+ *
74
+ * Retries are skipped immediately for non-transient errors such as `EACCES`
75
+ * (permission denied), since those require external intervention and will
76
+ * not resolve on their own.
77
+ *
78
+ * @param port TCP port number to check.
79
+ * @param opts Retry configuration. Defaults suit most startup scenarios.
80
+ */
81
+ export declare function checkPortWithRetry(port: number, opts?: PortRetryOptions): Promise<PortCheckResult>;
82
+ /**
83
+ * Find the next available port in a range.
84
+ *
85
+ * Tries the `preferred` port first (with optional retries to handle transient
86
+ * unavailability during process transitions), then scans sequentially from
87
+ * `rangeStart` to `rangeEnd` (inclusive). Skips the preferred port during the
88
+ * scan since it was already tried.
89
+ *
90
+ * Pass `retryOpts` to give the preferred port several retry attempts before
91
+ * falling back to the range scan. This is useful when the preferred port was
92
+ * just released by a recently stopped server (TIME_WAIT state).
93
+ *
94
+ * @throws {Error} If no port is available in the entire range.
95
+ */
96
+ export declare function findAvailablePort(preferred: number, rangeStart?: number, rangeEnd?: number, retryOpts?: PortRetryOptions): Promise<PortAllocationResult>;
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Port availability detection and dynamic allocation.
3
+ *
4
+ * Provides utilities for checking whether a TCP port is available and
5
+ * finding the next available port within a configurable range.
6
+ *
7
+ * Used by the server startup code to gracefully fall back when the
8
+ * configured port (default 3117) is already occupied.
9
+ */
10
+ import { createServer, createConnection } from "node:net";
11
+ /** Default port range for fallback allocation. */
12
+ export const DEFAULT_PORT = 3117;
13
+ export const PORT_RANGE_START = 3117;
14
+ export const PORT_RANGE_END = 3200;
15
+ /**
16
+ * Check if a specific port is available for binding.
17
+ *
18
+ * Uses a two-phase approach:
19
+ * 1. Try to connect — if something is already listening, report unavailable.
20
+ * 2. If nothing is listening, try to bind — catches EACCES and other bind errors.
21
+ *
22
+ * This avoids SO_REUSEADDR false positives where a bind-only check might
23
+ * succeed even though the port is already occupied by another process.
24
+ */
25
+ export function checkPort(port) {
26
+ return new Promise((resolve) => {
27
+ // Phase 1: try to connect — detects if a server is already listening
28
+ const sock = createConnection({ port, host: "127.0.0.1" });
29
+ sock.once("connect", () => {
30
+ sock.destroy();
31
+ resolve({ available: false, port, error: "EADDRINUSE" });
32
+ });
33
+ sock.once("error", (connErr) => {
34
+ sock.destroy();
35
+ if (connErr.code === "ECONNREFUSED") {
36
+ // Nothing listening — phase 2: try to bind to catch permission errors
37
+ const server = createServer();
38
+ server.once("error", (err) => {
39
+ resolve({ available: false, port, error: err.code ?? err.message });
40
+ });
41
+ server.listen(port, () => {
42
+ server.close(() => {
43
+ resolve({ available: true, port });
44
+ });
45
+ });
46
+ }
47
+ else {
48
+ // Other connection error (e.g., timeout) — treat as unavailable
49
+ resolve({ available: false, port, error: connErr.code ?? connErr.message });
50
+ }
51
+ });
52
+ });
53
+ }
54
+ /**
55
+ * Check if a port is available, retrying on transient failures.
56
+ *
57
+ * Wraps {@link checkPort} with a configurable retry loop to handle timing
58
+ * issues during process transitions. When a server has just been stopped, its
59
+ * port may remain in OS TIME_WAIT state for a short period and appear
60
+ * unavailable even though no process is actively listening. Retrying with
61
+ * exponential back-off gives the OS time to release the port without forcing
62
+ * the caller to fall back to a different port number.
63
+ *
64
+ * Retries are skipped immediately for non-transient errors such as `EACCES`
65
+ * (permission denied), since those require external intervention and will
66
+ * not resolve on their own.
67
+ *
68
+ * @param port TCP port number to check.
69
+ * @param opts Retry configuration. Defaults suit most startup scenarios.
70
+ */
71
+ export async function checkPortWithRetry(port, opts = {}) {
72
+ const maxRetries = opts.maxRetries ?? 5;
73
+ const initialDelayMs = opts.retryDelayMs ?? 100;
74
+ const backoffFactor = opts.backoffFactor ?? 2;
75
+ let result = await checkPort(port);
76
+ if (result.available)
77
+ return result;
78
+ // Permission errors won't resolve with retries — fail fast.
79
+ if (result.error === "EACCES")
80
+ return result;
81
+ let delay = initialDelayMs;
82
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
83
+ await new Promise((r) => setTimeout(r, delay));
84
+ result = await checkPort(port);
85
+ if (result.available)
86
+ return result;
87
+ // Stop retrying if we hit a non-transient error.
88
+ if (result.error === "EACCES")
89
+ return result;
90
+ delay = Math.round(delay * backoffFactor);
91
+ }
92
+ return result;
93
+ }
94
+ /**
95
+ * Find the next available port in a range.
96
+ *
97
+ * Tries the `preferred` port first (with optional retries to handle transient
98
+ * unavailability during process transitions), then scans sequentially from
99
+ * `rangeStart` to `rangeEnd` (inclusive). Skips the preferred port during the
100
+ * scan since it was already tried.
101
+ *
102
+ * Pass `retryOpts` to give the preferred port several retry attempts before
103
+ * falling back to the range scan. This is useful when the preferred port was
104
+ * just released by a recently stopped server (TIME_WAIT state).
105
+ *
106
+ * @throws {Error} If no port is available in the entire range.
107
+ */
108
+ export async function findAvailablePort(preferred, rangeStart = PORT_RANGE_START, rangeEnd = PORT_RANGE_END, retryOpts) {
109
+ // Try the preferred port first (with retries if opts provided)
110
+ const check = retryOpts !== undefined
111
+ ? await checkPortWithRetry(preferred, retryOpts)
112
+ : await checkPort(preferred);
113
+ if (check.available) {
114
+ return { port: preferred, isOriginal: true, requestedPort: preferred };
115
+ }
116
+ // If the error is a permission issue, don't try other ports in the same range
117
+ // — the user likely needs elevated privileges
118
+ if (check.error === "EACCES") {
119
+ throw new Error(`Permission denied for port ${preferred}. ` +
120
+ `Try a port above 1024 or run with elevated privileges.`);
121
+ }
122
+ // Scan the range for an available port
123
+ for (let p = rangeStart; p <= rangeEnd; p++) {
124
+ if (p === preferred)
125
+ continue; // already tried
126
+ const result = await checkPort(p);
127
+ if (result.available) {
128
+ return { port: p, isOriginal: false, requestedPort: preferred };
129
+ }
130
+ }
131
+ throw new Error(`No available port found in range ${rangeStart}–${rangeEnd}. ` +
132
+ `All ports are in use.`);
133
+ }
134
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/server/port.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ export type PRMarkdownRefreshDiagnosticCode = "missing_git" | "not_repo" | "unresolved_main_or_origin_main" | "auth_fetch_denied" | "network_dns_error" | "fetch_failed" | "rev_parse_failed" | "diff_failed";
2
+ export type PRMarkdownRefreshPreflightFailureCode = "NOT_A_REPO" | "MISSING_BASE_REF" | "FETCH_DENIED" | "NETWORK_DNS_ERROR" | "DETACHED_HEAD" | "SHALLOW_CLONE";
3
+ export type PRMarkdownRefreshFailureCode = PRMarkdownRefreshDiagnosticCode | PRMarkdownRefreshPreflightFailureCode;
4
+ export type PRMarkdownRefreshFailureStage = "preflight" | "fetch" | "rev-parse" | "diff" | "semantic-diff" | "mixed";
5
+ export type PRMarkdownRefreshDiffStageStatus = "succeeded" | "failed" | "not_run";
6
+ export type PRMarkdownRefreshGuidanceCategory = "environment_fix" | "fetch_retry" | "local_history_remediation";
7
+ export type PRMarkdownRefreshGitSubcommand = "version" | "rev-parse" | "fetch" | "diff";
8
+ export type PRMarkdownRefreshFailureCommandStageId = "preflight" | "fetch" | "rev_parse" | "name_status_diff" | "semantic_diff_numstat";
9
+ export interface PRMarkdownRefreshFailureCommandExecution {
10
+ stderr?: string;
11
+ exitCode?: number | null;
12
+ }
13
+ export interface PRMarkdownRefreshGuidance {
14
+ category: PRMarkdownRefreshGuidanceCategory;
15
+ summary: string;
16
+ commands: string[];
17
+ }
18
+ export interface PRMarkdownRefreshFailure {
19
+ type: "pr_markdown_refresh_failure";
20
+ code: PRMarkdownRefreshFailureCode;
21
+ stage: PRMarkdownRefreshFailureStage;
22
+ stageStatuses?: {
23
+ nameStatusDiff: PRMarkdownRefreshDiffStageStatus;
24
+ semanticDiff: PRMarkdownRefreshDiffStageStatus;
25
+ };
26
+ summary: string;
27
+ remediationCommands: string[];
28
+ guidanceCategory: PRMarkdownRefreshGuidanceCategory;
29
+ commandSuggestions: string[];
30
+ command: {
31
+ gitSubcommand: PRMarkdownRefreshGitSubcommand;
32
+ subcommand?: string;
33
+ stageId?: PRMarkdownRefreshFailureCommandStageId;
34
+ stderr?: string;
35
+ exitCode?: number | null;
36
+ stderrExcerpt: string;
37
+ reproduce: string[];
38
+ };
39
+ }
40
+ export declare const GIT_CREDENTIAL_HELPER_COMMAND = "sourcevision git-credential-helper";
41
+ interface PRMarkdownRefreshPreflightErrorContract {
42
+ code: PRMarkdownRefreshPreflightFailureCode;
43
+ summary: string;
44
+ remediationCommands: string[];
45
+ }
46
+ export declare function classifyPRMarkdownRefreshFailureCode(input: unknown): PRMarkdownRefreshDiagnosticCode | null;
47
+ export declare function classifyPRMarkdownRefreshPreflightCode(input: unknown, diagnosticCode?: PRMarkdownRefreshDiagnosticCode | null): PRMarkdownRefreshPreflightFailureCode | null;
48
+ export declare function resolvePRMarkdownRefreshPreflightErrorContract(input: unknown, diagnosticCode?: PRMarkdownRefreshDiagnosticCode | null): PRMarkdownRefreshPreflightErrorContract | null;
49
+ export declare function validatePRMarkdownRefreshPreflightErrorContract(input: unknown): boolean;
50
+ export declare function shouldUsePRMarkdownFallbackForCode(code: PRMarkdownRefreshDiagnosticCode): boolean;
51
+ export declare function shouldUsePRMarkdownFallback(input: unknown): boolean;
52
+ export declare function getPRMarkdownRefreshRemediationHints(code: PRMarkdownRefreshDiagnosticCode): string[];
53
+ export declare function resolvePRMarkdownRefreshGuidance(code: PRMarkdownRefreshDiagnosticCode): PRMarkdownRefreshGuidance;
54
+ export declare function buildPRMarkdownRefreshFailure(code: PRMarkdownRefreshDiagnosticCode, details: string, options: {
55
+ semanticDiffInspection: boolean;
56
+ nameStatusDiffSucceeded: boolean;
57
+ commandExecution?: PRMarkdownRefreshFailureCommandExecution;
58
+ }): PRMarkdownRefreshFailure;
59
+ export {};