@n-dx/core 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 (1902) hide show
  1. package/LICENSE +96 -0
  2. package/README.md +214 -0
  3. package/ci.js +1243 -0
  4. package/claude-integration.js +331 -0
  5. package/cli.js +975 -0
  6. package/config.js +1054 -0
  7. package/export.js +509 -0
  8. package/help.js +1051 -0
  9. package/package.json +93 -0
  10. package/packages/hench/dist/agent/analysis/adaptive.d.ts +101 -0
  11. package/packages/hench/dist/agent/analysis/adaptive.js +353 -0
  12. package/packages/hench/dist/agent/analysis/adaptive.js.map +1 -0
  13. package/packages/hench/dist/agent/analysis/index.d.ts +26 -0
  14. package/packages/hench/dist/agent/analysis/index.js +30 -0
  15. package/packages/hench/dist/agent/analysis/index.js.map +1 -0
  16. package/packages/hench/dist/agent/analysis/review.d.ts +40 -0
  17. package/packages/hench/dist/agent/analysis/review.js +66 -0
  18. package/packages/hench/dist/agent/analysis/review.js.map +1 -0
  19. package/packages/hench/dist/agent/analysis/spin.d.ts +27 -0
  20. package/packages/hench/dist/agent/analysis/spin.js +32 -0
  21. package/packages/hench/dist/agent/analysis/spin.js.map +1 -0
  22. package/packages/hench/dist/agent/analysis/stuck.d.ts +22 -0
  23. package/packages/hench/dist/agent/analysis/stuck.js +56 -0
  24. package/packages/hench/dist/agent/analysis/stuck.js.map +1 -0
  25. package/packages/hench/dist/agent/analysis/summary.d.ts +9 -0
  26. package/packages/hench/dist/agent/analysis/summary.js +106 -0
  27. package/packages/hench/dist/agent/analysis/summary.js.map +1 -0
  28. package/packages/hench/dist/agent/analysis/workflow.d.ts +60 -0
  29. package/packages/hench/dist/agent/analysis/workflow.js +359 -0
  30. package/packages/hench/dist/agent/analysis/workflow.js.map +1 -0
  31. package/packages/hench/dist/agent/brief.d.ts +33 -0
  32. package/packages/hench/dist/agent/brief.js +235 -0
  33. package/packages/hench/dist/agent/brief.js.map +1 -0
  34. package/packages/hench/dist/agent/cli-loop.d.ts +43 -0
  35. package/packages/hench/dist/agent/cli-loop.js +469 -0
  36. package/packages/hench/dist/agent/cli-loop.js.map +1 -0
  37. package/packages/hench/dist/agent/completion.d.ts +8 -0
  38. package/packages/hench/dist/agent/completion.js +8 -0
  39. package/packages/hench/dist/agent/completion.js.map +1 -0
  40. package/packages/hench/dist/agent/index.d.ts +35 -0
  41. package/packages/hench/dist/agent/index.js +40 -0
  42. package/packages/hench/dist/agent/index.js.map +1 -0
  43. package/packages/hench/dist/agent/lifecycle/cli-loop.d.ts +65 -0
  44. package/packages/hench/dist/agent/lifecycle/cli-loop.js +882 -0
  45. package/packages/hench/dist/agent/lifecycle/cli-loop.js.map +1 -0
  46. package/packages/hench/dist/agent/lifecycle/heartbeat.d.ts +38 -0
  47. package/packages/hench/dist/agent/lifecycle/heartbeat.js +72 -0
  48. package/packages/hench/dist/agent/lifecycle/heartbeat.js.map +1 -0
  49. package/packages/hench/dist/agent/lifecycle/loop.d.ts +11 -0
  50. package/packages/hench/dist/agent/lifecycle/loop.js +300 -0
  51. package/packages/hench/dist/agent/lifecycle/loop.js.map +1 -0
  52. package/packages/hench/dist/agent/lifecycle/shared.d.ts +138 -0
  53. package/packages/hench/dist/agent/lifecycle/shared.js +241 -0
  54. package/packages/hench/dist/agent/lifecycle/shared.js.map +1 -0
  55. package/packages/hench/dist/agent/lifecycle/task-display.d.ts +7 -0
  56. package/packages/hench/dist/agent/lifecycle/task-display.js +22 -0
  57. package/packages/hench/dist/agent/lifecycle/task-display.js.map +1 -0
  58. package/packages/hench/dist/agent/lifecycle/token-budget.d.ts +18 -0
  59. package/packages/hench/dist/agent/lifecycle/token-budget.js +16 -0
  60. package/packages/hench/dist/agent/lifecycle/token-budget.js.map +1 -0
  61. package/packages/hench/dist/agent/lifecycle/token-usage.d.ts +44 -0
  62. package/packages/hench/dist/agent/lifecycle/token-usage.js +102 -0
  63. package/packages/hench/dist/agent/lifecycle/token-usage.js.map +1 -0
  64. package/packages/hench/dist/agent/loop.d.ts +24 -0
  65. package/packages/hench/dist/agent/loop.js +312 -0
  66. package/packages/hench/dist/agent/loop.js.map +1 -0
  67. package/packages/hench/dist/agent/planning/brief.d.ts +40 -0
  68. package/packages/hench/dist/agent/planning/brief.js +267 -0
  69. package/packages/hench/dist/agent/planning/brief.js.map +1 -0
  70. package/packages/hench/dist/agent/planning/prompt.d.ts +2 -0
  71. package/packages/hench/dist/agent/planning/prompt.js +73 -0
  72. package/packages/hench/dist/agent/planning/prompt.js.map +1 -0
  73. package/packages/hench/dist/agent/prompt.d.ts +2 -0
  74. package/packages/hench/dist/agent/prompt.js +65 -0
  75. package/packages/hench/dist/agent/prompt.js.map +1 -0
  76. package/packages/hench/dist/agent/review.d.ts +40 -0
  77. package/packages/hench/dist/agent/review.js +76 -0
  78. package/packages/hench/dist/agent/review.js.map +1 -0
  79. package/packages/hench/dist/agent/stuck.d.ts +22 -0
  80. package/packages/hench/dist/agent/stuck.js +56 -0
  81. package/packages/hench/dist/agent/stuck.js.map +1 -0
  82. package/packages/hench/dist/agent/summary.d.ts +9 -0
  83. package/packages/hench/dist/agent/summary.js +106 -0
  84. package/packages/hench/dist/agent/summary.js.map +1 -0
  85. package/packages/hench/dist/agent/test-runner.d.ts +81 -0
  86. package/packages/hench/dist/agent/test-runner.js +245 -0
  87. package/packages/hench/dist/agent/test-runner.js.map +1 -0
  88. package/packages/hench/dist/agent/token-budget.d.ts +18 -0
  89. package/packages/hench/dist/agent/token-budget.js +16 -0
  90. package/packages/hench/dist/agent/token-budget.js.map +1 -0
  91. package/packages/hench/dist/agent/token-usage.d.ts +27 -0
  92. package/packages/hench/dist/agent/token-usage.js +52 -0
  93. package/packages/hench/dist/agent/token-usage.js.map +1 -0
  94. package/packages/hench/dist/agent/tools.d.ts +8 -0
  95. package/packages/hench/dist/agent/tools.js +8 -0
  96. package/packages/hench/dist/agent/tools.js.map +1 -0
  97. package/packages/hench/dist/cli/commands/config.d.ts +40 -0
  98. package/packages/hench/dist/cli/commands/config.js +463 -0
  99. package/packages/hench/dist/cli/commands/config.js.map +1 -0
  100. package/packages/hench/dist/cli/commands/constants.d.ts +5 -0
  101. package/packages/hench/dist/cli/commands/constants.js +46 -0
  102. package/packages/hench/dist/cli/commands/constants.js.map +1 -0
  103. package/packages/hench/dist/cli/commands/init.d.ts +1 -0
  104. package/packages/hench/dist/cli/commands/init.js +22 -0
  105. package/packages/hench/dist/cli/commands/init.js.map +1 -0
  106. package/packages/hench/dist/cli/commands/run.d.ts +108 -0
  107. package/packages/hench/dist/cli/commands/run.js +847 -0
  108. package/packages/hench/dist/cli/commands/run.js.map +1 -0
  109. package/packages/hench/dist/cli/commands/show.d.ts +1 -0
  110. package/packages/hench/dist/cli/commands/show.js +101 -0
  111. package/packages/hench/dist/cli/commands/show.js.map +1 -0
  112. package/packages/hench/dist/cli/commands/status.d.ts +1 -0
  113. package/packages/hench/dist/cli/commands/status.js +63 -0
  114. package/packages/hench/dist/cli/commands/status.js.map +1 -0
  115. package/packages/hench/dist/cli/commands/task-lookup.d.ts +24 -0
  116. package/packages/hench/dist/cli/commands/task-lookup.js +69 -0
  117. package/packages/hench/dist/cli/commands/task-lookup.js.map +1 -0
  118. package/packages/hench/dist/cli/commands/template.d.ts +12 -0
  119. package/packages/hench/dist/cli/commands/template.js +217 -0
  120. package/packages/hench/dist/cli/commands/template.js.map +1 -0
  121. package/packages/hench/dist/cli/errors.d.ts +55 -0
  122. package/packages/hench/dist/cli/errors.js +185 -0
  123. package/packages/hench/dist/cli/errors.js.map +1 -0
  124. package/packages/hench/dist/cli/help.d.ts +23 -0
  125. package/packages/hench/dist/cli/help.js +186 -0
  126. package/packages/hench/dist/cli/help.js.map +1 -0
  127. package/packages/hench/dist/cli/index.d.ts +21 -0
  128. package/packages/hench/dist/cli/index.js +131 -0
  129. package/packages/hench/dist/cli/index.js.map +1 -0
  130. package/packages/hench/dist/cli/output.d.ts +9 -0
  131. package/packages/hench/dist/cli/output.js +10 -0
  132. package/packages/hench/dist/cli/output.js.map +1 -0
  133. package/packages/hench/dist/guard/commands.d.ts +27 -0
  134. package/packages/hench/dist/guard/commands.js +69 -0
  135. package/packages/hench/dist/guard/commands.js.map +1 -0
  136. package/packages/hench/dist/guard/contracts.d.ts +31 -0
  137. package/packages/hench/dist/guard/contracts.js +8 -0
  138. package/packages/hench/dist/guard/contracts.js.map +1 -0
  139. package/packages/hench/dist/guard/index.d.ts +107 -0
  140. package/packages/hench/dist/guard/index.js +139 -0
  141. package/packages/hench/dist/guard/index.js.map +1 -0
  142. package/packages/hench/dist/guard/paths.d.ts +43 -0
  143. package/packages/hench/dist/guard/paths.js +112 -0
  144. package/packages/hench/dist/guard/paths.js.map +1 -0
  145. package/packages/hench/dist/guard/policy.d.ts +108 -0
  146. package/packages/hench/dist/guard/policy.js +156 -0
  147. package/packages/hench/dist/guard/policy.js.map +1 -0
  148. package/packages/hench/dist/prd/llm-gateway.d.ts +47 -0
  149. package/packages/hench/dist/prd/llm-gateway.js +57 -0
  150. package/packages/hench/dist/prd/llm-gateway.js.map +1 -0
  151. package/packages/hench/dist/prd/ops.d.ts +5 -0
  152. package/packages/hench/dist/prd/ops.js +6 -0
  153. package/packages/hench/dist/prd/ops.js.map +1 -0
  154. package/packages/hench/dist/prd/rex-gateway.d.ts +95 -0
  155. package/packages/hench/dist/prd/rex-gateway.js +104 -0
  156. package/packages/hench/dist/prd/rex-gateway.js.map +1 -0
  157. package/packages/hench/dist/process/concurrent-execution-metrics.d.ts +243 -0
  158. package/packages/hench/dist/process/concurrent-execution-metrics.js +352 -0
  159. package/packages/hench/dist/process/concurrent-execution-metrics.js.map +1 -0
  160. package/packages/hench/dist/process/exec-shell.d.ts +8 -0
  161. package/packages/hench/dist/process/exec-shell.js +8 -0
  162. package/packages/hench/dist/process/exec-shell.js.map +1 -0
  163. package/packages/hench/dist/process/exec.d.ts +12 -0
  164. package/packages/hench/dist/process/exec.js +12 -0
  165. package/packages/hench/dist/process/exec.js.map +1 -0
  166. package/packages/hench/dist/process/index.d.ts +22 -0
  167. package/packages/hench/dist/process/index.js +15 -0
  168. package/packages/hench/dist/process/index.js.map +1 -0
  169. package/packages/hench/dist/process/lifecycle.d.ts +208 -0
  170. package/packages/hench/dist/process/lifecycle.js +387 -0
  171. package/packages/hench/dist/process/lifecycle.js.map +1 -0
  172. package/packages/hench/dist/process/limiter.d.ts +85 -0
  173. package/packages/hench/dist/process/limiter.js +215 -0
  174. package/packages/hench/dist/process/limiter.js.map +1 -0
  175. package/packages/hench/dist/process/memory-monitor.d.ts +162 -0
  176. package/packages/hench/dist/process/memory-monitor.js +268 -0
  177. package/packages/hench/dist/process/memory-monitor.js.map +1 -0
  178. package/packages/hench/dist/process/memory-throttle.d.ts +140 -0
  179. package/packages/hench/dist/process/memory-throttle.js +238 -0
  180. package/packages/hench/dist/process/memory-throttle.js.map +1 -0
  181. package/packages/hench/dist/process/pool.d.ts +231 -0
  182. package/packages/hench/dist/process/pool.js +344 -0
  183. package/packages/hench/dist/process/pool.js.map +1 -0
  184. package/packages/hench/dist/process/process-memory-tracker.d.ts +164 -0
  185. package/packages/hench/dist/process/process-memory-tracker.js +249 -0
  186. package/packages/hench/dist/process/process-memory-tracker.js.map +1 -0
  187. package/packages/hench/dist/public.d.ts +62 -0
  188. package/packages/hench/dist/public.js +58 -0
  189. package/packages/hench/dist/public.js.map +1 -0
  190. package/packages/hench/dist/queue/execution-queue.d.ts +128 -0
  191. package/packages/hench/dist/queue/execution-queue.js +206 -0
  192. package/packages/hench/dist/queue/execution-queue.js.map +1 -0
  193. package/packages/hench/dist/queue/format.d.ts +19 -0
  194. package/packages/hench/dist/queue/format.js +52 -0
  195. package/packages/hench/dist/queue/format.js.map +1 -0
  196. package/packages/hench/dist/queue/index.d.ts +5 -0
  197. package/packages/hench/dist/queue/index.js +4 -0
  198. package/packages/hench/dist/queue/index.js.map +1 -0
  199. package/packages/hench/dist/queue/priority-scheduler.d.ts +73 -0
  200. package/packages/hench/dist/queue/priority-scheduler.js +119 -0
  201. package/packages/hench/dist/queue/priority-scheduler.js.map +1 -0
  202. package/packages/hench/dist/schema/index.d.ts +6 -0
  203. package/packages/hench/dist/schema/index.js +4 -0
  204. package/packages/hench/dist/schema/index.js.map +1 -0
  205. package/packages/hench/dist/schema/templates.d.ts +34 -0
  206. package/packages/hench/dist/schema/templates.js +147 -0
  207. package/packages/hench/dist/schema/templates.js.map +1 -0
  208. package/packages/hench/dist/schema/v1.d.ts +235 -0
  209. package/packages/hench/dist/schema/v1.js +34 -0
  210. package/packages/hench/dist/schema/v1.js.map +1 -0
  211. package/packages/hench/dist/schema/validate.d.ts +601 -0
  212. package/packages/hench/dist/schema/validate.js +166 -0
  213. package/packages/hench/dist/schema/validate.js.map +1 -0
  214. package/packages/hench/dist/shared/glob.d.ts +11 -0
  215. package/packages/hench/dist/shared/glob.js +57 -0
  216. package/packages/hench/dist/shared/glob.js.map +1 -0
  217. package/packages/hench/dist/store/adjustments.d.ts +75 -0
  218. package/packages/hench/dist/store/adjustments.js +139 -0
  219. package/packages/hench/dist/store/adjustments.js.map +1 -0
  220. package/packages/hench/dist/store/config.d.ts +6 -0
  221. package/packages/hench/dist/store/config.js +41 -0
  222. package/packages/hench/dist/store/config.js.map +1 -0
  223. package/packages/hench/dist/store/index.d.ts +7 -0
  224. package/packages/hench/dist/store/index.js +6 -0
  225. package/packages/hench/dist/store/index.js.map +1 -0
  226. package/packages/hench/dist/store/json.d.ts +1 -0
  227. package/packages/hench/dist/store/json.js +3 -0
  228. package/packages/hench/dist/store/json.js.map +1 -0
  229. package/packages/hench/dist/store/project-config.d.ts +62 -0
  230. package/packages/hench/dist/store/project-config.js +100 -0
  231. package/packages/hench/dist/store/project-config.js.map +1 -0
  232. package/packages/hench/dist/store/run-archiver.d.ts +107 -0
  233. package/packages/hench/dist/store/run-archiver.js +204 -0
  234. package/packages/hench/dist/store/run-archiver.js.map +1 -0
  235. package/packages/hench/dist/store/run-change-detector.d.ts +99 -0
  236. package/packages/hench/dist/store/run-change-detector.js +170 -0
  237. package/packages/hench/dist/store/run-change-detector.js.map +1 -0
  238. package/packages/hench/dist/store/run-retention-scheduler.d.ts +80 -0
  239. package/packages/hench/dist/store/run-retention-scheduler.js +143 -0
  240. package/packages/hench/dist/store/run-retention-scheduler.js.map +1 -0
  241. package/packages/hench/dist/store/run-retention.d.ts +150 -0
  242. package/packages/hench/dist/store/run-retention.js +327 -0
  243. package/packages/hench/dist/store/run-retention.js.map +1 -0
  244. package/packages/hench/dist/store/runs.d.ts +4 -0
  245. package/packages/hench/dist/store/runs.js +80 -0
  246. package/packages/hench/dist/store/runs.js.map +1 -0
  247. package/packages/hench/dist/store/suggestions.d.ts +43 -0
  248. package/packages/hench/dist/store/suggestions.js +61 -0
  249. package/packages/hench/dist/store/suggestions.js.map +1 -0
  250. package/packages/hench/dist/store/templates.d.ts +34 -0
  251. package/packages/hench/dist/store/templates.js +119 -0
  252. package/packages/hench/dist/store/templates.js.map +1 -0
  253. package/packages/hench/dist/tools/contracts.d.ts +60 -0
  254. package/packages/hench/dist/tools/contracts.js +2 -0
  255. package/packages/hench/dist/tools/contracts.js.map +1 -0
  256. package/packages/hench/dist/tools/dispatch.d.ts +29 -0
  257. package/packages/hench/dist/tools/dispatch.js +213 -0
  258. package/packages/hench/dist/tools/dispatch.js.map +1 -0
  259. package/packages/hench/dist/tools/exec-shell.d.ts +23 -0
  260. package/packages/hench/dist/tools/exec-shell.js +29 -0
  261. package/packages/hench/dist/tools/exec-shell.js.map +1 -0
  262. package/packages/hench/dist/tools/files.d.ts +17 -0
  263. package/packages/hench/dist/tools/files.js +111 -0
  264. package/packages/hench/dist/tools/files.js.map +1 -0
  265. package/packages/hench/dist/tools/git.d.ts +5 -0
  266. package/packages/hench/dist/tools/git.js +48 -0
  267. package/packages/hench/dist/tools/git.js.map +1 -0
  268. package/packages/hench/dist/tools/index.d.ts +17 -0
  269. package/packages/hench/dist/tools/index.js +19 -0
  270. package/packages/hench/dist/tools/index.js.map +1 -0
  271. package/packages/hench/dist/tools/rex.d.ts +32 -0
  272. package/packages/hench/dist/tools/rex.js +185 -0
  273. package/packages/hench/dist/tools/rex.js.map +1 -0
  274. package/packages/hench/dist/tools/shell.d.ts +6 -0
  275. package/packages/hench/dist/tools/shell.js +10 -0
  276. package/packages/hench/dist/tools/shell.js.map +1 -0
  277. package/packages/hench/dist/tools/test-runner.d.ts +81 -0
  278. package/packages/hench/dist/tools/test-runner.js +229 -0
  279. package/packages/hench/dist/tools/test-runner.js.map +1 -0
  280. package/packages/hench/dist/types/index.d.ts +4 -0
  281. package/packages/hench/dist/types/index.js +6 -0
  282. package/packages/hench/dist/types/index.js.map +1 -0
  283. package/packages/hench/dist/types/output.d.ts +47 -0
  284. package/packages/hench/dist/types/output.js +74 -0
  285. package/packages/hench/dist/types/output.js.map +1 -0
  286. package/packages/hench/dist/validation/completion.d.ts +37 -0
  287. package/packages/hench/dist/validation/completion.js +83 -0
  288. package/packages/hench/dist/validation/completion.js.map +1 -0
  289. package/packages/hench/dist/validation/index.d.ts +9 -0
  290. package/packages/hench/dist/validation/index.js +9 -0
  291. package/packages/hench/dist/validation/index.js.map +1 -0
  292. package/packages/hench/package.json +40 -0
  293. package/packages/llm-client/dist/api-provider.d.ts +47 -0
  294. package/packages/llm-client/dist/api-provider.js +126 -0
  295. package/packages/llm-client/dist/api-provider.js.map +1 -0
  296. package/packages/llm-client/dist/auth.d.ts +85 -0
  297. package/packages/llm-client/dist/auth.js +165 -0
  298. package/packages/llm-client/dist/auth.js.map +1 -0
  299. package/packages/llm-client/dist/cli-provider.d.ts +49 -0
  300. package/packages/llm-client/dist/cli-provider.js +226 -0
  301. package/packages/llm-client/dist/cli-provider.js.map +1 -0
  302. package/packages/llm-client/dist/codex-cli-provider.d.ts +15 -0
  303. package/packages/llm-client/dist/codex-cli-provider.js +206 -0
  304. package/packages/llm-client/dist/codex-cli-provider.js.map +1 -0
  305. package/packages/llm-client/dist/config.d.ts +39 -0
  306. package/packages/llm-client/dist/config.js +85 -0
  307. package/packages/llm-client/dist/config.js.map +1 -0
  308. package/packages/llm-client/dist/create-client.d.ts +66 -0
  309. package/packages/llm-client/dist/create-client.js +73 -0
  310. package/packages/llm-client/dist/create-client.js.map +1 -0
  311. package/packages/llm-client/dist/exec.d.ts +231 -0
  312. package/packages/llm-client/dist/exec.js +440 -0
  313. package/packages/llm-client/dist/exec.js.map +1 -0
  314. package/packages/llm-client/dist/help-format.d.ts +143 -0
  315. package/packages/llm-client/dist/help-format.js +280 -0
  316. package/packages/llm-client/dist/help-format.js.map +1 -0
  317. package/packages/llm-client/dist/json.d.ts +15 -0
  318. package/packages/llm-client/dist/json.js +18 -0
  319. package/packages/llm-client/dist/json.js.map +1 -0
  320. package/packages/llm-client/dist/llm-client.d.ts +43 -0
  321. package/packages/llm-client/dist/llm-client.js +48 -0
  322. package/packages/llm-client/dist/llm-client.js.map +1 -0
  323. package/packages/llm-client/dist/llm-config.d.ts +16 -0
  324. package/packages/llm-client/dist/llm-config.js +81 -0
  325. package/packages/llm-client/dist/llm-config.js.map +1 -0
  326. package/packages/llm-client/dist/llm-types.d.ts +40 -0
  327. package/packages/llm-client/dist/llm-types.js +17 -0
  328. package/packages/llm-client/dist/llm-types.js.map +1 -0
  329. package/packages/llm-client/dist/output.d.ts +27 -0
  330. package/packages/llm-client/dist/output.js +38 -0
  331. package/packages/llm-client/dist/output.js.map +1 -0
  332. package/packages/llm-client/dist/project-config.d.ts +25 -0
  333. package/packages/llm-client/dist/project-config.js +66 -0
  334. package/packages/llm-client/dist/project-config.js.map +1 -0
  335. package/packages/llm-client/dist/project-dirs.d.ts +32 -0
  336. package/packages/llm-client/dist/project-dirs.js +31 -0
  337. package/packages/llm-client/dist/project-dirs.js.map +1 -0
  338. package/packages/llm-client/dist/provider-interface.d.ts +194 -0
  339. package/packages/llm-client/dist/provider-interface.js +50 -0
  340. package/packages/llm-client/dist/provider-interface.js.map +1 -0
  341. package/packages/llm-client/dist/provider-registry.d.ts +147 -0
  342. package/packages/llm-client/dist/provider-registry.js +175 -0
  343. package/packages/llm-client/dist/provider-registry.js.map +1 -0
  344. package/packages/llm-client/dist/provider-session.d.ts +141 -0
  345. package/packages/llm-client/dist/provider-session.js +174 -0
  346. package/packages/llm-client/dist/provider-session.js.map +1 -0
  347. package/packages/llm-client/dist/public.d.ts +120 -0
  348. package/packages/llm-client/dist/public.js +122 -0
  349. package/packages/llm-client/dist/public.js.map +1 -0
  350. package/packages/llm-client/dist/suggest.d.ts +27 -0
  351. package/packages/llm-client/dist/suggest.js +63 -0
  352. package/packages/llm-client/dist/suggest.js.map +1 -0
  353. package/packages/llm-client/dist/token-usage.d.ts +43 -0
  354. package/packages/llm-client/dist/token-usage.js +106 -0
  355. package/packages/llm-client/dist/token-usage.js.map +1 -0
  356. package/packages/llm-client/dist/types.d.ts +108 -0
  357. package/packages/llm-client/dist/types.js +49 -0
  358. package/packages/llm-client/dist/types.js.map +1 -0
  359. package/packages/llm-client/package.json +34 -0
  360. package/packages/rex/dist/analyze/acknowledge.d.ts +44 -0
  361. package/packages/rex/dist/analyze/acknowledge.js +100 -0
  362. package/packages/rex/dist/analyze/acknowledge.js.map +1 -0
  363. package/packages/rex/dist/analyze/analyze-shared.d.ts +51 -0
  364. package/packages/rex/dist/analyze/analyze-shared.js +356 -0
  365. package/packages/rex/dist/analyze/analyze-shared.js.map +1 -0
  366. package/packages/rex/dist/analyze/batch-types.d.ts +48 -0
  367. package/packages/rex/dist/analyze/batch-types.js +9 -0
  368. package/packages/rex/dist/analyze/batch-types.js.map +1 -0
  369. package/packages/rex/dist/analyze/consolidation-guard.d.ts +45 -0
  370. package/packages/rex/dist/analyze/consolidation-guard.js +125 -0
  371. package/packages/rex/dist/analyze/consolidation-guard.js.map +1 -0
  372. package/packages/rex/dist/analyze/decompose.d.ts +62 -0
  373. package/packages/rex/dist/analyze/decompose.js +212 -0
  374. package/packages/rex/dist/analyze/decompose.js.map +1 -0
  375. package/packages/rex/dist/analyze/dedupe.d.ts +30 -0
  376. package/packages/rex/dist/analyze/dedupe.js +339 -0
  377. package/packages/rex/dist/analyze/dedupe.js.map +1 -0
  378. package/packages/rex/dist/analyze/diff.d.ts +13 -0
  379. package/packages/rex/dist/analyze/diff.js +146 -0
  380. package/packages/rex/dist/analyze/diff.js.map +1 -0
  381. package/packages/rex/dist/analyze/extract.d.ts +152 -0
  382. package/packages/rex/dist/analyze/extract.js +1338 -0
  383. package/packages/rex/dist/analyze/extract.js.map +1 -0
  384. package/packages/rex/dist/analyze/file-validation.d.ts +122 -0
  385. package/packages/rex/dist/analyze/file-validation.js +427 -0
  386. package/packages/rex/dist/analyze/file-validation.js.map +1 -0
  387. package/packages/rex/dist/analyze/guided.d.ts +17 -0
  388. package/packages/rex/dist/analyze/guided.js +162 -0
  389. package/packages/rex/dist/analyze/guided.js.map +1 -0
  390. package/packages/rex/dist/analyze/index.d.ts +27 -0
  391. package/packages/rex/dist/analyze/index.js +15 -0
  392. package/packages/rex/dist/analyze/index.js.map +1 -0
  393. package/packages/rex/dist/analyze/llm-bridge.d.ts +49 -0
  394. package/packages/rex/dist/analyze/llm-bridge.js +133 -0
  395. package/packages/rex/dist/analyze/llm-bridge.js.map +1 -0
  396. package/packages/rex/dist/analyze/modify-reason.d.ts +68 -0
  397. package/packages/rex/dist/analyze/modify-reason.js +182 -0
  398. package/packages/rex/dist/analyze/modify-reason.js.map +1 -0
  399. package/packages/rex/dist/analyze/propose.d.ts +72 -0
  400. package/packages/rex/dist/analyze/propose.js +246 -0
  401. package/packages/rex/dist/analyze/propose.js.map +1 -0
  402. package/packages/rex/dist/analyze/reason.d.ts +277 -0
  403. package/packages/rex/dist/analyze/reason.js +1446 -0
  404. package/packages/rex/dist/analyze/reason.js.map +1 -0
  405. package/packages/rex/dist/analyze/reconcile.d.ts +25 -0
  406. package/packages/rex/dist/analyze/reconcile.js +82 -0
  407. package/packages/rex/dist/analyze/reconcile.js.map +1 -0
  408. package/packages/rex/dist/analyze/reshape-reason.d.ts +38 -0
  409. package/packages/rex/dist/analyze/reshape-reason.js +302 -0
  410. package/packages/rex/dist/analyze/reshape-reason.js.map +1 -0
  411. package/packages/rex/dist/analyze/scanners.d.ts +36 -0
  412. package/packages/rex/dist/analyze/scanners.js +805 -0
  413. package/packages/rex/dist/analyze/scanners.js.map +1 -0
  414. package/packages/rex/dist/analyze/validate-modification.d.ts +54 -0
  415. package/packages/rex/dist/analyze/validate-modification.js +166 -0
  416. package/packages/rex/dist/analyze/validate-modification.js.map +1 -0
  417. package/packages/rex/dist/cli/commands/adapter.d.ts +11 -0
  418. package/packages/rex/dist/cli/commands/adapter.js +211 -0
  419. package/packages/rex/dist/cli/commands/adapter.js.map +1 -0
  420. package/packages/rex/dist/cli/commands/add.d.ts +1 -0
  421. package/packages/rex/dist/cli/commands/add.js +111 -0
  422. package/packages/rex/dist/cli/commands/add.js.map +1 -0
  423. package/packages/rex/dist/cli/commands/analyze.d.ts +4 -0
  424. package/packages/rex/dist/cli/commands/analyze.js +672 -0
  425. package/packages/rex/dist/cli/commands/analyze.js.map +1 -0
  426. package/packages/rex/dist/cli/commands/chunked-review-state.d.ts +183 -0
  427. package/packages/rex/dist/cli/commands/chunked-review-state.js +637 -0
  428. package/packages/rex/dist/cli/commands/chunked-review-state.js.map +1 -0
  429. package/packages/rex/dist/cli/commands/chunked-review.d.ts +21 -0
  430. package/packages/rex/dist/cli/commands/chunked-review.js +147 -0
  431. package/packages/rex/dist/cli/commands/chunked-review.js.map +1 -0
  432. package/packages/rex/dist/cli/commands/constants.d.ts +3 -0
  433. package/packages/rex/dist/cli/commands/constants.js +50 -0
  434. package/packages/rex/dist/cli/commands/constants.js.map +1 -0
  435. package/packages/rex/dist/cli/commands/decomposition-review.d.ts +92 -0
  436. package/packages/rex/dist/cli/commands/decomposition-review.js +258 -0
  437. package/packages/rex/dist/cli/commands/decomposition-review.js.map +1 -0
  438. package/packages/rex/dist/cli/commands/fix.d.ts +8 -0
  439. package/packages/rex/dist/cli/commands/fix.js +101 -0
  440. package/packages/rex/dist/cli/commands/fix.js.map +1 -0
  441. package/packages/rex/dist/cli/commands/format-loe.d.ts +22 -0
  442. package/packages/rex/dist/cli/commands/format-loe.js +35 -0
  443. package/packages/rex/dist/cli/commands/format-loe.js.map +1 -0
  444. package/packages/rex/dist/cli/commands/health.d.ts +7 -0
  445. package/packages/rex/dist/cli/commands/health.js +24 -0
  446. package/packages/rex/dist/cli/commands/health.js.map +1 -0
  447. package/packages/rex/dist/cli/commands/init.d.ts +1 -0
  448. package/packages/rex/dist/cli/commands/init.js +64 -0
  449. package/packages/rex/dist/cli/commands/init.js.map +1 -0
  450. package/packages/rex/dist/cli/commands/move.d.ts +1 -0
  451. package/packages/rex/dist/cli/commands/move.js +45 -0
  452. package/packages/rex/dist/cli/commands/move.js.map +1 -0
  453. package/packages/rex/dist/cli/commands/next.d.ts +1 -0
  454. package/packages/rex/dist/cli/commands/next.js +64 -0
  455. package/packages/rex/dist/cli/commands/next.js.map +1 -0
  456. package/packages/rex/dist/cli/commands/prune.d.ts +1 -0
  457. package/packages/rex/dist/cli/commands/prune.js +561 -0
  458. package/packages/rex/dist/cli/commands/prune.js.map +1 -0
  459. package/packages/rex/dist/cli/commands/recommend.d.ts +2 -0
  460. package/packages/rex/dist/cli/commands/recommend.js +517 -0
  461. package/packages/rex/dist/cli/commands/recommend.js.map +1 -0
  462. package/packages/rex/dist/cli/commands/remove.d.ts +12 -0
  463. package/packages/rex/dist/cli/commands/remove.js +206 -0
  464. package/packages/rex/dist/cli/commands/remove.js.map +1 -0
  465. package/packages/rex/dist/cli/commands/reorganize.d.ts +16 -0
  466. package/packages/rex/dist/cli/commands/reorganize.js +288 -0
  467. package/packages/rex/dist/cli/commands/reorganize.js.map +1 -0
  468. package/packages/rex/dist/cli/commands/report.d.ts +49 -0
  469. package/packages/rex/dist/cli/commands/report.js +218 -0
  470. package/packages/rex/dist/cli/commands/report.js.map +1 -0
  471. package/packages/rex/dist/cli/commands/reshape.d.ts +1 -0
  472. package/packages/rex/dist/cli/commands/reshape.js +182 -0
  473. package/packages/rex/dist/cli/commands/reshape.js.map +1 -0
  474. package/packages/rex/dist/cli/commands/smart-add-duplicates.d.ts +45 -0
  475. package/packages/rex/dist/cli/commands/smart-add-duplicates.js +252 -0
  476. package/packages/rex/dist/cli/commands/smart-add-duplicates.js.map +1 -0
  477. package/packages/rex/dist/cli/commands/smart-add.d.ts +80 -0
  478. package/packages/rex/dist/cli/commands/smart-add.js +1343 -0
  479. package/packages/rex/dist/cli/commands/smart-add.js.map +1 -0
  480. package/packages/rex/dist/cli/commands/status-sections.d.ts +70 -0
  481. package/packages/rex/dist/cli/commands/status-sections.js +201 -0
  482. package/packages/rex/dist/cli/commands/status-sections.js.map +1 -0
  483. package/packages/rex/dist/cli/commands/status-shared.d.ts +44 -0
  484. package/packages/rex/dist/cli/commands/status-shared.js +191 -0
  485. package/packages/rex/dist/cli/commands/status-shared.js.map +1 -0
  486. package/packages/rex/dist/cli/commands/status.d.ts +3 -0
  487. package/packages/rex/dist/cli/commands/status.js +118 -0
  488. package/packages/rex/dist/cli/commands/status.js.map +1 -0
  489. package/packages/rex/dist/cli/commands/sync.d.ts +11 -0
  490. package/packages/rex/dist/cli/commands/sync.js +131 -0
  491. package/packages/rex/dist/cli/commands/sync.js.map +1 -0
  492. package/packages/rex/dist/cli/commands/token-format.d.ts +31 -0
  493. package/packages/rex/dist/cli/commands/token-format.js +86 -0
  494. package/packages/rex/dist/cli/commands/token-format.js.map +1 -0
  495. package/packages/rex/dist/cli/commands/update.d.ts +1 -0
  496. package/packages/rex/dist/cli/commands/update.js +146 -0
  497. package/packages/rex/dist/cli/commands/update.js.map +1 -0
  498. package/packages/rex/dist/cli/commands/usage.d.ts +1 -0
  499. package/packages/rex/dist/cli/commands/usage.js +192 -0
  500. package/packages/rex/dist/cli/commands/usage.js.map +1 -0
  501. package/packages/rex/dist/cli/commands/validate-interactive.d.ts +46 -0
  502. package/packages/rex/dist/cli/commands/validate-interactive.js +236 -0
  503. package/packages/rex/dist/cli/commands/validate-interactive.js.map +1 -0
  504. package/packages/rex/dist/cli/commands/validate.d.ts +10 -0
  505. package/packages/rex/dist/cli/commands/validate.js +212 -0
  506. package/packages/rex/dist/cli/commands/validate.js.map +1 -0
  507. package/packages/rex/dist/cli/commands/verify.d.ts +1 -0
  508. package/packages/rex/dist/cli/commands/verify.js +90 -0
  509. package/packages/rex/dist/cli/commands/verify.js.map +1 -0
  510. package/packages/rex/dist/cli/errors.d.ts +40 -0
  511. package/packages/rex/dist/cli/errors.js +125 -0
  512. package/packages/rex/dist/cli/errors.js.map +1 -0
  513. package/packages/rex/dist/cli/help.d.ts +23 -0
  514. package/packages/rex/dist/cli/help.js +584 -0
  515. package/packages/rex/dist/cli/help.js.map +1 -0
  516. package/packages/rex/dist/cli/index.d.ts +2 -0
  517. package/packages/rex/dist/cli/index.js +405 -0
  518. package/packages/rex/dist/cli/index.js.map +1 -0
  519. package/packages/rex/dist/cli/mcp-tools.d.ts +86 -0
  520. package/packages/rex/dist/cli/mcp-tools.js +555 -0
  521. package/packages/rex/dist/cli/mcp-tools.js.map +1 -0
  522. package/packages/rex/dist/cli/mcp.d.ts +26 -0
  523. package/packages/rex/dist/cli/mcp.js +144 -0
  524. package/packages/rex/dist/cli/mcp.js.map +1 -0
  525. package/packages/rex/dist/cli/output.d.ts +36 -0
  526. package/packages/rex/dist/cli/output.js +70 -0
  527. package/packages/rex/dist/cli/output.js.map +1 -0
  528. package/packages/rex/dist/cli/validate-input.d.ts +45 -0
  529. package/packages/rex/dist/cli/validate-input.js +87 -0
  530. package/packages/rex/dist/cli/validate-input.js.map +1 -0
  531. package/packages/rex/dist/core/analytics.d.ts +38 -0
  532. package/packages/rex/dist/core/analytics.js +87 -0
  533. package/packages/rex/dist/core/analytics.js.map +1 -0
  534. package/packages/rex/dist/core/canonical.d.ts +3 -0
  535. package/packages/rex/dist/core/canonical.js +21 -0
  536. package/packages/rex/dist/core/canonical.js.map +1 -0
  537. package/packages/rex/dist/core/cascade-reset.d.ts +31 -0
  538. package/packages/rex/dist/core/cascade-reset.js +47 -0
  539. package/packages/rex/dist/core/cascade-reset.js.map +1 -0
  540. package/packages/rex/dist/core/code-coverage.d.ts +38 -0
  541. package/packages/rex/dist/core/code-coverage.js +85 -0
  542. package/packages/rex/dist/core/code-coverage.js.map +1 -0
  543. package/packages/rex/dist/core/dag.d.ts +6 -0
  544. package/packages/rex/dist/core/dag.js +67 -0
  545. package/packages/rex/dist/core/dag.js.map +1 -0
  546. package/packages/rex/dist/core/delete.d.ts +10 -0
  547. package/packages/rex/dist/core/delete.js +38 -0
  548. package/packages/rex/dist/core/delete.js.map +1 -0
  549. package/packages/rex/dist/core/epic-correlation.d.ts +94 -0
  550. package/packages/rex/dist/core/epic-correlation.js +179 -0
  551. package/packages/rex/dist/core/epic-correlation.js.map +1 -0
  552. package/packages/rex/dist/core/facets.d.ts +54 -0
  553. package/packages/rex/dist/core/facets.js +176 -0
  554. package/packages/rex/dist/core/facets.js.map +1 -0
  555. package/packages/rex/dist/core/fix.d.ts +59 -0
  556. package/packages/rex/dist/core/fix.js +190 -0
  557. package/packages/rex/dist/core/fix.js.map +1 -0
  558. package/packages/rex/dist/core/health.d.ts +43 -0
  559. package/packages/rex/dist/core/health.js +331 -0
  560. package/packages/rex/dist/core/health.js.map +1 -0
  561. package/packages/rex/dist/core/keywords.d.ts +20 -0
  562. package/packages/rex/dist/core/keywords.js +47 -0
  563. package/packages/rex/dist/core/keywords.js.map +1 -0
  564. package/packages/rex/dist/core/merge.d.ts +87 -0
  565. package/packages/rex/dist/core/merge.js +289 -0
  566. package/packages/rex/dist/core/merge.js.map +1 -0
  567. package/packages/rex/dist/core/move.d.ts +48 -0
  568. package/packages/rex/dist/core/move.js +163 -0
  569. package/packages/rex/dist/core/move.js.map +1 -0
  570. package/packages/rex/dist/core/next-task.d.ts +121 -0
  571. package/packages/rex/dist/core/next-task.js +443 -0
  572. package/packages/rex/dist/core/next-task.js.map +1 -0
  573. package/packages/rex/dist/core/notion-map.d.ts +207 -0
  574. package/packages/rex/dist/core/notion-map.js +535 -0
  575. package/packages/rex/dist/core/notion-map.js.map +1 -0
  576. package/packages/rex/dist/core/override-escalation.d.ts +28 -0
  577. package/packages/rex/dist/core/override-escalation.js +69 -0
  578. package/packages/rex/dist/core/override-escalation.js.map +1 -0
  579. package/packages/rex/dist/core/parent-completion.d.ts +41 -0
  580. package/packages/rex/dist/core/parent-completion.js +75 -0
  581. package/packages/rex/dist/core/parent-completion.js.map +1 -0
  582. package/packages/rex/dist/core/parent-reset.d.ts +45 -0
  583. package/packages/rex/dist/core/parent-reset.js +59 -0
  584. package/packages/rex/dist/core/parent-reset.js.map +1 -0
  585. package/packages/rex/dist/core/pending-cache.d.ts +27 -0
  586. package/packages/rex/dist/core/pending-cache.js +55 -0
  587. package/packages/rex/dist/core/pending-cache.js.map +1 -0
  588. package/packages/rex/dist/core/prune.d.ts +50 -0
  589. package/packages/rex/dist/core/prune.js +89 -0
  590. package/packages/rex/dist/core/prune.js.map +1 -0
  591. package/packages/rex/dist/core/remove-epic.d.ts +35 -0
  592. package/packages/rex/dist/core/remove-epic.js +51 -0
  593. package/packages/rex/dist/core/remove-epic.js.map +1 -0
  594. package/packages/rex/dist/core/remove-feature.d.ts +100 -0
  595. package/packages/rex/dist/core/remove-feature.js +189 -0
  596. package/packages/rex/dist/core/remove-feature.js.map +1 -0
  597. package/packages/rex/dist/core/remove-task.d.ts +66 -0
  598. package/packages/rex/dist/core/remove-task.js +93 -0
  599. package/packages/rex/dist/core/remove-task.js.map +1 -0
  600. package/packages/rex/dist/core/reorganize-executor.d.ts +43 -0
  601. package/packages/rex/dist/core/reorganize-executor.js +153 -0
  602. package/packages/rex/dist/core/reorganize-executor.js.map +1 -0
  603. package/packages/rex/dist/core/reorganize.d.ts +109 -0
  604. package/packages/rex/dist/core/reorganize.js +453 -0
  605. package/packages/rex/dist/core/reorganize.js.map +1 -0
  606. package/packages/rex/dist/core/requirements.d.ts +131 -0
  607. package/packages/rex/dist/core/requirements.js +263 -0
  608. package/packages/rex/dist/core/requirements.js.map +1 -0
  609. package/packages/rex/dist/core/reshape.d.ts +88 -0
  610. package/packages/rex/dist/core/reshape.js +168 -0
  611. package/packages/rex/dist/core/reshape.js.map +1 -0
  612. package/packages/rex/dist/core/scope-creep.d.ts +31 -0
  613. package/packages/rex/dist/core/scope-creep.js +53 -0
  614. package/packages/rex/dist/core/scope-creep.js.map +1 -0
  615. package/packages/rex/dist/core/stats.d.ts +12 -0
  616. package/packages/rex/dist/core/stats.js +47 -0
  617. package/packages/rex/dist/core/stats.js.map +1 -0
  618. package/packages/rex/dist/core/structural.d.ts +63 -0
  619. package/packages/rex/dist/core/structural.js +267 -0
  620. package/packages/rex/dist/core/structural.js.map +1 -0
  621. package/packages/rex/dist/core/sync-engine.d.ts +63 -0
  622. package/packages/rex/dist/core/sync-engine.js +429 -0
  623. package/packages/rex/dist/core/sync-engine.js.map +1 -0
  624. package/packages/rex/dist/core/sync.d.ts +82 -0
  625. package/packages/rex/dist/core/sync.js +204 -0
  626. package/packages/rex/dist/core/sync.js.map +1 -0
  627. package/packages/rex/dist/core/timestamps.d.ts +34 -0
  628. package/packages/rex/dist/core/timestamps.js +50 -0
  629. package/packages/rex/dist/core/timestamps.js.map +1 -0
  630. package/packages/rex/dist/core/token-usage.d.ts +196 -0
  631. package/packages/rex/dist/core/token-usage.js +468 -0
  632. package/packages/rex/dist/core/token-usage.js.map +1 -0
  633. package/packages/rex/dist/core/transitions.d.ts +28 -0
  634. package/packages/rex/dist/core/transitions.js +74 -0
  635. package/packages/rex/dist/core/transitions.js.map +1 -0
  636. package/packages/rex/dist/core/tree.d.ts +12 -0
  637. package/packages/rex/dist/core/tree.js +76 -0
  638. package/packages/rex/dist/core/tree.js.map +1 -0
  639. package/packages/rex/dist/core/verify.d.ts +92 -0
  640. package/packages/rex/dist/core/verify.js +201 -0
  641. package/packages/rex/dist/core/verify.js.map +1 -0
  642. package/packages/rex/dist/public.d.ts +115 -0
  643. package/packages/rex/dist/public.js +114 -0
  644. package/packages/rex/dist/public.js.map +1 -0
  645. package/packages/rex/dist/recommend/conflict-detection.d.ts +102 -0
  646. package/packages/rex/dist/recommend/conflict-detection.js +238 -0
  647. package/packages/rex/dist/recommend/conflict-detection.js.map +1 -0
  648. package/packages/rex/dist/recommend/create-from-recommendations.d.ts +109 -0
  649. package/packages/rex/dist/recommend/create-from-recommendations.js +287 -0
  650. package/packages/rex/dist/recommend/create-from-recommendations.js.map +1 -0
  651. package/packages/rex/dist/recommend/types.d.ts +59 -0
  652. package/packages/rex/dist/recommend/types.js +11 -0
  653. package/packages/rex/dist/recommend/types.js.map +1 -0
  654. package/packages/rex/dist/schema/index.d.ts +23 -0
  655. package/packages/rex/dist/schema/index.js +22 -0
  656. package/packages/rex/dist/schema/index.js.map +1 -0
  657. package/packages/rex/dist/schema/levels.d.ts +82 -0
  658. package/packages/rex/dist/schema/levels.js +152 -0
  659. package/packages/rex/dist/schema/levels.js.map +1 -0
  660. package/packages/rex/dist/schema/v1.d.ts +341 -0
  661. package/packages/rex/dist/schema/v1.js +179 -0
  662. package/packages/rex/dist/schema/v1.js.map +1 -0
  663. package/packages/rex/dist/schema/validate.d.ts +194 -0
  664. package/packages/rex/dist/schema/validate.js +136 -0
  665. package/packages/rex/dist/schema/validate.js.map +1 -0
  666. package/packages/rex/dist/store/adapter-registry.d.ts +143 -0
  667. package/packages/rex/dist/store/adapter-registry.js +304 -0
  668. package/packages/rex/dist/store/adapter-registry.js.map +1 -0
  669. package/packages/rex/dist/store/atomic-write.d.ts +22 -0
  670. package/packages/rex/dist/store/atomic-write.js +30 -0
  671. package/packages/rex/dist/store/atomic-write.js.map +1 -0
  672. package/packages/rex/dist/store/contracts.d.ts +142 -0
  673. package/packages/rex/dist/store/contracts.js +19 -0
  674. package/packages/rex/dist/store/contracts.js.map +1 -0
  675. package/packages/rex/dist/store/file-adapter.d.ts +23 -0
  676. package/packages/rex/dist/store/file-adapter.js +150 -0
  677. package/packages/rex/dist/store/file-adapter.js.map +1 -0
  678. package/packages/rex/dist/store/index.d.ts +67 -0
  679. package/packages/rex/dist/store/index.js +78 -0
  680. package/packages/rex/dist/store/index.js.map +1 -0
  681. package/packages/rex/dist/store/integration-schema.d.ts +205 -0
  682. package/packages/rex/dist/store/integration-schema.js +136 -0
  683. package/packages/rex/dist/store/integration-schema.js.map +1 -0
  684. package/packages/rex/dist/store/integration-schemas/index.d.ts +28 -0
  685. package/packages/rex/dist/store/integration-schemas/index.js +45 -0
  686. package/packages/rex/dist/store/integration-schemas/index.js.map +1 -0
  687. package/packages/rex/dist/store/integration-schemas/jira.d.ts +11 -0
  688. package/packages/rex/dist/store/integration-schemas/jira.js +147 -0
  689. package/packages/rex/dist/store/integration-schemas/jira.js.map +1 -0
  690. package/packages/rex/dist/store/integration-schemas/notion.d.ts +11 -0
  691. package/packages/rex/dist/store/integration-schemas/notion.js +80 -0
  692. package/packages/rex/dist/store/integration-schemas/notion.js.map +1 -0
  693. package/packages/rex/dist/store/notion-adapter.d.ts +42 -0
  694. package/packages/rex/dist/store/notion-adapter.js +247 -0
  695. package/packages/rex/dist/store/notion-adapter.js.map +1 -0
  696. package/packages/rex/dist/store/notion-client.d.ts +56 -0
  697. package/packages/rex/dist/store/notion-client.js +82 -0
  698. package/packages/rex/dist/store/notion-client.js.map +1 -0
  699. package/packages/rex/dist/store/notion-map.d.ts +207 -0
  700. package/packages/rex/dist/store/notion-map.js +535 -0
  701. package/packages/rex/dist/store/notion-map.js.map +1 -0
  702. package/packages/rex/dist/store/project-config.d.ts +44 -0
  703. package/packages/rex/dist/store/project-config.js +56 -0
  704. package/packages/rex/dist/store/project-config.js.map +1 -0
  705. package/packages/rex/dist/store/types.d.ts +142 -0
  706. package/packages/rex/dist/store/types.js +19 -0
  707. package/packages/rex/dist/store/types.js.map +1 -0
  708. package/packages/rex/dist/workflow/default.d.ts +1 -0
  709. package/packages/rex/dist/workflow/default.js +21 -0
  710. package/packages/rex/dist/workflow/default.js.map +1 -0
  711. package/packages/rex/package.json +40 -0
  712. package/packages/sourcevision/dist/analyzers/__tests__/components.test.d.ts +1 -0
  713. package/packages/sourcevision/dist/analyzers/__tests__/components.test.js +370 -0
  714. package/packages/sourcevision/dist/analyzers/__tests__/components.test.js.map +1 -0
  715. package/packages/sourcevision/dist/analyzers/__tests__/imports.test.d.ts +1 -0
  716. package/packages/sourcevision/dist/analyzers/__tests__/imports.test.js +101 -0
  717. package/packages/sourcevision/dist/analyzers/__tests__/imports.test.js.map +1 -0
  718. package/packages/sourcevision/dist/analyzers/__tests__/inventory.test.d.ts +1 -0
  719. package/packages/sourcevision/dist/analyzers/__tests__/inventory.test.js +118 -0
  720. package/packages/sourcevision/dist/analyzers/__tests__/inventory.test.js.map +1 -0
  721. package/packages/sourcevision/dist/analyzers/__tests__/manifest.test.d.ts +1 -0
  722. package/packages/sourcevision/dist/analyzers/__tests__/manifest.test.js +61 -0
  723. package/packages/sourcevision/dist/analyzers/__tests__/manifest.test.js.map +1 -0
  724. package/packages/sourcevision/dist/analyzers/__tests__/zones.test.d.ts +1 -0
  725. package/packages/sourcevision/dist/analyzers/__tests__/zones.test.js +836 -0
  726. package/packages/sourcevision/dist/analyzers/__tests__/zones.test.js.map +1 -0
  727. package/packages/sourcevision/dist/analyzers/archetypes.d.ts +18 -0
  728. package/packages/sourcevision/dist/analyzers/archetypes.js +272 -0
  729. package/packages/sourcevision/dist/analyzers/archetypes.js.map +1 -0
  730. package/packages/sourcevision/dist/analyzers/branch-work-classifier.d.ts +67 -0
  731. package/packages/sourcevision/dist/analyzers/branch-work-classifier.js +202 -0
  732. package/packages/sourcevision/dist/analyzers/branch-work-classifier.js.map +1 -0
  733. package/packages/sourcevision/dist/analyzers/branch-work-collector.d.ts +121 -0
  734. package/packages/sourcevision/dist/analyzers/branch-work-collector.js +301 -0
  735. package/packages/sourcevision/dist/analyzers/branch-work-collector.js.map +1 -0
  736. package/packages/sourcevision/dist/analyzers/branch-work-filter.d.ts +112 -0
  737. package/packages/sourcevision/dist/analyzers/branch-work-filter.js +285 -0
  738. package/packages/sourcevision/dist/analyzers/branch-work-filter.js.map +1 -0
  739. package/packages/sourcevision/dist/analyzers/branch-work-store.d.ts +65 -0
  740. package/packages/sourcevision/dist/analyzers/branch-work-store.js +127 -0
  741. package/packages/sourcevision/dist/analyzers/branch-work-store.js.map +1 -0
  742. package/packages/sourcevision/dist/analyzers/callgraph-findings.d.ts +26 -0
  743. package/packages/sourcevision/dist/analyzers/callgraph-findings.js +581 -0
  744. package/packages/sourcevision/dist/analyzers/callgraph-findings.js.map +1 -0
  745. package/packages/sourcevision/dist/analyzers/callgraph.d.ts +64 -0
  746. package/packages/sourcevision/dist/analyzers/callgraph.js +659 -0
  747. package/packages/sourcevision/dist/analyzers/callgraph.js.map +1 -0
  748. package/packages/sourcevision/dist/analyzers/classify.d.ts +45 -0
  749. package/packages/sourcevision/dist/analyzers/classify.js +431 -0
  750. package/packages/sourcevision/dist/analyzers/classify.js.map +1 -0
  751. package/packages/sourcevision/dist/analyzers/claude-cli.d.ts +29 -0
  752. package/packages/sourcevision/dist/analyzers/claude-cli.js +137 -0
  753. package/packages/sourcevision/dist/analyzers/claude-cli.js.map +1 -0
  754. package/packages/sourcevision/dist/analyzers/claude-client.d.ts +47 -0
  755. package/packages/sourcevision/dist/analyzers/claude-client.js +112 -0
  756. package/packages/sourcevision/dist/analyzers/claude-client.js.map +1 -0
  757. package/packages/sourcevision/dist/analyzers/completion-reader.d.ts +218 -0
  758. package/packages/sourcevision/dist/analyzers/completion-reader.js +355 -0
  759. package/packages/sourcevision/dist/analyzers/completion-reader.js.map +1 -0
  760. package/packages/sourcevision/dist/analyzers/components.d.ts +18 -0
  761. package/packages/sourcevision/dist/analyzers/components.js +598 -0
  762. package/packages/sourcevision/dist/analyzers/components.js.map +1 -0
  763. package/packages/sourcevision/dist/analyzers/context.d.ts +6 -0
  764. package/packages/sourcevision/dist/analyzers/context.js +175 -0
  765. package/packages/sourcevision/dist/analyzers/context.js.map +1 -0
  766. package/packages/sourcevision/dist/analyzers/convergence.d.ts +74 -0
  767. package/packages/sourcevision/dist/analyzers/convergence.js +144 -0
  768. package/packages/sourcevision/dist/analyzers/convergence.js.map +1 -0
  769. package/packages/sourcevision/dist/analyzers/enrich-batch.d.ts +47 -0
  770. package/packages/sourcevision/dist/analyzers/enrich-batch.js +340 -0
  771. package/packages/sourcevision/dist/analyzers/enrich-batch.js.map +1 -0
  772. package/packages/sourcevision/dist/analyzers/enrich-config.d.ts +41 -0
  773. package/packages/sourcevision/dist/analyzers/enrich-config.js +215 -0
  774. package/packages/sourcevision/dist/analyzers/enrich-config.js.map +1 -0
  775. package/packages/sourcevision/dist/analyzers/enrich-parsing.d.ts +58 -0
  776. package/packages/sourcevision/dist/analyzers/enrich-parsing.js +401 -0
  777. package/packages/sourcevision/dist/analyzers/enrich-parsing.js.map +1 -0
  778. package/packages/sourcevision/dist/analyzers/enrich-per-zone.d.ts +27 -0
  779. package/packages/sourcevision/dist/analyzers/enrich-per-zone.js +287 -0
  780. package/packages/sourcevision/dist/analyzers/enrich-per-zone.js.map +1 -0
  781. package/packages/sourcevision/dist/analyzers/enrich.d.ts +25 -0
  782. package/packages/sourcevision/dist/analyzers/enrich.js +255 -0
  783. package/packages/sourcevision/dist/analyzers/enrich.js.map +1 -0
  784. package/packages/sourcevision/dist/analyzers/imports.d.ts +18 -0
  785. package/packages/sourcevision/dist/analyzers/imports.js +448 -0
  786. package/packages/sourcevision/dist/analyzers/imports.js.map +1 -0
  787. package/packages/sourcevision/dist/analyzers/index.d.ts +12 -0
  788. package/packages/sourcevision/dist/analyzers/index.js +10 -0
  789. package/packages/sourcevision/dist/analyzers/index.js.map +1 -0
  790. package/packages/sourcevision/dist/analyzers/inventory.d.ts +33 -0
  791. package/packages/sourcevision/dist/analyzers/inventory.js +594 -0
  792. package/packages/sourcevision/dist/analyzers/inventory.js.map +1 -0
  793. package/packages/sourcevision/dist/analyzers/llms-txt.d.ts +6 -0
  794. package/packages/sourcevision/dist/analyzers/llms-txt.js +268 -0
  795. package/packages/sourcevision/dist/analyzers/llms-txt.js.map +1 -0
  796. package/packages/sourcevision/dist/analyzers/louvain.d.ts +123 -0
  797. package/packages/sourcevision/dist/analyzers/louvain.js +669 -0
  798. package/packages/sourcevision/dist/analyzers/louvain.js.map +1 -0
  799. package/packages/sourcevision/dist/analyzers/manifest.d.ts +8 -0
  800. package/packages/sourcevision/dist/analyzers/manifest.js +72 -0
  801. package/packages/sourcevision/dist/analyzers/manifest.js.map +1 -0
  802. package/packages/sourcevision/dist/analyzers/move-recommendations.d.ts +41 -0
  803. package/packages/sourcevision/dist/analyzers/move-recommendations.js +193 -0
  804. package/packages/sourcevision/dist/analyzers/move-recommendations.js.map +1 -0
  805. package/packages/sourcevision/dist/analyzers/next-steps.d.ts +10 -0
  806. package/packages/sourcevision/dist/analyzers/next-steps.js +228 -0
  807. package/packages/sourcevision/dist/analyzers/next-steps.js.map +1 -0
  808. package/packages/sourcevision/dist/analyzers/risk-scoring.d.ts +120 -0
  809. package/packages/sourcevision/dist/analyzers/risk-scoring.js +266 -0
  810. package/packages/sourcevision/dist/analyzers/risk-scoring.js.map +1 -0
  811. package/packages/sourcevision/dist/analyzers/route-detection.d.ts +29 -0
  812. package/packages/sourcevision/dist/analyzers/route-detection.js +316 -0
  813. package/packages/sourcevision/dist/analyzers/route-detection.js.map +1 -0
  814. package/packages/sourcevision/dist/analyzers/server-route-detection.d.ts +35 -0
  815. package/packages/sourcevision/dist/analyzers/server-route-detection.js +210 -0
  816. package/packages/sourcevision/dist/analyzers/server-route-detection.js.map +1 -0
  817. package/packages/sourcevision/dist/analyzers/token-usage.d.ts +11 -0
  818. package/packages/sourcevision/dist/analyzers/token-usage.js +41 -0
  819. package/packages/sourcevision/dist/analyzers/token-usage.js.map +1 -0
  820. package/packages/sourcevision/dist/analyzers/workspace-aggregate.d.ts +80 -0
  821. package/packages/sourcevision/dist/analyzers/workspace-aggregate.js +386 -0
  822. package/packages/sourcevision/dist/analyzers/workspace-aggregate.js.map +1 -0
  823. package/packages/sourcevision/dist/analyzers/workspace-crossings.d.ts +63 -0
  824. package/packages/sourcevision/dist/analyzers/workspace-crossings.js +239 -0
  825. package/packages/sourcevision/dist/analyzers/workspace-crossings.js.map +1 -0
  826. package/packages/sourcevision/dist/analyzers/workspace.d.ts +65 -0
  827. package/packages/sourcevision/dist/analyzers/workspace.js +243 -0
  828. package/packages/sourcevision/dist/analyzers/workspace.js.map +1 -0
  829. package/packages/sourcevision/dist/analyzers/zone-hash.d.ts +15 -0
  830. package/packages/sourcevision/dist/analyzers/zone-hash.js +23 -0
  831. package/packages/sourcevision/dist/analyzers/zone-hash.js.map +1 -0
  832. package/packages/sourcevision/dist/analyzers/zone-output.d.ts +20 -0
  833. package/packages/sourcevision/dist/analyzers/zone-output.js +252 -0
  834. package/packages/sourcevision/dist/analyzers/zone-output.js.map +1 -0
  835. package/packages/sourcevision/dist/analyzers/zones.d.ts +224 -0
  836. package/packages/sourcevision/dist/analyzers/zones.js +1538 -0
  837. package/packages/sourcevision/dist/analyzers/zones.js.map +1 -0
  838. package/packages/sourcevision/dist/cli/commands/analyze-phases.d.ts +48 -0
  839. package/packages/sourcevision/dist/cli/commands/analyze-phases.js +496 -0
  840. package/packages/sourcevision/dist/cli/commands/analyze-phases.js.map +1 -0
  841. package/packages/sourcevision/dist/cli/commands/analyze.d.ts +13 -0
  842. package/packages/sourcevision/dist/cli/commands/analyze.js +332 -0
  843. package/packages/sourcevision/dist/cli/commands/analyze.js.map +1 -0
  844. package/packages/sourcevision/dist/cli/commands/constants.d.ts +2 -0
  845. package/packages/sourcevision/dist/cli/commands/constants.js +34 -0
  846. package/packages/sourcevision/dist/cli/commands/constants.js.map +1 -0
  847. package/packages/sourcevision/dist/cli/commands/export-pdf.d.ts +19 -0
  848. package/packages/sourcevision/dist/cli/commands/export-pdf.js +73 -0
  849. package/packages/sourcevision/dist/cli/commands/export-pdf.js.map +1 -0
  850. package/packages/sourcevision/dist/cli/commands/git-credential-helper.d.ts +2 -0
  851. package/packages/sourcevision/dist/cli/commands/git-credential-helper.js +59 -0
  852. package/packages/sourcevision/dist/cli/commands/git-credential-helper.js.map +1 -0
  853. package/packages/sourcevision/dist/cli/commands/init.d.ts +2 -0
  854. package/packages/sourcevision/dist/cli/commands/init.js +55 -0
  855. package/packages/sourcevision/dist/cli/commands/init.js.map +1 -0
  856. package/packages/sourcevision/dist/cli/commands/pr-markdown.d.ts +72 -0
  857. package/packages/sourcevision/dist/cli/commands/pr-markdown.js +121 -0
  858. package/packages/sourcevision/dist/cli/commands/pr-markdown.js.map +1 -0
  859. package/packages/sourcevision/dist/cli/commands/prd-epic-resolver.d.ts +45 -0
  860. package/packages/sourcevision/dist/cli/commands/prd-epic-resolver.js +220 -0
  861. package/packages/sourcevision/dist/cli/commands/prd-epic-resolver.js.map +1 -0
  862. package/packages/sourcevision/dist/cli/commands/reset.d.ts +1 -0
  863. package/packages/sourcevision/dist/cli/commands/reset.js +54 -0
  864. package/packages/sourcevision/dist/cli/commands/reset.js.map +1 -0
  865. package/packages/sourcevision/dist/cli/commands/validate.d.ts +1 -0
  866. package/packages/sourcevision/dist/cli/commands/validate.js +53 -0
  867. package/packages/sourcevision/dist/cli/commands/validate.js.map +1 -0
  868. package/packages/sourcevision/dist/cli/commands/workspace.d.ts +19 -0
  869. package/packages/sourcevision/dist/cli/commands/workspace.js +139 -0
  870. package/packages/sourcevision/dist/cli/commands/workspace.js.map +1 -0
  871. package/packages/sourcevision/dist/cli/errors.d.ts +31 -0
  872. package/packages/sourcevision/dist/cli/errors.js +100 -0
  873. package/packages/sourcevision/dist/cli/errors.js.map +1 -0
  874. package/packages/sourcevision/dist/cli/help.d.ts +23 -0
  875. package/packages/sourcevision/dist/cli/help.js +241 -0
  876. package/packages/sourcevision/dist/cli/help.js.map +1 -0
  877. package/packages/sourcevision/dist/cli/index.d.ts +15 -0
  878. package/packages/sourcevision/dist/cli/index.js +127 -0
  879. package/packages/sourcevision/dist/cli/index.js.map +1 -0
  880. package/packages/sourcevision/dist/cli/mcp.d.ts +13 -0
  881. package/packages/sourcevision/dist/cli/mcp.js +433 -0
  882. package/packages/sourcevision/dist/cli/mcp.js.map +1 -0
  883. package/packages/sourcevision/dist/cli/output.d.ts +19 -0
  884. package/packages/sourcevision/dist/cli/output.js +48 -0
  885. package/packages/sourcevision/dist/cli/output.js.map +1 -0
  886. package/packages/sourcevision/dist/cli/serve.d.ts +11 -0
  887. package/packages/sourcevision/dist/cli/serve.js +41 -0
  888. package/packages/sourcevision/dist/cli/serve.js.map +1 -0
  889. package/packages/sourcevision/dist/cli/server/index.d.ts +19 -0
  890. package/packages/sourcevision/dist/cli/server/index.js +17 -0
  891. package/packages/sourcevision/dist/cli/server/index.js.map +1 -0
  892. package/packages/sourcevision/dist/cli/server/routes-data.d.ts +14 -0
  893. package/packages/sourcevision/dist/cli/server/routes-data.js +122 -0
  894. package/packages/sourcevision/dist/cli/server/routes-data.js.map +1 -0
  895. package/packages/sourcevision/dist/cli/server/routes-hench.d.ts +12 -0
  896. package/packages/sourcevision/dist/cli/server/routes-hench.js +100 -0
  897. package/packages/sourcevision/dist/cli/server/routes-hench.js.map +1 -0
  898. package/packages/sourcevision/dist/cli/server/routes-rex.d.ts +23 -0
  899. package/packages/sourcevision/dist/cli/server/routes-rex.js +817 -0
  900. package/packages/sourcevision/dist/cli/server/routes-rex.js.map +1 -0
  901. package/packages/sourcevision/dist/cli/server/routes-sourcevision.d.ts +17 -0
  902. package/packages/sourcevision/dist/cli/server/routes-sourcevision.js +145 -0
  903. package/packages/sourcevision/dist/cli/server/routes-sourcevision.js.map +1 -0
  904. package/packages/sourcevision/dist/cli/server/routes-static.d.ts +17 -0
  905. package/packages/sourcevision/dist/cli/server/routes-static.js +88 -0
  906. package/packages/sourcevision/dist/cli/server/routes-static.js.map +1 -0
  907. package/packages/sourcevision/dist/cli/server/routes-token-usage.d.ts +18 -0
  908. package/packages/sourcevision/dist/cli/server/routes-token-usage.js +349 -0
  909. package/packages/sourcevision/dist/cli/server/routes-token-usage.js.map +1 -0
  910. package/packages/sourcevision/dist/cli/server/routes-validation.d.ts +10 -0
  911. package/packages/sourcevision/dist/cli/server/routes-validation.js +395 -0
  912. package/packages/sourcevision/dist/cli/server/routes-validation.js.map +1 -0
  913. package/packages/sourcevision/dist/cli/server/start.d.ts +7 -0
  914. package/packages/sourcevision/dist/cli/server/start.js +166 -0
  915. package/packages/sourcevision/dist/cli/server/start.js.map +1 -0
  916. package/packages/sourcevision/dist/cli/server/types.d.ts +23 -0
  917. package/packages/sourcevision/dist/cli/server/types.js +26 -0
  918. package/packages/sourcevision/dist/cli/server/types.js.map +1 -0
  919. package/packages/sourcevision/dist/cli/server/websocket.d.ts +31 -0
  920. package/packages/sourcevision/dist/cli/server/websocket.js +247 -0
  921. package/packages/sourcevision/dist/cli/server/websocket.js.map +1 -0
  922. package/packages/sourcevision/dist/constants.d.ts +4 -0
  923. package/packages/sourcevision/dist/constants.js +6 -0
  924. package/packages/sourcevision/dist/constants.js.map +1 -0
  925. package/packages/sourcevision/dist/export/pdf-report.d.ts +27 -0
  926. package/packages/sourcevision/dist/export/pdf-report.js +447 -0
  927. package/packages/sourcevision/dist/export/pdf-report.js.map +1 -0
  928. package/packages/sourcevision/dist/generators/pr-markdown-template.d.ts +56 -0
  929. package/packages/sourcevision/dist/generators/pr-markdown-template.js +264 -0
  930. package/packages/sourcevision/dist/generators/pr-markdown-template.js.map +1 -0
  931. package/packages/sourcevision/dist/public.d.ts +41 -0
  932. package/packages/sourcevision/dist/public.js +43 -0
  933. package/packages/sourcevision/dist/public.js.map +1 -0
  934. package/packages/sourcevision/dist/schema/data-files.d.ts +11 -0
  935. package/packages/sourcevision/dist/schema/data-files.js +12 -0
  936. package/packages/sourcevision/dist/schema/data-files.js.map +1 -0
  937. package/packages/sourcevision/dist/schema/index.d.ts +3 -0
  938. package/packages/sourcevision/dist/schema/index.js +3 -0
  939. package/packages/sourcevision/dist/schema/index.js.map +1 -0
  940. package/packages/sourcevision/dist/schema/v1.d.ts +550 -0
  941. package/packages/sourcevision/dist/schema/v1.js +3 -0
  942. package/packages/sourcevision/dist/schema/v1.js.map +1 -0
  943. package/packages/sourcevision/dist/schema/validate.d.ts +1243 -0
  944. package/packages/sourcevision/dist/schema/validate.js +411 -0
  945. package/packages/sourcevision/dist/schema/validate.js.map +1 -0
  946. package/packages/sourcevision/dist/util/__tests__/merge.test.d.ts +1 -0
  947. package/packages/sourcevision/dist/util/__tests__/merge.test.js +122 -0
  948. package/packages/sourcevision/dist/util/__tests__/merge.test.js.map +1 -0
  949. package/packages/sourcevision/dist/util/__tests__/sort.test.d.ts +1 -0
  950. package/packages/sourcevision/dist/util/__tests__/sort.test.js +151 -0
  951. package/packages/sourcevision/dist/util/__tests__/sort.test.js.map +1 -0
  952. package/packages/sourcevision/dist/util/merge.d.ts +18 -0
  953. package/packages/sourcevision/dist/util/merge.js +152 -0
  954. package/packages/sourcevision/dist/util/merge.js.map +1 -0
  955. package/packages/sourcevision/dist/util/paths.d.ts +2 -0
  956. package/packages/sourcevision/dist/util/paths.js +5 -0
  957. package/packages/sourcevision/dist/util/paths.js.map +1 -0
  958. package/packages/sourcevision/dist/util/project-config.d.ts +29 -0
  959. package/packages/sourcevision/dist/util/project-config.js +49 -0
  960. package/packages/sourcevision/dist/util/project-config.js.map +1 -0
  961. package/packages/sourcevision/dist/util/sort.d.ts +31 -0
  962. package/packages/sourcevision/dist/util/sort.js +149 -0
  963. package/packages/sourcevision/dist/util/sort.js.map +1 -0
  964. package/packages/sourcevision/dist/viewer/Hench-F.png +0 -0
  965. package/packages/sourcevision/dist/viewer/Rex-F.png +0 -0
  966. package/packages/sourcevision/dist/viewer/SourceVision-F.png +0 -0
  967. package/packages/sourcevision/dist/viewer/SourceVision.png +0 -0
  968. package/packages/sourcevision/dist/viewer/components/collapsible-section.d.ts +12 -0
  969. package/packages/sourcevision/dist/viewer/components/collapsible-section.js +40 -0
  970. package/packages/sourcevision/dist/viewer/components/collapsible-section.js.map +1 -0
  971. package/packages/sourcevision/dist/viewer/components/constants.d.ts +6 -0
  972. package/packages/sourcevision/dist/viewer/components/constants.js +16 -0
  973. package/packages/sourcevision/dist/viewer/components/constants.js.map +1 -0
  974. package/packages/sourcevision/dist/viewer/components/data-display/collapsible-section.d.ts +12 -0
  975. package/packages/sourcevision/dist/viewer/components/data-display/collapsible-section.js +40 -0
  976. package/packages/sourcevision/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
  977. package/packages/sourcevision/dist/viewer/components/data-display/findings-list.d.ts +13 -0
  978. package/packages/sourcevision/dist/viewer/components/data-display/findings-list.js +136 -0
  979. package/packages/sourcevision/dist/viewer/components/data-display/findings-list.js.map +1 -0
  980. package/packages/sourcevision/dist/viewer/components/data-display/health-gauge.d.ts +47 -0
  981. package/packages/sourcevision/dist/viewer/components/data-display/health-gauge.js +70 -0
  982. package/packages/sourcevision/dist/viewer/components/data-display/health-gauge.js.map +1 -0
  983. package/packages/sourcevision/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
  984. package/packages/sourcevision/dist/viewer/components/data-display/mini-charts.js +124 -0
  985. package/packages/sourcevision/dist/viewer/components/data-display/mini-charts.js.map +1 -0
  986. package/packages/sourcevision/dist/viewer/components/data-display/tree-view.d.ts +18 -0
  987. package/packages/sourcevision/dist/viewer/components/data-display/tree-view.js +107 -0
  988. package/packages/sourcevision/dist/viewer/components/data-display/tree-view.js.map +1 -0
  989. package/packages/sourcevision/dist/viewer/components/data-display/zone-map.d.ts +28 -0
  990. package/packages/sourcevision/dist/viewer/components/data-display/zone-map.js +195 -0
  991. package/packages/sourcevision/dist/viewer/components/data-display/zone-map.js.map +1 -0
  992. package/packages/sourcevision/dist/viewer/components/detail-panel.d.ts +12 -0
  993. package/packages/sourcevision/dist/viewer/components/detail-panel.js +166 -0
  994. package/packages/sourcevision/dist/viewer/components/detail-panel.js.map +1 -0
  995. package/packages/sourcevision/dist/viewer/components/faq.d.ts +1 -0
  996. package/packages/sourcevision/dist/viewer/components/faq.js +162 -0
  997. package/packages/sourcevision/dist/viewer/components/faq.js.map +1 -0
  998. package/packages/sourcevision/dist/viewer/components/findings-list.d.ts +13 -0
  999. package/packages/sourcevision/dist/viewer/components/findings-list.js +136 -0
  1000. package/packages/sourcevision/dist/viewer/components/findings-list.js.map +1 -0
  1001. package/packages/sourcevision/dist/viewer/components/guide.d.ts +5 -0
  1002. package/packages/sourcevision/dist/viewer/components/guide.js +77 -0
  1003. package/packages/sourcevision/dist/viewer/components/guide.js.map +1 -0
  1004. package/packages/sourcevision/dist/viewer/components/health-gauge.d.ts +47 -0
  1005. package/packages/sourcevision/dist/viewer/components/health-gauge.js +70 -0
  1006. package/packages/sourcevision/dist/viewer/components/health-gauge.js.map +1 -0
  1007. package/packages/sourcevision/dist/viewer/components/logos.d.ts +103 -0
  1008. package/packages/sourcevision/dist/viewer/components/logos.js +148 -0
  1009. package/packages/sourcevision/dist/viewer/components/logos.js.map +1 -0
  1010. package/packages/sourcevision/dist/viewer/components/mini-charts.d.ts +36 -0
  1011. package/packages/sourcevision/dist/viewer/components/mini-charts.js +124 -0
  1012. package/packages/sourcevision/dist/viewer/components/mini-charts.js.map +1 -0
  1013. package/packages/sourcevision/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
  1014. package/packages/sourcevision/dist/viewer/components/prd-tree/add-item-form.js +209 -0
  1015. package/packages/sourcevision/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
  1016. package/packages/sourcevision/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
  1017. package/packages/sourcevision/dist/viewer/components/prd-tree/analyze-panel.js +225 -0
  1018. package/packages/sourcevision/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
  1019. package/packages/sourcevision/dist/viewer/components/prd-tree/bulk-actions.d.ts +17 -0
  1020. package/packages/sourcevision/dist/viewer/components/prd-tree/bulk-actions.js +80 -0
  1021. package/packages/sourcevision/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
  1022. package/packages/sourcevision/dist/viewer/components/prd-tree/compute.d.ts +28 -0
  1023. package/packages/sourcevision/dist/viewer/components/prd-tree/compute.js +116 -0
  1024. package/packages/sourcevision/dist/viewer/components/prd-tree/compute.js.map +1 -0
  1025. package/packages/sourcevision/dist/viewer/components/prd-tree/index.d.ts +14 -0
  1026. package/packages/sourcevision/dist/viewer/components/prd-tree/index.js +8 -0
  1027. package/packages/sourcevision/dist/viewer/components/prd-tree/index.js.map +1 -0
  1028. package/packages/sourcevision/dist/viewer/components/prd-tree/prd-tree.d.ts +21 -0
  1029. package/packages/sourcevision/dist/viewer/components/prd-tree/prd-tree.js +293 -0
  1030. package/packages/sourcevision/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
  1031. package/packages/sourcevision/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
  1032. package/packages/sourcevision/dist/viewer/components/prd-tree/status-filter.js +129 -0
  1033. package/packages/sourcevision/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
  1034. package/packages/sourcevision/dist/viewer/components/prd-tree/task-detail.d.ts +18 -0
  1035. package/packages/sourcevision/dist/viewer/components/prd-tree/task-detail.js +221 -0
  1036. package/packages/sourcevision/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
  1037. package/packages/sourcevision/dist/viewer/components/prd-tree/types.d.ts +45 -0
  1038. package/packages/sourcevision/dist/viewer/components/prd-tree/types.js +15 -0
  1039. package/packages/sourcevision/dist/viewer/components/prd-tree/types.js.map +1 -0
  1040. package/packages/sourcevision/dist/viewer/components/rex-task-link.d.ts +48 -0
  1041. package/packages/sourcevision/dist/viewer/components/rex-task-link.js +191 -0
  1042. package/packages/sourcevision/dist/viewer/components/rex-task-link.js.map +1 -0
  1043. package/packages/sourcevision/dist/viewer/components/search-filter.d.ts +20 -0
  1044. package/packages/sourcevision/dist/viewer/components/search-filter.js +28 -0
  1045. package/packages/sourcevision/dist/viewer/components/search-filter.js.map +1 -0
  1046. package/packages/sourcevision/dist/viewer/components/sidebar.d.ts +16 -0
  1047. package/packages/sourcevision/dist/viewer/components/sidebar.js +296 -0
  1048. package/packages/sourcevision/dist/viewer/components/sidebar.js.map +1 -0
  1049. package/packages/sourcevision/dist/viewer/components/theme-toggle.d.ts +14 -0
  1050. package/packages/sourcevision/dist/viewer/components/theme-toggle.js +37 -0
  1051. package/packages/sourcevision/dist/viewer/components/theme-toggle.js.map +1 -0
  1052. package/packages/sourcevision/dist/viewer/components/tree-view.d.ts +18 -0
  1053. package/packages/sourcevision/dist/viewer/components/tree-view.js +107 -0
  1054. package/packages/sourcevision/dist/viewer/components/tree-view.js.map +1 -0
  1055. package/packages/sourcevision/dist/viewer/components/zone-map.d.ts +28 -0
  1056. package/packages/sourcevision/dist/viewer/components/zone-map.js +195 -0
  1057. package/packages/sourcevision/dist/viewer/components/zone-map.js.map +1 -0
  1058. package/packages/sourcevision/dist/viewer/graph/physics.d.ts +70 -0
  1059. package/packages/sourcevision/dist/viewer/graph/physics.js +260 -0
  1060. package/packages/sourcevision/dist/viewer/graph/physics.js.map +1 -0
  1061. package/packages/sourcevision/dist/viewer/graph/renderer.d.ts +69 -0
  1062. package/packages/sourcevision/dist/viewer/graph/renderer.js +423 -0
  1063. package/packages/sourcevision/dist/viewer/graph/renderer.js.map +1 -0
  1064. package/packages/sourcevision/dist/viewer/index.html +27 -0
  1065. package/packages/sourcevision/dist/viewer/loader.d.ts +20 -0
  1066. package/packages/sourcevision/dist/viewer/loader.js +142 -0
  1067. package/packages/sourcevision/dist/viewer/loader.js.map +1 -0
  1068. package/packages/sourcevision/dist/viewer/main.d.ts +1 -0
  1069. package/packages/sourcevision/dist/viewer/main.js +234 -0
  1070. package/packages/sourcevision/dist/viewer/main.js.map +1 -0
  1071. package/packages/sourcevision/dist/viewer/n-dx.png +0 -0
  1072. package/packages/sourcevision/dist/viewer/schema-compat.d.ts +17 -0
  1073. package/packages/sourcevision/dist/viewer/schema-compat.js +47 -0
  1074. package/packages/sourcevision/dist/viewer/schema-compat.js.map +1 -0
  1075. package/packages/sourcevision/dist/viewer/styles.css +2052 -0
  1076. package/packages/sourcevision/dist/viewer/types.d.ts +63 -0
  1077. package/packages/sourcevision/dist/viewer/types.js +2 -0
  1078. package/packages/sourcevision/dist/viewer/types.js.map +1 -0
  1079. package/packages/sourcevision/dist/viewer/utils.d.ts +23 -0
  1080. package/packages/sourcevision/dist/viewer/utils.js +49 -0
  1081. package/packages/sourcevision/dist/viewer/utils.js.map +1 -0
  1082. package/packages/sourcevision/dist/viewer/views/analysis.d.ts +10 -0
  1083. package/packages/sourcevision/dist/viewer/views/analysis.js +87 -0
  1084. package/packages/sourcevision/dist/viewer/views/analysis.js.map +1 -0
  1085. package/packages/sourcevision/dist/viewer/views/architecture.d.ts +10 -0
  1086. package/packages/sourcevision/dist/viewer/views/architecture.js +75 -0
  1087. package/packages/sourcevision/dist/viewer/views/architecture.js.map +1 -0
  1088. package/packages/sourcevision/dist/viewer/views/files.d.ts +13 -0
  1089. package/packages/sourcevision/dist/viewer/views/files.js +162 -0
  1090. package/packages/sourcevision/dist/viewer/views/files.js.map +1 -0
  1091. package/packages/sourcevision/dist/viewer/views/graph.d.ts +11 -0
  1092. package/packages/sourcevision/dist/viewer/views/graph.js +130 -0
  1093. package/packages/sourcevision/dist/viewer/views/graph.js.map +1 -0
  1094. package/packages/sourcevision/dist/viewer/views/hench-runs.d.ts +17 -0
  1095. package/packages/sourcevision/dist/viewer/views/hench-runs.js +336 -0
  1096. package/packages/sourcevision/dist/viewer/views/hench-runs.js.map +1 -0
  1097. package/packages/sourcevision/dist/viewer/views/overview.d.ts +10 -0
  1098. package/packages/sourcevision/dist/viewer/views/overview.js +230 -0
  1099. package/packages/sourcevision/dist/viewer/views/overview.js.map +1 -0
  1100. package/packages/sourcevision/dist/viewer/views/prd.d.ts +21 -0
  1101. package/packages/sourcevision/dist/viewer/views/prd.js +201 -0
  1102. package/packages/sourcevision/dist/viewer/views/prd.js.map +1 -0
  1103. package/packages/sourcevision/dist/viewer/views/problems.d.ts +8 -0
  1104. package/packages/sourcevision/dist/viewer/views/problems.js +51 -0
  1105. package/packages/sourcevision/dist/viewer/views/problems.js.map +1 -0
  1106. package/packages/sourcevision/dist/viewer/views/rex-dashboard.d.ts +14 -0
  1107. package/packages/sourcevision/dist/viewer/views/rex-dashboard.js +229 -0
  1108. package/packages/sourcevision/dist/viewer/views/rex-dashboard.js.map +1 -0
  1109. package/packages/sourcevision/dist/viewer/views/routes.d.ts +8 -0
  1110. package/packages/sourcevision/dist/viewer/views/routes.js +218 -0
  1111. package/packages/sourcevision/dist/viewer/views/routes.js.map +1 -0
  1112. package/packages/sourcevision/dist/viewer/views/suggestions.d.ts +8 -0
  1113. package/packages/sourcevision/dist/viewer/views/suggestions.js +36 -0
  1114. package/packages/sourcevision/dist/viewer/views/suggestions.js.map +1 -0
  1115. package/packages/sourcevision/dist/viewer/views/token-usage.d.ts +10 -0
  1116. package/packages/sourcevision/dist/viewer/views/token-usage.js +384 -0
  1117. package/packages/sourcevision/dist/viewer/views/token-usage.js.map +1 -0
  1118. package/packages/sourcevision/dist/viewer/views/validation.d.ts +8 -0
  1119. package/packages/sourcevision/dist/viewer/views/validation.js +470 -0
  1120. package/packages/sourcevision/dist/viewer/views/validation.js.map +1 -0
  1121. package/packages/sourcevision/dist/viewer/views/zones.d.ts +11 -0
  1122. package/packages/sourcevision/dist/viewer/views/zones.js +146 -0
  1123. package/packages/sourcevision/dist/viewer/views/zones.js.map +1 -0
  1124. package/packages/sourcevision/package.json +43 -0
  1125. package/packages/web/build.js +243 -0
  1126. package/packages/web/dist/cli/index.d.ts +8 -0
  1127. package/packages/web/dist/cli/index.js +50 -0
  1128. package/packages/web/dist/cli/index.js.map +1 -0
  1129. package/packages/web/dist/landing/color-inversion.d.ts +7 -0
  1130. package/packages/web/dist/landing/color-inversion.js +24 -0
  1131. package/packages/web/dist/landing/color-inversion.js.map +1 -0
  1132. package/packages/web/dist/landing/index.html +325 -0
  1133. package/packages/web/dist/landing/landing.d.ts +38 -0
  1134. package/packages/web/dist/landing/landing.js +299 -0
  1135. package/packages/web/dist/landing/landing.js.map +1 -0
  1136. package/packages/web/dist/public.d.ts +55 -0
  1137. package/packages/web/dist/public.js +51 -0
  1138. package/packages/web/dist/public.js.map +1 -0
  1139. package/packages/web/dist/schema/data-files.d.ts +10 -0
  1140. package/packages/web/dist/schema/data-files.js +11 -0
  1141. package/packages/web/dist/schema/data-files.js.map +1 -0
  1142. package/packages/web/dist/schema/features.d.ts +28 -0
  1143. package/packages/web/dist/schema/features.js +9 -0
  1144. package/packages/web/dist/schema/features.js.map +1 -0
  1145. package/packages/web/dist/schema/v1.d.ts +317 -0
  1146. package/packages/web/dist/schema/v1.js +3 -0
  1147. package/packages/web/dist/schema/v1.js.map +1 -0
  1148. package/packages/web/dist/schema/validate.d.ts +15 -0
  1149. package/packages/web/dist/schema/validate.js +260 -0
  1150. package/packages/web/dist/schema/validate.js.map +1 -0
  1151. package/packages/web/dist/server/aggregation-cache.d.ts +105 -0
  1152. package/packages/web/dist/server/aggregation-cache.js +163 -0
  1153. package/packages/web/dist/server/aggregation-cache.js.map +1 -0
  1154. package/packages/web/dist/server/concurrent-execution-metrics.d.ts +103 -0
  1155. package/packages/web/dist/server/concurrent-execution-metrics.js +253 -0
  1156. package/packages/web/dist/server/concurrent-execution-metrics.js.map +1 -0
  1157. package/packages/web/dist/server/domain-gateway.d.ts +18 -0
  1158. package/packages/web/dist/server/domain-gateway.js +19 -0
  1159. package/packages/web/dist/server/domain-gateway.js.map +1 -0
  1160. package/packages/web/dist/server/incremental-task-usage.d.ts +92 -0
  1161. package/packages/web/dist/server/incremental-task-usage.js +251 -0
  1162. package/packages/web/dist/server/incremental-task-usage.js.map +1 -0
  1163. package/packages/web/dist/server/index.d.ts +39 -0
  1164. package/packages/web/dist/server/index.js +36 -0
  1165. package/packages/web/dist/server/index.js.map +1 -0
  1166. package/packages/web/dist/server/mcp-deps.d.ts +6 -0
  1167. package/packages/web/dist/server/mcp-deps.js +7 -0
  1168. package/packages/web/dist/server/mcp-deps.js.map +1 -0
  1169. package/packages/web/dist/server/port.d.ts +96 -0
  1170. package/packages/web/dist/server/port.js +134 -0
  1171. package/packages/web/dist/server/port.js.map +1 -0
  1172. package/packages/web/dist/server/pr-markdown-refresh-diagnostics.d.ts +59 -0
  1173. package/packages/web/dist/server/pr-markdown-refresh-diagnostics.js +429 -0
  1174. package/packages/web/dist/server/pr-markdown-refresh-diagnostics.js.map +1 -0
  1175. package/packages/web/dist/server/prd-io.d.ts +40 -0
  1176. package/packages/web/dist/server/prd-io.js +66 -0
  1177. package/packages/web/dist/server/prd-io.js.map +1 -0
  1178. package/packages/web/dist/server/process-memory-tracker.d.ts +79 -0
  1179. package/packages/web/dist/server/process-memory-tracker.js +194 -0
  1180. package/packages/web/dist/server/process-memory-tracker.js.map +1 -0
  1181. package/packages/web/dist/server/register-scheduler.d.ts +53 -0
  1182. package/packages/web/dist/server/register-scheduler.js +36 -0
  1183. package/packages/web/dist/server/register-scheduler.js.map +1 -0
  1184. package/packages/web/dist/server/rex-domain.d.ts +55 -0
  1185. package/packages/web/dist/server/rex-domain.js +84 -0
  1186. package/packages/web/dist/server/rex-domain.js.map +1 -0
  1187. package/packages/web/dist/server/rex-gateway.d.ts +39 -0
  1188. package/packages/web/dist/server/rex-gateway.js +47 -0
  1189. package/packages/web/dist/server/rex-gateway.js.map +1 -0
  1190. package/packages/web/dist/server/routes-adaptive.d.ts +21 -0
  1191. package/packages/web/dist/server/routes-adaptive.js +659 -0
  1192. package/packages/web/dist/server/routes-adaptive.js.map +1 -0
  1193. package/packages/web/dist/server/routes-config.d.ts +47 -0
  1194. package/packages/web/dist/server/routes-config.js +222 -0
  1195. package/packages/web/dist/server/routes-config.js.map +1 -0
  1196. package/packages/web/dist/server/routes-data.d.ts +14 -0
  1197. package/packages/web/dist/server/routes-data.js +129 -0
  1198. package/packages/web/dist/server/routes-data.js.map +1 -0
  1199. package/packages/web/dist/server/routes-features.d.ts +14 -0
  1200. package/packages/web/dist/server/routes-features.js +245 -0
  1201. package/packages/web/dist/server/routes-features.js.map +1 -0
  1202. package/packages/web/dist/server/routes-hench.d.ts +116 -0
  1203. package/packages/web/dist/server/routes-hench.js +2016 -0
  1204. package/packages/web/dist/server/routes-hench.js.map +1 -0
  1205. package/packages/web/dist/server/routes-integrations.d.ts +23 -0
  1206. package/packages/web/dist/server/routes-integrations.js +277 -0
  1207. package/packages/web/dist/server/routes-integrations.js.map +1 -0
  1208. package/packages/web/dist/server/routes-mcp.d.ts +31 -0
  1209. package/packages/web/dist/server/routes-mcp.js +175 -0
  1210. package/packages/web/dist/server/routes-mcp.js.map +1 -0
  1211. package/packages/web/dist/server/routes-notion.d.ts +23 -0
  1212. package/packages/web/dist/server/routes-notion.js +723 -0
  1213. package/packages/web/dist/server/routes-notion.js.map +1 -0
  1214. package/packages/web/dist/server/routes-project.d.ts +47 -0
  1215. package/packages/web/dist/server/routes-project.js +128 -0
  1216. package/packages/web/dist/server/routes-project.js.map +1 -0
  1217. package/packages/web/dist/server/routes-rex/analysis.d.ts +11 -0
  1218. package/packages/web/dist/server/routes-rex/analysis.js +583 -0
  1219. package/packages/web/dist/server/routes-rex/analysis.js.map +1 -0
  1220. package/packages/web/dist/server/routes-rex/execution.d.ts +37 -0
  1221. package/packages/web/dist/server/routes-rex/execution.js +355 -0
  1222. package/packages/web/dist/server/routes-rex/execution.js.map +1 -0
  1223. package/packages/web/dist/server/routes-rex/health.d.ts +8 -0
  1224. package/packages/web/dist/server/routes-rex/health.js +136 -0
  1225. package/packages/web/dist/server/routes-rex/health.js.map +1 -0
  1226. package/packages/web/dist/server/routes-rex/index.d.ts +35 -0
  1227. package/packages/web/dist/server/routes-rex/index.js +72 -0
  1228. package/packages/web/dist/server/routes-rex/index.js.map +1 -0
  1229. package/packages/web/dist/server/routes-rex/items.d.ts +8 -0
  1230. package/packages/web/dist/server/routes-rex/items.js +359 -0
  1231. package/packages/web/dist/server/routes-rex/items.js.map +1 -0
  1232. package/packages/web/dist/server/routes-rex/prune.d.ts +11 -0
  1233. package/packages/web/dist/server/routes-rex/prune.js +379 -0
  1234. package/packages/web/dist/server/routes-rex/prune.js.map +1 -0
  1235. package/packages/web/dist/server/routes-rex/reads.d.ts +9 -0
  1236. package/packages/web/dist/server/routes-rex/reads.js +119 -0
  1237. package/packages/web/dist/server/routes-rex/reads.js.map +1 -0
  1238. package/packages/web/dist/server/routes-rex/requirements.d.ts +10 -0
  1239. package/packages/web/dist/server/routes-rex/requirements.js +408 -0
  1240. package/packages/web/dist/server/routes-rex/requirements.js.map +1 -0
  1241. package/packages/web/dist/server/routes-rex/shared.d.ts +37 -0
  1242. package/packages/web/dist/server/routes-rex/shared.js +73 -0
  1243. package/packages/web/dist/server/routes-rex/shared.js.map +1 -0
  1244. package/packages/web/dist/server/routes-rex.d.ts +77 -0
  1245. package/packages/web/dist/server/routes-rex.js +2403 -0
  1246. package/packages/web/dist/server/routes-rex.js.map +1 -0
  1247. package/packages/web/dist/server/routes-search.d.ts +26 -0
  1248. package/packages/web/dist/server/routes-search.js +82 -0
  1249. package/packages/web/dist/server/routes-search.js.map +1 -0
  1250. package/packages/web/dist/server/routes-sourcevision.d.ts +18 -0
  1251. package/packages/web/dist/server/routes-sourcevision.js +444 -0
  1252. package/packages/web/dist/server/routes-sourcevision.js.map +1 -0
  1253. package/packages/web/dist/server/routes-static.d.ts +20 -0
  1254. package/packages/web/dist/server/routes-static.js +168 -0
  1255. package/packages/web/dist/server/routes-static.js.map +1 -0
  1256. package/packages/web/dist/server/routes-status.d.ts +58 -0
  1257. package/packages/web/dist/server/routes-status.js +191 -0
  1258. package/packages/web/dist/server/routes-status.js.map +1 -0
  1259. package/packages/web/dist/server/routes-token-usage.d.ts +63 -0
  1260. package/packages/web/dist/server/routes-token-usage.js +720 -0
  1261. package/packages/web/dist/server/routes-token-usage.js.map +1 -0
  1262. package/packages/web/dist/server/routes-validation.d.ts +10 -0
  1263. package/packages/web/dist/server/routes-validation.js +365 -0
  1264. package/packages/web/dist/server/routes-validation.js.map +1 -0
  1265. package/packages/web/dist/server/routes-workflow.d.ts +15 -0
  1266. package/packages/web/dist/server/routes-workflow.js +498 -0
  1267. package/packages/web/dist/server/routes-workflow.js.map +1 -0
  1268. package/packages/web/dist/server/search-index.d.ts +111 -0
  1269. package/packages/web/dist/server/search-index.js +348 -0
  1270. package/packages/web/dist/server/search-index.js.map +1 -0
  1271. package/packages/web/dist/server/shared-types.d.ts +65 -0
  1272. package/packages/web/dist/server/shared-types.js +31 -0
  1273. package/packages/web/dist/server/shared-types.js.map +1 -0
  1274. package/packages/web/dist/server/start.d.ts +68 -0
  1275. package/packages/web/dist/server/start.js +568 -0
  1276. package/packages/web/dist/server/start.js.map +1 -0
  1277. package/packages/web/dist/server/task-usage.d.ts +17 -0
  1278. package/packages/web/dist/server/task-usage.js +20 -0
  1279. package/packages/web/dist/server/task-usage.js.map +1 -0
  1280. package/packages/web/dist/server/types.d.ts +27 -0
  1281. package/packages/web/dist/server/types.js +26 -0
  1282. package/packages/web/dist/server/types.js.map +1 -0
  1283. package/packages/web/dist/server/usage-cleanup-scheduler.d.ts +107 -0
  1284. package/packages/web/dist/server/usage-cleanup-scheduler.js +232 -0
  1285. package/packages/web/dist/server/usage-cleanup-scheduler.js.map +1 -0
  1286. package/packages/web/dist/server/websocket.d.ts +131 -0
  1287. package/packages/web/dist/server/websocket.js +512 -0
  1288. package/packages/web/dist/server/websocket.js.map +1 -0
  1289. package/packages/web/dist/server/ws-health-tracker.d.ts +86 -0
  1290. package/packages/web/dist/server/ws-health-tracker.js +186 -0
  1291. package/packages/web/dist/server/ws-health-tracker.js.map +1 -0
  1292. package/packages/web/dist/shared/data-files.d.ts +17 -0
  1293. package/packages/web/dist/shared/data-files.js +18 -0
  1294. package/packages/web/dist/shared/data-files.js.map +1 -0
  1295. package/packages/web/dist/shared/index.d.ts +9 -0
  1296. package/packages/web/dist/shared/index.js +9 -0
  1297. package/packages/web/dist/shared/index.js.map +1 -0
  1298. package/packages/web/dist/shared/node-culler.d.ts +94 -0
  1299. package/packages/web/dist/shared/node-culler.js +133 -0
  1300. package/packages/web/dist/shared/node-culler.js.map +1 -0
  1301. package/packages/web/dist/shared/request-dedup.d.ts +43 -0
  1302. package/packages/web/dist/shared/request-dedup.js +55 -0
  1303. package/packages/web/dist/shared/request-dedup.js.map +1 -0
  1304. package/packages/web/dist/shared/view-id.d.ts +8 -0
  1305. package/packages/web/dist/shared/view-id.js +9 -0
  1306. package/packages/web/dist/shared/view-id.js.map +1 -0
  1307. package/packages/web/dist/viewer/Hench-F.png +0 -0
  1308. package/packages/web/dist/viewer/Rex-F.png +0 -0
  1309. package/packages/web/dist/viewer/SourceVision-F.png +0 -0
  1310. package/packages/web/dist/viewer/SourceVision.png +0 -0
  1311. package/packages/web/dist/viewer/api.d.ts +19 -0
  1312. package/packages/web/dist/viewer/api.js +17 -0
  1313. package/packages/web/dist/viewer/api.js.map +1 -0
  1314. package/packages/web/dist/viewer/batched-tick-dispatcher.d.ts +83 -0
  1315. package/packages/web/dist/viewer/batched-tick-dispatcher.js +183 -0
  1316. package/packages/web/dist/viewer/batched-tick-dispatcher.js.map +1 -0
  1317. package/packages/web/dist/viewer/bootstrap.d.ts +13 -0
  1318. package/packages/web/dist/viewer/bootstrap.js +40 -0
  1319. package/packages/web/dist/viewer/bootstrap.js.map +1 -0
  1320. package/packages/web/dist/viewer/call-rate-limiter.d.ts +50 -0
  1321. package/packages/web/dist/viewer/call-rate-limiter.js +103 -0
  1322. package/packages/web/dist/viewer/call-rate-limiter.js.map +1 -0
  1323. package/packages/web/dist/viewer/components/active-tasks-panel.d.ts +36 -0
  1324. package/packages/web/dist/viewer/components/active-tasks-panel.js +183 -0
  1325. package/packages/web/dist/viewer/components/active-tasks-panel.js.map +1 -0
  1326. package/packages/web/dist/viewer/components/breadcrumb.d.ts +21 -0
  1327. package/packages/web/dist/viewer/components/breadcrumb.js +117 -0
  1328. package/packages/web/dist/viewer/components/breadcrumb.js.map +1 -0
  1329. package/packages/web/dist/viewer/components/concurrency-panel.d.ts +18 -0
  1330. package/packages/web/dist/viewer/components/concurrency-panel.js +175 -0
  1331. package/packages/web/dist/viewer/components/concurrency-panel.js.map +1 -0
  1332. package/packages/web/dist/viewer/components/config-footer.d.ts +11 -0
  1333. package/packages/web/dist/viewer/components/config-footer.js +132 -0
  1334. package/packages/web/dist/viewer/components/config-footer.js.map +1 -0
  1335. package/packages/web/dist/viewer/components/constants.d.ts +10 -0
  1336. package/packages/web/dist/viewer/components/constants.js +11 -0
  1337. package/packages/web/dist/viewer/components/constants.js.map +1 -0
  1338. package/packages/web/dist/viewer/components/copy-link-button.d.ts +30 -0
  1339. package/packages/web/dist/viewer/components/copy-link-button.js +74 -0
  1340. package/packages/web/dist/viewer/components/copy-link-button.js.map +1 -0
  1341. package/packages/web/dist/viewer/components/crash-recovery-banner.d.ts +28 -0
  1342. package/packages/web/dist/viewer/components/crash-recovery-banner.js +47 -0
  1343. package/packages/web/dist/viewer/components/crash-recovery-banner.js.map +1 -0
  1344. package/packages/web/dist/viewer/components/data-display/collapsible-section.d.ts +14 -0
  1345. package/packages/web/dist/viewer/components/data-display/collapsible-section.js +66 -0
  1346. package/packages/web/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
  1347. package/packages/web/dist/viewer/components/data-display/findings-list.d.ts +13 -0
  1348. package/packages/web/dist/viewer/components/data-display/findings-list.js +136 -0
  1349. package/packages/web/dist/viewer/components/data-display/findings-list.js.map +1 -0
  1350. package/packages/web/dist/viewer/components/data-display/health-gauge.d.ts +37 -0
  1351. package/packages/web/dist/viewer/components/data-display/health-gauge.js +62 -0
  1352. package/packages/web/dist/viewer/components/data-display/health-gauge.js.map +1 -0
  1353. package/packages/web/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
  1354. package/packages/web/dist/viewer/components/data-display/mini-charts.js +124 -0
  1355. package/packages/web/dist/viewer/components/data-display/mini-charts.js.map +1 -0
  1356. package/packages/web/dist/viewer/components/data-display/tree-view.d.ts +18 -0
  1357. package/packages/web/dist/viewer/components/data-display/tree-view.js +107 -0
  1358. package/packages/web/dist/viewer/components/data-display/tree-view.js.map +1 -0
  1359. package/packages/web/dist/viewer/components/data-display/zone-map.d.ts +28 -0
  1360. package/packages/web/dist/viewer/components/data-display/zone-map.js +197 -0
  1361. package/packages/web/dist/viewer/components/data-display/zone-map.js.map +1 -0
  1362. package/packages/web/dist/viewer/components/degradation-banner.d.ts +28 -0
  1363. package/packages/web/dist/viewer/components/degradation-banner.js +47 -0
  1364. package/packages/web/dist/viewer/components/degradation-banner.js.map +1 -0
  1365. package/packages/web/dist/viewer/components/detail-panel.d.ts +12 -0
  1366. package/packages/web/dist/viewer/components/detail-panel.js +166 -0
  1367. package/packages/web/dist/viewer/components/detail-panel.js.map +1 -0
  1368. package/packages/web/dist/viewer/components/elapsed-time.d.ts +38 -0
  1369. package/packages/web/dist/viewer/components/elapsed-time.js +35 -0
  1370. package/packages/web/dist/viewer/components/elapsed-time.js.map +1 -0
  1371. package/packages/web/dist/viewer/components/faq.d.ts +12 -0
  1372. package/packages/web/dist/viewer/components/faq.js +237 -0
  1373. package/packages/web/dist/viewer/components/faq.js.map +1 -0
  1374. package/packages/web/dist/viewer/components/favicon.d.ts +30 -0
  1375. package/packages/web/dist/viewer/components/favicon.js +90 -0
  1376. package/packages/web/dist/viewer/components/favicon.js.map +1 -0
  1377. package/packages/web/dist/viewer/components/guide.d.ts +5 -0
  1378. package/packages/web/dist/viewer/components/guide.js +116 -0
  1379. package/packages/web/dist/viewer/components/guide.js.map +1 -0
  1380. package/packages/web/dist/viewer/components/index.d.ts +37 -0
  1381. package/packages/web/dist/viewer/components/index.js +46 -0
  1382. package/packages/web/dist/viewer/components/index.js.map +1 -0
  1383. package/packages/web/dist/viewer/components/logos.d.ts +42 -0
  1384. package/packages/web/dist/viewer/components/logos.js +46 -0
  1385. package/packages/web/dist/viewer/components/logos.js.map +1 -0
  1386. package/packages/web/dist/viewer/components/memory-panel.d.ts +19 -0
  1387. package/packages/web/dist/viewer/components/memory-panel.js +181 -0
  1388. package/packages/web/dist/viewer/components/memory-panel.js.map +1 -0
  1389. package/packages/web/dist/viewer/components/memory-warning.d.ts +23 -0
  1390. package/packages/web/dist/viewer/components/memory-warning.js +42 -0
  1391. package/packages/web/dist/viewer/components/memory-warning.js.map +1 -0
  1392. package/packages/web/dist/viewer/components/notion-schema-wizard.d.ts +16 -0
  1393. package/packages/web/dist/viewer/components/notion-schema-wizard.js +263 -0
  1394. package/packages/web/dist/viewer/components/notion-schema-wizard.js.map +1 -0
  1395. package/packages/web/dist/viewer/components/polling-suspension-indicator.d.ts +24 -0
  1396. package/packages/web/dist/viewer/components/polling-suspension-indicator.js +31 -0
  1397. package/packages/web/dist/viewer/components/polling-suspension-indicator.js.map +1 -0
  1398. package/packages/web/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
  1399. package/packages/web/dist/viewer/components/prd-tree/add-item-form.js +231 -0
  1400. package/packages/web/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
  1401. package/packages/web/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
  1402. package/packages/web/dist/viewer/components/prd-tree/analyze-panel.js +245 -0
  1403. package/packages/web/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
  1404. package/packages/web/dist/viewer/components/prd-tree/batch-import-panel.d.ts +34 -0
  1405. package/packages/web/dist/viewer/components/prd-tree/batch-import-panel.js +415 -0
  1406. package/packages/web/dist/viewer/components/prd-tree/batch-import-panel.js.map +1 -0
  1407. package/packages/web/dist/viewer/components/prd-tree/bulk-actions.d.ts +19 -0
  1408. package/packages/web/dist/viewer/components/prd-tree/bulk-actions.js +90 -0
  1409. package/packages/web/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
  1410. package/packages/web/dist/viewer/components/prd-tree/compute.d.ts +32 -0
  1411. package/packages/web/dist/viewer/components/prd-tree/compute.js +129 -0
  1412. package/packages/web/dist/viewer/components/prd-tree/compute.js.map +1 -0
  1413. package/packages/web/dist/viewer/components/prd-tree/delete-confirmation.d.ts +23 -0
  1414. package/packages/web/dist/viewer/components/prd-tree/delete-confirmation.js +83 -0
  1415. package/packages/web/dist/viewer/components/prd-tree/delete-confirmation.js.map +1 -0
  1416. package/packages/web/dist/viewer/components/prd-tree/execution-panel.d.ts +14 -0
  1417. package/packages/web/dist/viewer/components/prd-tree/execution-panel.js +291 -0
  1418. package/packages/web/dist/viewer/components/prd-tree/execution-panel.js.map +1 -0
  1419. package/packages/web/dist/viewer/components/prd-tree/facet-filter.d.ts +40 -0
  1420. package/packages/web/dist/viewer/components/prd-tree/facet-filter.js +188 -0
  1421. package/packages/web/dist/viewer/components/prd-tree/facet-filter.js.map +1 -0
  1422. package/packages/web/dist/viewer/components/prd-tree/index.d.ts +24 -0
  1423. package/packages/web/dist/viewer/components/prd-tree/index.js +16 -0
  1424. package/packages/web/dist/viewer/components/prd-tree/index.js.map +1 -0
  1425. package/packages/web/dist/viewer/components/prd-tree/inline-add-form.d.ts +32 -0
  1426. package/packages/web/dist/viewer/components/prd-tree/inline-add-form.js +175 -0
  1427. package/packages/web/dist/viewer/components/prd-tree/inline-add-form.js.map +1 -0
  1428. package/packages/web/dist/viewer/components/prd-tree/inline-status-picker.d.ts +31 -0
  1429. package/packages/web/dist/viewer/components/prd-tree/inline-status-picker.js +110 -0
  1430. package/packages/web/dist/viewer/components/prd-tree/inline-status-picker.js.map +1 -0
  1431. package/packages/web/dist/viewer/components/prd-tree/lazy-children.d.ts +40 -0
  1432. package/packages/web/dist/viewer/components/prd-tree/lazy-children.js +73 -0
  1433. package/packages/web/dist/viewer/components/prd-tree/lazy-children.js.map +1 -0
  1434. package/packages/web/dist/viewer/components/prd-tree/levels.d.ts +31 -0
  1435. package/packages/web/dist/viewer/components/prd-tree/levels.js +72 -0
  1436. package/packages/web/dist/viewer/components/prd-tree/levels.js.map +1 -0
  1437. package/packages/web/dist/viewer/components/prd-tree/listener-lifecycle.d.ts +105 -0
  1438. package/packages/web/dist/viewer/components/prd-tree/listener-lifecycle.js +173 -0
  1439. package/packages/web/dist/viewer/components/prd-tree/listener-lifecycle.js.map +1 -0
  1440. package/packages/web/dist/viewer/components/prd-tree/merge-preview.d.ts +25 -0
  1441. package/packages/web/dist/viewer/components/prd-tree/merge-preview.js +181 -0
  1442. package/packages/web/dist/viewer/components/prd-tree/merge-preview.js.map +1 -0
  1443. package/packages/web/dist/viewer/components/prd-tree/node-culler.d.ts +96 -0
  1444. package/packages/web/dist/viewer/components/prd-tree/node-culler.js +135 -0
  1445. package/packages/web/dist/viewer/components/prd-tree/node-culler.js.map +1 -0
  1446. package/packages/web/dist/viewer/components/prd-tree/prd-tree.d.ts +91 -0
  1447. package/packages/web/dist/viewer/components/prd-tree/prd-tree.js +565 -0
  1448. package/packages/web/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
  1449. package/packages/web/dist/viewer/components/prd-tree/progressive-loader.d.ts +114 -0
  1450. package/packages/web/dist/viewer/components/prd-tree/progressive-loader.js +225 -0
  1451. package/packages/web/dist/viewer/components/prd-tree/progressive-loader.js.map +1 -0
  1452. package/packages/web/dist/viewer/components/prd-tree/proposal-editor.d.ts +44 -0
  1453. package/packages/web/dist/viewer/components/prd-tree/proposal-editor.js +438 -0
  1454. package/packages/web/dist/viewer/components/prd-tree/proposal-editor.js.map +1 -0
  1455. package/packages/web/dist/viewer/components/prd-tree/prune-confirmation.d.ts +25 -0
  1456. package/packages/web/dist/viewer/components/prd-tree/prune-confirmation.js +336 -0
  1457. package/packages/web/dist/viewer/components/prd-tree/prune-confirmation.js.map +1 -0
  1458. package/packages/web/dist/viewer/components/prd-tree/prune-diff-tree.d.ts +39 -0
  1459. package/packages/web/dist/viewer/components/prd-tree/prune-diff-tree.js +319 -0
  1460. package/packages/web/dist/viewer/components/prd-tree/prune-diff-tree.js.map +1 -0
  1461. package/packages/web/dist/viewer/components/prd-tree/reorganize-panel.d.ts +16 -0
  1462. package/packages/web/dist/viewer/components/prd-tree/reorganize-panel.js +213 -0
  1463. package/packages/web/dist/viewer/components/prd-tree/reorganize-panel.js.map +1 -0
  1464. package/packages/web/dist/viewer/components/prd-tree/shared-imports.d.ts +18 -0
  1465. package/packages/web/dist/viewer/components/prd-tree/shared-imports.js +18 -0
  1466. package/packages/web/dist/viewer/components/prd-tree/shared-imports.js.map +1 -0
  1467. package/packages/web/dist/viewer/components/prd-tree/smart-add-input.d.ts +19 -0
  1468. package/packages/web/dist/viewer/components/prd-tree/smart-add-input.js +383 -0
  1469. package/packages/web/dist/viewer/components/prd-tree/smart-add-input.js.map +1 -0
  1470. package/packages/web/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
  1471. package/packages/web/dist/viewer/components/prd-tree/status-filter.js +131 -0
  1472. package/packages/web/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
  1473. package/packages/web/dist/viewer/components/prd-tree/task-detail.d.ts +41 -0
  1474. package/packages/web/dist/viewer/components/prd-tree/task-detail.js +1205 -0
  1475. package/packages/web/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
  1476. package/packages/web/dist/viewer/components/prd-tree/task-utilization.d.ts +7 -0
  1477. package/packages/web/dist/viewer/components/prd-tree/task-utilization.js +25 -0
  1478. package/packages/web/dist/viewer/components/prd-tree/task-utilization.js.map +1 -0
  1479. package/packages/web/dist/viewer/components/prd-tree/tree-differ.d.ts +59 -0
  1480. package/packages/web/dist/viewer/components/prd-tree/tree-differ.js +200 -0
  1481. package/packages/web/dist/viewer/components/prd-tree/tree-differ.js.map +1 -0
  1482. package/packages/web/dist/viewer/components/prd-tree/tree-event-delegate.d.ts +70 -0
  1483. package/packages/web/dist/viewer/components/prd-tree/tree-event-delegate.js +176 -0
  1484. package/packages/web/dist/viewer/components/prd-tree/tree-event-delegate.js.map +1 -0
  1485. package/packages/web/dist/viewer/components/prd-tree/tree-search.d.ts +65 -0
  1486. package/packages/web/dist/viewer/components/prd-tree/tree-search.js +178 -0
  1487. package/packages/web/dist/viewer/components/prd-tree/tree-search.js.map +1 -0
  1488. package/packages/web/dist/viewer/components/prd-tree/tree-utils.d.ts +38 -0
  1489. package/packages/web/dist/viewer/components/prd-tree/tree-utils.js +107 -0
  1490. package/packages/web/dist/viewer/components/prd-tree/tree-utils.js.map +1 -0
  1491. package/packages/web/dist/viewer/components/prd-tree/types.d.ts +93 -0
  1492. package/packages/web/dist/viewer/components/prd-tree/types.js +16 -0
  1493. package/packages/web/dist/viewer/components/prd-tree/types.js.map +1 -0
  1494. package/packages/web/dist/viewer/components/prd-tree/virtual-scroll.d.ts +119 -0
  1495. package/packages/web/dist/viewer/components/prd-tree/virtual-scroll.js +169 -0
  1496. package/packages/web/dist/viewer/components/prd-tree/virtual-scroll.js.map +1 -0
  1497. package/packages/web/dist/viewer/components/progressive-loader.d.ts +114 -0
  1498. package/packages/web/dist/viewer/components/progressive-loader.js +225 -0
  1499. package/packages/web/dist/viewer/components/progressive-loader.js.map +1 -0
  1500. package/packages/web/dist/viewer/components/refresh-queue-status.d.ts +20 -0
  1501. package/packages/web/dist/viewer/components/refresh-queue-status.js +65 -0
  1502. package/packages/web/dist/viewer/components/refresh-queue-status.js.map +1 -0
  1503. package/packages/web/dist/viewer/components/rex-task-link.d.ts +50 -0
  1504. package/packages/web/dist/viewer/components/rex-task-link.js +218 -0
  1505. package/packages/web/dist/viewer/components/rex-task-link.js.map +1 -0
  1506. package/packages/web/dist/viewer/components/search-filter.d.ts +20 -0
  1507. package/packages/web/dist/viewer/components/search-filter.js +28 -0
  1508. package/packages/web/dist/viewer/components/search-filter.js.map +1 -0
  1509. package/packages/web/dist/viewer/components/search-overlay.d.ts +31 -0
  1510. package/packages/web/dist/viewer/components/search-overlay.js +472 -0
  1511. package/packages/web/dist/viewer/components/search-overlay.js.map +1 -0
  1512. package/packages/web/dist/viewer/components/sidebar.d.ts +18 -0
  1513. package/packages/web/dist/viewer/components/sidebar.js +357 -0
  1514. package/packages/web/dist/viewer/components/sidebar.js.map +1 -0
  1515. package/packages/web/dist/viewer/components/status-indicators.d.ts +63 -0
  1516. package/packages/web/dist/viewer/components/status-indicators.js +136 -0
  1517. package/packages/web/dist/viewer/components/status-indicators.js.map +1 -0
  1518. package/packages/web/dist/viewer/components/theme-toggle.d.ts +8 -0
  1519. package/packages/web/dist/viewer/components/theme-toggle.js +28 -0
  1520. package/packages/web/dist/viewer/components/theme-toggle.js.map +1 -0
  1521. package/packages/web/dist/viewer/components/throttle-controls.d.ts +18 -0
  1522. package/packages/web/dist/viewer/components/throttle-controls.js +304 -0
  1523. package/packages/web/dist/viewer/components/throttle-controls.js.map +1 -0
  1524. package/packages/web/dist/viewer/components/ws-health-panel.d.ts +18 -0
  1525. package/packages/web/dist/viewer/components/ws-health-panel.js +250 -0
  1526. package/packages/web/dist/viewer/components/ws-health-panel.js.map +1 -0
  1527. package/packages/web/dist/viewer/components/zone-slideout.d.ts +17 -0
  1528. package/packages/web/dist/viewer/components/zone-slideout.js +162 -0
  1529. package/packages/web/dist/viewer/components/zone-slideout.js.map +1 -0
  1530. package/packages/web/dist/viewer/crash/crash-detector.d.ts +69 -0
  1531. package/packages/web/dist/viewer/crash/crash-detector.js +239 -0
  1532. package/packages/web/dist/viewer/crash/crash-detector.js.map +1 -0
  1533. package/packages/web/dist/viewer/crash/index.d.ts +7 -0
  1534. package/packages/web/dist/viewer/crash/index.js +8 -0
  1535. package/packages/web/dist/viewer/crash/index.js.map +1 -0
  1536. package/packages/web/dist/viewer/crash-detector.d.ts +105 -0
  1537. package/packages/web/dist/viewer/crash-detector.js +257 -0
  1538. package/packages/web/dist/viewer/crash-detector.js.map +1 -0
  1539. package/packages/web/dist/viewer/deployed-mode.d.ts +37 -0
  1540. package/packages/web/dist/viewer/deployed-mode.js +94 -0
  1541. package/packages/web/dist/viewer/deployed-mode.js.map +1 -0
  1542. package/packages/web/dist/viewer/dom-performance-monitor.d.ts +158 -0
  1543. package/packages/web/dist/viewer/dom-performance-monitor.js +342 -0
  1544. package/packages/web/dist/viewer/dom-performance-monitor.js.map +1 -0
  1545. package/packages/web/dist/viewer/dom-update-gate.d.ts +122 -0
  1546. package/packages/web/dist/viewer/dom-update-gate.js +229 -0
  1547. package/packages/web/dist/viewer/dom-update-gate.js.map +1 -0
  1548. package/packages/web/dist/viewer/external.d.ts +17 -0
  1549. package/packages/web/dist/viewer/external.js +17 -0
  1550. package/packages/web/dist/viewer/external.js.map +1 -0
  1551. package/packages/web/dist/viewer/graceful-degradation.d.ts +73 -0
  1552. package/packages/web/dist/viewer/graceful-degradation.js +152 -0
  1553. package/packages/web/dist/viewer/graceful-degradation.js.map +1 -0
  1554. package/packages/web/dist/viewer/graph/index.d.ts +9 -0
  1555. package/packages/web/dist/viewer/graph/index.js +12 -0
  1556. package/packages/web/dist/viewer/graph/index.js.map +1 -0
  1557. package/packages/web/dist/viewer/graph/physics.d.ts +96 -0
  1558. package/packages/web/dist/viewer/graph/physics.js +366 -0
  1559. package/packages/web/dist/viewer/graph/physics.js.map +1 -0
  1560. package/packages/web/dist/viewer/graph/renderer.d.ts +184 -0
  1561. package/packages/web/dist/viewer/graph/renderer.js +1438 -0
  1562. package/packages/web/dist/viewer/graph/renderer.js.map +1 -0
  1563. package/packages/web/dist/viewer/hooks/index.d.ts +27 -0
  1564. package/packages/web/dist/viewer/hooks/index.js +28 -0
  1565. package/packages/web/dist/viewer/hooks/index.js.map +1 -0
  1566. package/packages/web/dist/viewer/hooks/use-app-data.d.ts +31 -0
  1567. package/packages/web/dist/viewer/hooks/use-app-data.js +152 -0
  1568. package/packages/web/dist/viewer/hooks/use-app-data.js.map +1 -0
  1569. package/packages/web/dist/viewer/hooks/use-crash-recovery.d.ts +50 -0
  1570. package/packages/web/dist/viewer/hooks/use-crash-recovery.js +76 -0
  1571. package/packages/web/dist/viewer/hooks/use-crash-recovery.js.map +1 -0
  1572. package/packages/web/dist/viewer/hooks/use-delete-actions.d.ts +48 -0
  1573. package/packages/web/dist/viewer/hooks/use-delete-actions.js +103 -0
  1574. package/packages/web/dist/viewer/hooks/use-delete-actions.js.map +1 -0
  1575. package/packages/web/dist/viewer/hooks/use-dom-performance-monitor.d.ts +68 -0
  1576. package/packages/web/dist/viewer/hooks/use-dom-performance-monitor.js +71 -0
  1577. package/packages/web/dist/viewer/hooks/use-dom-performance-monitor.js.map +1 -0
  1578. package/packages/web/dist/viewer/hooks/use-facet-state.d.ts +32 -0
  1579. package/packages/web/dist/viewer/hooks/use-facet-state.js +119 -0
  1580. package/packages/web/dist/viewer/hooks/use-facet-state.js.map +1 -0
  1581. package/packages/web/dist/viewer/hooks/use-feature-toggle.d.ts +18 -0
  1582. package/packages/web/dist/viewer/hooks/use-feature-toggle.js +57 -0
  1583. package/packages/web/dist/viewer/hooks/use-feature-toggle.js.map +1 -0
  1584. package/packages/web/dist/viewer/hooks/use-file-edges.d.ts +23 -0
  1585. package/packages/web/dist/viewer/hooks/use-file-edges.js +221 -0
  1586. package/packages/web/dist/viewer/hooks/use-file-edges.js.map +1 -0
  1587. package/packages/web/dist/viewer/hooks/use-graceful-degradation.d.ts +30 -0
  1588. package/packages/web/dist/viewer/hooks/use-graceful-degradation.js +45 -0
  1589. package/packages/web/dist/viewer/hooks/use-graceful-degradation.js.map +1 -0
  1590. package/packages/web/dist/viewer/hooks/use-item-selection.d.ts +49 -0
  1591. package/packages/web/dist/viewer/hooks/use-item-selection.js +117 -0
  1592. package/packages/web/dist/viewer/hooks/use-item-selection.js.map +1 -0
  1593. package/packages/web/dist/viewer/hooks/use-memory-monitor.d.ts +39 -0
  1594. package/packages/web/dist/viewer/hooks/use-memory-monitor.js +73 -0
  1595. package/packages/web/dist/viewer/hooks/use-memory-monitor.js.map +1 -0
  1596. package/packages/web/dist/viewer/hooks/use-pan-zoom.d.ts +33 -0
  1597. package/packages/web/dist/viewer/hooks/use-pan-zoom.js +110 -0
  1598. package/packages/web/dist/viewer/hooks/use-pan-zoom.js.map +1 -0
  1599. package/packages/web/dist/viewer/hooks/use-persistent-filter.d.ts +24 -0
  1600. package/packages/web/dist/viewer/hooks/use-persistent-filter.js +37 -0
  1601. package/packages/web/dist/viewer/hooks/use-persistent-filter.js.map +1 -0
  1602. package/packages/web/dist/viewer/hooks/use-polling-suspension.d.ts +32 -0
  1603. package/packages/web/dist/viewer/hooks/use-polling-suspension.js +41 -0
  1604. package/packages/web/dist/viewer/hooks/use-polling-suspension.js.map +1 -0
  1605. package/packages/web/dist/viewer/hooks/use-polling.d.ts +39 -0
  1606. package/packages/web/dist/viewer/hooks/use-polling.js +55 -0
  1607. package/packages/web/dist/viewer/hooks/use-polling.js.map +1 -0
  1608. package/packages/web/dist/viewer/hooks/use-prd-actions.d.ts +126 -0
  1609. package/packages/web/dist/viewer/hooks/use-prd-actions.js +250 -0
  1610. package/packages/web/dist/viewer/hooks/use-prd-actions.js.map +1 -0
  1611. package/packages/web/dist/viewer/hooks/use-prd-data.d.ts +45 -0
  1612. package/packages/web/dist/viewer/hooks/use-prd-data.js +159 -0
  1613. package/packages/web/dist/viewer/hooks/use-prd-data.js.map +1 -0
  1614. package/packages/web/dist/viewer/hooks/use-prd-deep-link.d.ts +45 -0
  1615. package/packages/web/dist/viewer/hooks/use-prd-deep-link.js +60 -0
  1616. package/packages/web/dist/viewer/hooks/use-prd-deep-link.js.map +1 -0
  1617. package/packages/web/dist/viewer/hooks/use-prd-websocket.d.ts +47 -0
  1618. package/packages/web/dist/viewer/hooks/use-prd-websocket.js +139 -0
  1619. package/packages/web/dist/viewer/hooks/use-prd-websocket.js.map +1 -0
  1620. package/packages/web/dist/viewer/hooks/use-project-metadata.d.ts +25 -0
  1621. package/packages/web/dist/viewer/hooks/use-project-metadata.js +55 -0
  1622. package/packages/web/dist/viewer/hooks/use-project-metadata.js.map +1 -0
  1623. package/packages/web/dist/viewer/hooks/use-project-status.d.ts +60 -0
  1624. package/packages/web/dist/viewer/hooks/use-project-status.js +133 -0
  1625. package/packages/web/dist/viewer/hooks/use-project-status.js.map +1 -0
  1626. package/packages/web/dist/viewer/hooks/use-refresh-throttle.d.ts +45 -0
  1627. package/packages/web/dist/viewer/hooks/use-refresh-throttle.js +52 -0
  1628. package/packages/web/dist/viewer/hooks/use-refresh-throttle.js.map +1 -0
  1629. package/packages/web/dist/viewer/hooks/use-route-state.d.ts +18 -0
  1630. package/packages/web/dist/viewer/hooks/use-route-state.js +115 -0
  1631. package/packages/web/dist/viewer/hooks/use-route-state.js.map +1 -0
  1632. package/packages/web/dist/viewer/hooks/use-subzone-edges.d.ts +21 -0
  1633. package/packages/web/dist/viewer/hooks/use-subzone-edges.js +147 -0
  1634. package/packages/web/dist/viewer/hooks/use-subzone-edges.js.map +1 -0
  1635. package/packages/web/dist/viewer/hooks/use-tab-visibility.d.ts +31 -0
  1636. package/packages/web/dist/viewer/hooks/use-tab-visibility.js +43 -0
  1637. package/packages/web/dist/viewer/hooks/use-tab-visibility.js.map +1 -0
  1638. package/packages/web/dist/viewer/hooks/use-tick.d.ts +43 -0
  1639. package/packages/web/dist/viewer/hooks/use-tick.js +76 -0
  1640. package/packages/web/dist/viewer/hooks/use-tick.js.map +1 -0
  1641. package/packages/web/dist/viewer/hooks/use-toast.d.ts +24 -0
  1642. package/packages/web/dist/viewer/hooks/use-toast.js +26 -0
  1643. package/packages/web/dist/viewer/hooks/use-toast.js.map +1 -0
  1644. package/packages/web/dist/viewer/hooks/use-zone-drag.d.ts +30 -0
  1645. package/packages/web/dist/viewer/hooks/use-zone-drag.js +60 -0
  1646. package/packages/web/dist/viewer/hooks/use-zone-drag.js.map +1 -0
  1647. package/packages/web/dist/viewer/index.html +36 -0
  1648. package/packages/web/dist/viewer/loader.d.ts +33 -0
  1649. package/packages/web/dist/viewer/loader.js +195 -0
  1650. package/packages/web/dist/viewer/loader.js.map +1 -0
  1651. package/packages/web/dist/viewer/main.d.ts +1 -0
  1652. package/packages/web/dist/viewer/main.js +121 -0
  1653. package/packages/web/dist/viewer/main.js.map +1 -0
  1654. package/packages/web/dist/viewer/memory-monitor.d.ts +78 -0
  1655. package/packages/web/dist/viewer/memory-monitor.js +218 -0
  1656. package/packages/web/dist/viewer/memory-monitor.js.map +1 -0
  1657. package/packages/web/dist/viewer/message-coalescer.d.ts +96 -0
  1658. package/packages/web/dist/viewer/message-coalescer.js +121 -0
  1659. package/packages/web/dist/viewer/message-coalescer.js.map +1 -0
  1660. package/packages/web/dist/viewer/message-throttle.d.ts +95 -0
  1661. package/packages/web/dist/viewer/message-throttle.js +147 -0
  1662. package/packages/web/dist/viewer/message-throttle.js.map +1 -0
  1663. package/packages/web/dist/viewer/messaging/call-rate-limiter.d.ts +50 -0
  1664. package/packages/web/dist/viewer/messaging/call-rate-limiter.js +103 -0
  1665. package/packages/web/dist/viewer/messaging/call-rate-limiter.js.map +1 -0
  1666. package/packages/web/dist/viewer/messaging/fetch-pipeline.d.ts +58 -0
  1667. package/packages/web/dist/viewer/messaging/fetch-pipeline.js +58 -0
  1668. package/packages/web/dist/viewer/messaging/fetch-pipeline.js.map +1 -0
  1669. package/packages/web/dist/viewer/messaging/index.d.ts +43 -0
  1670. package/packages/web/dist/viewer/messaging/index.js +46 -0
  1671. package/packages/web/dist/viewer/messaging/index.js.map +1 -0
  1672. package/packages/web/dist/viewer/messaging/message-coalescer.d.ts +96 -0
  1673. package/packages/web/dist/viewer/messaging/message-coalescer.js +121 -0
  1674. package/packages/web/dist/viewer/messaging/message-coalescer.js.map +1 -0
  1675. package/packages/web/dist/viewer/messaging/message-throttle.d.ts +95 -0
  1676. package/packages/web/dist/viewer/messaging/message-throttle.js +147 -0
  1677. package/packages/web/dist/viewer/messaging/message-throttle.js.map +1 -0
  1678. package/packages/web/dist/viewer/messaging/request-dedup.d.ts +43 -0
  1679. package/packages/web/dist/viewer/messaging/request-dedup.js +55 -0
  1680. package/packages/web/dist/viewer/messaging/request-dedup.js.map +1 -0
  1681. package/packages/web/dist/viewer/messaging/ws-pipeline.d.ts +85 -0
  1682. package/packages/web/dist/viewer/messaging/ws-pipeline.js +68 -0
  1683. package/packages/web/dist/viewer/messaging/ws-pipeline.js.map +1 -0
  1684. package/packages/web/dist/viewer/n-dx.png +0 -0
  1685. package/packages/web/dist/viewer/performance/crash-detector-test-support.d.ts +15 -0
  1686. package/packages/web/dist/viewer/performance/crash-detector-test-support.js +19 -0
  1687. package/packages/web/dist/viewer/performance/crash-detector-test-support.js.map +1 -0
  1688. package/packages/web/dist/viewer/performance/crash-detector.d.ts +105 -0
  1689. package/packages/web/dist/viewer/performance/crash-detector.js +257 -0
  1690. package/packages/web/dist/viewer/performance/crash-detector.js.map +1 -0
  1691. package/packages/web/dist/viewer/performance/dom-performance-monitor.d.ts +157 -0
  1692. package/packages/web/dist/viewer/performance/dom-performance-monitor.js +341 -0
  1693. package/packages/web/dist/viewer/performance/dom-performance-monitor.js.map +1 -0
  1694. package/packages/web/dist/viewer/performance/dom-update-gate.d.ts +122 -0
  1695. package/packages/web/dist/viewer/performance/dom-update-gate.js +229 -0
  1696. package/packages/web/dist/viewer/performance/dom-update-gate.js.map +1 -0
  1697. package/packages/web/dist/viewer/performance/graceful-degradation.d.ts +73 -0
  1698. package/packages/web/dist/viewer/performance/graceful-degradation.js +152 -0
  1699. package/packages/web/dist/viewer/performance/graceful-degradation.js.map +1 -0
  1700. package/packages/web/dist/viewer/performance/index.d.ts +14 -0
  1701. package/packages/web/dist/viewer/performance/index.js +20 -0
  1702. package/packages/web/dist/viewer/performance/index.js.map +1 -0
  1703. package/packages/web/dist/viewer/performance/memory-monitor.d.ts +78 -0
  1704. package/packages/web/dist/viewer/performance/memory-monitor.js +218 -0
  1705. package/packages/web/dist/viewer/performance/memory-monitor.js.map +1 -0
  1706. package/packages/web/dist/viewer/performance/refresh-throttle.d.ts +90 -0
  1707. package/packages/web/dist/viewer/performance/refresh-throttle.js +266 -0
  1708. package/packages/web/dist/viewer/performance/refresh-throttle.js.map +1 -0
  1709. package/packages/web/dist/viewer/performance/response-buffer-gate.d.ts +108 -0
  1710. package/packages/web/dist/viewer/performance/response-buffer-gate.js +170 -0
  1711. package/packages/web/dist/viewer/performance/response-buffer-gate.js.map +1 -0
  1712. package/packages/web/dist/viewer/performance/update-batcher.d.ts +79 -0
  1713. package/packages/web/dist/viewer/performance/update-batcher.js +119 -0
  1714. package/packages/web/dist/viewer/performance/update-batcher.js.map +1 -0
  1715. package/packages/web/dist/viewer/polling/batched-tick-dispatcher.d.ts +83 -0
  1716. package/packages/web/dist/viewer/polling/batched-tick-dispatcher.js +183 -0
  1717. package/packages/web/dist/viewer/polling/batched-tick-dispatcher.js.map +1 -0
  1718. package/packages/web/dist/viewer/polling/index.d.ts +13 -0
  1719. package/packages/web/dist/viewer/polling/index.js +16 -0
  1720. package/packages/web/dist/viewer/polling/index.js.map +1 -0
  1721. package/packages/web/dist/viewer/polling/polling-manager.d.ts +82 -0
  1722. package/packages/web/dist/viewer/polling/polling-manager.js +254 -0
  1723. package/packages/web/dist/viewer/polling/polling-manager.js.map +1 -0
  1724. package/packages/web/dist/viewer/polling/polling-restart.d.ts +45 -0
  1725. package/packages/web/dist/viewer/polling/polling-restart.js +98 -0
  1726. package/packages/web/dist/viewer/polling/polling-restart.js.map +1 -0
  1727. package/packages/web/dist/viewer/polling/polling-state.d.ts +182 -0
  1728. package/packages/web/dist/viewer/polling/polling-state.js +306 -0
  1729. package/packages/web/dist/viewer/polling/polling-state.js.map +1 -0
  1730. package/packages/web/dist/viewer/polling/tab-visibility.d.ts +112 -0
  1731. package/packages/web/dist/viewer/polling/tab-visibility.js +276 -0
  1732. package/packages/web/dist/viewer/polling/tab-visibility.js.map +1 -0
  1733. package/packages/web/dist/viewer/polling/tick-timer.d.ts +70 -0
  1734. package/packages/web/dist/viewer/polling/tick-timer.js +168 -0
  1735. package/packages/web/dist/viewer/polling/tick-timer.js.map +1 -0
  1736. package/packages/web/dist/viewer/polling/tick-visibility-gate.d.ts +92 -0
  1737. package/packages/web/dist/viewer/polling/tick-visibility-gate.js +146 -0
  1738. package/packages/web/dist/viewer/polling/tick-visibility-gate.js.map +1 -0
  1739. package/packages/web/dist/viewer/polling-manager.d.ts +82 -0
  1740. package/packages/web/dist/viewer/polling-manager.js +254 -0
  1741. package/packages/web/dist/viewer/polling-manager.js.map +1 -0
  1742. package/packages/web/dist/viewer/polling-restart.d.ts +57 -0
  1743. package/packages/web/dist/viewer/polling-restart.js +118 -0
  1744. package/packages/web/dist/viewer/polling-restart.js.map +1 -0
  1745. package/packages/web/dist/viewer/polling-state.d.ts +182 -0
  1746. package/packages/web/dist/viewer/polling-state.js +306 -0
  1747. package/packages/web/dist/viewer/polling-state.js.map +1 -0
  1748. package/packages/web/dist/viewer/refresh-throttle.d.ts +90 -0
  1749. package/packages/web/dist/viewer/refresh-throttle.js +266 -0
  1750. package/packages/web/dist/viewer/refresh-throttle.js.map +1 -0
  1751. package/packages/web/dist/viewer/request-dedup.d.ts +43 -0
  1752. package/packages/web/dist/viewer/request-dedup.js +55 -0
  1753. package/packages/web/dist/viewer/request-dedup.js.map +1 -0
  1754. package/packages/web/dist/viewer/response-buffer-gate.d.ts +108 -0
  1755. package/packages/web/dist/viewer/response-buffer-gate.js +170 -0
  1756. package/packages/web/dist/viewer/response-buffer-gate.js.map +1 -0
  1757. package/packages/web/dist/viewer/route-state.d.ts +8 -0
  1758. package/packages/web/dist/viewer/route-state.js +77 -0
  1759. package/packages/web/dist/viewer/route-state.js.map +1 -0
  1760. package/packages/web/dist/viewer/schema-compat.d.ts +17 -0
  1761. package/packages/web/dist/viewer/schema-compat.js +49 -0
  1762. package/packages/web/dist/viewer/schema-compat.js.map +1 -0
  1763. package/packages/web/dist/viewer/sourcevision-tabs.d.ts +10 -0
  1764. package/packages/web/dist/viewer/sourcevision-tabs.js +14 -0
  1765. package/packages/web/dist/viewer/sourcevision-tabs.js.map +1 -0
  1766. package/packages/web/dist/viewer/tab-visibility.d.ts +112 -0
  1767. package/packages/web/dist/viewer/tab-visibility.js +276 -0
  1768. package/packages/web/dist/viewer/tab-visibility.js.map +1 -0
  1769. package/packages/web/dist/viewer/tick-timer.d.ts +70 -0
  1770. package/packages/web/dist/viewer/tick-timer.js +168 -0
  1771. package/packages/web/dist/viewer/tick-timer.js.map +1 -0
  1772. package/packages/web/dist/viewer/tick-visibility-gate.d.ts +92 -0
  1773. package/packages/web/dist/viewer/tick-visibility-gate.js +146 -0
  1774. package/packages/web/dist/viewer/tick-visibility-gate.js.map +1 -0
  1775. package/packages/web/dist/viewer/types.d.ts +66 -0
  1776. package/packages/web/dist/viewer/types.js +2 -0
  1777. package/packages/web/dist/viewer/types.js.map +1 -0
  1778. package/packages/web/dist/viewer/update-batcher.d.ts +79 -0
  1779. package/packages/web/dist/viewer/update-batcher.js +119 -0
  1780. package/packages/web/dist/viewer/update-batcher.js.map +1 -0
  1781. package/packages/web/dist/viewer/usage/constants.d.ts +14 -0
  1782. package/packages/web/dist/viewer/usage/constants.js +14 -0
  1783. package/packages/web/dist/viewer/usage/constants.js.map +1 -0
  1784. package/packages/web/dist/viewer/usage/index.d.ts +7 -0
  1785. package/packages/web/dist/viewer/usage/index.js +8 -0
  1786. package/packages/web/dist/viewer/usage/index.js.map +1 -0
  1787. package/packages/web/dist/viewer/utils.d.ts +25 -0
  1788. package/packages/web/dist/viewer/utils.js +48 -0
  1789. package/packages/web/dist/viewer/utils.js.map +1 -0
  1790. package/packages/web/dist/viewer/validate.d.ts +23 -0
  1791. package/packages/web/dist/viewer/validate.js +275 -0
  1792. package/packages/web/dist/viewer/validate.js.map +1 -0
  1793. package/packages/web/dist/viewer/views/analysis.d.ts +10 -0
  1794. package/packages/web/dist/viewer/views/analysis.js +109 -0
  1795. package/packages/web/dist/viewer/views/analysis.js.map +1 -0
  1796. package/packages/web/dist/viewer/views/architecture.d.ts +10 -0
  1797. package/packages/web/dist/viewer/views/architecture.js +44 -0
  1798. package/packages/web/dist/viewer/views/architecture.js.map +1 -0
  1799. package/packages/web/dist/viewer/views/call-graph.d.ts +20 -0
  1800. package/packages/web/dist/viewer/views/call-graph.js +1266 -0
  1801. package/packages/web/dist/viewer/views/call-graph.js.map +1 -0
  1802. package/packages/web/dist/viewer/views/domain-hench.d.ts +13 -0
  1803. package/packages/web/dist/viewer/views/domain-hench.js +14 -0
  1804. package/packages/web/dist/viewer/views/domain-hench.js.map +1 -0
  1805. package/packages/web/dist/viewer/views/domain-rex.d.ts +17 -0
  1806. package/packages/web/dist/viewer/views/domain-rex.js +18 -0
  1807. package/packages/web/dist/viewer/views/domain-rex.js.map +1 -0
  1808. package/packages/web/dist/viewer/views/domain-settings.d.ts +12 -0
  1809. package/packages/web/dist/viewer/views/domain-settings.js +13 -0
  1810. package/packages/web/dist/viewer/views/domain-settings.js.map +1 -0
  1811. package/packages/web/dist/viewer/views/domain-sourcevision.d.ts +20 -0
  1812. package/packages/web/dist/viewer/views/domain-sourcevision.js +21 -0
  1813. package/packages/web/dist/viewer/views/domain-sourcevision.js.map +1 -0
  1814. package/packages/web/dist/viewer/views/enrichment-thresholds.d.ts +11 -0
  1815. package/packages/web/dist/viewer/views/enrichment-thresholds.js +12 -0
  1816. package/packages/web/dist/viewer/views/enrichment-thresholds.js.map +1 -0
  1817. package/packages/web/dist/viewer/views/feature-toggles.d.ts +13 -0
  1818. package/packages/web/dist/viewer/views/feature-toggles.js +185 -0
  1819. package/packages/web/dist/viewer/views/feature-toggles.js.map +1 -0
  1820. package/packages/web/dist/viewer/views/files.d.ts +13 -0
  1821. package/packages/web/dist/viewer/views/files.js +174 -0
  1822. package/packages/web/dist/viewer/views/files.js.map +1 -0
  1823. package/packages/web/dist/viewer/views/graph.d.ts +12 -0
  1824. package/packages/web/dist/viewer/views/graph.js +316 -0
  1825. package/packages/web/dist/viewer/views/graph.js.map +1 -0
  1826. package/packages/web/dist/viewer/views/hench-config.d.ts +39 -0
  1827. package/packages/web/dist/viewer/views/hench-config.js +473 -0
  1828. package/packages/web/dist/viewer/views/hench-config.js.map +1 -0
  1829. package/packages/web/dist/viewer/views/hench-runs.d.ts +19 -0
  1830. package/packages/web/dist/viewer/views/hench-runs.js +460 -0
  1831. package/packages/web/dist/viewer/views/hench-runs.js.map +1 -0
  1832. package/packages/web/dist/viewer/views/hench-templates.d.ts +17 -0
  1833. package/packages/web/dist/viewer/views/hench-templates.js +262 -0
  1834. package/packages/web/dist/viewer/views/hench-templates.js.map +1 -0
  1835. package/packages/web/dist/viewer/views/integration-config.d.ts +73 -0
  1836. package/packages/web/dist/viewer/views/integration-config.js +524 -0
  1837. package/packages/web/dist/viewer/views/integration-config.js.map +1 -0
  1838. package/packages/web/dist/viewer/views/notion-config.d.ts +16 -0
  1839. package/packages/web/dist/viewer/views/notion-config.js +357 -0
  1840. package/packages/web/dist/viewer/views/notion-config.js.map +1 -0
  1841. package/packages/web/dist/viewer/views/overview.d.ts +10 -0
  1842. package/packages/web/dist/viewer/views/overview.js +187 -0
  1843. package/packages/web/dist/viewer/views/overview.js.map +1 -0
  1844. package/packages/web/dist/viewer/views/pr-markdown.d.ts +3 -0
  1845. package/packages/web/dist/viewer/views/pr-markdown.js +350 -0
  1846. package/packages/web/dist/viewer/views/pr-markdown.js.map +1 -0
  1847. package/packages/web/dist/viewer/views/prd.d.ts +34 -0
  1848. package/packages/web/dist/viewer/views/prd.js +257 -0
  1849. package/packages/web/dist/viewer/views/prd.js.map +1 -0
  1850. package/packages/web/dist/viewer/views/problems.d.ts +8 -0
  1851. package/packages/web/dist/viewer/views/problems.js +50 -0
  1852. package/packages/web/dist/viewer/views/problems.js.map +1 -0
  1853. package/packages/web/dist/viewer/views/rex-dashboard.d.ts +14 -0
  1854. package/packages/web/dist/viewer/views/rex-dashboard.js +334 -0
  1855. package/packages/web/dist/viewer/views/rex-dashboard.js.map +1 -0
  1856. package/packages/web/dist/viewer/views/routes.d.ts +8 -0
  1857. package/packages/web/dist/viewer/views/routes.js +216 -0
  1858. package/packages/web/dist/viewer/views/routes.js.map +1 -0
  1859. package/packages/web/dist/viewer/views/sourcevision-tabs.d.ts +18 -0
  1860. package/packages/web/dist/viewer/views/sourcevision-tabs.js +14 -0
  1861. package/packages/web/dist/viewer/views/sourcevision-tabs.js.map +1 -0
  1862. package/packages/web/dist/viewer/views/suggestions.d.ts +8 -0
  1863. package/packages/web/dist/viewer/views/suggestions.js +36 -0
  1864. package/packages/web/dist/viewer/views/suggestions.js.map +1 -0
  1865. package/packages/web/dist/viewer/views/task-audit.d.ts +18 -0
  1866. package/packages/web/dist/viewer/views/task-audit.js +413 -0
  1867. package/packages/web/dist/viewer/views/task-audit.js.map +1 -0
  1868. package/packages/web/dist/viewer/views/token-usage.d.ts +10 -0
  1869. package/packages/web/dist/viewer/views/token-usage.js +410 -0
  1870. package/packages/web/dist/viewer/views/token-usage.js.map +1 -0
  1871. package/packages/web/dist/viewer/views/validation.d.ts +11 -0
  1872. package/packages/web/dist/viewer/views/validation.js +475 -0
  1873. package/packages/web/dist/viewer/views/validation.js.map +1 -0
  1874. package/packages/web/dist/viewer/views/view-registry.d.ts +27 -0
  1875. package/packages/web/dist/viewer/views/view-registry.js +70 -0
  1876. package/packages/web/dist/viewer/views/view-registry.js.map +1 -0
  1877. package/packages/web/dist/viewer/views/workflow-optimization.d.ts +12 -0
  1878. package/packages/web/dist/viewer/views/workflow-optimization.js +311 -0
  1879. package/packages/web/dist/viewer/views/workflow-optimization.js.map +1 -0
  1880. package/packages/web/dist/viewer/views/zone-types.d.ts +69 -0
  1881. package/packages/web/dist/viewer/views/zone-types.js +5 -0
  1882. package/packages/web/dist/viewer/views/zone-types.js.map +1 -0
  1883. package/packages/web/dist/viewer/views/zones.d.ts +50 -0
  1884. package/packages/web/dist/viewer/views/zones.js +1438 -0
  1885. package/packages/web/dist/viewer/views/zones.js.map +1 -0
  1886. package/packages/web/dist/viewer/visualization/colors.d.ts +16 -0
  1887. package/packages/web/dist/viewer/visualization/colors.js +31 -0
  1888. package/packages/web/dist/viewer/visualization/colors.js.map +1 -0
  1889. package/packages/web/dist/viewer/visualization/flow.d.ts +54 -0
  1890. package/packages/web/dist/viewer/visualization/flow.js +123 -0
  1891. package/packages/web/dist/viewer/visualization/flow.js.map +1 -0
  1892. package/packages/web/dist/viewer/visualization/index.d.ts +34 -0
  1893. package/packages/web/dist/viewer/visualization/index.js +40 -0
  1894. package/packages/web/dist/viewer/visualization/index.js.map +1 -0
  1895. package/packages/web/dist/viewer/visualization/metrics.d.ts +8 -0
  1896. package/packages/web/dist/viewer/visualization/metrics.js +16 -0
  1897. package/packages/web/dist/viewer/visualization/metrics.js.map +1 -0
  1898. package/packages/web/package.json +53 -0
  1899. package/refresh-artifacts.js +54 -0
  1900. package/refresh-plan.js +79 -0
  1901. package/refresh-validate.js +175 -0
  1902. package/web.js +458 -0
@@ -0,0 +1,2403 @@
1
+ /**
2
+ * Rex API routes — CRUD for PRD items, tree stats, next task, and log entries.
3
+ *
4
+ * All endpoints are under /api/rex/.
5
+ *
6
+ * GET /api/rex/prd — full PRD document
7
+ * GET /api/rex/stats — tree stats (total, completed, etc.)
8
+ * GET /api/rex/dashboard — dashboard data (stats + per-epic + next task + priority dist)
9
+ * GET /api/rex/next — next actionable task
10
+ * GET /api/rex/items/:id — single item by ID
11
+ * POST /api/rex/items — add a new item
12
+ * PATCH /api/rex/items/:id — update item fields
13
+ * DELETE /api/rex/items/:id — remove item and all descendants
14
+ * PATCH /api/rex/items/bulk — bulk update multiple items
15
+ * POST /api/rex/items/merge — consolidate/merge sibling items
16
+ * GET /api/rex/prune/preview — preview items that would be pruned
17
+ * POST /api/rex/prune — execute prune (removes completed subtrees)
18
+ * POST /api/rex/analyze — trigger analysis (scan project)
19
+ * GET /api/rex/proposals — get pending proposals
20
+ * POST /api/rex/proposals/accept — accept pending proposals
21
+ * POST /api/rex/proposals/accept-edited — accept edited proposals (inline-edited data)
22
+ * POST /api/rex/smart-add-preview — generate proposals from natural language (real-time preview)
23
+ * POST /api/rex/batch-import — process multiple ideas from various sources with consolidated review
24
+ * GET /api/rex/log — execution log (?limit=N)
25
+ * GET /api/rex/items/:id/requirements — get requirements for item (own + inherited)
26
+ * POST /api/rex/items/:id/requirements — add a requirement to item
27
+ * PATCH /api/rex/items/:id/requirements/:rid — update a requirement
28
+ * DELETE /api/rex/items/:id/requirements/:rid — delete a requirement
29
+ * GET /api/rex/requirements/coverage — requirements coverage stats
30
+ * GET /api/rex/requirements/traceability — traceability matrix
31
+ * POST /api/rex/execute/epic-by-epic — start epic-by-epic execution
32
+ * GET /api/rex/execute/status — current execution state
33
+ * POST /api/rex/execute/pause — pause execution
34
+ * POST /api/rex/execute/resume — resume execution
35
+ */
36
+ import { readFileSync, writeFileSync, existsSync, appendFileSync, mkdtempSync, rmSync } from "node:fs";
37
+ import { tmpdir } from "node:os";
38
+ import { join } from "node:path";
39
+ import { randomUUID } from "node:crypto";
40
+ import { exec as foundationExec, spawnManaged, killWithFallback } from "@n-dx/llm-client";
41
+ import { jsonResponse, errorResponse, readBody } from "./types.js";
42
+ import { LEVEL_HIERARCHY, VALID_STATUSES, VALID_REQUIREMENT_CATEGORIES, VALID_VALIDATION_TYPES, CHILD_LEVEL, isPriority, isItemLevel, isRequirementCategory, isValidationType, findItem, walkTree, insertChild as rexInsertChild, updateInTree as rexUpdateInTree, removeFromTree, computeStats, findNextTask as rexFindNextTask, collectCompletedIds, computeTimestampUpdates, validateMerge, previewMerge, mergeItems, countSubtree, computeEpicStats, computePriorityDistribution, computeRequirementsSummary, isRootLevel, isWorkItem, computeHealthScore, detectReorganizations, applyProposals, applyReshape, } from "./rex-gateway.js";
43
+ const REX_PREFIX = "/api/rex/";
44
+ /**
45
+ * API-settable statuses — excludes "deleted" from the canonical set.
46
+ * Deleted items shouldn't be settable via the API.
47
+ */
48
+ const API_SETTABLE_STATUSES = new Set([...VALID_STATUSES].filter((s) => s !== "deleted"));
49
+ // ---------------------------------------------------------------------------
50
+ // Thin wrappers over canonical rex functions
51
+ // ---------------------------------------------------------------------------
52
+ // These adapt the rex API to the patterns used throughout this file.
53
+ // The underlying logic lives in rex — no duplication.
54
+ /** Find an item by ID, returning just the item (or null). */
55
+ function findItemById(items, id) {
56
+ const entry = findItem(items, id);
57
+ return entry ? entry.item : null;
58
+ }
59
+ /**
60
+ * Insert a child under a parent. Skips rex's hierarchy validation since the
61
+ * web API validates level separately and some batch-import paths construct
62
+ * items with the correct level pre-set.
63
+ */
64
+ function insertChild(items, parentId, child) {
65
+ return rexInsertChild(items, parentId, child);
66
+ }
67
+ /**
68
+ * Update an item in the tree, automatically applying timestamp transitions
69
+ * (startedAt / completedAt) via the canonical `computeTimestampUpdates`.
70
+ */
71
+ function updateInTree(items, id, updates) {
72
+ // Auto-apply timestamps when status changes
73
+ if (updates.status) {
74
+ const existing = findItemById(items, id);
75
+ if (existing && existing.status !== updates.status) {
76
+ const tsUpdates = computeTimestampUpdates(existing.status, updates.status, existing);
77
+ Object.assign(updates, tsUpdates);
78
+ }
79
+ }
80
+ return rexUpdateInTree(items, id, updates);
81
+ }
82
+ /** Find the next actionable task, returning just the item (or null). */
83
+ function findNextTask(items, completedIds) {
84
+ const entry = rexFindNextTask(items, completedIds);
85
+ return entry ? entry.item : null;
86
+ }
87
+ /** Load and parse prd.json. Returns null if not found. */
88
+ function loadPRD(ctx) {
89
+ const prdPath = join(ctx.rexDir, "prd.json");
90
+ if (!existsSync(prdPath))
91
+ return null;
92
+ try {
93
+ return JSON.parse(readFileSync(prdPath, "utf-8"));
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ /** Save prd.json. */
100
+ function savePRD(ctx, doc) {
101
+ const prdPath = join(ctx.rexDir, "prd.json");
102
+ writeFileSync(prdPath, JSON.stringify(doc, null, 2) + "\n");
103
+ }
104
+ // EpicStats, PriorityDistribution, RequirementsSummary types and functions
105
+ // are imported from rex via the gateway (domain-gateway.ts).
106
+ // ---------------------------------------------------------------------------
107
+ // Sub-routers — each handles a focused domain area within the Rex API.
108
+ // The main handleRexRoute dispatcher tries each in turn.
109
+ // ---------------------------------------------------------------------------
110
+ /** PRD read routes: prd, stats, dashboard, next, log. */
111
+ function routePrdReads(url, path, method, res, ctx) {
112
+ // GET /api/rex/prd — full PRD document
113
+ if (path === "prd" && method === "GET") {
114
+ const doc = loadPRD(ctx);
115
+ if (!doc) {
116
+ errorResponse(res, 404, "No PRD data found");
117
+ return true;
118
+ }
119
+ jsonResponse(res, 200, doc);
120
+ return true;
121
+ }
122
+ // GET /api/rex/stats — tree stats
123
+ if (path === "stats" && method === "GET") {
124
+ const doc = loadPRD(ctx);
125
+ if (!doc) {
126
+ errorResponse(res, 404, "No PRD data found");
127
+ return true;
128
+ }
129
+ const stats = computeStats(doc.items);
130
+ jsonResponse(res, 200, {
131
+ title: doc.title,
132
+ stats,
133
+ percentComplete: stats.total > 0
134
+ ? Math.round((stats.completed / stats.total) * 100)
135
+ : 0,
136
+ });
137
+ return true;
138
+ }
139
+ // GET /api/rex/dashboard — dashboard data (overall + per-epic + next task + priority distribution)
140
+ if (path === "dashboard" && method === "GET") {
141
+ const doc = loadPRD(ctx);
142
+ if (!doc) {
143
+ errorResponse(res, 404, "No PRD data found");
144
+ return true;
145
+ }
146
+ const stats = computeStats(doc.items);
147
+ const completedIds = collectCompletedIds(doc.items);
148
+ const next = findNextTask(doc.items, completedIds);
149
+ const epics = computeEpicStats(doc.items);
150
+ const priorities = computePriorityDistribution(doc.items);
151
+ const reqSummary = computeRequirementsSummary(doc.items);
152
+ jsonResponse(res, 200, {
153
+ title: doc.title,
154
+ stats,
155
+ percentComplete: stats.total > 0
156
+ ? Math.round((stats.completed / stats.total) * 100)
157
+ : 0,
158
+ epics,
159
+ nextTask: next,
160
+ priorities,
161
+ requirements: reqSummary,
162
+ });
163
+ return true;
164
+ }
165
+ // GET /api/rex/next — next actionable task
166
+ if (path === "next" && method === "GET") {
167
+ const doc = loadPRD(ctx);
168
+ if (!doc) {
169
+ errorResponse(res, 404, "No PRD data found");
170
+ return true;
171
+ }
172
+ const completedIds = collectCompletedIds(doc.items);
173
+ const next = findNextTask(doc.items, completedIds);
174
+ if (!next) {
175
+ jsonResponse(res, 200, { task: null, message: "All tasks completed or blocked" });
176
+ return true;
177
+ }
178
+ jsonResponse(res, 200, { task: next });
179
+ return true;
180
+ }
181
+ // GET /api/rex/log — execution log
182
+ if (path === "log" && method === "GET") {
183
+ const logPath = join(ctx.rexDir, "execution-log.jsonl");
184
+ if (!existsSync(logPath)) {
185
+ jsonResponse(res, 200, { entries: [] });
186
+ return true;
187
+ }
188
+ try {
189
+ const raw = readFileSync(logPath, "utf-8");
190
+ const lines = raw.trim().split("\n").filter(Boolean);
191
+ // Parse limit from query string
192
+ const queryIdx = url.indexOf("?");
193
+ let limit = 0;
194
+ if (queryIdx !== -1) {
195
+ const params = new URLSearchParams(url.slice(queryIdx));
196
+ const limitStr = params.get("limit");
197
+ if (limitStr)
198
+ limit = parseInt(limitStr, 10);
199
+ }
200
+ const entries = lines
201
+ .map((line) => { try {
202
+ return JSON.parse(line);
203
+ }
204
+ catch {
205
+ return null;
206
+ } })
207
+ .filter(Boolean);
208
+ const result = limit > 0 ? entries.slice(-limit) : entries;
209
+ jsonResponse(res, 200, { entries: result });
210
+ }
211
+ catch {
212
+ jsonResponse(res, 200, { entries: [] });
213
+ }
214
+ return true;
215
+ }
216
+ return false;
217
+ }
218
+ /** Item CRUD routes: add, get, patch, bulk update, merge. */
219
+ function routeItems(path, method, req, res, ctx, broadcast) {
220
+ // POST /api/rex/items — add a new item
221
+ if (path === "items" && method === "POST") {
222
+ return handleItemAdd(req, res, ctx, broadcast);
223
+ }
224
+ // PATCH /api/rex/items/bulk — bulk status update
225
+ if (path === "items/bulk" && method === "PATCH") {
226
+ return handleBulkUpdate(req, res, ctx, broadcast);
227
+ }
228
+ // POST /api/rex/items/merge — consolidate/merge sibling items
229
+ if (path === "items/merge" && method === "POST") {
230
+ return handleItemMerge(req, res, ctx, broadcast);
231
+ }
232
+ // Routes under /api/rex/items/:id
233
+ const itemsMatch = path.match(/^items\/([^/?]+)/);
234
+ if (itemsMatch) {
235
+ const itemId = itemsMatch[1];
236
+ // Requirements sub-routes: /api/rex/items/:id/requirements[/:reqId]
237
+ const reqResult = routeItemRequirements(path, method, req, res, ctx, itemId, broadcast);
238
+ if (reqResult !== false)
239
+ return reqResult;
240
+ // GET /api/rex/items/:id — single item
241
+ if (method === "GET") {
242
+ const doc = loadPRD(ctx);
243
+ if (!doc) {
244
+ errorResponse(res, 404, "No PRD data found");
245
+ return true;
246
+ }
247
+ const item = findItemById(doc.items, itemId);
248
+ if (!item) {
249
+ errorResponse(res, 404, `Item "${itemId}" not found`);
250
+ return true;
251
+ }
252
+ jsonResponse(res, 200, item);
253
+ return true;
254
+ }
255
+ // PATCH /api/rex/items/:id — update item
256
+ if (method === "PATCH") {
257
+ return handleItemPatch(req, res, ctx, itemId, broadcast);
258
+ }
259
+ // DELETE /api/rex/items/:id — remove item and all descendants
260
+ if (method === "DELETE") {
261
+ return handleItemDelete(res, ctx, itemId, broadcast);
262
+ }
263
+ }
264
+ return false;
265
+ }
266
+ /** Item requirements sub-routes: CRUD on /api/rex/items/:id/requirements. */
267
+ function routeItemRequirements(path, method, req, res, ctx, itemId, broadcast) {
268
+ const reqSubMatch = path.match(/^items\/[^/?]+\/requirements(?:\/([^/?]+))?$/);
269
+ if (!reqSubMatch)
270
+ return false;
271
+ const reqId = reqSubMatch[1]; // undefined for collection routes
272
+ // GET /api/rex/items/:id/requirements — list requirements (own + inherited)
273
+ if (method === "GET" && !reqId) {
274
+ return handleGetRequirements(res, ctx, itemId);
275
+ }
276
+ // POST /api/rex/items/:id/requirements — add a requirement
277
+ if (method === "POST" && !reqId) {
278
+ return handleAddRequirement(req, res, ctx, itemId, broadcast);
279
+ }
280
+ // PATCH /api/rex/items/:id/requirements/:reqId — update a requirement
281
+ if (method === "PATCH" && reqId) {
282
+ return handleUpdateRequirement(req, res, ctx, itemId, reqId, broadcast);
283
+ }
284
+ // DELETE /api/rex/items/:id/requirements/:reqId — delete a requirement
285
+ if (method === "DELETE" && reqId) {
286
+ return handleDeleteRequirement(res, ctx, itemId, reqId, broadcast);
287
+ }
288
+ return false;
289
+ }
290
+ /** Requirements coverage & traceability top-level routes. */
291
+ function routeRequirementsAnalytics(path, method, res, ctx) {
292
+ if (path === "requirements/coverage" && method === "GET") {
293
+ return handleRequirementsCoverage(res, ctx);
294
+ }
295
+ if (path === "requirements/traceability" && method === "GET") {
296
+ return handleRequirementsTraceability(res, ctx);
297
+ }
298
+ return false;
299
+ }
300
+ /** Prune routes: preview and execute. */
301
+ function routePrune(path, method, req, res, ctx, broadcast) {
302
+ // GET /api/rex/prune/preview — preview prunable items (supports criteria params)
303
+ if (path === "prune/preview" && method === "GET") {
304
+ return handlePrunePreview(req, res, ctx);
305
+ }
306
+ // POST /api/rex/prune — execute prune with optional backup
307
+ if (path === "prune" && method === "POST") {
308
+ return handlePruneExecute(req, res, ctx, broadcast);
309
+ }
310
+ return false;
311
+ }
312
+ /** Analysis and proposal routes: analyze, proposals, smart-add, batch-import. */
313
+ function routeProposals(path, method, req, res, ctx, broadcast) {
314
+ // POST /api/rex/analyze — trigger analysis
315
+ if (path === "analyze" && method === "POST") {
316
+ return handleAnalyze(req, res, ctx, broadcast);
317
+ }
318
+ // GET /api/rex/proposals — get pending proposals
319
+ if (path === "proposals" && method === "GET") {
320
+ return handleGetProposals(res, ctx);
321
+ }
322
+ // POST /api/rex/proposals/accept — accept pending proposals
323
+ if (path === "proposals/accept" && method === "POST") {
324
+ return handleAcceptProposals(req, res, ctx, broadcast);
325
+ }
326
+ // POST /api/rex/proposals/accept-edited — accept edited proposals (inline-edited data)
327
+ if (path === "proposals/accept-edited" && method === "POST") {
328
+ return handleAcceptEditedProposals(req, res, ctx, broadcast);
329
+ }
330
+ // POST /api/rex/smart-add-preview — generate proposals from natural language (real-time preview)
331
+ if (path === "smart-add-preview" && method === "POST") {
332
+ return handleSmartAddPreview(req, res, ctx);
333
+ }
334
+ // POST /api/rex/batch-import — process multiple ideas from various sources
335
+ if (path === "batch-import" && method === "POST") {
336
+ return handleBatchImport(req, res, ctx, broadcast);
337
+ }
338
+ return false;
339
+ }
340
+ /** Execution routes: epic-by-epic, status, pause, resume. */
341
+ function routeExecution(path, method, req, res, ctx, broadcast) {
342
+ // POST /api/rex/execute/epic-by-epic — start epic-by-epic execution
343
+ if (path === "execute/epic-by-epic" && method === "POST") {
344
+ return handleStartEpicByEpic(req, res, ctx, broadcast);
345
+ }
346
+ // GET /api/rex/execute/status — current execution state
347
+ if (path === "execute/status" && method === "GET") {
348
+ return handleExecutionStatus(res);
349
+ }
350
+ // POST /api/rex/execute/pause — pause execution
351
+ if (path === "execute/pause" && method === "POST") {
352
+ return handleExecutionPause(res, broadcast);
353
+ }
354
+ // POST /api/rex/execute/resume — resume execution
355
+ if (path === "execute/resume" && method === "POST") {
356
+ return handleExecutionResume(res, ctx, broadcast);
357
+ }
358
+ return false;
359
+ }
360
+ /** Health and reorganize routes. */
361
+ function routeHealthReorganize(path, method, req, res, ctx, broadcast) {
362
+ // GET /api/rex/health — structure health score
363
+ if (path === "health" && method === "GET") {
364
+ const doc = loadPRD(ctx);
365
+ if (!doc) {
366
+ errorResponse(res, 404, "No PRD data found");
367
+ return true;
368
+ }
369
+ const health = computeHealthScore(doc.items);
370
+ jsonResponse(res, 200, health);
371
+ return true;
372
+ }
373
+ // GET /api/rex/reorganize — detect reorganization proposals
374
+ // Query params: mode=fast|full (default: full)
375
+ if (path === "reorganize" && method === "GET") {
376
+ return (async () => {
377
+ const doc = loadPRD(ctx);
378
+ if (!doc) {
379
+ errorResponse(res, 404, "No PRD data found");
380
+ return true;
381
+ }
382
+ if (doc.items.length === 0) {
383
+ jsonResponse(res, 200, { structural: { proposals: [], stats: {} }, llm: [] });
384
+ return true;
385
+ }
386
+ const urlObj = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
387
+ const mode = urlObj.searchParams.get("mode") ?? "full";
388
+ const plan = detectReorganizations(doc.items);
389
+ const structural = {
390
+ proposals: plan.proposals.map((p) => ({
391
+ id: p.id,
392
+ type: p.type,
393
+ description: p.description,
394
+ risk: p.risk,
395
+ confidence: p.confidence,
396
+ items: p.items,
397
+ })),
398
+ stats: plan.stats,
399
+ };
400
+ let llm = [];
401
+ if (mode !== "fast") {
402
+ try {
403
+ const { reasonForReshape } = await import("./rex-gateway.js");
404
+ const { proposals } = await reasonForReshape(doc.items, { dir: ctx.projectDir });
405
+ llm = proposals.map((p) => ({
406
+ id: p.id,
407
+ action: p.action.action,
408
+ reason: p.action.reason,
409
+ }));
410
+ }
411
+ catch {
412
+ // LLM unavailable — return structural only
413
+ }
414
+ }
415
+ jsonResponse(res, 200, { structural, llm });
416
+ return true;
417
+ })();
418
+ }
419
+ // POST /api/rex/reorganize/apply — apply selected proposals
420
+ // Body: { proposalIds?: number[], llmProposalIds?: string[] }
421
+ if (path === "reorganize/apply" && method === "POST") {
422
+ return (async () => {
423
+ const doc = loadPRD(ctx);
424
+ if (!doc) {
425
+ errorResponse(res, 404, "No PRD data found");
426
+ return true;
427
+ }
428
+ const body = await readBody(req);
429
+ let proposalIds;
430
+ let llmProposalIds;
431
+ try {
432
+ const parsed = JSON.parse(body);
433
+ proposalIds = parsed.proposalIds ?? [];
434
+ llmProposalIds = parsed.llmProposalIds ?? [];
435
+ }
436
+ catch {
437
+ errorResponse(res, 400, "Invalid JSON body");
438
+ return true;
439
+ }
440
+ let structuralApplied = 0;
441
+ let structuralFailed = 0;
442
+ // Apply structural proposals
443
+ if (proposalIds.length > 0 || (llmProposalIds.length === 0 && proposalIds.length === 0)) {
444
+ const plan = detectReorganizations(doc.items);
445
+ const toApply = proposalIds.length > 0
446
+ ? plan.proposals.filter((p) => proposalIds.includes(p.id))
447
+ : plan.proposals.filter((p) => p.risk === "low");
448
+ if (toApply.length > 0) {
449
+ const result = applyProposals(doc.items, toApply);
450
+ structuralApplied = result.applied;
451
+ structuralFailed = result.failed;
452
+ }
453
+ }
454
+ // Apply LLM proposals
455
+ let llmApplied = 0;
456
+ let llmFailed = 0;
457
+ if (llmProposalIds.length > 0) {
458
+ try {
459
+ const { reasonForReshape } = await import("./rex-gateway.js");
460
+ const { proposals } = await reasonForReshape(doc.items, { dir: ctx.projectDir });
461
+ const toApply = proposals.filter((p) => llmProposalIds.includes(p.id));
462
+ if (toApply.length > 0) {
463
+ const reshapeResult = applyReshape(doc.items, toApply);
464
+ llmApplied = reshapeResult.applied.length;
465
+ llmFailed = reshapeResult.errors.length;
466
+ }
467
+ }
468
+ catch {
469
+ // LLM unavailable
470
+ }
471
+ }
472
+ const totalApplied = structuralApplied + llmApplied;
473
+ if (totalApplied > 0) {
474
+ savePRD(ctx, doc);
475
+ if (broadcast)
476
+ broadcast({ type: "rex:prd-changed", source: "reorganize" });
477
+ }
478
+ jsonResponse(res, 200, {
479
+ applied: totalApplied,
480
+ failed: structuralFailed + llmFailed,
481
+ structuralApplied,
482
+ llmApplied,
483
+ });
484
+ return true;
485
+ })();
486
+ }
487
+ return false;
488
+ }
489
+ /**
490
+ * Handle Rex API requests. Returns true if the request was handled.
491
+ *
492
+ * Delegates to focused sub-routers for each domain area:
493
+ * - PRD reads (prd, stats, dashboard, next, log)
494
+ * - Item CRUD (add, get, patch, bulk, merge)
495
+ * - Requirements (item requirements CRUD, coverage, traceability)
496
+ * - Prune (preview, execute)
497
+ * - Proposals (analyze, proposals, smart-add, batch-import)
498
+ * - Execution (epic-by-epic, status, pause, resume)
499
+ * - Health & reorganize (health score, proposals, apply)
500
+ */
501
+ export function handleRexRoute(req, res, ctx, broadcast) {
502
+ const url = req.url || "/";
503
+ const method = req.method || "GET";
504
+ if (!url.startsWith(REX_PREFIX))
505
+ return false;
506
+ const fullPath = url.slice(REX_PREFIX.length);
507
+ const qIdx = fullPath.indexOf("?");
508
+ const path = qIdx === -1 ? fullPath : fullPath.slice(0, qIdx);
509
+ // Try each sub-router in turn. The first to return non-false wins.
510
+ const prdResult = routePrdReads(url, path, method, res, ctx);
511
+ if (prdResult !== false)
512
+ return prdResult;
513
+ const itemsResult = routeItems(path, method, req, res, ctx, broadcast);
514
+ if (itemsResult !== false)
515
+ return itemsResult;
516
+ const reqAnalyticsResult = routeRequirementsAnalytics(path, method, res, ctx);
517
+ if (reqAnalyticsResult !== false)
518
+ return reqAnalyticsResult;
519
+ const pruneResult = routePrune(path, method, req, res, ctx, broadcast);
520
+ if (pruneResult !== false)
521
+ return pruneResult;
522
+ const proposalResult = routeProposals(path, method, req, res, ctx, broadcast);
523
+ if (proposalResult !== false)
524
+ return proposalResult;
525
+ const execResult = routeExecution(path, method, req, res, ctx, broadcast);
526
+ if (execResult !== false)
527
+ return execResult;
528
+ const healthResult = routeHealthReorganize(path, method, req, res, ctx, broadcast);
529
+ if (healthResult !== false)
530
+ return healthResult;
531
+ return false;
532
+ }
533
+ /** Handle PATCH /api/rex/items/:id */
534
+ async function handleItemPatch(req, res, ctx, itemId, broadcast) {
535
+ const doc = loadPRD(ctx);
536
+ if (!doc) {
537
+ errorResponse(res, 404, "No PRD data found");
538
+ return true;
539
+ }
540
+ try {
541
+ const body = await readBody(req);
542
+ const updates = JSON.parse(body);
543
+ if (!updateInTree(doc.items, itemId, updates)) {
544
+ errorResponse(res, 404, `Item "${itemId}" not found`);
545
+ return true;
546
+ }
547
+ savePRD(ctx, doc);
548
+ // Broadcast change to connected WebSocket clients
549
+ if (broadcast) {
550
+ broadcast({
551
+ type: "rex:item-updated",
552
+ itemId,
553
+ updates,
554
+ timestamp: new Date().toISOString(),
555
+ });
556
+ }
557
+ jsonResponse(res, 200, { ok: true });
558
+ }
559
+ catch (err) {
560
+ errorResponse(res, 400, String(err));
561
+ }
562
+ return true;
563
+ }
564
+ /** Handle DELETE /api/rex/items/:id — remove item and all descendants */
565
+ function handleItemDelete(res, ctx, itemId, broadcast) {
566
+ const doc = loadPRD(ctx);
567
+ if (!doc) {
568
+ errorResponse(res, 404, "No PRD data found");
569
+ return true;
570
+ }
571
+ const item = findItemById(doc.items, itemId);
572
+ if (!item) {
573
+ errorResponse(res, 404, `Item "${itemId}" not found`);
574
+ return true;
575
+ }
576
+ const title = item.title;
577
+ const level = item.level;
578
+ const removed = removeFromTree(doc.items, itemId);
579
+ if (!removed) {
580
+ errorResponse(res, 404, `Item "${itemId}" could not be removed`);
581
+ return true;
582
+ }
583
+ savePRD(ctx, doc);
584
+ // Append log entry
585
+ const logPath = join(ctx.rexDir, "execution-log.jsonl");
586
+ const logEntry = {
587
+ timestamp: new Date().toISOString(),
588
+ event: "item_deleted",
589
+ itemId,
590
+ detail: `Deleted ${level} "${title}" and its descendants (via web)`,
591
+ };
592
+ try {
593
+ appendFileSync(logPath, JSON.stringify(logEntry) + "\n");
594
+ }
595
+ catch {
596
+ // Non-fatal — log file may not exist yet
597
+ }
598
+ // Broadcast change to connected WebSocket clients
599
+ if (broadcast) {
600
+ const timestamp = new Date().toISOString();
601
+ broadcast({
602
+ type: "rex:item-deleted",
603
+ itemId,
604
+ level,
605
+ title,
606
+ timestamp,
607
+ });
608
+ // Also broadcast generic prd-changed so sidebar status indicators refresh
609
+ broadcast({
610
+ type: "rex:prd-changed",
611
+ timestamp,
612
+ });
613
+ }
614
+ jsonResponse(res, 200, { ok: true, id: itemId, level, title });
615
+ return true;
616
+ }
617
+ /** Handle POST /api/rex/items — add a new item */
618
+ async function handleItemAdd(req, res, ctx, broadcast) {
619
+ const doc = loadPRD(ctx);
620
+ if (!doc) {
621
+ errorResponse(res, 404, "No PRD data found");
622
+ return true;
623
+ }
624
+ try {
625
+ const body = await readBody(req);
626
+ const input = JSON.parse(body);
627
+ if (!input.title || input.title.trim().length === 0) {
628
+ errorResponse(res, 400, "Missing required field: title");
629
+ return true;
630
+ }
631
+ const parentId = input.parentId;
632
+ // Resolve level: explicit > inferred from parent > default to epic
633
+ let level;
634
+ if (input.level && isItemLevel(input.level)) {
635
+ level = input.level;
636
+ }
637
+ else if (parentId) {
638
+ const parent = findItemById(doc.items, parentId);
639
+ if (!parent) {
640
+ errorResponse(res, 400, `Parent "${parentId}" not found`);
641
+ return true;
642
+ }
643
+ const parentLevel = parent.level;
644
+ const inferred = isItemLevel(parentLevel) ? CHILD_LEVEL[parentLevel] : undefined;
645
+ if (!inferred) {
646
+ errorResponse(res, 400, `Cannot infer child level for parent type "${parentLevel}"`);
647
+ return true;
648
+ }
649
+ level = inferred;
650
+ }
651
+ else {
652
+ level = "epic";
653
+ }
654
+ // Validate parent-child level relationship
655
+ const allowedParents = isItemLevel(level) ? LEVEL_HIERARCHY[level] : undefined;
656
+ if (!allowedParents) {
657
+ errorResponse(res, 400, `Unknown level: "${level}"`);
658
+ return true;
659
+ }
660
+ const canBeRoot = allowedParents.includes(null);
661
+ if (!canBeRoot && !parentId) {
662
+ const parentNames = allowedParents.filter((p) => p !== null).join(" or ");
663
+ errorResponse(res, 400, `A ${level} requires a parent (${parentNames})`);
664
+ return true;
665
+ }
666
+ if (parentId) {
667
+ const parent = findItemById(doc.items, parentId);
668
+ if (!parent) {
669
+ errorResponse(res, 400, `Parent "${parentId}" not found`);
670
+ return true;
671
+ }
672
+ const allowedParentLevels = allowedParents.filter((p) => p !== null);
673
+ if (allowedParentLevels.length > 0 && !allowedParentLevels.includes(parent.level)) {
674
+ errorResponse(res, 400, `A ${level} must be a child of a ${allowedParentLevels.join(" or ")}, not a ${parent.level}`);
675
+ return true;
676
+ }
677
+ }
678
+ const id = randomUUID();
679
+ const item = {
680
+ id,
681
+ title: input.title.trim(),
682
+ status: "pending",
683
+ level,
684
+ };
685
+ if (input.description)
686
+ item.description = input.description;
687
+ if (input.priority && isPriority(input.priority))
688
+ item.priority = input.priority;
689
+ if (input.tags && Array.isArray(input.tags))
690
+ item.tags = input.tags;
691
+ if (input.acceptanceCriteria && Array.isArray(input.acceptanceCriteria)) {
692
+ item.acceptanceCriteria = input.acceptanceCriteria;
693
+ }
694
+ if (parentId) {
695
+ insertChild(doc.items, parentId, item);
696
+ }
697
+ else {
698
+ doc.items.push(item);
699
+ }
700
+ savePRD(ctx, doc);
701
+ // Log the addition
702
+ appendLog(ctx, {
703
+ timestamp: new Date().toISOString(),
704
+ event: "item_added",
705
+ itemId: id,
706
+ detail: `Added ${level}: ${item.title} (via web)`,
707
+ });
708
+ if (broadcast) {
709
+ broadcast({
710
+ type: "rex:prd-changed",
711
+ timestamp: new Date().toISOString(),
712
+ });
713
+ }
714
+ jsonResponse(res, 201, { ok: true, id, level, title: item.title });
715
+ }
716
+ catch (err) {
717
+ errorResponse(res, 400, String(err));
718
+ }
719
+ return true;
720
+ }
721
+ /** Handle PATCH /api/rex/items/bulk — bulk status update */
722
+ async function handleBulkUpdate(req, res, ctx, broadcast) {
723
+ const doc = loadPRD(ctx);
724
+ if (!doc) {
725
+ errorResponse(res, 404, "No PRD data found");
726
+ return true;
727
+ }
728
+ try {
729
+ const body = await readBody(req);
730
+ const input = JSON.parse(body);
731
+ if (!Array.isArray(input.ids) || input.ids.length === 0) {
732
+ errorResponse(res, 400, "Missing required field: ids (array of item IDs)");
733
+ return true;
734
+ }
735
+ if (!input.updates || typeof input.updates !== "object") {
736
+ errorResponse(res, 400, "Missing required field: updates");
737
+ return true;
738
+ }
739
+ // Validate status if provided
740
+ if (input.updates.status && !API_SETTABLE_STATUSES.has(input.updates.status)) {
741
+ errorResponse(res, 400, `Invalid status: ${input.updates.status}`);
742
+ return true;
743
+ }
744
+ const results = [];
745
+ for (const id of input.ids) {
746
+ // Clone updates for each item to get independent timestamps
747
+ const itemUpdates = { ...input.updates };
748
+ if (updateInTree(doc.items, id, itemUpdates)) {
749
+ results.push({ id, ok: true });
750
+ }
751
+ else {
752
+ results.push({ id, ok: false, error: "not found" });
753
+ }
754
+ }
755
+ savePRD(ctx, doc);
756
+ // Log the bulk update
757
+ const successCount = results.filter((r) => r.ok).length;
758
+ appendLog(ctx, {
759
+ timestamp: new Date().toISOString(),
760
+ event: "bulk_update",
761
+ detail: `Bulk updated ${successCount}/${input.ids.length} items (via web)`,
762
+ });
763
+ if (broadcast) {
764
+ broadcast({
765
+ type: "rex:prd-changed",
766
+ timestamp: new Date().toISOString(),
767
+ });
768
+ }
769
+ jsonResponse(res, 200, { ok: true, results });
770
+ }
771
+ catch (err) {
772
+ errorResponse(res, 400, String(err));
773
+ }
774
+ return true;
775
+ }
776
+ // Merge functions (validateMerge, previewMerge, mergeItems) are imported
777
+ // from rex via the gateway (domain-gateway.ts).
778
+ /** Extract the parent ID from a TreeEntry's parent chain. */
779
+ function parentIdOf(entry) {
780
+ return entry.parents.length > 0 ? entry.parents[entry.parents.length - 1].id : null;
781
+ }
782
+ /** Handle POST /api/rex/items/merge — consolidate/merge sibling items */
783
+ async function handleItemMerge(req, res, ctx, broadcast) {
784
+ const doc = loadPRD(ctx);
785
+ if (!doc) {
786
+ errorResponse(res, 404, "No PRD data found");
787
+ return true;
788
+ }
789
+ try {
790
+ const body = await readBody(req);
791
+ const input = JSON.parse(body);
792
+ if (!Array.isArray(input.sourceIds) || input.sourceIds.length < 2) {
793
+ errorResponse(res, 400, "sourceIds must be an array of at least 2 item IDs");
794
+ return true;
795
+ }
796
+ if (!input.targetId || typeof input.targetId !== "string") {
797
+ errorResponse(res, 400, "targetId is required");
798
+ return true;
799
+ }
800
+ const validation = validateMerge(doc.items, input.sourceIds, input.targetId);
801
+ if (!validation.valid) {
802
+ errorResponse(res, 400, validation.error);
803
+ return true;
804
+ }
805
+ const options = {
806
+ ...(input.title ? { title: input.title } : {}),
807
+ ...(input.description !== undefined ? { description: input.description } : {}),
808
+ };
809
+ // Preview mode
810
+ if (input.preview) {
811
+ const preview = previewMerge(doc.items, input.sourceIds, input.targetId, options);
812
+ jsonResponse(res, 200, { ok: true, preview });
813
+ return true;
814
+ }
815
+ // Execute merge
816
+ const result = mergeItems(doc.items, input.sourceIds, input.targetId, options);
817
+ savePRD(ctx, doc);
818
+ // Log the merge
819
+ appendLog(ctx, {
820
+ timestamp: new Date().toISOString(),
821
+ event: "items_merged",
822
+ itemId: input.targetId,
823
+ detail: `Merged ${input.sourceIds.length} items into "${input.targetId}". Absorbed: ${result.absorbedIds.join(", ")}. ${result.reparentedChildIds.length} children reparented, ${result.rewrittenDependencyCount} dependency refs rewritten (via web).`,
824
+ });
825
+ if (broadcast) {
826
+ broadcast({
827
+ type: "rex:prd-changed",
828
+ timestamp: new Date().toISOString(),
829
+ });
830
+ }
831
+ jsonResponse(res, 200, { ok: true, ...result });
832
+ }
833
+ catch (err) {
834
+ errorResponse(res, 400, String(err));
835
+ }
836
+ return true;
837
+ }
838
+ // Prune functions (isFullyCompleted, countSubtree, findPrunableItems, pruneItems)
839
+ // are imported from rex via the gateway (domain-gateway.ts).
840
+ /**
841
+ * Remove specific subtrees by ID from the item tree.
842
+ * Web-specific variant for criteria-based pruning where items are pre-identified.
843
+ */
844
+ function pruneItemsByIds(items, ids) {
845
+ const pruned = [];
846
+ let prunedCount = 0;
847
+ for (let i = items.length - 1; i >= 0; i--) {
848
+ const item = items[i];
849
+ if (ids.has(item.id)) {
850
+ pruned.unshift(item);
851
+ prunedCount += countSubtree(item);
852
+ items.splice(i, 1);
853
+ }
854
+ else if (Array.isArray(item.children) && item.children.length > 0) {
855
+ const childResult = pruneItemsByIds(item.children, ids);
856
+ pruned.push(...childResult.pruned);
857
+ prunedCount += childResult.prunedCount;
858
+ }
859
+ }
860
+ return { pruned, prunedCount };
861
+ }
862
+ /** Summarize a prunable item for API response. */
863
+ function summarizeItem(item) {
864
+ return {
865
+ id: item.id,
866
+ title: item.title,
867
+ level: item.level,
868
+ status: item.status,
869
+ childCount: Array.isArray(item.children) ? item.children.length : 0,
870
+ totalCount: countSubtree(item),
871
+ ...(item.completedAt ? { completedAt: item.completedAt } : {}),
872
+ };
873
+ }
874
+ const DEFAULT_PRUNE_CRITERIA = {
875
+ minAgeDays: 0,
876
+ statuses: ["completed"],
877
+ };
878
+ /**
879
+ * Check whether an item matches the pruning criteria.
880
+ *
881
+ * An item is eligible if:
882
+ * - Its status (and all descendants') is in the criteria statuses
883
+ * - It was completed at least `minAgeDays` ago (if completedAt is set)
884
+ */
885
+ function matchesPruneCriteria(item, criteria, now) {
886
+ // Status check
887
+ if (!criteria.statuses.includes(item.status))
888
+ return false;
889
+ // Age check — only applies when minAgeDays > 0 and completedAt is present
890
+ if (criteria.minAgeDays > 0 && item.completedAt) {
891
+ const completedAt = new Date(item.completedAt);
892
+ const ageMs = now.getTime() - completedAt.getTime();
893
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
894
+ if (ageDays < criteria.minAgeDays)
895
+ return false;
896
+ }
897
+ // All children must also match
898
+ if (Array.isArray(item.children) && item.children.length > 0) {
899
+ return item.children.every((child) => matchesPruneCriteria(child, criteria, now));
900
+ }
901
+ return true;
902
+ }
903
+ /**
904
+ * Find top-level prunable subtrees applying criteria.
905
+ * Like findPrunableItems but uses criteria matching instead of isFullyCompleted.
906
+ */
907
+ function findPrunableWithCriteria(items, criteria, now) {
908
+ const prunable = [];
909
+ for (const entry of walkTree(items)) {
910
+ if (!matchesPruneCriteria(entry.item, criteria, now))
911
+ continue;
912
+ // Skip items whose parent also matches (they'd be pruned as part of parent)
913
+ const pid = parentIdOf(entry);
914
+ const parent = pid ? findItemById(items, pid) : null;
915
+ if (parent && matchesPruneCriteria(parent, criteria, now))
916
+ continue;
917
+ prunable.push(entry.item);
918
+ }
919
+ return prunable;
920
+ }
921
+ /** Estimate the JSON byte size of a PRD item subtree. */
922
+ function estimateSubtreeBytes(item) {
923
+ return JSON.stringify(item).length;
924
+ }
925
+ // --------------------------------------------------------------------------
926
+ // Visual diff helpers — collect IDs and compute before/after impact
927
+ // --------------------------------------------------------------------------
928
+ /** Collect all IDs from a list of subtree roots (item + all descendants). */
929
+ function collectSubtreeIds(items) {
930
+ const ids = new Set();
931
+ function walk(node) {
932
+ ids.add(node.id);
933
+ if (Array.isArray(node.children)) {
934
+ for (const child of node.children)
935
+ walk(child);
936
+ }
937
+ }
938
+ for (const item of items)
939
+ walk(item);
940
+ return ids;
941
+ }
942
+ /**
943
+ * Compute per-epic before/after completion impact from pruning.
944
+ *
945
+ * Counts tasks/subtasks (matching Rex's computeStats behavior) in the
946
+ * "before" tree, then simulates removal of prunable items to get "after"
947
+ * counts. Epics not affected by pruning are omitted.
948
+ */
949
+ function computeEpicImpact(items, prunableIds) {
950
+ const impact = [];
951
+ for (const epic of items) {
952
+ if (epic.level !== "epic")
953
+ continue;
954
+ // Count tasks/subtasks in the epic subtree
955
+ let beforeTotal = 0;
956
+ let beforeCompleted = 0;
957
+ let removedCount = 0;
958
+ function countBefore(node) {
959
+ if (isWorkItem(node.level)) {
960
+ if (node.status !== "deleted") {
961
+ beforeTotal++;
962
+ if (node.status === "completed")
963
+ beforeCompleted++;
964
+ }
965
+ }
966
+ if (Array.isArray(node.children)) {
967
+ for (const child of node.children)
968
+ countBefore(child);
969
+ }
970
+ }
971
+ function countRemoved(node) {
972
+ if (prunableIds.has(node.id)) {
973
+ // Count all tasks/subtasks in this subtree as removed
974
+ function countAll(n) {
975
+ if (isWorkItem(n.level)) {
976
+ if (n.status !== "deleted")
977
+ removedCount++;
978
+ }
979
+ if (Array.isArray(n.children)) {
980
+ for (const child of n.children)
981
+ countAll(child);
982
+ }
983
+ }
984
+ countAll(node);
985
+ }
986
+ else if (Array.isArray(node.children)) {
987
+ for (const child of node.children)
988
+ countRemoved(child);
989
+ }
990
+ }
991
+ countBefore(epic);
992
+ countRemoved(epic);
993
+ if (removedCount === 0)
994
+ continue;
995
+ const afterTotal = beforeTotal - removedCount;
996
+ // After pruning, completed count drops by however many completed tasks/subtasks were removed
997
+ let removedCompleted = 0;
998
+ function countRemovedCompleted(node) {
999
+ if (prunableIds.has(node.id)) {
1000
+ function countComp(n) {
1001
+ if (isWorkItem(n.level) && n.status === "completed") {
1002
+ removedCompleted++;
1003
+ }
1004
+ if (Array.isArray(n.children)) {
1005
+ for (const child of n.children)
1006
+ countComp(child);
1007
+ }
1008
+ }
1009
+ countComp(node);
1010
+ }
1011
+ else if (Array.isArray(node.children)) {
1012
+ for (const child of node.children)
1013
+ countRemovedCompleted(child);
1014
+ }
1015
+ }
1016
+ countRemovedCompleted(epic);
1017
+ const afterCompleted = beforeCompleted - removedCompleted;
1018
+ impact.push({
1019
+ id: epic.id,
1020
+ title: epic.title,
1021
+ before: {
1022
+ total: beforeTotal,
1023
+ completed: beforeCompleted,
1024
+ pct: beforeTotal > 0 ? Math.round((beforeCompleted / beforeTotal) * 100) : 0,
1025
+ },
1026
+ after: {
1027
+ total: afterTotal,
1028
+ completed: afterCompleted,
1029
+ pct: afterTotal > 0 ? Math.round((afterCompleted / afterTotal) * 100) : 0,
1030
+ },
1031
+ removedCount,
1032
+ });
1033
+ }
1034
+ return impact;
1035
+ }
1036
+ function loadArchiveSync(archivePath) {
1037
+ try {
1038
+ if (existsSync(archivePath)) {
1039
+ return JSON.parse(readFileSync(archivePath, "utf-8"));
1040
+ }
1041
+ }
1042
+ catch { /* ignore parse errors */ }
1043
+ return { schema: "rex/archive/v1", batches: [] };
1044
+ }
1045
+ /**
1046
+ * Handle GET /api/rex/prune/preview — preview prunable items.
1047
+ *
1048
+ * Supports query params for pruning criteria:
1049
+ * ?minAge=N — minimum completion age in days (default: 0)
1050
+ * ?statuses=a,b — comma-separated statuses to include (default: "completed")
1051
+ *
1052
+ * Response includes storage estimation (estimatedBytes), level breakdown,
1053
+ * and diff data (prunableIds, epicImpact) for visual diff rendering.
1054
+ */
1055
+ function handlePrunePreview(req, res, ctx) {
1056
+ const doc = loadPRD(ctx);
1057
+ if (!doc) {
1058
+ errorResponse(res, 404, "No PRD data found");
1059
+ return true;
1060
+ }
1061
+ // Parse criteria from query params
1062
+ const url = req.url || "";
1063
+ const qIdx = url.indexOf("?");
1064
+ const criteria = { ...DEFAULT_PRUNE_CRITERIA };
1065
+ if (qIdx !== -1) {
1066
+ const params = new URLSearchParams(url.slice(qIdx));
1067
+ const minAgeStr = params.get("minAge");
1068
+ if (minAgeStr) {
1069
+ const parsed = parseInt(minAgeStr, 10);
1070
+ if (!isNaN(parsed) && parsed >= 0)
1071
+ criteria.minAgeDays = parsed;
1072
+ }
1073
+ const statusesStr = params.get("statuses");
1074
+ if (statusesStr) {
1075
+ criteria.statuses = statusesStr.split(",").filter(Boolean);
1076
+ }
1077
+ }
1078
+ const now = new Date();
1079
+ const prunable = findPrunableWithCriteria(doc.items, criteria, now);
1080
+ const totalCount = prunable.reduce((sum, item) => sum + countSubtree(item), 0);
1081
+ // Estimate storage savings
1082
+ const estimatedBytes = prunable.reduce((sum, item) => sum + estimateSubtreeBytes(item), 0);
1083
+ // Compute level breakdown
1084
+ const levelBreakdown = {};
1085
+ for (const item of prunable) {
1086
+ levelBreakdown[item.level] = (levelBreakdown[item.level] || 0) + 1;
1087
+ }
1088
+ // Total PRD size for context
1089
+ const totalPrdBytes = JSON.stringify(doc).length;
1090
+ // Collect all IDs in prunable subtrees (for visual diff highlighting)
1091
+ const prunableIds = collectSubtreeIds(prunable);
1092
+ // Compute per-epic impact (before/after completion stats)
1093
+ const epicImpact = computeEpicImpact(doc.items, prunableIds);
1094
+ jsonResponse(res, 200, {
1095
+ ok: true,
1096
+ items: prunable.map(summarizeItem),
1097
+ totalItemCount: totalCount,
1098
+ hasPrunableItems: prunable.length > 0,
1099
+ estimatedBytes,
1100
+ totalPrdBytes,
1101
+ levelBreakdown,
1102
+ criteria: {
1103
+ minAgeDays: criteria.minAgeDays,
1104
+ statuses: criteria.statuses,
1105
+ },
1106
+ // Visual diff data
1107
+ prunableIds: [...prunableIds],
1108
+ epicImpact,
1109
+ });
1110
+ return true;
1111
+ }
1112
+ /** Handle POST /api/rex/prune — execute prune with optional backup */
1113
+ async function handlePruneExecute(req, res, ctx, broadcast) {
1114
+ const doc = loadPRD(ctx);
1115
+ if (!doc) {
1116
+ errorResponse(res, 404, "No PRD data found");
1117
+ return true;
1118
+ }
1119
+ try {
1120
+ const body = await readBody(req);
1121
+ const input = JSON.parse(body);
1122
+ // Build criteria from input or use defaults
1123
+ const criteria = {
1124
+ minAgeDays: input.criteria?.minAgeDays ?? 0,
1125
+ statuses: input.criteria?.statuses ?? ["completed"],
1126
+ };
1127
+ const now = new Date();
1128
+ // Preview first to validate
1129
+ const prunable = findPrunableWithCriteria(doc.items, criteria, now);
1130
+ if (prunable.length === 0) {
1131
+ jsonResponse(res, 200, { ok: true, prunedCount: 0, message: "Nothing to prune" });
1132
+ return true;
1133
+ }
1134
+ const expectedCount = prunable.reduce((sum, item) => sum + countSubtree(item), 0);
1135
+ // Confirm count must match to prevent operating on stale data
1136
+ if (input.confirmCount !== undefined && input.confirmCount !== expectedCount) {
1137
+ errorResponse(res, 409, `Stale prune request: expected ${input.confirmCount} items but found ${expectedCount}. Refresh the preview.`);
1138
+ return true;
1139
+ }
1140
+ // Create backup if requested
1141
+ let backupPath;
1142
+ if (input.backup) {
1143
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
1144
+ backupPath = join(ctx.rexDir, `prd-backup-${timestamp}.json`);
1145
+ writeFileSync(backupPath, JSON.stringify(doc, null, 2) + "\n");
1146
+ }
1147
+ // Execute prune — remove items matching criteria
1148
+ const prunableIds = new Set(prunable.map((p) => p.id));
1149
+ const result = pruneItemsByIds(doc.items, prunableIds);
1150
+ // Archive pruned items
1151
+ const archivePath = join(ctx.rexDir, "archive.json");
1152
+ const archive = loadArchiveSync(archivePath);
1153
+ archive.batches.push({
1154
+ timestamp: new Date().toISOString(),
1155
+ source: "prune",
1156
+ items: result.pruned,
1157
+ count: result.prunedCount,
1158
+ ...(criteria.minAgeDays > 0 ? { reason: `age >= ${criteria.minAgeDays}d` } : {}),
1159
+ });
1160
+ writeFileSync(archivePath, JSON.stringify(archive, null, 2) + "\n");
1161
+ // Save pruned document
1162
+ savePRD(ctx, doc);
1163
+ // Log the prune action
1164
+ const titles = result.pruned.map((i) => i.title).join(", ");
1165
+ appendLog(ctx, {
1166
+ timestamp: new Date().toISOString(),
1167
+ event: "items_pruned",
1168
+ detail: `Pruned ${result.prunedCount} items: ${titles} (via web, criteria: statuses=${criteria.statuses.join(",")}, minAge=${criteria.minAgeDays}d)`,
1169
+ });
1170
+ if (broadcast) {
1171
+ broadcast({
1172
+ type: "rex:prd-changed",
1173
+ timestamp: new Date().toISOString(),
1174
+ });
1175
+ }
1176
+ jsonResponse(res, 200, {
1177
+ ok: true,
1178
+ prunedCount: result.prunedCount,
1179
+ prunedItems: result.pruned.map(summarizeItem),
1180
+ archivedTo: "archive.json",
1181
+ ...(backupPath ? { backupPath } : {}),
1182
+ });
1183
+ }
1184
+ catch (err) {
1185
+ errorResponse(res, 400, String(err));
1186
+ }
1187
+ return true;
1188
+ }
1189
+ /** Handle POST /api/rex/analyze — trigger analysis via CLI subprocess */
1190
+ async function handleAnalyze(req, res, ctx, broadcast) {
1191
+ try {
1192
+ const body = await readBody(req);
1193
+ const input = JSON.parse(body);
1194
+ const args = ["analyze", "--format=json"];
1195
+ if (input.accept)
1196
+ args.push("--accept");
1197
+ if (input.noLlm)
1198
+ args.push("--no-llm");
1199
+ if (input.lite)
1200
+ args.push("--lite");
1201
+ args.push(ctx.projectDir);
1202
+ // Find the rex CLI binary
1203
+ const rexBin = join(ctx.projectDir, "node_modules", ".bin", "rex");
1204
+ const rexFallback = join(ctx.projectDir, "packages", "rex", "dist", "cli", "index.js");
1205
+ const binPath = existsSync(rexBin) ? rexBin : "node";
1206
+ const binArgs = existsSync(rexBin) ? args : [rexFallback, ...args];
1207
+ const result = await foundationExec(binPath, binArgs, {
1208
+ cwd: ctx.projectDir,
1209
+ timeout: 120_000,
1210
+ maxBuffer: 10 * 1024 * 1024,
1211
+ });
1212
+ if (result.error) {
1213
+ // Try to parse JSON from stdout even on error (CLI may exit non-zero but still output)
1214
+ try {
1215
+ const parsed = JSON.parse(result.stdout);
1216
+ jsonResponse(res, 200, { ok: true, ...parsed });
1217
+ }
1218
+ catch {
1219
+ errorResponse(res, 500, `Analysis failed: ${result.stderr || result.error.message}`);
1220
+ }
1221
+ }
1222
+ else {
1223
+ try {
1224
+ const parsed = JSON.parse(result.stdout);
1225
+ if (broadcast) {
1226
+ broadcast({
1227
+ type: "rex:prd-changed",
1228
+ timestamp: new Date().toISOString(),
1229
+ });
1230
+ }
1231
+ jsonResponse(res, 200, { ok: true, ...parsed });
1232
+ }
1233
+ catch {
1234
+ // Non-JSON output — return as plain result
1235
+ jsonResponse(res, 200, { ok: true, output: result.stdout.trim() });
1236
+ }
1237
+ }
1238
+ }
1239
+ catch (err) {
1240
+ errorResponse(res, 400, String(err));
1241
+ }
1242
+ return true;
1243
+ }
1244
+ /** Handle GET /api/rex/proposals — get pending proposals */
1245
+ function handleGetProposals(res, ctx) {
1246
+ const pendingPath = join(ctx.rexDir, "pending-proposals.json");
1247
+ if (!existsSync(pendingPath)) {
1248
+ jsonResponse(res, 200, { proposals: [] });
1249
+ return true;
1250
+ }
1251
+ try {
1252
+ const raw = readFileSync(pendingPath, "utf-8");
1253
+ const proposals = JSON.parse(raw);
1254
+ jsonResponse(res, 200, { proposals });
1255
+ }
1256
+ catch {
1257
+ jsonResponse(res, 200, { proposals: [] });
1258
+ }
1259
+ return true;
1260
+ }
1261
+ /** Handle POST /api/rex/proposals/accept — accept pending proposals */
1262
+ async function handleAcceptProposals(req, res, ctx, broadcast) {
1263
+ const doc = loadPRD(ctx);
1264
+ if (!doc) {
1265
+ errorResponse(res, 404, "No PRD data found");
1266
+ return true;
1267
+ }
1268
+ try {
1269
+ const body = await readBody(req);
1270
+ const input = JSON.parse(body);
1271
+ const pendingPath = join(ctx.rexDir, "pending-proposals.json");
1272
+ if (!existsSync(pendingPath)) {
1273
+ errorResponse(res, 404, "No pending proposals");
1274
+ return true;
1275
+ }
1276
+ const raw = readFileSync(pendingPath, "utf-8");
1277
+ const allProposals = JSON.parse(raw);
1278
+ // Filter to selected indices, or accept all
1279
+ const toAccept = input.indices
1280
+ ? input.indices.filter((i) => i >= 0 && i < allProposals.length).map((i) => allProposals[i])
1281
+ : allProposals;
1282
+ if (toAccept.length === 0) {
1283
+ errorResponse(res, 400, "No valid proposals to accept");
1284
+ return true;
1285
+ }
1286
+ let addedCount = 0;
1287
+ for (const p of toAccept) {
1288
+ const epicId = randomUUID();
1289
+ const epicItem = {
1290
+ id: epicId,
1291
+ title: p.epic.title,
1292
+ level: "epic",
1293
+ status: "pending",
1294
+ source: p.epic.source,
1295
+ };
1296
+ if (p.epic.description)
1297
+ epicItem.description = p.epic.description;
1298
+ doc.items.push(epicItem);
1299
+ addedCount++;
1300
+ for (const f of p.features) {
1301
+ const featureId = randomUUID();
1302
+ const featureItem = {
1303
+ id: featureId,
1304
+ title: f.title,
1305
+ level: "feature",
1306
+ status: "pending",
1307
+ source: f.source,
1308
+ };
1309
+ if (f.description)
1310
+ featureItem.description = f.description;
1311
+ insertChild(doc.items, epicId, featureItem);
1312
+ addedCount++;
1313
+ for (const t of f.tasks) {
1314
+ const taskId = randomUUID();
1315
+ const taskItem = {
1316
+ id: taskId,
1317
+ title: t.title,
1318
+ level: "task",
1319
+ status: "pending",
1320
+ source: t.source,
1321
+ };
1322
+ if (t.description)
1323
+ taskItem.description = t.description;
1324
+ if (t.acceptanceCriteria)
1325
+ taskItem.acceptanceCriteria = t.acceptanceCriteria;
1326
+ if (t.priority && isPriority(t.priority))
1327
+ taskItem.priority = t.priority;
1328
+ if (t.tags)
1329
+ taskItem.tags = t.tags;
1330
+ insertChild(doc.items, featureId, taskItem);
1331
+ addedCount++;
1332
+ }
1333
+ }
1334
+ }
1335
+ savePRD(ctx, doc);
1336
+ // Remove accepted proposals from pending (keep remaining)
1337
+ if (input.indices && input.indices.length < allProposals.length) {
1338
+ const remaining = allProposals.filter((_, i) => !input.indices.includes(i));
1339
+ if (remaining.length > 0) {
1340
+ writeFileSync(pendingPath, JSON.stringify(remaining, null, 2));
1341
+ }
1342
+ else {
1343
+ try {
1344
+ writeFileSync(pendingPath, "[]");
1345
+ }
1346
+ catch { /* ignore */ }
1347
+ }
1348
+ }
1349
+ else {
1350
+ // All accepted — clear pending
1351
+ try {
1352
+ writeFileSync(pendingPath, "[]");
1353
+ }
1354
+ catch { /* ignore */ }
1355
+ }
1356
+ appendLog(ctx, {
1357
+ timestamp: new Date().toISOString(),
1358
+ event: "analyze_accept",
1359
+ detail: `Accepted ${toAccept.length} proposals (${addedCount} items) via web`,
1360
+ });
1361
+ if (broadcast) {
1362
+ broadcast({
1363
+ type: "rex:prd-changed",
1364
+ timestamp: new Date().toISOString(),
1365
+ });
1366
+ }
1367
+ jsonResponse(res, 200, { ok: true, acceptedCount: toAccept.length, addedCount });
1368
+ }
1369
+ catch (err) {
1370
+ errorResponse(res, 400, String(err));
1371
+ }
1372
+ return true;
1373
+ }
1374
+ /** Validate an edited proposal tree. Returns an array of error messages. */
1375
+ function validateEditedProposals(proposals) {
1376
+ const errors = [];
1377
+ for (let pi = 0; pi < proposals.length; pi++) {
1378
+ const p = proposals[pi];
1379
+ if (!p.selected)
1380
+ continue;
1381
+ if (!p.epic?.title?.trim()) {
1382
+ errors.push(`Proposal ${pi + 1}: epic title is required`);
1383
+ }
1384
+ for (let fi = 0; fi < (p.features ?? []).length; fi++) {
1385
+ const f = p.features[fi];
1386
+ if (!f.selected)
1387
+ continue;
1388
+ if (!f.title?.trim()) {
1389
+ errors.push(`Proposal ${pi + 1}, feature ${fi + 1}: title is required`);
1390
+ }
1391
+ for (let ti = 0; ti < (f.tasks ?? []).length; ti++) {
1392
+ const t = f.tasks[ti];
1393
+ if (!t.selected)
1394
+ continue;
1395
+ if (!t.title?.trim()) {
1396
+ errors.push(`Proposal ${pi + 1}, feature ${fi + 1}, task ${ti + 1}: title is required`);
1397
+ }
1398
+ }
1399
+ }
1400
+ }
1401
+ return errors;
1402
+ }
1403
+ /** Handle POST /api/rex/proposals/accept-edited — accept edited proposals with inline changes */
1404
+ async function handleAcceptEditedProposals(req, res, ctx, broadcast) {
1405
+ const doc = loadPRD(ctx);
1406
+ if (!doc) {
1407
+ errorResponse(res, 404, "No PRD data found");
1408
+ return true;
1409
+ }
1410
+ try {
1411
+ const body = await readBody(req);
1412
+ const input = JSON.parse(body);
1413
+ if (!Array.isArray(input.proposals) || input.proposals.length === 0) {
1414
+ errorResponse(res, 400, "No proposals provided");
1415
+ return true;
1416
+ }
1417
+ // Validate
1418
+ const errors = validateEditedProposals(input.proposals);
1419
+ if (input.validateOnly) {
1420
+ jsonResponse(res, 200, { ok: errors.length === 0, errors });
1421
+ return true;
1422
+ }
1423
+ if (errors.length > 0) {
1424
+ errorResponse(res, 400, `Validation failed: ${errors.join("; ")}`);
1425
+ return true;
1426
+ }
1427
+ let addedCount = 0;
1428
+ const selectedProposals = input.proposals.filter((p) => p.selected);
1429
+ for (const p of selectedProposals) {
1430
+ const epicId = randomUUID();
1431
+ const epicItem = {
1432
+ id: epicId,
1433
+ title: p.epic.title.trim(),
1434
+ level: "epic",
1435
+ status: "pending",
1436
+ source: "web-proposal-editor",
1437
+ };
1438
+ if (p.epic.description?.trim())
1439
+ epicItem.description = p.epic.description.trim();
1440
+ doc.items.push(epicItem);
1441
+ addedCount++;
1442
+ for (const f of p.features) {
1443
+ if (!f.selected)
1444
+ continue;
1445
+ const featureId = randomUUID();
1446
+ const featureItem = {
1447
+ id: featureId,
1448
+ title: f.title.trim(),
1449
+ level: "feature",
1450
+ status: "pending",
1451
+ source: "web-proposal-editor",
1452
+ };
1453
+ if (f.description?.trim())
1454
+ featureItem.description = f.description.trim();
1455
+ insertChild(doc.items, epicId, featureItem);
1456
+ addedCount++;
1457
+ for (const t of f.tasks) {
1458
+ if (!t.selected)
1459
+ continue;
1460
+ const taskId = randomUUID();
1461
+ const taskItem = {
1462
+ id: taskId,
1463
+ title: t.title.trim(),
1464
+ level: "task",
1465
+ status: "pending",
1466
+ source: "web-proposal-editor",
1467
+ };
1468
+ if (t.description?.trim())
1469
+ taskItem.description = t.description.trim();
1470
+ if (t.acceptanceCriteria?.length)
1471
+ taskItem.acceptanceCriteria = t.acceptanceCriteria;
1472
+ if (t.priority && isPriority(t.priority))
1473
+ taskItem.priority = t.priority;
1474
+ if (t.tags?.length)
1475
+ taskItem.tags = t.tags;
1476
+ insertChild(doc.items, featureId, taskItem);
1477
+ addedCount++;
1478
+ }
1479
+ }
1480
+ }
1481
+ if (addedCount === 0) {
1482
+ errorResponse(res, 400, "No items selected for acceptance");
1483
+ return true;
1484
+ }
1485
+ savePRD(ctx, doc);
1486
+ // Clear pending proposals file
1487
+ const pendingPath = join(ctx.rexDir, "pending-proposals.json");
1488
+ if (existsSync(pendingPath)) {
1489
+ try {
1490
+ writeFileSync(pendingPath, "[]");
1491
+ }
1492
+ catch { /* ignore */ }
1493
+ }
1494
+ appendLog(ctx, {
1495
+ timestamp: new Date().toISOString(),
1496
+ event: "proposals_edited_accept",
1497
+ detail: `Accepted ${selectedProposals.length} edited proposals (${addedCount} items) via proposal editor`,
1498
+ });
1499
+ if (broadcast) {
1500
+ broadcast({
1501
+ type: "rex:prd-changed",
1502
+ timestamp: new Date().toISOString(),
1503
+ });
1504
+ }
1505
+ jsonResponse(res, 200, { ok: true, acceptedCount: selectedProposals.length, addedCount });
1506
+ }
1507
+ catch (err) {
1508
+ errorResponse(res, 400, String(err));
1509
+ }
1510
+ return true;
1511
+ }
1512
+ /** Handle POST /api/rex/smart-add-preview — generate proposals from natural language */
1513
+ async function handleSmartAddPreview(req, res, ctx) {
1514
+ try {
1515
+ const body = await readBody(req);
1516
+ const input = JSON.parse(body);
1517
+ if (!input.text || typeof input.text !== "string" || input.text.trim().length === 0) {
1518
+ errorResponse(res, 400, "Text is required");
1519
+ return true;
1520
+ }
1521
+ // Minimum length to avoid wasteful LLM calls
1522
+ if (input.text.trim().length < 5) {
1523
+ jsonResponse(res, 200, { proposals: [], confidence: 0, qualityIssues: [] });
1524
+ return true;
1525
+ }
1526
+ // Use rex CLI add (smart mode) with --format=json (no --accept = preview mode).
1527
+ // Pass description via --description flag (not positional) to prevent any
1528
+ // stale UI text from being concatenated into the argument list.
1529
+ const description = String(input.text).trim();
1530
+ const args = ["add", "--format=json", "--description", description];
1531
+ if (input.parentId)
1532
+ args.push("--parent", input.parentId);
1533
+ args.push(ctx.projectDir);
1534
+ const rexBin = join(ctx.projectDir, "node_modules", ".bin", "rex");
1535
+ const rexFallback = join(ctx.projectDir, "packages", "rex", "dist", "cli", "index.js");
1536
+ const binPath = existsSync(rexBin) ? rexBin : "node";
1537
+ const binArgs = existsSync(rexBin) ? args : [rexFallback, ...args];
1538
+ const cliResult = await foundationExec(binPath, binArgs, {
1539
+ cwd: ctx.projectDir,
1540
+ timeout: 60_000,
1541
+ maxBuffer: 10 * 1024 * 1024,
1542
+ });
1543
+ if (cliResult.error && !cliResult.stdout.trim()) {
1544
+ throw new Error(cliResult.stderr || cliResult.error.message);
1545
+ }
1546
+ try {
1547
+ const parsed = JSON.parse(cliResult.stdout);
1548
+ const proposals = parsed.proposals ?? [];
1549
+ // Compute a confidence score based on proposal quality
1550
+ const confidence = computeConfidence(Array.isArray(proposals) ? proposals : []);
1551
+ jsonResponse(res, 200, {
1552
+ proposals: Array.isArray(proposals) ? proposals : [],
1553
+ confidence,
1554
+ qualityIssues: parsed.qualityIssues ?? [],
1555
+ });
1556
+ }
1557
+ catch {
1558
+ // Non-JSON output — return empty
1559
+ jsonResponse(res, 200, { proposals: [], confidence: 0, qualityIssues: [] });
1560
+ }
1561
+ }
1562
+ catch (err) {
1563
+ errorResponse(res, 500, String(err));
1564
+ }
1565
+ return true;
1566
+ }
1567
+ /**
1568
+ * Compute a confidence score (0-100) for a set of proposals based on quality heuristics.
1569
+ * Higher scores indicate more complete, well-structured proposals.
1570
+ */
1571
+ function computeConfidence(proposals) {
1572
+ if (proposals.length === 0)
1573
+ return 0;
1574
+ let score = 50; // Base score for having any proposals
1575
+ for (const p of proposals) {
1576
+ const epic = p.epic;
1577
+ const features = (p.features ?? []);
1578
+ // Epic quality
1579
+ if (epic?.title && typeof epic.title === "string" && epic.title.length > 5)
1580
+ score += 5;
1581
+ if (epic?.description)
1582
+ score += 3;
1583
+ // Feature quality
1584
+ for (const f of features) {
1585
+ if (f.title && typeof f.title === "string" && f.title.length > 5)
1586
+ score += 2;
1587
+ if (f.description)
1588
+ score += 2;
1589
+ const tasks = (f.tasks ?? []);
1590
+ for (const t of tasks) {
1591
+ if (t.title && typeof t.title === "string" && t.title.length > 5)
1592
+ score += 1;
1593
+ if (t.description)
1594
+ score += 1;
1595
+ if (t.acceptanceCriteria && Array.isArray(t.acceptanceCriteria) && t.acceptanceCriteria.length > 0)
1596
+ score += 2;
1597
+ if (t.priority)
1598
+ score += 1;
1599
+ }
1600
+ }
1601
+ }
1602
+ return Math.min(100, score);
1603
+ }
1604
+ // --------------------------------------------------------------------------
1605
+ // Batch import — process multiple ideas from various sources
1606
+ // --------------------------------------------------------------------------
1607
+ /** Format extension for batch import items. */
1608
+ const BATCH_FORMAT_EXT = {
1609
+ text: ".txt",
1610
+ markdown: ".md",
1611
+ json: ".json",
1612
+ };
1613
+ /** Handle POST /api/rex/batch-import — process multiple ideas with consolidated review */
1614
+ async function handleBatchImport(req, res, ctx, broadcast) {
1615
+ const doc = loadPRD(ctx);
1616
+ if (!doc) {
1617
+ errorResponse(res, 404, "No PRD data found");
1618
+ return true;
1619
+ }
1620
+ try {
1621
+ const body = await readBody(req);
1622
+ const input = JSON.parse(body);
1623
+ if (!Array.isArray(input.items) || input.items.length === 0) {
1624
+ errorResponse(res, 400, "At least one import item is required");
1625
+ return true;
1626
+ }
1627
+ // Validate items
1628
+ for (let i = 0; i < input.items.length; i++) {
1629
+ const item = input.items[i];
1630
+ if (!item.content || typeof item.content !== "string" || item.content.trim().length === 0) {
1631
+ errorResponse(res, 400, `Item ${i + 1} has empty content`);
1632
+ return true;
1633
+ }
1634
+ }
1635
+ // Write items to temp files and build --file args for rex CLI
1636
+ const tmpDir = mkdtempSync(join(tmpdir(), "rex-batch-"));
1637
+ const filePaths = [];
1638
+ const itemSources = [];
1639
+ try {
1640
+ for (let i = 0; i < input.items.length; i++) {
1641
+ const item = input.items[i];
1642
+ const format = item.format ?? "text";
1643
+ const ext = BATCH_FORMAT_EXT[format] ?? ".txt";
1644
+ const fileName = `batch-${i}${ext}`;
1645
+ const filePath = join(tmpDir, fileName);
1646
+ writeFileSync(filePath, item.content, "utf-8");
1647
+ filePaths.push(filePath);
1648
+ itemSources.push(item.source ?? fileName);
1649
+ }
1650
+ // Build rex CLI args: add --format=json --file=<f1> --file=<f2> ...
1651
+ const args = ["add", "--format=json"];
1652
+ if (input.parentId)
1653
+ args.push("--parent", input.parentId);
1654
+ if (input.accept)
1655
+ args.push("--accept");
1656
+ for (const fp of filePaths) {
1657
+ args.push(`--file=${fp}`);
1658
+ }
1659
+ args.push(ctx.projectDir);
1660
+ const rexBin = join(ctx.projectDir, "node_modules", ".bin", "rex");
1661
+ const rexFallback = join(ctx.projectDir, "packages", "rex", "dist", "cli", "index.js");
1662
+ const binPath = existsSync(rexBin) ? rexBin : "node";
1663
+ const binArgs = existsSync(rexBin) ? args : [rexFallback, ...args];
1664
+ const cliResult = await foundationExec(binPath, binArgs, {
1665
+ cwd: ctx.projectDir,
1666
+ timeout: 120_000, // 2 minutes — batch may take longer
1667
+ maxBuffer: 10 * 1024 * 1024,
1668
+ });
1669
+ if (cliResult.error && !cliResult.stdout.trim()) {
1670
+ throw new Error(cliResult.stderr || cliResult.error.message);
1671
+ }
1672
+ // Parse the JSON output from rex CLI
1673
+ let parsed;
1674
+ try {
1675
+ parsed = JSON.parse(cliResult.stdout);
1676
+ }
1677
+ catch {
1678
+ jsonResponse(res, 200, {
1679
+ proposals: [],
1680
+ confidence: 0,
1681
+ qualityIssues: [],
1682
+ itemCount: input.items.length,
1683
+ itemSources,
1684
+ });
1685
+ return true;
1686
+ }
1687
+ const proposals = parsed.proposals ?? [];
1688
+ const proposalArray = Array.isArray(proposals) ? proposals : [];
1689
+ const confidence = computeConfidence(proposalArray);
1690
+ // If accept mode was used, proposals were already committed
1691
+ if (input.accept && parsed.added) {
1692
+ appendLog(ctx, {
1693
+ timestamp: new Date().toISOString(),
1694
+ event: "batch_import_accept",
1695
+ detail: `Batch imported ${input.items.length} items (${parsed.added} PRD items added) from: ${itemSources.join(", ")}`,
1696
+ });
1697
+ if (broadcast) {
1698
+ broadcast({
1699
+ type: "rex:prd-changed",
1700
+ timestamp: new Date().toISOString(),
1701
+ });
1702
+ }
1703
+ }
1704
+ jsonResponse(res, 200, {
1705
+ proposals: proposalArray,
1706
+ confidence,
1707
+ qualityIssues: parsed.qualityIssues ?? [],
1708
+ itemCount: input.items.length,
1709
+ itemSources,
1710
+ added: parsed.added ?? 0,
1711
+ });
1712
+ }
1713
+ finally {
1714
+ // Clean up temp files
1715
+ try {
1716
+ rmSync(tmpDir, { recursive: true, force: true });
1717
+ }
1718
+ catch { /* ignore */ }
1719
+ }
1720
+ }
1721
+ catch (err) {
1722
+ errorResponse(res, 500, String(err));
1723
+ }
1724
+ return true;
1725
+ }
1726
+ /** Singleton execution state. Reset on server restart. */
1727
+ let executionState = {
1728
+ status: "idle",
1729
+ currentEpicIndex: -1,
1730
+ epics: [],
1731
+ };
1732
+ /** Reference to the current hench child process (if any). */
1733
+ let henchProcess = null;
1734
+ /** Context and broadcast saved during execution for resume. */
1735
+ let savedCtx = null;
1736
+ let savedBroadcast;
1737
+ /** Broadcast the current execution state over WebSocket. */
1738
+ function broadcastExecutionState(broadcast) {
1739
+ if (!broadcast)
1740
+ return;
1741
+ broadcast({
1742
+ type: "rex:execution-progress",
1743
+ state: getExecutionStatusPayload(),
1744
+ timestamp: new Date().toISOString(),
1745
+ });
1746
+ }
1747
+ /** Build the status payload returned by the status endpoint and broadcasts. */
1748
+ function getExecutionStatusPayload() {
1749
+ const { status, startedAt, finishedAt, currentEpicId, currentEpicIndex, epics, error } = executionState;
1750
+ const totalEpics = epics.length;
1751
+ const completedEpics = epics.filter((e) => e.status === "completed").length;
1752
+ const totalTasks = epics.reduce((s, e) => s + e.tasksTotal, 0);
1753
+ const completedTasks = epics.reduce((s, e) => s + e.tasksCompleted, 0);
1754
+ return {
1755
+ status,
1756
+ startedAt,
1757
+ finishedAt,
1758
+ currentEpicId,
1759
+ currentEpicIndex,
1760
+ totalEpics,
1761
+ completedEpics,
1762
+ totalTasks,
1763
+ completedTasks,
1764
+ percentComplete: totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0,
1765
+ epics: epics.map((e) => ({ ...e })),
1766
+ error,
1767
+ };
1768
+ }
1769
+ /** Refresh epic task counts from the PRD on disk. */
1770
+ function refreshEpicProgress(ctx) {
1771
+ const doc = loadPRD(ctx);
1772
+ if (!doc)
1773
+ return;
1774
+ for (const ep of executionState.epics) {
1775
+ const epicItem = findItemById(doc.items, ep.id);
1776
+ if (!epicItem)
1777
+ continue;
1778
+ const stats = computeStats(epicItem.children ?? []);
1779
+ ep.tasksTotal = stats.total;
1780
+ ep.tasksCompleted = stats.completed;
1781
+ }
1782
+ }
1783
+ /**
1784
+ * Run the hench CLI for one epic.
1785
+ * Returns a promise that resolves when hench exits.
1786
+ */
1787
+ async function runHenchForEpic(ctx, epicId) {
1788
+ const henchBin = join(ctx.projectDir, "node_modules", ".bin", "hench");
1789
+ const henchFallback = join(ctx.projectDir, "packages", "hench", "dist", "cli", "index.js");
1790
+ const args = ["run", "--epic=" + epicId, "--loop", "--auto", ctx.projectDir];
1791
+ const binPath = existsSync(henchBin) ? henchBin : "node";
1792
+ const binArgs = existsSync(henchBin) ? args : [henchFallback, ...args];
1793
+ const handle = spawnManaged(binPath, binArgs, {
1794
+ cwd: ctx.projectDir,
1795
+ stdio: "inherit",
1796
+ env: { ...process.env },
1797
+ });
1798
+ henchProcess = handle;
1799
+ const result = await handle.done;
1800
+ if (henchProcess === handle)
1801
+ henchProcess = null;
1802
+ return { code: result.exitCode, signal: null };
1803
+ }
1804
+ /**
1805
+ * Execute epics sequentially, starting from the current index.
1806
+ * Respects pause state and broadcasts progress.
1807
+ */
1808
+ async function executeEpicSequence(ctx, broadcast) {
1809
+ while (executionState.currentEpicIndex < executionState.epics.length) {
1810
+ // Check for pause
1811
+ if (executionState.status === "paused")
1812
+ return;
1813
+ if (executionState.status !== "running")
1814
+ return;
1815
+ const epicIdx = executionState.currentEpicIndex;
1816
+ const epic = executionState.epics[epicIdx];
1817
+ // Refresh task counts before starting
1818
+ refreshEpicProgress(ctx);
1819
+ broadcastExecutionState(broadcast);
1820
+ // Skip epics with no actionable tasks
1821
+ if (epic.tasksTotal === 0 || epic.tasksCompleted >= epic.tasksTotal) {
1822
+ epic.status = epic.tasksTotal === 0 ? "skipped" : "completed";
1823
+ epic.finishedAt = new Date().toISOString();
1824
+ executionState.currentEpicIndex++;
1825
+ broadcastExecutionState(broadcast);
1826
+ continue;
1827
+ }
1828
+ // Start this epic
1829
+ epic.status = "running";
1830
+ epic.startedAt = new Date().toISOString();
1831
+ executionState.currentEpicId = epic.id;
1832
+ broadcastExecutionState(broadcast);
1833
+ // Run hench for this epic
1834
+ const result = await runHenchForEpic(ctx, epic.id);
1835
+ // Refresh task counts after hench finishes
1836
+ refreshEpicProgress(ctx);
1837
+ // Check if we were paused/stopped while hench was running
1838
+ // (status can change via pause endpoint during the await above)
1839
+ const currentStatus = executionState.status;
1840
+ if (currentStatus === "paused") {
1841
+ epic.status = "pending"; // Revert to pending — will resume later
1842
+ epic.startedAt = undefined;
1843
+ broadcastExecutionState(broadcast);
1844
+ return;
1845
+ }
1846
+ if (currentStatus !== "running")
1847
+ return;
1848
+ // Mark epic as completed or failed
1849
+ if (result.code === 0 || epic.tasksCompleted >= epic.tasksTotal) {
1850
+ epic.status = "completed";
1851
+ }
1852
+ else {
1853
+ // Non-zero exit but some tasks may have completed
1854
+ // Mark completed if all tasks done, otherwise move on
1855
+ epic.status = epic.tasksCompleted >= epic.tasksTotal ? "completed" : "completed";
1856
+ }
1857
+ epic.finishedAt = new Date().toISOString();
1858
+ executionState.currentEpicIndex++;
1859
+ broadcastExecutionState(broadcast);
1860
+ }
1861
+ // All epics processed
1862
+ if (executionState.status === "running") {
1863
+ executionState.status = "completed";
1864
+ executionState.finishedAt = new Date().toISOString();
1865
+ executionState.currentEpicId = undefined;
1866
+ appendLog(ctx, {
1867
+ timestamp: new Date().toISOString(),
1868
+ event: "epic_by_epic_completed",
1869
+ detail: `Epic-by-epic execution completed. ${executionState.epics.filter((e) => e.status === "completed").length}/${executionState.epics.length} epics processed.`,
1870
+ });
1871
+ broadcastExecutionState(broadcast);
1872
+ }
1873
+ }
1874
+ /** Handle POST /api/rex/execute/epic-by-epic — start sequential epic execution. */
1875
+ async function handleStartEpicByEpic(req, res, ctx, broadcast) {
1876
+ // Don't allow starting if already running
1877
+ if (executionState.status === "running" || executionState.status === "paused") {
1878
+ errorResponse(res, 409, `Execution already ${executionState.status}. Use pause/resume or wait for completion.`);
1879
+ return true;
1880
+ }
1881
+ const doc = loadPRD(ctx);
1882
+ if (!doc) {
1883
+ errorResponse(res, 404, "No PRD data found");
1884
+ return true;
1885
+ }
1886
+ try {
1887
+ const body = await readBody(req);
1888
+ const input = JSON.parse(body);
1889
+ // Build the list of epics to execute
1890
+ const allEpics = doc.items.filter((item) => isRootLevel(item.level));
1891
+ let epicsToRun;
1892
+ if (input.epicIds && input.epicIds.length > 0) {
1893
+ epicsToRun = input.epicIds
1894
+ .map((id) => allEpics.find((e) => e.id === id))
1895
+ .filter((e) => e != null);
1896
+ }
1897
+ else {
1898
+ // All epics that aren't fully completed
1899
+ epicsToRun = allEpics.filter((epic) => {
1900
+ const stats = computeStats(epic.children ?? []);
1901
+ return stats.total === 0 || stats.completed < stats.total;
1902
+ });
1903
+ }
1904
+ if (epicsToRun.length === 0) {
1905
+ jsonResponse(res, 200, { ok: true, message: "No actionable epics to execute" });
1906
+ return true;
1907
+ }
1908
+ // Initialize execution state
1909
+ executionState = {
1910
+ status: "running",
1911
+ startedAt: new Date().toISOString(),
1912
+ currentEpicIndex: 0,
1913
+ epics: epicsToRun.map((epic) => {
1914
+ const stats = computeStats(epic.children ?? []);
1915
+ return {
1916
+ id: epic.id,
1917
+ title: epic.title,
1918
+ status: "pending",
1919
+ tasksTotal: stats.total,
1920
+ tasksCompleted: stats.completed,
1921
+ };
1922
+ }),
1923
+ };
1924
+ savedCtx = ctx;
1925
+ savedBroadcast = broadcast;
1926
+ appendLog(ctx, {
1927
+ timestamp: new Date().toISOString(),
1928
+ event: "epic_by_epic_started",
1929
+ detail: `Started epic-by-epic execution with ${epicsToRun.length} epics: ${epicsToRun.map((e) => e.title).join(", ")}`,
1930
+ });
1931
+ broadcastExecutionState(broadcast);
1932
+ // Respond immediately — execution runs in the background
1933
+ jsonResponse(res, 200, {
1934
+ ok: true,
1935
+ epicCount: epicsToRun.length,
1936
+ epics: executionState.epics.map((e) => ({ id: e.id, title: e.title })),
1937
+ });
1938
+ // Start execution asynchronously (don't await)
1939
+ executeEpicSequence(ctx, broadcast).catch((err) => {
1940
+ executionState.status = "failed";
1941
+ executionState.error = String(err);
1942
+ executionState.finishedAt = new Date().toISOString();
1943
+ broadcastExecutionState(broadcast);
1944
+ });
1945
+ }
1946
+ catch (err) {
1947
+ errorResponse(res, 400, String(err));
1948
+ }
1949
+ return true;
1950
+ }
1951
+ /** Handle GET /api/rex/execute/status — return current execution state. */
1952
+ function handleExecutionStatus(res) {
1953
+ // Refresh epic progress if running
1954
+ if (savedCtx && (executionState.status === "running" || executionState.status === "paused")) {
1955
+ refreshEpicProgress(savedCtx);
1956
+ }
1957
+ jsonResponse(res, 200, getExecutionStatusPayload());
1958
+ return true;
1959
+ }
1960
+ /** Handle POST /api/rex/execute/pause — pause the current execution. */
1961
+ function handleExecutionPause(res, broadcast) {
1962
+ if (executionState.status !== "running") {
1963
+ errorResponse(res, 409, `Cannot pause: execution is ${executionState.status}`);
1964
+ return true;
1965
+ }
1966
+ executionState.status = "paused";
1967
+ // Kill the current hench process if running
1968
+ if (henchProcess) {
1969
+ henchProcess.kill("SIGINT");
1970
+ henchProcess = null;
1971
+ }
1972
+ broadcastExecutionState(broadcast);
1973
+ jsonResponse(res, 200, { ok: true, status: "paused" });
1974
+ return true;
1975
+ }
1976
+ /** Handle POST /api/rex/execute/resume — resume a paused execution. */
1977
+ function handleExecutionResume(res, ctx, broadcast) {
1978
+ if (executionState.status !== "paused") {
1979
+ errorResponse(res, 409, `Cannot resume: execution is ${executionState.status}`);
1980
+ return true;
1981
+ }
1982
+ executionState.status = "running";
1983
+ savedCtx = ctx;
1984
+ savedBroadcast = broadcast;
1985
+ broadcastExecutionState(broadcast);
1986
+ jsonResponse(res, 200, { ok: true, status: "running" });
1987
+ // Continue execution asynchronously
1988
+ executeEpicSequence(ctx, broadcast).catch((err) => {
1989
+ executionState.status = "failed";
1990
+ executionState.error = String(err);
1991
+ executionState.finishedAt = new Date().toISOString();
1992
+ broadcastExecutionState(broadcast);
1993
+ });
1994
+ return true;
1995
+ }
1996
+ /**
1997
+ * Terminate any active rex epic-by-epic hench process.
1998
+ *
1999
+ * Called during server graceful shutdown to ensure the hench child spawned
2000
+ * by the rex execution engine is cleaned up alongside the hench-route
2001
+ * executions. Mirrors the pattern used by `shutdownActiveExecutions` in
2002
+ * routes-hench.ts.
2003
+ *
2004
+ * @param gracePeriodMs How long to wait for graceful SIGTERM before
2005
+ * sending SIGKILL (default: HENCH_SHUTDOWN_TIMEOUT_MS
2006
+ * env var, or 5 000 ms).
2007
+ * @returns Result indicating whether the process was present and terminated.
2008
+ */
2009
+ export async function shutdownRexExecution(gracePeriodMs = Number(process.env["HENCH_SHUTDOWN_TIMEOUT_MS"] ?? 5_000)) {
2010
+ if (!henchProcess)
2011
+ return { hadActiveProcess: false, terminated: false };
2012
+ const handle = henchProcess;
2013
+ const pid = handle.pid;
2014
+ const pidInfo = pid != null ? ` (pid ${pid})` : "";
2015
+ henchProcess = null;
2016
+ console.log(`[shutdown] terminating rex epic-by-epic execution${pidInfo}`);
2017
+ let terminated = false;
2018
+ try {
2019
+ await killWithFallback(handle, gracePeriodMs);
2020
+ console.log(`[shutdown] rex epic-by-epic execution${pidInfo} terminated`);
2021
+ terminated = true;
2022
+ }
2023
+ catch (err) {
2024
+ const error = err;
2025
+ console.error(`[shutdown] rex epic-by-epic execution${pidInfo} failed to terminate: ${error.message}`);
2026
+ }
2027
+ // Mark execution as failed so callers (status endpoint, WebSocket) see a
2028
+ // clean terminal state rather than a stale "running" after restart.
2029
+ if (executionState.status === "running" || executionState.status === "paused") {
2030
+ executionState.status = "failed";
2031
+ executionState.error = "Server shutting down";
2032
+ executionState.finishedAt = new Date().toISOString();
2033
+ }
2034
+ return { hadActiveProcess: true, terminated };
2035
+ }
2036
+ /** Walk the item tree collecting requirements with inheritance. */
2037
+ function collectInheritedRequirements(items, targetId) {
2038
+ const result = [];
2039
+ // Find the item and its parent chain
2040
+ function findWithParents(list, id, parents) {
2041
+ for (const item of list) {
2042
+ if (item.id === id)
2043
+ return { item, parents };
2044
+ if (Array.isArray(item.children)) {
2045
+ const found = findWithParents(item.children, id, [...parents, item]);
2046
+ if (found)
2047
+ return found;
2048
+ }
2049
+ }
2050
+ return null;
2051
+ }
2052
+ const found = findWithParents(items, targetId, []);
2053
+ if (!found)
2054
+ return result;
2055
+ // Own requirements first
2056
+ const reqs = (found.item.requirements ?? []);
2057
+ for (const req of reqs) {
2058
+ result.push({
2059
+ ...req,
2060
+ sourceItemId: found.item.id,
2061
+ sourceItemTitle: found.item.title,
2062
+ sourceItemLevel: found.item.level,
2063
+ });
2064
+ }
2065
+ // Then parent chain (immediate parent → root)
2066
+ for (const parent of [...found.parents].reverse()) {
2067
+ const parentReqs = (parent.requirements ?? []);
2068
+ for (const req of parentReqs) {
2069
+ result.push({
2070
+ ...req,
2071
+ sourceItemId: parent.id,
2072
+ sourceItemTitle: parent.title,
2073
+ sourceItemLevel: parent.level,
2074
+ });
2075
+ }
2076
+ }
2077
+ return result;
2078
+ }
2079
+ /** GET /api/rex/items/:id/requirements */
2080
+ function handleGetRequirements(res, ctx, itemId) {
2081
+ const doc = loadPRD(ctx);
2082
+ if (!doc) {
2083
+ errorResponse(res, 404, "No PRD data found");
2084
+ return true;
2085
+ }
2086
+ const item = findItemById(doc.items, itemId);
2087
+ if (!item) {
2088
+ errorResponse(res, 404, `Item "${itemId}" not found`);
2089
+ return true;
2090
+ }
2091
+ const inherited = collectInheritedRequirements(doc.items, itemId);
2092
+ const own = (item.requirements ?? []);
2093
+ jsonResponse(res, 200, {
2094
+ own,
2095
+ inherited,
2096
+ totalCount: inherited.length,
2097
+ ownCount: own.length,
2098
+ inheritedCount: inherited.length - own.length,
2099
+ });
2100
+ return true;
2101
+ }
2102
+ /** POST /api/rex/items/:id/requirements */
2103
+ async function handleAddRequirement(req, res, ctx, itemId, broadcast) {
2104
+ const doc = loadPRD(ctx);
2105
+ if (!doc) {
2106
+ errorResponse(res, 404, "No PRD data found");
2107
+ return true;
2108
+ }
2109
+ const item = findItemById(doc.items, itemId);
2110
+ if (!item) {
2111
+ errorResponse(res, 404, `Item "${itemId}" not found`);
2112
+ return true;
2113
+ }
2114
+ try {
2115
+ const body = await readBody(req);
2116
+ const input = JSON.parse(body);
2117
+ if (!input.title?.trim()) {
2118
+ errorResponse(res, 400, "Missing required field: title");
2119
+ return true;
2120
+ }
2121
+ if (!input.category || !isRequirementCategory(input.category)) {
2122
+ errorResponse(res, 400, `Invalid category: ${input.category}. Valid: ${[...VALID_REQUIREMENT_CATEGORIES].join(", ")}`);
2123
+ return true;
2124
+ }
2125
+ if (!input.validationType || !isValidationType(input.validationType)) {
2126
+ errorResponse(res, 400, `Invalid validationType: ${input.validationType}. Valid: ${[...VALID_VALIDATION_TYPES].join(", ")}`);
2127
+ return true;
2128
+ }
2129
+ const id = randomUUID();
2130
+ const requirement = {
2131
+ id,
2132
+ title: input.title.trim(),
2133
+ category: input.category,
2134
+ validationType: input.validationType,
2135
+ acceptanceCriteria: input.acceptanceCriteria ?? [],
2136
+ };
2137
+ if (input.description)
2138
+ requirement.description = input.description;
2139
+ if (input.validationCommand)
2140
+ requirement.validationCommand = input.validationCommand;
2141
+ if (input.threshold !== undefined)
2142
+ requirement.threshold = input.threshold;
2143
+ if (input.priority && isPriority(input.priority))
2144
+ requirement.priority = input.priority;
2145
+ if (!Array.isArray(item.requirements)) {
2146
+ item.requirements = [];
2147
+ }
2148
+ item.requirements.push(requirement);
2149
+ savePRD(ctx, doc);
2150
+ appendLog(ctx, {
2151
+ timestamp: new Date().toISOString(),
2152
+ event: "requirement_added",
2153
+ itemId,
2154
+ detail: `Added ${input.category} requirement "${input.title}" to item "${item.title}" (via web)`,
2155
+ });
2156
+ if (broadcast) {
2157
+ broadcast({
2158
+ type: "rex:prd-changed",
2159
+ timestamp: new Date().toISOString(),
2160
+ });
2161
+ }
2162
+ jsonResponse(res, 201, { ok: true, id, requirement });
2163
+ }
2164
+ catch (err) {
2165
+ errorResponse(res, 400, String(err));
2166
+ }
2167
+ return true;
2168
+ }
2169
+ /** PATCH /api/rex/items/:id/requirements/:reqId */
2170
+ async function handleUpdateRequirement(req, res, ctx, itemId, reqId, broadcast) {
2171
+ const doc = loadPRD(ctx);
2172
+ if (!doc) {
2173
+ errorResponse(res, 404, "No PRD data found");
2174
+ return true;
2175
+ }
2176
+ const item = findItemById(doc.items, itemId);
2177
+ if (!item) {
2178
+ errorResponse(res, 404, `Item "${itemId}" not found`);
2179
+ return true;
2180
+ }
2181
+ const reqs = (item.requirements ?? []);
2182
+ const reqIdx = reqs.findIndex((r) => r.id === reqId);
2183
+ if (reqIdx === -1) {
2184
+ errorResponse(res, 404, `Requirement "${reqId}" not found on item "${itemId}"`);
2185
+ return true;
2186
+ }
2187
+ try {
2188
+ const body = await readBody(req);
2189
+ const updates = JSON.parse(body);
2190
+ // Validate category/validationType if being changed
2191
+ if (updates.category !== undefined && !isRequirementCategory(updates.category)) {
2192
+ errorResponse(res, 400, `Invalid category: ${updates.category}`);
2193
+ return true;
2194
+ }
2195
+ if (updates.validationType !== undefined && !isValidationType(updates.validationType)) {
2196
+ errorResponse(res, 400, `Invalid validationType: ${updates.validationType}`);
2197
+ return true;
2198
+ }
2199
+ if (updates.priority !== undefined && updates.priority !== null && !isPriority(updates.priority)) {
2200
+ errorResponse(res, 400, `Invalid priority: ${updates.priority}`);
2201
+ return true;
2202
+ }
2203
+ // Apply updates (preserve id)
2204
+ const existing = reqs[reqIdx];
2205
+ Object.assign(existing, updates, { id: reqId });
2206
+ savePRD(ctx, doc);
2207
+ appendLog(ctx, {
2208
+ timestamp: new Date().toISOString(),
2209
+ event: "requirement_updated",
2210
+ itemId,
2211
+ detail: `Updated requirement "${existing.title}" on item "${item.title}" (via web)`,
2212
+ });
2213
+ if (broadcast) {
2214
+ broadcast({
2215
+ type: "rex:prd-changed",
2216
+ timestamp: new Date().toISOString(),
2217
+ });
2218
+ }
2219
+ jsonResponse(res, 200, { ok: true, requirement: existing });
2220
+ }
2221
+ catch (err) {
2222
+ errorResponse(res, 400, String(err));
2223
+ }
2224
+ return true;
2225
+ }
2226
+ /** DELETE /api/rex/items/:id/requirements/:reqId */
2227
+ function handleDeleteRequirement(res, ctx, itemId, reqId, broadcast) {
2228
+ const doc = loadPRD(ctx);
2229
+ if (!doc) {
2230
+ errorResponse(res, 404, "No PRD data found");
2231
+ return true;
2232
+ }
2233
+ const item = findItemById(doc.items, itemId);
2234
+ if (!item) {
2235
+ errorResponse(res, 404, `Item "${itemId}" not found`);
2236
+ return true;
2237
+ }
2238
+ const reqs = (item.requirements ?? []);
2239
+ const reqIdx = reqs.findIndex((r) => r.id === reqId);
2240
+ if (reqIdx === -1) {
2241
+ errorResponse(res, 404, `Requirement "${reqId}" not found on item "${itemId}"`);
2242
+ return true;
2243
+ }
2244
+ const removed = reqs.splice(reqIdx, 1)[0];
2245
+ if (reqs.length === 0) {
2246
+ delete item.requirements;
2247
+ }
2248
+ savePRD(ctx, doc);
2249
+ appendLog(ctx, {
2250
+ timestamp: new Date().toISOString(),
2251
+ event: "requirement_deleted",
2252
+ itemId,
2253
+ detail: `Deleted requirement "${removed.title}" from item "${item.title}" (via web)`,
2254
+ });
2255
+ if (broadcast) {
2256
+ broadcast({
2257
+ type: "rex:prd-changed",
2258
+ timestamp: new Date().toISOString(),
2259
+ });
2260
+ }
2261
+ jsonResponse(res, 200, { ok: true });
2262
+ return true;
2263
+ }
2264
+ /** GET /api/rex/requirements/coverage */
2265
+ function handleRequirementsCoverage(res, ctx) {
2266
+ const doc = loadPRD(ctx);
2267
+ if (!doc) {
2268
+ errorResponse(res, 404, "No PRD data found");
2269
+ return true;
2270
+ }
2271
+ const stats = {
2272
+ totalItems: 0,
2273
+ itemsWithRequirements: 0,
2274
+ itemsWithInheritedRequirements: 0,
2275
+ itemsWithNoRequirements: 0,
2276
+ totalRequirements: 0,
2277
+ byCategory: {},
2278
+ byValidationType: {},
2279
+ byPriority: {},
2280
+ coveragePercent: 0,
2281
+ };
2282
+ const seenReqIds = new Set();
2283
+ // Walk tree counting requirements
2284
+ function walkForCoverage(list, parentHasReqs) {
2285
+ for (const item of list) {
2286
+ if (item.status === "deleted")
2287
+ continue;
2288
+ stats.totalItems++;
2289
+ const ownReqs = (item.requirements ?? []);
2290
+ const hasOwn = ownReqs.length > 0;
2291
+ if (hasOwn) {
2292
+ stats.itemsWithRequirements++;
2293
+ for (const req of ownReqs) {
2294
+ if (!seenReqIds.has(req.id)) {
2295
+ seenReqIds.add(req.id);
2296
+ stats.totalRequirements++;
2297
+ stats.byCategory[req.category] = (stats.byCategory[req.category] ?? 0) + 1;
2298
+ stats.byValidationType[req.validationType] = (stats.byValidationType[req.validationType] ?? 0) + 1;
2299
+ const p = req.priority ?? "unset";
2300
+ stats.byPriority[p] = (stats.byPriority[p] ?? 0) + 1;
2301
+ }
2302
+ }
2303
+ }
2304
+ const inherits = parentHasReqs && !hasOwn;
2305
+ if (inherits) {
2306
+ stats.itemsWithInheritedRequirements++;
2307
+ }
2308
+ if (!hasOwn && !parentHasReqs) {
2309
+ stats.itemsWithNoRequirements++;
2310
+ }
2311
+ if (Array.isArray(item.children)) {
2312
+ walkForCoverage(item.children, hasOwn || parentHasReqs);
2313
+ }
2314
+ }
2315
+ }
2316
+ walkForCoverage(doc.items, false);
2317
+ stats.coveragePercent = stats.totalItems > 0
2318
+ ? Math.round(((stats.totalItems - stats.itemsWithNoRequirements) / stats.totalItems) * 100)
2319
+ : 0;
2320
+ jsonResponse(res, 200, stats);
2321
+ return true;
2322
+ }
2323
+ /** GET /api/rex/requirements/traceability */
2324
+ function handleRequirementsTraceability(res, ctx) {
2325
+ const doc = loadPRD(ctx);
2326
+ if (!doc) {
2327
+ errorResponse(res, 404, "No PRD data found");
2328
+ return true;
2329
+ }
2330
+ // Build traceability: each requirement → which items it applies to
2331
+ const matrix = [];
2332
+ // Collect all unique requirements and find what items they are defined on
2333
+ const reqMap = new Map();
2334
+ function walkForReqs(list) {
2335
+ for (const item of list) {
2336
+ const reqs = (item.requirements ?? []);
2337
+ for (const req of reqs) {
2338
+ if (!reqMap.has(req.id)) {
2339
+ reqMap.set(req.id, {
2340
+ requirement: req,
2341
+ definedOnItemId: item.id,
2342
+ definedOnItemTitle: item.title,
2343
+ definedOnItemLevel: item.level,
2344
+ childIds: [],
2345
+ });
2346
+ }
2347
+ }
2348
+ if (Array.isArray(item.children)) {
2349
+ walkForReqs(item.children);
2350
+ }
2351
+ }
2352
+ }
2353
+ // Collect descendant items for each requirement-bearing item
2354
+ function collectDescendants(items) {
2355
+ const result = [];
2356
+ for (const item of items) {
2357
+ if (item.status !== "deleted") {
2358
+ result.push({ id: item.id, title: item.title, level: item.level, status: item.status });
2359
+ }
2360
+ if (Array.isArray(item.children)) {
2361
+ result.push(...collectDescendants(item.children));
2362
+ }
2363
+ }
2364
+ return result;
2365
+ }
2366
+ walkForReqs(doc.items);
2367
+ // For each requirement, find all items it applies to (the defining item + descendants)
2368
+ for (const [, entry] of reqMap) {
2369
+ const defItem = findItemById(doc.items, entry.definedOnItemId);
2370
+ const appliesTo = [];
2371
+ if (defItem) {
2372
+ appliesTo.push({
2373
+ id: defItem.id,
2374
+ title: defItem.title,
2375
+ level: defItem.level,
2376
+ status: defItem.status,
2377
+ });
2378
+ if (Array.isArray(defItem.children)) {
2379
+ appliesTo.push(...collectDescendants(defItem.children));
2380
+ }
2381
+ }
2382
+ matrix.push({
2383
+ requirement: entry.requirement,
2384
+ definedOnItemId: entry.definedOnItemId,
2385
+ definedOnItemTitle: entry.definedOnItemTitle,
2386
+ definedOnItemLevel: entry.definedOnItemLevel,
2387
+ appliesTo,
2388
+ });
2389
+ }
2390
+ jsonResponse(res, 200, { matrix, totalRequirements: matrix.length });
2391
+ return true;
2392
+ }
2393
+ /** Append to execution log (sync, best-effort). */
2394
+ function appendLog(ctx, entry) {
2395
+ try {
2396
+ const logPath = join(ctx.rexDir, "execution-log.jsonl");
2397
+ appendFileSync(logPath, JSON.stringify(entry) + "\n");
2398
+ }
2399
+ catch {
2400
+ // Best-effort logging
2401
+ }
2402
+ }
2403
+ //# sourceMappingURL=routes-rex.js.map