@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,36 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="dark">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Loading… | n-dx</title>
7
+ <link rel="icon" type="image/png" href="./n-dx.png">
8
+ <!--
9
+ External dependency manifest — all resources loaded from this HTML shell.
10
+ No CDN or external URLs are referenced; all assets are local:
11
+ - ./n-dx.png (favicon)
12
+ - ./styles.css (application stylesheet, built from src/viewer/styles/)
13
+ - ./main.ts (application entry point, bundled by Vite)
14
+ If an external CDN resource is added here, register it in this block
15
+ so that supply-chain security tooling can audit it alongside pnpm audit.
16
+ -->
17
+ <script>
18
+ (function(){
19
+ var s = localStorage.getItem("sv-theme");
20
+ var t = s || (matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark");
21
+ document.documentElement.setAttribute("data-theme", t);
22
+ })();
23
+ </script>
24
+ <style>:root{--brand-navy: #001769;--brand-teal: #00E5B9;--brand-purple: #6c41f0;--brand-rose: #d52e66;--brand-green: #00bd81;--brand-orange: #ff5926;--sidebar-w: 220px;--panel-w: 320px;--font-xs: 11px;--font-sm: 11px;--font-base: 13px;--font-md: 14px;--font-lg: 16px;--font-xl: 18px;--font-2xl: 20px;--font-3xl: 24px;--weight-normal: 400;--weight-medium: 500;--weight-semibold: 600;--weight-bold: 700;--leading-tight: 1.25;--leading-normal: 1.5;--leading-relaxed: 1.6;--tracking-tight: -.01em;--tracking-normal: 0;--tracking-wide: .02em;--tracking-wider: .08em;--space-0: 0px;--space-1: 4px;--space-1-5: 6px;--space-2: 8px;--space-2-5: 10px;--space-3: 12px;--space-3-5: 14px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--radius-xl: 12px;--transition-fast: .1s ease;--transition-normal: .15s ease;--transition-slow: .25s ease}[data-theme=dark]{--bg: #0c0e1a;--bg-surface: #151829;--bg-hover: #1e2240;--bg-active: #262b4a;--border: #2a2f4a;--border-strong: #3d4470;--text: #e8eaf0;--text-dim: #9ea3bc;--text-muted: #6b7094;--accent: var(--brand-teal);--accent-dim: #008f75;--accent-subtle: color-mix(in srgb, var(--brand-teal) 8%, transparent);--green: var(--brand-green);--orange: var(--brand-orange);--red: var(--brand-rose);--purple: var(--brand-purple);--logo-bg: var(--brand-purple);--logo-bg-hover: #7d52ff}[data-theme=light]{--bg: #f5f6fa;--bg-surface: #ffffff;--bg-hover: #eef0f6;--bg-active: #e4e7f0;--border: #d8dce6;--border-strong: #bcc2d4;--text: #1a1d2e;--text-dim: #5c6078;--text-muted: #8b90a8;--accent: #008f60;--accent-dim: #007a52;--accent-subtle: color-mix(in srgb, #008f60 6%, transparent);--green: var(--brand-green);--orange: var(--brand-orange);--red: var(--brand-rose);--purple: var(--brand-purple);--logo-bg: var(--brand-navy);--logo-bg-hover: #002499}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;background:var(--bg);color:var(--text);overflow:hidden;overflow-wrap:break-word;word-wrap:break-word}#app{display:flex;height:100vh;height:100dvh}img,svg,video,canvas,iframe{max-width:100%}pre,code{max-width:100%}pre{overflow-x:auto}.status-badge{display:inline-flex;align-items:center;font-size:var(--font-xs);font-weight:var(--weight-semibold);padding:2px 8px;border-radius:var(--radius-sm);white-space:nowrap;flex-shrink:0;line-height:var(--leading-normal)}.status-badge--completed{color:var(--green);background:color-mix(in srgb,var(--green) 12%,transparent)}.status-badge--in_progress{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.status-badge--pending{color:var(--text-dim);background:color-mix(in srgb,var(--text-dim) 12%,transparent)}.status-badge--failing,.status-badge--blocked{color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent)}.status-badge--deferred{color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.status-badge--deleted{color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent);opacity:.7}.status-badge--running{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);animation:status-badge-pulse 2s ease-in-out infinite}.status-badge--paused{color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.status-badge--failed{color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent)}@keyframes status-badge-pulse{0%,to{opacity:1}50%{opacity:.6}}.tag-chip{display:inline-flex;align-items:center;gap:3px;font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px}.tag-chip-list{display:flex;gap:var(--space-1);flex-shrink:0;flex-wrap:wrap}.logo{flex-shrink:0;display:block}.logo-ndx-png,.logo-product-png{object-fit:contain;border-radius:var(--radius-sm)}.logo-ndx-bg{fill:var(--logo-bg);transition:fill var(--transition-normal)}.sidebar-brand:hover .logo-ndx-bg{fill:var(--logo-bg-hover)}.sidebar-brand{display:flex;align-items:center;gap:var(--space-2)}.sidebar-brand-text{display:flex;flex-direction:column;min-width:0}.sidebar-logo{border-radius:var(--radius-md);flex-shrink:0}.sidebar-logo-sm{border-radius:var(--radius-sm);flex-shrink:0;opacity:.6;margin-top:1px;align-self:flex-start}.sidebar-project-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-section-logo{opacity:.7;transition:opacity var(--transition-normal);flex-shrink:0}.nav-section-header:hover .nav-section-logo,.nav-section-header[aria-expanded=true] .nav-section-logo{opacity:1}.branded-header{display:flex;align-items:center;gap:var(--space-2)}.branded-header-logo{flex-shrink:0}.branded-header-label{font-size:var(--font-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wider);text-transform:uppercase}.branded-header-sv,.branded-header-sv .branded-header-logo{color:var(--brand-teal)}.branded-header-rex,.branded-header-rex .branded-header-logo{color:var(--brand-purple)}.branded-header-hench,.branded-header-hench .branded-header-logo{color:var(--brand-orange)}.view-header{margin-bottom:var(--space-6)}.view-header .branded-header{margin-bottom:var(--space-1)}.view-header .section-header{margin-bottom:0}.view-title{font-size:var(--font-3xl);font-weight:var(--weight-bold);line-height:var(--leading-tight);letter-spacing:var(--tracking-tight)}.view-subtitle{font-size:var(--font-base);color:var(--text-dim);margin-top:var(--space-1)}.sidebar{width:var(--sidebar-w);background:var(--bg-surface);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease,min-width .2s ease;position:relative;overflow:hidden}.sidebar.sidebar-collapsed{width:60px;min-width:60px;overflow:visible}.sidebar.sidebar-collapsed .sidebar-header,.sidebar.sidebar-collapsed .sidebar-nav{opacity:0;pointer-events:none;position:absolute;visibility:hidden}.sidebar-rail{display:flex;flex-direction:column;align-items:center;width:60px;height:100%;padding:14px 0;gap:0;position:relative}.sidebar-rail-logo{cursor:pointer;flex-shrink:0;border-radius:var(--radius-md);padding:2px;transition:opacity var(--transition-normal)}.sidebar-rail-logo:hover{opacity:.8}.sidebar-rail-divider{width:32px;height:1px;background:var(--border);margin:12px 0;flex-shrink:0}.sidebar-rail-nav{display:flex;flex-direction:column;align-items:center;gap:var(--space-1);width:100%;flex:1}.sidebar-rail-section{position:relative;width:48px;height:48px;border-radius:var(--radius-md);border:none;background:transparent;color:var(--text-dim);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background var(--transition-normal)}.sidebar-rail-section:hover,.sidebar-rail-section-active{background:var(--bg-hover)}.sidebar-rail-accent{position:absolute;left:0;top:10px;bottom:10px;width:3px;border-radius:0 2px 2px 0;background:var(--brand-teal)}.sidebar-rail-section-rex .sidebar-rail-accent{background:var(--brand-purple)}.sidebar-rail-section-hench .sidebar-rail-accent{background:var(--brand-orange)}.sidebar-rail-icon{opacity:.7;transition:opacity var(--transition-normal)}.sidebar-rail-section:hover .sidebar-rail-icon,.sidebar-rail-section-active .sidebar-rail-icon{opacity:1}.sidebar-rail-expand{margin-top:auto;width:36px;height:36px;border-radius:var(--radius-md);border:1px solid var(--border);background:transparent;color:var(--text-dim);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;flex-shrink:0;transition:background var(--transition-normal),color var(--transition-normal),border-color var(--transition-normal)}.sidebar-rail-expand:hover{background:var(--bg-hover);color:var(--text);border-color:var(--text-muted)}.sidebar-header{padding:var(--space-4);border-bottom:1px solid var(--border)}.sidebar-header h1{font-size:var(--font-xl);font-weight:var(--weight-bold);letter-spacing:var(--tracking-wide);line-height:1}.sidebar-subtitle{font-size:10px;color:var(--text-muted);margin-top:2px;letter-spacing:.02em;line-height:1.3}.sidebar-nav{flex:1;padding:var(--space-2);overflow-y:auto}.nav-section{margin-bottom:2px}.nav-section-header{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);cursor:pointer;user-select:none;border-radius:var(--radius-md);transition:background var(--transition-normal)}.nav-section-header:hover{background:var(--bg-hover)}.nav-section-chevron{margin-left:auto;flex-shrink:0;color:var(--text-muted);transition:transform .2s ease,color var(--transition-normal)}.nav-section-chevron-open{transform:rotate(180deg)}.nav-section-header:hover .nav-section-chevron{color:var(--text-dim)}.nav-section-header .nav-section-label{font-size:var(--font-sm);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-wider);color:var(--text-dim);transition:color var(--transition-normal)}.nav-section-header:hover .nav-section-label{color:var(--text)}.nav-section-items{overflow:hidden;max-height:500px;transition:max-height .25s ease,opacity .2s ease;opacity:1}.nav-section-items-collapsed{max-height:0;opacity:0;pointer-events:none}.nav-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);cursor:pointer;font-size:var(--font-base);color:var(--text-dim);transition:background var(--transition-normal),color var(--transition-normal)}.nav-item:hover{background:var(--bg-hover);color:var(--text)}.nav-item.active{background:var(--accent-dim);color:#fff}.nav-item:active{background:var(--bg-active, var(--bg-hover))}.nav-icon{width:16px;text-align:center;font-size:var(--font-md)}.nav-item.locked{opacity:.55;cursor:default}.nav-item.locked:hover{background:transparent;color:var(--text-dim)}.nav-badge{font-size:9px;background:var(--bg-hover);color:var(--text-dim);padding:1px var(--space-1);border-radius:var(--radius-sm);margin-left:auto;font-weight:var(--weight-medium)}.sidebar-logo{flex-shrink:0;border-radius:var(--radius-md)}.sidebar-footer{flex-shrink:0;padding:0 8px 8px}.sidebar-footer-divider{height:1px;background:var(--border);margin:0 4px 8px}.sidebar-footer-controls{display:flex;align-items:center;justify-content:space-between;padding:0 4px}.sidebar-control-btn{width:32px;height:32px;border-radius:var(--radius-md);border:1px solid transparent;background:transparent;color:var(--text-dim);font-size:var(--font-md);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background var(--transition-normal),color var(--transition-normal),border-color var(--transition-normal);padding:0}.sidebar-control-btn:hover{background:var(--bg-hover);color:var(--text);border-color:var(--border)}.sidebar-control-btn:active{background:var(--bg-active, var(--bg-hover))}.config-footer{flex-shrink:0;padding:0 8px}.config-footer-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--space-1-5) var(--space-2);border:none;background:transparent;cursor:pointer;border-radius:var(--radius-md);transition:background var(--transition-normal);color:var(--text-dim)}.config-footer-toggle:hover{background:var(--bg-hover);color:var(--text)}.config-footer-summary{display:flex;align-items:center;gap:var(--space-1-5);min-width:0}.config-footer-chevron{flex-shrink:0;color:var(--text-muted);transition:transform .2s ease}.config-footer-chevron-open{transform:rotate(180deg)}.config-badge{font-size:10px;padding:1px var(--space-1-5);border-radius:var(--radius-sm);white-space:nowrap;line-height:1.4}.config-badge-model{background:var(--bg-hover);color:var(--text);font-weight:var(--weight-medium)}.config-badge-auth{font-size:11px;line-height:1}.config-badge-auth-none{color:var(--text-muted)}.config-badge-auth-api-key,.config-badge-auth-cli{color:var(--text-dim)}.config-footer-details{padding:var(--space-1-5) var(--space-2) var(--space-2)}.config-row{display:flex;align-items:center;justify-content:space-between;padding:2px 0;font-size:11px}.config-label{color:var(--text-muted);font-weight:var(--weight-medium)}.config-value{color:var(--text-dim);text-align:right;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main{flex:1;min-width:0;overflow-x:hidden;overflow-y:auto;padding:var(--space-6)}.detail-panel{width:var(--panel-w);background:var(--bg-surface);border-left:1px solid var(--border);padding:var(--space-4);overflow-x:hidden;overflow-y:auto;flex-shrink:0;display:none}.detail-panel.open{display:block}.detail-panel h3{font-size:13px;font-weight:600;margin-bottom:var(--space-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-backdrop{display:none}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:24px}.stat-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:16px}.stat-card .value{font-size:28px;font-weight:700;color:var(--accent)}.stat-card .label{font-size:12px;color:var(--text-dim);margin-top:4px}.zone-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px}.zone-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:16px;cursor:pointer;transition:border-color .15s}.zone-card:hover{border-color:var(--accent)}.zone-card:active{background:var(--bg-hover)}.zone-card h3{font-size:14px;margin-bottom:4px}.zone-card .desc{font-size:12px;color:var(--text-dim);margin-bottom:12px}.zone-metrics{display:flex;gap:16px}.zone-metric{font-size:12px}.zone-metric .val{font-weight:600;font-size:16px}.zone-metric .lbl{color:var(--text-dim);font-size:10px}.meter{width:60px;height:4px;background:var(--border);border-radius:2px;overflow:hidden;margin-top:2px}.meter-fill{height:100%;border-radius:2px}.meter-fill.good{background:var(--green)}.meter-fill.mid{background:var(--orange)}.meter-fill.bad{background:var(--red)}.finding-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:12px 16px;margin-bottom:8px;font-size:13px;line-height:1.5}.finding-card p{margin:4px 0}.finding-card.severity-critical{border-left:3px solid var(--red)}.finding-card.severity-warning{border-left:3px solid var(--orange)}.finding-card.severity-info{border-left:3px solid var(--accent)}.finding-scope{font-size:11px;color:var(--text-dim);font-family:monospace;margin-left:8px}.finding-related{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}.finding-related code{font-size:11px;background:var(--bg-hover);padding:1px 6px;border-radius:3px;color:var(--text-dim)}.finding-header{display:flex;align-items:center;gap:6px;margin-bottom:4px;flex-wrap:wrap}.finding-icon{font-size:14px;flex-shrink:0}.finding-text{margin:4px 0;line-height:1.6}.finding-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px}.finding-zone-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.finding-scope-link{font-size:11px;color:var(--accent-dim);font-family:monospace;display:inline-flex;align-items:center;gap:4px}.finding-type-badge{display:inline-block;padding:1px 6px;border-radius:3px;font-size:10px;font-weight:500;background:var(--bg-hover);color:var(--text-dim);text-transform:capitalize}.finding-related-label{font-size:11px;color:var(--text-dim);font-weight:500}.finding-related code{cursor:default;transition:color .1s}.finding-related code:hover{color:var(--text)}.getting-started{background:var(--bg-surface);border:1px solid var(--accent-dim);border-radius:8px;padding:16px 20px;margin-bottom:20px}.getting-started h3{font-size:14px;font-weight:600;color:var(--accent);margin-bottom:8px}.getting-started p{font-size:13px;color:var(--text-dim);margin-bottom:8px}.getting-started ol{padding-left:20px;font-size:13px;line-height:1.8}.getting-started code{background:var(--bg-hover);padding:1px 6px;border-radius:3px;font-size:12px;color:var(--accent)}.component-name{font-weight:500;color:var(--accent)}.component-file{font-size:11px;color:var(--text-dim);font-family:monospace}.component-usage-badge{font-size:10px;font-weight:600;background:var(--accent-dim);color:#fff;padding:1px 6px;border-radius:3px;margin-left:auto}.component-usage-table{margin-bottom:24px}.graph-container{width:100%;height:calc(100vh - 150px);height:calc(100dvh - 150px);background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}.graph-container svg{width:100%;height:100%;cursor:grab;user-select:none;-webkit-user-select:none}.graph-container svg.grabbing{cursor:grabbing}.graph-container svg.node-dragging{cursor:grabbing}.graph-node.dragging{cursor:grabbing}.graph-node.dragging circle:not(.graph-node-hit){stroke:var(--accent);stroke-width:2.5px;filter:drop-shadow(0 0 6px var(--accent))}.graph-node-layer{pointer-events:all}.graph-node{cursor:pointer;pointer-events:all}.graph-node-hit{pointer-events:all;cursor:pointer}.graph-node circle:not(.graph-node-hit){stroke:var(--border);stroke-width:1.5px;cursor:pointer;pointer-events:all}.graph-node circle:not(.graph-node-hit):hover{stroke:var(--accent);stroke-width:2px}.graph-node.selected circle:not(.graph-node-hit){stroke:var(--accent);stroke-width:2.5px;filter:drop-shadow(0 0 4px var(--accent))}.graph-node.selected .graph-label{fill:var(--text);font-weight:600}.graph-link{stroke:var(--border);stroke-opacity:.4}.graph-link.cross-zone{stroke:var(--orange);stroke-opacity:.6}.graph-node,.graph-link{transition:opacity .15s}.graph-label{fill:var(--text-dim);font-size:9px;pointer-events:none}.graph-tooltip{pointer-events:none}.graph-tooltip-bg{fill:var(--bg-surface);stroke:var(--border);stroke-width:.5;opacity:.95}.graph-tooltip-text{fill:var(--text);font-size:9px}.graph-label-toggle{position:absolute;top:8px;left:8px;background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;padding:4px 10px;font-size:11px;color:var(--text-dim);cursor:pointer;z-index:10;transition:background .15s,color .15s}.graph-label-toggle:hover{background:var(--bg-hover, var(--border));color:var(--text)}.graph-legend{position:absolute;top:8px;right:8px;background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;padding:8px 12px;max-height:200px;overflow-y:auto;font-size:11px;z-index:10}.graph-legend-item{display:flex;align-items:center;gap:6px;padding:2px 0;color:var(--text-dim)}.graph-legend-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.graph-visibility-bar{display:flex;align-items:center;gap:12px;margin-bottom:12px}.graph-visibility-hint{font-size:12px;color:var(--text-dim)}.graph-hidden-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:20px;padding:60px 20px;background:var(--bg-surface);border:1px dashed var(--border);border-radius:8px;min-height:200px}.graph-hidden-icon{font-size:40px;opacity:.25}.graph-hidden-stats{display:flex;gap:16px}.graph-hidden-stats .stat-card{display:flex;flex-direction:column;align-items:center;gap:2px;padding:12px 20px}.graph-search-bar{margin-bottom:8px}.graph-search-ring{animation:search-pulse 1.5s ease-in-out infinite}@keyframes search-pulse{0%,to{stroke-opacity:1}50%{stroke-opacity:.4}}.refresh-toast{position:fixed;bottom:24px;left:50%;transform:translate(-50%);background:var(--accent-dim);color:#fff;padding:8px 20px;border-radius:20px;font-size:13px;font-weight:500;z-index:1000;animation:toast-fade 3s ease-in-out forwards}@keyframes toast-fade{0%{opacity:0;transform:translate(-50%) translateY(10px)}10%{opacity:1;transform:translate(-50%) translateY(0)}80%{opacity:1}to{opacity:0}}.zone-hulls{pointer-events:visibleFill}.zone-hull{fill-opacity:.06;stroke-opacity:.25;stroke-width:1.5px;stroke-dasharray:6 3;cursor:pointer;pointer-events:visibleFill;transition:fill-opacity .2s,stroke-opacity .2s}.zone-hull-group:hover .zone-hull{fill-opacity:.12;stroke-opacity:.45}.zone-label-layer,.zone-hull-label-group{pointer-events:none}.zone-hull-label-bg{fill:var(--bg-surface);opacity:.88}.zone-hull-label{font-size:12px;font-weight:700;pointer-events:none;fill:var(--text);text-transform:uppercase;letter-spacing:.05em}.zone-hull-group.collapsed .zone-hull{display:none}.zone-collapse-circle{opacity:.35;stroke:var(--border);stroke-width:2px;cursor:pointer}.zone-hull-group.collapsed:hover .zone-collapse-circle{opacity:.5}.zone-collapse-count{fill:var(--text);font-size:10px;font-weight:600;pointer-events:none}.graph-zone-toggle{position:absolute;top:8px;left:90px;background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;padding:4px 10px;font-size:11px;color:var(--text-dim);cursor:pointer;z-index:10;transition:background .15s,color .15s}.graph-zone-toggle:hover{background:var(--bg-hover, var(--border));color:var(--text)}.graph-legend-item{cursor:pointer;transition:opacity .15s}.graph-legend-item:hover{color:var(--text)}.graph-legend-item.collapsed{opacity:.5;text-decoration:line-through}.graph-link.cross-zone{stroke-dasharray:4 2}.graph-zoom-controls{position:absolute;bottom:12px;left:8px;display:flex;flex-direction:column;gap:2px;z-index:10}.graph-zoom-btn{width:32px;height:32px;background:var(--bg-surface);border:1px solid var(--border);color:var(--text-dim);font-size:16px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.graph-zoom-btn:first-child{border-radius:6px 6px 0 0}.graph-zoom-btn:last-child{border-radius:0 0 6px 6px}.graph-zoom-btn:not(:first-child){border-top:none}.graph-zoom-btn:hover{background:var(--bg-hover, var(--border));color:var(--text)}.graph-zoom-btn:active{background:var(--border)}.graph-zoom-fit{font-size:14px}.graph-container svg{touch-action:none}@media (pointer: coarse){.graph-node circle{stroke-width:2px}}.filter-bar{display:flex;gap:var(--space-2);margin-bottom:var(--space-4);align-items:center}.filter-input{flex:1;padding:var(--space-2) var(--space-3);background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:13px;outline:none}.filter-input:focus-visible{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.filter-select{padding:var(--space-2) var(--space-3);background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:13px;outline:none}.filter-select:focus-visible{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.filter-result-count{font-size:12px;color:var(--text-dim);white-space:nowrap}.filter-toggle-btn{padding:var(--space-2) var(--space-3-5);border:1px solid var(--border);background:var(--bg-surface);color:var(--text-dim);border-radius:6px;font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap;transition:all .15s}.filter-toggle-btn:hover{color:var(--text);border-color:var(--accent)}.filter-toggle-btn.active{background:var(--accent);color:var(--bg);border-color:var(--accent)}.drop-overlay{position:fixed;inset:0;background:#0c0e1ae6;display:flex;align-items:center;justify-content:center;z-index:1000}.drop-overlay.hidden{display:none}.drop-box{border:2px dashed var(--accent);border-radius:16px;padding:var(--space-12) 64px;text-align:center}.drop-box h2{color:var(--accent);margin-bottom:var(--space-2)}.drop-box p{color:var(--text-dim);font-size:14px}.locked-view{display:flex;flex-direction:column;align-items:center;justify-content:center;height:60vh;text-align:center;color:var(--text-dim)}.locked-icon{font-size:48px;margin-bottom:var(--space-4);opacity:.4}.locked-view h2{font-size:20px;color:var(--text);margin-bottom:var(--space-2)}.locked-view p{margin-bottom:var(--space-2);font-size:14px}.locked-hint code{background:var(--bg-surface);border:1px solid var(--border);padding:2px var(--space-2);border-radius:4px;font-size:13px;color:var(--accent)}.collapsible-header{display:flex;align-items:center;gap:8px;cursor:pointer;padding:8px 0;user-select:none}.collapsible-header:hover{color:var(--accent)}.collapsible-chevron{font-size:10px;transition:transform .15s;color:var(--text-dim)}.collapsible-chevron.open{transform:rotate(90deg)}.collapsible-title{font-size:15px;font-weight:600}.collapsible-count{font-size:11px;background:var(--bg-hover);color:var(--text-dim);padding:1px 6px;border-radius:3px}.collapsible-toggle{background:none;border:none;color:var(--accent);font-size:12px;cursor:pointer;padding:4px 0}.collapsible-toggle:hover{text-decoration:underline}.collapsible-scroll-container{min-height:60px;max-height:60vh;overflow-y:auto;position:relative}.collapsible-sticky-footer{position:sticky;bottom:0;background:linear-gradient(transparent,var(--bg) 40%);padding:16px 0 4px;text-align:center}.tree-node{position:relative}.tree-node-row{display:flex;align-items:center;gap:6px;padding:5px 8px;font-size:13px;border-radius:4px;position:relative}.tree-node-expandable{cursor:pointer}.tree-node-row:hover{background:var(--bg-hover)}.tree-node-content{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}.tree-chevron{width:16px;font-size:9px;color:var(--text-dim);text-align:center;flex-shrink:0;transition:transform .15s}.tree-chevron-open{transform:rotate(90deg)}.tree-line{position:absolute;top:0;width:24px;height:100%;pointer-events:none}.tree-line:before{content:"";position:absolute;left:0;top:0;bottom:0;width:1px;background:var(--border)}.tree-line:after{content:"";position:absolute;left:0;top:14px;width:12px;height:1px;background:var(--border)}.tree-line-last:before{bottom:calc(100% - 14px)}.tree-children{position:relative}.tree-children:before{content:"";position:absolute;left:var(--tree-line-left, 12px);top:0;bottom:14px;width:1px;background:var(--border)}.bar-chart-label{font-size:12px;fill:var(--text-dim)}.bar-chart-value{font-size:11px;fill:var(--text)}.flow-diagram{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;margin-bottom:16px;overflow:hidden}.flow-diagram svg{width:100%;max-width:800px;display:block;margin:0 auto 16px}.flow-node{cursor:pointer}.flow-node:hover circle{stroke-width:3px}.flow-node text{font-size:10px;fill:var(--text);pointer-events:none}.flow-edge{fill:none;stroke-linecap:round}.data-table-wrapper{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.data-table{width:100%;border-collapse:collapse;font-size:13px}.data-table th{text-align:left;padding:8px 12px;border-bottom:2px solid var(--border);color:var(--text-dim);font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.04em;cursor:pointer;user-select:none}.data-table th:hover{color:var(--text)}.data-table td{padding:6px 12px;border-bottom:1px solid var(--border)}.data-table tr:hover td{background:var(--bg-hover)}.tag{display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:500}.tag-source{background:#1e3a5f;color:#6cb4ee}.tag-test{background:#1e3f2e;color:var(--green)}.tag-config{background:#3f2e1e;color:var(--orange)}.tag-docs{background:#2e1e3f;color:#9b7af8}.tag-other{background:#2e2e2e;color:var(--text-dim)}[data-theme=light] .tag-source{background:#dbeafe;color:#1e40af}[data-theme=light] .tag-test{background:#dcfce7;color:#166534}[data-theme=light] .tag-config{background:#fef3c7;color:#92400e}[data-theme=light] .tag-docs{background:#ede9fe;color:#5b21b6}[data-theme=light] .tag-other{background:#f3f4f6;color:var(--text-dim)}.severity-badge{display:inline-block;padding:1px 6px;border-radius:3px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.03em}.severity-info{background:#1e3a5f;color:#6cb4ee}.severity-warning{background:#3f2e1e;color:var(--orange)}.severity-critical{background:#3f1e1e;color:#e8578a}[data-theme=light] .severity-info{background:#dbeafe;color:#1e40af}[data-theme=light] .severity-warning{background:#fef3c7;color:#92400e}[data-theme=light] .severity-critical{background:#fee2e2;color:#991b1b}.detail-row{display:flex;justify-content:space-between;padding:var(--space-1) 0;font-size:12px}.detail-row .label{color:var(--text-dim)}.detail-nav-btn{display:block;width:100%;margin-top:var(--space-4);padding:var(--space-2) var(--space-3);background:var(--bg-hover);border:1px solid var(--border);border-radius:6px;color:var(--accent);font-size:12px;font-weight:500;cursor:pointer;text-align:center}.detail-nav-btn:hover{border-color:var(--accent);background:var(--accent-dim);color:#fff}.detail-import-list{display:flex;flex-direction:column;gap:2px}.detail-import-item{font-size:11px;font-family:monospace;color:var(--text-dim);padding:2px var(--space-1-5);border-radius:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.detail-import-item:hover{background:var(--bg-hover);color:var(--text)}.detail-code{font-family:monospace;font-size:11px;background:var(--bg-hover);padding:var(--space-2);border-radius:4px;margin-bottom:var(--space-3);word-break:break-all;color:var(--accent)}.zone-badge{display:inline-block;padding:1px var(--space-2);border-radius:10px;font-size:10px;font-weight:500;white-space:nowrap}.zone-badge[style]{background:color-mix(in srgb,var(--zone-color) 13%,transparent);color:var(--zone-color);border:1px solid color-mix(in srgb,var(--zone-color) 27%,transparent)}.detail-close{background:none;border:1px solid var(--border);border-radius:6px;color:var(--text-dim);font-size:12px;cursor:pointer;padding:2px var(--space-2);display:flex;align-items:center;gap:var(--space-1)}.detail-close:hover{border-color:var(--accent);color:var(--accent)}.detail-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-4)}.detail-nav-group{display:flex;flex-direction:column;gap:var(--space-1-5);margin-top:var(--space-4)}.detail-nav-group .detail-nav-btn{margin-top:0}.detail-finding-item{font-size:12px;color:var(--text-dim);padding:var(--space-1) 0;border-bottom:1px solid var(--border)}.detail-more{font-size:11px;color:var(--text-dim);padding-top:var(--space-1)}.route-tree{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:8px 0;margin-bottom:16px}.route-pattern{font-family:monospace;color:var(--accent);font-weight:500}.route-file{font-size:11px;color:var(--text-dim)}.route-badge{display:inline-block;padding:1px 6px;border-radius:3px;font-size:10px;font-weight:600;margin-right:4px}.route-badge-data{background:#1e3a5f;color:#6cb4ee}.route-badge-component{background:#1e3f2e;color:var(--green)}.route-badge-boundary{background:#3f2e1e;color:var(--orange)}.route-badge-meta{background:#2e1e3f;color:#9b7af8}[data-theme=light] .route-badge-data{background:#dbeafe;color:#1e40af}[data-theme=light] .route-badge-component{background:#dcfce7;color:#166534}[data-theme=light] .route-badge-boundary{background:#fef3c7;color:#92400e}[data-theme=light] .route-badge-meta{background:#ede9fe;color:#5b21b6}.zone-map{background:var(--bg-surface);border:1px solid var(--border);border-radius:12px;padding:20px;margin-bottom:24px}.zone-map-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:12px}.zone-map-header h4{font-size:14px;font-weight:600;color:var(--text);margin:0}.zone-map-legend{display:flex;gap:16px;font-size:11px;color:var(--text-dim)}.legend-item{display:flex;align-items:center;gap:4px}.legend-dot{width:8px;height:8px;border-radius:50%}.legend-line{width:16px;height:2px;background:var(--border)}.zone-map-grid{display:grid;gap:16px;margin-bottom:20px}.zone-map-node{background:var(--bg);border:2px solid var(--border);border-radius:8px;padding:12px;cursor:pointer;transition:all .2s ease;position:relative}.zone-map-node:hover{border-color:var(--zone-color);box-shadow:0 2px 8px #00000026}.zone-map-node.selected{border-color:var(--zone-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--zone-color) 30%,transparent)}.zone-map-node-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.zone-map-node-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.zone-map-node-name{font-weight:600;font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.zone-map-node-body{display:flex;justify-content:space-between;align-items:center}.zone-map-node-stat{display:flex;align-items:baseline;gap:4px}.zone-map-node-stat .stat-value{font-size:18px;font-weight:700;color:var(--accent)}.zone-map-node-stat .stat-label{font-size:10px;color:var(--text-dim)}.zone-map-node-health{display:flex;align-items:center;gap:6px}.health-dot{width:8px;height:8px;border-radius:50%}.coupling-indicator{font-size:12px}.coupling-indicator.high{color:var(--orange)}.coupling-indicator.mid{color:var(--text-dim)}.coupling-indicator.low{color:transparent}.zone-map-node-subzones{margin-top:4px}.subzone-badge{display:inline-block;background:var(--bg-hover);border:1px solid var(--border);border-radius:3px;padding:1px 6px;font-size:10px;color:var(--text-dim)}.zone-map-node-io{display:flex;justify-content:space-between;margin-top:8px;padding-top:8px;border-top:1px solid var(--border);font-size:11px;color:var(--text-dim)}.io-in,.io-out{display:flex;align-items:center;gap:2px}.zone-map-connections{border-top:1px solid var(--border);padding-top:16px}.zone-map-connections h5{font-size:12px;font-weight:600;color:var(--text-dim);margin-bottom:12px}.connection-list{display:flex;flex-direction:column;gap:8px}.connection-item{display:flex;align-items:center;gap:8px;font-size:12px;padding:6px 10px;background:var(--bg);border-radius:6px}.connection-item.bidirectional{background:color-mix(in srgb,var(--orange) 10%,var(--bg))}.connection-zone{padding:2px 8px;border-radius:4px;background:color-mix(in srgb,var(--zone-color) 20%,transparent);font-weight:500}.connection-arrow{color:var(--text-dim)}.connection-count{margin-left:auto;font-weight:600;color:var(--accent)}.connection-more{font-size:11px;color:var(--text-dim);font-style:italic;padding-left:10px}.health-gauge{display:flex;flex-direction:column;align-items:center}.health-gauge-value{font-size:14px;font-weight:700}.health-gauge-label{font-size:10px;color:var(--text-dim);margin-top:4px;text-align:center}.pattern-badge{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:500}.pattern-badge.pattern{background:color-mix(in srgb,var(--green) 15%,transparent);color:var(--green)}.pattern-badge.antipattern{background:color-mix(in srgb,var(--orange) 15%,transparent);color:var(--orange)}.pattern-icon{font-weight:700}.metric-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:16px;text-align:center}.metric-value{font-size:28px;font-weight:700;color:var(--accent);line-height:1}.metric-trend{font-size:14px;margin-left:4px}.metric-trend-up{color:var(--green)}.metric-trend-down{color:var(--red)}.metric-trend-neutral{color:var(--text-dim)}.metric-label{font-size:11px;color:var(--text-dim);margin-top:6px}.zone-detail-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}.zone-detail-panel{background:var(--bg);border:1px solid var(--border);border-radius:12px;width:100%;max-width:500px;max-height:80vh;overflow-y:auto;padding:24px;box-shadow:0 8px 32px #0000004d}.zone-detail-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.zone-detail-header h3{font-size:18px;margin:0;color:var(--zone-color)}.close-btn{background:none;border:none;font-size:18px;color:var(--text-dim);cursor:pointer;padding:4px 8px;border-radius:4px}.close-btn:hover{background:var(--bg-hover);color:var(--text)}.zone-detail-desc{font-size:13px;color:var(--text-dim);margin-bottom:16px;line-height:1.5}.zone-detail-metrics{display:flex;gap:24px;margin-bottom:20px;padding:12px;background:var(--bg-surface);border-radius:8px}.zone-detail-metrics .metric{display:flex;flex-direction:column;align-items:center}.zone-detail-metrics .metric-val{font-size:20px;font-weight:700}.zone-detail-metrics .metric-lbl{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px}.zone-detail-section{margin-top:16px;padding-top:16px;border-top:1px solid var(--border)}.zone-detail-section h4{font-size:12px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.entry-point-list,.insight-list,.file-list{list-style:none;padding:0;margin:0}.entry-point-list li,.insight-list li{padding:4px 0;font-size:12px;color:var(--text)}.entry-point-list li.more,.insight-list li.more{color:var(--text-dim);font-style:italic}.dep-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.dep-col{display:flex;flex-direction:column;gap:6px}.dep-label{font-size:10px;color:var(--text-dim);font-weight:600;text-transform:uppercase}.dep-item{display:flex;justify-content:space-between;font-size:12px;padding:4px 8px;background:var(--bg-surface);border-radius:4px}.dep-count{font-weight:600;color:var(--accent)}.toggle-files-btn{background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;padding:8px 16px;font-size:12px;cursor:pointer;color:var(--text);width:100%}.toggle-files-btn:hover{border-color:var(--accent)}.file-list{margin-top:12px;max-height:200px;overflow-y:auto}.file-item{padding:4px 8px;border-radius:4px;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.file-item:hover{background:var(--bg-hover)}.entry-badge{font-size:9px;background:var(--accent);color:#fff;padding:1px 5px;border-radius:3px;font-weight:600}.overview-container{max-width:1200px}.overview-header{margin-bottom:24px}.overview-header h2{font-size:24px;margin-bottom:4px}.overview-meta{font-size:12px;color:var(--text-dim)}.overview-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:24px}.overview-section{margin-bottom:24px;padding:20px;background:var(--bg-surface);border:1px solid var(--border);border-radius:12px}.overview-section h3{font-size:14px;font-weight:600;margin-bottom:16px}.section-header-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.section-header-row h3{margin:0}.enrichment-badge{font-size:10px;padding:3px 8px;background:var(--accent-dim);color:var(--accent);border-radius:4px;font-weight:500}.health-row{display:flex;align-items:center;gap:32px;flex-wrap:wrap}.pattern-list{display:flex;flex-wrap:wrap;gap:8px;flex:1;min-width:200px}.overview-columns{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-bottom:24px}@media (max-width: 768px){.overview-columns{grid-template-columns:1fr}}.overview-col{background:var(--bg-surface);border:1px solid var(--border);border-radius:12px;padding:20px}.overview-col h3{font-size:13px;font-weight:600;margin-bottom:16px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px}.top-zones-list{display:flex;flex-direction:column;gap:8px}.top-zone-item{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--bg);border-radius:8px;cursor:pointer;transition:background .15s}.top-zone-item:hover{background:var(--bg-hover)}.top-zone-item .zone-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.top-zone-item .zone-name{font-weight:500;font-size:13px;flex:1}.top-zone-item .zone-files{font-size:12px;color:var(--text-dim)}.top-zone-item .health-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.link-btn{background:none;border:none;color:var(--accent);font-size:12px;cursor:pointer;padding:0;font-weight:500}.link-btn:hover{text-decoration:underline}.zone-attention-note{font-size:11px;color:var(--orange);margin-top:10px;padding:6px 12px;background:color-mix(in srgb,var(--orange) 10%,transparent);border-radius:6px}.attention-list{display:flex;flex-direction:column;gap:8px}.attention-item{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;background:var(--bg);border-radius:8px;border-left:3px solid var(--orange)}.attention-name{font-weight:500;font-size:13px}.attention-issues{display:flex;gap:6px}.issue-tag{font-size:10px;padding:2px 8px;background:color-mix(in srgb,var(--orange) 15%,transparent);color:var(--orange);border-radius:4px}.attention-more{font-size:12px;color:var(--text-dim);font-style:italic;padding-left:14px}.insight-item{padding:8px 12px;background:var(--bg-surface);border-radius:6px;font-size:13px;line-height:1.5;margin-bottom:6px}.insight-more{font-size:12px;color:var(--text-dim);font-style:italic;padding:8px 12px}.circular-dep-block{padding:10px 14px;background:color-mix(in srgb,var(--red) 10%,var(--bg));border-radius:6px;font-size:12px;font-family:monospace;margin-bottom:6px;overflow-x:auto;white-space:nowrap}.section-header{font-size:var(--font-3xl);font-weight:var(--weight-bold);margin-bottom:var(--space-4);line-height:var(--leading-tight);letter-spacing:var(--tracking-tight)}.section-header-sm{font-size:var(--font-lg);font-weight:var(--weight-semibold);margin-bottom:var(--space-4)}.section-sub{font-size:var(--font-base);color:var(--text-dim);margin-bottom:var(--space-4)}.loading{display:flex;align-items:center;justify-content:center;height:100%;min-height:200px;color:var(--text-dim)}.sidebar-progress{padding:8px 12px;margin:4px 0 2px;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-normal)}.sidebar-progress:hover{background:var(--bg-hover)}.sidebar-progress:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.progress-label{font-size:11px;color:var(--text-dim);margin-bottom:6px}.progress-bar{height:3px;background:var(--border);border-radius:2px;overflow:hidden;margin-bottom:8px}.progress-fill{height:100%;background:var(--green);border-radius:2px;transition:width .3s ease}.progress-modules{display:flex;gap:8px}.progress-module{font-size:12px;color:var(--text-dim)}.progress-module.done{color:var(--green)}.progress-module.error{color:var(--red)}.sidebar-indicator{padding:6px 12px;margin:2px 0;border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-normal);font-size:11px;display:flex;align-items:center;gap:6px}.sidebar-indicator[role=status]{cursor:default}.sidebar-indicator:hover{background:var(--bg-hover)}.sidebar-indicator:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.sidebar-indicator-prd{flex-direction:column;align-items:stretch;gap:4px;padding:8px 12px}.indicator-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.indicator-dot-fresh{background:var(--green)}.indicator-dot-stale{background:var(--yellow, #f59e0b)}.indicator-dot-unavailable{background:var(--text-dim);opacity:.5}.indicator-text{color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.indicator-row{display:flex;align-items:center;gap:6px}.indicator-pct{font-weight:var(--weight-semibold, 600);color:var(--text);font-size:12px}.indicator-meta{color:var(--text-dim);font-size:11px}.indicator-badge{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 4px;border-radius:8px;font-size:10px;font-weight:var(--weight-semibold, 600);line-height:1}.indicator-badge-active{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}.indicator-badge-pending{background:color-mix(in srgb,var(--yellow, #f59e0b) 20%,transparent);color:var(--yellow, #f59e0b)}.indicator-bar{height:3px;background:var(--border);border-radius:2px;overflow:hidden}.indicator-fill{height:100%;border-radius:2px;transition:width .3s ease}.indicator-fill-default{background:var(--green)}.indicator-fill-active{background:var(--accent)}.indicator-next{color:var(--text-dim);font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.4}.indicator-next-label{color:var(--text-dim);opacity:.7}.page-context-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 0 8px;min-height:28px}.page-context-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.guide-btn{width:28px;height:28px;border-radius:50%;border:1px solid var(--border);background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-md);font-weight:var(--weight-semibold);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color var(--transition-normal),color var(--transition-normal),background var(--transition-normal);padding:0}.guide-btn:hover{border-color:var(--accent);color:var(--accent)}.guide-btn:active{background:var(--bg-hover)}.guide-overlay{position:fixed;inset:0;background:#0c0e1acc;z-index:1000;display:flex;align-items:center;justify-content:center}[data-theme=light] .guide-overlay{background:#0006}.guide-modal{background:var(--bg-surface);border:1px solid var(--border);border-radius:12px;width:520px;max-width:90vw;max-height:80vh;overflow-y:auto}.guide-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border)}.guide-header h2{font-size:16px}.guide-close{background:none;border:none;color:var(--text-dim);font-size:18px;cursor:pointer}.guide-close:hover{color:var(--text)}.guide-body{padding:20px}.guide-body section{margin-bottom:16px}.guide-body h3{font-size:13px;font-weight:600;color:var(--accent);margin-bottom:4px}.guide-body p{font-size:13px;line-height:1.6;color:var(--text-dim)}.mono-sm{font-family:monospace;font-size:12px}.text-right{text-align:right}.text-dim{color:var(--text-dim)}.text-red{color:var(--red)}.text-orange{color:var(--orange)}.flex-row{display:flex;align-items:center;gap:8px}.mt-8{margin-top:8px}.mt-12{margin-top:12px}.mt-16{margin-top:16px}.mt-24{margin-top:24px}.mb-6{margin-bottom:6px}.mb-16{margin-bottom:16px}.empty-state{text-align:center;padding:16px}.zone-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.circular-dep-block{background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;padding:12px;margin-bottom:8px;font-size:12px;font-family:monospace}.chart-block{display:block;width:100%;max-width:600px;margin-bottom:16px}.skip-link{position:absolute;top:-40px;left:0;background:var(--text);color:var(--bg);padding:8px 16px;z-index:10000;font-size:13px;border-radius:0 0 6px;transition:top .15s}.skip-link:focus{top:0}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}button:focus-visible,.nav-item:focus-visible,.zone-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.mobile-menu-btn{display:none}.prd-tree-container{padding:0 var(--space-1)}.prd-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-4);flex-wrap:wrap;gap:var(--space-2)}.prd-title{font-size:var(--font-xl);font-weight:var(--weight-semibold)}.prd-toolbar{display:flex;gap:var(--space-1-5)}.prd-toolbar-btn{background:var(--bg-surface);border:1px solid var(--border);color:var(--text-dim);font-size:var(--font-sm);padding:var(--space-1) var(--space-2-5);border-radius:4px;cursor:pointer;transition:border-color .15s,color .15s}.prd-toolbar-btn:hover{border-color:var(--accent);color:var(--text)}.prd-summary{margin-bottom:var(--space-5)}.prd-summary-bar{display:flex;height:6px;border-radius:3px;overflow:hidden;background:var(--border);margin-bottom:var(--space-2)}.prd-summary-segment{transition:width .3s ease;min-width:2px}.prd-status-bg-completed{background:var(--green)}.prd-status-bg-in_progress{background:var(--accent)}.prd-status-bg-pending{background:var(--text-dim);opacity:.4}.prd-status-bg-blocked{background:var(--red)}.prd-status-bg-failing{background:var(--red);opacity:.7}.prd-status-bg-deferred{background:var(--orange);opacity:.5}.prd-summary-stats{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;font-size:var(--font-base);color:var(--text-dim)}.prd-summary-stat{display:flex;align-items:center;gap:var(--space-1)}.prd-summary-pct{margin-left:auto;font-weight:var(--weight-semibold);color:var(--text)}.prd-status-dot{display:inline-block;width:8px;height:8px;border-radius:50%}.prd-status-dot.prd-status-completed{background:var(--green)}.prd-status-dot.prd-status-in-progress{background:var(--accent)}.prd-status-dot.prd-status-pending{background:var(--text-dim);opacity:.4}.prd-status-dot.prd-status-blocked{background:var(--red)}.prd-status-dot.prd-status-failing{background:var(--red);opacity:.7}.prd-status-dot.prd-status-deferred{background:var(--orange);opacity:.5}.prd-filter-bar{position:sticky;top:0;z-index:10;background:var(--bg);padding:var(--space-2) 0 var(--space-3);margin-bottom:var(--space-2);border-bottom:1px solid transparent}.prd-filter-bar:not(:first-child){transition:border-color .15s}.prd-status-filter{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.prd-status-filter-label{font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);flex-shrink:0}.prd-status-filter-chips{display:flex;gap:var(--space-1);flex-wrap:wrap}.prd-status-chip{display:inline-flex;align-items:center;gap:var(--space-1);padding:3px var(--space-2);border:1px solid var(--border);border-radius:12px;background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;transition:all .15s;opacity:.65}.prd-status-chip:hover{opacity:.9;border-color:var(--text-dim)}.prd-status-chip.active{opacity:1;font-weight:var(--weight-medium)}.prd-status-chip.active.prd-status-completed{background:color-mix(in srgb,var(--green) 15%,transparent);border-color:var(--green);color:var(--green)}.prd-status-chip.active.prd-status-in-progress{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:var(--accent);color:var(--accent)}.prd-status-chip.active.prd-status-pending{background:var(--bg-hover);border-color:var(--text-dim);color:var(--text-dim)}.prd-status-chip.active.prd-status-failing,.prd-status-chip.active.prd-status-blocked{background:color-mix(in srgb,var(--red) 15%,transparent);border-color:var(--red);color:var(--red)}.prd-status-chip.active.prd-status-deferred{background:color-mix(in srgb,var(--orange) 15%,transparent);border-color:var(--orange);color:var(--orange)}.prd-status-chip.active.prd-status-deleted{background:color-mix(in srgb,var(--red) 10%,transparent);border-color:var(--red);color:var(--red);opacity:.7}.prd-status-chip-icon,.prd-status-chip-label{font-size:var(--font-sm)}.prd-status-filter-presets{display:flex;gap:var(--space-1);flex-wrap:wrap}.prd-status-preset{padding:3px var(--space-2-5);border:1px solid var(--border);border-radius:4px;background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;transition:all .15s}.prd-status-preset:hover{border-color:var(--accent);color:var(--text)}.prd-status-preset.active{background:color-mix(in srgb,var(--accent) 12%,transparent);border-color:var(--accent);color:var(--accent);font-weight:var(--weight-semibold)}.prd-status-preset-custom{display:inline-flex;align-items:center;padding:3px var(--space-2-5);border:1px dashed var(--text-dim);border-radius:4px;color:var(--text-dim);font-size:var(--font-sm);font-style:italic;opacity:.7}.prd-failure-reason{color:var(--red);font-style:italic}.task-failure-reason{border-left:3px solid var(--red);padding-left:var(--space-2)}.task-failure-text{color:var(--red);font-style:italic}.task-failure-reason-header{display:flex;align-items:center;gap:var(--space-2)}.task-failure-edit-btn{background:none;border:1px solid var(--border);border-radius:3px;color:var(--text-dim);font-size:var(--font-sm);padding:1px var(--space-1-5);cursor:pointer;transition:border-color .15s,color .15s}.task-failure-edit-btn:hover{border-color:var(--accent);color:var(--text)}.task-failure-input-form{display:flex;flex-direction:column;gap:var(--space-1-5);margin-top:var(--space-2)}.task-failure-input{width:100%;padding:var(--space-1-5) var(--space-2);background:var(--bg-hover);border:1px solid var(--red);border-radius:4px;color:var(--text);font-size:var(--font-base);font-family:inherit;outline:none;box-sizing:border-box}.task-failure-input:focus-visible{outline:2px solid var(--red);outline-offset:-1px}.task-failure-input::placeholder{color:var(--text-dim);opacity:.7}.task-failure-form-actions{display:flex;gap:var(--space-1-5)}.task-failure-submit-btn{padding:var(--space-1) var(--space-3);background:var(--red);border:1px solid var(--red);border-radius:4px;color:#fff;font-size:var(--font-sm);font-weight:var(--weight-medium);cursor:pointer;transition:opacity .15s}.task-failure-submit-btn:hover{opacity:.9}.task-failure-submit-btn:disabled{opacity:.4;cursor:not-allowed}.task-failure-cancel-btn{padding:var(--space-1) var(--space-3);background:var(--bg-surface);border:1px solid var(--border);border-radius:4px;color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;transition:border-color .15s,color .15s}.task-failure-cancel-btn:hover{border-color:var(--text-dim);color:var(--text)}.prd-status-deleted{color:var(--red);opacity:.5}.prd-status-bg-deleted,.prd-status-dot.prd-status-deleted{background:var(--red);opacity:.3}.prd-tree{border:1px solid var(--border);border-radius:8px;background:var(--bg-surface);overflow:hidden;min-height:80px}.prd-tree-virtual{min-height:120px;max-height:70vh;overflow-y:auto;scroll-behavior:smooth}.prd-virtual-spacer{pointer-events:none;flex-shrink:0}.prd-node{position:relative}.prd-node-culled{contain:strict;content-visibility:hidden}.prd-node-row{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-2) var(--space-3);font-size:var(--font-base);border-bottom:1px solid var(--border);position:relative;transition:background-color .1s}.prd-node:last-child>.prd-node-row{border-bottom:none}.prd-node-row{cursor:pointer}.prd-node-expandable{user-select:none}.prd-node-row:hover{background:var(--bg-hover)}.prd-node-selected{background:color-mix(in srgb,var(--accent) 12%,transparent);border-left:2px solid var(--accent)}.prd-node-selected:hover{background:color-mix(in srgb,var(--accent) 18%,transparent)}.prd-node-highlighted{animation:prd-node-highlight-pulse 2s ease-out;border-left:2px solid var(--accent)}@keyframes prd-node-highlight-pulse{0%{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 50%,transparent);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 15%,var(--bg-surface))}70%{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 20%,transparent);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg-surface))}to{box-shadow:0 0 0 0 transparent;border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}}.prd-deep-link-error{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);background:color-mix(in srgb,var(--red) 8%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 30%,var(--border));border-radius:var(--radius-lg);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-4);font-size:var(--font-sm);color:var(--red)}.prd-deep-link-error-dismiss{flex-shrink:0;background:none;border:none;color:var(--red);font-size:var(--font-lg);cursor:pointer;padding:0 4px;line-height:1;opacity:.7;transition:opacity var(--transition-fast)}.prd-deep-link-error-dismiss:hover{opacity:1}.prd-chevron{width:14px;font-size:var(--font-sm);color:var(--text-dim);text-align:center;flex-shrink:0;transition:transform .15s}.prd-chevron-open{transform:rotate(90deg)}.prd-status-icon{flex-shrink:0;font-size:var(--font-base);width:14px;text-align:center}.prd-status-completed{color:var(--green)}.prd-status-in-progress{color:var(--accent)}.prd-status-pending{color:var(--text-dim);opacity:.6}.prd-status-deferred{color:var(--orange);opacity:.6}.prd-status-failing,.prd-status-blocked{color:var(--red)}.prd-level-badge{font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;padding:1px var(--space-1);border-radius:3px;flex-shrink:0;background:var(--bg-hover);color:var(--text-dim)}.prd-level-badge.prd-level-epic{background:color-mix(in srgb,var(--purple) 20%,transparent);color:var(--purple)}.prd-level-badge.prd-level-feature{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}.prd-level-badge.prd-level-task{background:var(--bg-hover);color:var(--text-dim)}.prd-level-badge.prd-level-subtask{background:var(--bg-hover);color:var(--text-dim);opacity:.8}.prd-node-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:var(--weight-medium)}.prd-level-epic>.prd-node-title{font-weight:var(--weight-semibold)}.prd-priority-badge{font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:1px var(--space-1-5);border-radius:3px;flex-shrink:0;text-transform:capitalize}.prd-priority-critical{background:color-mix(in srgb,var(--red) 20%,transparent);color:var(--red)}.prd-priority-high{background:color-mix(in srgb,var(--orange) 20%,transparent);color:var(--orange)}.prd-priority-medium{background:var(--bg-hover);color:var(--text-dim)}.prd-priority-low{background:var(--bg-hover);color:var(--text-dim);opacity:.7}.prd-progress-wrapper{display:flex;align-items:center;gap:var(--space-1-5);flex-shrink:0}.prd-progress-track{width:60px;height:4px;background:var(--border);border-radius:2px;overflow:hidden}.prd-progress-fill{height:100%;border-radius:2px;transition:width .3s ease}.prd-bar-done{background:var(--green)}.prd-bar-mid{background:var(--accent)}.prd-bar-low{background:var(--orange)}.prd-progress-pct{font-size:var(--font-sm);color:var(--text-dim);font-weight:var(--weight-semibold);min-width:30px}.prd-count{font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px;flex-shrink:0}.prd-tag-list{display:flex;gap:var(--space-1);flex-shrink:0;flex-wrap:wrap}.prd-tag{display:inline-flex;align-items:center;gap:3px;font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px}.prd-token-badge{font-size:var(--font-sm);color:var(--text-dim);background:color-mix(in srgb,var(--text-dim) 8%,transparent);border:1px solid color-mix(in srgb,var(--text-dim) 20%,transparent);border-radius:999px;padding:1px var(--space-1-5);white-space:nowrap}.prd-token-badge--budget{color:var(--brand-teal);background:color-mix(in srgb,var(--brand-teal) 10%,transparent);border-color:color-mix(in srgb,var(--brand-teal) 35%,transparent)}.prd-timestamp{font-size:var(--font-sm);color:var(--text-dim);flex-shrink:0;font-style:italic}.prd-children{border-left:2px solid var(--border);margin-left:var(--space-5)}.prd-children-collapsed{display:none}.prd-empty{text-align:center;padding:var(--space-10) var(--space-5);color:var(--text-dim)}.prd-empty p{margin-bottom:var(--space-2)}.prd-empty-hint{font-size:var(--font-base)}.prd-empty-hint code{background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px;font-size:var(--font-base);color:var(--accent)}.task-meta-header{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3)}.task-id{font-family:monospace;font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px}.task-section{margin-bottom:var(--space-4)}.task-section-label{font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);margin-bottom:var(--space-1-5)}.task-usage-row{display:flex;justify-content:space-between;align-items:center;gap:var(--space-2-5)}.task-usage-value{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--brand-teal)}.task-usage-hint{margin-top:var(--space-1);font-size:var(--font-sm);color:var(--text-dim)}.task-runs-section{border-top:1px solid var(--border);padding-top:var(--space-2)}.task-runs-list{display:flex;flex-direction:column;gap:var(--space-1)}.task-run-entry{display:flex;flex-direction:column;gap:var(--space-0-5);padding:var(--space-1-5) var(--space-2);border-radius:var(--radius);background:var(--bg-raised);border:1px solid var(--border);transition:border-color .15s,background .15s}.task-run-entry.clickable{cursor:pointer}.task-run-entry.clickable:hover{border-color:var(--accent);background:var(--bg-hover)}.task-run-entry.clickable:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.task-run-header{display:flex;align-items:center;gap:var(--space-1-5)}.task-run-status{font-size:var(--font-sm);line-height:1}.task-run-time{font-size:var(--font-sm);color:var(--text-dim);margin-left:auto}.task-run-meta{display:flex;flex-wrap:wrap;gap:var(--space-1);padding-left:calc(var(--font-sm) + var(--space-1-5))}.task-run-chip{font-size:var(--font-xs);color:var(--text-dim);background:var(--bg-inset);padding:1px var(--space-1);border-radius:var(--radius-sm)}.task-run-chip-tokens{color:var(--brand-teal);font-weight:var(--weight-medium)}.task-status-selector{display:flex;flex-wrap:wrap;gap:var(--space-1)}.task-status-btn{display:flex;align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-2);border:1px solid var(--border);border-radius:4px;background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;transition:all .15s}.task-status-btn:hover{border-color:var(--text-dim);color:var(--text)}.task-status-btn.active{border-color:currentColor;font-weight:var(--weight-semibold)}.task-status-btn.active.prd-status-completed{background:color-mix(in srgb,var(--green) 15%,transparent);color:var(--green);border-color:var(--green)}.task-status-btn.active.prd-status-in_progress{background:color-mix(in srgb,var(--accent) 15%,transparent);color:var(--accent);border-color:var(--accent)}.task-status-btn.active.prd-status-pending{background:var(--bg-hover);color:var(--text-dim);border-color:var(--text-dim)}.task-status-btn.active.prd-status-failing,.task-status-btn.active.prd-status-blocked{background:color-mix(in srgb,var(--red) 15%,transparent);color:var(--red);border-color:var(--red)}.task-status-btn.active.prd-status-deferred{background:color-mix(in srgb,var(--orange) 15%,transparent);color:var(--orange);border-color:var(--orange)}.task-status-btn.active.prd-status-deleted{background:color-mix(in srgb,var(--red) 10%,transparent);color:var(--red);border-color:var(--red);opacity:.7}.task-status-btn-icon,.task-status-btn-label{font-size:var(--font-sm)}.task-execute-section{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-2)}.task-execute-btn{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1-5) var(--space-3-5);border:1px solid var(--accent);border-radius:6px;background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent);font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:all .15s}.task-execute-btn:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 20%,transparent);border-color:var(--accent)}.task-execute-btn:active:not(:disabled){transform:scale(.97)}.task-execute-btn.disabled,.task-execute-btn:disabled{opacity:.4;cursor:not-allowed;border-color:var(--border);color:var(--text-dim);background:var(--bg-surface)}.task-execute-btn.executing{border-color:var(--orange);color:var(--orange);background:color-mix(in srgb,var(--orange) 10%,transparent);cursor:wait}.task-execute-icon,.task-execute-label{font-size:var(--font-sm)}.task-execute-result{font-size:var(--font-sm);padding:2px var(--space-2);border-radius:4px}.task-execute-result.success{color:var(--green);background:color-mix(in srgb,var(--green) 10%,transparent)}.task-execute-result.error{color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}.task-execute-section{flex-wrap:wrap}.task-exec-progress{width:100%;display:flex;flex-direction:column;gap:var(--space-1);margin-top:var(--space-1-5);padding:var(--space-2) var(--space-2-5);background:var(--bg-hover);border-radius:6px;border:1px solid var(--border)}.task-exec-progress-bar{width:100%;height:3px;background:var(--border);border-radius:2px;overflow:hidden}.task-exec-progress-fill{width:30%;height:100%;background:var(--orange);border-radius:2px;animation:exec-progress-indeterminate 1.5s ease-in-out infinite}@keyframes exec-progress-indeterminate{0%{width:10%;margin-left:0}50%{width:40%;margin-left:30%}to{width:10%;margin-left:90%}}.task-exec-status{font-size:var(--font-sm);font-weight:var(--weight-semibold)}.task-exec-status-starting{color:var(--orange)}.task-exec-status-running{color:var(--accent)}.task-exec-output{max-height:60px;overflow:hidden;margin-top:2px}.task-exec-output code{font-size:var(--font-sm);line-height:1.4;color:var(--text-dim);font-family:var(--font-mono, monospace);white-space:pre-wrap;word-break:break-all;display:block;max-height:60px;overflow:hidden;text-overflow:ellipsis}.task-exec-done{width:100%;display:flex;align-items:center;gap:var(--space-1-5);margin-top:var(--space-1-5);padding:var(--space-1-5) var(--space-2-5);border-radius:6px;font-size:var(--font-sm);font-weight:var(--weight-semibold)}.task-exec-done-completed{color:var(--green);background:color-mix(in srgb,var(--green) 8%,transparent);border:1px solid color-mix(in srgb,var(--green) 20%,transparent)}.task-exec-done-failed{color:var(--red);background:color-mix(in srgb,var(--red) 8%,transparent);border:1px solid color-mix(in srgb,var(--red) 20%,transparent)}.task-exec-done-icon{font-size:var(--font-base)}.task-exec-done-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (prefers-reduced-motion: reduce){.task-exec-progress-fill{animation:none;width:100%;opacity:.5}}.task-title-display{font-size:var(--font-lg, 1.1rem);font-weight:600;color:var(--text);line-height:1.3}.task-title-display.editable{cursor:pointer;border-radius:4px;padding:var(--space-1) var(--space-2);margin:calc(-1 * var(--space-1)) calc(-1 * var(--space-2));display:flex;align-items:baseline;gap:var(--space-1-5)}.task-title-display.editable:hover{background:var(--bg-hover)}.task-title-display.editable:hover .task-edit-icon,.task-description.editable:hover .task-edit-icon{opacity:1}.task-edit-icon{font-size:var(--font-sm);color:var(--text-dim);opacity:0;transition:opacity .15s;flex-shrink:0}.task-title-edit{margin:calc(-1 * var(--space-1)) calc(-1 * var(--space-2))}.task-title-input{width:100%;padding:var(--space-1) var(--space-2);background:var(--bg-surface);border:1px solid var(--accent);border-radius:4px;color:var(--text);font-size:var(--font-lg, 1.1rem);font-weight:600;font-family:inherit;outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent);box-sizing:border-box}.task-description{font-size:var(--font-base);line-height:1.5;color:var(--text);background:var(--bg-hover);padding:var(--space-2-5) var(--space-3);border-radius:6px;white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word;overflow-x:hidden}.task-description.editable{cursor:pointer;display:flex;align-items:flex-start;gap:var(--space-1-5);transition:background .15s}.task-description.editable:hover{background:var(--bg-surface)}.task-description-edit{display:flex;flex-direction:column;gap:var(--space-2)}.task-description-textarea{width:100%;padding:var(--space-2-5) var(--space-3);background:var(--bg-surface);border:1px solid var(--accent);border-radius:6px;color:var(--text);font-size:var(--font-base);font-family:inherit;line-height:1.5;resize:vertical;outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent);box-sizing:border-box}.task-edit-actions{display:flex;align-items:center;gap:var(--space-2)}.task-edit-save,.task-edit-cancel{padding:var(--space-1) var(--space-2-5);border:1px solid var(--border);border-radius:4px;font-size:var(--font-sm);cursor:pointer;background:var(--bg-surface);color:var(--text)}.task-edit-save{background:var(--accent);color:var(--bg);border-color:var(--accent)}.task-edit-save:hover{opacity:.9}.task-edit-cancel:hover{border-color:var(--text-dim)}.task-edit-hint{font-size:var(--font-xs, .7rem);color:var(--text-dim);margin-left:auto}.task-add-description-btn{padding:var(--space-1-5) var(--space-2-5);background:transparent;border:1px dashed var(--border);border-radius:6px;color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;width:100%;text-align:left}.task-add-description-btn:hover{border-color:var(--accent);color:var(--accent)}.task-acceptance-criteria .task-criteria-list{list-style:none;padding:0;margin:0}.task-criterion{font-size:var(--font-base);color:var(--text);padding:var(--space-1) 0 var(--space-1) var(--space-5);border-bottom:1px solid var(--border);position:relative}.task-criterion.editable{cursor:pointer;display:flex;align-items:center;padding-right:var(--space-6)}.task-criterion.editable:hover{background:var(--bg-hover);border-radius:4px}.task-criterion.editing{padding-left:var(--space-5)}.task-criterion.editing:before{content:"\2610";position:absolute;left:0;color:var(--text-dim);font-size:var(--font-base)}.task-criterion-text{flex:1;min-width:0}.task-criterion-remove{position:absolute;right:0;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-dim);font-size:var(--font-base);cursor:pointer;padding:var(--space-1);opacity:0;transition:opacity .15s}.task-criterion.editable:hover .task-criterion-remove{opacity:1}.task-criterion-remove:hover{color:var(--red, #e74c3c)}.task-criterion-input{width:100%;padding:var(--space-1) var(--space-1-5);background:var(--bg-surface);border:1px solid var(--accent);border-radius:3px;color:var(--text);font-size:var(--font-base);font-family:inherit;outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent);box-sizing:border-box}.task-criterion-add-form{display:flex;align-items:center;gap:var(--space-1);margin-top:var(--space-2)}.task-criterion-add-input{flex:1;min-width:0;padding:var(--space-1) var(--space-2);background:var(--bg-surface);border:1px solid var(--accent);border-radius:4px;color:var(--text);font-size:var(--font-sm);font-family:inherit;outline:none;box-sizing:border-box}.task-criterion-add-input:focus{box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.task-criterion-add-confirm,.task-criterion-add-cancel{background:none;border:1px solid var(--border);border-radius:3px;color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;padding:var(--space-1) var(--space-1-5)}.task-criterion-add-confirm:hover{color:var(--green, #2ecc71);border-color:var(--green, #2ecc71)}.task-criterion-add-cancel:hover{color:var(--red, #e74c3c);border-color:var(--red, #e74c3c)}.task-criterion-add-confirm:disabled{opacity:.4;cursor:not-allowed}.task-criterion-add-btn{display:inline-block;margin-top:var(--space-2);padding:var(--space-1) var(--space-2);background:transparent;border:1px dashed var(--border);border-radius:4px;color:var(--text-dim);font-size:var(--font-sm);cursor:pointer}.task-criterion-add-btn:hover{border-color:var(--accent);color:var(--accent)}.task-criterion:last-child{border-bottom:none}.task-criterion:before{content:"\2610";position:absolute;left:0;color:var(--text-dim);font-size:var(--font-base)}.task-priority-select{width:100%;padding:var(--space-1-5) var(--space-2-5);background:var(--bg-surface);border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:var(--font-base);outline:none;cursor:pointer}.task-priority-select:focus-visible{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.task-priority-select.prd-priority-critical{color:var(--red)}.task-priority-select.prd-priority-high{color:var(--orange)}.task-priority-select.prd-priority-medium{color:var(--text-dim)}.task-priority-select.prd-priority-low{color:var(--text-dim);opacity:.8}.task-tag-editor{display:flex;flex-wrap:wrap;gap:var(--space-1);align-items:center}.task-tag{display:inline-flex;align-items:center;gap:3px;font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px}.task-tag-remove{background:none;border:none;color:var(--text-dim);font-size:var(--font-base);cursor:pointer;padding:0 1px;line-height:1;opacity:.6}.task-tag-remove:hover{opacity:1;color:var(--red)}.task-tag-add-btn{background:none;border:1px dashed var(--border);color:var(--text-dim);font-size:var(--font-sm);padding:1px var(--space-1-5);border-radius:3px;cursor:pointer}.task-tag-add-btn:hover{border-color:var(--accent);color:var(--accent)}.task-tag-input-wrapper{display:inline-flex;align-items:center;gap:2px}.task-tag-input{width:80px;padding:2px var(--space-1-5);background:var(--bg-surface);border:1px solid var(--accent);border-radius:3px;color:var(--text);font-size:var(--font-sm);outline:none}.task-tag-input:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.task-tag-confirm{background:none;border:none;color:var(--accent);font-size:var(--font-base);cursor:pointer;padding:0 2px}.task-dependency-list{display:flex;flex-direction:column;gap:var(--space-1)}.task-dependency-item{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1) var(--space-2);border-radius:4px;font-size:var(--font-base);cursor:pointer;transition:background-color .1s}.task-dependency-item:hover{background:var(--bg-hover)}.task-dependency-item.resolved{opacity:.6}.task-dep-status{flex-shrink:0;font-size:var(--font-sm)}.task-dep-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-children-list{display:flex;flex-direction:column;gap:2px}.task-child-item{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1) var(--space-2);border-radius:4px;font-size:var(--font-base);cursor:pointer;transition:background-color .1s}.task-child-item:hover{background:var(--bg-hover)}.task-child-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-add-child-btn{display:inline-flex;align-items:center;gap:var(--space-1);padding:var(--space-1-5) var(--space-3);margin-top:var(--space-2);background:var(--bg-surface);border:1px dashed var(--border);border-radius:6px;color:var(--text-dim);font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:all .15s}.task-add-child-btn:hover{border-color:var(--accent);border-style:solid;color:var(--accent);background:color-mix(in srgb,var(--accent) 8%,transparent)}.task-add-child-form{margin-top:var(--space-2);padding:var(--space-2-5);background:var(--bg-surface);border:1px solid var(--border);border-radius:6px}.task-add-child-error{color:var(--red, #e74c3c);font-size:var(--font-sm);margin-bottom:var(--space-1-5);padding:var(--space-1) var(--space-2);background:color-mix(in srgb,var(--red, #e74c3c) 10%,transparent);border-radius:4px}.task-add-child-row{display:flex;align-items:center;gap:var(--space-1-5)}.task-add-child-title{flex:1;min-width:0;padding:var(--space-1-5) var(--space-2);background:var(--bg-main, var(--bg));border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:var(--font-base);font-family:inherit}.task-add-child-title:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.task-add-child-actions{display:flex;align-items:center;gap:var(--space-1-5);margin-top:var(--space-2)}.task-add-child-more{padding:var(--space-1) var(--space-2);background:var(--bg-hover);border:1px solid var(--border);border-radius:4px;color:var(--text-dim);font-size:var(--font-base);cursor:pointer;transition:all .15s}.task-add-child-more:hover,.task-add-child-more.active{border-color:var(--accent);color:var(--accent)}.task-add-child-submit{padding:var(--space-1) var(--space-3);background:var(--accent);border:1px solid var(--accent);border-radius:4px;color:#fff;font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:opacity .15s}.task-add-child-submit:hover:not(:disabled){opacity:.9}.task-add-child-submit:disabled{opacity:.4;cursor:not-allowed}.task-add-child-cancel{padding:var(--space-1) var(--space-2-5);background:transparent;border:1px solid var(--border);border-radius:4px;color:var(--text-dim);font-size:var(--font-base);cursor:pointer;transition:all .15s}.task-add-child-cancel:hover{border-color:var(--text-dim);color:var(--text)}.task-add-child-extra{margin-top:var(--space-2);display:flex;flex-direction:column;gap:var(--space-1-5)}.task-add-child-description{padding:var(--space-1-5) var(--space-2);background:var(--bg-main, var(--bg));border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:var(--font-base);font-family:inherit;resize:vertical}.task-add-child-description:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.task-add-child-priority-row{display:flex;align-items:center;gap:var(--space-1-5)}.task-add-child-priority-label{font-size:var(--font-sm);color:var(--text-dim)}.task-add-child-priority{padding:var(--space-1) var(--space-2);background:var(--bg-main, var(--bg));border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:var(--font-base)}.task-timestamps .detail-row{font-size:var(--font-base)}.rex-command-bar{display:flex;flex-wrap:wrap;gap:var(--space-1-5);margin-bottom:var(--space-4)}.rex-command-btn{display:inline-flex;align-items:center;gap:var(--space-1);padding:var(--space-1-5) var(--space-3-5);background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;color:var(--text-dim);font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:all .15s}.rex-command-btn:hover{border-color:var(--accent);color:var(--text)}.rex-command-btn.active{background:color-mix(in srgb,var(--accent) 12%,transparent);border-color:var(--accent);color:var(--accent)}.rex-toast{position:fixed;bottom:var(--space-5);left:50%;transform:translate(-50%);background:var(--green);color:#fff;padding:var(--space-2) var(--space-5);border-radius:6px;font-size:var(--font-base);font-weight:var(--weight-medium);z-index:1000;animation:rex-toast-in .2s ease;box-shadow:0 4px 12px #0000004d}@keyframes rex-toast-in{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.rex-toast-error{background:var(--red)}.rex-add-form{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-5);margin-bottom:var(--space-4)}.rex-add-form-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-4);padding-bottom:var(--space-3);border-bottom:1px solid var(--border)}.rex-add-form-title{font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text)}.rex-add-form-close{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:none;border:1px solid transparent;border-radius:var(--radius-sm);color:var(--text-dim);font-size:var(--font-xl);cursor:pointer;transition:all var(--transition-normal);line-height:1}.rex-add-form-close:hover{background:var(--bg-hover);border-color:var(--border);color:var(--text)}.rex-add-form-error{background:color-mix(in srgb,var(--red) 12%,transparent);border:1px solid color-mix(in srgb,var(--red) 40%,transparent);border-radius:var(--radius-md);color:var(--red);padding:var(--space-2) var(--space-3);font-size:var(--font-sm);font-weight:var(--weight-medium);margin-bottom:var(--space-4)}.rex-add-form-field{margin-bottom:var(--space-4)}.rex-add-form-field:last-of-type{margin-bottom:0}.rex-add-form-label{display:block;font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:var(--tracking-wider);color:var(--text-dim);margin-bottom:var(--space-2)}.rex-add-form-optional{font-weight:var(--weight-normal);text-transform:none;letter-spacing:var(--tracking-normal);color:var(--text-muted)}.rex-add-form-level-group{display:flex;gap:var(--space-1)}.rex-add-form-level-btn{flex:1;padding:var(--space-2) var(--space-2);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-sm);font-weight:var(--weight-semibold);cursor:pointer;text-transform:uppercase;letter-spacing:var(--tracking-wider);transition:all var(--transition-normal)}.rex-add-form-level-btn:hover{border-color:var(--text-muted);color:var(--text);background:var(--bg-hover)}.rex-add-form-level-btn:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.rex-add-form-level-btn.active.prd-level-epic{background:color-mix(in srgb,var(--purple) 20%,transparent);border-color:var(--purple);color:var(--purple)}.rex-add-form-level-btn.active.prd-level-feature{background:color-mix(in srgb,var(--accent) 20%,transparent);border-color:var(--accent);color:var(--accent)}.rex-add-form-level-btn.active.prd-level-task,.rex-add-form-level-btn.active.prd-level-subtask{background:var(--bg-hover);border-color:var(--text-dim);color:var(--text)}.rex-add-form-input,.rex-add-form-textarea,.rex-add-form-select{width:100%;padding:var(--space-2) var(--space-3);background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:var(--font-base);font-family:inherit;line-height:var(--leading-normal);outline:none;box-sizing:border-box;transition:border-color var(--transition-normal),box-shadow var(--transition-normal)}.rex-add-form-input::placeholder,.rex-add-form-textarea::placeholder{color:var(--text-muted)}.rex-add-form-input:focus-visible,.rex-add-form-textarea:focus-visible,.rex-add-form-select:focus-visible{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.rex-add-form-input-error{border-color:var(--red)}.rex-add-form-input-error:focus-visible{border-color:var(--red);box-shadow:0 0 0 2px color-mix(in srgb,var(--red) 25%,transparent)}.rex-add-form-field-hint{font-size:var(--font-xs);margin-top:var(--space-1);line-height:var(--leading-normal)}.rex-add-form-field-hint-error{color:var(--red);font-weight:var(--weight-medium)}.rex-add-form-textarea{resize:vertical;min-height:72px}.rex-add-form-actions{display:flex;gap:var(--space-2);justify-content:flex-end;margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--border)}.rex-add-form-btn{padding:var(--space-2) var(--space-4);border:1px solid var(--border);border-radius:var(--radius-md);font-size:var(--font-sm);font-weight:var(--weight-medium);cursor:pointer;transition:all var(--transition-normal)}.rex-add-form-btn-cancel{background:var(--bg-surface);color:var(--text-dim)}.rex-add-form-btn-cancel:hover{border-color:var(--text-muted);color:var(--text);background:var(--bg-hover)}.rex-add-form-btn-submit{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:var(--weight-semibold)}.rex-add-form-btn-submit:hover:not(:disabled){opacity:.9}.rex-add-form-btn-submit:disabled{opacity:.4;cursor:not-allowed}.prd-node-actions{display:flex;align-items:center;gap:2px;margin-left:auto;flex-shrink:0;opacity:0;transition:opacity var(--transition-normal)}.prd-node-row:hover .prd-node-actions,.prd-node-row:focus-within .prd-node-actions,.prd-node-selected .prd-node-actions{opacity:1}.prd-node-action{display:flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;background:none;border:1px solid transparent;border-radius:var(--radius-sm);color:var(--text-muted);font-size:var(--font-base);line-height:1;cursor:pointer;flex-shrink:0;transition:background var(--transition-normal),border-color var(--transition-normal),color var(--transition-normal)}.prd-node-action:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.prd-inline-add-btn{font-size:var(--font-md);font-weight:var(--weight-bold)}.prd-inline-add-btn:hover{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:var(--accent);color:var(--accent)}.prd-inline-add-btn.active{background:color-mix(in srgb,var(--accent) 20%,transparent);border-color:var(--accent);color:var(--accent)}.prd-node-action-edit:hover,.prd-node-action-status:hover{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:var(--accent);color:var(--accent)}.prd-node-action-delete:hover{background:color-mix(in srgb,var(--red) 15%,transparent);border-color:var(--red);color:var(--red)}.prd-node-action-delete:focus-visible{outline:2px solid var(--red);outline-offset:-1px}.prd-inline-add-form{display:flex;flex-direction:column;gap:var(--space-1-5);padding-top:var(--space-1);padding-bottom:var(--space-1-5);padding-right:var(--space-3);border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--accent) 4%,var(--bg-surface));animation:prd-inline-add-slide-in .15s ease-out}@keyframes prd-inline-add-slide-in{0%{opacity:0;max-height:0}to{opacity:1;max-height:200px}}.prd-inline-add-error{font-size:var(--font-xs);color:var(--red);font-weight:var(--weight-medium);padding:2px 0}.prd-inline-add-row{display:flex;align-items:center;gap:var(--space-1-5)}.prd-inline-add-title{flex:1;min-width:0;padding:var(--space-1) var(--space-2);background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:var(--font-base);font-family:inherit;outline:none;transition:border-color var(--transition-normal),box-shadow var(--transition-normal)}.prd-inline-add-title::placeholder{color:var(--text-muted)}.prd-inline-add-title:focus-visible{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.prd-inline-add-more,.prd-inline-add-submit,.prd-inline-add-cancel{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-dim);font-size:var(--font-base);cursor:pointer;flex-shrink:0;transition:all var(--transition-normal)}.prd-inline-add-more:hover{border-color:var(--text-muted);color:var(--text);background:var(--bg-hover)}.prd-inline-add-more.active{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent)}.prd-inline-add-submit{color:var(--green);border-color:color-mix(in srgb,var(--green) 40%,transparent)}.prd-inline-add-submit:hover:not(:disabled){background:color-mix(in srgb,var(--green) 15%,transparent);border-color:var(--green)}.prd-inline-add-submit:disabled{opacity:.3;cursor:not-allowed}.prd-inline-add-cancel:hover{border-color:var(--red);color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}.prd-inline-add-more:focus-visible,.prd-inline-add-submit:focus-visible,.prd-inline-add-cancel:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.prd-inline-add-extra{display:flex;flex-direction:column;gap:var(--space-1-5);margin-left:52px}.prd-inline-add-description{width:100%;padding:var(--space-1) var(--space-2);background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:var(--font-sm);font-family:inherit;outline:none;resize:vertical;min-height:40px;box-sizing:border-box;transition:border-color var(--transition-normal),box-shadow var(--transition-normal)}.prd-inline-add-description::placeholder{color:var(--text-muted)}.prd-inline-add-description:focus-visible{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 25%,transparent)}.prd-inline-add-priority-row{display:flex;align-items:center;gap:var(--space-1-5)}.prd-inline-add-priority-label{font-size:var(--font-xs);color:var(--text-dim);font-weight:var(--weight-medium);text-transform:uppercase;letter-spacing:var(--tracking-wider)}.prd-inline-add-priority{padding:2px var(--space-1-5);background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-size:var(--font-sm);font-family:inherit;outline:none;transition:border-color var(--transition-normal)}.prd-inline-add-priority:focus-visible{border-color:var(--accent)}.rex-analyze-panel{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:var(--space-4);margin-bottom:var(--space-4)}.rex-analyze-header{margin-bottom:var(--space-3)}.rex-analyze-title{font-size:var(--font-md);font-weight:var(--weight-semibold)}.rex-analyze-controls{display:flex;align-items:center;gap:var(--space-3);margin-bottom:var(--space-3)}.rex-analyze-checkbox-label{font-size:var(--font-base);color:var(--text-dim);display:flex;align-items:center;gap:var(--space-1);cursor:pointer}.rex-analyze-btn{padding:var(--space-2) var(--space-4);border:1px solid var(--border);border-radius:6px;font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:all .15s}.rex-analyze-btn-run{background:var(--accent);border-color:var(--accent);color:#fff;margin-left:auto}.rex-analyze-btn-run:hover{opacity:.9}.rex-analyze-btn-run:disabled{opacity:.5;cursor:not-allowed}.rex-analyze-progress{display:flex;align-items:center;gap:var(--space-2-5);padding:var(--space-3);background:color-mix(in srgb,var(--accent) 8%,transparent);border-radius:6px;font-size:var(--font-base);color:var(--text);margin-bottom:var(--space-3)}.rex-analyze-spinner{width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:rex-spin .6s linear infinite;flex-shrink:0}@keyframes rex-spin{to{transform:rotate(360deg)}}.rex-analyze-error{background:color-mix(in srgb,var(--red) 15%,transparent);border:1px solid var(--red);border-radius:4px;color:var(--red);padding:var(--space-2) var(--space-3);font-size:var(--font-base);margin-bottom:var(--space-3)}.rex-analyze-empty{text-align:center;padding:var(--space-5);color:var(--text-dim)}.rex-analyze-empty p{margin-bottom:var(--space-1)}.rex-analyze-hint{font-size:var(--font-base)}.rex-analyze-selection{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2-5);padding-bottom:var(--space-2-5);border-bottom:1px solid var(--border)}.rex-analyze-count{font-size:var(--font-base);color:var(--text-dim);font-weight:var(--weight-medium)}.rex-analyze-select-btn{background:none;border:none;color:var(--accent);font-size:var(--font-sm);cursor:pointer;padding:2px var(--space-1)}.rex-analyze-select-btn:hover{text-decoration:underline}.rex-analyze-proposals{display:flex;flex-direction:column;gap:var(--space-1-5);max-height:400px;overflow-y:auto;margin-bottom:var(--space-3)}.rex-proposal-card{border:1px solid var(--border);border-radius:6px;overflow:hidden;transition:border-color .15s}.rex-proposal-card.selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 5%,transparent)}.rex-proposal-header{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-2-5);cursor:pointer;font-size:var(--font-base)}.rex-proposal-header:hover{background:var(--bg-hover)}.rex-proposal-info{display:flex;align-items:center;gap:var(--space-1-5);flex:1;min-width:0}.rex-proposal-title{font-weight:var(--weight-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rex-proposal-count{font-size:var(--font-sm);color:var(--text-dim);white-space:nowrap;flex-shrink:0}.rex-proposal-expand{background:none;border:none;color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;padding:var(--space-1);transition:transform .15s}.rex-proposal-expand.open{transform:rotate(90deg)}.rex-proposal-details{padding:0 var(--space-2-5) var(--space-2-5) var(--space-8);border-top:1px solid var(--border)}.rex-proposal-desc{font-size:var(--font-base);color:var(--text-dim);margin:var(--space-2) 0;line-height:1.4}.rex-proposal-feature{margin-top:var(--space-2)}.rex-proposal-feature-header{display:flex;align-items:center;gap:var(--space-1-5);font-size:var(--font-base);font-weight:var(--weight-medium);margin-bottom:var(--space-1)}.rex-proposal-tasks{padding-left:var(--space-4)}.rex-proposal-task{display:flex;align-items:center;gap:var(--space-1-5);font-size:var(--font-base);padding:2px 0;color:var(--text-dim)}.rex-proposal-task-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rex-analyze-accept-bar{display:flex;justify-content:flex-end}.rex-analyze-btn-accept{background:var(--green);border-color:var(--green);color:#fff}.rex-analyze-btn-accept:hover{opacity:.9}.rex-analyze-btn-accept:disabled{opacity:.5;cursor:not-allowed}.rex-analyze-btn-review{background:var(--accent);border-color:var(--accent);color:#fff}.rex-analyze-btn-review:hover{opacity:.9}.proposal-editor{display:flex;flex-direction:column;gap:var(--space-3)}.proposal-editor-header{margin-bottom:var(--space-1)}.proposal-editor-title{font-size:var(--font-md);font-weight:var(--weight-semibold);margin:0 0 4px}.proposal-editor-subtitle{font-size:var(--font-base);color:var(--text-dim);margin:0}.proposal-editor-toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);padding:var(--space-1-5) 0;border-bottom:1px solid var(--border)}.proposal-editor-counts{display:flex;gap:var(--space-1-5)}.proposal-editor-count-badge{font-size:var(--font-sm);padding:2px var(--space-1-5);border-radius:4px;background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent);font-weight:var(--weight-medium)}.proposal-editor-select-btns{display:flex;gap:var(--space-1)}.proposal-editor-select-btn{background:none;border:1px solid var(--border);border-radius:4px;padding:2px var(--space-2);font-size:var(--font-sm);cursor:pointer;color:var(--text)}.proposal-editor-select-btn:hover{background:var(--bg-hover)}.proposal-editor-errors{background:color-mix(in srgb,var(--red) 10%,transparent);border:1px solid var(--red);border-radius:6px;padding:var(--space-2) var(--space-3);font-size:var(--font-base);color:var(--red)}.proposal-editor-errors ul{margin:var(--space-1) 0 0;padding-left:var(--space-4)}.proposal-editor-errors li{margin:2px 0}.proposal-editor-error{background:color-mix(in srgb,var(--red) 10%,transparent);border:1px solid var(--red);border-radius:6px;padding:var(--space-2) var(--space-3);font-size:var(--font-base);color:var(--red)}.proposal-editor-tree{display:flex;flex-direction:column;gap:var(--space-2);max-height:500px;overflow-y:auto}.proposal-editor-epic{border:1px solid var(--border);border-radius:6px;overflow:hidden}.proposal-editor-epic.deselected{opacity:.5}.proposal-editor-epic.has-error{border-color:var(--red)}.proposal-editor-epic-header{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-2) var(--space-2-5);background:color-mix(in srgb,var(--accent) 3%,transparent)}.proposal-editor-epic-body{padding:var(--space-1) var(--space-2-5) var(--space-2) var(--space-8)}.proposal-editor-feature{margin:var(--space-1) var(--space-2-5) var(--space-1) var(--space-8);border:1px solid var(--border);border-radius:4px;overflow:hidden}.proposal-editor-feature.deselected{opacity:.6}.proposal-editor-feature.has-error{border-color:var(--red)}.proposal-editor-feature-header{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1-5) var(--space-2);font-size:var(--font-base)}.proposal-editor-feature-body{padding:var(--space-1) var(--space-2) var(--space-1-5) var(--space-6)}.proposal-editor-task{margin:3px var(--space-2) 3px var(--space-6);border:1px solid var(--border);border-radius:4px;overflow:hidden}.proposal-editor-task.deselected{opacity:.6}.proposal-editor-task.has-error{border-color:var(--red)}.proposal-editor-task-header{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1) var(--space-2);font-size:var(--font-base)}.proposal-editor-task-body{padding:var(--space-1) var(--space-2) var(--space-1-5) var(--space-6);display:flex;flex-direction:column;gap:var(--space-1-5)}.proposal-editor-task-meta{display:flex;gap:var(--space-3);flex-wrap:wrap}.proposal-editor-meta-label{display:flex;flex-direction:column;gap:2px;font-size:var(--font-sm);color:var(--text-dim)}.proposal-editor-input{flex:1;min-width:0;background:var(--bg-surface);border:1px solid var(--border);border-radius:4px;padding:3px var(--space-1-5);font-size:var(--font-base);color:var(--text);font-family:inherit}.proposal-editor-input:focus{outline:none;border-color:var(--accent)}.proposal-editor-input:disabled{opacity:.5}.proposal-editor-input.input-error{border-color:var(--red);background:color-mix(in srgb,var(--red) 5%,var(--bg-surface))}.proposal-editor-input-title{font-weight:var(--weight-medium)}.proposal-editor-input-tags{flex:none;width:160px}.proposal-editor-textarea{width:100%;background:var(--bg-surface);border:1px solid var(--border);border-radius:4px;padding:var(--space-1) var(--space-1-5);font-size:var(--font-base);color:var(--text);font-family:inherit;resize:vertical;min-height:32px;box-sizing:border-box}.proposal-editor-textarea:focus{outline:none;border-color:var(--accent)}.proposal-editor-textarea:disabled{opacity:.5}.proposal-editor-select{background:var(--bg-surface);border:1px solid var(--border);border-radius:4px;padding:2px var(--space-1);font-size:var(--font-base);color:var(--text)}.proposal-editor-select:disabled{opacity:.5}.proposal-editor-item-count{font-size:var(--font-sm);color:var(--text-dim);white-space:nowrap;flex-shrink:0}.proposal-editor-expand{background:none;border:none;color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;padding:var(--space-1);transition:transform .15s;flex-shrink:0}.proposal-editor-expand.open{transform:rotate(90deg)}.proposal-editor-actions{display:flex;justify-content:flex-end;gap:var(--space-2);padding-top:var(--space-2);border-top:1px solid var(--border)}.proposal-editor-btn{padding:var(--space-1-5) var(--space-3-5);border-radius:6px;border:1px solid var(--border);font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer}.proposal-editor-btn:disabled{opacity:.5;cursor:not-allowed}.proposal-editor-btn-cancel{background:none;color:var(--text)}.proposal-editor-btn-cancel:hover{background:var(--bg-hover)}.proposal-editor-btn-accept{background:var(--green);border-color:var(--green);color:#fff}.proposal-editor-btn-accept:hover{opacity:.9}.rex-bulk-bar{position:fixed;bottom:var(--space-5);left:50%;transform:translate(-50%);display:flex;align-items:center;gap:var(--space-3);background:var(--bg-surface);border:1px solid var(--accent);border-radius:10px;padding:var(--space-2) var(--space-4);box-shadow:0 8px 24px #0006;z-index:100;animation:rex-toast-in .2s ease}.rex-bulk-count{font-size:var(--font-base);color:var(--text);white-space:nowrap}.rex-bulk-count-num{font-weight:var(--weight-bold);color:var(--accent);margin-right:2px}.rex-bulk-label{font-size:var(--font-sm);color:var(--text-dim);white-space:nowrap}.rex-bulk-actions{display:flex;align-items:center;gap:var(--space-1)}.rex-bulk-action-btn{display:flex;align-items:center;gap:3px;padding:var(--space-1) var(--space-2);border:1px solid var(--border);border-radius:4px;background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;transition:all .15s;white-space:nowrap}.rex-bulk-action-btn:hover{border-color:currentColor;color:var(--text)}.rex-bulk-action-btn.prd-status-completed:hover{color:var(--green);border-color:var(--green)}.rex-bulk-action-btn.prd-status-in_progress:hover{color:var(--accent);border-color:var(--accent)}.rex-bulk-action-btn.prd-status-blocked:hover{color:var(--red);border-color:var(--red)}.rex-bulk-action-btn.prd-status-deferred:hover{color:var(--orange);border-color:var(--orange)}.rex-bulk-action-icon,.rex-bulk-action-label{font-size:var(--font-sm)}.rex-bulk-result{font-size:var(--font-base);color:var(--green);font-weight:var(--weight-medium)}.rex-bulk-clear{background:none;border:none;color:var(--text-dim);font-size:var(--font-lg);cursor:pointer;padding:0 2px;line-height:1;margin-left:var(--space-1)}.rex-bulk-clear:hover{color:var(--text)}.rex-bulk-merge-btn:hover{color:var(--accent);border-color:var(--accent)}.prd-node-bulk-selected{background:color-mix(in srgb,var(--accent) 12%,transparent);outline:1px solid color-mix(in srgb,var(--accent) 25%,transparent);outline-offset:-1px;border-radius:4px}.prd-node-bulk-selected:hover{background:color-mix(in srgb,var(--accent) 18%,transparent)}.merge-preview{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:var(--space-4);margin-bottom:var(--space-3);animation:rex-toast-in .2s ease}.merge-preview-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.merge-preview-header h3{margin:0;font-size:var(--font-md);color:var(--text)}.merge-preview-close{background:none;border:none;color:var(--text-dim);font-size:var(--font-xl);cursor:pointer;padding:0 4px;line-height:1}.merge-preview-close:hover{color:var(--text)}.merge-preview-error{background:color-mix(in srgb,var(--red) 10%,transparent);border:1px solid var(--red);border-radius:4px;padding:var(--space-2) var(--space-3);margin-bottom:var(--space-3);color:var(--red);font-size:var(--font-base)}.merge-preview-success{background:color-mix(in srgb,var(--green) 10%,transparent);border:1px solid var(--green);border-radius:4px;padding:var(--space-2) var(--space-3);margin-bottom:var(--space-3);color:var(--green);font-size:var(--font-base);font-weight:var(--weight-medium)}.merge-preview-section{margin-bottom:var(--space-3)}.merge-preview-label{display:block;font-size:var(--font-sm);color:var(--text-dim);margin-bottom:var(--space-1);text-transform:uppercase;letter-spacing:.5px}.merge-preview-select{width:100%;padding:var(--space-1-5) var(--space-2);background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:var(--font-base)}.merge-preview-input{width:100%;padding:var(--space-1-5) var(--space-2);background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:var(--font-base);box-sizing:border-box}.merge-preview-input::placeholder{color:var(--text-dim)}.merge-preview-loading{padding:var(--space-3);text-align:center;color:var(--text-dim);font-size:var(--font-base)}.merge-preview-details{margin-top:12px}.merge-preview-details h4{margin:0 0 8px;font-size:var(--font-base);color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px}.merge-preview-card{border:1px solid var(--border);border-radius:6px;padding:var(--space-2-5) var(--space-3);margin-bottom:var(--space-2)}.merge-preview-card-target{border-color:var(--green);background:color-mix(in srgb,var(--green) 5%,transparent)}.merge-preview-card-absorbed{border-color:var(--text-dim);opacity:.7}.merge-preview-card-title{display:flex;align-items:center;gap:var(--space-1-5);margin-bottom:var(--space-1)}.merge-preview-card-icon{font-size:var(--font-md);color:var(--green)}.merge-preview-card-icon.absorbed{color:var(--red)}.merge-preview-field{font-size:var(--font-sm);color:var(--text-dim);margin-top:var(--space-1)}.merge-preview-field-label{font-weight:var(--weight-medium)}.merge-preview-criteria{margin:var(--space-1) 0 0 var(--space-4);padding:0;font-size:var(--font-sm);color:var(--text-dim)}.merge-preview-criteria li{margin-bottom:2px}.merge-preview-tags{display:inline-flex;gap:var(--space-1);margin-left:var(--space-1)}.merge-preview-absorbed{margin-top:12px}.merge-preview-deps{margin-top:var(--space-2);padding:var(--space-1-5) var(--space-2-5);background:color-mix(in srgb,var(--orange) 8%,transparent);border-radius:4px;font-size:var(--font-sm);color:var(--orange)}.merge-preview-actions{display:flex;justify-content:flex-end;gap:var(--space-2);margin-top:var(--space-4);padding-top:12px;border-top:1px solid var(--border)}.merge-preview-btn{padding:var(--space-1-5) var(--space-4);border-radius:4px;font-size:var(--font-base);cursor:pointer;border:1px solid var(--border);transition:all .15s}.merge-preview-btn:disabled{opacity:.5;cursor:not-allowed}.merge-preview-btn-cancel{background:var(--bg);color:var(--text-dim)}.merge-preview-btn-cancel:hover:not(:disabled){color:var(--text);border-color:var(--text-dim)}.merge-preview-btn-merge{background:var(--accent);color:var(--bg);border-color:var(--accent);font-weight:var(--weight-medium)}.merge-preview-btn-merge:hover:not(:disabled){filter:brightness(1.1)}.merge-preview-empty{padding:var(--space-3);text-align:center;color:var(--text-dim);font-size:var(--font-base)}.prune-confirmation{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:var(--space-4);margin-bottom:var(--space-3);animation:rex-toast-in .2s ease}.prune-confirmation-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.prune-confirmation-header h3{margin:0;font-size:var(--font-md);color:var(--text)}.prune-confirmation-close{background:none;border:none;color:var(--text-dim);font-size:var(--font-xl);cursor:pointer;padding:0 4px;line-height:1}.prune-confirmation-close:hover{color:var(--text)}.prune-confirmation-close:disabled{opacity:.5;cursor:not-allowed}.prune-confirmation-loading{display:flex;align-items:center;gap:var(--space-2-5);padding:var(--space-4);color:var(--text-dim);font-size:var(--font-base);justify-content:center}.prune-confirmation-error{background:color-mix(in srgb,var(--red) 10%,transparent);border:1px solid var(--red);border-radius:4px;padding:var(--space-2) var(--space-3);margin-bottom:var(--space-3);color:var(--red);font-size:var(--font-base)}.prune-confirmation-success{background:color-mix(in srgb,var(--green) 10%,transparent);border:1px solid var(--green);border-radius:4px;padding:var(--space-2-5) var(--space-3-5);margin-bottom:var(--space-3);color:var(--green);font-size:var(--font-base);font-weight:var(--weight-medium)}.prune-confirmation-empty{text-align:center;padding:var(--space-4);color:var(--text-dim)}.prune-confirmation-empty p{margin:0 0 6px}.prune-confirmation-hint{font-size:var(--font-base);opacity:.8}.prune-confirmation-warning{display:flex;gap:var(--space-2-5);background:color-mix(in srgb,var(--orange) 10%,transparent);border:1px solid var(--orange);border-radius:6px;padding:var(--space-2-5) var(--space-3-5);margin-bottom:14px;font-size:var(--font-base);color:var(--orange);line-height:1.4}.prune-confirmation-warning strong{display:block;margin-bottom:2px}.prune-confirmation-warning p{margin:0;opacity:.9}.prune-confirmation-warning-icon{font-size:var(--font-xl);flex-shrink:0;line-height:1.2}.prune-confirmation-summary{display:flex;flex-wrap:wrap;gap:var(--space-3);align-items:center;padding:var(--space-2-5) var(--space-3-5);background:var(--bg-hover);border-radius:6px;margin-bottom:14px}.prune-confirmation-summary-stat{font-size:var(--font-base);color:var(--text)}.prune-confirmation-summary-num{font-weight:var(--weight-bold);color:var(--accent);margin-right:2px}.prune-confirmation-breakdown{display:flex;gap:var(--space-1-5);flex-wrap:wrap;margin-left:auto}.prune-confirmation-level-chip{font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;padding:2px var(--space-2);border-radius:3px;background:var(--bg-hover);color:var(--text-dim)}.prune-confirmation-level-chip.prd-level-epic{background:color-mix(in srgb,var(--purple) 20%,transparent);color:var(--purple)}.prune-confirmation-level-chip.prd-level-feature{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}.prune-confirmation-items{margin-bottom:14px}.prune-confirmation-items h4{margin:0 0 8px;font-size:var(--font-base);color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px}.prune-confirmation-item-list{display:flex;flex-direction:column;gap:var(--space-1);max-height:240px;overflow-y:auto}.prune-confirmation-item{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1-5) var(--space-2-5);border:1px solid var(--border);border-radius:4px;font-size:var(--font-base)}.prune-confirmation-item-icon{flex-shrink:0;font-size:var(--font-sm);width:14px;text-align:center;color:var(--green)}.prune-confirmation-item-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.prune-confirmation-item-count{font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px;flex-shrink:0}.prune-confirmation-option{margin-bottom:14px;padding:var(--space-2-5) var(--space-3-5);background:var(--bg-hover);border-radius:6px}.prune-confirmation-option-label{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-base);color:var(--text);cursor:pointer}.prune-confirmation-checkbox{width:15px;height:15px;accent-color:var(--accent);cursor:pointer}.prune-confirmation-option-hint{display:block;font-size:var(--font-sm);color:var(--text-dim);margin-top:var(--space-1);padding-left:23px}.prune-confirmation-result-details{display:flex;flex-direction:column;gap:var(--space-1-5);padding:var(--space-2-5) var(--space-3-5);background:var(--bg-hover);border-radius:6px}.prune-confirmation-field{font-size:var(--font-base);color:var(--text-dim)}.prune-confirmation-field-label{font-weight:var(--weight-medium)}.prune-confirmation-field code{font-size:var(--font-sm);background:var(--bg-surface);padding:1px var(--space-1-5);border-radius:3px;color:var(--accent)}.prune-confirmation-actions{display:flex;justify-content:flex-end;gap:var(--space-2);margin-top:var(--space-4);padding-top:12px;border-top:1px solid var(--border)}.prune-confirmation-btn{padding:var(--space-1-5) var(--space-4);border-radius:4px;font-size:var(--font-base);cursor:pointer;border:1px solid var(--border);transition:all .15s}.prune-confirmation-btn:disabled{opacity:.5;cursor:not-allowed}.prune-confirmation-btn-cancel{background:var(--bg);color:var(--text-dim)}.prune-confirmation-btn-cancel:hover:not(:disabled){color:var(--text);border-color:var(--text-dim)}.prune-confirmation-btn-next{background:var(--accent);color:var(--bg);border-color:var(--accent);font-weight:var(--weight-medium)}.prune-confirmation-btn-next:hover:not(:disabled){filter:brightness(1.1)}.prune-confirmation-btn-prune{background:var(--red);color:#fff;border-color:var(--red);font-weight:var(--weight-medium)}.prune-confirmation-btn-prune:hover:not(:disabled){filter:brightness(1.1)}.prune-criteria-desc{margin:0 0 14px;font-size:var(--font-base);color:var(--text-dim);line-height:1.5}.prune-criteria-section{margin-bottom:14px}.prune-criteria-label{display:block;font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);margin-bottom:var(--space-1-5)}.prune-criteria-chips{display:flex;gap:var(--space-1-5);flex-wrap:wrap}.prune-criteria-chip{padding:var(--space-1) var(--space-3);border-radius:4px;font-size:var(--font-base);border:1px solid var(--border);background:var(--bg);color:var(--text-dim);cursor:pointer;transition:all .15s}.prune-criteria-chip:hover{border-color:var(--text-dim);color:var(--text)}.prune-criteria-chip.active{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:var(--accent);color:var(--accent);font-weight:var(--weight-medium)}.prune-criteria-select{display:block;width:100%;max-width:220px;padding:var(--space-1-5) var(--space-2-5);border-radius:4px;font-size:var(--font-base);border:1px solid var(--border);background:var(--bg);color:var(--text);cursor:pointer;margin-bottom:var(--space-1)}.prune-criteria-select:focus{outline:none;border-color:var(--accent)}.prune-criteria-hint{display:block;font-size:var(--font-sm);color:var(--text-dim);opacity:.8;margin-top:var(--space-1)}.prune-criteria-active{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-1-5) var(--space-3);background:var(--bg-hover);border-radius:4px;margin-bottom:10px;font-size:var(--font-sm)}.prune-criteria-active-label{font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px}.prune-criteria-active-value{color:var(--text);padding:1px var(--space-2);background:var(--bg-surface);border-radius:3px;border:1px solid var(--border)}.prune-criteria-edit-btn{margin-left:auto;padding:2px var(--space-2-5);font-size:var(--font-sm);border-radius:3px;border:1px solid var(--border);background:var(--bg);color:var(--text-dim);cursor:pointer;transition:all .15s}.prune-criteria-edit-btn:hover{border-color:var(--accent);color:var(--accent)}.prune-dryrun-badge{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1-5) var(--space-3);background:color-mix(in srgb,var(--accent) 8%,transparent);border:1px solid color-mix(in srgb,var(--accent) 30%,transparent);border-radius:4px;font-size:var(--font-sm);color:var(--accent);margin-bottom:10px}.prune-dryrun-icon{font-size:var(--font-sm)}.prune-storage-stat{font-size:var(--font-base);color:var(--text-dim)}.prune-storage-savings{font-weight:var(--weight-bold);color:var(--green);margin-right:2px}.prune-storage-pct{font-size:var(--font-sm);opacity:.8}.prune-confirmation-item-age{font-size:var(--font-sm);color:var(--text-dim);opacity:.8;flex-shrink:0}.prune-diff-container{border:1px solid var(--border);border-radius:6px;background:var(--bg-surface);margin-bottom:14px;overflow:hidden}.prune-diff-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-2-5) var(--space-3-5);border-bottom:1px solid var(--border);background:var(--bg-hover)}.prune-diff-header h4{margin:0;font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text)}.prune-diff-controls{display:flex;align-items:center;gap:var(--space-1)}.prune-diff-filter-btn{padding:2px var(--space-2-5);font-size:var(--font-sm);border-radius:3px;border:1px solid var(--border);background:var(--bg);color:var(--text-dim);cursor:pointer;transition:all .15s}.prune-diff-filter-btn:hover{border-color:var(--text-dim);color:var(--text)}.prune-diff-filter-btn.active{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:var(--accent);color:var(--accent);font-weight:var(--weight-medium)}.prune-diff-separator{display:inline-block;width:1px;height:14px;background:var(--border);margin:0 4px}.prune-diff-toolbar-btn{padding:2px var(--space-2);font-size:var(--font-sm);border-radius:3px;border:1px solid var(--border);background:var(--bg);color:var(--text-dim);cursor:pointer;transition:all .15s}.prune-diff-toolbar-btn:hover{border-color:var(--text-dim);color:var(--text)}.prune-diff-legend{display:flex;gap:var(--space-4);padding:var(--space-1-5) var(--space-3-5);border-bottom:1px solid var(--border);font-size:var(--font-sm);color:var(--text-dim)}.prune-diff-legend-item{display:flex;align-items:center;gap:var(--space-1)}.prune-diff-overall-impact{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3-5);border-bottom:1px solid var(--border);font-size:var(--font-base);background:color-mix(in srgb,var(--accent) 4%,transparent)}.prune-diff-overall-label{font-weight:var(--weight-semibold);color:var(--text-dim);font-size:var(--font-sm);text-transform:uppercase;letter-spacing:.5px}.prune-diff-tree{max-height:340px;overflow-y:auto;padding:var(--space-1) 0}.prune-diff-node-row{display:flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1) var(--space-2-5);font-size:var(--font-base);cursor:pointer;border-radius:3px;transition:background .1s;user-select:none}.prune-diff-node-row:hover{background:var(--bg-hover)}.prune-diff-node-prunable{background:color-mix(in srgb,var(--red) 8%,transparent)}.prune-diff-node-prunable:hover{background:color-mix(in srgb,var(--red) 14%,transparent)}.prune-diff-node-affected{background:color-mix(in srgb,var(--orange) 4%,transparent)}.prune-diff-node-affected:hover{background:color-mix(in srgb,var(--orange) 8%,transparent)}.prune-diff-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;flex-shrink:0;font-size:var(--font-sm);color:var(--text-dim);transition:transform .15s}.prune-diff-chevron-open{transform:rotate(90deg)}.prune-diff-indicator{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;font-size:var(--font-base);font-weight:var(--weight-bold);border-radius:50%}.prune-diff-indicator-remove{color:var(--red);background:color-mix(in srgb,var(--red) 15%,transparent)}.prune-diff-indicator-modified{color:var(--orange);background:color-mix(in srgb,var(--orange) 15%,transparent)}.prune-diff-status{flex-shrink:0;font-size:var(--font-sm);width:14px;text-align:center}.prune-diff-status-prunable{opacity:.5}.prune-diff-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.prune-diff-title-prunable{text-decoration:line-through;color:var(--red);opacity:.7}.prune-diff-progress{flex-shrink:0;font-size:var(--font-sm);color:var(--text-dim);font-variant-numeric:tabular-nums}.prune-diff-pct{font-size:var(--font-sm);opacity:.7}.prune-diff-epic-impact{display:inline-flex;align-items:center;gap:var(--space-1);padding:1px var(--space-2);border-radius:3px;background:color-mix(in srgb,var(--accent) 8%,transparent);border:1px solid color-mix(in srgb,var(--accent) 20%,transparent);font-size:var(--font-sm);flex-shrink:0;font-variant-numeric:tabular-nums}.prune-diff-impact-before{color:var(--text-dim)}.prune-diff-impact-arrow{color:var(--text-dim);font-size:var(--font-sm);opacity:.6}.prune-diff-impact-after{color:var(--text);font-weight:var(--weight-semibold)}.prune-diff-impact-after.prune-diff-impact-changed{color:var(--accent)}.prune-diff-impact-pct{font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:0 4px;border-radius:2px}.prune-diff-impact-positive{color:var(--green);background:color-mix(in srgb,var(--green) 10%,transparent)}.prune-diff-impact-negative{color:var(--orange);background:color-mix(in srgb,var(--orange) 10%,transparent)}.prune-diff-impact-removed{color:var(--red);font-size:var(--font-sm);opacity:.8}.prune-diff-impact-delta{color:var(--text-dim);font-size:var(--font-sm);opacity:.8}.prune-diff-loading{display:flex;align-items:center;gap:var(--space-2-5);padding:var(--space-4);color:var(--text-dim);font-size:var(--font-base);justify-content:center}.prune-diff-error{padding:var(--space-2-5) var(--space-3-5);color:var(--red);font-size:var(--font-base);background:color-mix(in srgb,var(--red) 8%,transparent);border-radius:4px;margin-bottom:14px}.prune-diff-empty{text-align:center;padding:var(--space-4);color:var(--text-dim);font-size:var(--font-base)}.prune-diff-view-toggle{display:flex;gap:0;margin-bottom:10px;border:1px solid var(--border);border-radius:4px;overflow:hidden}.prune-diff-view-tab{flex:1;padding:var(--space-1-5) var(--space-3);font-size:var(--font-sm);border:none;background:var(--bg);color:var(--text-dim);cursor:pointer;transition:all .15s}.prune-diff-view-tab:not(:last-child){border-right:1px solid var(--border)}.prune-diff-view-tab:hover{color:var(--text);background:var(--bg-hover)}.prune-diff-view-tab.active{background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent);font-weight:var(--weight-medium)}.smart-add-panel{padding:var(--space-4)}.smart-add-header{margin-bottom:var(--space-4)}.smart-add-title{font-size:var(--font-lg);font-weight:var(--weight-semibold);color:var(--text);margin:0 0 var(--space-1)}.smart-add-subtitle{font-size:var(--font-sm);color:var(--text-dim);margin:0}.smart-add-input-area{margin-bottom:var(--space-3)}.smart-add-textarea{width:100%;box-sizing:border-box;padding:var(--space-3);font-size:var(--font-base);font-family:inherit;color:var(--text);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);resize:vertical;min-height:60px;transition:border-color var(--transition-normal);line-height:var(--leading-normal)}.smart-add-textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-subtle)}.smart-add-textarea::placeholder{color:var(--text-muted)}.smart-add-input-status{display:flex;align-items:center;justify-content:space-between;margin-top:var(--space-1);min-height:20px}.smart-add-hint{font-size:var(--font-xs);color:var(--text-muted)}.smart-add-loading-badge{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--font-xs);color:var(--accent);font-weight:var(--weight-medium)}.smart-add-loading{margin-bottom:var(--space-3)}.smart-add-loading-bar{height:3px;background:var(--border);border-radius:2px;overflow:hidden;margin-bottom:var(--space-2)}.smart-add-loading-bar-fill{height:100%;background:var(--accent);border-radius:2px;animation:smart-add-loading-slide 1.5s ease-in-out infinite;width:40%}@keyframes smart-add-loading-slide{0%{transform:translate(-100%)}50%{transform:translate(150%)}to{transform:translate(-100%)}}.smart-add-loading-text{font-size:var(--font-sm);color:var(--text-dim)}.smart-add-spinner{display:inline-block;width:10px;height:10px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:smart-add-spin .6s linear infinite}@keyframes smart-add-spin{to{transform:rotate(360deg)}}.smart-add-error{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:color-mix(in srgb,var(--red) 8%,transparent);border:1px solid color-mix(in srgb,var(--red) 30%,transparent);border-radius:var(--radius-md);color:var(--red);font-size:var(--font-sm);margin-bottom:var(--space-3)}.smart-add-error-icon{font-size:var(--font-md);flex-shrink:0}.smart-add-empty{padding:var(--space-4);text-align:center;color:var(--text-dim);font-size:var(--font-sm)}.smart-add-empty p{margin:var(--space-1) 0}.smart-add-empty-hint{color:var(--text-muted);font-size:var(--font-xs)}.smart-add-confidence{margin-bottom:var(--space-3)}.smart-add-confidence-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-1)}.smart-add-confidence-label{font-size:var(--font-xs);color:var(--text-dim);font-weight:var(--weight-medium);text-transform:uppercase;letter-spacing:var(--tracking-wider)}.smart-add-confidence-value{font-size:var(--font-sm);font-weight:var(--weight-semibold)}.smart-add-confidence-value.smart-add-confidence-high{color:var(--green)}.smart-add-confidence-value.smart-add-confidence-medium{color:var(--orange)}.smart-add-confidence-value.smart-add-confidence-low{color:var(--red)}.smart-add-confidence-track{height:4px;background:var(--border);border-radius:2px;overflow:hidden}.smart-add-confidence-fill{height:100%;border-radius:2px;transition:width .5s ease}.smart-add-confidence-fill.smart-add-confidence-high{background:var(--green)}.smart-add-confidence-fill.smart-add-confidence-medium{background:var(--orange)}.smart-add-confidence-fill.smart-add-confidence-low{background:var(--red)}.smart-add-quality-issues{display:flex;align-items:center;gap:var(--space-1);padding:var(--space-2) var(--space-3);background:color-mix(in srgb,var(--orange) 8%,transparent);border:1px solid color-mix(in srgb,var(--orange) 20%,transparent);border-radius:var(--radius-md);color:var(--orange);font-size:var(--font-xs);margin-bottom:var(--space-3)}.smart-add-quality-icon{flex-shrink:0}.smart-add-stats{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) 0;margin-bottom:var(--space-2);font-size:var(--font-sm);color:var(--text-dim)}.smart-add-stat-count{font-weight:var(--weight-semibold);color:var(--text)}.smart-add-stat-sep{color:var(--text-muted);font-size:var(--font-xs)}.smart-add-preview{margin-bottom:var(--space-3)}.smart-add-preview-card{border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-2);overflow:hidden}.smart-add-preview-card:last-child{margin-bottom:0}.smart-add-preview-epic{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--bg-surface);cursor:pointer;transition:background var(--transition-fast);user-select:none}.smart-add-preview-epic:hover{background:var(--bg-hover)}.smart-add-preview-expand{display:inline-flex;font-size:var(--font-sm);color:var(--text-dim);transition:transform var(--transition-normal);flex-shrink:0}.smart-add-preview-expand.open{transform:rotate(90deg)}.smart-add-preview-title{font-weight:var(--weight-medium);color:var(--text);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.smart-add-preview-count{font-size:var(--font-xs);color:var(--text-muted);flex-shrink:0}.smart-add-preview-body{padding:0 var(--space-3) var(--space-3);border-top:1px solid var(--border)}.smart-add-preview-desc{font-size:var(--font-sm);color:var(--text-dim);margin:var(--space-2) 0;line-height:var(--leading-relaxed)}.smart-add-preview-feature{margin-top:var(--space-2);padding-left:var(--space-3)}.smart-add-preview-feature-header{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-1) 0}.smart-add-preview-feature-title{font-size:var(--font-sm);font-weight:var(--weight-medium);color:var(--text)}.smart-add-preview-feature-desc{font-size:var(--font-xs);color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.smart-add-preview-tasks{padding-left:var(--space-3)}.smart-add-preview-task{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-1) 0;font-size:var(--font-sm)}.smart-add-preview-task-title{color:var(--text);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.smart-add-preview-ac-badge{font-size:var(--font-xs);color:var(--accent);background:var(--accent-subtle);padding:1px var(--space-1-5);border-radius:var(--radius-sm);font-weight:var(--weight-medium);flex-shrink:0}.smart-add-actions{display:flex;gap:var(--space-2);padding-top:var(--space-3);border-top:1px solid var(--border)}.smart-add-btn{padding:var(--space-2) var(--space-4);font-size:var(--font-sm);font-weight:var(--weight-medium);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-normal);flex:1;text-align:center}.smart-add-btn:disabled{opacity:.5;cursor:not-allowed}.smart-add-btn-review{background:var(--bg-surface);color:var(--text)}.smart-add-btn-review:hover:not(:disabled){background:var(--bg-hover)}.smart-add-btn-accept{background:var(--accent);color:#000;border-color:var(--accent)}.smart-add-btn-accept:hover:not(:disabled){opacity:.9}.smart-add-btn-generate{margin-top:var(--space-2);background:var(--accent);color:#000;border-color:var(--accent);align-self:flex-end}.smart-add-btn-generate:hover:not(:disabled){opacity:.9}.smart-add-panel-compact{padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-surface)}.smart-add-panel-compact .smart-add-header{margin-bottom:var(--space-3)}.smart-add-scope{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3);flex-wrap:wrap}.smart-add-scope-label{font-size:var(--font-xs);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em;flex-shrink:0}.smart-add-scope-select{flex:1;min-width:200px;max-width:400px;padding:var(--space-1) var(--space-2);font-size:var(--font-sm);background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-normal)}.smart-add-scope-select:focus{outline:none;border-color:var(--accent)}.smart-add-scope-active{font-size:var(--font-xs);color:var(--accent);font-style:italic}.smart-add-examples{margin-bottom:var(--space-3)}.smart-add-examples-label{display:block;font-size:var(--font-xs);color:var(--text-muted);margin-bottom:var(--space-2)}.smart-add-examples-list{display:flex;flex-wrap:wrap;gap:var(--space-1)}.smart-add-example-chip{padding:var(--space-1) var(--space-2);font-size:var(--font-xs);color:var(--text-dim);background:var(--bg);border:1px solid var(--border);border-radius:999px;cursor:pointer;transition:all var(--transition-normal);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.smart-add-example-chip:hover{background:var(--bg-hover);border-color:var(--accent);color:var(--text)}.smart-add-char-count{font-size:var(--font-xs);color:var(--text-muted);font-variant-numeric:tabular-nums}.smart-add-char-count-warn{color:var(--orange)}.batch-import-panel{padding:var(--space-4)}.batch-import-header{margin-bottom:var(--space-4)}.batch-import-title{font-size:var(--font-lg);font-weight:var(--weight-semibold);color:var(--text);margin:0 0 var(--space-1)}.batch-import-subtitle{font-size:var(--font-sm);color:var(--text-dim);margin:0}.batch-import-dropzone{border:2px dashed var(--border);border-radius:var(--radius-md);padding:var(--space-6) var(--space-4);text-align:center;transition:all var(--transition-normal);cursor:pointer;margin-bottom:var(--space-3)}.batch-import-dropzone:hover,.batch-import-dropzone-active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 5%,transparent)}.batch-import-dropzone-icon{font-size:2rem;display:block;margin-bottom:var(--space-2)}.batch-import-dropzone-text{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 var(--space-1)}.batch-import-dropzone-hint{font-size:var(--font-xs);color:var(--text-muted);margin:0}.batch-import-browse-btn{background:none;border:none;color:var(--accent);cursor:pointer;text-decoration:underline;font-size:inherit;padding:0}.batch-import-browse-btn:hover{opacity:.8}.batch-import-add-text-btn{display:block;width:100%;padding:var(--space-2);font-size:var(--font-sm);color:var(--text-dim);background:none;border:1px dashed var(--border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-normal);margin-bottom:var(--space-3)}.batch-import-add-text-btn:hover{color:var(--text);border-color:var(--accent)}.batch-import-queue{margin-bottom:var(--space-3)}.batch-import-queue-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-2)}.batch-import-queue-title{font-size:var(--font-sm);font-weight:var(--weight-medium);color:var(--text)}.batch-import-clear-btn{font-size:var(--font-xs);color:var(--text-muted);background:none;border:none;cursor:pointer;padding:0}.batch-import-clear-btn:hover{color:var(--red)}.batch-import-item{border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-2);overflow:hidden}.batch-import-item-header{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--bg-surface);border-bottom:1px solid var(--border)}.batch-import-format-badge{font-size:var(--font-xs);font-weight:var(--weight-semibold);padding:1px var(--space-1);border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:var(--tracking-wider)}.batch-import-format-text{background:color-mix(in srgb,var(--blue) 15%,transparent);color:var(--blue)}.batch-import-format-markdown{background:color-mix(in srgb,var(--green) 15%,transparent);color:var(--green)}.batch-import-format-json{background:color-mix(in srgb,var(--orange) 15%,transparent);color:var(--orange)}.batch-import-item-source{flex:1;font-size:var(--font-sm);color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.batch-import-item-size{font-size:var(--font-xs);color:var(--text-muted);white-space:nowrap}.batch-import-format-select{font-size:var(--font-xs);padding:1px var(--space-1);background:var(--bg);color:var(--text-dim);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer}.batch-import-remove-btn{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:var(--font-sm);padding:0 var(--space-1);line-height:1}.batch-import-remove-btn:hover{color:var(--red)}.batch-import-item-textarea{width:100%;box-sizing:border-box;padding:var(--space-2) var(--space-3);font-size:var(--font-sm);font-family:inherit;color:var(--text);background:var(--bg);border:none;resize:vertical;min-height:60px;line-height:var(--leading-normal)}.batch-import-item-textarea:focus{outline:none;background:var(--bg-surface)}.batch-import-item-textarea::placeholder{color:var(--text-muted)}.batch-import-item-preview{padding:var(--space-2) var(--space-3);font-size:var(--font-xs);color:var(--text-dim);font-family:var(--font-mono, monospace);white-space:pre-wrap;word-break:break-all;max-height:80px;overflow:hidden;transition:max-height .2s ease}.batch-import-item-preview-expanded{max-height:400px;overflow-y:auto;border-top:1px solid var(--border)}.batch-import-item-meta{display:flex;align-items:center;gap:var(--space-1);font-size:var(--font-xs);color:var(--text-muted);white-space:nowrap}.batch-import-item-meta-sep{color:var(--border)}.batch-import-expand-btn{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:var(--font-xs);padding:0 var(--space-1);line-height:1;transition:color var(--transition-normal)}.batch-import-expand-btn:hover,.batch-import-expand-btn-active{color:var(--accent)}.batch-import-progress{padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-surface);margin-bottom:var(--space-3)}.batch-import-progress-bar{height:6px;background:var(--border);border-radius:3px;overflow:hidden;margin-bottom:var(--space-2)}.batch-import-progress-fill{height:100%;background:var(--accent);border-radius:3px;transition:width .4s ease}.batch-import-progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-2)}.batch-import-progress-text{font-size:var(--font-sm);color:var(--text);font-weight:var(--weight-medium)}.batch-import-progress-detail{font-size:var(--font-xs);color:var(--text-muted)}.batch-import-progress-stages{display:flex;gap:var(--space-3)}.batch-import-stage{font-size:var(--font-xs);color:var(--text-muted);transition:color var(--transition-normal)}.batch-import-stage-active{color:var(--accent);font-weight:var(--weight-medium)}.batch-import-stage-done{color:var(--green)}.batch-import-process{margin-top:var(--space-3)}.batch-import-process-btn{width:100%}.prd-status-picker{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;min-width:150px;padding:var(--space-1) 0;font-size:var(--font-base);animation:rex-toast-in .12s ease-out}.prd-status-picker-option{display:flex;align-items:center;gap:var(--space-2);width:100%;padding:var(--space-1) var(--space-3);background:none;border:none;font-size:var(--font-base);color:var(--text);cursor:pointer;text-align:left;transition:background var(--transition-fast)}.prd-status-picker-option:hover{background:var(--bg-hover)}.prd-status-picker-option:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.prd-status-picker-option.active{font-weight:var(--weight-medium);background:color-mix(in srgb,var(--accent) 8%,transparent)}.prd-status-picker-icon{flex-shrink:0;width:14px;text-align:center}.prd-status-picker-label{flex:1}.prd-status-picker-check{color:var(--accent);font-size:var(--font-sm);flex-shrink:0}.prd-node-deleting{opacity:.45;pointer-events:none;animation:prd-node-fade-out .3s ease-out both}@keyframes prd-node-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:.45;transform:scale(.98)}}.task-danger-zone{margin-top:24px;padding-top:16px;border-top:1px solid color-mix(in srgb,var(--red) 30%,var(--border))}.task-danger-label{color:var(--red)}.task-remove-btn{display:inline-flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1-5) var(--space-3-5);margin-top:var(--space-2);background:none;border:1px solid color-mix(in srgb,var(--red) 40%,var(--border));border-radius:var(--radius-sm);color:var(--red);font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:all .15s}.task-remove-btn:hover{background:color-mix(in srgb,var(--red) 12%,transparent);border-color:var(--red)}.task-remove-btn-icon{font-size:var(--font-base)}.task-remove-confirm{margin-top:var(--space-2);padding:var(--space-3);background:color-mix(in srgb,var(--red) 6%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 30%,var(--border));border-radius:var(--radius-sm);animation:rex-toast-in .15s ease-out}.task-remove-confirm-msg{margin:0 0 10px;font-size:var(--font-base);color:var(--text);line-height:1.4}.task-remove-confirm-actions{display:flex;gap:var(--space-2)}.task-remove-confirm-btn{padding:var(--space-1) var(--space-3);background:var(--red);border:1px solid var(--red);border-radius:var(--radius-sm);color:#fff;font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:opacity .15s}.task-remove-confirm-btn:hover:not(:disabled){opacity:.9}.task-remove-confirm-btn:disabled{opacity:.5;cursor:not-allowed}.task-remove-cancel-btn{padding:var(--space-1) var(--space-3);background:none;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-dim);font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:all .15s}.task-remove-cancel-btn:hover:not(:disabled){border-color:var(--text-dim);color:var(--text)}.task-remove-cancel-btn:disabled{opacity:.5;cursor:not-allowed}.delete-modal-backdrop{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;background:#00000080;animation:delete-modal-fade-in .15s ease-out}.delete-modal{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);box-shadow:0 8px 32px #0006;width:420px;max-width:calc(100vw - 32px);animation:delete-modal-slide-in .15s ease-out}.delete-modal-header{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-4) var(--space-5) var(--space-3);border-bottom:1px solid var(--border)}.delete-modal-icon{font-size:var(--font-lg);color:var(--red);flex-shrink:0}.delete-modal-title{font-size:var(--font-lg);font-weight:var(--weight-semibold);color:var(--text)}.delete-modal-body{padding:var(--space-4) var(--space-5)}.delete-modal-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2-5) var(--space-3);margin-bottom:var(--space-3);background:var(--bg-hover);border:1px solid var(--border);border-radius:var(--radius-md)}.delete-modal-item-title{font-size:var(--font-base);font-weight:var(--weight-medium);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.delete-modal-warning{display:flex;align-items:flex-start;gap:var(--space-2);padding:var(--space-2-5) var(--space-3);margin-bottom:var(--space-3);background:color-mix(in srgb,var(--red) 8%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 25%,var(--border));border-radius:var(--radius-md);font-size:var(--font-base);color:var(--text);line-height:1.4}.delete-modal-warning-icon{color:var(--red);flex-shrink:0;font-size:var(--font-base)}.delete-modal-message{margin:0;font-size:var(--font-base);color:var(--text-dim);line-height:1.4}.delete-modal-actions{display:flex;justify-content:flex-end;gap:var(--space-2);padding:var(--space-3) var(--space-5) var(--space-4);border-top:1px solid var(--border)}.delete-modal-cancel-btn{padding:var(--space-2) var(--space-4);background:none;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-dim);font-size:var(--font-base);font-weight:var(--weight-medium);cursor:pointer;transition:all var(--transition-normal)}.delete-modal-cancel-btn:hover:not(:disabled){border-color:var(--text-dim);color:var(--text)}.delete-modal-cancel-btn:disabled{opacity:.5;cursor:not-allowed}.delete-modal-confirm-btn{padding:var(--space-2) var(--space-4);background:var(--red);border:1px solid var(--red);border-radius:var(--radius-sm);color:#fff;font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:opacity var(--transition-normal)}.delete-modal-confirm-btn:hover:not(:disabled){opacity:.9}.delete-modal-confirm-btn:disabled{opacity:.5;cursor:not-allowed}@keyframes delete-modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes delete-modal-slide-in{0%{opacity:0;transform:scale(.95) translateY(-8px)}to{opacity:1;transform:scale(1) translateY(0)}}.prd-search-row{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.prd-search-input{flex:1;padding:var(--space-1-5) var(--space-3);font-size:var(--font-sm);background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;color:var(--text);outline:none;transition:border-color .15s;min-width:0}.prd-search-input::placeholder{color:var(--text-dim);opacity:.7}.prd-search-input:focus-visible{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.prd-search-count{font-size:var(--font-xs);color:var(--text-dim);white-space:nowrap;flex-shrink:0}.prd-search-clear{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:var(--font-base);padding:var(--space-1);line-height:1;border-radius:4px;flex-shrink:0;transition:color .15s,background .15s}.prd-search-clear:hover{color:var(--text);background:var(--bg-surface)}.prd-search-highlight{background:#ffe60059;color:inherit;border-radius:2px;padding:0 1px}[data-theme=light] .prd-search-highlight{background:#ffd20066}.prd-node-search-match{background:#ffe6000f}[data-theme=light] .prd-node-search-match{background:#ffd20014}.prd-facet-filter{display:flex;flex-direction:column;gap:var(--space-1-5);margin-top:var(--space-1)}.prd-facet-row{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.prd-facet-label{font-size:var(--font-xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim);flex-shrink:0;min-width:48px}.prd-facet-chips{display:flex;gap:var(--space-1);flex-wrap:wrap}.prd-facet-chip{display:inline-flex;align-items:center;gap:3px;padding:2px var(--space-2);border:1px solid var(--border);border-radius:12px;background:var(--bg-surface);color:var(--text-dim);font-size:var(--font-xs);cursor:pointer;transition:all .15s;opacity:.6}.prd-facet-chip:hover{opacity:.9;border-color:var(--text-dim)}.prd-facet-chip.active{opacity:1;font-weight:var(--weight-medium)}.prd-facet-chip.active.prd-status-completed{background:color-mix(in srgb,var(--green) 15%,transparent);border-color:var(--green);color:var(--green)}.prd-facet-chip.active.prd-status-in-progress{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:var(--accent);color:var(--accent)}.prd-facet-chip.active.prd-status-pending{background:var(--bg-hover);border-color:var(--text-dim);color:var(--text-dim)}.prd-facet-chip.active.prd-status-failing,.prd-facet-chip.active.prd-status-blocked{background:color-mix(in srgb,var(--red) 15%,transparent);border-color:var(--red);color:var(--red)}.prd-facet-chip.active.prd-status-deferred{background:color-mix(in srgb,var(--orange) 15%,transparent);border-color:var(--orange);color:var(--orange)}.prd-facet-tag.active{background:color-mix(in srgb,var(--accent) 12%,transparent);border-color:var(--accent);color:var(--accent)}.prd-facet-chip-icon,.prd-facet-chip-label{font-size:var(--font-xs)}.prd-facet-clear{align-self:flex-start;background:none;border:1px solid var(--border);border-radius:4px;color:var(--text-dim);font-size:var(--font-xs);padding:2px var(--space-2);cursor:pointer;transition:color .15s,border-color .15s}.prd-facet-clear:hover{color:var(--text);border-color:var(--text-dim)}.prd-facet-empty{font-size:var(--font-xs);color:var(--text-dim);font-style:italic;padding:2px 0}.prd-facet-row--tags{align-items:flex-start}.prd-tag-typeahead{display:flex;flex-direction:column;gap:var(--space-1);flex:1;min-width:0}.prd-tag-selected{flex-wrap:wrap}.prd-tag-remove{margin-left:2px;font-size:10px;opacity:.6}.prd-facet-tag.active:hover .prd-tag-remove{opacity:1}.prd-tag-input-wrap{position:relative}.prd-tag-input{width:100%;max-width:260px;padding:3px var(--space-2);border:1px solid var(--border);border-radius:6px;background:var(--bg-surface);color:var(--text);font-size:var(--font-xs);outline:none;transition:border-color .15s}.prd-tag-input::placeholder{color:var(--text-dim);opacity:.6}.prd-tag-input:focus{border-color:var(--accent)}.prd-tag-dropdown{position:absolute;top:100%;left:0;right:0;max-width:260px;max-height:200px;overflow-y:auto;margin:2px 0 0;padding:2px 0;border:1px solid var(--border);border-radius:6px;background:var(--bg-surface);box-shadow:0 4px 12px #00000040;list-style:none;z-index:50}.prd-tag-option{display:flex;align-items:center;gap:4px;padding:4px var(--space-2);font-size:var(--font-xs);color:var(--text);cursor:pointer;transition:background .1s}.prd-tag-option:hover,.prd-tag-option.highlighted{background:var(--bg-hover)}.prd-tag-option-hash{color:var(--text-dim);opacity:.5}.prd-tag-no-match,.prd-tag-more{color:var(--text-dim);font-style:italic;cursor:default}.prd-tag-no-match:hover,.prd-tag-more:hover{background:transparent}.rex-dash{max-width:1200px;min-height:0}.rex-dash-header{display:flex;flex-direction:column;margin-bottom:var(--space-5);gap:var(--space-1)}.rex-dash-title-row{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-3)}.rex-dash-title{font-size:var(--font-3xl);font-weight:var(--weight-bold);margin:0;line-height:var(--leading-tight)}.rex-dash-header-actions{display:flex;gap:var(--space-2)}.rex-dash-view-tasks-btn{background:none;border:1px solid var(--border);color:var(--accent);font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:var(--space-1-5) var(--space-3-5);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);white-space:nowrap}.rex-dash-view-tasks-btn:hover{border-color:var(--accent);background:var(--accent-subtle)}.rex-dash-view-tasks-btn:active{background:color-mix(in srgb,var(--accent) 15%,transparent)}.rex-dash-stats{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-bottom:var(--space-5)}.rex-dash-stat{display:flex;align-items:baseline;gap:var(--space-1-5);padding:var(--space-2) var(--space-3-5);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);min-width:80px}.rex-dash-stat-accent{border-color:color-mix(in srgb,var(--green) 30%,var(--border));background:color-mix(in srgb,var(--green) 4%,var(--bg-surface))}.rex-dash-stat-value{font-size:var(--font-xl);font-weight:var(--weight-bold);line-height:1;color:var(--text)}.rex-dash-stat-label{font-size:var(--font-xs);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--tracking-wider)}.rex-dash-progress{margin-bottom:var(--space-6)}.rex-dash-progress-header{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:var(--space-1-5)}.rex-dash-progress-label{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--tracking-wide)}.rex-dash-progress-pct{font-size:var(--font-md);font-weight:var(--weight-bold);color:var(--accent)}.rex-dash-progress-bar{height:10px;display:flex;border-radius:5px;overflow:hidden;background:var(--border)}.rex-dash-progress-seg{transition:width .4s ease;min-width:2px}.rex-dash-progress-legend{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-top:var(--space-2)}.rex-dash-legend-item{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--font-xs);color:var(--text-dim)}.rex-dash-legend-label{font-size:var(--font-xs)}.rex-dash-legend-count{font-weight:var(--weight-semibold);color:var(--text)}.rex-dash-grid{display:grid;grid-template-columns:1fr 300px;gap:var(--space-6);align-items:start}.rex-dash-main{display:flex;flex-direction:column;gap:var(--space-5);min-width:0;min-height:0}.rex-dash-section-header{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:var(--space-3)}.rex-dash-section-header h3{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--tracking-wide);margin:0}.rex-dash-section-meta{font-size:var(--font-xs);color:var(--text-muted)}.rex-dash-next{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-5);min-height:80px}.rex-dash-next-card{padding:var(--space-4);background:color-mix(in srgb,var(--accent) 5%,var(--bg));border:1px solid color-mix(in srgb,var(--accent) 20%,var(--border));border-radius:var(--radius-lg);transition:border-color var(--transition-normal),background var(--transition-normal),box-shadow var(--transition-normal)}.rex-dash-next-card:hover{border-color:color-mix(in srgb,var(--accent) 50%,var(--border));background:color-mix(in srgb,var(--accent) 8%,var(--bg));box-shadow:0 2px 12px color-mix(in srgb,var(--accent) 8%,transparent)}.rex-dash-next-critical{border-color:color-mix(in srgb,var(--red) 30%,var(--border));background:color-mix(in srgb,var(--red) 4%,var(--bg))}.rex-dash-next-critical:hover{border-color:color-mix(in srgb,var(--red) 50%,var(--border));box-shadow:0 2px 12px color-mix(in srgb,var(--red) 8%,transparent)}.rex-dash-next-high{border-color:color-mix(in srgb,var(--orange) 25%,var(--border));background:color-mix(in srgb,var(--orange) 3%,var(--bg))}.rex-dash-next-high:hover{border-color:color-mix(in srgb,var(--orange) 45%,var(--border));box-shadow:0 2px 12px color-mix(in srgb,var(--orange) 6%,transparent)}.rex-dash-next-top{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-bottom:var(--space-2)}.rex-dash-next-badges{display:flex;align-items:center;gap:var(--space-1-5);flex-wrap:wrap}.rex-dash-next-link{font-size:var(--font-md);font-weight:var(--weight-semibold);padding:2px 0;margin-bottom:var(--space-1);max-width:100%;overflow:hidden}.rex-dash-next-desc{font-size:var(--font-sm);color:var(--text-dim);line-height:var(--leading-relaxed);margin-top:var(--space-1-5);margin-bottom:var(--space-1-5);overflow-wrap:break-word;word-break:break-word}.rex-dash-next-tags{display:flex;flex-wrap:wrap;gap:var(--space-1);margin-top:var(--space-2)}.rex-dash-next-empty{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-base);color:var(--text-dim);text-align:center;padding:var(--space-5) var(--space-4);background:var(--bg);border-radius:var(--radius-lg);justify-content:center}.rex-dash-next-empty-icon{font-size:var(--font-xl);color:var(--green)}.rex-dash-start-btn{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:#fff;background:var(--accent);border:none;padding:var(--space-1-5) var(--space-3-5);border-radius:var(--radius-sm);cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast);white-space:nowrap}.rex-dash-start-btn:hover{background:var(--accent-dim);transform:translateY(-1px)}.rex-dash-start-btn:active{transform:translateY(0)}.rex-dash-start-btn:disabled{opacity:.6;cursor:not-allowed;transform:none}.rex-dash-start-wrapper{display:flex;flex-direction:column;align-items:flex-end;gap:var(--space-1)}.rex-dash-start-error{font-size:var(--font-xs);color:var(--red, #ef4444);max-width:200px;text-align:right;animation:rex-dash-error-in .2s ease}@keyframes rex-dash-error-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.rex-dash-smart-add{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-5);min-height:60px}.rex-dash-smart-add .smart-add-panel-compact{border:none;padding:0;background:transparent}.rex-dash-epics{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-5);min-height:80px}.rex-dash-epic-list{display:flex;flex-direction:column;gap:var(--space-2)}.rex-dash-epic{padding:var(--space-3) var(--space-3);background:var(--bg);border-radius:var(--radius-lg);border:1px solid transparent;transition:background var(--transition-normal),border-color var(--transition-normal)}.rex-dash-epic:hover{background:var(--bg-hover)}.rex-dash-epic-active{border-color:color-mix(in srgb,var(--accent) 20%,transparent);background:color-mix(in srgb,var(--accent) 3%,var(--bg))}.rex-dash-epic-done{opacity:.55}.rex-dash-epic-top{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-bottom:var(--space-1-5)}.rex-dash-epic-info{display:flex;align-items:center;gap:var(--space-1-5);min-width:0;flex:1;flex-wrap:wrap}.rex-dash-epic-link{flex:1 1 auto;min-width:0;padding:2px 4px;margin:-2px -4px;font-size:var(--font-base);overflow:hidden}.rex-dash-epic-pct{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text-dim);flex-shrink:0;min-width:36px;text-align:right}.rex-dash-epic-pct.done{color:var(--green)}.rex-dash-epic-bar{display:flex;align-items:center;gap:var(--space-2-5)}.rex-dash-epic-track{flex:1;height:6px;background:var(--border);border-radius:3px;overflow:hidden}.rex-dash-epic-fill{height:100%;border-radius:3px;background:var(--orange);transition:width .3s ease}.rex-dash-epic-fill.mid{background:var(--accent)}.rex-dash-epic-fill.done{background:var(--green)}.rex-dash-epic-count{font-size:var(--font-xs);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px;flex-shrink:0;font-variant-numeric:tabular-nums}.rex-dash-empty-hint{font-size:var(--font-base);color:var(--text-dim);text-align:center;padding:var(--space-5)}.rex-dash-sidebar{display:flex;flex-direction:column;gap:var(--space-4);min-height:0}.rex-dash-panel{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-4);min-height:60px}.rex-dash-panel-title{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--tracking-wide);margin:0 0 var(--space-3) 0}.rex-dash-priority-bars{display:flex;flex-direction:column;gap:var(--space-2)}.rex-dash-priority-row{display:flex;align-items:center;gap:var(--space-2-5)}.rex-dash-priority-label{font-size:var(--font-sm);color:var(--text-dim);width:56px;flex-shrink:0;font-weight:var(--weight-medium)}.rex-dash-priority-critical{color:var(--red)}.rex-dash-priority-high{color:var(--orange)}.rex-dash-priority-track{flex:1;height:6px;background:var(--border);border-radius:3px;overflow:hidden}.rex-dash-priority-fill{height:100%;border-radius:3px;transition:width .3s ease;background:var(--text-dim)}.rex-dash-priority-fill-critical{background:var(--red)}.rex-dash-priority-fill-high{background:var(--orange)}.rex-dash-priority-fill-medium{background:var(--text-muted)}.rex-dash-priority-fill-low{background:var(--text-muted);opacity:.5}.rex-dash-priority-count{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text-dim);width:24px;text-align:right;flex-shrink:0;font-variant-numeric:tabular-nums}.rex-dash-status-grid{display:flex;flex-direction:column;gap:var(--space-1-5)}.rex-dash-status-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-1) 0}.rex-dash-status-label{font-size:var(--font-sm);color:var(--text-dim);flex:1}.rex-dash-status-count{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text);font-variant-numeric:tabular-nums}.rex-dash-panel-actions{border-color:color-mix(in srgb,var(--accent) 15%,var(--border))}.rex-dash-actions{display:flex;flex-direction:column;gap:var(--space-1-5)}.rex-dash-action-btn{display:block;width:100%;padding:var(--space-2) var(--space-3);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:var(--font-sm);font-weight:var(--weight-medium);cursor:pointer;text-align:left;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast)}.rex-dash-action-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-subtle)}.rex-dash-action-btn:active{background:color-mix(in srgb,var(--accent) 12%,transparent)}.rex-dash-action-btn-accent{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg));font-weight:500}.rex-dash-action-btn-accent:hover{background:var(--accent);color:#fff}.rex-dash-health{display:flex;flex-direction:column;gap:var(--space-3);align-items:center}.rex-dash-health-gauge{display:flex;justify-content:center}.rex-dash-health-dims{width:100%;display:flex;flex-direction:column;gap:var(--space-1-5)}.rex-dash-health-dim{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-sm)}.rex-dash-health-dim-label{width:90px;flex-shrink:0;color:var(--text-dim)}.rex-dash-health-dim-track{flex:1;height:6px;background:var(--bg);border-radius:3px;overflow:hidden}.rex-dash-health-dim-fill{height:100%;border-radius:3px;transition:width var(--transition-normal)}.rex-dash-health-dim-fill.good{background:var(--green)}.rex-dash-health-dim-fill.mid{background:var(--orange)}.rex-dash-health-dim-fill.low{background:var(--red)}.rex-dash-health-dim-val{width:28px;text-align:right;font-variant-numeric:tabular-nums;color:var(--text-dim);font-size:var(--font-sm)}.rex-dash-health-suggestions{width:100%;margin:0;padding:0 0 0 var(--space-4);font-size:var(--font-sm);color:var(--text-dim);list-style:disc}.rex-dash-health-suggestions li{margin-bottom:var(--space-1);line-height:1.4}.reorg-overlay{position:fixed;inset:0;z-index:10000;display:flex;align-items:stretch;justify-content:flex-end;background:#00000080;animation:reorg-fade-in .15s ease-out}@keyframes reorg-fade-in{0%{opacity:0}to{opacity:1}}@keyframes reorg-slide-in{0%{transform:translate(100%)}to{transform:translate(0)}}.reorg-panel{width:480px;max-width:calc(100vw - 32px);background:var(--bg-surface);border-left:1px solid var(--border);display:flex;flex-direction:column;animation:reorg-slide-in .2s ease-out;box-shadow:-8px 0 32px #0000004d}.reorg-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4) var(--space-5);border-bottom:1px solid var(--border)}.reorg-header h3{margin:0;font-size:var(--font-lg)}.reorg-close{background:none;border:none;color:var(--text-dim);font-size:var(--font-3xl);cursor:pointer;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);line-height:1}.reorg-close:hover{color:var(--text);background:var(--bg-hover)}.reorg-body{flex:1;overflow-y:auto;padding:var(--space-4)}.reorg-loading,.reorg-empty{text-align:center;color:var(--text-dim);padding:var(--space-8) 0}.reorg-error{background:color-mix(in srgb,var(--red) 10%,transparent);border:1px solid color-mix(in srgb,var(--red) 30%,transparent);color:var(--red);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);margin-bottom:var(--space-3);font-size:var(--font-sm)}.reorg-success{background:color-mix(in srgb,var(--green) 10%,transparent);border:1px solid color-mix(in srgb,var(--green) 30%,transparent);color:var(--green);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);margin-bottom:var(--space-3);font-size:var(--font-sm)}.reorg-list{display:flex;flex-direction:column;gap:var(--space-2)}.reorg-card{display:flex;gap:var(--space-3);padding:var(--space-3);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast)}.reorg-card:hover{border-color:var(--accent);background:var(--accent-subtle)}.reorg-card-selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 8%,var(--bg))}.reorg-checkbox{flex-shrink:0;margin-top:2px;accent-color:var(--accent)}.reorg-card-content{flex:1;min-width:0}.reorg-card-top{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-1);flex-wrap:wrap}.reorg-type-icon{font-size:var(--font-lg)}.reorg-type-label{font-size:var(--font-sm);font-weight:600;text-transform:capitalize}.reorg-risk{font-size:var(--font-sm);font-weight:600;text-transform:uppercase;padding:1px var(--space-1-5);border-radius:3px;letter-spacing:.03em}.reorg-risk-low{background:color-mix(in srgb,var(--green) 15%,transparent);color:var(--green)}.reorg-risk-medium{background:color-mix(in srgb,var(--orange) 15%,transparent);color:var(--orange)}.reorg-risk-high{background:color-mix(in srgb,var(--red) 15%,transparent);color:var(--red)}.reorg-confidence{font-size:var(--font-sm);color:var(--text-dim);margin-left:auto}.reorg-description{font-size:var(--font-sm);color:var(--text);line-height:1.4}.reorg-affected{font-size:var(--font-sm);color:var(--text-dim);margin-top:var(--space-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.reorg-footer{display:flex;gap:var(--space-2);padding:var(--space-4);border-top:1px solid var(--border);justify-content:flex-end}.reorg-btn{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--font-sm);font-weight:500;cursor:pointer;border:1px solid transparent;transition:background var(--transition-fast),border-color var(--transition-fast)}.reorg-btn:disabled{opacity:.5;cursor:not-allowed}.reorg-btn-primary{background:var(--accent);color:#fff;border-color:var(--accent)}.reorg-btn-primary:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 85%,#000)}.reorg-btn-secondary{background:var(--bg);color:var(--text);border-color:var(--border)}.reorg-btn-secondary:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}@media (max-width: 960px){.rex-dash-grid{grid-template-columns:1fr}.rex-dash-sidebar{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--space-3)}}@media (max-width: 600px){.rex-dash-title{font-size:var(--font-xl)}.rex-dash-title-row{flex-direction:column;align-items:flex-start;gap:var(--space-2)}.rex-dash-stats{gap:var(--space-1-5)}.rex-dash-stat{padding:var(--space-1-5) var(--space-2-5);min-width:64px;gap:var(--space-1)}.rex-dash-stat-value{font-size:var(--font-lg)}.rex-dash-progress-bar{height:8px}.rex-dash-next,.rex-dash-epics,.rex-dash-smart-add,.rex-dash-panel{padding:var(--space-4);border-radius:var(--radius-lg)}.rex-dash-next-card{padding:var(--space-3)}.rex-dash-next-top{flex-wrap:wrap;gap:var(--space-2)}.rex-dash-epic-info{flex-wrap:wrap}.rex-dash-sidebar{grid-template-columns:1fr}.rex-dash-action-btn{padding:var(--space-2-5) var(--space-3);font-size:var(--font-base)}}.exec-panel{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-5);min-height:100px}.exec-panel-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.exec-panel-title{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--tracking-wide);margin:0}.exec-panel-error{background:color-mix(in srgb,var(--red) 8%,var(--bg));border:1px solid color-mix(in srgb,var(--red) 25%,var(--border));border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);color:var(--red);font-size:var(--font-sm);margin-bottom:var(--space-3)}.exec-panel-idle{text-align:center}.exec-panel-desc{font-size:var(--font-sm);color:var(--text-dim);line-height:var(--leading-relaxed);margin:0 0 var(--space-3) 0}.exec-panel-start-btn{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:#fff;background:var(--accent);border:none;padding:var(--space-2-5) var(--space-6);border-radius:var(--radius-md);cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast);white-space:nowrap}.exec-panel-start-btn:hover{background:var(--accent-dim);transform:translateY(-1px)}.exec-panel-start-btn:active{transform:translateY(0)}.exec-panel-start-btn:disabled{opacity:.6;cursor:not-allowed;transform:none}.exec-panel-restart-btn{margin-top:var(--space-3)}.exec-panel-active{display:flex;flex-direction:column;gap:var(--space-3)}.exec-panel-progress{display:flex;flex-direction:column;gap:var(--space-1)}.exec-panel-progress-header{display:flex;align-items:baseline;justify-content:space-between}.exec-panel-progress-label{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text-dim)}.exec-panel-progress-pct{font-size:var(--font-md);font-weight:var(--weight-bold);color:var(--accent)}.exec-panel-progress-bar{height:8px;border-radius:4px;background:var(--border);overflow:hidden}.exec-panel-progress-fill{height:100%;border-radius:4px;background:var(--accent);transition:width .4s ease}.exec-panel-progress-detail{font-size:var(--font-xs);color:var(--text-muted)}.exec-panel-controls{display:flex;gap:var(--space-2)}.exec-panel-pause-btn,.exec-panel-resume-btn{font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:var(--space-1-5) var(--space-4);border-radius:var(--radius-md);cursor:pointer;border:1px solid;transition:background var(--transition-fast),border-color var(--transition-fast)}.exec-panel-pause-btn{color:var(--orange);background:color-mix(in srgb,var(--orange) 6%,var(--bg));border-color:color-mix(in srgb,var(--orange) 25%,var(--border))}.exec-panel-pause-btn:hover{background:color-mix(in srgb,var(--orange) 12%,var(--bg));border-color:color-mix(in srgb,var(--orange) 40%,var(--border))}.exec-panel-resume-btn{color:var(--green);background:color-mix(in srgb,var(--green) 6%,var(--bg));border-color:color-mix(in srgb,var(--green) 25%,var(--border))}.exec-panel-resume-btn:hover{background:color-mix(in srgb,var(--green) 12%,var(--bg));border-color:color-mix(in srgb,var(--green) 40%,var(--border))}.exec-panel-pause-btn:disabled,.exec-panel-resume-btn:disabled{opacity:.6;cursor:not-allowed}.exec-panel-epic-list{display:flex;flex-direction:column;gap:var(--space-1)}.exec-panel-epic{padding:var(--space-1-5) var(--space-2);border-radius:var(--radius-md);background:var(--bg);border:1px solid transparent;transition:background var(--transition-normal),border-color var(--transition-normal)}.exec-panel-epic-running{border-color:color-mix(in srgb,var(--accent) 30%,transparent);background:color-mix(in srgb,var(--accent) 5%,var(--bg))}.exec-panel-epic-done{opacity:.6}.exec-panel-epic-skipped{opacity:.45}.exec-panel-epic-failed{border-color:color-mix(in srgb,var(--red) 20%,transparent);background:color-mix(in srgb,var(--red) 3%,var(--bg))}.exec-panel-epic-row{display:flex;align-items:center;gap:var(--space-2)}.exec-panel-epic-icon{font-size:var(--font-sm);flex-shrink:0;width:16px;text-align:center}.exec-panel-epic-icon-pending{color:var(--text-muted)}.exec-panel-epic-icon-running{color:var(--accent)}.exec-panel-epic-icon-completed{color:var(--green)}.exec-panel-epic-icon-skipped{color:var(--text-muted)}.exec-panel-epic-icon-failed{color:var(--red)}.exec-panel-epic-title{flex:1;font-size:var(--font-sm);color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.exec-panel-epic-count{font-size:var(--font-xs);color:var(--text-dim);background:var(--bg-hover);padding:1px var(--space-1-5);border-radius:3px;flex-shrink:0;font-variant-numeric:tabular-nums}.exec-panel-epic-bar{height:4px;border-radius:2px;background:var(--border);overflow:hidden;margin-top:var(--space-1)}.exec-panel-epic-fill{height:100%;border-radius:2px;background:var(--orange);transition:width .3s ease}.exec-panel-epic-fill.mid{background:var(--accent)}.exec-panel-epic-fill.done{background:var(--green)}.exec-panel-done{display:flex;flex-direction:column;gap:var(--space-3)}.exec-panel-summary{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-sm);color:var(--text);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);background:var(--bg)}.exec-panel-summary-icon{font-size:var(--font-lg);flex-shrink:0}.exec-panel-summary-success{color:var(--green)}.exec-panel-summary-fail{color:var(--red)}@media (max-width: 600px){.exec-panel{padding:var(--space-4);border-radius:var(--radius-lg)}.exec-panel-start-btn{width:100%;padding:var(--space-3)}.exec-panel-pause-btn,.exec-panel-resume-btn{flex:1;text-align:center}}.token-usage-container{max-width:1200px;position:relative}.token-header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:16px;margin-bottom:24px}.token-header h2{font-size:var(--font-3xl);margin:0}.token-controls{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.filter-label{display:flex;align-items:center;gap:6px;font-size:var(--font-base);color:var(--text-dim)}.filter-label .filter-input{flex:none;width:auto;padding:5px 8px;font-size:var(--font-base)}.btn{padding:6px 14px;background:var(--accent);color:var(--bg);border:none;border-radius:6px;font-size:var(--font-base);font-weight:500;cursor:pointer;transition:opacity .15s}.btn:hover{opacity:.85}.btn-small{padding:4px 10px;font-size:var(--font-sm)}.token-metrics{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}.budget-alert{padding:12px 20px;border-radius:8px;margin-bottom:20px;font-size:var(--font-base);line-height:1.5}.budget-alert strong{display:block;margin-bottom:4px}.budget-alert p{margin:2px 0 0}.budget-alert-warning{background:color-mix(in srgb,var(--orange) 12%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--orange) 40%,var(--border));color:var(--orange)}.budget-alert-exceeded{background:color-mix(in srgb,var(--red) 12%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 40%,var(--border));color:var(--red)}.token-section{margin-bottom:24px;padding:20px;background:var(--bg-surface);border:1px solid var(--border);border-radius:12px}.token-section h3{font-size:var(--font-md);font-weight:var(--weight-semibold);margin-bottom:16px}.token-source-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px}.token-source-item{display:flex;flex-direction:column;gap:4px;padding:10px 12px;border:1px solid var(--border);border-radius:8px;background:var(--bg);font-size:var(--font-base)}.token-source-item code{font-family:monospace;font-size:var(--font-sm);color:var(--text);word-break:break-word}.budget-indicators{display:flex;gap:24px;flex-wrap:wrap}.budget-indicator{flex:1;min-width:240px}.budget-header{display:flex;justify-content:space-between;margin-bottom:6px}.budget-label{font-size:var(--font-base);font-weight:500;color:var(--text-dim)}.budget-pct{font-size:var(--font-base);font-weight:var(--weight-semibold)}.budget-ok{color:var(--green)}.budget-warning{color:var(--orange)}.budget-exceeded{color:var(--red)}.budget-track{position:relative;height:8px;background:var(--bg);border-radius:4px;overflow:hidden}.budget-fill{height:100%;border-radius:4px;transition:width .3s ease}.budget-bar-ok{background:var(--green)}.budget-bar-warning{background:var(--orange)}.budget-bar-exceeded{background:var(--red)}.budget-threshold{position:absolute;top:-2px;bottom:-2px;width:2px;background:var(--text-dim);opacity:.5}.budget-detail{margin-top:4px;font-size:var(--font-sm);color:var(--text-dim)}.period-toggle{display:flex;gap:2px;background:var(--bg);border-radius:6px;padding:2px}.toggle-btn{padding:5px 14px;border:none;background:transparent;color:var(--text-dim);border-radius:4px;font-size:var(--font-base);font-weight:500;cursor:pointer;transition:all .15s}.toggle-btn:hover{color:var(--text)}.toggle-btn.active{background:var(--accent);color:var(--bg)}.period-chart-container{overflow-x:auto;margin:0 -4px;padding:0 4px}.period-chart{width:100%;min-height:200px}.chart-axis-label{font-size:var(--font-sm);fill:var(--text-dim)}.chart-legend{display:flex;gap:16px;justify-content:center;margin-top:12px}.legend-item{display:flex;align-items:center;gap:6px;font-size:var(--font-base);color:var(--text-dim)}.legend-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.pkg-breakdown{display:flex;align-items:center;gap:24px;flex-wrap:wrap}.donut-chart{flex-shrink:0}.donut-total{font-size:var(--font-xl);font-weight:var(--weight-bold);fill:var(--text)}.donut-label{font-size:var(--font-sm);fill:var(--text-dim)}.pkg-details{display:flex;flex-direction:column;gap:10px;flex:1;min-width:140px}.pkg-row{display:flex;align-items:center;gap:8px;font-size:var(--font-base)}.pkg-name{font-weight:500;flex:1}.pkg-tokens{font-family:monospace;font-size:var(--font-base);color:var(--text)}.pkg-pct{font-size:var(--font-sm);color:var(--text-dim);min-width:30px;text-align:right}.token-table-wrapper{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.token-table{width:100%;border-collapse:collapse;font-size:var(--font-base)}.token-table th{text-align:left;padding:8px 12px;border-bottom:2px solid var(--border);color:var(--text-dim);font-weight:500;font-size:var(--font-sm);text-transform:uppercase;letter-spacing:.04em}.token-table th.num,.token-table td.num{text-align:right;font-family:monospace;font-size:var(--font-base)}.token-table td{padding:6px 12px;border-bottom:1px solid var(--border)}.token-table tr:hover td{background:var(--bg-hover)}.pkg-badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--bg);letter-spacing:.02em}.cost-breakdown{display:flex;flex-direction:column;gap:12px}.cost-item{display:flex;align-items:center;gap:16px;padding:10px 14px;background:var(--bg);border-radius:8px}.cost-item.cost-total{border-top:2px solid var(--border);background:var(--bg-hover);font-weight:var(--weight-semibold)}.cost-label{font-size:var(--font-base);min-width:120px}.cost-value{font-family:monospace;font-size:var(--font-md);color:var(--green);min-width:80px}.cost-detail{font-size:var(--font-sm);color:var(--text-dim);flex:1}.token-empty{padding:32px;text-align:center;color:var(--text-dim);font-size:var(--font-base);font-style:italic}.token-error{padding:48px;text-align:center;max-width:400px;margin:0 auto}.token-error h3{color:var(--red);margin-bottom:8px}.token-error p{color:var(--text-dim);font-size:var(--font-base);margin-bottom:16px}.token-loading-overlay{position:absolute;top:0;right:0;padding:4px 12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:0 0 0 8px;font-size:var(--font-sm);color:var(--text-dim)}@media (max-width: 768px){.token-header{flex-direction:column}.token-controls{width:100%}.budget-indicators{flex-direction:column}.pkg-breakdown{flex-direction:column;align-items:center}.token-table{font-size:var(--font-sm)}.token-table th,.token-table td{padding:4px 8px}}.val-container{padding:0 4px;max-width:1200px}.val-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:12px}.val-title{font-size:var(--font-3xl);font-weight:var(--weight-bold);margin:0}.val-tabs{display:flex;gap:4px;background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;padding:3px}.val-tab{background:transparent;border:none;color:var(--text-dim);font-size:var(--font-base);padding:6px 14px;border-radius:4px;cursor:pointer;transition:background .15s,color .15s;white-space:nowrap}.val-tab:hover{background:var(--bg-hover);color:var(--text)}.val-tab.active{background:var(--accent);color:var(--bg);font-weight:var(--weight-semibold)}.val-panel{animation:val-fade-in .2s ease}@keyframes val-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.val-actions{display:flex;align-items:center;gap:16px;margin-bottom:20px}.val-run-btn{background:var(--accent);color:var(--bg);border:none;padding:8px 20px;border-radius:6px;font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:opacity .15s;white-space:nowrap}.val-run-btn:hover{opacity:.9}.val-run-btn:disabled{opacity:.5;cursor:not-allowed}.val-actions-hint{color:var(--text-dim);font-size:var(--font-base);margin:0}.val-error{background:#d52e661a;border:1px solid var(--red);color:var(--red);padding:10px 14px;border-radius:6px;font-size:var(--font-base);margin-bottom:16px}.val-placeholder{text-align:center;padding:40px 20px;color:var(--text-dim);font-size:var(--font-md)}.val-summary{display:flex;align-items:center;flex-wrap:wrap;gap:16px;margin-bottom:16px;padding:12px 16px;background:var(--bg-surface);border:1px solid var(--border);border-radius:8px}.val-summary-badge{font-size:var(--font-md);font-weight:var(--weight-semibold);padding:4px 12px;border-radius:4px;white-space:nowrap}.val-summary-badge.val-pass{background:#00bd8126;color:var(--green)}.val-summary-badge.val-fail{background:#d52e6626;color:var(--red)}.val-summary-stats{display:flex;flex-wrap:wrap;gap:16px;font-size:var(--font-base);color:var(--text-dim)}.val-stat-num{font-weight:var(--weight-semibold);margin-right:3px}.val-stat-num.val-stat-passed{color:var(--green)}.val-stat-num.val-stat-failed{color:var(--red)}.val-stat-num.val-stat-warnings{color:var(--orange)}.val-checks{display:flex;flex-direction:column;gap:8px}.val-check{background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;overflow:hidden;transition:border-color .15s}.val-check-pass{border-left:3px solid var(--green)}.val-check-fail{border-left:3px solid var(--red)}.val-check-warn{border-left:3px solid var(--orange)}.val-check-header{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:default}.val-check-header[role=button]{cursor:pointer}.val-check-header[role=button]:hover{background:var(--bg-hover)}.val-check-icon{font-size:var(--font-md);flex-shrink:0}.val-check-pass .val-check-icon{color:var(--green)}.val-check-fail .val-check-icon{color:var(--red)}.val-check-warn .val-check-icon{color:var(--orange)}.val-check-name{font-size:var(--font-base);font-weight:var(--weight-medium);color:var(--text);flex:1}.val-check-count{font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-hover);padding:2px 8px;border-radius:10px}.val-check-chevron{font-size:var(--font-sm);color:var(--text-dim);transition:transform .15s}.val-check-errors{border-top:1px solid var(--border);padding:4px 0}.val-error-item{display:flex;align-items:center;gap:8px;padding:8px 14px 8px 38px;font-size:var(--font-base);color:var(--text-dim);transition:background .15s}.val-error-item.val-error-clickable{cursor:pointer}.val-error-item.val-error-clickable:hover{background:var(--bg-hover);color:var(--text)}.val-error-msg{flex:1;min-width:0}.val-error-item-title{color:var(--accent);font-weight:var(--weight-medium);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.val-error-item-id{font-family:monospace;font-size:var(--font-sm);color:var(--text-dim);opacity:.7}.dep-panel{animation:val-fade-in .2s ease}.dep-stats{display:flex;align-items:center;flex-wrap:wrap;gap:20px;margin-bottom:16px;padding:10px 16px;background:var(--bg-surface);border:1px solid var(--border);border-radius:8px}.dep-stat{display:flex;align-items:baseline;gap:4px}.dep-stat-num{font-size:var(--font-2xl);font-weight:var(--weight-bold);color:var(--text)}.dep-stat-label{font-size:var(--font-base);color:var(--text-dim)}.dep-stat-warn .dep-stat-num{color:var(--orange)}.dep-refresh-btn{margin-left:auto;background:var(--bg-surface);border:1px solid var(--border);color:var(--text-dim);font-size:var(--font-base);padding:4px 12px;border-radius:4px;cursor:pointer;transition:border-color .15s,color .15s}.dep-refresh-btn:hover{border-color:var(--accent);color:var(--text)}.dep-graph-container{position:relative;margin-bottom:20px;background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;overflow:hidden}.dep-graph-svg{display:block}.dep-edge{fill:none;stroke:var(--text-dim);stroke-width:1.5;opacity:.5;transition:opacity .15s}.dep-edge-resolved{stroke:var(--brand-teal);stroke-dasharray:6 3;opacity:.4}.dep-edge-cycle{stroke:var(--brand-orange);stroke-width:2;opacity:.8;stroke-dasharray:4 4}.dep-node{cursor:pointer;transition:opacity .15s}.dep-node:hover{opacity:.85}.dep-node-circle{fill:var(--bg-hover);stroke:var(--border);stroke-width:2;transition:fill .15s,stroke .15s}.dep-node-selected .dep-node-circle{stroke:var(--accent);stroke-width:3}.dep-node-completed .dep-node-circle{fill:#00bd8133;stroke:var(--green)}.dep-node-in_progress .dep-node-circle{fill:#6c41f033;stroke:var(--purple)}.dep-node-blocked .dep-node-circle{fill:#d52e6633;stroke:var(--red)}.dep-node-pending .dep-node-circle{fill:var(--bg-hover);stroke:var(--border)}.dep-node-cycle .dep-node-circle{stroke:var(--orange);stroke-width:2.5}.dep-node-cycle-ring{stroke:var(--orange);stroke-width:1.5;stroke-dasharray:3 3;opacity:.6}.dep-node-label{fill:var(--text);font-size:var(--font-sm);pointer-events:none}.dep-node-status-icon{fill:var(--text-dim);font-size:var(--font-base);pointer-events:none}.dep-node-completed .dep-node-status-icon{fill:var(--green)}.dep-node-in_progress .dep-node-status-icon{fill:var(--purple)}.dep-node-blocked .dep-node-status-icon{fill:var(--red)}.dep-node-detail{padding:12px 16px;border-top:1px solid var(--border);background:var(--bg)}.dep-detail-header{display:flex;align-items:center;gap:8px;margin-bottom:6px}.dep-detail-title{font-weight:var(--weight-semibold);font-size:var(--font-md);color:var(--text)}.dep-detail-id{font-family:monospace;font-size:var(--font-sm);color:var(--text-dim);opacity:.7;margin-bottom:8px}.dep-detail-deps{font-size:var(--font-base);color:var(--text-dim);margin-bottom:8px;display:flex;align-items:center;flex-wrap:wrap;gap:6px}.dep-detail-label{font-weight:var(--weight-medium)}.dep-detail-dep-link{color:var(--accent);cursor:pointer;font-weight:var(--weight-medium);padding:2px 6px;background:#00e5b914;border-radius:3px;transition:background .15s}.dep-detail-dep-link:hover{background:#00e5b926}.dep-detail-nav-btn{background:transparent;border:1px solid var(--border);color:var(--accent);font-size:var(--font-base);padding:4px 12px;border-radius:4px;cursor:pointer;transition:border-color .15s,background .15s}.dep-detail-nav-btn:hover{border-color:var(--accent);background:#00e5b914}.dep-legend{display:flex;flex-wrap:wrap;gap:16px;padding:8px 16px;background:var(--bg-surface);border:1px solid var(--border);border-radius:6px;margin-bottom:20px;font-size:var(--font-sm);color:var(--text-dim)}.dep-legend-item{display:flex;align-items:center;gap:6px}.dep-legend-line{display:inline-block;width:24px;height:2px}.dep-legend-resolved{background:var(--brand-teal);opacity:.6}.dep-legend-unresolved{background:var(--text-dim);opacity:.5}.dep-legend-cycle{background:var(--brand-orange);background-image:repeating-linear-gradient(90deg,var(--brand-orange) 0px,var(--brand-orange) 4px,transparent 4px,transparent 8px)}.dep-empty{text-align:center;padding:40px 20px;color:var(--text-dim)}.dep-empty-icon{font-size:var(--font-3xl);color:var(--green);margin-bottom:12px}.dep-empty-hint{font-size:var(--font-base);opacity:.7}.dep-details-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:20px}@media (max-width: 800px){.dep-details-grid{grid-template-columns:1fr}}.dep-section-title{font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text);margin:0 0 4px}.dep-section-desc{font-size:var(--font-base);color:var(--text-dim);margin:0 0 12px}.dep-blockers{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:14px}.dep-blocker-list{display:flex;flex-direction:column;gap:6px}.dep-blocker-item{display:flex;align-items:center;gap:10px;padding:8px 10px;background:var(--bg);border-radius:4px;cursor:pointer;transition:background .15s}.dep-blocker-item:hover{background:var(--bg-hover)}.dep-blocker-count{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;background:#d52e6626;color:var(--red);font-weight:var(--weight-bold);font-size:var(--font-base);border-radius:50%;flex-shrink:0}.dep-blocker-title{font-size:var(--font-base);color:var(--text);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dep-blocker-id{font-family:monospace;font-size:var(--font-sm);color:var(--text-dim);opacity:.7}.dep-chains{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:14px}.dep-chain-list{display:flex;flex-direction:column;gap:10px}.dep-chain{padding:8px 10px;background:var(--bg);border-radius:4px}.dep-chain-length{display:inline-block;font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text-dim);background:var(--bg-hover);padding:2px 8px;border-radius:10px;margin-bottom:6px}.dep-chain-path{display:flex;align-items:center;flex-wrap:wrap;gap:4px}.dep-chain-arrow{color:var(--text-dim);font-size:var(--font-sm);opacity:.6}.dep-chain-node{font-size:var(--font-sm);padding:2px 8px;border-radius:3px;cursor:pointer;transition:background .15s;white-space:nowrap}.dep-chain-node:hover{opacity:.8}.dep-chain-node-completed{background:#00bd8126;color:var(--green)}.dep-chain-node-in_progress{background:#6c41f026;color:var(--purple)}.dep-chain-node-pending{background:var(--bg-hover);color:var(--text-dim)}.dep-chain-node-blocked{background:#d52e6626;color:var(--red)}.hench-runs-container{max-width:1200px}.active-tasks-panel{background:color-mix(in srgb,var(--accent) 6%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--accent) 30%,var(--border));border-radius:var(--radius-xl);padding:var(--space-4);margin-bottom:var(--space-5)}.active-tasks-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.active-tasks-header-left{display:flex;align-items:center;gap:var(--space-2)}.active-tasks-icon{font-size:var(--font-lg);color:var(--accent);animation:active-tasks-spin 2s linear infinite}@keyframes active-tasks-spin{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.active-tasks-title{margin:0;font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text)}.active-tasks-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--accent);color:var(--bg);font-size:var(--font-xs);font-weight:var(--weight-bold)}.active-tasks-list{display:flex;flex-direction:column;gap:var(--space-2)}.active-task-card{display:flex;align-items:flex-start;gap:var(--space-3);background:var(--bg-surface);border:1px solid color-mix(in srgb,var(--accent) 20%,var(--border));border-radius:var(--radius-lg);padding:var(--space-3) var(--space-4);transition:border-color var(--transition-normal)}.active-task-card:hover{border-color:var(--accent)}.active-task-card-stale{border-color:color-mix(in srgb,var(--orange) 40%,var(--border))}.active-task-card-stale:hover{border-color:var(--orange)}.active-task-card-starting{opacity:.8}.active-task-pulse-wrapper{flex-shrink:0;width:12px;height:12px;display:flex;align-items:center;justify-content:center;margin-top:3px}.active-task-pulse{display:block;width:8px;height:8px;border-radius:50%;background:var(--accent);animation:active-task-pulse-anim 2s ease-in-out infinite}.active-task-pulse-stale{background:var(--orange);animation:active-task-pulse-stale-anim 1s ease-in-out infinite}.active-task-pulse-starting{background:var(--purple);animation:active-task-pulse-anim 1s ease-in-out infinite}@keyframes active-task-pulse-anim{0%,to{box-shadow:0 0 color-mix(in srgb,var(--accent) 40%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 0%,transparent)}}@keyframes active-task-pulse-stale-anim{0%,to{box-shadow:0 0 color-mix(in srgb,var(--orange) 40%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--orange) 0%,transparent)}}.active-task-content{flex:1;min-width:0}.active-task-title-row{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-1)}.active-task-title{font-weight:var(--weight-medium);font-size:var(--font-base);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.active-task-link{flex:1;min-width:0;font-size:var(--font-base);font-weight:var(--weight-medium)}.active-task-stale-badge{flex-shrink:0;font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent);padding:1px 8px;border-radius:var(--radius-sm)}.active-task-starting-badge{flex-shrink:0;font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--purple);background:color-mix(in srgb,var(--purple) 12%,transparent);padding:1px 8px;border-radius:var(--radius-sm)}.active-task-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3)}.active-task-elapsed,.active-task-started,.active-task-turns{display:inline-flex;align-items:center;gap:4px;font-size:var(--font-sm);color:var(--text-dim)}.active-task-elapsed{font-weight:var(--weight-semibold);color:var(--accent);font-variant-numeric:tabular-nums}.active-task-meta-icon{font-size:var(--font-xs);opacity:.7}.active-task-model{font-size:var(--font-xs);font-weight:var(--weight-semibold);padding:1px 6px;border-radius:var(--radius-sm);background:var(--bg-hover);color:var(--text-dim)}.active-task-model-sonnet{color:var(--brand-teal)}.active-task-model-opus{color:var(--brand-purple)}.active-task-model-haiku{color:var(--brand-orange)}@media (max-width: 700px){.active-task-meta{gap:var(--space-2)}}.hench-runs-header{display:flex;flex-direction:column;margin-bottom:var(--space-4);gap:var(--space-1)}.hench-runs-title-row{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--space-2)}.hench-runs-header h2{font-size:var(--font-3xl);font-weight:var(--weight-bold);margin:0;line-height:var(--leading-tight)}.hench-runs-count{font-size:var(--font-md);color:var(--text-dim)}.hench-metrics{margin-bottom:16px}.hench-filter-bar{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:16px}.hench-filter-count{font-weight:400;opacity:.7}.hench-runs-list{display:flex;flex-direction:column;gap:8px}.hench-run-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:14px 16px;cursor:pointer;transition:border-color .15s,background .15s}.hench-run-card:hover{border-color:var(--accent);background:var(--bg-hover)}.hench-run-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.hench-run-card.selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg-surface))}.hench-run-card.failed{border-left:3px solid var(--red)}.hench-run-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.hench-run-status{flex-shrink:0;font-size:14px}.hench-run-title{flex:1;font-weight:500;font-size:13px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hench-run-task-link{flex:1;min-width:0;padding:1px 4px;margin:-1px 0;font-size:13px}.hench-run-time{font-size:12px;color:var(--text-dim);flex-shrink:0}.hench-run-meta{display:flex;flex-wrap:wrap;gap:6px;padding-left:22px}.hench-run-chip{font-size:11px;color:var(--text-dim);background:var(--bg-hover);padding:2px 8px;border-radius:4px}.hench-run-model{font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px;background:var(--bg-hover);color:var(--text-dim)}.hench-run-model-sonnet{color:var(--brand-teal)}.hench-run-model-opus{color:var(--brand-purple)}.hench-run-model-haiku{color:var(--brand-orange)}.hench-no-results{text-align:center;color:var(--text-dim);padding:24px;font-size:13px}.hench-empty{text-align:center;padding:60px 20px;color:var(--text-dim)}.hench-empty-icon{font-size:48px;margin-bottom:16px;opacity:.3}.hench-empty p{margin:4px 0;font-size:14px}.hench-empty-hint{font-size:12px!important;color:var(--text-dim);opacity:.7}.hench-empty code{font-family:monospace;background:var(--bg-hover);padding:2px 6px;border-radius:3px}.hench-run-detail{max-width:800px}.hench-detail-header{margin-bottom:24px}.hench-back-btn{background:none;border:1px solid var(--border);color:var(--text);padding:6px 12px;border-radius:6px;cursor:pointer;font-size:12px;margin-bottom:16px;transition:border-color .15s,background .15s}.hench-back-btn:hover{border-color:var(--accent);background:var(--bg-hover)}.hench-detail-title-row{display:flex;align-items:center;gap:10px}.hench-detail-title-row h2{font-size:20px;margin:0}.hench-detail-info{background:var(--bg-surface);border:1px solid var(--border);border-radius:12px;padding:16px 20px;margin-bottom:20px}.hench-info-row{display:flex;align-items:baseline;padding:6px 0;border-bottom:1px solid var(--border)}.hench-info-row:last-child{border-bottom:none}.hench-info-label{font-size:12px;color:var(--text-dim);width:100px;flex-shrink:0}.hench-info-value{font-size:13px;font-weight:500}.hench-info-mono{font-family:monospace;font-size:11px;font-weight:400;word-break:break-all}.hench-detail-section{margin-bottom:20px}.hench-detail-section h3{font-size:13px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;margin-bottom:12px}.hench-activity-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:10px}.hench-activity-item{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:12px;text-align:center}.hench-activity-val{display:block;font-size:20px;font-weight:700;color:var(--accent)}.hench-activity-label{display:block;font-size:11px;color:var(--text-dim);margin-top:2px}.hench-token-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px}.hench-token-item{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:12px;text-align:center}.hench-token-val{display:block;font-size:18px;font-weight:700;color:var(--brand-teal)}.hench-token-label{display:block;font-size:11px;color:var(--text-dim);margin-top:2px}.hench-error-box{background:color-mix(in srgb,var(--red) 8%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 25%,var(--border));border-radius:8px;padding:14px;font-size:12px;font-family:monospace;white-space:pre-wrap;word-break:break-word;color:var(--red);overflow-x:auto;margin:0}.hench-detail-task-section{margin-bottom:20px}.hench-detail-task-card{background:color-mix(in srgb,var(--accent) 6%,var(--bg));border:1px solid color-mix(in srgb,var(--accent) 25%,var(--border));border-radius:8px;padding:12px 14px}.hench-detail-task-id{font-family:monospace;font-size:10px;color:var(--text-dim);margin-top:6px;opacity:.7;word-break:break-all}.hench-summary-box{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:16px;font-size:12px;font-family:monospace;white-space:pre-wrap;word-break:break-word;line-height:1.6;overflow-x:auto;max-height:600px;overflow-y:auto;margin:0}.hench-run-card.stale{border-left:3px solid var(--yellow, #f59e0b)}.hench-run-chip-warning{color:var(--yellow, #f59e0b);font-weight:500}.hench-detail-actions{display:flex;align-items:center;gap:12px}.hench-detail-activity{color:var(--text-dim);font-size:.85rem}.hench-detail-activity-unknown{color:var(--yellow, #f59e0b);font-style:italic}.btn-danger{background:var(--red);color:#fff;border:none;padding:6px 14px;border-radius:6px;cursor:pointer;font-size:.85rem}.btn-danger:hover{opacity:.85}.hench-run-highlighted{animation:hench-run-highlight-pulse 2s ease-out;border-color:var(--accent)}@keyframes hench-run-highlight-pulse{0%{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 50%,transparent);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,var(--bg-surface))}70%{box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 20%,transparent);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 4%,var(--bg-surface))}to{box-shadow:0 0 0 0 transparent;border-color:var(--accent);background:var(--bg-surface)}}.hench-deep-link-error{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);background:color-mix(in srgb,var(--red) 8%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 30%,var(--border));border-radius:var(--radius-lg);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-4);font-size:var(--font-sm);color:var(--red)}.hench-deep-link-error-dismiss{flex-shrink:0;background:none;border:none;color:var(--red);font-size:var(--font-lg);cursor:pointer;padding:0 4px;line-height:1;opacity:.7;transition:opacity var(--transition-fast)}.hench-deep-link-error-dismiss:hover{opacity:1}.concurrency-panel{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-4);margin-bottom:var(--space-4);transition:border-color var(--transition-normal),background var(--transition-normal)}.concurrency-panel-low{border-color:color-mix(in srgb,var(--green) 25%,var(--border))}.concurrency-panel-moderate{border-color:color-mix(in srgb,var(--accent) 25%,var(--border))}.concurrency-panel-high{border-color:color-mix(in srgb,var(--orange) 30%,var(--border));background:color-mix(in srgb,var(--orange) 3%,var(--bg-surface))}.concurrency-panel-at_limit{border-color:color-mix(in srgb,var(--red) 35%,var(--border));background:color-mix(in srgb,var(--red) 4%,var(--bg-surface))}.concurrency-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.concurrency-header-left{display:flex;align-items:center;gap:var(--space-2)}.concurrency-icon{font-size:var(--font-md);transition:color var(--transition-normal)}.concurrency-icon-low{color:var(--green)}.concurrency-icon-moderate{color:var(--accent);animation:concurrency-pulse 2s ease-in-out infinite}.concurrency-icon-high{color:var(--orange);animation:concurrency-pulse 1.5s ease-in-out infinite}.concurrency-icon-at_limit{color:var(--red);animation:concurrency-pulse 1s ease-in-out infinite}@keyframes concurrency-pulse{0%,to{opacity:1}50%{opacity:.5}}.concurrency-title{margin:0;font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text)}.concurrency-level-badge{font-size:var(--font-xs);font-weight:var(--weight-medium);padding:1px 8px;border-radius:var(--radius-sm);transition:color var(--transition-normal),background var(--transition-normal)}.concurrency-level-low{color:var(--green);background:color-mix(in srgb,var(--green) 12%,transparent)}.concurrency-level-moderate{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.concurrency-level-high{color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.concurrency-level-at_limit{color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent)}.concurrency-ratio{font-size:var(--font-xl);font-weight:var(--weight-bold);font-variant-numeric:tabular-nums;line-height:1}.concurrency-ratio-current{font-size:var(--font-2xl)}.concurrency-ratio-sep{opacity:.4;margin:0 2px;font-size:var(--font-lg)}.concurrency-ratio-max{font-size:var(--font-lg);opacity:.6}.concurrency-bar-container{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3)}.concurrency-bar-track{flex:1;height:8px;background:color-mix(in srgb,var(--text) 8%,var(--bg));border-radius:4px;overflow:visible;position:relative}.concurrency-bar-fill{height:100%;border-radius:4px;transition:width .5s ease,background-color var(--transition-normal);min-width:0}.concurrency-bar-low{background:var(--green)}.concurrency-bar-moderate{background:var(--accent)}.concurrency-bar-high{background:var(--orange)}.concurrency-bar-at_limit{background:var(--red);animation:concurrency-bar-pulse 1.5s ease-in-out infinite}@keyframes concurrency-bar-pulse{0%,to{opacity:1}50%{opacity:.7}}.concurrency-bar-segment{position:absolute;top:-1px;bottom:-1px;width:1px;background:color-mix(in srgb,var(--text) 12%,transparent)}.concurrency-bar-pct{font-size:var(--font-xs);font-weight:var(--weight-semibold);color:var(--text-dim);min-width:30px;text-align:right;font-variant-numeric:tabular-nums}.concurrency-stats{display:flex;gap:var(--space-5);flex-wrap:wrap}.concurrency-stat{display:flex;align-items:baseline;gap:var(--space-1)}.concurrency-stat-value{font-size:var(--font-md);font-weight:var(--weight-bold);color:var(--text);font-variant-numeric:tabular-nums}.concurrency-stat-pending{color:var(--text-dim)}.concurrency-stat-label{font-size:var(--font-sm);color:var(--text-dim)}@media (max-width: 700px){.hench-run-meta{padding-left:0}.hench-info-label{width:80px}.hench-activity-grid,.hench-token-grid{grid-template-columns:repeat(2,1fr)}.concurrency-stats{gap:var(--space-3)}.concurrency-ratio{font-size:var(--font-lg)}.concurrency-ratio-current{font-size:var(--font-xl)}.throttle-controls{padding:var(--space-3)}.throttle-stop-actions{flex-direction:column}}.throttle-controls{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-4);margin-bottom:var(--space-4);transition:border-color var(--transition-normal),background var(--transition-normal)}.throttle-controls-paused{border-color:color-mix(in srgb,var(--orange) 35%,var(--border));background:color-mix(in srgb,var(--orange) 3%,var(--bg-surface))}.throttle-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.throttle-header-left{display:flex;align-items:center;gap:var(--space-2)}.throttle-icon{font-size:var(--font-md);color:var(--text-dim)}.throttle-icon-paused{color:var(--orange);animation:throttle-pulse 1.5s ease-in-out infinite}@keyframes throttle-pulse{0%,to{opacity:1}50%{opacity:.4}}.throttle-title{margin:0;font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text)}.throttle-paused-badge{font-size:var(--font-xs);font-weight:var(--weight-semibold);padding:1px 8px;border-radius:var(--radius-sm);color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.throttle-active-count{font-size:var(--font-sm);font-weight:var(--weight-medium);color:var(--accent);font-variant-numeric:tabular-nums}.throttle-error{background:color-mix(in srgb,var(--red) 8%,var(--bg));border:1px solid color-mix(in srgb,var(--red) 25%,var(--border));border-radius:var(--radius-md);padding:var(--space-2) var(--space-3);color:var(--red);font-size:var(--font-sm);margin-bottom:var(--space-3)}.throttle-section{padding:var(--space-3) 0;border-top:1px solid var(--border)}.throttle-section:first-of-type{border-top:none;padding-top:0}.throttle-section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-2)}.throttle-section-label{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:var(--tracking-wide)}.throttle-section-value{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text);font-variant-numeric:tabular-nums}.throttle-override-value{color:var(--accent)}.throttle-config-hint{color:var(--text-muted);font-weight:var(--weight-normal);font-size:var(--font-xs)}.throttle-slider-row{display:flex;align-items:center;gap:var(--space-2)}.throttle-slider-min,.throttle-slider-max{font-size:var(--font-xs);color:var(--text-muted);min-width:16px;text-align:center;font-variant-numeric:tabular-nums}.throttle-slider{flex:1;height:6px;-webkit-appearance:none;appearance:none;background:var(--border);border-radius:3px;outline:none;cursor:pointer}.throttle-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:18px;height:18px;border-radius:50%;background:var(--accent);cursor:pointer;border:2px solid var(--bg-surface);box-shadow:0 1px 3px #0003;transition:transform var(--transition-fast)}.throttle-slider::-webkit-slider-thumb:hover{transform:scale(1.15)}.throttle-slider::-moz-range-thumb{width:18px;height:18px;border-radius:50%;background:var(--accent);cursor:pointer;border:2px solid var(--bg-surface);box-shadow:0 1px 3px #0003}.throttle-slider:disabled{opacity:.5;cursor:not-allowed}.throttle-reset-btn{display:inline-block;margin-top:var(--space-2);font-size:var(--font-xs);color:var(--text-dim);background:none;border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px 10px;cursor:pointer;transition:color var(--transition-fast),border-color var(--transition-fast)}.throttle-reset-btn:hover{color:var(--accent);border-color:var(--accent)}.throttle-reset-btn:disabled{opacity:.5;cursor:not-allowed}.throttle-status-indicator{font-size:var(--font-xs);font-weight:var(--weight-semibold);padding:1px 8px;border-radius:var(--radius-sm)}.throttle-status-active{color:var(--green);background:color-mix(in srgb,var(--green) 12%,transparent)}.throttle-status-paused{color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.throttle-pause-info{display:flex;flex-direction:column;gap:var(--space-2)}.throttle-pause-desc{font-size:var(--font-sm);color:var(--text-dim);margin:0;line-height:var(--leading-relaxed)}.throttle-pause-time{font-size:var(--font-xs);color:var(--text-muted)}.throttle-pause-btn,.throttle-resume-btn{font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:8px 16px;border-radius:var(--radius-md);cursor:pointer;border:none;transition:background var(--transition-fast),transform var(--transition-fast);white-space:nowrap}.throttle-pause-btn{color:var(--orange);background:color-mix(in srgb,var(--orange) 10%,var(--bg));border:1px solid color-mix(in srgb,var(--orange) 25%,var(--border))}.throttle-pause-btn:hover{background:color-mix(in srgb,var(--orange) 18%,var(--bg))}.throttle-resume-btn{color:#fff;background:var(--green)}.throttle-resume-btn:hover{background:color-mix(in srgb,var(--green) 85%,#000);transform:translateY(-1px)}.throttle-pause-btn:disabled,.throttle-resume-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.throttle-section-danger{border-top-color:color-mix(in srgb,var(--red) 15%,var(--border))}.throttle-danger-label{color:var(--red)}.throttle-stop-btn{width:100%;font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:10px 16px;border-radius:var(--radius-md);cursor:pointer;color:var(--red);background:color-mix(in srgb,var(--red) 8%,var(--bg));border:1px solid color-mix(in srgb,var(--red) 25%,var(--border));transition:background var(--transition-fast),border-color var(--transition-fast)}.throttle-stop-btn:hover:not(:disabled){background:color-mix(in srgb,var(--red) 15%,var(--bg));border-color:color-mix(in srgb,var(--red) 40%,var(--border))}.throttle-stop-btn:disabled{opacity:.4;cursor:not-allowed;color:var(--text-muted);border-color:var(--border);background:var(--bg-surface)}.throttle-stop-confirm{display:flex;flex-direction:column;gap:var(--space-2)}.throttle-stop-warn{font-size:var(--font-sm);color:var(--red);margin:0;line-height:var(--leading-relaxed);font-weight:var(--weight-medium)}.throttle-stop-actions{display:flex;gap:var(--space-2)}.throttle-stop-confirm-btn{flex:1;font-size:var(--font-sm);font-weight:var(--weight-semibold);padding:8px 16px;border-radius:var(--radius-md);cursor:pointer;color:#fff;background:var(--red);border:none;transition:background var(--transition-fast)}.throttle-stop-confirm-btn:hover{background:color-mix(in srgb,var(--red) 85%,#000)}.throttle-stop-confirm-btn:disabled{opacity:.5;cursor:not-allowed}.throttle-stop-cancel-btn{font-size:var(--font-sm);font-weight:var(--weight-medium);padding:8px 16px;border-radius:var(--radius-md);cursor:pointer;color:var(--text-dim);background:var(--bg);border:1px solid var(--border);transition:border-color var(--transition-fast)}.throttle-stop-cancel-btn:hover{border-color:var(--text-muted)}.throttle-stop-cancel-btn:disabled{opacity:.5;cursor:not-allowed}.throttle-stop-last{display:block;margin-top:var(--space-2);font-size:var(--font-xs);color:var(--text-muted)}.memory-panel{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-4);margin-bottom:var(--space-4);transition:border-color var(--transition-normal),background var(--transition-normal)}.memory-panel-healthy{border-color:color-mix(in srgb,var(--green) 25%,var(--border))}.memory-panel-warning{border-color:color-mix(in srgb,var(--orange) 30%,var(--border));background:color-mix(in srgb,var(--orange) 3%,var(--bg-surface))}.memory-panel-critical{border-color:color-mix(in srgb,var(--red) 35%,var(--border));background:color-mix(in srgb,var(--red) 4%,var(--bg-surface))}.memory-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.memory-header-left{display:flex;align-items:center;gap:var(--space-2)}.memory-icon{font-size:var(--font-md);transition:color var(--transition-normal)}.memory-icon-healthy{color:var(--green)}.memory-icon-warning{color:var(--orange);animation:memory-pulse 2s ease-in-out infinite}.memory-icon-critical{color:var(--red);animation:memory-pulse 1s ease-in-out infinite}@keyframes memory-pulse{0%,to{opacity:1}50%{opacity:.5}}.memory-title{margin:0;font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text)}.memory-health-badge{font-size:var(--font-xs);font-weight:var(--weight-medium);padding:1px 8px;border-radius:var(--radius-sm);transition:color var(--transition-normal),background var(--transition-normal)}.memory-health-healthy{color:var(--green);background:color-mix(in srgb,var(--green) 12%,transparent)}.memory-health-warning{color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.memory-health-critical{color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent)}.memory-pct-display{font-weight:var(--weight-bold);line-height:1}.memory-pct-value{font-size:var(--font-2xl);font-variant-numeric:tabular-nums}.memory-pct-sign{font-size:var(--font-lg);opacity:.6}.memory-pressure-alert{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);margin-bottom:var(--space-3);font-size:var(--font-sm)}.memory-pressure-warning{background:color-mix(in srgb,var(--orange) 10%,transparent);color:var(--orange)}.memory-pressure-critical{background:color-mix(in srgb,var(--red) 10%,transparent);color:var(--red)}.memory-pressure-icon{font-size:var(--font-md);flex-shrink:0}.memory-pressure-text{line-height:1.3}.memory-bar-container{margin-bottom:var(--space-3)}.memory-bar-label{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:var(--space-1);font-size:var(--font-sm);color:var(--text)}.memory-bar-detail{font-size:var(--font-xs);color:var(--text-dim);font-variant-numeric:tabular-nums}.memory-bar-track{height:8px;background:color-mix(in srgb,var(--text) 8%,var(--bg));border-radius:4px;overflow:hidden}.memory-bar-fill{height:100%;border-radius:4px;transition:width .5s ease,background-color var(--transition-normal);min-width:0}.memory-bar-healthy{background:var(--green)}.memory-bar-warning{background:var(--orange)}.memory-bar-critical{background:var(--red);animation:memory-bar-pulse 1.5s ease-in-out infinite}.memory-bar-server{background:var(--accent)}@keyframes memory-bar-pulse{0%,to{opacity:1}50%{opacity:.7}}.memory-processes{margin-bottom:var(--space-3);border-top:1px solid var(--border);padding-top:var(--space-3)}.memory-processes-header{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.memory-processes-title{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text)}.memory-processes-count{font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);padding:0 6px;border-radius:var(--radius-sm)}.memory-process-row{display:flex;align-items:center;justify-content:space-between;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);transition:background var(--transition-fast)}.memory-process-row:hover{background:color-mix(in srgb,var(--text) 4%,transparent)}.memory-process-info{display:flex;align-items:baseline;gap:var(--space-2);min-width:0}.memory-process-name{font-size:var(--font-sm);color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.memory-process-pid{font-size:var(--font-xs);color:var(--text-muted);font-variant-numeric:tabular-nums}.memory-process-rss{font-size:var(--font-sm);font-weight:var(--weight-semibold);color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap}.memory-stats{display:flex;gap:var(--space-5);flex-wrap:wrap}.memory-stat{display:flex;align-items:baseline;gap:var(--space-1)}.memory-stat-value{font-size:var(--font-md);font-weight:var(--weight-bold);color:var(--text);font-variant-numeric:tabular-nums}.memory-stat-label{font-size:var(--font-sm);color:var(--text-dim)}@media (max-width: 700px){.memory-panel{padding:var(--space-3)}.memory-stats{gap:var(--space-3)}.memory-pct-value{font-size:var(--font-xl)}.memory-process-name{max-width:140px}}.hench-config-container{max-width:900px}.hench-config-header{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--space-2);margin-bottom:var(--space-4)}.hench-config-modified-count{font-size:12px;color:var(--brand-teal)}.hench-config-error-state{text-align:center;padding:40px 20px;color:var(--text-dim)}.hench-config-error-hint{font-size:13px;margin-top:8px}.hench-config-error-hint code{background:var(--bg-surface);border:1px solid var(--border);padding:2px 6px;border-radius:4px;font-size:12px;color:var(--accent)}.hench-config-save-error{background:color-mix(in srgb,var(--red) 12%,transparent);border:1px solid color-mix(in srgb,var(--red) 40%,transparent);color:var(--red);padding:10px 16px;border-radius:8px;font-size:13px;margin-bottom:var(--space-4)}.hench-config-changes-panel{background:var(--bg-surface);border:1px solid var(--accent);border-radius:8px;padding:14px 16px;margin-bottom:20px;position:sticky;top:8px;z-index:10;box-shadow:0 4px 16px #00000026}.hench-config-changes-header{margin-bottom:10px}.hench-config-changes-title{font-size:13px;font-weight:600;color:var(--accent)}.hench-config-changes-list{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.hench-config-change-item{padding:6px 10px;background:var(--bg-hover);border-radius:6px;font-size:12px}.hench-config-change-label{font-weight:600;color:var(--text);margin-bottom:2px}.hench-config-change-diff{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.hench-config-change-old{color:var(--text-dim);text-decoration:line-through;font-family:monospace;font-size:11px}.hench-config-change-arrow{color:var(--text-muted);font-size:11px}.hench-config-change-new{color:var(--accent);font-family:monospace;font-size:11px;font-weight:600}.hench-config-change-impact{color:var(--text-dim);font-size:11px;margin-top:2px}.hench-config-changes-actions{display:flex;gap:8px;justify-content:flex-end}.hench-config-discard-btn{background:none;border:1px solid var(--border);color:var(--text-dim);padding:6px 14px;border-radius:4px;font-size:12px;cursor:pointer;transition:border-color .15s,color .15s}.hench-config-discard-btn:hover{border-color:var(--text-dim);color:var(--text)}.hench-config-discard-btn:disabled{opacity:.5;cursor:not-allowed}.hench-config-save-all-btn{background:var(--accent);border:none;color:var(--bg);padding:6px 16px;border-radius:4px;font-size:12px;font-weight:600;cursor:pointer;transition:opacity .15s}.hench-config-save-all-btn:hover{opacity:.9}.hench-config-save-all-btn:disabled{opacity:.5;cursor:not-allowed}.hench-config-category{margin-bottom:28px}.hench-config-category-header{display:flex;align-items:flex-start;gap:10px;margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--border)}.hench-config-category-icon{font-size:18px;flex-shrink:0;line-height:1.3}.hench-config-category-title{font-size:15px;font-weight:600;margin:0}.hench-config-category-desc{font-size:12px;color:var(--text-dim);margin:2px 0 0}.hench-config-fields{display:flex;flex-direction:column;gap:6px}.hench-config-field{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:12px 16px;transition:border-color .15s}.hench-config-field.modified{border-left:3px solid var(--brand-teal)}.hench-config-field.dirty{border-color:var(--accent)}.hench-config-field-header{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:4px}.hench-config-field-label{display:flex;align-items:baseline;gap:8px}.hench-config-field-name{font-weight:600;font-size:13px}.hench-config-modified-badge{font-size:10px;font-weight:500;color:var(--brand-teal);background:color-mix(in srgb,var(--brand-teal) 12%,transparent);padding:1px 6px;border-radius:3px}.hench-config-dirty-badge{font-size:10px;font-weight:500;color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent);padding:1px 6px;border-radius:3px}.hench-config-field-actions{display:flex;align-items:baseline;gap:8px}.hench-config-field-path{font-size:11px;font-family:monospace;color:var(--text-dim);opacity:.7}.hench-config-field-desc{font-size:12px;color:var(--text-dim);margin:0 0 8px}.hench-config-reset-btn{background:none;border:1px solid var(--border);color:var(--text-dim);padding:2px 8px;border-radius:3px;font-size:11px;cursor:pointer;transition:border-color .15s,color .15s}.hench-config-reset-btn:hover{border-color:var(--orange);color:var(--orange)}.hench-config-control-row{margin-bottom:4px}.hench-config-input,.hench-config-select{width:100%;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:13px;font-family:monospace;outline:none;box-sizing:border-box;transition:border-color .15s}.hench-config-input:focus,.hench-config-select:focus{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.hench-config-input.input-error,.hench-config-select.input-error{border-color:var(--red);background:color-mix(in srgb,var(--red) 5%,transparent)}.hench-config-input[type=number],.hench-config-select{max-width:200px}.hench-config-toggle{display:inline-flex;align-items:center;gap:10px;cursor:pointer;user-select:none}.hench-config-toggle input[type=checkbox]{position:absolute;opacity:0;width:0;height:0}.hench-config-toggle-slider{position:relative;display:inline-block;width:36px;height:20px;background:var(--bg-hover);border:1px solid var(--border);border-radius:10px;transition:background .2s,border-color .2s;flex-shrink:0}.hench-config-toggle-slider:after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;background:var(--text-dim);border-radius:50%;transition:transform .2s,background .2s}.hench-config-toggle input:checked+.hench-config-toggle-slider{background:color-mix(in srgb,var(--accent) 25%,transparent);border-color:var(--accent)}.hench-config-toggle input:checked+.hench-config-toggle-slider:after{transform:translate(16px);background:var(--accent)}.hench-config-toggle-label{font-size:12px;color:var(--text-dim)}.hench-config-tags{display:flex;flex-direction:column;gap:8px}.hench-config-tag-list{display:flex;flex-wrap:wrap;gap:6px}.hench-config-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:var(--bg-hover);border:1px solid var(--border);border-radius:4px;font-size:12px;font-family:monospace;color:var(--text)}.hench-config-tag-text{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hench-config-tag-remove{background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:14px;padding:0 2px;line-height:1;transition:color .15s}.hench-config-tag-remove:hover{color:var(--red)}.hench-config-tag-input-row{display:flex;gap:6px;align-items:center}.hench-config-tag-input{flex:1;max-width:200px;padding:4px 8px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:12px;font-family:monospace;outline:none}.hench-config-tag-input:focus{border-color:var(--accent)}.hench-config-tag-add-btn{background:none;border:1px solid var(--border);color:var(--text-dim);padding:4px 10px;border-radius:4px;font-size:11px;cursor:pointer;transition:border-color .15s,color .15s}.hench-config-tag-add-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.hench-config-tag-add-btn:disabled{opacity:.4;cursor:not-allowed}.hench-config-impact{font-size:11px;color:var(--text-dim);margin-top:6px;opacity:.8}.hench-config-preview{font-size:11px;color:var(--brand-teal);margin-top:6px;padding:4px 8px;background:color-mix(in srgb,var(--brand-teal) 8%,transparent);border-radius:4px}.hench-config-preview-label{font-weight:600}.hench-config-error{font-size:12px;color:var(--red);margin-top:6px}.hench-config-toast{position:fixed;bottom:20px;right:20px;background:var(--green);color:var(--bg);padding:10px 18px;border-radius:8px;font-size:13px;font-weight:600;display:flex;align-items:center;gap:8px;box-shadow:0 4px 12px #0003;animation:toast-in .2s ease-out;z-index:1000}.hench-config-toast-icon{font-size:16px}@media (max-width: 700px){.hench-config-control-row .hench-config-input,.hench-config-control-row .hench-config-select,.hench-config-input[type=number]{max-width:100%}.hench-config-field-header{flex-direction:column;gap:2px}.hench-config-changes-panel{position:static}}.hench-templates-container{max-width:1000px}.hench-templates-header{margin-bottom:var(--space-4)}.hench-templates-subtitle{font-size:13px;color:var(--text-dim);margin-top:6px}.hench-templates-error{text-align:center;padding:40px 20px;color:var(--text-dim)}.hench-templates-error-hint{font-size:13px;margin-top:8px}.hench-templates-error-hint code{background:var(--bg-surface);border:1px solid var(--border);padding:2px 6px;border-radius:4px;font-size:12px;color:var(--accent)}.hench-templates-section{margin-bottom:28px}.hench-templates-section-title{font-size:14px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em;margin:0 0 14px;padding-bottom:8px;border-bottom:1px solid var(--border)}.hench-templates-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}.hench-template-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;overflow:hidden;transition:border-color .15s}.hench-template-card:hover{border-color:var(--accent)}.hench-template-card.built-in{border-left:3px solid var(--brand-teal)}.hench-template-card.user-defined{border-left:3px solid var(--accent)}.hench-template-card-header{padding:14px 16px 10px;cursor:pointer}.hench-template-card-title-row{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}.hench-template-card-name{font-size:14px;font-weight:600;margin:0}.hench-template-card-desc{font-size:12px;color:var(--text-dim);margin:0 0 8px;line-height:1.4}.hench-template-badge{font-size:10px;font-weight:500;padding:1px 6px;border-radius:3px;flex-shrink:0}.hench-template-badge.built-in{color:var(--brand-teal);background:color-mix(in srgb,var(--brand-teal) 12%,transparent)}.hench-template-badge.user{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.hench-template-tags{display:flex;flex-wrap:wrap;gap:4px}.hench-template-tag{font-size:10px;color:var(--text-dim);background:var(--bg-hover);padding:2px 6px;border-radius:3px}.hench-template-card-detail{padding:12px 16px;border-top:1px solid var(--border);margin-top:4px}.hench-template-use-cases{margin-bottom:12px}.hench-template-use-cases h4,.hench-template-config h4{font-size:12px;font-weight:600;margin:0 0 6px;color:var(--text-dim)}.hench-template-use-cases ul{margin:0;padding-left:20px;font-size:12px;color:var(--text-dim);line-height:1.6}.hench-template-config-table{width:100%;border-collapse:collapse}.hench-template-config-table td{padding:3px 8px;font-size:12px;border-bottom:1px solid var(--border)}.hench-template-config-key{font-family:monospace;color:var(--text-dim);white-space:nowrap;width:1%}.hench-template-config-value{font-family:monospace;color:var(--text);word-break:break-all}.hench-template-created{font-size:11px;color:var(--text-dim);margin:8px 0 0;opacity:.7}.hench-template-card-actions{display:flex;gap:6px;padding:8px 16px 12px}.hench-template-expand-btn{background:none;border:1px solid var(--border);color:var(--text-dim);padding:4px 12px;border-radius:4px;font-size:12px;cursor:pointer;transition:border-color .15s,color .15s}.hench-template-expand-btn:hover{border-color:var(--text-dim);color:var(--text)}.hench-template-apply-btn{background:var(--accent);border:none;color:var(--bg);padding:4px 14px;border-radius:4px;font-size:12px;font-weight:600;cursor:pointer;transition:opacity .15s}.hench-template-apply-btn:hover{opacity:.9}.hench-template-apply-btn:disabled{opacity:.5;cursor:not-allowed}.hench-template-delete-btn{background:none;border:1px solid var(--red);color:var(--red);padding:4px 12px;border-radius:4px;font-size:12px;cursor:pointer;opacity:.7;transition:opacity .15s;margin-left:auto}.hench-template-delete-btn:hover{opacity:1}.hench-template-save-current-btn{background:none;border:1px dashed var(--border);color:var(--text-dim);padding:10px 18px;border-radius:8px;font-size:13px;cursor:pointer;width:100%;margin-bottom:24px;transition:border-color .15s,color .15s}.hench-template-save-current-btn:hover{border-color:var(--accent);color:var(--accent)}.hench-template-save-form{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;padding:16px;margin-bottom:24px}.hench-template-save-form h3{font-size:14px;font-weight:600;margin:0 0 14px}.hench-template-form-field{margin-bottom:10px}.hench-template-form-field label{display:block;font-size:12px;font-weight:600;color:var(--text-dim);margin-bottom:4px}.hench-template-form-field input{width:100%;padding:6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:4px;color:var(--text);font-size:13px;outline:none;box-sizing:border-box}.hench-template-form-field input:focus{border-color:var(--accent)}.hench-template-form-error{font-size:12px;color:var(--red);margin:8px 0}.hench-template-form-actions{display:flex;gap:8px;margin-top:12px}.hench-template-cancel-btn{background:none;border:1px solid var(--border);color:var(--text-dim);padding:6px 12px;border-radius:4px;font-size:12px;cursor:pointer}.hench-template-cancel-btn:hover{border-color:var(--text-dim)}.hench-template-toast{position:fixed;bottom:20px;right:20px;background:var(--green);color:var(--bg);padding:10px 18px;border-radius:8px;font-size:13px;font-weight:600;display:flex;align-items:center;gap:8px;box-shadow:0 4px 12px #0003;animation:toast-in .2s ease-out;z-index:1000}.hench-template-toast-icon{font-size:16px}@media (max-width: 700px){.hench-templates-grid{grid-template-columns:1fr}.hench-template-card-actions{flex-wrap:wrap}}.audit-container{max-width:1200px}.audit-header{display:flex;flex-direction:column;margin-bottom:var(--space-4);gap:var(--space-1)}.audit-title-row{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-3)}.audit-title-row h2{font-size:var(--font-3xl);font-weight:var(--weight-bold);margin:0;line-height:var(--leading-tight)}.audit-count-badge{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:22px;padding:0 7px;border-radius:11px;background:var(--accent);color:var(--bg);font-size:var(--font-sm);font-weight:var(--weight-bold)}.audit-timestamp{font-size:var(--font-sm);color:var(--text-dim);margin-left:auto}.audit-error{text-align:center;padding:var(--space-8);color:var(--text-dim)}.audit-system-panel{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-4);margin-bottom:var(--space-5)}.audit-system-panel h3{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;margin:0 0 var(--space-3) 0}.audit-system-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-3)}.audit-system-item{display:flex;flex-direction:column;gap:2px}.audit-system-label{font-size:var(--font-xs);color:var(--text-dim);text-transform:uppercase;letter-spacing:.3px}.audit-system-value{font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text)}.audit-system-pct{font-size:var(--font-xs);font-weight:var(--weight-normal);color:var(--text-dim)}.audit-mono{font-family:monospace}.audit-section{margin-bottom:var(--space-5)}.audit-section h3{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;margin:0 0 var(--space-3) 0}.audit-empty{text-align:center;padding:var(--space-10) var(--space-5);color:var(--text-dim)}.audit-empty-icon{font-size:48px;margin-bottom:var(--space-4);opacity:.3;color:var(--green)}.audit-empty p{margin:var(--space-1) 0;font-size:var(--font-md)}.audit-empty-hint{font-size:var(--font-sm)!important;color:var(--text-dim);opacity:.7}.audit-empty code{font-family:monospace;background:var(--bg-hover);padding:2px var(--space-1-5);border-radius:3px}.audit-tasks-list{display:flex;flex-direction:column;gap:var(--space-3)}.audit-task-wrapper{display:flex;flex-direction:column}.audit-task-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);padding:var(--space-4);transition:border-color var(--transition-normal)}.audit-task-card:hover{border-color:color-mix(in srgb,var(--accent) 50%,var(--border))}.audit-task-stale{border-color:color-mix(in srgb,var(--orange) 40%,var(--border));border-left:3px solid var(--orange)}.audit-task-heartbeat-warning{border-color:color-mix(in srgb,var(--orange) 30%,var(--border));border-left:3px solid var(--orange)}.audit-task-unresponsive{border-color:color-mix(in srgb,var(--red) 40%,var(--border));border-left:3px solid var(--red)}.audit-task-header{display:flex;align-items:flex-start;gap:var(--space-3)}.audit-task-pulse-wrapper{flex-shrink:0;width:12px;height:12px;display:flex;align-items:center;justify-content:center;margin-top:3px}.audit-task-pulse{display:block;width:8px;height:8px;border-radius:50%;background:var(--accent);animation:audit-pulse 2s ease-in-out infinite}.audit-task-pulse-stale{background:var(--orange);animation:audit-pulse-stale 1s ease-in-out infinite}@keyframes audit-pulse{0%,to{box-shadow:0 0 color-mix(in srgb,var(--accent) 40%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 0%,transparent)}}@keyframes audit-pulse-stale{0%,to{box-shadow:0 0 color-mix(in srgb,var(--orange) 40%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--orange) 0%,transparent)}}.audit-task-info{flex:1;min-width:0}.audit-task-title-row{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.audit-task-title{font-weight:var(--weight-medium);font-size:var(--font-md);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.audit-task-link{flex:1;min-width:0;font-size:var(--font-md);font-weight:var(--weight-medium)}.audit-task-stale-badge,.audit-task-warning-badge{flex-shrink:0;font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent);padding:1px var(--space-2);border-radius:var(--radius-sm)}.audit-task-unresponsive-badge{flex-shrink:0;font-size:var(--font-xs);font-weight:var(--weight-bold);color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent);padding:1px var(--space-2);border-radius:var(--radius-sm);animation:audit-pulse-stale 1s ease-in-out infinite}.audit-task-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1-5)}.audit-chip{display:inline-flex;align-items:center;gap:3px;font-size:var(--font-xs);color:var(--text-dim);background:var(--bg-hover);padding:2px var(--space-2);border-radius:var(--radius-sm)}.audit-chip-icon{font-size:var(--font-sm);opacity:.7}.audit-chip-pid{font-family:monospace;font-weight:var(--weight-semibold);color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,var(--bg-hover))}.audit-chip-nopid{font-style:italic;opacity:.7}.audit-chip-source-dashboard{color:var(--brand-teal);background:color-mix(in srgb,var(--brand-teal) 10%,var(--bg-hover))}.audit-chip-source-disk{color:var(--text-dim)}.audit-chip-model{font-weight:var(--weight-semibold)}.audit-chip-model-sonnet{color:var(--brand-teal)}.audit-chip-model-opus{color:var(--brand-purple)}.audit-chip-model-haiku{color:var(--brand-orange)}.audit-chip-heartbeat-time{color:var(--text-dim)}.audit-chip-heartbeat-warning{color:var(--orange);background:color-mix(in srgb,var(--orange) 10%,var(--bg-hover));font-weight:var(--weight-semibold)}.audit-chip-heartbeat-unresponsive{color:var(--red);background:color-mix(in srgb,var(--red) 10%,var(--bg-hover));font-weight:var(--weight-bold)}.audit-chip-heartbeat-unknown{color:var(--text-dim);font-style:italic}.audit-task-actions{display:flex;flex-direction:column;gap:var(--space-2);flex-shrink:0}.audit-btn{padding:var(--space-1-5) var(--space-3);border-radius:var(--radius-md);font-size:var(--font-sm);font-weight:var(--weight-medium);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast);white-space:nowrap}.audit-btn-logs{background:none;border:1px solid var(--border);color:var(--text)}.audit-btn-logs:hover{border-color:var(--accent);background:var(--bg-hover)}.audit-btn-terminate{background:color-mix(in srgb,var(--red) 10%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 30%,var(--border));color:var(--red)}.audit-btn-terminate:hover:not(:disabled){background:color-mix(in srgb,var(--red) 18%,var(--bg-surface));border-color:var(--red)}.audit-btn-terminate:disabled{opacity:.5;cursor:not-allowed}.audit-task-last-output{margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--border);display:flex;align-items:flex-start;gap:var(--space-2)}.audit-last-output-label{font-size:var(--font-xs);color:var(--text-dim);flex-shrink:0;margin-top:1px}.audit-task-last-output code{font-family:monospace;font-size:var(--font-xs);color:var(--text);background:var(--bg-hover);padding:2px var(--space-1-5);border-radius:var(--radius-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.audit-log-viewer{background:color-mix(in srgb,var(--accent) 4%,var(--bg));border:1px solid color-mix(in srgb,var(--accent) 15%,var(--border));border-top:none;border-radius:0 0 var(--radius-xl) var(--radius-xl);padding:var(--space-4)}.audit-log-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}.audit-log-count{font-size:var(--font-sm);color:var(--text-dim);font-weight:var(--weight-medium)}.audit-log-autoscroll{font-size:var(--font-xs);color:var(--text-dim);display:flex;align-items:center;gap:var(--space-1);cursor:pointer}.audit-log-autoscroll input{margin:0}.audit-log-entries{max-height:400px;overflow-y:auto;display:flex;flex-direction:column;gap:var(--space-2)}.audit-log-entry{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-2) var(--space-3)}.audit-log-entry-header{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-1)}.audit-log-turn{font-size:var(--font-xs);color:var(--text-dim);font-weight:var(--weight-semibold)}.audit-log-tool{font-size:var(--font-sm);font-weight:var(--weight-medium);color:var(--accent)}.audit-log-duration{font-size:var(--font-xs);color:var(--text-dim);margin-left:auto;font-variant-numeric:tabular-nums}.audit-log-output{font-family:monospace;font-size:var(--font-xs);color:var(--text);background:var(--bg-hover);border-radius:var(--radius-sm);padding:var(--space-2);margin:0;white-space:pre-wrap;word-break:break-word;line-height:var(--leading-relaxed);max-height:120px;overflow-y:auto}.audit-log-empty{font-size:var(--font-sm);color:var(--text-dim);text-align:center;padding:var(--space-4)}.audit-log-loading{font-size:var(--font-sm);color:var(--text-dim);padding:var(--space-3);text-align:center}.audit-log-error{font-size:var(--font-sm);color:var(--red);padding:var(--space-3)}.audit-log-error-box{margin-top:var(--space-3);padding:var(--space-3);background:color-mix(in srgb,var(--red) 8%,var(--bg-surface));border:1px solid color-mix(in srgb,var(--red) 25%,var(--border));border-radius:var(--radius-lg);font-size:var(--font-sm);color:var(--red)}.audit-log-summary{margin-top:var(--space-3);padding:var(--space-3);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:var(--font-sm)}.audit-log-summary pre{font-family:monospace;font-size:var(--font-xs);white-space:pre-wrap;word-break:break-word;margin:var(--space-1) 0 0 0}.audit-toast{position:fixed;bottom:var(--space-5);left:50%;transform:translate(-50%);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-2) var(--space-4);font-size:var(--font-sm);color:var(--text);box-shadow:0 4px 12px #00000026;z-index:100;animation:audit-toast-in .2s ease-out}@keyframes audit-toast-in{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@media (max-width: 700px){.audit-task-header{flex-direction:column}.audit-task-actions{flex-direction:row;width:100%}.audit-btn{flex:1;text-align:center}.audit-system-grid{grid-template-columns:repeat(2,1fr)}}.rex-task-link{display:inline-flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1) var(--space-2);border-radius:6px;cursor:pointer;font-size:var(--font-base);font-weight:var(--weight-medium);color:var(--text);background:transparent;transition:background .15s,color .15s;text-decoration:none;max-width:100%;line-height:1.3}.rex-task-link:hover{background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent)}.rex-task-link:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-radius:6px}.rex-task-link:active{background:color-mix(in srgb,var(--accent) 16%,transparent)}.rex-task-link-compact{padding:2px var(--space-1-5);font-size:var(--font-base);gap:var(--space-1)}.rex-task-link-status{flex-shrink:0;font-size:var(--font-sm);width:14px;text-align:center}.rex-task-link-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rex-task-link-arrow{flex-shrink:0;font-size:var(--font-sm);color:var(--text-dim);opacity:0;transform:translate(-4px);transition:opacity .15s,transform .15s}.rex-task-link:hover .rex-task-link-arrow{opacity:1;transform:translate(0)}.rex-context-menu{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000040;min-width:180px;max-width:280px;padding:var(--space-1) 0;overflow:hidden;animation:rex-context-in .12s ease}@keyframes rex-context-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.rex-context-menu-header{padding:var(--space-2) var(--space-3) var(--space-1)}.rex-context-menu-title{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rex-context-menu-divider{height:1px;background:var(--border);margin:var(--space-1) 0}.rex-context-menu-section-label{padding:var(--space-1) var(--space-3) 2px;font-size:var(--font-sm);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.5px;color:var(--text-dim)}.rex-context-menu-item{display:flex;align-items:center;gap:var(--space-2);width:100%;padding:var(--space-1-5) var(--space-3);border:none;background:none;color:var(--text);font-size:var(--font-base);cursor:pointer;text-align:left;transition:background .1s}.rex-context-menu-item:hover{background:var(--bg-hover)}.rex-context-menu-status-icon{font-size:var(--font-sm);width:14px;text-align:center;flex-shrink:0}.rex-context-menu-feedback{display:flex;align-items:center;gap:var(--space-2);padding:10px 14px;font-size:var(--font-base);font-weight:var(--weight-medium);color:var(--green, #22c55e);animation:rex-context-feedback-in .15s ease}.rex-context-menu-feedback-error{color:var(--red, #ef4444)}.rex-context-menu-feedback-icon{font-size:var(--font-md);flex-shrink:0}@keyframes rex-context-feedback-in{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.copy-link-btn{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border:1px solid var(--border);border-radius:4px;background:var(--bg-surface);color:var(--text-dim);font-size:11px;font-weight:500;cursor:pointer;transition:border-color .15s,color .15s,background .15s;white-space:nowrap;line-height:1.3}.copy-link-btn:hover{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg-surface))}.copy-link-btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.copy-link-btn:active{background:color-mix(in srgb,var(--accent) 12%,var(--bg-surface))}.copy-link-btn-copied{border-color:var(--green);color:var(--green);background:color-mix(in srgb,var(--green) 8%,var(--bg-surface))}.copy-link-btn-copied:hover{border-color:var(--green);color:var(--green)}.copy-link-icon{font-size:11px;flex-shrink:0}.copy-link-label{font-size:11px}.copy-link-btn-compact{padding:2px 6px;font-size:10px;gap:3px}.copy-link-btn-compact .copy-link-icon,.copy-link-btn-compact .copy-link-label{font-size:10px}.hench-detail-header-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:4px}.faq-overlay{position:fixed;inset:0;background:#0c0e1acc;z-index:1000;display:flex;align-items:center;justify-content:center}[data-theme=light] .faq-overlay{background:#0006}.faq-modal{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);width:560px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}.faq-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}.faq-header h2{font-size:var(--font-lg);font-weight:var(--weight-semibold)}.faq-close{background:none;border:none;color:var(--text-dim);font-size:18px;cursor:pointer;padding:4px;display:flex;align-items:center;justify-content:center}.faq-close:hover{color:var(--text)}.faq-body{flex:1;overflow-y:auto;padding:12px 20px}.faq-section{margin-bottom:4px}.faq-section-header{display:flex;align-items:center;gap:var(--space-2);padding:10px 8px;cursor:pointer;user-select:none;border-radius:var(--radius-md);font-size:var(--font-md);font-weight:var(--weight-semibold);color:var(--text);transition:background var(--transition-normal)}.faq-section-header:hover{background:var(--bg-hover)}.faq-section-chevron{font-size:var(--font-xs);color:var(--text-dim);transition:transform .2s ease;flex-shrink:0}.faq-section-chevron-open{transform:rotate(90deg)}.faq-section-items{padding:0 8px 8px}.faq-item{padding:10px 12px;border-radius:var(--radius-md);margin-bottom:4px;background:var(--bg-hover)}.faq-question{font-size:var(--font-base);font-weight:var(--weight-semibold);color:var(--text);margin-bottom:6px}.faq-answer{font-size:var(--font-base);line-height:var(--leading-relaxed);color:var(--text-dim)}.faq-doc-link{display:inline-block;margin-top:6px;font-size:var(--font-sm);color:var(--accent);text-decoration:none;transition:opacity var(--transition-normal)}.faq-doc-link:hover{opacity:.8;text-decoration:underline}.faq-footer{padding:12px 20px;border-top:1px solid var(--border);flex-shrink:0}.faq-footer p{font-size:var(--font-sm);color:var(--text-muted)}.faq-footer code{font-family:monospace;font-size:var(--font-sm);background:var(--bg-hover);padding:1px 5px;border-radius:var(--radius-sm);color:var(--accent)}.cg-diagram-container{position:relative;margin:16px 0;border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--bg-surface);overflow:hidden}.cg-diagram{display:block;width:100%;height:calc(100vh - 340px);min-height:400px;cursor:grab;user-select:none}.cg-diagram.dragging{cursor:grabbing}.cg-zone-rect{fill:var(--bg-surface);stroke:var(--border);stroke-width:1.5;transition:stroke .15s ease,fill .15s ease}.cg-zone-box:hover .cg-zone-rect{stroke:var(--zone-color, var(--border-strong));stroke-width:2;fill:color-mix(in srgb,var(--zone-color, var(--accent)) 5%,var(--bg-surface))}.cg-zone-box:active{cursor:grabbing}.cg-zone-box.expanded .cg-zone-rect{stroke:var(--zone-color, var(--border-strong));stroke-width:2}.cg-zone-box.selected .cg-zone-rect{stroke:var(--zone-color, var(--accent));stroke-width:2.5;filter:drop-shadow(0 0 6px color-mix(in srgb,var(--zone-color, var(--accent)) 40%,transparent))}.cg-zone-name{font-family:var(--font-mono, monospace);font-size:13px;font-weight:600;fill:var(--text);pointer-events:none}.cg-zone-stats{font-size:10px;fill:var(--text-dim);pointer-events:none}.cg-zone-expand-icon{font-size:10px;fill:var(--text-muted);pointer-events:none}.cg-zone-detail-btn{cursor:pointer}.cg-detail-btn-bg{fill:var(--bg-hover, rgba(128, 128, 128, .1));stroke:var(--accent, #4a9eff);stroke-width:1.5;transition:fill .15s ease,stroke .15s ease,stroke-width .15s ease}.cg-zone-detail-btn:hover .cg-detail-btn-bg{fill:var(--accent-bg, rgba(74, 158, 255, .15));stroke:var(--accent, #4a9eff);stroke-width:2}.cg-detail-btn-text{font-size:14px;fill:var(--accent, #4a9eff);pointer-events:none;transition:fill .15s ease}.cg-zone-detail-btn:hover .cg-detail-btn-text{fill:var(--accent-strong, #2b7de9)}.cg-zone-drill-btn{cursor:pointer}.cg-drill-btn-bg{fill:var(--bg-hover);stroke:var(--zone-color, var(--border-strong));stroke-width:1.5;transition:fill .15s ease,stroke .15s ease}.cg-zone-drill-btn:hover .cg-drill-btn-bg{fill:color-mix(in srgb,var(--zone-color, var(--accent)) 15%,var(--bg-hover));stroke:var(--zone-color, var(--accent));stroke-width:2}.cg-drill-btn-icon{color:var(--zone-color, var(--text-dim));transition:color .15s ease}.cg-zone-drill-btn:hover .cg-drill-btn-icon{color:var(--zone-color, var(--accent))}.cg-drill-btn-label{font-family:var(--font-mono, monospace);font-size:9px;font-weight:600;fill:var(--zone-color, var(--accent));pointer-events:none;transition:fill .15s ease}.cg-zone-drill-btn:hover .cg-drill-btn-label{fill:var(--text)}.cg-zone-divider{stroke:var(--border);stroke-width:.5;stroke-dasharray:3 2}.cg-zone-box.search-dim{opacity:.35;transition:opacity .2s ease}.cg-zone-box.search-dim:hover{opacity:.6}.cg-file-bg{fill:transparent;transition:fill .1s ease;cursor:pointer}.cg-file-row:hover .cg-file-bg{fill:var(--bg-hover)}.cg-file-row.search-match .cg-file-bg{fill:color-mix(in srgb,var(--accent) 12%,transparent)}.cg-file-name{font-family:var(--font-mono, monospace);font-size:10px;fill:var(--text);pointer-events:none}.cg-file-stats{font-size:9px;fill:var(--text-muted);pointer-events:none}.cg-file-overflow{font-size:9px;fill:var(--text-muted);font-style:italic;pointer-events:none}.cg-file-xzone-bar{fill:var(--zone-color, var(--accent))}.cg-file-row.cross-zone .cg-file-name{fill:var(--text);font-weight:500}.cg-subzone-bg{fill:transparent;cursor:pointer;transition:fill .1s ease}.cg-subzone-row:hover .cg-subzone-bg{fill:var(--bg-hover)}.cg-subzone-row.expanded .cg-subzone-bg{fill:color-mix(in srgb,var(--zone-color, var(--accent)) 8%,transparent)}.cg-subzone-name{font-family:var(--font-mono, monospace);font-size:11px;font-weight:600;fill:var(--text);pointer-events:none}.cg-subzone-stats,.cg-subzone-expand-icon{font-size:9px;fill:var(--text-muted);pointer-events:none}.cg-subzone-edge{stroke-linecap:round;pointer-events:none;opacity:.4;stroke-dasharray:4 3}.cg-file-edge{stroke-linecap:round;pointer-events:none;transition:opacity .15s ease}.cg-edge{stroke:var(--border-strong);transition:stroke .15s ease,stroke-width .15s ease}.cg-edge.heavy{stroke:var(--orange)}.cg-edge.hovered{stroke:var(--accent)}.cg-arrow-marker{fill:var(--border-strong)}.cg-edge-label{font-size:9px;fill:var(--text-muted);opacity:0;transition:opacity .15s ease;pointer-events:none}.cg-edge-label.visible{opacity:1;fill:var(--text)}.cg-zoom-controls{position:absolute;bottom:12px;left:12px;display:flex;gap:4px;z-index:10}.cg-zoom-btn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text);font-size:14px;cursor:pointer;transition:background .1s ease,border-color .1s ease;padding:0;line-height:1}.cg-zoom-btn:hover{background:var(--bg-hover);border-color:var(--border-strong)}.cg-zoom-btn:active{background:var(--bg-active)}.breadcrumb{display:flex;align-items:center;min-width:0}.breadcrumb-list{display:flex;align-items:center;gap:0;list-style:none;margin:0;padding:0;min-width:0}.breadcrumb-item{display:flex;align-items:center;gap:0;min-width:0;font-size:var(--font-base);color:var(--text-dim);white-space:nowrap}.breadcrumb-sep{flex-shrink:0;color:var(--text-muted);margin:0 6px}.breadcrumb-project{font-weight:var(--weight-semibold);color:var(--text);overflow:hidden;text-overflow:ellipsis;max-width:200px}.breadcrumb-branch{display:inline-flex;align-items:center;gap:3px;margin-left:6px;padding:1px 7px;border-radius:var(--radius-sm);background:var(--bg-hover);color:var(--text-muted);font-size:var(--font-sm);font-family:monospace;line-height:1.4;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.breadcrumb-branch-icon{flex-shrink:0;opacity:.7}.breadcrumb-link{background:none;border:none;padding:0;margin:0;cursor:pointer;font-size:var(--font-base);font-weight:var(--weight-medium);color:var(--text-dim);transition:color var(--transition-normal);font-family:inherit}.breadcrumb-link:hover{color:var(--text)}.breadcrumb-product-sourcevision:hover{color:var(--brand-teal)}.breadcrumb-product-rex:hover{color:var(--brand-purple)}.breadcrumb-product-hench:hover{color:var(--brand-orange)}.breadcrumb-current{color:var(--text);font-weight:var(--weight-medium)}.zone-breadcrumb{display:flex;align-items:center;padding:var(--space-2) var(--space-3);margin:var(--space-2) 0 var(--space-3);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);min-width:0}.zone-breadcrumb-list{display:flex;align-items:center;gap:0;list-style:none;margin:0;padding:0;min-width:0}.zone-breadcrumb-item{display:flex;align-items:center;gap:0;min-width:0;font-size:var(--font-base);color:var(--text-dim);white-space:nowrap}.zone-breadcrumb-sep{flex-shrink:0;color:var(--text-muted);margin:0 var(--space-1)}.zone-breadcrumb-link{background:none;border:none;padding:2px var(--space-1);margin:0;cursor:pointer;font-size:var(--font-base);font-weight:var(--weight-medium);color:var(--text-dim);border-radius:var(--radius-sm);transition:color var(--transition-normal),background var(--transition-normal);font-family:inherit}.zone-breadcrumb-link:hover{color:var(--accent);background:var(--bg-hover)}.zone-breadcrumb-current{color:var(--text);font-weight:var(--weight-semibold)}.notion-config-container{max-width:900px}.notion-config-header{margin-bottom:var(--space-4)}.notion-config-subtitle{font-size:var(--font-md);color:var(--text-dim);margin:4px 0 0}.notion-config-section{margin-bottom:var(--space-6)}.notion-config-section-title{display:flex;align-items:center;gap:8px;font-size:var(--font-lg);font-weight:var(--weight-semibold);margin:0 0 var(--space-3)}.notion-config-section-icon{font-size:18px;flex-shrink:0}.notion-status{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg)}.notion-status-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.notion-status-dot-green{background:var(--green)}.notion-status-dot-yellow{background:var(--orange)}.notion-status-dot-red{background:var(--red)}.notion-status-dot-unknown{background:var(--text-muted)}.notion-status-dot-testing{background:var(--accent);animation:pulse 1.2s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.notion-status-info{display:flex;flex-direction:column;gap:2px}.notion-status-text{font-size:var(--font-base)}.notion-status-detail{font-size:var(--font-sm);color:var(--text-dim)}.notion-env-hint{display:flex;gap:10px;padding:10px 14px;background:color-mix(in srgb,var(--accent) 6%,transparent);border:1px solid color-mix(in srgb,var(--accent) 20%,transparent);border-radius:var(--radius-lg);margin-top:var(--space-2)}.notion-env-hint-icon{font-size:16px;flex-shrink:0}.notion-env-hint-title{font-size:var(--font-base);font-weight:var(--weight-semibold);margin:0 0 4px}.notion-env-hint-desc{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 6px}.notion-env-hint-code{font-size:var(--font-sm);background:var(--bg-surface);border:1px solid var(--border);padding:3px 8px;border-radius:var(--radius-sm);color:var(--accent);display:inline-block}.notion-config-error-state{text-align:center;padding:40px 20px;color:var(--text-dim)}.notion-config-error-hint{font-size:var(--font-base);margin-top:8px}.notion-config-error-hint code{background:var(--bg-surface);border:1px solid var(--border);padding:2px 6px;border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--accent)}.notion-config-error-banner{background:color-mix(in srgb,var(--red) 12%,transparent);border:1px solid color-mix(in srgb,var(--red) 40%,transparent);color:var(--red);padding:10px 16px;border-radius:var(--radius-lg);font-size:var(--font-base);margin-bottom:var(--space-4)}.notion-config-toast{position:fixed;bottom:20px;right:20px;background:var(--green);color:var(--bg);padding:10px 18px;border-radius:var(--radius-lg);font-size:var(--font-base);font-weight:var(--weight-semibold);display:flex;align-items:center;gap:8px;box-shadow:0 4px 12px #0003;animation:toast-in .2s ease-out;z-index:1000}.notion-config-toast-icon{font-size:16px}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.notion-config-field{margin-bottom:var(--space-4)}.notion-config-field-error .notion-config-input{border-color:var(--red)}.notion-config-label{display:flex;align-items:center;gap:8px;font-size:var(--font-base);font-weight:var(--weight-semibold);margin-bottom:4px}.notion-config-badge{font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--green);background:color-mix(in srgb,var(--green) 12%,transparent);padding:1px 6px;border-radius:3px}.notion-config-field-desc{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 8px}.notion-config-field-desc a{color:var(--accent)}.notion-config-field-desc code{background:var(--bg-surface);border:1px solid var(--border);padding:1px 4px;border-radius:3px;font-size:var(--font-sm)}.notion-config-input-row{display:flex;gap:6px;align-items:center}.notion-config-input{width:100%;padding:8px 12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:var(--font-base);font-family:monospace;outline:none;box-sizing:border-box;transition:border-color var(--transition-normal)}.notion-config-input:focus{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.notion-config-toggle-visibility{background:none;border:1px solid var(--border);color:var(--text-dim);padding:6px 10px;border-radius:var(--radius-md);cursor:pointer;font-size:16px;transition:border-color var(--transition-normal)}.notion-config-toggle-visibility:hover{border-color:var(--text-dim)}.notion-config-field-error-text{font-size:var(--font-sm);color:var(--red);margin-top:4px}.notion-config-actions{display:flex;flex-direction:column;gap:var(--space-3);margin-bottom:var(--space-6)}.notion-config-actions-primary{display:flex;gap:8px}.notion-config-save-btn{background:var(--accent);border:none;color:var(--bg);padding:8px 20px;border-radius:var(--radius-md);font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:opacity var(--transition-normal)}.notion-config-save-btn:hover:not(:disabled){opacity:.9}.notion-config-save-btn:disabled{opacity:.5;cursor:not-allowed}.notion-config-test-btn{background:none;border:1px solid var(--border);color:var(--text);padding:8px 20px;border-radius:var(--radius-md);font-size:var(--font-base);cursor:pointer;transition:border-color var(--transition-normal),color var(--transition-normal)}.notion-config-test-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.notion-config-test-btn:disabled{opacity:.5;cursor:not-allowed}.notion-config-actions-danger{display:flex;align-items:center;gap:8px}.notion-config-remove-btn{background:none;border:1px solid color-mix(in srgb,var(--red) 40%,transparent);color:var(--red);padding:6px 14px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;transition:background var(--transition-normal)}.notion-config-remove-btn:hover{background:color-mix(in srgb,var(--red) 10%,transparent)}.notion-config-confirm-text{font-size:var(--font-sm);color:var(--red)}.notion-config-confirm-yes{background:var(--red);border:none;color:#fff;padding:4px 12px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer}.notion-config-confirm-yes:disabled{opacity:.5;cursor:not-allowed}.notion-config-confirm-no{background:none;border:1px solid var(--border);color:var(--text-dim);padding:4px 12px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer}.notion-config-help{border-top:1px solid var(--border);padding-top:var(--space-5)}.notion-config-steps{font-size:var(--font-base);color:var(--text-dim);padding-left:24px;line-height:var(--leading-relaxed)}.notion-config-steps li{margin-bottom:8px}.notion-config-steps a{color:var(--accent)}.notion-config-security-note{display:flex;gap:10px;padding:12px 14px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:var(--font-sm);color:var(--text-dim);margin-top:var(--space-4)}.notion-config-security-icon{font-size:16px;flex-shrink:0}.notion-config-security-note code{background:var(--bg-hover);border:1px solid var(--border);padding:1px 4px;border-radius:3px;font-size:var(--font-xs);color:var(--accent)}.schema-wizard-desc{font-size:var(--font-base);color:var(--text-dim);margin:0 0 var(--space-3)}.schema-wizard-actions{display:flex;align-items:center;gap:10px;margin-bottom:var(--space-3)}.schema-validate-btn{background:none;border:1px solid var(--border);color:var(--text);padding:8px 20px;border-radius:var(--radius-md);font-size:var(--font-base);cursor:pointer;transition:border-color var(--transition-normal),color var(--transition-normal)}.schema-validate-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.schema-validate-btn:disabled{opacity:.5;cursor:not-allowed}.schema-wizard-hint{font-size:var(--font-sm);color:var(--text-muted)}.schema-wizard-error{background:color-mix(in srgb,var(--red) 12%,transparent);border:1px solid color-mix(in srgb,var(--red) 40%,transparent);color:var(--red);padding:10px 14px;border-radius:var(--radius-lg);font-size:var(--font-base);margin-bottom:var(--space-3)}.schema-results{margin-top:var(--space-2)}.schema-db-title{font-size:var(--font-sm);color:var(--text-dim);margin-bottom:var(--space-3)}.schema-db-title-name{font-weight:var(--weight-semibold);color:var(--text)}.schema-summary{padding:12px 16px;border-radius:var(--radius-lg);margin-bottom:var(--space-4);display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.schema-summary-valid{background:color-mix(in srgb,var(--green) 10%,transparent);border:1px solid color-mix(in srgb,var(--green) 30%,transparent)}.schema-summary-invalid{background:color-mix(in srgb,var(--orange) 10%,transparent);border:1px solid color-mix(in srgb,var(--orange) 30%,transparent)}.schema-summary-status{display:flex;align-items:center;gap:8px;font-size:var(--font-base);font-weight:var(--weight-semibold)}.schema-summary-icon{font-size:16px}.schema-summary-counts{display:flex;gap:10px}.schema-count{font-size:var(--font-sm);padding:2px 8px;border-radius:3px;font-weight:var(--weight-medium)}.schema-count-ok{color:var(--green);background:color-mix(in srgb,var(--green) 10%,transparent)}.schema-count-missing{color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}.schema-count-wrong{color:var(--orange);background:color-mix(in srgb,var(--orange) 10%,transparent)}.schema-prop-list{display:flex;flex-direction:column;gap:2px;margin-bottom:var(--space-4)}.schema-prop-row{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-normal)}.schema-prop-row:hover{border-color:var(--border-strong)}.schema-prop-ok{border-left:3px solid var(--green)}.schema-prop-missing{border-left:3px solid var(--red)}.schema-prop-wrong_type{border-left:3px solid var(--orange)}.schema-prop-check{width:20px;flex-shrink:0;display:flex;align-items:center;justify-content:center;padding-top:2px}.schema-prop-check input[type=checkbox]{cursor:pointer;accent-color:var(--accent)}.schema-prop-icon{font-size:14px;flex-shrink:0;padding-top:1px}.schema-prop-info{flex:1;min-width:0}.schema-prop-name-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.schema-prop-name{font-weight:var(--weight-semibold);font-size:var(--font-base)}.schema-prop-required{font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent);padding:1px 5px;border-radius:3px}.schema-prop-optional{font-size:var(--font-xs);font-weight:var(--weight-medium);color:var(--text-muted);background:var(--bg-hover);padding:1px 5px;border-radius:3px}.schema-prop-type{font-size:var(--font-xs);font-family:monospace;color:var(--text-dim);background:var(--bg-hover);padding:1px 5px;border-radius:3px}.schema-prop-error{font-size:var(--font-sm);color:var(--orange);margin-top:4px}.schema-prop-guidance{font-size:var(--font-sm);color:var(--text-dim);margin-top:4px;line-height:var(--leading-normal)}.schema-fix-actions{padding:14px 16px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);margin-bottom:var(--space-4)}.schema-fix-desc{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 10px}.schema-fix-btn{background:var(--accent);border:none;color:var(--bg);padding:8px 20px;border-radius:var(--radius-md);font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:opacity var(--transition-normal)}.schema-fix-btn:hover:not(:disabled){opacity:.9}.schema-fix-btn:disabled{opacity:.5;cursor:not-allowed}.schema-fix-result{padding:10px 14px;border-radius:var(--radius-lg);font-size:var(--font-base);margin-bottom:var(--space-3)}.schema-fix-success{background:color-mix(in srgb,var(--green) 12%,transparent);border:1px solid color-mix(in srgb,var(--green) 30%,transparent);color:var(--green)}.schema-fix-partial{background:color-mix(in srgb,var(--orange) 12%,transparent);border:1px solid color-mix(in srgb,var(--orange) 30%,transparent);color:var(--orange)}.schema-fix-failures{margin-top:6px;font-size:var(--font-sm);color:var(--red)}.schema-manual-hint{display:flex;gap:10px;padding:12px 14px;background:color-mix(in srgb,var(--orange) 8%,transparent);border:1px solid color-mix(in srgb,var(--orange) 25%,transparent);border-radius:var(--radius-lg);font-size:var(--font-sm);color:var(--text-dim)}.schema-manual-hint-icon{font-size:16px;flex-shrink:0}.schema-manual-hint strong{color:var(--text);display:block;margin-bottom:4px}.schema-manual-hint p{margin:0;line-height:var(--leading-normal)}@media (max-width: 700px){.notion-config-actions-primary{flex-direction:column}.schema-summary{flex-direction:column;align-items:flex-start}.schema-prop-name-row{flex-direction:column;align-items:flex-start;gap:4px}}.intg-container{max-width:900px}.intg-header{margin-bottom:var(--space-4)}.intg-subtitle{font-size:var(--font-md);color:var(--text-dim);margin:4px 0 0}.intg-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;margin-bottom:var(--space-3);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-dim);font-size:var(--font-sm);cursor:pointer;transition:all .15s}.intg-back-btn:hover{color:var(--text);border-color:var(--accent)}.intg-list{display:flex;flex-direction:column;gap:var(--space-2)}.intg-card{display:flex;align-items:center;gap:14px;padding:16px 18px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);cursor:pointer;transition:all .15s}.intg-card:hover{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 4%,var(--bg-surface))}.intg-card:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.intg-card-configured{border-color:color-mix(in srgb,var(--green) 30%,var(--border))}.intg-card-icon{font-size:28px;flex-shrink:0;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--accent) 8%,transparent);border-radius:var(--radius-md)}.intg-card-content{flex:1;min-width:0}.intg-card-header{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.intg-card-name{font-size:var(--font-md);font-weight:var(--weight-semibold);margin:0}.intg-card-badge{font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;background:color-mix(in srgb,var(--green) 15%,transparent);color:var(--green)}.intg-card-builtin{font-size:11px;font-weight:500;padding:2px 8px;border-radius:999px;background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent)}.intg-card-desc{font-size:var(--font-sm);color:var(--text-dim);margin:4px 0 0}.intg-card-meta{display:flex;gap:8px;font-size:11px;color:var(--text-muted);margin-top:6px}.intg-card-arrow{font-size:24px;color:var(--text-muted);flex-shrink:0}.intg-empty{text-align:center;padding:var(--space-6);color:var(--text-dim)}.intg-empty-hint{font-size:var(--font-sm);color:var(--text-muted)}.intg-section{margin-bottom:var(--space-6)}.intg-section-title{display:flex;align-items:center;gap:8px;font-size:var(--font-lg);font-weight:var(--weight-semibold);margin:0 0 var(--space-3)}.intg-section-icon{font-size:18px;flex-shrink:0}.intg-section-desc{font-size:var(--font-sm);color:var(--text-dim);margin:-8px 0 var(--space-3)}.intg-field{margin-bottom:var(--space-4)}.intg-field-label{display:flex;align-items:center;gap:6px;font-size:var(--font-base);font-weight:var(--weight-medium);margin-bottom:4px}.intg-field-required{color:var(--red);font-size:var(--font-sm)}.intg-field-badge{font-size:10px;font-weight:500;padding:1px 6px;border-radius:999px;background:color-mix(in srgb,var(--green) 15%,transparent);color:var(--green)}.intg-field-help{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 6px;line-height:1.5}.intg-field-doc-link{color:var(--accent);text-decoration:none}.intg-field-doc-link:hover{text-decoration:underline}.intg-input{width:100%;padding:9px 12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:var(--font-base);font-family:inherit;outline:none;transition:border-color .15s;box-sizing:border-box}.intg-input:focus-visible{border-color:var(--accent);outline:2px solid var(--accent);outline-offset:-1px}.intg-input::placeholder{color:var(--text-muted)}.intg-select{cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none' stroke='%23666' stroke-width='1.5'%3E%3Cpath d='M3 4.5l3 3 3-3'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;padding-right:32px}.intg-textarea{resize:vertical;min-height:80px;font-family:var(--font-mono, monospace);font-size:var(--font-sm)}.intg-input-row{display:flex;gap:0}.intg-input-row .intg-input{border-right:none;border-radius:var(--radius-md) 0 0 var(--radius-md)}.intg-toggle-vis{padding:9px 12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:0 var(--radius-md) var(--radius-md) 0;color:var(--text-dim);cursor:pointer;font-size:14px;flex-shrink:0}.intg-toggle-vis:hover{color:var(--text)}.intg-checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:var(--font-base)}.intg-checkbox-wrapper input[type=checkbox]{width:18px;height:18px;accent-color:var(--accent);cursor:pointer}.intg-checkbox-label{color:var(--text)}.intg-field-error .intg-input,.intg-field-error .intg-select{border-color:var(--red)}.intg-field-error-text{font-size:var(--font-sm);color:var(--red);margin-top:4px}.intg-actions{display:flex;flex-direction:column;gap:var(--space-3);margin-bottom:var(--space-6)}.intg-actions-primary{display:flex;gap:8px}.intg-save-btn{padding:10px 24px;background:var(--accent);color:var(--bg);border:none;border-radius:var(--radius-md);font-size:var(--font-base);font-weight:var(--weight-semibold);cursor:pointer;transition:all .15s}.intg-save-btn:hover:not(:disabled){filter:brightness(1.1)}.intg-save-btn:disabled{opacity:.5;cursor:not-allowed}.intg-actions-danger{display:flex;align-items:center;gap:8px}.intg-remove-btn{padding:8px 16px;background:transparent;color:var(--red);border:1px solid color-mix(in srgb,var(--red) 30%,transparent);border-radius:var(--radius-md);font-size:var(--font-sm);cursor:pointer;transition:all .15s}.intg-remove-btn:hover{background:color-mix(in srgb,var(--red) 8%,transparent);border-color:var(--red)}.intg-confirm-text{font-size:var(--font-sm);color:var(--text-dim)}.intg-confirm-yes{padding:6px 14px;background:var(--red);color:#fff;border:none;border-radius:var(--radius-md);font-size:var(--font-sm);cursor:pointer}.intg-confirm-yes:disabled{opacity:.5}.intg-confirm-no{padding:6px 14px;background:var(--bg-surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-md);font-size:var(--font-sm);cursor:pointer}.intg-error-banner{padding:10px 14px;background:color-mix(in srgb,var(--red) 8%,transparent);border:1px solid color-mix(in srgb,var(--red) 25%,transparent);border-radius:var(--radius-md);color:var(--red);font-size:var(--font-sm);margin-bottom:var(--space-3)}.intg-toast{display:flex;align-items:center;gap:8px;padding:10px 14px;background:color-mix(in srgb,var(--green) 10%,transparent);border:1px solid color-mix(in srgb,var(--green) 25%,transparent);border-radius:var(--radius-md);color:var(--green);font-size:var(--font-sm);margin-bottom:var(--space-3);animation:intg-fadeIn .2s ease-out}.intg-toast-icon{font-size:16px}@keyframes intg-fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.intg-env-hint{display:flex;gap:10px;padding:10px 14px;background:color-mix(in srgb,var(--accent) 6%,transparent);border:1px solid color-mix(in srgb,var(--accent) 20%,transparent);border-radius:var(--radius-lg)}.intg-env-hint-icon{font-size:16px;flex-shrink:0}.intg-env-hint-content{flex:1}.intg-env-hint-title{font-weight:var(--weight-semibold);font-size:var(--font-base);margin:0 0 4px}.intg-env-hint-desc{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 8px}.intg-env-hint-code{display:block;padding:6px 10px;background:var(--bg-deep);border:1px solid var(--border);border-radius:var(--radius-md);font-family:var(--font-mono, monospace);font-size:var(--font-sm);color:var(--accent);margin-bottom:4px;word-break:break-all}.intg-help{border-top:1px solid var(--border);padding-top:var(--space-4)}.intg-steps{padding-left:20px;margin:0}.intg-steps li{font-size:var(--font-base);color:var(--text);line-height:1.7;margin-bottom:4px}.intg-steps li a{color:var(--accent);text-decoration:none}.intg-steps li a:hover{text-decoration:underline}.intg-docs-link{margin-top:var(--space-3);font-size:var(--font-sm)}.intg-docs-link a{color:var(--accent);text-decoration:none}.intg-docs-link a:hover{text-decoration:underline}.ft-container{max-width:900px}.ft-header{margin-bottom:var(--space-5)}.ft-header-brand{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.ft-header-logo{flex-shrink:0}.ft-header-title{font-size:var(--font-xl);font-weight:var(--weight-semibold)}.ft-header-subtitle{font-size:var(--font-base);color:var(--text-dim);margin:0;line-height:var(--leading-relaxed)}.ft-error-state{text-align:center;padding:40px 20px;color:var(--text-dim)}.ft-error-hint{font-size:var(--font-base);margin-top:var(--space-2)}.ft-error-hint code{background:var(--bg-surface);border:1px solid var(--border);padding:2px 6px;border-radius:var(--radius-sm);font-size:var(--font-sm);color:var(--accent)}.ft-error-banner{background:color-mix(in srgb,var(--red) 12%,transparent);border:1px solid color-mix(in srgb,var(--red) 40%,transparent);color:var(--red);padding:10px 16px;border-radius:var(--radius-lg);font-size:var(--font-base);margin-bottom:var(--space-4)}.ft-stats{display:flex;gap:var(--space-4);padding:var(--space-3) var(--space-4);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);margin-bottom:var(--space-5);flex-wrap:wrap}.ft-stat{display:flex;align-items:baseline;gap:var(--space-1)}.ft-stat-value{font-size:var(--font-lg);font-weight:var(--weight-semibold);color:var(--accent)}.ft-stat-label{font-size:var(--font-sm);color:var(--text-dim)}.ft-package-section{margin-bottom:var(--space-6)}.ft-package-header{display:flex;align-items:flex-start;gap:10px;margin-bottom:var(--space-3);padding-bottom:10px;border-bottom:1px solid var(--border)}.ft-package-icon{font-size:var(--font-xl);flex-shrink:0;line-height:1.3}.ft-package-title{font-size:15px;font-weight:var(--weight-semibold);margin:0}.ft-package-desc{font-size:var(--font-sm);color:var(--text-dim);margin:2px 0 0}.ft-toggle-list{display:flex;flex-direction:column;gap:6px}.ft-toggle-item{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-3) var(--space-4);transition:border-color var(--transition-normal)}.ft-toggle-item:hover{border-color:var(--border-strong)}.ft-toggle-item.ft-toggle-modified{border-left:3px solid var(--brand-teal)}.ft-toggle-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-3);margin-bottom:var(--space-1)}.ft-toggle-title-row{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}.ft-toggle-label{font-weight:var(--weight-semibold);font-size:var(--font-base)}.ft-toggle-switch{display:inline-flex;align-items:center;gap:10px;cursor:pointer;user-select:none;flex-shrink:0}.ft-toggle-switch input[type=checkbox]{position:absolute;opacity:0;width:0;height:0}.ft-toggle-slider{position:relative;display:inline-block;width:36px;height:20px;background:var(--bg-hover);border:1px solid var(--border);border-radius:10px;transition:background .2s,border-color .2s;flex-shrink:0}.ft-toggle-slider:after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;background:var(--text-dim);border-radius:50%;transition:transform .2s,background .2s}.ft-toggle-switch input:checked+.ft-toggle-slider{background:color-mix(in srgb,var(--accent) 25%,transparent);border-color:var(--accent)}.ft-toggle-switch input:checked+.ft-toggle-slider:after{transform:translate(16px);background:var(--accent)}.ft-toggle-switch input:disabled+.ft-toggle-slider{opacity:.5;cursor:not-allowed}.ft-toggle-status{font-size:var(--font-sm);color:var(--text-dim);min-width:55px}.ft-toggle-desc{font-size:var(--font-sm);color:var(--text-dim);margin:0 0 var(--space-2);line-height:var(--leading-relaxed)}.ft-toggle-impact{display:flex;align-items:flex-start;gap:var(--space-1);font-size:var(--font-xs);color:var(--text-muted);padding:var(--space-1) var(--space-2);background:color-mix(in srgb,var(--orange) 6%,transparent);border-radius:var(--radius-sm);line-height:var(--leading-relaxed)}.ft-toggle-impact-icon{font-size:var(--font-xs);flex-shrink:0;line-height:var(--leading-relaxed)}.ft-badge{font-size:var(--font-xs);font-weight:var(--weight-medium);padding:1px 6px;border-radius:3px;white-space:nowrap}.ft-badge-stable{color:var(--green);background:color-mix(in srgb,var(--green) 12%,transparent)}.ft-badge-experimental{color:var(--orange);background:color-mix(in srgb,var(--orange) 12%,transparent)}.ft-badge-deprecated{color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent)}.ft-badge-modified{color:var(--brand-teal);background:color-mix(in srgb,var(--brand-teal) 12%,transparent)}.ft-legend{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-3) var(--space-4);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);font-size:var(--font-sm);color:var(--text-dim)}.ft-legend-title{font-weight:var(--weight-semibold);color:var(--text);margin-right:var(--space-1)}.ft-legend-sep{color:var(--text-muted);font-size:var(--font-xs)}.ft-toast{position:fixed;bottom:20px;right:20px;background:var(--green);color:var(--bg);padding:10px 18px;border-radius:var(--radius-lg);font-size:var(--font-base);font-weight:var(--weight-semibold);display:flex;align-items:center;gap:var(--space-2);box-shadow:0 4px 12px #0003;animation:ft-toast-in .2s ease-out;z-index:1000}.ft-toast-icon{font-size:var(--font-lg)}@keyframes ft-toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media (max-width: 700px){.ft-stats,.ft-toggle-header{flex-direction:column;gap:var(--space-2)}.ft-legend{flex-direction:column;align-items:flex-start;gap:var(--space-1)}}.pr-markdown-container{display:flex;flex-direction:column;gap:12px}.pr-markdown-empty,.pr-markdown-success,.pr-markdown-warning{display:flex;flex-direction:column;gap:10px}.pr-markdown-warning{border-left:3px solid var(--orange)}.pr-markdown-warning-meta{font-family:var(--mono);font-size:12px}.pr-markdown-mode-toggle{display:inline-flex;gap:2px;width:fit-content;background:var(--bg);border-radius:6px;padding:2px}.pr-markdown-panel{display:flex;flex-direction:column;gap:8px;min-width:0}.pr-markdown-raw-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.pr-markdown-preview{margin:0;padding:12px;border-radius:10px;background:var(--panel2);border:1px solid var(--line);max-height:60vh;overflow:auto;line-height:1.55}.pr-markdown-preview-heading,.pr-markdown-preview-paragraph{margin:0 0 8px}.pr-markdown-preview-list{margin:0 0 8px;padding-left:20px}.pr-markdown-preview-code{margin:0 0 8px;padding:10px;border-radius:8px;border:1px solid var(--line);background:color-mix(in oklab,var(--panel2) 80%,black 20%);font-family:var(--mono);font-size:12px;line-height:1.5;overflow-x:auto}.pr-markdown-raw{margin:0;padding:12px;border-radius:10px;background:var(--panel2);border:1px solid var(--line);white-space:pre-wrap;word-break:break-word;font-family:var(--mono);font-size:12px;line-height:1.5;max-height:60vh;overflow:auto}.pr-markdown-copy-feedback{min-height:1.25em}.memory-warning-banner{position:fixed;top:0;left:0;right:0;z-index:1000;padding:.5rem 1rem;font-size:.85rem;line-height:1.4;animation:memory-warning-slide-in .3s ease-out}.memory-warning-level-warning{background:var(--color-warning-bg, #3a2d00);border-bottom:2px solid var(--color-warning, #f0ad4e);color:var(--color-warning-text, #ffc107)}.memory-warning-level-critical{background:var(--color-error-bg, #3a0000);border-bottom:2px solid var(--color-error, #dc3545);color:var(--color-error-text, #ff6b6b)}[data-theme=light] .memory-warning-level-warning{background:#fff3cd;border-bottom-color:#ffc107;color:#664d03}[data-theme=light] .memory-warning-level-critical{background:#f8d7da;border-bottom-color:#dc3545;color:#842029}.memory-warning-content{display:flex;align-items:flex-start;gap:.5rem;max-width:1200px;margin:0 auto}.memory-warning-icon{flex-shrink:0;font-size:1rem}.memory-warning-text{flex:1;min-width:0}.memory-warning-text strong{font-weight:600}.memory-warning-detail{opacity:.85;font-size:.8rem}.memory-warning-advice{margin:.25rem 0 0;font-size:.8rem;opacity:.9}.memory-warning-dismiss{flex-shrink:0;background:none;border:none;color:inherit;cursor:pointer;font-size:1rem;padding:.125rem .25rem;opacity:.7;transition:opacity .15s;line-height:1}.memory-warning-dismiss:hover{opacity:1}.memory-warning-dismiss:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:2px}@keyframes memory-warning-slide-in{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@media (prefers-reduced-motion: reduce){.memory-warning-banner{animation:none}}.crash-recovery-banner{position:fixed;top:0;left:0;right:0;z-index:1001;padding:.75rem 1rem;font-size:.85rem;line-height:1.4;background:var(--color-info-bg, #1a2a3a);border-bottom:2px solid var(--color-info, #4dabf7);color:var(--color-info-text, #74c0fc);animation:crash-recovery-slide-in .3s ease-out}.crash-recovery-loop{background:var(--color-warning-bg, #3a2d00);border-bottom-color:var(--color-warning, #f0ad4e);color:var(--color-warning-text, #ffc107)}[data-theme=light] .crash-recovery-banner{background:#d0ebff;border-bottom-color:#339af0;color:#1864ab}[data-theme=light] .crash-recovery-loop{background:#fff3cd;border-bottom-color:#ffc107;color:#664d03}.crash-recovery-content{display:flex;align-items:flex-start;gap:.5rem;max-width:1200px;margin:0 auto}.crash-recovery-icon{flex-shrink:0;font-size:1rem}.crash-recovery-text{flex:1;min-width:0}.crash-recovery-text strong{font-weight:600}.crash-recovery-description{margin:.25rem 0 0;font-size:.8rem;opacity:.9}.crash-recovery-state-info{margin:.15rem 0 0;font-size:.8rem;opacity:.85;font-style:italic}.crash-recovery-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.crash-recovery-restore{background:var(--color-info, #4dabf7);color:#fff;border:none;border-radius:4px;padding:.3rem .75rem;font-size:.8rem;font-weight:500;cursor:pointer;white-space:nowrap;transition:opacity .15s}.crash-recovery-loop .crash-recovery-restore{background:var(--color-warning, #f0ad4e);color:#000}[data-theme=light] .crash-recovery-restore{background:#339af0}.crash-recovery-restore:hover{opacity:.85}.crash-recovery-restore:focus-visible{outline:2px solid currentColor;outline-offset:2px}.crash-recovery-dismiss{background:none;border:1px solid currentColor;color:inherit;border-radius:4px;padding:.3rem .75rem;font-size:.8rem;cursor:pointer;white-space:nowrap;opacity:.7;transition:opacity .15s}.crash-recovery-dismiss:hover{opacity:1}.crash-recovery-dismiss:focus-visible{outline:2px solid currentColor;outline-offset:2px}@keyframes crash-recovery-slide-in{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@media (prefers-reduced-motion: reduce){.crash-recovery-banner{animation:none}}.degradation-banner{position:fixed;top:0;left:0;right:0;z-index:999;padding:.5rem 1rem;font-size:.85rem;line-height:1.4;animation:degradation-slide-in .3s ease-out}.degradation-elevated{background:var(--color-info-bg, #1a2a3a);border-bottom:2px solid var(--color-info, #4dabf7);color:var(--color-info-text, #74c0fc)}.degradation-warning{background:var(--color-warning-bg, #3a2d00);border-bottom:2px solid var(--color-warning, #f0ad4e);color:var(--color-warning-text, #ffc107)}.degradation-critical{background:var(--color-error-bg, #3a0000);border-bottom:2px solid var(--color-error, #dc3545);color:var(--color-error-text, #ff6b6b)}[data-theme=light] .degradation-elevated{background:#d0ebff;border-bottom-color:#339af0;color:#1864ab}[data-theme=light] .degradation-warning{background:#fff3cd;border-bottom-color:#ffc107;color:#664d03}[data-theme=light] .degradation-critical{background:#f8d7da;border-bottom-color:#dc3545;color:#842029}.degradation-content{display:flex;align-items:flex-start;gap:.5rem;max-width:1200px;margin:0 auto}.degradation-icon{flex-shrink:0;font-size:1rem}.degradation-text{flex:1;min-width:0}.degradation-text strong{font-weight:600}.degradation-summary{margin:.25rem 0 0;font-size:.8rem;opacity:.9}.degradation-features{margin:.15rem 0 0;font-size:.75rem;opacity:.75;font-style:italic}.degradation-dismiss{flex-shrink:0;background:none;border:none;color:inherit;cursor:pointer;font-size:1rem;padding:.125rem .25rem;opacity:.7;transition:opacity .15s;line-height:1}.degradation-dismiss:hover{opacity:1}.degradation-dismiss:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:2px}@keyframes degradation-slide-in{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@media (prefers-reduced-motion: reduce){.degradation-banner{animation:none}}.degradation-no-animations,.degradation-no-animations *{animation-duration:0s!important;transition-duration:0s!important}.degraded-view-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:3rem 2rem;gap:.75rem;opacity:.8}.degraded-view-placeholder h2{font-size:1.1rem;font-weight:600;margin:0}.degraded-view-placeholder p{font-size:.85rem;max-width:400px;margin:0;opacity:.75;line-height:1.5}.refresh-queue-status{position:fixed;bottom:1rem;right:1rem;z-index:998;padding:.4rem .75rem;border-radius:6px;font-size:.8rem;line-height:1.4;display:flex;align-items:center;gap:.4rem;max-width:360px;animation:refresh-queue-fade-in .2s ease-out;box-shadow:0 2px 8px #0003}.refresh-queue-active{background:var(--color-info-bg, #1a2a3a);border:1px solid var(--color-info, #4dabf7);color:var(--color-info-text, #74c0fc)}.refresh-queue-throttled{background:var(--color-warning-bg, #3a2d00);border:1px solid var(--color-warning, #f0ad4e);color:var(--color-warning-text, #ffc107)}.refresh-queue-paused{background:var(--color-error-bg, #3a0000);border:1px solid var(--color-error, #dc3545);color:var(--color-error-text, #ff6b6b)}[data-theme=light] .refresh-queue-active{background:#d0ebff;border-color:#339af0;color:#1864ab;box-shadow:0 2px 8px #00000014}[data-theme=light] .refresh-queue-throttled{background:#fff3cd;border-color:#ffc107;color:#664d03;box-shadow:0 2px 8px #00000014}[data-theme=light] .refresh-queue-paused{background:#f8d7da;border-color:#dc3545;color:#842029;box-shadow:0 2px 8px #00000014}.refresh-queue-icon{flex-shrink:0;font-size:.9rem}.refresh-queue-info{display:flex;flex-direction:column;gap:.1rem;min-width:0}.refresh-queue-level{font-weight:600;font-size:.75rem}.refresh-queue-detail{font-size:.7rem;opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes refresh-queue-fade-in{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion: reduce){.refresh-queue-status{animation:none}}.polling-suspension-indicator{position:fixed;bottom:1rem;left:1rem;z-index:998;padding:.4rem .75rem;border-radius:6px;font-size:.8rem;line-height:1.4;display:flex;align-items:center;gap:.5rem;max-width:360px;animation:polling-suspension-fade-in .2s ease-out;box-shadow:0 2px 8px #0003;background:var(--color-warning-bg, #3a2d00);border:1px solid var(--color-warning, #f0ad4e);color:var(--color-warning-text, #ffc107)}[data-theme=light] .polling-suspension-indicator{background:#fff3cd;border-color:#ffc107;color:#664d03;box-shadow:0 2px 8px #00000014}.polling-suspension-icon{flex-shrink:0;font-size:.9rem}.polling-suspension-info{display:flex;flex-direction:column;gap:.1rem;min-width:0;flex:1}.polling-suspension-title{font-weight:600;font-size:.75rem}.polling-suspension-detail{font-size:.7rem;opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.polling-suspension-refresh{flex-shrink:0;background:none;border:1px solid currentColor;color:inherit;cursor:pointer;font-size:.7rem;padding:.2rem .5rem;border-radius:4px;font-weight:600;opacity:.85;transition:opacity .15s;line-height:1.3}.polling-suspension-refresh:hover{opacity:1}.polling-suspension-refresh:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:4px}@keyframes polling-suspension-fade-in{0%{opacity:0;transform:translateY(.5rem)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion: reduce){.polling-suspension-indicator{animation:none}}.search-overlay{position:fixed;inset:0;z-index:900;background:#00000080;display:flex;align-items:flex-start;justify-content:center;padding-top:10vh;backdrop-filter:blur(2px)}.search-overlay-panel{width:600px;max-width:calc(100vw - 32px);max-height:70vh;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-xl);box-shadow:0 16px 48px #0000004d;display:flex;flex-direction:column;overflow:hidden}.search-overlay-header{padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border)}.search-overlay-input-row{display:flex;align-items:center;gap:var(--space-2)}.search-overlay-icon{font-size:var(--font-lg);flex-shrink:0;opacity:.6}.search-overlay-input{flex:1;background:transparent;border:none;outline:none;font-size:var(--font-lg);color:var(--text);line-height:var(--leading-normal);padding:var(--space-1) 0}.search-overlay-input::placeholder{color:var(--text-muted)}.search-overlay-kbd{font-size:var(--font-xs);color:var(--text-muted);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px 6px;font-family:inherit;line-height:1;flex-shrink:0}.search-overlay-filter-toggle{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-2)}.search-overlay-filter-btn{font-size:var(--font-sm);color:var(--text-dim);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);padding:4px 10px;cursor:pointer;transition:all var(--transition-fast);display:flex;align-items:center;gap:var(--space-1)}.search-overlay-filter-btn:hover{color:var(--text);border-color:var(--accent)}.search-overlay-filter-btn.active{color:var(--accent);border-color:var(--accent)}.search-overlay-filter-badge{font-size:var(--font-xs);background:var(--accent);color:var(--bg);border-radius:99px;min-width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;padding:0 4px;font-weight:var(--weight-semibold)}.search-overlay-stats{font-size:var(--font-sm);color:var(--text-muted);margin-left:auto}.search-overlay-filters{padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-2);background:var(--bg)}.search-filter-group{display:flex;align-items:center;gap:var(--space-2)}.search-filter-group-label{font-size:var(--font-sm);color:var(--text-dim);min-width:52px;font-weight:var(--weight-medium)}.search-filter-group-options{display:flex;flex-wrap:wrap;gap:var(--space-1)}.search-filter-chip{font-size:var(--font-sm);color:var(--text-dim);background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:2px 10px;cursor:pointer;transition:all var(--transition-fast);user-select:none}.search-filter-chip:hover{color:var(--text);border-color:var(--text-dim)}.search-filter-chip.active{background:var(--accent-subtle);color:var(--accent);border-color:var(--accent)}.search-overlay-results{flex:1;overflow-y:auto;padding:var(--space-2) 0;min-height:100px;max-height:50vh}.search-overlay-result{padding:var(--space-2) var(--space-4);cursor:pointer;border-left:3px solid transparent;transition:background var(--transition-fast)}.search-overlay-result:hover,.search-overlay-result.active{background:var(--bg-hover);border-left-color:var(--accent)}.search-overlay-result.active{background:var(--bg-active)}.search-result-header{display:flex;align-items:center;gap:var(--space-2)}.search-result-level{font-size:var(--font-md);flex-shrink:0}.search-result-title{flex:1;font-size:var(--font-md);font-weight:var(--weight-medium);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-breadcrumb{font-size:var(--font-sm);color:var(--text-muted);margin-top:2px;margin-left:28px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-context{font-size:var(--font-sm);color:var(--text-dim);margin-top:var(--space-1);margin-left:28px;line-height:var(--leading-relaxed);word-break:break-word}.search-result-meta{font-size:var(--font-xs);color:var(--text-muted);margin-top:2px;margin-left:28px}.search-highlight-exact{background:#ffe60059;color:inherit;border-radius:2px;padding:0 1px}.search-highlight-partial{background:#64b4ff40;color:inherit;border-radius:2px;padding:0 1px}[data-theme=light] .search-highlight-exact{background:#ffd20066}[data-theme=light] .search-highlight-partial{background:#64a0ff40}.search-overlay-loading,.search-overlay-empty{padding:var(--space-8) var(--space-4);text-align:center;color:var(--text-muted);font-size:var(--font-md)}.search-overlay-footer{padding:var(--space-2) var(--space-4);border-top:1px solid var(--border);font-size:var(--font-xs);color:var(--text-muted);display:flex;align-items:center;gap:var(--space-2)}.search-overlay-footer kbd{font-size:var(--font-xs);color:var(--text-dim);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:1px 5px;font-family:inherit;line-height:1}@media (max-width: 640px){.search-overlay{padding-top:5vh}.search-overlay-panel{width:calc(100vw - 16px);max-height:80vh;border-radius:var(--radius-lg)}.search-filter-group{flex-direction:column;align-items:flex-start}.search-filter-group-label{min-width:unset}}.zone-slideout-backdrop{display:none;position:fixed;inset:0;background:#0006;z-index:399}.zone-slideout-backdrop.open{display:block}.zone-slideout{position:fixed;top:0;right:0;width:380px;height:100vh;height:100dvh;background:var(--bg-surface);border-left:1px solid var(--border);box-shadow:-4px 0 16px #00000026;z-index:400;overflow-y:auto;padding:20px;transform:translate(100%);transition:transform .25s ease;outline:none}.zone-slideout.open{transform:translate(0)}.zone-slideout-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px;gap:12px}.zone-slideout-title{display:flex;align-items:center;gap:10px;min-width:0}.zone-slideout-title h3{font-size:16px;font-weight:600;margin:0;color:var(--zone-accent, var(--text));word-break:break-word}.zone-slideout-dot{width:12px;height:12px;border-radius:50%;flex-shrink:0}.zone-slideout-close{background:none;border:1px solid var(--border);border-radius:6px;color:var(--text-dim);font-size:12px;cursor:pointer;padding:4px 8px;flex-shrink:0;display:flex;align-items:center}.zone-slideout-close:hover{border-color:var(--accent);color:var(--accent)}.zone-slideout-desc{font-size:13px;color:var(--text-dim);line-height:1.5;margin:0 0 16px}.zone-slideout-metrics{display:flex;gap:20px;margin-bottom:16px;padding:12px;background:var(--bg);border-radius:8px}.zone-slideout-metric{display:flex;flex-direction:column;align-items:center;flex:1}.zone-slideout-metric-val{font-size:20px;font-weight:700;line-height:1.2}.zone-slideout-metric-lbl{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.zone-slideout-meter-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}.zone-slideout-meter-label{font-size:11px;color:var(--text-dim);width:60px;flex-shrink:0}.zone-slideout-meter-row .meter{flex:1}.zone-slideout-section{margin-top:16px;padding-top:16px;border-top:1px solid var(--border)}.zone-slideout-section h4{font-size:11px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.5px;margin:0 0 8px}.zone-slideout-list{list-style:none;padding:0;margin:0}.zone-slideout-list-item{padding:4px 6px;font-size:12px;color:var(--text);border-radius:4px;line-height:1.5}.zone-slideout-list-item.clickable{cursor:pointer}.zone-slideout-list-item.clickable:hover{background:var(--bg-hover);color:var(--accent)}.zone-slideout-list-more{font-size:11px;color:var(--text-dim);font-style:italic;padding:4px 6px}.zone-slideout-deps{display:grid;grid-template-columns:1fr 1fr;gap:16px}.zone-slideout-dep-col{display:flex;flex-direction:column;gap:4px}.zone-slideout-dep-label{font-size:10px;color:var(--text-dim);font-weight:600;text-transform:uppercase;margin-bottom:2px}.zone-slideout-dep-item{display:flex;justify-content:space-between;align-items:center;font-size:12px;padding:4px 8px;background:var(--bg);border-radius:4px}.zone-slideout-dep-count{font-weight:600;color:var(--accent);font-size:11px}.zone-slideout-files-toggle{background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:8px 16px;font-size:12px;cursor:pointer;color:var(--text);width:100%;text-align:center}.zone-slideout-files-toggle:hover{border-color:var(--accent)}.zone-slideout-file-list{list-style:none;padding:0;margin:12px 0 0;max-height:240px;overflow-y:auto}.zone-slideout-file-item{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;border-radius:4px;font-size:11px}.zone-slideout-file-item.clickable{cursor:pointer}.zone-slideout-file-item.clickable:hover{background:var(--bg-hover)}.zone-slideout-file-path{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.zone-slideout-entry-badge{font-size:9px;background:var(--accent);color:#fff;padding:1px 5px;border-radius:3px;font-weight:600;flex-shrink:0;margin-left:8px}.zone-slideout-nav{display:flex;flex-direction:column;gap:6px;margin-top:16px;padding-top:16px;border-top:1px solid var(--border)}.zone-slideout-nav-btn{display:block;width:100%;padding:8px 12px;background:var(--bg-hover);border:1px solid var(--border);border-radius:6px;color:var(--accent);font-size:12px;font-weight:500;cursor:pointer;text-align:center}.zone-slideout-nav-btn:hover{border-color:var(--accent);background:var(--accent-dim);color:#fff}@media (max-width: 1024px){.zone-slideout{width:340px}.zone-slideout-deps{grid-template-columns:1fr}}@media (max-width: 768px){.zone-slideout{width:100%;border-left:none}.zone-slideout-metrics{gap:12px}.zone-slideout-metric-val{font-size:18px}.zone-slideout-deps{grid-template-columns:1fr}}.ndx-deployed .smart-add-panel,.ndx-deployed .smart-add-panel-compact,.ndx-deployed .batch-import-panel,.ndx-deployed .rex-analyze-panel,.ndx-deployed .rex-add-form,.ndx-deployed .prd-inline-add-form,.ndx-deployed .prune-confirmation,.ndx-deployed .reorganize-panel,.ndx-deployed .merge-preview,.ndx-deployed .delete-modal,.ndx-deployed .rex-bulk-bar,.ndx-deployed .rex-bulk-actions,.ndx-deployed .prd-node-action-edit,.ndx-deployed .prd-node-action-delete,.ndx-deployed .prd-inline-add-btn,.ndx-deployed .task-add-child-btn,.ndx-deployed .task-add-description-btn,.ndx-deployed .task-remove-btn,.ndx-deployed .task-execute-btn,.ndx-deployed .task-execute-section,.ndx-deployed .task-edit-actions,.ndx-deployed .task-title-edit,.ndx-deployed .task-description-edit,.ndx-deployed .task-tag-add-btn,.ndx-deployed .task-tag-add,.ndx-deployed .task-tag-remove,.ndx-deployed .task-tag-edit,.ndx-deployed .task-criterion-add,.ndx-deployed .task-criterion-remove,.ndx-deployed .rex-dash-smart-add,.ndx-deployed .rex-dash-action,.ndx-deployed .rex-dash-header-action,.ndx-deployed .rex-dash-panel-action,.ndx-deployed .notion-config-actions,.ndx-deployed .notion-config-save-btn,.ndx-deployed .notion-config-remove-btn,.ndx-deployed .intg-remove-btn,.ndx-deployed .hench-config-tag-add-btn,.ndx-deployed .hench-config-tag-remove,.ndx-deployed .hench-template-delete-btn,.ndx-deployed .hench-template-apply-btn,.ndx-deployed .hench-execute-btn,.ndx-deployed .hench-terminate-btn,.ndx-deployed .hench-throttle-controls,.ndx-deployed .refresh-toast,.ndx-deployed .polling-suspension-indicator,.ndx-deployed .refresh-queue-status,.ndx-deployed .memory-warning-banner,.ndx-deployed .degradation-banner{display:none!important}@media (max-width: 1024px){:root{--sidebar-w: 180px;--panel-w: 280px}.stat-grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}.zone-grid{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}.dep-legend{flex-wrap:wrap;gap:8px}.val-summary,.dep-stats{flex-wrap:wrap;gap:10px}.rex-bulk-bar{max-width:calc(100vw - 40px);flex-wrap:wrap;gap:8px;padding:8px 12px}}@media (max-width: 768px){#app{flex-direction:column}.sidebar,.sidebar.sidebar-collapsed{width:100%;min-width:100%;height:auto;max-height:56px;overflow:hidden;border-right:none;border-bottom:1px solid var(--border);transition:max-height .3s ease;position:relative}.sidebar.sidebar-collapsed .sidebar-header,.sidebar.sidebar-collapsed .sidebar-nav{opacity:1;pointer-events:auto;position:static;visibility:visible}.sidebar-rail{display:none}.sidebar.mobile-open{max-height:100vh;max-height:100dvh;overflow-y:auto;position:fixed;inset:0;z-index:600;background:var(--bg-surface)}.sidebar-backdrop{display:none}.sidebar.mobile-open+.sidebar-backdrop,.sidebar.mobile-open .sidebar-backdrop{display:block;position:fixed;inset:0;background:#0006;z-index:599}.sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px}.sidebar-header h1{font-size:14px}.mobile-menu-btn{display:block;background:none;border:none;color:var(--text-dim);font-size:18px;cursor:pointer;padding:4px}.sidebar-nav{padding:4px 8px 8px}.nav-item{padding:10px 12px}.main{padding:16px;height:calc(100vh - 56px);height:calc(100dvh - 56px)}.sidebar-footer{display:none}.global-faq-btn{position:fixed;bottom:16px;left:16px;z-index:500;width:36px;height:36px;border-radius:50%;border:1px solid var(--border);background:var(--bg-surface);box-shadow:0 2px 8px #00000026}.page-context-bar{padding:0 0 6px}.breadcrumb-branch{display:none}.breadcrumb-project{max-width:120px}.breadcrumb-item{font-size:var(--font-sm)}.breadcrumb-sep{margin:0 4px}.detail-panel{position:fixed;inset:0;width:100%;z-index:500;border-left:none}.detail-backdrop{display:block;position:fixed;inset:0;background:#0006;z-index:499}.stat-grid{grid-template-columns:repeat(2,1fr);gap:8px}.zone-grid{grid-template-columns:1fr}.filter-bar{flex-wrap:wrap}.filter-input{min-width:0}.data-table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch}.graph-container{height:calc(100vh - 200px);height:calc(100dvh - 200px)}.flow-diagram svg{max-width:100%;height:auto}.guide-modal,.faq-modal{width:95vw;max-height:85vh}.nav-section-header{padding:10px 12px 6px}.rex-command-bar{flex-wrap:wrap}.val-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch}.val-summary{flex-direction:column;align-items:flex-start;gap:8px}.val-summary-stats{flex-wrap:wrap;gap:8px}.dep-stats{flex-wrap:wrap;gap:10px}.dep-legend{flex-wrap:wrap;gap:6px;padding:8px 12px}.hench-filter-bar{flex-wrap:wrap}.rex-bulk-bar{max-width:calc(100vw - 32px);flex-wrap:wrap;gap:6px;padding:8px 12px}.rex-bulk-actions{flex-wrap:wrap}.attention-item{flex-direction:column;align-items:flex-start;gap:6px}.attention-issues{flex-wrap:wrap}.cost-item{flex-direction:column;align-items:flex-start;gap:4px}.zone-map-grid,.dep-grid{grid-template-columns:1fr}}
25
+ </style>
26
+ </head>
27
+ <body>
28
+ <div id="app"></div>
29
+ <script type="module">var cd=Object.defineProperty;var ud=(t,n)=>{for(var s in n)cd(t,s,{get:n[s],enumerable:!0})};var fs,fe,si,dd,bt,Qo,ri,ai,oi,br,gr,hr,pd,$n={},ii=[],fd=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ms=Array.isArray;function Ye(t,n){for(var s in n)t[s]=n[s];return t}function yr(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function e(t,n,s){var r,a,o,i={};for(o in n)o=="key"?r=n[o]:o=="ref"?a=n[o]:i[o]=n[o];if(arguments.length>2&&(i.children=arguments.length>3?fs.call(arguments,2):s),typeof t=="function"&&t.defaultProps!=null)for(o in t.defaultProps)i[o]===void 0&&(i[o]=t.defaultProps[o]);return ds(t,i,r,a,null)}function ds(t,n,s,r,a){var o={type:t,props:n,key:s,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:a??++si,__i:-1,__u:0};return a==null&&fe.vnode!=null&&fe.vnode(o),o}function Q(t){return t.children}function Kt(t,n){this.props=t,this.context=n}function Yt(t,n){if(n==null)return t.__?Yt(t.__,t.__i+1):null;for(var s;n<t.__k.length;n++)if((s=t.__k[n])!=null&&s.__e!=null)return s.__e;return typeof t.type=="function"?Yt(t):null}function li(t){var n,s;if((t=t.__)!=null&&t.__c!=null){for(t.__e=t.__c.base=null,n=0;n<t.__k.length;n++)if((s=t.__k[n])!=null&&s.__e!=null){t.__e=t.__c.base=s.__e;break}return li(t)}}function ei(t){(!t.__d&&(t.__d=!0)&&bt.push(t)&&!ps.__r++||Qo!=fe.debounceRendering)&&((Qo=fe.debounceRendering)||ri)(ps)}function ps(){for(var t,n,s,r,a,o,i,l=1;bt.length;)bt.length>l&&bt.sort(ai),t=bt.shift(),l=bt.length,t.__d&&(s=void 0,r=void 0,a=(r=(n=t).__v).__e,o=[],i=[],n.__P&&((s=Ye({},r)).__v=r.__v+1,fe.vnode&&fe.vnode(s),kr(n.__P,s,r,n.__n,n.__P.namespaceURI,32&r.__u?[a]:null,o,a??Yt(r),!!(32&r.__u),i),s.__v=r.__v,s.__.__k[s.__i]=s,di(o,s,i),r.__e=r.__=null,s.__e!=a&&li(s)));ps.__r=0}function ci(t,n,s,r,a,o,i,l,c,u,d){var p,m,f,v,b,g,y,h=r&&r.__k||ii,x=n.length;for(c=md(s,n,h,c,x),p=0;p<x;p++)(f=s.__k[p])!=null&&(m=f.__i==-1?$n:h[f.__i]||$n,f.__i=p,g=kr(t,f,m,a,o,i,l,c,u,d),v=f.__e,f.ref&&m.ref!=f.ref&&(m.ref&&wr(m.ref,null,f),d.push(f.ref,f.__c||v,f)),b==null&&v!=null&&(b=v),(y=!!(4&f.__u))||m.__k===f.__k?c=ui(f,c,t,y):typeof f.type=="function"&&g!==void 0?c=g:v&&(c=v.nextSibling),f.__u&=-7);return s.__e=b,c}function md(t,n,s,r,a){var o,i,l,c,u,d=s.length,p=d,m=0;for(t.__k=new Array(a),o=0;o<a;o++)(i=n[o])!=null&&typeof i!="boolean"&&typeof i!="function"?(typeof i=="string"||typeof i=="number"||typeof i=="bigint"||i.constructor==String?i=t.__k[o]=ds(null,i,null,null,null):ms(i)?i=t.__k[o]=ds(Q,{children:i},null,null,null):i.constructor===void 0&&i.__b>0?i=t.__k[o]=ds(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):t.__k[o]=i,c=o+m,i.__=t,i.__b=t.__b+1,l=null,(u=i.__i=gd(i,s,c,p))!=-1&&(p--,(l=s[u])&&(l.__u|=2)),l==null||l.__v==null?(u==-1&&(a>d?m--:a<d&&m++),typeof i.type!="function"&&(i.__u|=4)):u!=c&&(u==c-1?m--:u==c+1?m++:(u>c?m--:m++,i.__u|=4))):t.__k[o]=null;if(p)for(o=0;o<d;o++)(l=s[o])!=null&&!(2&l.__u)&&(l.__e==r&&(r=Yt(l)),fi(l,l));return r}function ui(t,n,s,r){var a,o;if(typeof t.type=="function"){for(a=t.__k,o=0;a&&o<a.length;o++)a[o]&&(a[o].__=t,n=ui(a[o],n,s,r));return n}t.__e!=n&&(r&&(n&&t.type&&!n.parentNode&&(n=Yt(t)),s.insertBefore(t.__e,n||null)),n=t.__e);do n=n&&n.nextSibling;while(n!=null&&n.nodeType==8);return n}function gd(t,n,s,r){var a,o,i,l=t.key,c=t.type,u=n[s],d=u!=null&&(2&u.__u)==0;if(u===null&&l==null||d&&l==u.key&&c==u.type)return s;if(r>(d?1:0)){for(a=s-1,o=s+1;a>=0||o<n.length;)if((u=n[i=a>=0?a--:o++])!=null&&!(2&u.__u)&&l==u.key&&c==u.type)return i}return-1}function ti(t,n,s){n[0]=="-"?t.setProperty(n,s??""):t[n]=s==null?"":typeof s!="number"||fd.test(n)?s:s+"px"}function us(t,n,s,r,a){var o,i;e:if(n=="style")if(typeof s=="string")t.style.cssText=s;else{if(typeof r=="string"&&(t.style.cssText=r=""),r)for(n in r)s&&n in s||ti(t.style,n,"");if(s)for(n in s)r&&s[n]==r[n]||ti(t.style,n,s[n])}else if(n[0]=="o"&&n[1]=="n")o=n!=(n=n.replace(oi,"$1")),i=n.toLowerCase(),n=i in t||n=="onFocusOut"||n=="onFocusIn"?i.slice(2):n.slice(2),t.l||(t.l={}),t.l[n+o]=s,s?r?s.u=r.u:(s.u=br,t.addEventListener(n,o?hr:gr,o)):t.removeEventListener(n,o?hr:gr,o);else{if(a=="http://www.w3.org/2000/svg")n=n.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(n!="width"&&n!="height"&&n!="href"&&n!="list"&&n!="form"&&n!="tabIndex"&&n!="download"&&n!="rowSpan"&&n!="colSpan"&&n!="role"&&n!="popover"&&n in t)try{t[n]=s??"";break e}catch{}typeof s=="function"||(s==null||s===!1&&n[4]!="-"?t.removeAttribute(n):t.setAttribute(n,n=="popover"&&s==1?"":s))}}function ni(t){return function(n){if(this.l){var s=this.l[n.type+t];if(n.t==null)n.t=br++;else if(n.t<s.u)return;return s(fe.event?fe.event(n):n)}}}function kr(t,n,s,r,a,o,i,l,c,u){var d,p,m,f,v,b,g,y,h,x,S,T,w,C,I,E,D,M=n.type;if(n.constructor!==void 0)return null;128&s.__u&&(c=!!(32&s.__u),o=[l=n.__e=s.__e]),(d=fe.__b)&&d(n);e:if(typeof M=="function")try{if(y=n.props,h="prototype"in M&&M.prototype.render,x=(d=M.contextType)&&r[d.__c],S=d?x?x.props.value:d.__:r,s.__c?g=(p=n.__c=s.__c).__=p.__E:(h?n.__c=p=new M(y,S):(n.__c=p=new Kt(y,S),p.constructor=M,p.render=vd),x&&x.sub(p),p.state||(p.state={}),p.__n=r,m=p.__d=!0,p.__h=[],p._sb=[]),h&&p.__s==null&&(p.__s=p.state),h&&M.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=Ye({},p.__s)),Ye(p.__s,M.getDerivedStateFromProps(y,p.__s))),f=p.props,v=p.state,p.__v=n,m)h&&M.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),h&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(h&&M.getDerivedStateFromProps==null&&y!==f&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(y,S),n.__v==s.__v||!p.__e&&p.shouldComponentUpdate!=null&&p.shouldComponentUpdate(y,p.__s,S)===!1){for(n.__v!=s.__v&&(p.props=y,p.state=p.__s,p.__d=!1),n.__e=s.__e,n.__k=s.__k,n.__k.some(function(R){R&&(R.__=n)}),T=0;T<p._sb.length;T++)p.__h.push(p._sb[T]);p._sb=[],p.__h.length&&i.push(p);break e}p.componentWillUpdate!=null&&p.componentWillUpdate(y,p.__s,S),h&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(f,v,b)})}if(p.context=S,p.props=y,p.__P=t,p.__e=!1,w=fe.__r,C=0,h){for(p.state=p.__s,p.__d=!1,w&&w(n),d=p.render(p.props,p.state,p.context),I=0;I<p._sb.length;I++)p.__h.push(p._sb[I]);p._sb=[]}else do p.__d=!1,w&&w(n),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++C<25);p.state=p.__s,p.getChildContext!=null&&(r=Ye(Ye({},r),p.getChildContext())),h&&!m&&p.getSnapshotBeforeUpdate!=null&&(b=p.getSnapshotBeforeUpdate(f,v)),E=d,d!=null&&d.type===Q&&d.key==null&&(E=pi(d.props.children)),l=ci(t,ms(E)?E:[E],n,s,r,a,o,i,l,c,u),p.base=n.__e,n.__u&=-161,p.__h.length&&i.push(p),g&&(p.__E=p.__=null)}catch(R){if(n.__v=null,c||o!=null)if(R.then){for(n.__u|=c?160:128;l&&l.nodeType==8&&l.nextSibling;)l=l.nextSibling;o[o.indexOf(l)]=null,n.__e=l}else{for(D=o.length;D--;)yr(o[D]);vr(n)}else n.__e=s.__e,n.__k=s.__k,R.then||vr(n);fe.__e(R,n,s)}else o==null&&n.__v==s.__v?(n.__k=s.__k,n.__e=s.__e):l=n.__e=hd(s.__e,n,s,r,a,o,i,c,u);return(d=fe.diffed)&&d(n),128&n.__u?void 0:l}function vr(t){t&&t.__c&&(t.__c.__e=!0),t&&t.__k&&t.__k.forEach(vr)}function di(t,n,s){for(var r=0;r<s.length;r++)wr(s[r],s[++r],s[++r]);fe.__c&&fe.__c(n,t),t.some(function(a){try{t=a.__h,a.__h=[],t.some(function(o){o.call(a)})}catch(o){fe.__e(o,a.__v)}})}function pi(t){return typeof t!="object"||t==null||t.__b&&t.__b>0?t:ms(t)?t.map(pi):Ye({},t)}function hd(t,n,s,r,a,o,i,l,c){var u,d,p,m,f,v,b,g=s.props||$n,y=n.props,h=n.type;if(h=="svg"?a="http://www.w3.org/2000/svg":h=="math"?a="http://www.w3.org/1998/Math/MathML":a||(a="http://www.w3.org/1999/xhtml"),o!=null){for(u=0;u<o.length;u++)if((f=o[u])&&"setAttribute"in f==!!h&&(h?f.localName==h:f.nodeType==3)){t=f,o[u]=null;break}}if(t==null){if(h==null)return document.createTextNode(y);t=document.createElementNS(a,h,y.is&&y),l&&(fe.__m&&fe.__m(n,o),l=!1),o=null}if(h==null)g===y||l&&t.data==y||(t.data=y);else{if(o=o&&fs.call(t.childNodes),!l&&o!=null)for(g={},u=0;u<t.attributes.length;u++)g[(f=t.attributes[u]).name]=f.value;for(u in g)if(f=g[u],u!="children"){if(u=="dangerouslySetInnerHTML")p=f;else if(!(u in y)){if(u=="value"&&"defaultValue"in y||u=="checked"&&"defaultChecked"in y)continue;us(t,u,null,f,a)}}for(u in y)f=y[u],u=="children"?m=f:u=="dangerouslySetInnerHTML"?d=f:u=="value"?v=f:u=="checked"?b=f:l&&typeof f!="function"||g[u]===f||us(t,u,f,g[u],a);if(d)l||p&&(d.__html==p.__html||d.__html==t.innerHTML)||(t.innerHTML=d.__html),n.__k=[];else if(p&&(t.innerHTML=""),ci(n.type=="template"?t.content:t,ms(m)?m:[m],n,s,r,h=="foreignObject"?"http://www.w3.org/1999/xhtml":a,o,i,o?o[0]:s.__k&&Yt(s,0),l,c),o!=null)for(u=o.length;u--;)yr(o[u]);l||(u="value",h=="progress"&&v==null?t.removeAttribute("value"):v!=null&&(v!==t[u]||h=="progress"&&!v||h=="option"&&v!=g[u])&&us(t,u,v,g[u],a),u="checked",b!=null&&b!=t[u]&&us(t,u,b,g[u],a))}return t}function wr(t,n,s){try{if(typeof t=="function"){var r=typeof t.__u=="function";r&&t.__u(),r&&n==null||(t.__u=t(n))}else t.current=n}catch(a){fe.__e(a,s)}}function fi(t,n,s){var r,a;if(fe.unmount&&fe.unmount(t),(r=t.ref)&&(r.current&&r.current!=t.__e||wr(r,null,n)),(r=t.__c)!=null){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(o){fe.__e(o,n)}r.base=r.__P=null}if(r=t.__k)for(a=0;a<r.length;a++)r[a]&&fi(r[a],n,s||typeof t.type!="function");s||yr(t.__e),t.__c=t.__=t.__e=void 0}function vd(t,n,s){return this.constructor(t,s)}function mi(t,n,s){var r,a,o,i;n==document&&(n=document.documentElement),fe.__&&fe.__(t,n),a=(r=typeof s=="function")?null:s&&s.__k||n.__k,o=[],i=[],kr(n,t=(!r&&s||n).__k=e(Q,null,[t]),a||$n,$n,n.namespaceURI,!r&&s?[s]:a?null:n.firstChild?fs.call(n.childNodes):null,o,!r&&s?s:a?a.__e:n.firstChild,r,i),di(o,t,i)}fs=ii.slice,fe={__e:function(t,n,s,r){for(var a,o,i;n=n.__;)if((a=n.__c)&&!a.__)try{if((o=a.constructor)&&o.getDerivedStateFromError!=null&&(a.setState(o.getDerivedStateFromError(t)),i=a.__d),a.componentDidCatch!=null&&(a.componentDidCatch(t,r||{}),i=a.__d),i)return a.__E=a}catch(l){t=l}throw t}},si=0,dd=function(t){return t!=null&&t.constructor===void 0},Kt.prototype.setState=function(t,n){var s;s=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=Ye({},this.state),typeof t=="function"&&(t=t(Ye({},s),this.props)),t&&Ye(s,t),t!=null&&this.__v&&(n&&this._sb.push(n),ei(this))},Kt.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),ei(this))},Kt.prototype.render=Q,bt=[],ri=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,ai=function(t,n){return t.__v.__b-n.__v.__b},ps.__r=0,oi=/(PointerCapture)$|Capture$/i,br=0,gr=ni(!1),hr=ni(!0),pd=0;var An,me,xr,gi,Ln=0,Si=[],ye=fe,hi=ye.__b,vi=ye.__r,bi=ye.diffed,yi=ye.__c,ki=ye.unmount,wi=ye.__;function Cr(t,n){ye.__h&&ye.__h(me,t,Ln||n),Ln=0;var s=me.__H||(me.__H={__:[],__h:[]});return t>=s.__.length&&s.__.push({}),s.__[t]}function k(t){return Ln=1,bd(Ti,t)}function bd(t,n,s){var r=Cr(An++,2);if(r.t=t,!r.__c&&(r.__=[s?s(n):Ti(void 0,n),function(l){var c=r.__N?r.__N[0]:r.__[0],u=r.t(c,l);c!==u&&(r.__N=[u,r.__[1]],r.__c.setState({}))}],r.__c=me,!me.__f)){var a=function(l,c,u){if(!r.__c.__H)return!0;var d=r.__c.__H.__.filter(function(m){return!!m.__c});if(d.every(function(m){return!m.__N}))return!o||o.call(this,l,c,u);var p=r.__c.props!==l;return d.forEach(function(m){if(m.__N){var f=m.__[0];m.__=m.__N,m.__N=void 0,f!==m.__[0]&&(p=!0)}}),o&&o.call(this,l,c,u)||p};me.__f=!0;var o=me.shouldComponentUpdate,i=me.componentWillUpdate;me.componentWillUpdate=function(l,c,u){if(this.__e){var d=o;o=void 0,a(l,c,u),o=d}i&&i.call(this,l,c,u)},me.shouldComponentUpdate=a}return r.__N||r.__}function F(t,n){var s=Cr(An++,3);!ye.__s&&Ci(s.__H,n)&&(s.__=t,s.u=n,me.__H.__h.push(s))}function H(t){return Ln=5,B(function(){return{current:t}},[])}function B(t,n){var s=Cr(An++,7);return Ci(s.__H,n)&&(s.__=t(),s.__H=n,s.__h=t),s.__}function _(t,n){return Ln=8,B(function(){return t},n)}function yd(){for(var t;t=Si.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(gs),t.__H.__h.forEach(Sr),t.__H.__h=[]}catch(n){t.__H.__h=[],ye.__e(n,t.__v)}}ye.__b=function(t){me=null,hi&&hi(t)},ye.__=function(t,n){t&&n.__k&&n.__k.__m&&(t.__m=n.__k.__m),wi&&wi(t,n)},ye.__r=function(t){vi&&vi(t),An=0;var n=(me=t.__c).__H;n&&(xr===me?(n.__h=[],me.__h=[],n.__.forEach(function(s){s.__N&&(s.__=s.__N),s.u=s.__N=void 0})):(n.__h.forEach(gs),n.__h.forEach(Sr),n.__h=[],An=0)),xr=me},ye.diffed=function(t){bi&&bi(t);var n=t.__c;n&&n.__H&&(n.__H.__h.length&&(Si.push(n)!==1&&gi===ye.requestAnimationFrame||((gi=ye.requestAnimationFrame)||kd)(yd)),n.__H.__.forEach(function(s){s.u&&(s.__H=s.u),s.u=void 0})),xr=me=null},ye.__c=function(t,n){n.some(function(s){try{s.__h.forEach(gs),s.__h=s.__h.filter(function(r){return!r.__||Sr(r)})}catch(r){n.some(function(a){a.__h&&(a.__h=[])}),n=[],ye.__e(r,s.__v)}}),yi&&yi(t,n)},ye.unmount=function(t){ki&&ki(t);var n,s=t.__c;s&&s.__H&&(s.__H.__.forEach(function(r){try{gs(r)}catch(a){n=a}}),s.__H=void 0,n&&ye.__e(n,s.__v))};var xi=typeof requestAnimationFrame=="function";function kd(t){var n,s=function(){clearTimeout(r),xi&&cancelAnimationFrame(n),setTimeout(t)},r=setTimeout(s,35);xi&&(n=requestAnimationFrame(s))}function gs(t){var n=me,s=t.__c;typeof s=="function"&&(t.__c=void 0,s()),me=n}function Sr(t){var n=me;t.__c=t.__(),me=n}function Ci(t,n){return!t||t.length!==n.length||n.some(function(s,r){return s!==t[r]})}function Ti(t,n){return typeof n=="function"?n(t):n}var Xe={manifest:"manifest.json",inventory:"inventory.json",imports:"imports.json",zones:"zones.json",components:"components.json",callGraph:"callgraph.json"},Tr=Object.values(Xe);function hs(t){let n=null;function s(){return n!==null||(n=t().then(o=>(n=null,o),o=>{throw n=null,o})),n}function r(){return n!==null}function a(){n=null}return{execute:s,isInFlight:r,dispose:a}}function vs(t){let n=typeof window<"u"?window.location.origin:"",s=t.startsWith("/")?t:`/${t}`;return`${n}${s}`}function Fn({path:t,class:n,label:s="Copy Link",compact:r=!1}){let[a,o]=k(!1),i=H(null),l=_(u=>{u.stopPropagation(),u.preventDefault();let d=vs(t);navigator.clipboard.writeText(d).then(()=>{o(!0),i.current&&clearTimeout(i.current),i.current=setTimeout(()=>o(!1),2e3)}).catch(()=>{try{let p=document.createElement("input");p.value=d,p.style.position="fixed",p.style.opacity="0",document.body.appendChild(p),p.select(),document.execCommand("copy"),document.body.removeChild(p),o(!0),i.current&&clearTimeout(i.current),i.current=setTimeout(()=>o(!1),2e3)}catch{}})},[t]),c=["copy-link-btn",r?"copy-link-btn-compact":"",a?"copy-link-btn-copied":"",n??""].filter(Boolean).join(" ");return e("button",{class:c,onClick:l,title:a?"Copied!":"Copy shareable link","aria-label":a?"Link copied to clipboard":s,type:"button"},e("span",{class:"copy-link-icon","aria-hidden":"true"},a?"\u2713":"\u{1F517}"),e("span",{class:"copy-link-label"},a?"Copied!":s))}var xd={completed:{icon:"\u25CF",label:"Completed",cssClass:"prd-status-completed"},in_progress:{icon:"\u25D0",label:"In Progress",cssClass:"prd-status-in-progress"},pending:{icon:"\u25CB",label:"Pending",cssClass:"prd-status-pending"},deferred:{icon:"\u25CC",label:"Deferred",cssClass:"prd-status-deferred"},blocked:{icon:"\u2298",label:"Blocked",cssClass:"prd-status-blocked"},deleted:{icon:"\u2715",label:"Deleted",cssClass:"prd-status-deleted"}},Sd={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"};function Cd(t){return xd[t]??{icon:"\u25CB",label:t,cssClass:"prd-status-pending"}}var Td=[{status:"in_progress",icon:"\u25D0",label:"Start",cssClass:"prd-status-in-progress"},{status:"completed",icon:"\u25CF",label:"Complete",cssClass:"prd-status-completed"},{status:"blocked",icon:"\u2298",label:"Block",cssClass:"prd-status-blocked"},{status:"deferred",icon:"\u25CC",label:"Defer",cssClass:"prd-status-deferred"}];function Rd({task:t,x:n,y:s,onClose:r,navigateTo:a,onStatusChange:o}){let i=H(null),[l,c]=k(null);F(()=>{let v=g=>{i.current&&!i.current.contains(g.target)&&r()},b=g=>{g.key==="Escape"&&r()};return document.addEventListener("mousedown",v),document.addEventListener("keydown",b),()=>{document.removeEventListener("mousedown",v),document.removeEventListener("keydown",b)}},[r]),F(()=>{if(!l)return;let v=setTimeout(r,l.type==="error"?2e3:800);return()=>clearTimeout(v)},[l,r]);let u={position:"fixed",left:`${Math.min(n,window.innerWidth-200)}px`,top:`${Math.min(s,window.innerHeight-240)}px`,zIndex:"9999"},d=()=>{a&&a("prd",{taskId:t.id}),r()},p=async v=>{if(o)o(t.id,v),r();else try{let b=await fetch(`/api/rex/items/${t.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:v})});if(!b.ok)throw new Error(`HTTP ${b.status}`);c({message:`Status \u2192 ${v.replace("_"," ")}`,type:"success"})}catch{c({message:"Failed to update status",type:"error"})}},m=()=>{navigator.clipboard.writeText(t.id).then(()=>c({message:"Copied task ID",type:"success"}),()=>c({message:"Copy failed",type:"error"}))},f=()=>{let v=vs(`/prd/${t.id}`);navigator.clipboard.writeText(v).then(()=>c({message:"Copied link",type:"success"}),()=>c({message:"Copy failed",type:"error"}))};return l?e("div",{ref:i,class:"rex-context-menu",style:u,role:"status","aria-live":"polite"},e("div",{class:`rex-context-menu-feedback${l.type==="error"?" rex-context-menu-feedback-error":""}`},e("span",{class:"rex-context-menu-feedback-icon"},l.type==="error"?"\u2715":"\u2713"),e("span",null,l.message))):e("div",{ref:i,class:"rex-context-menu",style:u,role:"menu"},e("div",{class:"rex-context-menu-header"},e("span",{class:"rex-context-menu-title"},t.title)),e("div",{class:"rex-context-menu-divider"}),a?e("button",{class:"rex-context-menu-item",role:"menuitem",onClick:d},"View in PRD Tree"):null,e("div",{class:"rex-context-menu-section-label"},"Set Status"),...Td.filter(v=>v.status!==t.status).map(v=>e("button",{key:v.status,class:"rex-context-menu-item",role:"menuitem",onClick:()=>p(v.status)},e("span",{class:`rex-context-menu-status-icon ${v.cssClass}`},v.icon),v.label)),e("div",{class:"rex-context-menu-divider"}),e("button",{class:"rex-context-menu-item",role:"menuitem",onClick:f},e("span",{class:"rex-context-menu-status-icon","aria-hidden":"true"},"\u{1F517}"),"Copy Link"),e("button",{class:"rex-context-menu-item",role:"menuitem",onClick:m},"Copy Task ID"))}function Ae({task:t,navigateTo:n,class:s,showLevel:r=!1,showPriority:a=!1,showStatus:o=!0,compact:i=!1,onClick:l}){let[c,u]=k(null),d=Cd(t.status),p=_(b=>{b.stopPropagation(),l&&l(),n&&n("prd",{taskId:t.id})},[l,n,t.id]),m=_(b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),b.stopPropagation(),l&&l(),n&&n("prd",{taskId:t.id}))},[l,n,t.id]),f=_(b=>{b.preventDefault(),b.stopPropagation(),u({x:b.clientX,y:b.clientY})},[]),v=["rex-task-link",i?"rex-task-link-compact":"",s??""].filter(Boolean).join(" ");return e("span",{class:v,role:"button",tabIndex:0,onClick:p,onKeyDown:m,onContextMenu:f,title:`${d.label}: ${t.title}`,"aria-label":`${t.title} \u2014 ${d.label}`},o?e("span",{class:`rex-task-link-status ${d.cssClass}`,"aria-hidden":"true"},d.icon):null,r&&t.level?e("span",{class:`prd-level-badge prd-level-${t.level}`},Sd[t.level]??t.level):null,e("span",{class:"rex-task-link-title"},t.title),a&&t.priority?e("span",{class:`prd-priority-badge prd-priority-${t.priority}`},t.priority):null,e("span",{class:"rex-task-link-arrow","aria-hidden":"true"},"\u2192"),c?e(Rd,{task:t,x:c.x,y:c.y,onClose:()=>u(null),navigateTo:n}):null)}var L={};ud(L,{BRAND:()=>Jd,DIRTY:()=>yt,EMPTY_PATH:()=>Dd,INVALID:()=>ee,NEVER:()=>Fp,OK:()=>xe,ParseStatus:()=>we,Schema:()=>ae,ZodAny:()=>ct,ZodArray:()=>tt,ZodBigInt:()=>wt,ZodBoolean:()=>xt,ZodBranded:()=>On,ZodCatch:()=>$t,ZodDate:()=>St,ZodDefault:()=>Mt,ZodDiscriminatedUnion:()=>ks,ZodEffects:()=>De,ZodEnum:()=>Dt,ZodError:()=>Te,ZodFirstPartyTypeKind:()=>ne,ZodFunction:()=>xs,ZodIntersection:()=>Et,ZodIssueCode:()=>Z,ZodLazy:()=>It,ZodLiteral:()=>_t,ZodMap:()=>nn,ZodNaN:()=>rn,ZodNativeEnum:()=>Pt,ZodNever:()=>Le,ZodNull:()=>Tt,ZodNullable:()=>je,ZodNumber:()=>kt,ZodObject:()=>Re,ZodOptional:()=>Ie,ZodParsedType:()=>Y,ZodPipeline:()=>Vn,ZodPromise:()=>ut,ZodReadonly:()=>At,ZodRecord:()=>ws,ZodSchema:()=>ae,ZodSet:()=>sn,ZodString:()=>lt,ZodSymbol:()=>en,ZodTransformer:()=>De,ZodTuple:()=>He,ZodType:()=>ae,ZodUndefined:()=>Ct,ZodUnion:()=>Rt,ZodUnknown:()=>et,ZodVoid:()=>tn,addIssueToContext:()=>W,any:()=>ip,array:()=>dp,bigint:()=>np,boolean:()=>Fi,coerce:()=>Lp,custom:()=>$i,date:()=>sp,datetimeRegex:()=>Pi,defaultErrorMap:()=>Je,discriminatedUnion:()=>gp,effect:()=>Ep,enum:()=>Cp,function:()=>wp,getErrorMap:()=>Xt,getParsedType:()=>ze,instanceof:()=>ep,intersection:()=>hp,isAborted:()=>bs,isAsync:()=>Jt,isDirty:()=>ys,isValid:()=>it,late:()=>Qd,lazy:()=>xp,literal:()=>Sp,makeIssue:()=>Nn,map:()=>yp,nan:()=>tp,nativeEnum:()=>Tp,never:()=>cp,null:()=>op,nullable:()=>_p,number:()=>Li,object:()=>pp,objectUtil:()=>Rr,oboolean:()=>Ap,onumber:()=>$p,optional:()=>Ip,ostring:()=>Mp,pipeline:()=>Pp,preprocess:()=>Dp,promise:()=>Rp,quotelessJson:()=>Ed,record:()=>bp,set:()=>kp,setErrorMap:()=>_d,strictObject:()=>fp,string:()=>Ai,symbol:()=>rp,transformer:()=>Ep,tuple:()=>vp,undefined:()=>ap,union:()=>mp,unknown:()=>lp,util:()=>oe,void:()=>up});var oe;(function(t){t.assertEqual=a=>{};function n(a){}t.assertIs=n;function s(a){throw new Error}t.assertNever=s,t.arrayToEnum=a=>{let o={};for(let i of a)o[i]=i;return o},t.getValidEnumValues=a=>{let o=t.objectKeys(a).filter(l=>typeof a[a[l]]!="number"),i={};for(let l of o)i[l]=a[l];return t.objectValues(i)},t.objectValues=a=>t.objectKeys(a).map(function(o){return a[o]}),t.objectKeys=typeof Object.keys=="function"?a=>Object.keys(a):a=>{let o=[];for(let i in a)Object.prototype.hasOwnProperty.call(a,i)&&o.push(i);return o},t.find=(a,o)=>{for(let i of a)if(o(i))return i},t.isInteger=typeof Number.isInteger=="function"?a=>Number.isInteger(a):a=>typeof a=="number"&&Number.isFinite(a)&&Math.floor(a)===a;function r(a,o=" | "){return a.map(i=>typeof i=="string"?`'${i}'`:i).join(o)}t.joinValues=r,t.jsonStringifyReplacer=(a,o)=>typeof o=="bigint"?o.toString():o})(oe||(oe={}));var Rr;(function(t){t.mergeShapes=(n,s)=>({...n,...s})})(Rr||(Rr={}));var Y=oe.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),ze=t=>{switch(typeof t){case"undefined":return Y.undefined;case"string":return Y.string;case"number":return Number.isNaN(t)?Y.nan:Y.number;case"boolean":return Y.boolean;case"function":return Y.function;case"bigint":return Y.bigint;case"symbol":return Y.symbol;case"object":return Array.isArray(t)?Y.array:t===null?Y.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?Y.promise:typeof Map<"u"&&t instanceof Map?Y.map:typeof Set<"u"&&t instanceof Set?Y.set:typeof Date<"u"&&t instanceof Date?Y.date:Y.object;default:return Y.unknown}};var Z=oe.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),Ed=t=>JSON.stringify(t,null,2).replace(/"([^"]+)":/g,"$1:"),Te=class t extends Error{get errors(){return this.issues}constructor(n){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};let s=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,s):this.__proto__=s,this.name="ZodError",this.issues=n}format(n){let s=n||function(o){return o.message},r={_errors:[]},a=o=>{for(let i of o.issues)if(i.code==="invalid_union")i.unionErrors.map(a);else if(i.code==="invalid_return_type")a(i.returnTypeError);else if(i.code==="invalid_arguments")a(i.argumentsError);else if(i.path.length===0)r._errors.push(s(i));else{let l=r,c=0;for(;c<i.path.length;){let u=i.path[c];c===i.path.length-1?(l[u]=l[u]||{_errors:[]},l[u]._errors.push(s(i))):l[u]=l[u]||{_errors:[]},l=l[u],c++}}};return a(this),r}static assert(n){if(!(n instanceof t))throw new Error(`Not a ZodError: ${n}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,oe.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(n=s=>s.message){let s={},r=[];for(let a of this.issues)if(a.path.length>0){let o=a.path[0];s[o]=s[o]||[],s[o].push(n(a))}else r.push(n(a));return{formErrors:r,fieldErrors:s}}get formErrors(){return this.flatten()}};Te.create=t=>new Te(t);var Id=(t,n)=>{let s;switch(t.code){case Z.invalid_type:t.received===Y.undefined?s="Required":s=`Expected ${t.expected}, received ${t.received}`;break;case Z.invalid_literal:s=`Invalid literal value, expected ${JSON.stringify(t.expected,oe.jsonStringifyReplacer)}`;break;case Z.unrecognized_keys:s=`Unrecognized key(s) in object: ${oe.joinValues(t.keys,", ")}`;break;case Z.invalid_union:s="Invalid input";break;case Z.invalid_union_discriminator:s=`Invalid discriminator value. Expected ${oe.joinValues(t.options)}`;break;case Z.invalid_enum_value:s=`Invalid enum value. Expected ${oe.joinValues(t.options)}, received '${t.received}'`;break;case Z.invalid_arguments:s="Invalid function arguments";break;case Z.invalid_return_type:s="Invalid function return type";break;case Z.invalid_date:s="Invalid date";break;case Z.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(s=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(s=`${s} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?s=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?s=`Invalid input: must end with "${t.validation.endsWith}"`:oe.assertNever(t.validation):t.validation!=="regex"?s=`Invalid ${t.validation}`:s="Invalid";break;case Z.too_small:t.type==="array"?s=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?s=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?s=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?s=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?s=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:s="Invalid input";break;case Z.too_big:t.type==="array"?s=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?s=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?s=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?s=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?s=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:s="Invalid input";break;case Z.custom:s="Invalid input";break;case Z.invalid_intersection_types:s="Intersection results could not be merged";break;case Z.not_multiple_of:s=`Number must be a multiple of ${t.multipleOf}`;break;case Z.not_finite:s="Number must be finite";break;default:s=n.defaultError,oe.assertNever(t)}return{message:s}},Je=Id;var Ri=Je;function _d(t){Ri=t}function Xt(){return Ri}var Nn=t=>{let{data:n,path:s,errorMaps:r,issueData:a}=t,o=[...s,...a.path||[]],i={...a,path:o};if(a.message!==void 0)return{...a,path:o,message:a.message};let l="",c=r.filter(u=>!!u).slice().reverse();for(let u of c)l=u(i,{data:n,defaultError:l}).message;return{...a,path:o,message:l}},Dd=[];function W(t,n){let s=Xt(),r=Nn({issueData:n,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,s,s===Je?void 0:Je].filter(a=>!!a)});t.common.issues.push(r)}var we=class t{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(n,s){let r=[];for(let a of s){if(a.status==="aborted")return ee;a.status==="dirty"&&n.dirty(),r.push(a.value)}return{status:n.value,value:r}}static async mergeObjectAsync(n,s){let r=[];for(let a of s){let o=await a.key,i=await a.value;r.push({key:o,value:i})}return t.mergeObjectSync(n,r)}static mergeObjectSync(n,s){let r={};for(let a of s){let{key:o,value:i}=a;if(o.status==="aborted"||i.status==="aborted")return ee;o.status==="dirty"&&n.dirty(),i.status==="dirty"&&n.dirty(),o.value!=="__proto__"&&(typeof i.value<"u"||a.alwaysSet)&&(r[o.value]=i.value)}return{status:n.value,value:r}}},ee=Object.freeze({status:"aborted"}),yt=t=>({status:"dirty",value:t}),xe=t=>({status:"valid",value:t}),bs=t=>t.status==="aborted",ys=t=>t.status==="dirty",it=t=>t.status==="valid",Jt=t=>typeof Promise<"u"&&t instanceof Promise;var J;(function(t){t.errToObj=n=>typeof n=="string"?{message:n}:n||{},t.toString=n=>typeof n=="string"?n:n?.message})(J||(J={}));var _e=class{constructor(n,s,r,a){this._cachedPath=[],this.parent=n,this.data=s,this._path=r,this._key=a}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},Ei=(t,n)=>{if(it(n))return{success:!0,data:n.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let s=new Te(t.common.issues);return this._error=s,this._error}}};function re(t){if(!t)return{};let{errorMap:n,invalid_type_error:s,required_error:r,description:a}=t;if(n&&(s||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return n?{errorMap:n,description:a}:{errorMap:(i,l)=>{let{message:c}=t;return i.code==="invalid_enum_value"?{message:c??l.defaultError}:typeof l.data>"u"?{message:c??r??l.defaultError}:i.code!=="invalid_type"?{message:l.defaultError}:{message:c??s??l.defaultError}},description:a}}var ae=class{get description(){return this._def.description}_getType(n){return ze(n.data)}_getOrReturnCtx(n,s){return s||{common:n.parent.common,data:n.data,parsedType:ze(n.data),schemaErrorMap:this._def.errorMap,path:n.path,parent:n.parent}}_processInputParams(n){return{status:new we,ctx:{common:n.parent.common,data:n.data,parsedType:ze(n.data),schemaErrorMap:this._def.errorMap,path:n.path,parent:n.parent}}}_parseSync(n){let s=this._parse(n);if(Jt(s))throw new Error("Synchronous parse encountered promise.");return s}_parseAsync(n){let s=this._parse(n);return Promise.resolve(s)}parse(n,s){let r=this.safeParse(n,s);if(r.success)return r.data;throw r.error}safeParse(n,s){let r={common:{issues:[],async:s?.async??!1,contextualErrorMap:s?.errorMap},path:s?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:ze(n)},a=this._parseSync({data:n,path:r.path,parent:r});return Ei(r,a)}"~validate"(n){let s={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:ze(n)};if(!this["~standard"].async)try{let r=this._parseSync({data:n,path:[],parent:s});return it(r)?{value:r.value}:{issues:s.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),s.common={issues:[],async:!0}}return this._parseAsync({data:n,path:[],parent:s}).then(r=>it(r)?{value:r.value}:{issues:s.common.issues})}async parseAsync(n,s){let r=await this.safeParseAsync(n,s);if(r.success)return r.data;throw r.error}async safeParseAsync(n,s){let r={common:{issues:[],contextualErrorMap:s?.errorMap,async:!0},path:s?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:n,parsedType:ze(n)},a=this._parse({data:n,path:r.path,parent:r}),o=await(Jt(a)?a:Promise.resolve(a));return Ei(r,o)}refine(n,s){let r=a=>typeof s=="string"||typeof s>"u"?{message:s}:typeof s=="function"?s(a):s;return this._refinement((a,o)=>{let i=n(a),l=()=>o.addIssue({code:Z.custom,...r(a)});return typeof Promise<"u"&&i instanceof Promise?i.then(c=>c?!0:(l(),!1)):i?!0:(l(),!1)})}refinement(n,s){return this._refinement((r,a)=>n(r)?!0:(a.addIssue(typeof s=="function"?s(r,a):s),!1))}_refinement(n){return new De({schema:this,typeName:ne.ZodEffects,effect:{type:"refinement",refinement:n}})}superRefine(n){return this._refinement(n)}constructor(n){this.spa=this.safeParseAsync,this._def=n,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:s=>this["~validate"](s)}}optional(){return Ie.create(this,this._def)}nullable(){return je.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return tt.create(this)}promise(){return ut.create(this,this._def)}or(n){return Rt.create([this,n],this._def)}and(n){return Et.create(this,n,this._def)}transform(n){return new De({...re(this._def),schema:this,typeName:ne.ZodEffects,effect:{type:"transform",transform:n}})}default(n){let s=typeof n=="function"?n:()=>n;return new Mt({...re(this._def),innerType:this,defaultValue:s,typeName:ne.ZodDefault})}brand(){return new On({typeName:ne.ZodBranded,type:this,...re(this._def)})}catch(n){let s=typeof n=="function"?n:()=>n;return new $t({...re(this._def),innerType:this,catchValue:s,typeName:ne.ZodCatch})}describe(n){let s=this.constructor;return new s({...this._def,description:n})}pipe(n){return Vn.create(this,n)}readonly(){return At.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},Pd=/^c[^\s-]{8,}$/i,Md=/^[0-9a-z]+$/,$d=/^[0-9A-HJKMNP-TV-Z]{26}$/i,Ad=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Ld=/^[a-z0-9_-]{21}$/i,Fd=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Nd=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Od=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Vd="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",Er,Bd=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,zd=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Hd=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,jd=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Zd=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Ud=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,_i="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Gd=new RegExp(`^${_i}$`);function Di(t){let n="[0-5]\\d";t.precision?n=`${n}\\.\\d{${t.precision}}`:t.precision==null&&(n=`${n}(\\.\\d+)?`);let s=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${n})${s}`}function Wd(t){return new RegExp(`^${Di(t)}$`)}function Pi(t){let n=`${_i}T${Di(t)}`,s=[];return s.push(t.local?"Z?":"Z"),t.offset&&s.push("([+-]\\d{2}:?\\d{2})"),n=`${n}(${s.join("|")})`,new RegExp(`^${n}$`)}function qd(t,n){return!!((n==="v4"||!n)&&Bd.test(t)||(n==="v6"||!n)&&Hd.test(t))}function Kd(t,n){if(!Fd.test(t))return!1;try{let[s]=t.split(".");if(!s)return!1;let r=s.replace(/-/g,"+").replace(/_/g,"/").padEnd(s.length+(4-s.length%4)%4,"="),a=JSON.parse(atob(r));return!(typeof a!="object"||a===null||"typ"in a&&a?.typ!=="JWT"||!a.alg||n&&a.alg!==n)}catch{return!1}}function Yd(t,n){return!!((n==="v4"||!n)&&zd.test(t)||(n==="v6"||!n)&&jd.test(t))}var lt=class t extends ae{_parse(n){if(this._def.coerce&&(n.data=String(n.data)),this._getType(n)!==Y.string){let o=this._getOrReturnCtx(n);return W(o,{code:Z.invalid_type,expected:Y.string,received:o.parsedType}),ee}let r=new we,a;for(let o of this._def.checks)if(o.kind==="min")n.data.length<o.value&&(a=this._getOrReturnCtx(n,a),W(a,{code:Z.too_small,minimum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="max")n.data.length>o.value&&(a=this._getOrReturnCtx(n,a),W(a,{code:Z.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="length"){let i=n.data.length>o.value,l=n.data.length<o.value;(i||l)&&(a=this._getOrReturnCtx(n,a),i?W(a,{code:Z.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!0,message:o.message}):l&&W(a,{code:Z.too_small,minimum:o.value,type:"string",inclusive:!0,exact:!0,message:o.message}),r.dirty())}else if(o.kind==="email")Od.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"email",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="emoji")Er||(Er=new RegExp(Vd,"u")),Er.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"emoji",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="uuid")Ad.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"uuid",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="nanoid")Ld.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"nanoid",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="cuid")Pd.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"cuid",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="cuid2")Md.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"cuid2",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="ulid")$d.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"ulid",code:Z.invalid_string,message:o.message}),r.dirty());else if(o.kind==="url")try{new URL(n.data)}catch{a=this._getOrReturnCtx(n,a),W(a,{validation:"url",code:Z.invalid_string,message:o.message}),r.dirty()}else o.kind==="regex"?(o.regex.lastIndex=0,o.regex.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"regex",code:Z.invalid_string,message:o.message}),r.dirty())):o.kind==="trim"?n.data=n.data.trim():o.kind==="includes"?n.data.includes(o.value,o.position)||(a=this._getOrReturnCtx(n,a),W(a,{code:Z.invalid_string,validation:{includes:o.value,position:o.position},message:o.message}),r.dirty()):o.kind==="toLowerCase"?n.data=n.data.toLowerCase():o.kind==="toUpperCase"?n.data=n.data.toUpperCase():o.kind==="startsWith"?n.data.startsWith(o.value)||(a=this._getOrReturnCtx(n,a),W(a,{code:Z.invalid_string,validation:{startsWith:o.value},message:o.message}),r.dirty()):o.kind==="endsWith"?n.data.endsWith(o.value)||(a=this._getOrReturnCtx(n,a),W(a,{code:Z.invalid_string,validation:{endsWith:o.value},message:o.message}),r.dirty()):o.kind==="datetime"?Pi(o).test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{code:Z.invalid_string,validation:"datetime",message:o.message}),r.dirty()):o.kind==="date"?Gd.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{code:Z.invalid_string,validation:"date",message:o.message}),r.dirty()):o.kind==="time"?Wd(o).test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{code:Z.invalid_string,validation:"time",message:o.message}),r.dirty()):o.kind==="duration"?Nd.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"duration",code:Z.invalid_string,message:o.message}),r.dirty()):o.kind==="ip"?qd(n.data,o.version)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"ip",code:Z.invalid_string,message:o.message}),r.dirty()):o.kind==="jwt"?Kd(n.data,o.alg)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"jwt",code:Z.invalid_string,message:o.message}),r.dirty()):o.kind==="cidr"?Yd(n.data,o.version)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"cidr",code:Z.invalid_string,message:o.message}),r.dirty()):o.kind==="base64"?Zd.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"base64",code:Z.invalid_string,message:o.message}),r.dirty()):o.kind==="base64url"?Ud.test(n.data)||(a=this._getOrReturnCtx(n,a),W(a,{validation:"base64url",code:Z.invalid_string,message:o.message}),r.dirty()):oe.assertNever(o);return{status:r.value,value:n.data}}_regex(n,s,r){return this.refinement(a=>n.test(a),{validation:s,code:Z.invalid_string,...J.errToObj(r)})}_addCheck(n){return new t({...this._def,checks:[...this._def.checks,n]})}email(n){return this._addCheck({kind:"email",...J.errToObj(n)})}url(n){return this._addCheck({kind:"url",...J.errToObj(n)})}emoji(n){return this._addCheck({kind:"emoji",...J.errToObj(n)})}uuid(n){return this._addCheck({kind:"uuid",...J.errToObj(n)})}nanoid(n){return this._addCheck({kind:"nanoid",...J.errToObj(n)})}cuid(n){return this._addCheck({kind:"cuid",...J.errToObj(n)})}cuid2(n){return this._addCheck({kind:"cuid2",...J.errToObj(n)})}ulid(n){return this._addCheck({kind:"ulid",...J.errToObj(n)})}base64(n){return this._addCheck({kind:"base64",...J.errToObj(n)})}base64url(n){return this._addCheck({kind:"base64url",...J.errToObj(n)})}jwt(n){return this._addCheck({kind:"jwt",...J.errToObj(n)})}ip(n){return this._addCheck({kind:"ip",...J.errToObj(n)})}cidr(n){return this._addCheck({kind:"cidr",...J.errToObj(n)})}datetime(n){return typeof n=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:n}):this._addCheck({kind:"datetime",precision:typeof n?.precision>"u"?null:n?.precision,offset:n?.offset??!1,local:n?.local??!1,...J.errToObj(n?.message)})}date(n){return this._addCheck({kind:"date",message:n})}time(n){return typeof n=="string"?this._addCheck({kind:"time",precision:null,message:n}):this._addCheck({kind:"time",precision:typeof n?.precision>"u"?null:n?.precision,...J.errToObj(n?.message)})}duration(n){return this._addCheck({kind:"duration",...J.errToObj(n)})}regex(n,s){return this._addCheck({kind:"regex",regex:n,...J.errToObj(s)})}includes(n,s){return this._addCheck({kind:"includes",value:n,position:s?.position,...J.errToObj(s?.message)})}startsWith(n,s){return this._addCheck({kind:"startsWith",value:n,...J.errToObj(s)})}endsWith(n,s){return this._addCheck({kind:"endsWith",value:n,...J.errToObj(s)})}min(n,s){return this._addCheck({kind:"min",value:n,...J.errToObj(s)})}max(n,s){return this._addCheck({kind:"max",value:n,...J.errToObj(s)})}length(n,s){return this._addCheck({kind:"length",value:n,...J.errToObj(s)})}nonempty(n){return this.min(1,J.errToObj(n))}trim(){return new t({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new t({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(n=>n.kind==="datetime")}get isDate(){return!!this._def.checks.find(n=>n.kind==="date")}get isTime(){return!!this._def.checks.find(n=>n.kind==="time")}get isDuration(){return!!this._def.checks.find(n=>n.kind==="duration")}get isEmail(){return!!this._def.checks.find(n=>n.kind==="email")}get isURL(){return!!this._def.checks.find(n=>n.kind==="url")}get isEmoji(){return!!this._def.checks.find(n=>n.kind==="emoji")}get isUUID(){return!!this._def.checks.find(n=>n.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(n=>n.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(n=>n.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(n=>n.kind==="cuid2")}get isULID(){return!!this._def.checks.find(n=>n.kind==="ulid")}get isIP(){return!!this._def.checks.find(n=>n.kind==="ip")}get isCIDR(){return!!this._def.checks.find(n=>n.kind==="cidr")}get isBase64(){return!!this._def.checks.find(n=>n.kind==="base64")}get isBase64url(){return!!this._def.checks.find(n=>n.kind==="base64url")}get minLength(){let n=null;for(let s of this._def.checks)s.kind==="min"&&(n===null||s.value>n)&&(n=s.value);return n}get maxLength(){let n=null;for(let s of this._def.checks)s.kind==="max"&&(n===null||s.value<n)&&(n=s.value);return n}};lt.create=t=>new lt({checks:[],typeName:ne.ZodString,coerce:t?.coerce??!1,...re(t)});function Xd(t,n){let s=(t.toString().split(".")[1]||"").length,r=(n.toString().split(".")[1]||"").length,a=s>r?s:r,o=Number.parseInt(t.toFixed(a).replace(".","")),i=Number.parseInt(n.toFixed(a).replace(".",""));return o%i/10**a}var kt=class t extends ae{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(n){if(this._def.coerce&&(n.data=Number(n.data)),this._getType(n)!==Y.number){let o=this._getOrReturnCtx(n);return W(o,{code:Z.invalid_type,expected:Y.number,received:o.parsedType}),ee}let r,a=new we;for(let o of this._def.checks)o.kind==="int"?oe.isInteger(n.data)||(r=this._getOrReturnCtx(n,r),W(r,{code:Z.invalid_type,expected:"integer",received:"float",message:o.message}),a.dirty()):o.kind==="min"?(o.inclusive?n.data<o.value:n.data<=o.value)&&(r=this._getOrReturnCtx(n,r),W(r,{code:Z.too_small,minimum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty()):o.kind==="max"?(o.inclusive?n.data>o.value:n.data>=o.value)&&(r=this._getOrReturnCtx(n,r),W(r,{code:Z.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty()):o.kind==="multipleOf"?Xd(n.data,o.value)!==0&&(r=this._getOrReturnCtx(n,r),W(r,{code:Z.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):o.kind==="finite"?Number.isFinite(n.data)||(r=this._getOrReturnCtx(n,r),W(r,{code:Z.not_finite,message:o.message}),a.dirty()):oe.assertNever(o);return{status:a.value,value:n.data}}gte(n,s){return this.setLimit("min",n,!0,J.toString(s))}gt(n,s){return this.setLimit("min",n,!1,J.toString(s))}lte(n,s){return this.setLimit("max",n,!0,J.toString(s))}lt(n,s){return this.setLimit("max",n,!1,J.toString(s))}setLimit(n,s,r,a){return new t({...this._def,checks:[...this._def.checks,{kind:n,value:s,inclusive:r,message:J.toString(a)}]})}_addCheck(n){return new t({...this._def,checks:[...this._def.checks,n]})}int(n){return this._addCheck({kind:"int",message:J.toString(n)})}positive(n){return this._addCheck({kind:"min",value:0,inclusive:!1,message:J.toString(n)})}negative(n){return this._addCheck({kind:"max",value:0,inclusive:!1,message:J.toString(n)})}nonpositive(n){return this._addCheck({kind:"max",value:0,inclusive:!0,message:J.toString(n)})}nonnegative(n){return this._addCheck({kind:"min",value:0,inclusive:!0,message:J.toString(n)})}multipleOf(n,s){return this._addCheck({kind:"multipleOf",value:n,message:J.toString(s)})}finite(n){return this._addCheck({kind:"finite",message:J.toString(n)})}safe(n){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:J.toString(n)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:J.toString(n)})}get minValue(){let n=null;for(let s of this._def.checks)s.kind==="min"&&(n===null||s.value>n)&&(n=s.value);return n}get maxValue(){let n=null;for(let s of this._def.checks)s.kind==="max"&&(n===null||s.value<n)&&(n=s.value);return n}get isInt(){return!!this._def.checks.find(n=>n.kind==="int"||n.kind==="multipleOf"&&oe.isInteger(n.value))}get isFinite(){let n=null,s=null;for(let r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(s===null||r.value>s)&&(s=r.value):r.kind==="max"&&(n===null||r.value<n)&&(n=r.value)}return Number.isFinite(s)&&Number.isFinite(n)}};kt.create=t=>new kt({checks:[],typeName:ne.ZodNumber,coerce:t?.coerce||!1,...re(t)});var wt=class t extends ae{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(n){if(this._def.coerce)try{n.data=BigInt(n.data)}catch{return this._getInvalidInput(n)}if(this._getType(n)!==Y.bigint)return this._getInvalidInput(n);let r,a=new we;for(let o of this._def.checks)o.kind==="min"?(o.inclusive?n.data<o.value:n.data<=o.value)&&(r=this._getOrReturnCtx(n,r),W(r,{code:Z.too_small,type:"bigint",minimum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty()):o.kind==="max"?(o.inclusive?n.data>o.value:n.data>=o.value)&&(r=this._getOrReturnCtx(n,r),W(r,{code:Z.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty()):o.kind==="multipleOf"?n.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(n,r),W(r,{code:Z.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):oe.assertNever(o);return{status:a.value,value:n.data}}_getInvalidInput(n){let s=this._getOrReturnCtx(n);return W(s,{code:Z.invalid_type,expected:Y.bigint,received:s.parsedType}),ee}gte(n,s){return this.setLimit("min",n,!0,J.toString(s))}gt(n,s){return this.setLimit("min",n,!1,J.toString(s))}lte(n,s){return this.setLimit("max",n,!0,J.toString(s))}lt(n,s){return this.setLimit("max",n,!1,J.toString(s))}setLimit(n,s,r,a){return new t({...this._def,checks:[...this._def.checks,{kind:n,value:s,inclusive:r,message:J.toString(a)}]})}_addCheck(n){return new t({...this._def,checks:[...this._def.checks,n]})}positive(n){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:J.toString(n)})}negative(n){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:J.toString(n)})}nonpositive(n){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:J.toString(n)})}nonnegative(n){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:J.toString(n)})}multipleOf(n,s){return this._addCheck({kind:"multipleOf",value:n,message:J.toString(s)})}get minValue(){let n=null;for(let s of this._def.checks)s.kind==="min"&&(n===null||s.value>n)&&(n=s.value);return n}get maxValue(){let n=null;for(let s of this._def.checks)s.kind==="max"&&(n===null||s.value<n)&&(n=s.value);return n}};wt.create=t=>new wt({checks:[],typeName:ne.ZodBigInt,coerce:t?.coerce??!1,...re(t)});var xt=class extends ae{_parse(n){if(this._def.coerce&&(n.data=!!n.data),this._getType(n)!==Y.boolean){let r=this._getOrReturnCtx(n);return W(r,{code:Z.invalid_type,expected:Y.boolean,received:r.parsedType}),ee}return xe(n.data)}};xt.create=t=>new xt({typeName:ne.ZodBoolean,coerce:t?.coerce||!1,...re(t)});var St=class t extends ae{_parse(n){if(this._def.coerce&&(n.data=new Date(n.data)),this._getType(n)!==Y.date){let o=this._getOrReturnCtx(n);return W(o,{code:Z.invalid_type,expected:Y.date,received:o.parsedType}),ee}if(Number.isNaN(n.data.getTime())){let o=this._getOrReturnCtx(n);return W(o,{code:Z.invalid_date}),ee}let r=new we,a;for(let o of this._def.checks)o.kind==="min"?n.data.getTime()<o.value&&(a=this._getOrReturnCtx(n,a),W(a,{code:Z.too_small,message:o.message,inclusive:!0,exact:!1,minimum:o.value,type:"date"}),r.dirty()):o.kind==="max"?n.data.getTime()>o.value&&(a=this._getOrReturnCtx(n,a),W(a,{code:Z.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),r.dirty()):oe.assertNever(o);return{status:r.value,value:new Date(n.data.getTime())}}_addCheck(n){return new t({...this._def,checks:[...this._def.checks,n]})}min(n,s){return this._addCheck({kind:"min",value:n.getTime(),message:J.toString(s)})}max(n,s){return this._addCheck({kind:"max",value:n.getTime(),message:J.toString(s)})}get minDate(){let n=null;for(let s of this._def.checks)s.kind==="min"&&(n===null||s.value>n)&&(n=s.value);return n!=null?new Date(n):null}get maxDate(){let n=null;for(let s of this._def.checks)s.kind==="max"&&(n===null||s.value<n)&&(n=s.value);return n!=null?new Date(n):null}};St.create=t=>new St({checks:[],coerce:t?.coerce||!1,typeName:ne.ZodDate,...re(t)});var en=class extends ae{_parse(n){if(this._getType(n)!==Y.symbol){let r=this._getOrReturnCtx(n);return W(r,{code:Z.invalid_type,expected:Y.symbol,received:r.parsedType}),ee}return xe(n.data)}};en.create=t=>new en({typeName:ne.ZodSymbol,...re(t)});var Ct=class extends ae{_parse(n){if(this._getType(n)!==Y.undefined){let r=this._getOrReturnCtx(n);return W(r,{code:Z.invalid_type,expected:Y.undefined,received:r.parsedType}),ee}return xe(n.data)}};Ct.create=t=>new Ct({typeName:ne.ZodUndefined,...re(t)});var Tt=class extends ae{_parse(n){if(this._getType(n)!==Y.null){let r=this._getOrReturnCtx(n);return W(r,{code:Z.invalid_type,expected:Y.null,received:r.parsedType}),ee}return xe(n.data)}};Tt.create=t=>new Tt({typeName:ne.ZodNull,...re(t)});var ct=class extends ae{constructor(){super(...arguments),this._any=!0}_parse(n){return xe(n.data)}};ct.create=t=>new ct({typeName:ne.ZodAny,...re(t)});var et=class extends ae{constructor(){super(...arguments),this._unknown=!0}_parse(n){return xe(n.data)}};et.create=t=>new et({typeName:ne.ZodUnknown,...re(t)});var Le=class extends ae{_parse(n){let s=this._getOrReturnCtx(n);return W(s,{code:Z.invalid_type,expected:Y.never,received:s.parsedType}),ee}};Le.create=t=>new Le({typeName:ne.ZodNever,...re(t)});var tn=class extends ae{_parse(n){if(this._getType(n)!==Y.undefined){let r=this._getOrReturnCtx(n);return W(r,{code:Z.invalid_type,expected:Y.void,received:r.parsedType}),ee}return xe(n.data)}};tn.create=t=>new tn({typeName:ne.ZodVoid,...re(t)});var tt=class t extends ae{_parse(n){let{ctx:s,status:r}=this._processInputParams(n),a=this._def;if(s.parsedType!==Y.array)return W(s,{code:Z.invalid_type,expected:Y.array,received:s.parsedType}),ee;if(a.exactLength!==null){let i=s.data.length>a.exactLength.value,l=s.data.length<a.exactLength.value;(i||l)&&(W(s,{code:i?Z.too_big:Z.too_small,minimum:l?a.exactLength.value:void 0,maximum:i?a.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:a.exactLength.message}),r.dirty())}if(a.minLength!==null&&s.data.length<a.minLength.value&&(W(s,{code:Z.too_small,minimum:a.minLength.value,type:"array",inclusive:!0,exact:!1,message:a.minLength.message}),r.dirty()),a.maxLength!==null&&s.data.length>a.maxLength.value&&(W(s,{code:Z.too_big,maximum:a.maxLength.value,type:"array",inclusive:!0,exact:!1,message:a.maxLength.message}),r.dirty()),s.common.async)return Promise.all([...s.data].map((i,l)=>a.type._parseAsync(new _e(s,i,s.path,l)))).then(i=>we.mergeArray(r,i));let o=[...s.data].map((i,l)=>a.type._parseSync(new _e(s,i,s.path,l)));return we.mergeArray(r,o)}get element(){return this._def.type}min(n,s){return new t({...this._def,minLength:{value:n,message:J.toString(s)}})}max(n,s){return new t({...this._def,maxLength:{value:n,message:J.toString(s)}})}length(n,s){return new t({...this._def,exactLength:{value:n,message:J.toString(s)}})}nonempty(n){return this.min(1,n)}};tt.create=(t,n)=>new tt({type:t,minLength:null,maxLength:null,exactLength:null,typeName:ne.ZodArray,...re(n)});function Qt(t){if(t instanceof Re){let n={};for(let s in t.shape){let r=t.shape[s];n[s]=Ie.create(Qt(r))}return new Re({...t._def,shape:()=>n})}else return t instanceof tt?new tt({...t._def,type:Qt(t.element)}):t instanceof Ie?Ie.create(Qt(t.unwrap())):t instanceof je?je.create(Qt(t.unwrap())):t instanceof He?He.create(t.items.map(n=>Qt(n))):t}var Re=class t extends ae{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let n=this._def.shape(),s=oe.objectKeys(n);return this._cached={shape:n,keys:s},this._cached}_parse(n){if(this._getType(n)!==Y.object){let u=this._getOrReturnCtx(n);return W(u,{code:Z.invalid_type,expected:Y.object,received:u.parsedType}),ee}let{status:r,ctx:a}=this._processInputParams(n),{shape:o,keys:i}=this._getCached(),l=[];if(!(this._def.catchall instanceof Le&&this._def.unknownKeys==="strip"))for(let u in a.data)i.includes(u)||l.push(u);let c=[];for(let u of i){let d=o[u],p=a.data[u];c.push({key:{status:"valid",value:u},value:d._parse(new _e(a,p,a.path,u)),alwaysSet:u in a.data})}if(this._def.catchall instanceof Le){let u=this._def.unknownKeys;if(u==="passthrough")for(let d of l)c.push({key:{status:"valid",value:d},value:{status:"valid",value:a.data[d]}});else if(u==="strict")l.length>0&&(W(a,{code:Z.unrecognized_keys,keys:l}),r.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let u=this._def.catchall;for(let d of l){let p=a.data[d];c.push({key:{status:"valid",value:d},value:u._parse(new _e(a,p,a.path,d)),alwaysSet:d in a.data})}}return a.common.async?Promise.resolve().then(async()=>{let u=[];for(let d of c){let p=await d.key,m=await d.value;u.push({key:p,value:m,alwaysSet:d.alwaysSet})}return u}).then(u=>we.mergeObjectSync(r,u)):we.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(n){return J.errToObj,new t({...this._def,unknownKeys:"strict",...n!==void 0?{errorMap:(s,r)=>{let a=this._def.errorMap?.(s,r).message??r.defaultError;return s.code==="unrecognized_keys"?{message:J.errToObj(n).message??a}:{message:a}}}:{}})}strip(){return new t({...this._def,unknownKeys:"strip"})}passthrough(){return new t({...this._def,unknownKeys:"passthrough"})}extend(n){return new t({...this._def,shape:()=>({...this._def.shape(),...n})})}merge(n){return new t({unknownKeys:n._def.unknownKeys,catchall:n._def.catchall,shape:()=>({...this._def.shape(),...n._def.shape()}),typeName:ne.ZodObject})}setKey(n,s){return this.augment({[n]:s})}catchall(n){return new t({...this._def,catchall:n})}pick(n){let s={};for(let r of oe.objectKeys(n))n[r]&&this.shape[r]&&(s[r]=this.shape[r]);return new t({...this._def,shape:()=>s})}omit(n){let s={};for(let r of oe.objectKeys(this.shape))n[r]||(s[r]=this.shape[r]);return new t({...this._def,shape:()=>s})}deepPartial(){return Qt(this)}partial(n){let s={};for(let r of oe.objectKeys(this.shape)){let a=this.shape[r];n&&!n[r]?s[r]=a:s[r]=a.optional()}return new t({...this._def,shape:()=>s})}required(n){let s={};for(let r of oe.objectKeys(this.shape))if(n&&!n[r])s[r]=this.shape[r];else{let o=this.shape[r];for(;o instanceof Ie;)o=o._def.innerType;s[r]=o}return new t({...this._def,shape:()=>s})}keyof(){return Mi(oe.objectKeys(this.shape))}};Re.create=(t,n)=>new Re({shape:()=>t,unknownKeys:"strip",catchall:Le.create(),typeName:ne.ZodObject,...re(n)});Re.strictCreate=(t,n)=>new Re({shape:()=>t,unknownKeys:"strict",catchall:Le.create(),typeName:ne.ZodObject,...re(n)});Re.lazycreate=(t,n)=>new Re({shape:t,unknownKeys:"strip",catchall:Le.create(),typeName:ne.ZodObject,...re(n)});var Rt=class extends ae{_parse(n){let{ctx:s}=this._processInputParams(n),r=this._def.options;function a(o){for(let l of o)if(l.result.status==="valid")return l.result;for(let l of o)if(l.result.status==="dirty")return s.common.issues.push(...l.ctx.common.issues),l.result;let i=o.map(l=>new Te(l.ctx.common.issues));return W(s,{code:Z.invalid_union,unionErrors:i}),ee}if(s.common.async)return Promise.all(r.map(async o=>{let i={...s,common:{...s.common,issues:[]},parent:null};return{result:await o._parseAsync({data:s.data,path:s.path,parent:i}),ctx:i}})).then(a);{let o,i=[];for(let c of r){let u={...s,common:{...s.common,issues:[]},parent:null},d=c._parseSync({data:s.data,path:s.path,parent:u});if(d.status==="valid")return d;d.status==="dirty"&&!o&&(o={result:d,ctx:u}),u.common.issues.length&&i.push(u.common.issues)}if(o)return s.common.issues.push(...o.ctx.common.issues),o.result;let l=i.map(c=>new Te(c));return W(s,{code:Z.invalid_union,unionErrors:l}),ee}}get options(){return this._def.options}};Rt.create=(t,n)=>new Rt({options:t,typeName:ne.ZodUnion,...re(n)});var Qe=t=>t instanceof It?Qe(t.schema):t instanceof De?Qe(t.innerType()):t instanceof _t?[t.value]:t instanceof Dt?t.options:t instanceof Pt?oe.objectValues(t.enum):t instanceof Mt?Qe(t._def.innerType):t instanceof Ct?[void 0]:t instanceof Tt?[null]:t instanceof Ie?[void 0,...Qe(t.unwrap())]:t instanceof je?[null,...Qe(t.unwrap())]:t instanceof On||t instanceof At?Qe(t.unwrap()):t instanceof $t?Qe(t._def.innerType):[],ks=class t extends ae{_parse(n){let{ctx:s}=this._processInputParams(n);if(s.parsedType!==Y.object)return W(s,{code:Z.invalid_type,expected:Y.object,received:s.parsedType}),ee;let r=this.discriminator,a=s.data[r],o=this.optionsMap.get(a);return o?s.common.async?o._parseAsync({data:s.data,path:s.path,parent:s}):o._parseSync({data:s.data,path:s.path,parent:s}):(W(s,{code:Z.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),ee)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(n,s,r){let a=new Map;for(let o of s){let i=Qe(o.shape[n]);if(!i.length)throw new Error(`A discriminator value for key \`${n}\` could not be extracted from all schema options`);for(let l of i){if(a.has(l))throw new Error(`Discriminator property ${String(n)} has duplicate value ${String(l)}`);a.set(l,o)}}return new t({typeName:ne.ZodDiscriminatedUnion,discriminator:n,options:s,optionsMap:a,...re(r)})}};function Ir(t,n){let s=ze(t),r=ze(n);if(t===n)return{valid:!0,data:t};if(s===Y.object&&r===Y.object){let a=oe.objectKeys(n),o=oe.objectKeys(t).filter(l=>a.indexOf(l)!==-1),i={...t,...n};for(let l of o){let c=Ir(t[l],n[l]);if(!c.valid)return{valid:!1};i[l]=c.data}return{valid:!0,data:i}}else if(s===Y.array&&r===Y.array){if(t.length!==n.length)return{valid:!1};let a=[];for(let o=0;o<t.length;o++){let i=t[o],l=n[o],c=Ir(i,l);if(!c.valid)return{valid:!1};a.push(c.data)}return{valid:!0,data:a}}else return s===Y.date&&r===Y.date&&+t==+n?{valid:!0,data:t}:{valid:!1}}var Et=class extends ae{_parse(n){let{status:s,ctx:r}=this._processInputParams(n),a=(o,i)=>{if(bs(o)||bs(i))return ee;let l=Ir(o.value,i.value);return l.valid?((ys(o)||ys(i))&&s.dirty(),{status:s.value,value:l.data}):(W(r,{code:Z.invalid_intersection_types}),ee)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,i])=>a(o,i)):a(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}};Et.create=(t,n,s)=>new Et({left:t,right:n,typeName:ne.ZodIntersection,...re(s)});var He=class t extends ae{_parse(n){let{status:s,ctx:r}=this._processInputParams(n);if(r.parsedType!==Y.array)return W(r,{code:Z.invalid_type,expected:Y.array,received:r.parsedType}),ee;if(r.data.length<this._def.items.length)return W(r,{code:Z.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),ee;!this._def.rest&&r.data.length>this._def.items.length&&(W(r,{code:Z.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),s.dirty());let o=[...r.data].map((i,l)=>{let c=this._def.items[l]||this._def.rest;return c?c._parse(new _e(r,i,r.path,l)):null}).filter(i=>!!i);return r.common.async?Promise.all(o).then(i=>we.mergeArray(s,i)):we.mergeArray(s,o)}get items(){return this._def.items}rest(n){return new t({...this._def,rest:n})}};He.create=(t,n)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new He({items:t,typeName:ne.ZodTuple,rest:null,...re(n)})};var ws=class t extends ae{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(n){let{status:s,ctx:r}=this._processInputParams(n);if(r.parsedType!==Y.object)return W(r,{code:Z.invalid_type,expected:Y.object,received:r.parsedType}),ee;let a=[],o=this._def.keyType,i=this._def.valueType;for(let l in r.data)a.push({key:o._parse(new _e(r,l,r.path,l)),value:i._parse(new _e(r,r.data[l],r.path,l)),alwaysSet:l in r.data});return r.common.async?we.mergeObjectAsync(s,a):we.mergeObjectSync(s,a)}get element(){return this._def.valueType}static create(n,s,r){return s instanceof ae?new t({keyType:n,valueType:s,typeName:ne.ZodRecord,...re(r)}):new t({keyType:lt.create(),valueType:n,typeName:ne.ZodRecord,...re(s)})}},nn=class extends ae{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(n){let{status:s,ctx:r}=this._processInputParams(n);if(r.parsedType!==Y.map)return W(r,{code:Z.invalid_type,expected:Y.map,received:r.parsedType}),ee;let a=this._def.keyType,o=this._def.valueType,i=[...r.data.entries()].map(([l,c],u)=>({key:a._parse(new _e(r,l,r.path,[u,"key"])),value:o._parse(new _e(r,c,r.path,[u,"value"]))}));if(r.common.async){let l=new Map;return Promise.resolve().then(async()=>{for(let c of i){let u=await c.key,d=await c.value;if(u.status==="aborted"||d.status==="aborted")return ee;(u.status==="dirty"||d.status==="dirty")&&s.dirty(),l.set(u.value,d.value)}return{status:s.value,value:l}})}else{let l=new Map;for(let c of i){let u=c.key,d=c.value;if(u.status==="aborted"||d.status==="aborted")return ee;(u.status==="dirty"||d.status==="dirty")&&s.dirty(),l.set(u.value,d.value)}return{status:s.value,value:l}}}};nn.create=(t,n,s)=>new nn({valueType:n,keyType:t,typeName:ne.ZodMap,...re(s)});var sn=class t extends ae{_parse(n){let{status:s,ctx:r}=this._processInputParams(n);if(r.parsedType!==Y.set)return W(r,{code:Z.invalid_type,expected:Y.set,received:r.parsedType}),ee;let a=this._def;a.minSize!==null&&r.data.size<a.minSize.value&&(W(r,{code:Z.too_small,minimum:a.minSize.value,type:"set",inclusive:!0,exact:!1,message:a.minSize.message}),s.dirty()),a.maxSize!==null&&r.data.size>a.maxSize.value&&(W(r,{code:Z.too_big,maximum:a.maxSize.value,type:"set",inclusive:!0,exact:!1,message:a.maxSize.message}),s.dirty());let o=this._def.valueType;function i(c){let u=new Set;for(let d of c){if(d.status==="aborted")return ee;d.status==="dirty"&&s.dirty(),u.add(d.value)}return{status:s.value,value:u}}let l=[...r.data.values()].map((c,u)=>o._parse(new _e(r,c,r.path,u)));return r.common.async?Promise.all(l).then(c=>i(c)):i(l)}min(n,s){return new t({...this._def,minSize:{value:n,message:J.toString(s)}})}max(n,s){return new t({...this._def,maxSize:{value:n,message:J.toString(s)}})}size(n,s){return this.min(n,s).max(n,s)}nonempty(n){return this.min(1,n)}};sn.create=(t,n)=>new sn({valueType:t,minSize:null,maxSize:null,typeName:ne.ZodSet,...re(n)});var xs=class t extends ae{constructor(){super(...arguments),this.validate=this.implement}_parse(n){let{ctx:s}=this._processInputParams(n);if(s.parsedType!==Y.function)return W(s,{code:Z.invalid_type,expected:Y.function,received:s.parsedType}),ee;function r(l,c){return Nn({data:l,path:s.path,errorMaps:[s.common.contextualErrorMap,s.schemaErrorMap,Xt(),Je].filter(u=>!!u),issueData:{code:Z.invalid_arguments,argumentsError:c}})}function a(l,c){return Nn({data:l,path:s.path,errorMaps:[s.common.contextualErrorMap,s.schemaErrorMap,Xt(),Je].filter(u=>!!u),issueData:{code:Z.invalid_return_type,returnTypeError:c}})}let o={errorMap:s.common.contextualErrorMap},i=s.data;if(this._def.returns instanceof ut){let l=this;return xe(async function(...c){let u=new Te([]),d=await l._def.args.parseAsync(c,o).catch(f=>{throw u.addIssue(r(c,f)),u}),p=await Reflect.apply(i,this,d);return await l._def.returns._def.type.parseAsync(p,o).catch(f=>{throw u.addIssue(a(p,f)),u})})}else{let l=this;return xe(function(...c){let u=l._def.args.safeParse(c,o);if(!u.success)throw new Te([r(c,u.error)]);let d=Reflect.apply(i,this,u.data),p=l._def.returns.safeParse(d,o);if(!p.success)throw new Te([a(d,p.error)]);return p.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...n){return new t({...this._def,args:He.create(n).rest(et.create())})}returns(n){return new t({...this._def,returns:n})}implement(n){return this.parse(n)}strictImplement(n){return this.parse(n)}static create(n,s,r){return new t({args:n||He.create([]).rest(et.create()),returns:s||et.create(),typeName:ne.ZodFunction,...re(r)})}},It=class extends ae{get schema(){return this._def.getter()}_parse(n){let{ctx:s}=this._processInputParams(n);return this._def.getter()._parse({data:s.data,path:s.path,parent:s})}};It.create=(t,n)=>new It({getter:t,typeName:ne.ZodLazy,...re(n)});var _t=class extends ae{_parse(n){if(n.data!==this._def.value){let s=this._getOrReturnCtx(n);return W(s,{received:s.data,code:Z.invalid_literal,expected:this._def.value}),ee}return{status:"valid",value:n.data}}get value(){return this._def.value}};_t.create=(t,n)=>new _t({value:t,typeName:ne.ZodLiteral,...re(n)});function Mi(t,n){return new Dt({values:t,typeName:ne.ZodEnum,...re(n)})}var Dt=class t extends ae{_parse(n){if(typeof n.data!="string"){let s=this._getOrReturnCtx(n),r=this._def.values;return W(s,{expected:oe.joinValues(r),received:s.parsedType,code:Z.invalid_type}),ee}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(n.data)){let s=this._getOrReturnCtx(n),r=this._def.values;return W(s,{received:s.data,code:Z.invalid_enum_value,options:r}),ee}return xe(n.data)}get options(){return this._def.values}get enum(){let n={};for(let s of this._def.values)n[s]=s;return n}get Values(){let n={};for(let s of this._def.values)n[s]=s;return n}get Enum(){let n={};for(let s of this._def.values)n[s]=s;return n}extract(n,s=this._def){return t.create(n,{...this._def,...s})}exclude(n,s=this._def){return t.create(this.options.filter(r=>!n.includes(r)),{...this._def,...s})}};Dt.create=Mi;var Pt=class extends ae{_parse(n){let s=oe.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(n);if(r.parsedType!==Y.string&&r.parsedType!==Y.number){let a=oe.objectValues(s);return W(r,{expected:oe.joinValues(a),received:r.parsedType,code:Z.invalid_type}),ee}if(this._cache||(this._cache=new Set(oe.getValidEnumValues(this._def.values))),!this._cache.has(n.data)){let a=oe.objectValues(s);return W(r,{received:r.data,code:Z.invalid_enum_value,options:a}),ee}return xe(n.data)}get enum(){return this._def.values}};Pt.create=(t,n)=>new Pt({values:t,typeName:ne.ZodNativeEnum,...re(n)});var ut=class extends ae{unwrap(){return this._def.type}_parse(n){let{ctx:s}=this._processInputParams(n);if(s.parsedType!==Y.promise&&s.common.async===!1)return W(s,{code:Z.invalid_type,expected:Y.promise,received:s.parsedType}),ee;let r=s.parsedType===Y.promise?s.data:Promise.resolve(s.data);return xe(r.then(a=>this._def.type.parseAsync(a,{path:s.path,errorMap:s.common.contextualErrorMap})))}};ut.create=(t,n)=>new ut({type:t,typeName:ne.ZodPromise,...re(n)});var De=class extends ae{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ne.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(n){let{status:s,ctx:r}=this._processInputParams(n),a=this._def.effect||null,o={addIssue:i=>{W(r,i),i.fatal?s.abort():s.dirty()},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),a.type==="preprocess"){let i=a.transform(r.data,o);if(r.common.async)return Promise.resolve(i).then(async l=>{if(s.value==="aborted")return ee;let c=await this._def.schema._parseAsync({data:l,path:r.path,parent:r});return c.status==="aborted"?ee:c.status==="dirty"?yt(c.value):s.value==="dirty"?yt(c.value):c});{if(s.value==="aborted")return ee;let l=this._def.schema._parseSync({data:i,path:r.path,parent:r});return l.status==="aborted"?ee:l.status==="dirty"?yt(l.value):s.value==="dirty"?yt(l.value):l}}if(a.type==="refinement"){let i=l=>{let c=a.refinement(l,o);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return l};if(r.common.async===!1){let l=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return l.status==="aborted"?ee:(l.status==="dirty"&&s.dirty(),i(l.value),{status:s.value,value:l.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(l=>l.status==="aborted"?ee:(l.status==="dirty"&&s.dirty(),i(l.value).then(()=>({status:s.value,value:l.value}))))}if(a.type==="transform")if(r.common.async===!1){let i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!it(i))return ee;let l=a.transform(i.value,o);if(l instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:s.value,value:l}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>it(i)?Promise.resolve(a.transform(i.value,o)).then(l=>({status:s.value,value:l})):ee);oe.assertNever(a)}};De.create=(t,n,s)=>new De({schema:t,typeName:ne.ZodEffects,effect:n,...re(s)});De.createWithPreprocess=(t,n,s)=>new De({schema:n,effect:{type:"preprocess",transform:t},typeName:ne.ZodEffects,...re(s)});var Ie=class extends ae{_parse(n){return this._getType(n)===Y.undefined?xe(void 0):this._def.innerType._parse(n)}unwrap(){return this._def.innerType}};Ie.create=(t,n)=>new Ie({innerType:t,typeName:ne.ZodOptional,...re(n)});var je=class extends ae{_parse(n){return this._getType(n)===Y.null?xe(null):this._def.innerType._parse(n)}unwrap(){return this._def.innerType}};je.create=(t,n)=>new je({innerType:t,typeName:ne.ZodNullable,...re(n)});var Mt=class extends ae{_parse(n){let{ctx:s}=this._processInputParams(n),r=s.data;return s.parsedType===Y.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:s.path,parent:s})}removeDefault(){return this._def.innerType}};Mt.create=(t,n)=>new Mt({innerType:t,typeName:ne.ZodDefault,defaultValue:typeof n.default=="function"?n.default:()=>n.default,...re(n)});var $t=class extends ae{_parse(n){let{ctx:s}=this._processInputParams(n),r={...s,common:{...s.common,issues:[]}},a=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Jt(a)?a.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Te(r.common.issues)},input:r.data})})):{status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Te(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}};$t.create=(t,n)=>new $t({innerType:t,typeName:ne.ZodCatch,catchValue:typeof n.catch=="function"?n.catch:()=>n.catch,...re(n)});var rn=class extends ae{_parse(n){if(this._getType(n)!==Y.nan){let r=this._getOrReturnCtx(n);return W(r,{code:Z.invalid_type,expected:Y.nan,received:r.parsedType}),ee}return{status:"valid",value:n.data}}};rn.create=t=>new rn({typeName:ne.ZodNaN,...re(t)});var Jd=Symbol("zod_brand"),On=class extends ae{_parse(n){let{ctx:s}=this._processInputParams(n),r=s.data;return this._def.type._parse({data:r,path:s.path,parent:s})}unwrap(){return this._def.type}},Vn=class t extends ae{_parse(n){let{status:s,ctx:r}=this._processInputParams(n);if(r.common.async)return(async()=>{let o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?ee:o.status==="dirty"?(s.dirty(),yt(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{let a=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?ee:a.status==="dirty"?(s.dirty(),{status:"dirty",value:a.value}):this._def.out._parseSync({data:a.value,path:r.path,parent:r})}}static create(n,s){return new t({in:n,out:s,typeName:ne.ZodPipeline})}},At=class extends ae{_parse(n){let s=this._def.innerType._parse(n),r=a=>(it(a)&&(a.value=Object.freeze(a.value)),a);return Jt(s)?s.then(a=>r(a)):r(s)}unwrap(){return this._def.innerType}};At.create=(t,n)=>new At({innerType:t,typeName:ne.ZodReadonly,...re(n)});function Ii(t,n){let s=typeof t=="function"?t(n):typeof t=="string"?{message:t}:t;return typeof s=="string"?{message:s}:s}function $i(t,n={},s){return t?ct.create().superRefine((r,a)=>{let o=t(r);if(o instanceof Promise)return o.then(i=>{if(!i){let l=Ii(n,r),c=l.fatal??s??!0;a.addIssue({code:"custom",...l,fatal:c})}});if(!o){let i=Ii(n,r),l=i.fatal??s??!0;a.addIssue({code:"custom",...i,fatal:l})}}):ct.create()}var Qd={object:Re.lazycreate},ne;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(ne||(ne={}));var ep=(t,n={message:`Input not instance of ${t.name}`})=>$i(s=>s instanceof t,n),Ai=lt.create,Li=kt.create,tp=rn.create,np=wt.create,Fi=xt.create,sp=St.create,rp=en.create,ap=Ct.create,op=Tt.create,ip=ct.create,lp=et.create,cp=Le.create,up=tn.create,dp=tt.create,pp=Re.create,fp=Re.strictCreate,mp=Rt.create,gp=ks.create,hp=Et.create,vp=He.create,bp=ws.create,yp=nn.create,kp=sn.create,wp=xs.create,xp=It.create,Sp=_t.create,Cp=Dt.create,Tp=Pt.create,Rp=ut.create,Ep=De.create,Ip=Ie.create,_p=je.create,Dp=De.createWithPreprocess,Pp=Vn.create,Mp=()=>Ai().optional(),$p=()=>Li().optional(),Ap=()=>Fi().optional(),Lp={string:t=>lt.create({...t,coerce:!0}),number:t=>kt.create({...t,coerce:!0}),boolean:t=>xt.create({...t,coerce:!0}),bigint:t=>wt.create({...t,coerce:!0}),date:t=>St.create({...t,coerce:!0})};var Fp=ee;var Np=L.enum(["pending","running","complete","error"]),Op=L.object({status:Np,startedAt:L.string().optional(),completedAt:L.string().optional(),error:L.string().optional(),chunks:L.number().int().positive().optional()}),Vp=L.object({schemaVersion:L.string(),toolVersion:L.string(),analyzedAt:L.string(),gitSha:L.string().optional(),gitBranch:L.string().optional(),targetPath:L.string(),modules:L.record(L.string(),Op)}),Bp=L.enum(["source","test","config","docs","generated","asset","build","other"]),zp=L.object({path:L.string(),size:L.number().int().nonnegative(),language:L.string(),lineCount:L.number().int().nonnegative(),hash:L.string(),role:Bp,category:L.string(),lastModified:L.number().int().nonnegative().optional()}),Hp=L.object({totalFiles:L.number().int().nonnegative(),totalLines:L.number().int().nonnegative(),byLanguage:L.record(L.string(),L.number().int().nonnegative()),byRole:L.record(L.string(),L.number().int().nonnegative()),byCategory:L.record(L.string(),L.number().int().nonnegative())}),jp=L.object({files:L.array(zp),summary:Hp}),Zp=L.enum(["static","dynamic","require","reexport","type"]),Up=L.object({from:L.string(),to:L.string(),type:Zp,symbols:L.array(L.string())}),Gp=L.object({package:L.string(),importedBy:L.array(L.string()),symbols:L.array(L.string())}),Wp=L.object({cycle:L.array(L.string())}),qp=L.object({totalEdges:L.number().int().nonnegative(),totalExternal:L.number().int().nonnegative(),circularCount:L.number().int().nonnegative(),circulars:L.array(Wp),mostImported:L.array(L.object({path:L.string(),count:L.number().int().nonnegative()})),avgImportsPerFile:L.number().nonnegative()}),Kp=L.object({edges:L.array(Up),external:L.array(Gp),summary:qp}),Yp=L.enum(["observation","pattern","relationship","anti-pattern","suggestion","move-file"]),Xp=L.object({type:Yp,pass:L.number().int().nonnegative(),scope:L.string(),text:L.string(),severity:L.enum(["info","warning","critical"]).optional(),related:L.array(L.string()).optional(),from:L.string().optional(),to:L.string().optional()}),Ni=L.object({from:L.string(),to:L.string(),fromZone:L.string(),toZone:L.string()}),Oi=L.object({id:L.string(),name:L.string(),description:L.string(),files:L.array(L.string()),entryPoints:L.array(L.string()),cohesion:L.number().min(0).max(1),coupling:L.number().min(0).max(1),insights:L.array(L.string()).optional(),depth:L.number().int().nonnegative().optional(),subZones:L.lazy(()=>L.array(Oi)).optional(),subCrossings:L.array(Ni).optional()}),Jp=L.object({zones:L.array(Oi),crossings:L.array(Ni),unzoned:L.array(L.string()),insights:L.array(L.string()).optional(),findings:L.array(Xp).optional(),enrichmentPass:L.number().int().nonnegative().optional(),metaEvaluationCount:L.number().int().nonnegative().optional(),structureHash:L.string().optional(),zoneContentHashes:L.record(L.string()).optional(),lastReset:L.object({from:L.number().int().positive(),to:L.number().int().positive()}).optional()}),Qp=L.enum(["function","arrow","class","forwardRef"]),ef=L.object({file:L.string(),name:L.string(),kind:Qp,line:L.number().int().positive(),isDefaultExport:L.boolean(),conventionExports:L.array(L.string())}),tf=L.object({from:L.string(),to:L.string(),componentName:L.string(),usageCount:L.number().int().positive()}),nf=L.enum(["loader","action","default","meta","links","headers","ErrorBoundary","shouldRevalidate","handle","HydrateFallback"]),sf=L.object({file:L.string(),routePattern:L.string().nullable(),exports:L.array(nf),parentLayout:L.string().nullable(),isLayout:L.boolean(),isIndex:L.boolean()}),Vi=L.lazy(()=>L.object({file:L.string(),routePattern:L.string(),children:L.array(Vi)})),rf=L.object({totalComponents:L.number().int().nonnegative(),totalRouteModules:L.number().int().nonnegative(),totalUsageEdges:L.number().int().nonnegative(),routeConventions:L.record(L.string(),L.number().int().nonnegative()),mostUsedComponents:L.array(L.object({name:L.string(),file:L.string(),usageCount:L.number().int().positive()})),layoutDepth:L.number().int().nonnegative()}),af=L.object({components:L.array(ef),usageEdges:L.array(tf),routeModules:L.array(sf),routeTree:L.array(Vi),summary:rf}),of=L.enum(["direct","method","property-chain","computed"]),lf=L.object({file:L.string(),name:L.string(),line:L.number().int().positive(),column:L.number().int().nonnegative(),qualifiedName:L.string(),isExported:L.boolean()}),cf=L.object({callerFile:L.string(),caller:L.string(),calleeFile:L.string().nullable(),callee:L.string(),type:of,line:L.number().int().positive(),column:L.number().int().nonnegative()}),uf=L.object({totalFunctions:L.number().int().nonnegative(),totalCalls:L.number().int().nonnegative(),filesWithCalls:L.number().int().nonnegative(),mostCalled:L.array(L.object({qualifiedName:L.string(),file:L.string(),callerCount:L.number().int().positive()})),mostCalling:L.array(L.object({qualifiedName:L.string(),file:L.string(),calleeCount:L.number().int().positive()})),cycleCount:L.number().int().nonnegative()}),df=L.object({functions:L.array(lf),edges:L.array(cf),summary:uf});function an(t,n){let s=t.safeParse(n);return s.success?{ok:!0,data:s.data}:{ok:!1,errors:s.error}}function Bi(t){return an(Vp,t)}function zi(t){return an(jp,t)}function Hi(t){return an(Kp,t)}function ji(t){return an(Jp,t)}function Zi(t){return an(af,t)}function Ui(t){return an(df,t)}var pf="1.0.0",ff={manifest:[],inventory:[],imports:[],zones:[],components:[],callGraph:[]};function _r(t,n){if(!n||typeof n!="object")return n;let r=t==="manifest"?n.schemaVersion:void 0;if(r===pf)return n;let a=ff[t];if(!a?.length)return n;let o=n,i=r||"0.0.0";for(let l of a)i===l.from&&(o=l.migrate(o),i=l.to);return o}var Ee="visible",on=Date.now(),Lt={onChange:null},Cs=[],Bn=null,zn=null,Hn=null,Ss=[],Dr="none",jn=null;function Gi(){if(typeof document>"u")return{method:"none",eventName:null};if("visibilityState"in document)return{method:"standard",eventName:"visibilitychange"};let t=document;return"webkitVisibilityState"in t?{method:"webkit",eventName:"webkitvisibilitychange"}:"msVisibilityState"in t?{method:"ms",eventName:"msvisibilitychange"}:typeof window<"u"?{method:"focus-blur",eventName:null}:{method:"none",eventName:null}}function Pr(){let t=Date.now();return{state:Ee,isVisible:Ee==="visible",since:new Date(on).toISOString(),durationMs:t-on,timestamp:new Date(t).toISOString()}}function Mr(t){for(let n of Cs)n(t)}function $r(t,n){Ss.push({state:n,from:t,timestamp:new Date().toISOString()}),Ss.length>50&&(Ss=Ss.slice(-50))}function Wi(){if(typeof document>"u")return"visible";switch(Dr){case"standard":return document.visibilityState==="visible"?"visible":"hidden";case"webkit":return document.webkitVisibilityState==="visible"?"visible":"hidden";case"ms":return document.msVisibilityState==="visible"?"visible":"hidden";default:return Ee}}function mf(){let t=Wi();if(t===Ee)return;let n=Ee;Ee=t,on=Date.now(),$r(n,t);let s=Pr();Lt.onChange&&Lt.onChange(s,n),Mr(s)}function gf(){if(Ee==="visible")return;let t=Ee;Ee="visible",on=Date.now(),$r(t,"visible");let n=Pr();Lt.onChange&&Lt.onChange(n,t),Mr(n)}function hf(){if(Ee==="hidden")return;let t=Ee;Ee="hidden",on=Date.now(),$r(t,"hidden");let n=Pr();Lt.onChange&&Lt.onChange(n,t),Mr(n)}function vf(){Bn&&jn&&typeof document<"u"&&(document.removeEventListener(jn,Bn),Bn=null),typeof window<"u"&&(zn&&(window.removeEventListener("focus",zn),zn=null),Hn&&(window.removeEventListener("blur",Hn),Hn=null))}function Ts(t={}){Ar(),Lt={onChange:t.onChange??null};let n=Gi();Dr=n.method,jn=n.eventName,Ee=Wi(),on=Date.now(),jn&&typeof document<"u"?(Bn=mf,document.addEventListener(jn,Bn)):Dr==="focus-blur"&&typeof window<"u"&&(zn=gf,Hn=hf,window.addEventListener("focus",zn),window.addEventListener("blur",Hn))}function Ar(){vf()}function Ze(t){return Cs.push(t),()=>{Cs=Cs.filter(n=>n!==t)}}function nt(){return Ee==="visible"}var dt=new Map,ln=!1,Lr=0,Rs=[];function qi(){let t=[],n=0,s=0;for(let r of dt.values()){let a=r.callbacks.getStatus();t.push({key:r.key,status:a,essential:r.config.essential,registeredAt:r.registeredAt}),a==="active"&&n++,a==="suspended"&&s++}return{sources:t,sourceCount:dt.size,activeCount:n,suspendedCount:s,globalSuspended:ln,generation:Lr}}function Es(){let t=qi();for(let n of Rs)try{n(t)}catch(s){console.warn("[polling-state] listener error:",s)}}function pt(t,n,s={}){let r=dt.get(t);if(r)try{r.callbacks.dispose()}catch(o){console.warn(`[polling-state] failed to dispose replaced source "${t}":`,o)}let a={key:t,callbacks:n,config:{essential:s.essential??!1},registeredAt:new Date().toISOString()};if(dt.set(t,a),ln&&!a.config.essential)try{n.suspend()}catch(o){console.warn(`[polling-state] failed to suspend new source "${t}":`,o)}return Es(),()=>bf(t)}function bf(t){dt.has(t)&&(dt.delete(t),Es())}function Fr(){if(!ln){ln=!0,Lr++;for(let t of dt.values())if(!t.config.essential)try{t.callbacks.suspend()}catch(n){console.warn(`[polling-state] failed to suspend source "${t.key}":`,n)}Es()}}function Nr(){if(ln){ln=!1,Lr++;for(let t of dt.values())if(!t.config.essential)try{t.callbacks.resume()}catch(n){console.warn(`[polling-state] failed to resume source "${t.key}":`,n)}Es()}}function Is(){return qi()}function Or(t){return Rs.push(t),()=>{Rs=Rs.filter(n=>n!==t)}}var yf=100,kf="polling-manager",Nt=new Map,_s=null,Zn=null,Ft=!1,cn=!1,Ue=null;function Ki(){_s&&(_s(),_s=null),Ue!==null&&(clearTimeout(Ue),Ue=null)}function Vr(t){t.timerId===null&&(t.timerId=setInterval(t.callback,t.intervalMs))}function Ds(t){t.timerId!==null&&(clearInterval(t.timerId),t.timerId=null)}function wf(t){t.isVisible?(Ue!==null&&clearTimeout(Ue),Ue=setTimeout(()=>{Ue=null,Hr()},yf)):(Ue!==null&&(clearTimeout(Ue),Ue=null),zr())}function Br(){Ft&&Yi(),Ft=!0,cn=!1,_s=Ze(wf),nt()||(cn=!0),Zn=pt(kf,{suspend:()=>zr(),resume:()=>Hr(),dispose:()=>{for(let t of Nt.values())Ds(t);Ki(),Ft=!1,Zn=null},getStatus:()=>Ft?cn?"suspended":"active":"idle"})}function Yi(){if(Ki(),Ft=!1,Zn){let t=Zn;Zn=null,t()}}function Un(t,n,s){let r=Nt.get(t);r&&Ds(r);let a={key:t,callback:n,intervalMs:s,timerId:null};return Nt.set(t,a),Ft&&!cn?Vr(a):Ft||Vr(a),()=>un(t)}function un(t){let n=Nt.get(t);n&&(Ds(n),Nt.delete(t))}function zr(){cn=!0;for(let t of Nt.values())Ds(t)}function Hr(){cn=!1;for(let t of Nt.values())Vr(t)}var $s=[{key:"manifest",file:Xe.manifest,validate:Bi},{key:"inventory",file:Xe.inventory,validate:zi},{key:"imports",file:Xe.imports,validate:Hi},{key:"zones",file:Xe.zones,validate:ji},{key:"components",file:Xe.components,validate:Zi},{key:"callGraph",file:Xe.callGraph,validate:Ui}],Xi={};for(let t of $s)Xi[t.file]=t.key;var dn={manifest:null,inventory:null,imports:null,zones:null,components:null,callGraph:null},Ps=null,Ms=!1,jr={};function Ji(t){Ps=t}function Qi(){Ps=null}function Zr(){Ps&&Ps(dn)}async function el(t){try{let n=await fetch(`/data/${t.file}`);if(!n.ok)return!1;let s=await n.json(),r=_r(t.key,s),a=t.validate(r);return a.ok?(dn[t.key]=a.data,!0):(console.warn(`Validation failed for ${t.file}:`,a),!1)}catch{return!1}}async function Ur(t){let n=t.filter(s=>dn[s]===null).map(s=>$s.find(r=>r.key===s)).filter(s=>s!==void 0);return n.length>0&&(await Promise.allSettled(n.map(s=>el(s))),Zr()),dn}async function tl(t){let n=new Map;for(let s of t)n.set(s.name,s);for(let s of $s){let r=n.get(s.file);if(r)try{let a=await r.text(),o=JSON.parse(a),i=_r(s.key,o),l=s.validate(i);l.ok?dn[s.key]=l.data:console.warn(`Validation failed for ${s.file}:`,l)}catch(a){console.warn(`Failed to parse ${s.file}:`,a)}}return Zr(),dn}async function nl(){try{if((await fetch("/data")).ok)return"server"}catch{}return"static"}async function xf(t){let n=[];for(let[r,a]of Object.entries(t))if(jr[r]!==a){let o=Xi[r];o&&n.push(o)}if(n.length===0)return;jr=t;let s=n.map(r=>$s.find(a=>a.key===r)).filter(r=>r!==void 0);s.length>0&&(await Promise.allSettled(s.map(r=>el(r))),Zr())}async function Sf(){try{let t=await fetch("/data/status");if(!t.ok)return;let n=await t.json(),s=!1;for(let[r,a]of Object.entries(n.mtimes))if(jr[r]!==a){s=!0;break}s&&await xf(n.mtimes)}catch{}}function Gr(t=5e3){Ms||(Ms=!0,Un("loader:data-status",Sf,t))}function Wr(){Ms&&(Ms=!1,un("loader:data-status"))}var Kr={elevated:.5,warning:.7,critical:.85},rl=5e3,Cf="memory-monitor",Tf=2*1024*1024*1024,sl=60,Vt={intervalMs:rl,thresholds:{...Kr},onLevelChange:null},Ot=null,Wn=null,As="normal",al=null,Gn=[],Ls=[];function Rf(t,n){return t<0?"normal":t>=n.critical?"critical":t>=n.warning?"warning":t>=n.elevated?"elevated":"normal"}function Ef(t=Vt.thresholds){let n=performance;if(n.memory){let{usedJSHeapSize:s,totalJSHeapSize:r,jsHeapSizeLimit:a}=n.memory,o=a>0?s/a:-1;return{usedJSHeapSize:s,totalJSHeapSize:r,jsHeapSizeLimit:a,usageRatio:o,level:Rf(o,t),timestamp:new Date().toISOString(),precise:!0}}return{usedJSHeapSize:-1,totalJSHeapSize:-1,jsHeapSizeLimit:Tf,usageRatio:-1,level:"normal",timestamp:new Date().toISOString(),precise:!1}}function Fs(t){return t<0?"N/A":t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:`${(t/(1024*1024*1024)).toFixed(2)} GB`}function Xr(t){return t<0?"N/A":`${(t*100).toFixed(1)}%`}function pn(t){return Ls.push(t),()=>{Ls=Ls.filter(n=>n!==t)}}function If(t){for(let n of Ls)try{n(t)}catch(s){console.error("[memory-monitor] listener error:",s)}}function qr(){let t=Ef(Vt.thresholds);al=t,Gn.push(t),Gn.length>sl&&(Gn=Gn.slice(-sl));let n=As;t.level!==As&&(As=t.level,Vt.onLevelChange&&Vt.onLevelChange(t,n)),If(t)}function ol(t={}){Jr(),Vt={intervalMs:t.intervalMs??rl,thresholds:t.thresholds?{...Kr,...t.thresholds}:{...Kr},onLevelChange:t.onLevelChange??null},qr(),Ot=setInterval(qr,Vt.intervalMs),Wn=pt(Cf,{suspend:()=>Yr(),resume:()=>{Ot===null&&(Ot=setInterval(qr,Vt.intervalMs))},dispose:()=>{Yr(),Wn=null},getStatus:()=>Ot!==null?"active":"idle"},{essential:!0})}function Yr(){Ot&&(clearInterval(Ot),Ot=null)}function Jr(){if(Yr(),Wn){let t=Wn;Wn=null,t()}}function fn(){return al}function il(){return Gn}function ll(){return As}var _f={normal:[],elevated:["autoRefresh","deferredLoading"],warning:["autoRefresh","deferredLoading","graphRendering","animations"],critical:["autoRefresh","deferredLoading","graphRendering","animations","detailPanel"]},Df={normal:"",elevated:"Memory usage is elevated. Auto-refresh and background data loading have been paused to conserve memory.",warning:"High memory usage detected. The graph view and animations have been disabled. Close unused tabs or refresh the page.",critical:"Critical memory pressure. Most features are disabled to prevent a crash. Refresh the page to restore full functionality."};var mn="normal",ea=new Set,Qr={onChange:null},Ns=null,Os=[];function ul(){return{tier:mn,disabledFeatures:new Set(ea),isDegraded:mn!=="normal",summary:Df[mn]}}function Pf(t){for(let n of Os)try{n(t)}catch(s){console.error("[graceful-degradation] listener error:",s)}}function Mf(t){return new Set(_f[t])}function cl(t){let n=t.level;if(n===mn)return;let s=mn;mn=n,ea=Mf(n);let r=ul();Qr.onChange&&Qr.onChange(r,s),Pf(r)}function dl(t={}){ta(),Qr={onChange:t.onChange??null},Ns=pn(cl);let n=fn();n&&cl(n)}function ta(){Ns&&(Ns(),Ns=null)}function Fe(t){return Os.push(t),()=>{Os=Os.filter(n=>n!==t)}}function Ne(t){return ea.has(t)}function na(){return ul()}var Vs=null,sa=!1,ft=!1;function $f(t){let n=t.disabledFeatures.has("autoRefresh");n&&!ft?(ft=!0,Fr()):!n&&ft&&(ft=!1,Nr())}function ra(){sa&&pl(),sa=!0,ft=!1,Vs=Fe($f),Ne("autoRefresh")&&(ft=!0,Fr())}function pl(){Vs&&(Vs(),Vs=null),ft&&(ft=!1,Nr()),sa=!1}var aa=1e3,Af="tick-timer",mt=[],Ge=null,gn=null;function Lf(){Ge===null&&(Ge=setInterval(zs,aa),gn===null&&(gn=pt(Af,{suspend:()=>Bs(),resume:()=>{Ge===null&&mt.length>0&&(Ge=setInterval(zs,aa))},dispose:()=>{Bs(),gn=null},getStatus:()=>Ge!==null?"active":"idle"})))}function Bs(){Ge!==null&&(clearInterval(Ge),Ge=null)}function Ff(){if(Bs(),gn){let t=gn;gn=null,t()}}function zs(){let t=Date.now(),n=mt.slice();for(let s of n)try{s(t)}catch{}}function oa(t){mt.push(t),mt.length===1&&Lf();let n=!1;return()=>{n||(n=!0,mt=mt.filter(s=>s!==t),mt.length===0&&Ff())}}function ia(){Bs()}function la(){Ge===null&&mt.length!==0&&(zs(),Ge=setInterval(zs,aa))}var Nf=100;function ca(t={}){let n=t.resumeDebounceMs??Nf,s=t.onSuspend,r=t.onResume,a=!0,o=0,i=0,l=null,c=!1;function u(){l!==null&&(clearTimeout(l),l=null)}function d(){if(a&&(a=!1,o++,ia(),s))try{s()}catch{}}function p(){if(!a&&(a=!0,i++,la(),r))try{r()}catch{}}function m(y){c||(y.isVisible?(u(),l=setTimeout(()=>{l=null,p()},n)):(u(),d()))}let f=Ze(m);nt()||d();function v(){return a}function b(){return{isRunning:a,suspensionCount:o,resumeCount:i,disposed:c}}function g(){c=!0,u(),f()}return{isRunning:v,getSnapshot:b,dispose:g}}var hn=[],qn=null,vn=null,bn=null;function Of(){let t=[],n=hn.slice();for(let s of n)try{let r=s.compute();r!==s.lastValueRef.current&&t.push({setDisplay:s.setDisplay,value:r,reg:s})}catch{}if(t.length!==0){for(let{reg:s,value:r}of t)s.lastValueRef.current=r;if(bn)for(let{setDisplay:s,value:r}of t)bn.push({setDisplay:s,value:r});else bn=t.map(({setDisplay:s,value:r})=>({setDisplay:s,value:r}));vn===null&&(vn=requestAnimationFrame(Vf))}}function Vf(){vn=null;let t=bn;if(bn=null,!!t)for(let{setDisplay:n,value:s}of t)try{n(s)}catch{}}function ua(t,n,s){let r={compute:t,setDisplay:n,lastValueRef:s};hn.push(r),hn.length===1&&qn===null&&(qn=oa(Of));let a=!1;return()=>{a||(a=!0,hn=hn.filter(o=>o!==r),hn.length===0&&(qn&&(qn(),qn=null),vn!==null&&(cancelAnimationFrame(vn),vn=null,bn=null)))}}var Hf=100;function da(t){let n=t.batcher,s=t.onResume,r=t.resumeDebounceMs??Hf,a=!0,o=new Map,i=0,l=0,c=0,u=null,d=!1;function p(){u!==null&&(clearTimeout(u),u=null)}function m(I){return E=>{let D=E;for(let M of I)D=M(D);return D}}function f(){let I=o,E=I.size>0;o=new Map,i=0;for(let D of I.values())n.schedule(D.setter,m(D.updaters));if(E&&n.flush(),E&&s)try{s()}catch{}}function v(){a&&(a=!1,i=0,c++,n.flush())}function b(){a||(a=!0,f())}function g(I){d||(I.isVisible?(p(),u=setTimeout(()=>{u=null,b()},r)):(p(),v()))}let y=Ze(g);nt()||v();function h(I,E){if(d)return;if(a){n.schedule(I,E);return}let D=I,M=o.get(D);M||(M={setter:D,updaters:[]},o.set(D,M)),M.updaters.push(E),i++,l++}function x(){if(d)return;if(a){n.flush();return}let I=o;o=new Map,i=0;for(let E of I.values())E.setter(m(E.updaters));n.flush()}function S(){return o.size>0||n.hasPending()}function T(){return a}function w(){return{isOpen:a,queuedCount:i,totalDeferred:l,suspensionCount:c}}function C(){d=!0,p(),y(),o=new Map,i=0}return{schedule:h,flush:x,hasPending:S,isOpen:T,getSnapshot:w,dispose:C}}var jf=100;function pa(t){let n=t.flushDownstream,s=t.onResume,r=t.resumeDebounceMs??jf,a=!0,o=0,i=0,l=0,c=null,u=!1;function d(){c!==null&&(clearTimeout(c),c=null)}function p(){for(let S of n)try{S()}catch{}}function m(){a&&(a=!1,o=0,l++,p())}function f(){if(a)return;let S=o>0;if(a=!0,S)try{s()}catch{}}function v(S){u||(S.isVisible?(d(),c=setTimeout(()=>{c=null,f()},r)):(d(),m()))}let b=Ze(v);nt()||m();function g(){return u?!1:a?!0:(o++,i++,!1)}function y(){return a}function h(){return{isOpen:a,droppedCount:o,totalDropped:i,suspensionCount:l}}function x(){u=!0,d(),b()}return{accept:g,isOpen:y,getSnapshot:h,dispose:x}}function fa(t){let n=t?.disabled??!1,s=new Map,r=null,a=!1;function o(){let m=s;s=new Map,r=null;for(let f of m.values()){let v=b=>{let g=b;for(let y of f.updaters)g=y(g);return g};f.setter(v)}}function i(){r===null&&(r=requestAnimationFrame(o))}function l(){r!==null&&(cancelAnimationFrame(r),r=null)}function c(m,f){if(a)return;if(n){m(f);return}let v=m,b=s.get(v);b||(b={setter:v,updaters:[]},s.set(v,b)),b.updaters.push(f),i()}function u(){a||s.size!==0&&(l(),o())}function d(){return s.size>0}function p(){a=!0,l(),s=new Map}return{schedule:c,flush:u,hasPending:d,dispose:p}}function Hs(){return typeof window<"u"&&window.__NDX_DEPLOYED__!=null}function tm(){return typeof window>"u"?null:window.__NDX_DEPLOYED__??null}function fl(){let t=tm();if(!t)return;let n=t.basePath.endsWith("/")?t.basePath:t.basePath+"/",s=globalThis.fetch;globalThis.fetch=function(a,o){let i=typeof a=="string"?a:a instanceof URL?a.pathname:a.url,l=o?.method?.toUpperCase()??"GET",c;try{i.startsWith("http://")||i.startsWith("https://")?c=new URL(i).pathname:c=i.split("?")[0]}catch{return s.call(globalThis,a,o)}if(l!=="GET"&&(c.startsWith("/api/")||c.startsWith("/data")))return Promise.resolve(new Response(JSON.stringify({error:"Not available in deployed mode"}),{status:405,headers:{"Content-Type":"application/json"}}));if(c==="/data/status")return Promise.resolve(new Response(JSON.stringify({mtimes:{}}),{status:200,headers:{"Content-Type":"application/json"}}));if(c==="/data")return s.call(globalThis,`${n}data/index.json`,o);if(c.startsWith("/data/"))return s.call(globalThis,`${n}${c.slice(1)}`,o);if(c.startsWith("/api/")){let u=c.slice(1);return s.call(globalThis,`${n}${u}.json`,o)}return s.call(globalThis,a,o)}}var nm={manifest:null,inventory:null,imports:null,zones:null,components:null,callGraph:null},sm=["manifest","zones"],rm=["inventory","imports","components","callGraph"];function ml(t={}){let{pausePolling:n=!1}=t,[s,r]=k(nm),[a,o]=k(!0),[i,l]=k("static"),[c,u]=k(!1),[d,p]=k(!1),m=H(!0),f=H(null),[v,b]=k(()=>Ne("autoRefresh"));F(()=>Fe(h=>{b(h.disabledFeatures.has("autoRefresh"))}),[]),F(()=>(Ji(y=>{r(y),m.current||(u(!0),f.current&&clearTimeout(f.current),f.current=setTimeout(()=>{u(!1),f.current=null},3e3))}),nl().then(async y=>{l(y),y==="server"?(await Ur(sm),o(!1),m.current=!1,Hs()||Gr(5e3),(typeof requestIdleCallback=="function"?requestIdleCallback:x=>setTimeout(x,50))(()=>{Ur(rm)})):(o(!1),p(!0))}),()=>{Wr(),Qi(),f.current&&(clearTimeout(f.current),f.current=null)}),[]);let g=n||v;return F(()=>{i==="server"&&(g?Wr():m.current||Gr(5e3))},[g,i]),F(()=>{if(i==="server")return;let y=S=>{S.preventDefault(),p(!0)},h=async S=>{S.preventDefault(),p(!1),S.dataTransfer?.files&&(o(!0),await tl(S.dataTransfer.files),o(!1))},x=S=>{S.relatedTarget===null&&p(!1)};return document.addEventListener("dragover",y),document.addEventListener("drop",h),document.addEventListener("dragleave",x),()=>{document.removeEventListener("dragover",y),document.removeEventListener("drop",h),document.removeEventListener("dragleave",x)}},[i]),{data:s,loading:a,mode:i,refreshToast:c,showDrop:d,setLoading:o}}var ma="ndx-crash-heartbeat",ga="ndx-crash-nav-state",hl="ndx-crash-history",ha="ndx-crash-recovery-shown";function vl(){try{let t="__ndx_storage_test__";return sessionStorage.setItem(t,"1"),sessionStorage.removeItem(t),!0}catch{return!1}}function bl(t){try{let n=sessionStorage.getItem(t);return n?JSON.parse(n):null}catch{return null}}function yl(t,n){try{sessionStorage.setItem(t,JSON.stringify(n))}catch{}}function am(){return bl(hl)??[]}function om(){let t=am();t.push({timestamp:new Date().toISOString()});let n=t.slice(-10);return yl(hl,n),n}function im(t){let n=Date.now()-3e5;return t.filter(s=>new Date(s.timestamp).getTime()>n).length}function lm(){try{sessionStorage.setItem(ma,new Date().toISOString())}catch{}}function cm(){try{sessionStorage.removeItem(ma)}catch{}}function um(){try{return sessionStorage.getItem(ma)!==null}catch{return!1}}var dm=!1,yn=null,gl=null;function va(){if(yn)return yn;if(!vl())return yn={crashed:!1,crashLoop:!1,recentCrashCount:0,recoveredState:null},yn;let t=um(),n=null,s=0,r=!1;if(t){let a=om();s=im(a),r=s>=2,n=bl(ga)}yn={crashed:t,crashLoop:r,recentCrashCount:s,recoveredState:n},lm(),gl=()=>cm(),window.addEventListener("beforeunload",gl);try{sessionStorage.removeItem(ha)}catch{}return dm=!0,yn}function ba(t){if(!vl())return;let n={...t,timestamp:new Date().toISOString()};yl(ga,n)}function js(){try{sessionStorage.removeItem(ga)}catch{}}function Zs(){try{sessionStorage.setItem(ha,"true")}catch{}}function ya(){try{return sessionStorage.getItem(ha)==="true"}catch{return!1}}function kl(t){let{view:n,selectedFile:s,selectedZone:r,selectedRunId:a,selectedTaskId:o,enabled:i=!0}=t,[l,c]=k(null),[u,d]=k(!1),p=H(!1);F(()=>{if(!i||p.current)return;p.current=!0;let x=va();c(x),ya()&&d(!0)},[i]),F(()=>{i&&ba({view:n,selectedFile:s,selectedZone:r,selectedRunId:a,selectedTaskId:o})},[i,n,s,r,a,o]);let m=_(()=>{d(!0),Zs(),js()},[]),f=_(()=>{let x=l?.recoveredState??null;return d(!0),Zs(),js(),x},[l]),v=l?.crashed??!1,b=l?.crashLoop??!1,g=l?.recentCrashCount??0,y=l?.recoveredState??null;return{crashed:v,crashLoop:b,recentCrashCount:g,recoveredState:y,showRecovery:v&&!u,dismiss:m,restore:f}}function Pe(t,n){for(let s of t){if(s.id===n)return s;if(s.children){let r=Pe(s.children,n);if(r)return r}}return null}function ka(t){if(!t.children||t.children.length===0)return 0;let n=0;for(let s of t.children)n+=1+ka(s);return n}function wl(t,n){let s=[];function r(a){for(let o of a){if(o.id===n)return!0;if(o.children){if(s.push(o.id),r(o.children))return!0;s.pop()}}return!1}return r(t),s}function wa(t){let n=new Set([t.id]);if(t.children)for(let s of t.children)for(let r of wa(s))n.add(r);return n}function kn(t,n){let s=!1,r=[];for(let a of t){if(a.id===n){s=!0;continue}if(a.children&&a.children.length>0){let o=kn(a.children,n);if(o!==a.children){r.push({...a,children:o}),s=!0;continue}}r.push(a)}return s?r:t}function xl({data:t,setData:n,fetchPRDData:s,fetchTaskUsage:r,showToast:a,selectedItemId:o,setSelectedItemId:i,setBulkSelectedIds:l,onDetailContent:c}){let[u,d]=k(null),[p,m]=k(null),f=_(async y=>{let h=t?Pe(t.items,y):null,x=h?wa(h):new Set([y]);m(y),n(S=>S&&{...S,items:kn(S.items,y)}),l(S=>{if(S.size===0)return S;let T=!1,w=new Set(S);for(let C of x)w.has(C)&&(w.delete(C),T=!0);return T?w:S}),o&&x.has(o)&&(i(null),c&&c(null),history.replaceState({view:"prd",file:null,zone:null,runId:null,taskId:null},"","/prd"));try{let S=await fetch(`/api/rex/items/${y}`,{method:"DELETE"});if(!S.ok){let w=await S.json().catch(()=>({error:"Delete failed"}));throw new Error(w.error||`HTTP ${S.status}`)}let T=await S.json();a(`Deleted ${T.level}: ${T.title}`),await s(),await r()}catch(S){throw await s(),S}finally{m(null)}},[t,o,c,n,i,l,s,r,a]),v=_(y=>{d(y)},[]),b=_(async y=>{try{await f(y)}catch(h){let x=h instanceof Error?h.message:"Delete failed";a(`Failed to delete item: ${x}`,"error",4e3)}d(null)},[f,a]),g=_(async y=>{try{await f(y)}catch(h){let x=h instanceof Error?h.message:"Delete failed";throw a(`Failed to delete item: ${x}`,"error",4e3),h}},[f,a]);return{deleteTarget:u,setDeleteTarget:d,deletingItemId:p,handleRemoveItemFromTree:v,handleConfirmDelete:b,handleRemoveFromDetail:g}}var xa="facets";function Sl(){let t=new Set,n=new Set;try{let s=window.location.hash.slice(1);if(!s)return{tags:t,statuses:n};let a=new URLSearchParams(s).get(xa);if(!a)return{tags:t,statuses:n};for(let o of a.split(",")){let i=o.indexOf(":");if(i===-1)continue;let l=o.slice(0,i),c=decodeURIComponent(o.slice(i+1));l==="tag"&&c?t.add(c):l==="status"&&c&&n.add(c)}}catch{}return{tags:t,statuses:n}}function pm(t,n){try{let s=window.location.hash.slice(1),r=new URLSearchParams(s),a=[];for(let l of[...t].sort())a.push(`tag:${encodeURIComponent(l)}`);for(let l of[...n].sort())a.push(`status:${encodeURIComponent(l)}`);a.length>0?r.set(xa,a.join(",")):r.delete(xa);let o=r.toString(),i=new URL(window.location.href);i.hash=o||"",window.history.replaceState(null,"",i.toString())}catch{}}function Cl(){let[t,n]=k(()=>Sl().tags),[s,r]=k(()=>Sl().statuses),a=H(!1);F(()=>{if(!a.current){a.current=!0;return}pm(t,s)},[t,s]);let o=_(d=>{n(d)},[]),i=_(d=>{r(d)},[]),l=_(()=>{n(new Set),r(new Set)},[]),c=t.size>0||s.size>0;return{activeTags:t,activeSearchStatuses:s,searchFacets:c?{tags:t,statuses:s}:void 0,setActiveTags:o,setActiveSearchStatuses:i,clearFacets:l,hasFacets:c}}function wn(t,n){let[s,r]=k(n),a=H(!0),o=_(async()=>{try{let i=await fetch("/api/features");if(!i.ok)return;let l=await i.json();if(!a.current)return;let c=l.toggles?.find(u=>u.key===t);c!==void 0&&r(c.enabled)}catch{}},[t]);return F(()=>(a.current=!0,o(),()=>{a.current=!1}),[o]),F(()=>{let i=()=>{o()};return window.addEventListener("feature-toggle-changed",i),()=>window.removeEventListener("feature-toggle-changed",i)},[o]),s}var Tl=22,fm=80,Sa=15;function Bt(t,n){return t.y+fm-4+n*Tl+Tl/2}function Ca(t,n,s){let o=s.x+s.w/2>t.x+t.w/2?t.x+t.w:t.x,i=Math.max(t.y+4,Math.min(n,t.y+t.h-4)),l=mm(s,o,i),c=l.x-o,u=o+c*.4,d=i,p=o+c*.6,m=l.y;return`M ${o} ${i} C ${u} ${d} ${p} ${m} ${l.x} ${l.y}`}function Rl(t,n,s,r){let a=s.x>t.x,o=a?t.x+t.w:t.x,i=a?s.x:s.x+s.w,l=Math.max(t.y+4,Math.min(n,t.y+t.h-4)),c=Math.max(s.y+4,Math.min(r,s.y+s.h-4)),u=i-o,d=o+u*.4,p=l,m=o+u*.6;return`M ${o} ${l} C ${d} ${p} ${m} ${c} ${i} ${c}`}function mm(t,n,s){let r=t.x+t.w/2,a=t.y+t.h/2,o=n-r,i=s-a;if(o===0&&i===0)return{x:r,y:a};let l=t.w/2,c=t.h/2,u=o!==0?l/Math.abs(o):1/0,d=i!==0?c/Math.abs(i):1/0,p=Math.min(u,d);return{x:r+o*p,y:a+i*p}}function Il(t,n,s,r,a,o){let i=B(()=>{let c=[];for(let u of t){let d=n.get(u.from),p=n.get(u.to);if(!d||!p)continue;let m=s.has(u.from),f=s.has(u.to);if(!m&&!f)continue;let v=r.get(u.from),b=r.get(u.to);if(!(m&&v?.subZones?.length)&&!(f&&b?.subZones?.length)){if(m&&f){if(!v||!b)continue;gm(c,v,b,d,p,u,o,a);continue}if(m){if(!v)continue;El(c,v,d,p,u.to,b?.color??"var(--border-strong)",a);continue}b&&El(c,b,p,d,u.from,v?.color??"var(--border-strong)",a)}}return c},[t,n,s,r,a,o]),l=B(()=>{let c=new Set;for(let u of t){let d=s.has(u.from),p=s.has(u.to);(d||p)&&i.some(f=>f.key.includes(u.from)||f.key.includes(u.to))&&c.add(`${u.from}->${u.to}`)}return c},[t,s,i]);return{fileEdgeElements:i,hiddenZoneEdges:l}}function gm(t,n,s,r,a,o,i,l){let c=n.files.slice(0,Sa),u=s.files.slice(0,Sa),d=new Map(u.map((f,v)=>[f.path,v])),p=!1;for(let f=0;f<c.length;f++){let v=c[f],b=i.get(v.path);if(b)for(let[g,y]of b){let h=d.get(g);if(h===void 0)continue;p=!0;let x=Bt(r,f),S=Bt(a,h);t.push({key:`ff-${v.path}-${g}`,d:Rl(r,x,a,S),color:s.color,weight:y})}}let m=new Map(c.map((f,v)=>[f.path,v]));for(let f=0;f<u.length;f++){let v=u[f],b=i.get(v.path);if(b)for(let[g,y]of b){let h=m.get(g);if(h===void 0)continue;let x=`ff-${g}-${v.path}`;if(t.some(w=>w.key===x))continue;p=!0;let S=Bt(a,f),T=Bt(r,h);t.push({key:`ff-${v.path}-${g}`,d:Rl(a,S,r,T),color:n.color,weight:y})}}if(!p){for(let f=0;f<c.length;f++){let v=c[f],b=l.get(v.path);if(!b)continue;let g=b.find(y=>y.targetZoneId===o.to);g&&t.push({key:`fe-${v.path}-${o.to}`,d:Ca(r,Bt(r,f),a),color:s.color,weight:g.weight})}for(let f=0;f<u.length;f++){let v=u[f],b=l.get(v.path);if(!b)continue;let g=b.find(y=>y.targetZoneId===o.from);g&&t.push({key:`fe-${o.from}-${v.path}`,d:Ca(a,Bt(a,f),r),color:n.color,weight:g.weight})}}}function El(t,n,s,r,a,o,i){let l=n.files.slice(0,Sa);for(let c=0;c<l.length;c++){let u=l[c],d=i.get(u.path);if(!d)continue;let p=d.find(f=>f.targetZoneId===a);if(!p)continue;let m=Bt(s,c);t.push({key:`fe-${u.path}-${a}`,d:Ca(s,m,r),color:o,weight:p.weight})}}function _l(){let[t,n]=k(na);F(()=>{dl();let r=Fe(a=>{n(a)});return n(na()),()=>{r(),ta()}},[]);let s=_(r=>Ne(r),[t]);return{tier:t.tier,isDegraded:t.isDegraded,summary:t.summary,disabledFeatures:t.disabledFeatures,isDisabled:s}}function Dl({data:t,onSelectItem:n}){let[s,r]=k(null),[a,o]=k(new Set),i=B(()=>{if(!t||a.size===0)return[];let m=[];for(let f of a){let v=Pe(t.items,f);v&&m.push(v)}return m},[t,a]),l=_(m=>{r(m.id),history.replaceState({view:"prd",file:null,zone:null,runId:null,taskId:m.id},"",`/prd/${m.id}`),n&&n({type:"prd",title:m.title,id:m.id,level:m.level,status:m.status,description:m.description,acceptanceCriteria:m.acceptanceCriteria,priority:m.priority,tags:m.tags,blockedBy:m.blockedBy,startedAt:m.startedAt,completedAt:m.completedAt})},[n]),c=H(null),u=_((m,f,v)=>{o(b=>{if(f.shiftKey&&c.current){let g=v.indexOf(c.current),y=v.indexOf(m.id);if(g>=0&&y>=0){let h=Math.min(g,y),x=Math.max(g,y),S=v.slice(h,x+1),T=f.ctrlKey?new Set(b):new Set;for(let w of S)T.add(w);return T}}if(f.ctrlKey){let g=new Set(b);return g.has(m.id)?g.delete(m.id):g.add(m.id),c.current=m.id,g}return c.current=m.id,b.size===1&&b.has(m.id)?new Set:new Set([m.id])})},[]),d=_(()=>{o(new Set),c.current=null},[]),p=_(m=>{if(!t)return;let f=Pe(t.items,m);f&&l(f)},[t,l]);return{selectedItemId:s,setSelectedItemId:r,bulkSelectedIds:a,setBulkSelectedIds:o,selectedItems:i,handleSelectItem:l,handleBulkSelect:u,clearBulkSelection:d,handleNavigateToItem:p}}function Ml(t={}){let{intervalMs:n=5e3,thresholds:s,enabled:r=!0}=t,[a,o]=k(fn),[i,l]=k(!1),c=H(null);F(()=>{if(!r)return;ol({intervalMs:n,thresholds:s,onLevelChange:(v,b)=>{c.current&&hm(v.level,c.current)&&(l(!1),c.current=null)}});let f=pn(v=>{o(v)});return()=>{f(),Jr()}},[r,n,s]);let u=_(()=>{l(!0),c.current=a?.level??null},[a]),d=a?.level??"normal";return{snapshot:a,level:d,showWarning:(d==="warning"||d==="critical")&&!i,dismissed:i,dismiss:u,history:il()}}var Pl={normal:0,elevated:1,warning:2,critical:3};function hm(t,n){return Pl[t]>Pl[n]}function $l(t){let n=H(null),[s,r]=k(!1),a=H(null),[o,i]=k(t);F(()=>{i(t)},[t]);let l=_(v=>{v.preventDefault();let b=n.current;if(!b)return;let g=b.getBoundingClientRect();if(v.ctrlKey){let y=(v.clientX-g.left)/g.width,h=(v.clientY-g.top)/g.height,S=1+Math.max(-2,Math.min(2,v.deltaY))*.02;i(T=>{let w=T.w*S,C=T.h*S,I=T.x+(T.w-w)*y,E=T.y+(T.h-C)*h;return{x:I,y:E,w,h:C}});return}i(y=>{let h=y.w/g.width,x=y.h/g.height;return{...y,x:y.x+v.deltaX*h,y:y.y+v.deltaY*x}})},[]),c=_(v=>{r(!0),a.current={x:v.clientX,y:v.clientY,vbx:o.x,vby:o.y}},[o]),u=_(v=>{if(!s||!a.current||!n.current)return;let b=n.current.getBoundingClientRect(),g=o.w/b.width,y=o.h/b.height,h=(v.clientX-a.current.x)*g,x=(v.clientY-a.current.y)*y;i(S=>({...S,x:a.current.vbx-h,y:a.current.vby-x}))},[s,o.w,o.h]),d=_(()=>{r(!1),a.current=null},[]),p=_(()=>{i(v=>({x:v.x+v.w*.1,y:v.y+v.h*.1,w:v.w*.8,h:v.h*.8}))},[]),m=_(()=>{i(v=>({x:v.x-v.w*.125,y:v.y-v.h*.125,w:v.w*1.25,h:v.h*1.25}))},[]),f=_(()=>{i(t)},[t]);return{viewBox:o,panning:s,svgRef:n,handleWheel:l,startPan:c,movePan:u,endPan:d,handleZoomIn:p,handleZoomOut:m,handleFit:f}}var Al=["pending","in_progress","completed","failing","blocked","deferred","deleted"],vm={pending:{icon:"\u25CB",label:"Pending",cssClass:"prd-status-pending"},in_progress:{icon:"\u25D0",label:"In Progress",cssClass:"prd-status-in-progress"},completed:{icon:"\u25CF",label:"Completed",cssClass:"prd-status-completed"},failing:{icon:"\u26A0",label:"Failing",cssClass:"prd-status-failing"},blocked:{icon:"\u2298",label:"Blocked",cssClass:"prd-status-blocked"},deferred:{icon:"\u25CC",label:"Deferred",cssClass:"prd-status-deferred"},deleted:{icon:"\u2715",label:"Deleted",cssClass:"prd-status-deleted"}},Ll=[{key:"all",label:"All Items",title:"Show all statuses including deleted",statuses:new Set(Al)},{key:"active",label:"Active Work",title:"Show pending, in progress, failing, and blocked items",statuses:new Set(["pending","in_progress","failing","blocked"])},{key:"completed",label:"Completed",title:"Show only completed items",statuses:new Set(["completed"])},{key:"blocked-deferred",label:"Blocked/Deferred",title:"Show blocked and deferred items that need attention",statuses:new Set(["blocked","deferred"])}];function bm(t){for(let n of Ll)if(t.size===n.statuses.size&&[...n.statuses].every(s=>t.has(s)))return n.key;return null}function Ta({activeStatuses:t,onChange:n}){let s=_(a=>{let o=new Set(t);if(o.has(a)){if(o.size<=1)return;o.delete(a)}else o.add(a);n(o)},[t,n]),r=B(()=>bm(t),[t]);return e("div",{class:"prd-status-filter",role:"group","aria-label":"Filter by status"},e("span",{class:"prd-status-filter-label"},"Filter:"),e("div",{class:"prd-status-filter-presets"},Ll.map(a=>e("button",{key:a.key,class:`prd-status-preset${r===a.key?" active":""}`,onClick:()=>n(new Set(a.statuses)),title:a.title,"aria-pressed":String(r===a.key),type:"button"},a.label)),r===null?e("span",{class:"prd-status-preset-custom",title:"Custom filter combination"},"Custom"):null),e("div",{class:"prd-status-filter-chips",role:"toolbar","aria-label":"Status chip toggles"},Al.map(a=>{let o=vm[a],i=t.has(a);return e("button",{key:a,class:`prd-status-chip${i?" active":""} ${o.cssClass}`,onClick:()=>s(a),title:`${i?"Hide":"Show"} ${o.label.toLowerCase()} items`,"aria-pressed":String(i),type:"button",onKeyDown:l=>{(l.key==="ArrowRight"||l.key==="ArrowDown")&&(l.preventDefault(),l.currentTarget.nextElementSibling?.focus()),(l.key==="ArrowLeft"||l.key==="ArrowUp")&&(l.preventDefault(),l.currentTarget.previousElementSibling?.focus())}},e("span",{class:"prd-status-chip-icon"},o.icon),e("span",{class:"prd-status-chip-label"},o.label))})))}function Kn(){return new Set(["pending","in_progress","failing","blocked"])}var Fl=null;function ym(){return Fl??Kn()}function Nl(){let[t,n]=k(ym),s=_(r=>{Fl=r,n(r)},[]);return{activeStatuses:t,setActiveStatuses:s}}function Ol(){let[t,n]=k(Is);return F(()=>{let s=Or(r=>{n(r)});return n(Is()),s},[]),{isSuspended:t.globalSuspended,suspendedCount:t.suspendedCount,sourceCount:t.sourceCount,generation:t.generation}}function Me(t,n,s,r=!0){let a=H(n);a.current=n,F(()=>{if(!r){un(t);return}return Un(t,()=>a.current(),s)},[t,s,r])}function Vl(t){return t==="epic"}function zt(t){return t==="task"||t==="subtask"}function Bl(t){return t==="epic"||t==="feature"}var km={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"},wm={epic:"Epics",feature:"Features",task:"Tasks",subtask:"Subtasks"},xm={epic:"\u{1F4E6}",feature:"\u2728",task:"\u{1F4CB}",subtask:"\u{1F539}"};function Se(t){return km[t]??t}function zl(t){return wm[t]??`${t}s`}function Hl(t){return xm[t]??"\u2022"}var Sm={epic:"feature",feature:"task",task:"subtask",subtask:null};function Yn(t){return Sm[t]??null}function Xn(t){let n={total:0,completed:0,inProgress:0,pending:0,failing:0,deferred:0,blocked:0,deleted:0};function s(r){for(let a of r){if(zt(a.level))if(a.status==="deleted")n.deleted++;else switch(n.total++,a.status){case"completed":n.completed++;break;case"in_progress":n.inProgress++;break;case"pending":n.pending++;break;case"failing":n.failing++;break;case"deferred":n.deferred++;break;case"blocked":n.blocked++;break}a.children&&a.children.length>0&&s(a.children)}}return s(t),n}function Us(t){return t.total>0?t.completed/t.total:0}function Ra(t,n){return n.has(t.status)?!0:t.children?t.children.some(s=>Ra(s,n)):!1}function xn(t){let n=new Date(t);if(isNaN(n.getTime()))return"";let s=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),a=String(n.getHours()).padStart(2,"0"),o=String(n.getMinutes()).padStart(2,"0");return`${s}-${r} ${a}:${o}`}var Cm="No budget";function jl(t){return t?.source??"missing_budget"}function st(t,n){let s=n?.budget;if(typeof s!="number"||!Number.isFinite(s)||s<=0)return{percent:null,label:Cm,reason:jl(n)};let r=Math.round(t/s*100);return{percent:r,label:`${r}%`,reason:jl(n)}}var Tm=[{value:"pending",label:"Pending",icon:"\u25CB"},{value:"in_progress",label:"In Progress",icon:"\u25D0"},{value:"completed",label:"Completed",icon:"\u25CF"},{value:"failing",label:"Failing",icon:"\u26A0"},{value:"blocked",label:"Blocked",icon:"\u2298"},{value:"deferred",label:"Deferred",icon:"\u25CC"},{value:"deleted",label:"Deleted",icon:"\u2715"}],Ia=[{value:"critical",label:"Critical"},{value:"high",label:"High"},{value:"medium",label:"Medium"},{value:"low",label:"Low"}];function Ul(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function Rm({current:t,onChange:n,onRequestReason:s}){return e("div",{class:"task-status-selector",role:"radiogroup","aria-label":"Task status"},Tm.map(r=>e("button",{key:r.value,class:`task-status-btn prd-status-${r.value}${t===r.value?" active":""}`,onClick:()=>{r.value==="failing"&&s?s(r.value):n(r.value)},role:"radio","aria-checked":String(t===r.value),title:r.label},e("span",{class:"task-status-btn-icon"},r.icon),e("span",{class:"task-status-btn-label"},r.label))))}function Em({current:t,onChange:n}){return e("select",{class:`task-priority-select${t?` prd-priority-${t}`:""}`,value:t||"",onChange:s=>{let r=s.target.value;r&&n(r)},"aria-label":"Task priority"},e("option",{value:"",disabled:!0},"Set priority"),Ia.map(s=>e("option",{key:s.value,value:s.value},s.label)))}function Im({tags:t,onUpdate:n}){let[s,r]=k(!1),[a,o]=k(""),i=_(()=>{let c=a.trim().toLowerCase().replace(/\s+/g,"-");c&&!t.includes(c)&&n([...t,c]),o(""),r(!1)},[a,t,n]),l=_(c=>{n(t.filter(u=>u!==c))},[t,n]);return e("div",{class:"task-tag-editor"},t.map(c=>e("span",{key:c,class:"task-tag"},c,e("button",{class:"task-tag-remove",onClick:()=>l(c),"aria-label":`Remove tag ${c}`,title:"Remove"},"\xD7"))),s?e("span",{class:"task-tag-input-wrapper"},e("input",{class:"task-tag-input",type:"text",value:a,placeholder:"tag name",onInput:c=>o(c.target.value),onKeyDown:c=>{c.key==="Enter"&&(c.preventDefault(),i()),c.key==="Escape"&&(r(!1),o(""))},ref:c=>c?.focus()}),e("button",{class:"task-tag-confirm",onClick:i,title:"Add tag"},"\u2713")):e("button",{class:"task-tag-add-btn",onClick:()=>r(!0),title:"Add tag"},"+ tag"))}function _m({blockedBy:t,allItems:n,onNavigate:s}){return t.length===0?null:e("div",{class:"task-dependencies"},e("div",{class:"task-section-label"},"Blocked By"),e("div",{class:"task-dependency-list"},t.map(r=>{let a=Pe(n,r),o=a?.status==="completed";return e("div",{key:r,class:`task-dependency-item${o?" resolved":""}`,onClick:s?()=>s(r):void 0,role:s?"button":void 0,tabIndex:s?0:void 0},e("span",{class:`task-dep-status${o?" prd-status-completed":" prd-status-blocked"}`},o?"\u25CF":"\u2298"),e("span",{class:"task-dep-title"},a?a.title:r),a?e("span",{class:`prd-level-badge prd-level-${a.level}`},Se(a.level)):null)})))}function Dm({title:t,onUpdate:n}){let[s,r]=k(!1),[a,o]=k(t);F(()=>{o(t)},[t]);let i=_(()=>{let l=a.trim();l&&l!==t&&n&&n(l),r(!1)},[a,t,n]);return n?s?e("div",{class:"task-title-edit"},e("input",{class:"task-title-input",type:"text",value:a,onInput:l=>o(l.target.value),onKeyDown:l=>{l.key==="Enter"&&(l.preventDefault(),i()),l.key==="Escape"&&(o(t),r(!1))},onBlur:i,ref:l=>l?.focus()})):e("div",{class:"task-title-display editable",onClick:()=>{o(t),r(!0)},title:"Click to edit title",role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),o(t),r(!0))}},t,e("span",{class:"task-edit-icon"},"\u270E")):e("div",{class:"task-title-display"},t)}function Pm({description:t,onUpdate:n}){let[s,r]=k(!1),[a,o]=k(t??"");F(()=>{o(t??"")},[t]);let i=_(()=>{let l=a.trim();l!==(t??"")&&n&&n(l),r(!1)},[a,t,n]);return n?s?e("div",{class:"task-description-edit"},e("textarea",{class:"task-description-textarea",value:a,rows:Math.max(3,(a.match(/\n/g)??[]).length+2),onInput:l=>o(l.target.value),onKeyDown:l=>{l.key==="Enter"&&(l.ctrlKey||l.metaKey)&&(l.preventDefault(),i()),l.key==="Escape"&&(o(t??""),r(!1))},ref:l=>l?.focus()}),e("div",{class:"task-edit-actions"},e("button",{class:"task-edit-save",onClick:i},"Save"),e("button",{class:"task-edit-cancel",onClick:()=>{o(t??""),r(!1)}},"Cancel"),e("span",{class:"task-edit-hint"},"Ctrl+Enter to save"))):t?e("div",{class:"task-description editable",onClick:()=>{o(t??""),r(!0)},title:"Click to edit description",role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),o(t??""),r(!0))}},t,e("span",{class:"task-edit-icon"},"\u270E")):e("button",{class:"task-add-description-btn",onClick:()=>{o(""),r(!0)}},"+ Add description"):t?e("div",{class:"task-description"},t):null}function Mm({criteria:t,onUpdate:n}){let[s,r]=k(null),[a,o]=k(""),[i,l]=k(!1),[c,u]=k(""),d=_(v=>{r(v),o(t[v])},[t]),p=_(()=>{if(s===null||!n)return;let v=a.trim();if(!v)n(t.filter((b,g)=>g!==s));else if(v!==t[s]){let b=[...t];b[s]=v,n(b)}r(null),o("")},[s,a,t,n]),m=_(v=>{n&&n(t.filter((b,g)=>g!==v))},[t,n]),f=_(()=>{let v=c.trim();v&&n&&n([...t,v]),u(""),l(!1)},[c,t,n]);return t.length===0&&!n?null:e("div",{class:"task-acceptance-criteria"},e("div",{class:"task-section-label"},"Acceptance Criteria"),t.length>0?e("ul",{class:"task-criteria-list"},t.map((v,b)=>s===b?e("li",{key:b,class:"task-criterion editing"},e("input",{class:"task-criterion-input",type:"text",value:a,onInput:g=>o(g.target.value),onKeyDown:g=>{g.key==="Enter"&&(g.preventDefault(),p()),g.key==="Escape"&&(r(null),o(""))},onBlur:p,ref:g=>g?.focus()})):e("li",{key:b,class:`task-criterion${n?" editable":""}`,onClick:n?()=>d(b):void 0,role:n?"button":void 0,tabIndex:n?0:void 0,onKeyDown:n?g=>{(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),d(b))}:void 0},e("span",{class:"task-criterion-text"},v),n?e("button",{class:"task-criterion-remove",onClick:g=>{g.stopPropagation(),m(b)},"aria-label":`Remove criterion ${b+1}`,title:"Remove"},"\xD7"):null))):null,n?i?e("div",{class:"task-criterion-add-form"},e("input",{class:"task-criterion-add-input",type:"text",value:c,placeholder:"New acceptance criterion...",onInput:v=>u(v.target.value),onKeyDown:v=>{v.key==="Enter"&&c.trim()&&(v.preventDefault(),f()),v.key==="Escape"&&(l(!1),u(""))},ref:v=>v?.focus()}),e("button",{class:"task-criterion-add-confirm",onClick:f,disabled:!c.trim()},"\u2713"),e("button",{class:"task-criterion-add-cancel",onClick:()=>{l(!1),u("")}},"\xD7")):e("button",{class:"task-criterion-add-btn",onClick:()=>l(!0)},"+ criterion"):null)}function $m({children:t,onNavigate:n}){if(t.length===0)return null;let s={completed:"\u25CF",in_progress:"\u25D0",pending:"\u25CB",blocked:"\u2298",deferred:"\u25CC"};return e("div",{class:"task-children-summary"},e("div",{class:"task-section-label"},`Children (${t.length})`),e("div",{class:"task-children-list"},t.map(r=>e("div",{key:r.id,class:"task-child-item",onClick:n?()=>n(r.id):void 0,role:n?"button":void 0,tabIndex:n?0:void 0},e("span",{class:`prd-status-icon prd-status-${r.status}`},s[r.status]||"\u25CB"),e("span",{class:`prd-level-badge prd-level-${r.level}`},Se(r.level)),e("span",{class:"task-child-title"},r.title)))))}function Am({parentId:t,parentLevel:n,onSubmit:s,onCancel:r}){let[a,o]=k(""),[i,l]=k(""),[c,u]=k(""),[d,p]=k(!1),[m,f]=k(null),[v,b]=k(!1),g=Yn(n);if(!g)return null;let y=Se(g),h=_(async()=>{let T=a.trim();if(!T){f("Title is required");return}p(!0),f(null);try{await s({title:T,parentId:t,level:g,description:i.trim()||void 0,priority:c||void 0})}catch(w){f(String(w)),p(!1)}},[a,i,c,t,g,s]),x=_(T=>{T.key==="Escape"&&(T.preventDefault(),r()),T.key==="Enter"&&(T.ctrlKey||T.metaKey)&&(T.preventDefault(),h())},[r,h]),S=_(T=>{T.key==="Enter"&&!T.shiftKey&&!v&&(T.preventDefault(),h()),x(T)},[h,x,v]);return e("div",{class:"task-add-child-form",onKeyDown:x},m?e("div",{class:"task-add-child-error",role:"alert"},m):null,e("div",{class:"task-add-child-row"},e("span",{class:`prd-level-badge prd-level-${g}`},y),e("input",{class:"task-add-child-title",type:"text",value:a,placeholder:`New ${y.toLowerCase()} title...`,onInput:T=>{o(T.target.value),m&&f(null)},onKeyDown:S,disabled:d,"aria-label":`New ${y.toLowerCase()} title`,ref:T=>T?.focus()})),e("div",{class:"task-add-child-actions"},e("button",{type:"button",class:`task-add-child-more${v?" active":""}`,onClick:()=>b(!v),title:v?"Hide extra fields":"Show description & priority",disabled:d},"\u22EF"),e("button",{type:"button",class:"task-add-child-submit",onClick:h,disabled:d||!a.trim(),title:`Add ${y.toLowerCase()}`},d?"\u2026":`Add ${y}`),e("button",{type:"button",class:"task-add-child-cancel",onClick:r,disabled:d,title:"Cancel (Esc)"},"Cancel")),v?e("div",{class:"task-add-child-extra"},e("textarea",{class:"task-add-child-description",value:i,placeholder:"Description (optional)",onInput:T=>l(T.target.value),onKeyDown:x,rows:2,disabled:d}),e("div",{class:"task-add-child-priority-row"},e("span",{class:"task-add-child-priority-label"},"Priority:"),e("select",{class:"task-add-child-priority",value:c,onChange:T=>u(T.target.value),disabled:d},e("option",{value:""},"None"),Ia.map(T=>e("option",{key:T.value,value:T.value},T.label))))):null)}var Ea={technical:"Technical",performance:"Performance",security:"Security",accessibility:"Accessibility",compatibility:"Compatibility",quality:"Quality"},Lm={technical:"\u2699",performance:"\u26A1",security:"\u{1F512}",accessibility:"\u267F",compatibility:"\u{1F517}",quality:"\u2605"},Gl={automated:"Automated",manual:"Manual",metric:"Metric"},Zl=["technical","performance","security","accessibility","compatibility","quality"],Fm=["automated","manual","metric"];function Nm({req:t}){return e("div",{class:`task-requirement-item req-category-${t.category}`},e("div",{class:"task-requirement-header"},e("span",{class:`req-category-badge req-cat-${t.category}`},Lm[t.category]||""," ",Ea[t.category]||t.category),e("span",{class:`req-validation-badge req-val-${t.validationType}`},Gl[t.validationType]||t.validationType),t.priority?e("span",{class:`prd-priority-badge prd-priority-${t.priority}`},t.priority):null),e("div",{class:"task-requirement-title"},t.title),t.description?e("div",{class:"task-requirement-description"},t.description):null,t.acceptanceCriteria&&t.acceptanceCriteria.length>0?e("ul",{class:"task-requirement-criteria"},t.acceptanceCriteria.map((n,s)=>e("li",{key:s},n))):null,t.validationCommand?e("div",{class:"task-requirement-command"},e("span",{class:"label"},"Validation: "),e("code",null,t.validationCommand),t.threshold!==void 0?e("span",{class:"req-threshold"},` (threshold: ${t.threshold})`):null):null)}function Om({requirements:t,onAdd:n,onRemove:s}){let[r,a]=k(!1),[o,i]=k(""),[l,c]=k("technical"),[u,d]=k("automated"),[p,m]=k(""),[f,v]=k(""),[b,g]=k(""),[y,h]=k("medium"),[x,S]=k("all"),T=_(()=>{if(!o.trim()||!n)return;let C=f.split(`
30
+ `).map(E=>E.trim()).filter(Boolean),I={title:o.trim(),category:l,validationType:u,acceptanceCriteria:C};p.trim()&&(I.description=p.trim()),b.trim()&&(I.validationCommand=b.trim()),y&&(I.priority=y),n(I),i(""),m(""),v(""),g(""),h("medium"),a(!1)},[o,l,u,p,f,b,y,n]),w=x==="all"?t:t.filter(C=>C.category===x);return t.length===0&&!r?e("div",{class:"task-requirements-empty"},n?e("button",{class:"task-req-add-btn",onClick:()=>a(!0)},"+ Add requirement"):e("span",{class:"task-requirements-none"},"No requirements")):e("div",{class:"task-requirements-list"},t.length>2?e("div",{class:"task-req-filter"},e("select",{class:"task-req-filter-select",value:x,onChange:C=>S(C.target.value),"aria-label":"Filter requirements by category"},e("option",{value:"all"},`All (${t.length})`),...Zl.filter(C=>t.some(I=>I.category===C)).map(C=>e("option",{key:C,value:C},`${Ea[C]} (${t.filter(I=>I.category===C).length})`)))):null,w.map(C=>e("div",{key:C.id,class:"task-requirement-wrapper"},e(Nm,{req:C}),s?e("button",{class:"task-req-remove-btn",onClick:()=>s(C.id),"aria-label":`Remove requirement ${C.title}`,title:"Remove"},"\xD7"):null)),n?r?e("div",{class:"task-req-add-form"},e("div",{class:"task-section-label"},"New Requirement"),e("input",{class:"task-req-input",type:"text",placeholder:"Requirement title",value:o,onInput:C=>i(C.target.value),ref:C=>C?.focus()}),e("div",{class:"task-req-selectors"},e("select",{class:"task-req-select",value:l,onChange:C=>c(C.target.value),"aria-label":"Requirement category"},Zl.map(C=>e("option",{key:C,value:C},Ea[C]))),e("select",{class:"task-req-select",value:u,onChange:C=>d(C.target.value),"aria-label":"Validation type"},Fm.map(C=>e("option",{key:C,value:C},Gl[C]))),e("select",{class:"task-req-select",value:y,onChange:C=>h(C.target.value),"aria-label":"Requirement priority"},e("option",{value:""},"No priority"),Ia.map(C=>e("option",{key:C.value,value:C.value},C.label)))),e("textarea",{class:"task-req-textarea",placeholder:"Description (optional)",value:p,onInput:C=>m(C.target.value),rows:2}),e("textarea",{class:"task-req-textarea",placeholder:"Acceptance criteria (one per line)",value:f,onInput:C=>v(C.target.value),rows:3}),e("input",{class:"task-req-input",type:"text",placeholder:"Validation command (optional)",value:b,onInput:C=>g(C.target.value)}),e("div",{class:"task-req-form-actions"},e("button",{class:"task-req-submit-btn",onClick:T,disabled:!o.trim()},"Add"),e("button",{class:"task-req-cancel-btn",onClick:()=>a(!1)},"Cancel"))):e("button",{class:"task-req-add-btn",onClick:()=>a(!0)},"+ Add requirement"):null)}var Vm=new Set(["pending","blocked"]),Bm={starting:"Starting\u2026",running:"Running\u2026",completed:"Completed",failed:"Failed"},zm={starting:"\u25D0",running:"\u25D0",completed:"\u25CF",failed:"\u2716"};function Hm({item:t,onExecute:n,onPrdChanged:s}){let[r,a]=k(!1),[o,i]=k(null),[l,c]=k(null),u=H(null),d=H(null),p=Vm.has(t.status),m=zt(t.level);if(F(()=>{m&&fetch(`/api/hench/execute/status/${t.id}`).then(g=>g.json()).then(g=>{g.execution&&(g.execution.status==="starting"||g.execution.status==="running")&&(c(g.execution),a(!0))}).catch(()=>{})},[t.id,m]),F(()=>{if(!r)return;let y=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,h;try{h=new WebSocket(y),u.current=h,h.onmessage=S=>{try{let T=JSON.parse(S.data);if(T.type==="hench:task-execution-progress"&&T.state){let w=T.state;if(w.taskId!==t.id)return;c(w),w.status==="completed"?(a(!1),i("Execution completed"),s&&s(),d.current=setTimeout(()=>{i(null),c(null)},5e3)):w.status==="failed"&&(a(!1),i(w.error||"Execution failed"),s&&s(),d.current=setTimeout(()=>{i(null),c(null)},8e3))}T.type==="rex:prd-changed"&&s&&s()}catch{}},h.onclose=()=>{u.current=null}}catch{}let x=setInterval(async()=>{try{let T=await(await fetch(`/api/hench/execute/status/${t.id}`)).json();if(T.execution){if(c(T.execution),T.execution.status==="completed"||T.execution.status==="failed"){a(!1);let w=T.execution.status==="completed";i(w?"Execution completed":T.execution.error||"Execution failed"),s&&s(),d.current=setTimeout(()=>{i(null),c(null)},w?5e3:8e3)}}else r&&(a(!1),c(null),s&&s())}catch{}},3e3);return()=>{if(clearInterval(x),u.current){try{u.current.close()}catch{}u.current=null}}},[r,t.id,s]),F(()=>()=>{d.current&&clearTimeout(d.current)},[]),!n||!m)return null;let f=_(async()=>{if(!(r||!p)){a(!0),i(null),c(null),d.current&&(clearTimeout(d.current),d.current=null);try{await n(t.id)}catch(g){a(!1),i(g instanceof Error?g.message:"Failed to start"),d.current=setTimeout(()=>i(null),5e3)}}},[t.id,r,p,n]),v=l&&(l.status==="starting"||l.status==="running"),b=l&&(l.status==="completed"||l.status==="failed");return e("div",{class:"task-execute-section"},e("button",{class:`task-execute-btn${r?" executing":""}${!p&&!r?" disabled":""}`,onClick:f,disabled:!p||r,title:!p&&!r?`Cannot execute: task is ${t.status}`:r?"Execution in progress\u2026":"Run Hench agent on this task","aria-label":"Execute task with Hench"},e("span",{class:"task-execute-icon"},v?zm[l.status]:r?"\u25D0":"\u25B6"),e("span",{class:"task-execute-label"},v?Bm[l.status]:r?"Starting\u2026":"Execute")),o&&!v?e("span",{class:`task-execute-result${o.startsWith("Execution completed")?" success":" error"}`},o):null,v?e("div",{class:"task-exec-progress"},e("div",{class:"task-exec-progress-bar"},e("div",{class:"task-exec-progress-fill"})),e("span",{class:`task-exec-status task-exec-status-${l.status}`},l.status==="running"?"Agent is working\u2026":"Initializing\u2026"),l.lastOutput?e("div",{class:"task-exec-output"},e("code",null,l.lastOutput)):null):null,b?e("div",{class:`task-exec-done task-exec-done-${l.status}`},e("span",{class:"task-exec-done-icon"},l.status==="completed"?"\u2713":"\u2717"),e("span",{class:"task-exec-done-text"},l.status==="completed"?"Task execution completed":`Failed: ${l.error||"Unknown error"}`)):null)}function jm(t){return(t.tokenUsage.input??0)+(t.tokenUsage.output??0)+(t.tokenUsage.cacheCreationInput??0)+(t.tokenUsage.cacheReadInput??0)}function Zm(t,n){if(!n)return"running\u2026";let s=new Date(n).getTime()-new Date(t).getTime();if(s<0)return"\u2014";let r=Math.floor(s/1e3);if(r<60)return`${r}s`;let a=Math.floor(r/60),o=r%60;if(a<60)return`${a}m ${o}s`;let i=Math.floor(a/60),l=a%60;return`${i}h ${l}m`}function Um(t){let n=Date.now()-new Date(t).getTime(),s=n/(1e3*60*60);if(s<1){let r=Math.floor(n/6e4);return r<=0?"just now":`${r}m ago`}return s<24?`${Math.floor(s)}h ago`:s<168?new Date(t).toLocaleDateString(void 0,{weekday:"short",hour:"numeric",minute:"2-digit"}):new Date(t).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}var Gm={completed:{icon:"\u25CF",color:"var(--green)"},failed:{icon:"\u2715",color:"var(--red)"},error:{icon:"\u2715",color:"var(--red)"},running:{icon:"\u25D0",color:"var(--accent)"},in_progress:{icon:"\u25D0",color:"var(--accent)"}};function Wm(t){return Gm[t]??{icon:"\u25CB",color:"var(--text-dim)"}}function qm({taskId:t,navigateTo:n}){let[s,r]=k([]),[a,o]=k(!0),[i,l]=k(!1);return F(()=>{let c=!1;return o(!0),l(!1),fetch(`/api/hench/runs?taskId=${encodeURIComponent(t)}`).then(u=>{if(!u.ok)throw new Error("fetch failed");return u.json()}).then(u=>{c||(r(u.runs??[]),o(!1))}).catch(()=>{c||(l(!0),o(!1))}),()=>{c=!0}},[t]),a||i||s.length===0?null:e("div",{class:"task-section task-runs-section"},e("div",{class:"task-section-label"},`Hench Runs (${s.length})`),e("div",{class:"task-runs-list"},s.map(c=>{let u=Wm(c.status),d=jm(c);return e("div",{key:c.id,class:`task-run-entry${n?" clickable":""}`,onClick:n?()=>n("hench-runs",{runId:c.id}):void 0,role:n?"button":void 0,tabIndex:n?0:void 0,onKeyDown:n?p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),n("hench-runs",{runId:c.id}))}:void 0,title:n?"View run details":void 0},e("div",{class:"task-run-header"},e("span",{class:"task-run-status",style:`color: ${u.color}`},u.icon),e("span",{class:"task-run-time"},Um(c.startedAt))),e("div",{class:"task-run-meta"},e("span",{class:"task-run-chip"},Zm(c.startedAt,c.finishedAt)),e("span",{class:"task-run-chip"},`${c.turns} turns`),e("span",{class:"task-run-chip task-run-chip-tokens"},Ul(d)+" tokens")))})))}function Wl({item:t,taskUsage:n,weeklyBudget:s,showTokenBudget:r,allItems:a,onUpdate:o,onNavigateToItem:i,onExecuteTask:l,onPrdChanged:c,onAddChild:u,onRemove:d,navigateTo:p}){let[m,f]=k(!1),[v,b]=k(!1),[g,y]=k(""),[h,x]=k(!1),[S,T]=k(!1),[w,C]=k(!1),[I,E]=k(!1),D=n??{totalTokens:0,runCount:0,utilization:st(0,s)},M=D.utilization??st(D.totalTokens,s),R=u!=null&&Yn(t.level)!=null;F(()=>{T(!1),C(!1),E(!1)},[t.id]);let P=_(G=>{!o||G===t.status||(f(!0),o(t.id,{status:G}),setTimeout(()=>f(!1),500))},[t.id,t.status,o]),A=_(G=>{!o||G===t.status&&!t.failureReason||(b(!0),y(""))},[t.status,t.failureReason,o]),j=_(()=>{!o||!g.trim()||(f(!0),o(t.id,{status:"failing",failureReason:g.trim()}),b(!1),x(!1),y(""),setTimeout(()=>f(!1),500))},[t.id,g,o]),U=_(()=>{b(!1),x(!1),y("")},[]),se=_(()=>{x(!0),y(t.failureReason||"")},[t.failureReason]),V=_(G=>{!o||G===t.priority||o(t.id,{priority:G})},[t.id,t.priority,o]),q=_(G=>{o&&o(t.id,{tags:G})},[t.id,o]);return e(Q,null,e("div",{class:"task-meta-header"},e("span",{class:`prd-level-badge prd-level-${t.level}`},Se(t.level)),e("span",{class:"task-id"},t.id.slice(0,8)),e(Fn,{path:`/prd/${t.id}`,compact:!0})),e("div",{class:"task-section"},e(Dm,{title:t.title,onUpdate:o?G=>o(t.id,{title:G}):void 0})),e("div",{class:"task-section"},e("div",{class:"task-section-label"},m?"Status (saving...)":"Status"),e(Rm,{current:t.status,onChange:P,onRequestReason:o?A:void 0}),e(Hm,{item:t,onExecute:l,onPrdChanged:c}),v||h?e("div",{class:"task-failure-input-form"},e("input",{class:"task-failure-input",type:"text",placeholder:"Describe what's failing...",value:g,onInput:G=>y(G.target.value),onKeyDown:G=>{G.key==="Enter"&&g.trim()&&(G.preventDefault(),j()),G.key==="Escape"&&U()},ref:G=>G?.focus()}),e("div",{class:"task-failure-form-actions"},e("button",{class:"task-failure-submit-btn",onClick:j,disabled:!g.trim()},"Set Failing"),e("button",{class:"task-failure-cancel-btn",onClick:U},"Cancel"))):null),e("div",{class:"task-section"},e("div",{class:"task-section-label"},"Description"),e(Pm,{description:t.description,onUpdate:o?G=>o(t.id,{description:G||void 0}):void 0})),t.acceptanceCriteria&&t.acceptanceCriteria.length>0||o?e("div",{class:"task-section"},e(Mm,{criteria:t.acceptanceCriteria??[],onUpdate:o?G=>o(t.id,{acceptanceCriteria:G}):void 0})):null,t.level==="task"||t.level==="subtask"?e("div",{class:"task-section task-usage-section"},e("div",{class:"task-section-label"},"Usage"),e("div",{class:"task-usage-row"},e("span",{class:"label"},"Total Tokens"),e("span",{class:"task-usage-value"},`${Ul(D.totalTokens)} tokens`)),r?e("div",{class:"task-usage-row"},e("span",{class:"label"},"Weekly Utilization"),e("span",{class:"task-usage-value","data-utilization-reason":M.reason},M.label)):null,e("div",{class:"task-usage-hint","data-utilization-reason":r?M.reason:void 0},`${D.runCount} associated run${D.runCount===1?"":"s"}${r?` | reason: ${M.reason}`:""}`)):null,zt(t.level)?e(qm,{taskId:t.id,navigateTo:p}):null,t.status==="failing"&&t.failureReason&&!h?e("div",{class:"task-section task-failure-reason"},e("div",{class:"task-failure-reason-header"},e("div",{class:"task-section-label prd-status-failing"},"Failure Reason"),o?e("button",{class:"task-failure-edit-btn",onClick:se,title:"Edit reason"},"Edit"):null),e("div",{class:"task-failure-text"},t.failureReason)):null,e("div",{class:"task-section"},e("div",{class:"task-section-label"},"Priority"),e(Em,{current:t.priority,onChange:V})),e("div",{class:"task-section"},e("div",{class:"task-section-label"},"Tags"),e(Im,{tags:t.tags??[],onUpdate:q})),e("div",{class:"task-section"},e("div",{class:"task-section-label"},`Requirements (${(t.requirements??[]).length})`),e(Om,{requirements:t.requirements??[],onAdd:o?G=>{let K="req-"+Date.now().toString(36),N={...G,id:K},$=t.requirements??[];o(t.id,{requirements:[...$,N]})}:void 0,onRemove:o?G=>{let K=t.requirements??[];o(t.id,{requirements:K.filter(N=>N.id!==G)})}:void 0})),t.blockedBy&&t.blockedBy.length>0?e("div",{class:"task-section"},e(_m,{blockedBy:t.blockedBy,allItems:a,onNavigate:i})):null,R||t.children&&t.children.length>0?e("div",{class:"task-section"},t.children&&t.children.length>0?e($m,{children:t.children,onNavigate:i}):null,R?S?e(Am,{parentId:t.id,parentLevel:t.level,onSubmit:async G=>{await u(G),T(!1)},onCancel:()=>T(!1)}):e("button",{class:"task-add-child-btn",onClick:()=>T(!0),title:`Add ${Se(Yn(t.level)??"child")} to this ${Se(t.level)}`},`+ Add ${Se(Yn(t.level)??"child")}`):null):null,t.startedAt||t.completedAt?e("div",{class:"task-section task-timestamps"},e("div",{class:"task-section-label"},"Timeline"),t.startedAt?e("div",{class:"detail-row"},e("span",{class:"label"},"Started"),e("span",null,xn(t.startedAt))):null,t.completedAt?e("div",{class:"detail-row"},e("span",{class:"label"},"Completed"),e("span",null,xn(t.completedAt))):null):null,d?e("div",{class:"task-section task-danger-zone"},e("div",{class:"task-section-label task-danger-label"},"Danger Zone"),w?e("div",{class:"task-remove-confirm"},e("p",{class:"task-remove-confirm-msg"},`Are you sure you want to delete this ${Se(t.level)}`,t.children&&t.children.length>0?` and all its ${t.children.length} descendant${t.children.length!==1?"s":""}?`:"?"),e("div",{class:"task-remove-confirm-actions"},e("button",{class:"task-remove-confirm-btn",onClick:async()=>{E(!0);try{await d(t.id)}catch{E(!1),C(!1)}},disabled:I},I?"Deleting...":"Yes, Delete"),e("button",{class:"task-remove-cancel-btn",onClick:()=>C(!1),disabled:I},"Cancel"))):e("button",{class:"task-remove-btn",onClick:()=>C(!0),title:`Delete this ${Se(t.level)} and all its descendants`},e("span",{class:"task-remove-btn-icon"},"\u2717"),`Delete ${Se(t.level)}`)):null)}var Km=["status","title","priority","description","startedAt","completedAt","failureReason"];function Ym(t,n){if(t===n)return!0;for(let s of Km)if(t[s]!==n[s])return!1;return!(!_a(t.tags,n.tags)||!_a(t.blockedBy,n.blockedBy)||!_a(t.acceptanceCriteria,n.acceptanceCriteria))}function _a(t,n){if(t===n)return!0;if(!t||!n||t.length!==n.length)return!1;for(let s=0;s<t.length;s++)if(t[s]!==n[s])return!1;return!0}function ql(t,n){if(t===n)return t;let s=new Map;for(let o of t)s.set(o.id,o);let r=t.length!==n.length,a=new Array(n.length);for(let o=0;o<n.length;o++){let i=n[o],l=s.get(i.id);if(!l){a[o]=i,r=!0;continue}!r&&(o>=t.length||t[o].id!==i.id)&&(r=!0);let c=l.children??[],u=i.children??[],d=ql(c,u),p=d!==c;!!Ym(l,i)&&!p?a[o]=l:(r=!0,a[o]={...i,children:d.length>0?d:i.children})}return r?a:t}function Kl(t,n){if(!t)return n;let s=ql(t.items,n.items),r=t.title!==n.title,a=t.schema!==n.schema;return!r&&!a&&s===t.items?t:{...n,items:s}}function Jn(t,n,s){let r=!1,a=new Array(t.length);for(let o=0;o<t.length;o++){let i=t[o];if(i.id===n){a[o]={...i,...s},r=!0;continue}if(i.children&&i.children.length>0){let l=Jn(i.children,n,s);if(l!==i.children){a[o]={...i,children:l},r=!0;continue}}a[o]=i}return r?a:t}function Yl({data:t,setData:n,fetchPRDData:s,fetchTaskUsage:r,showToast:a,onSelectItem:o,onDetailContent:i,taskUsageById:l,weeklyBudget:c,showTokenBudget:u,navigateTo:d}){let[p,m]=k(null),[f,v]=k(null),{selectedItemId:b,setSelectedItemId:g,bulkSelectedIds:y,setBulkSelectedIds:h,selectedItems:x,handleSelectItem:S,handleBulkSelect:T,clearBulkSelection:w,handleNavigateToItem:C}=Dl({data:t,onSelectItem:o}),{deleteTarget:I,setDeleteTarget:E,deletingItemId:D,handleRemoveItemFromTree:M,handleConfirmDelete:R,handleRemoveFromDetail:P}=xl({data:t,setData:n,fetchPRDData:s,fetchTaskUsage:r,showToast:a,selectedItemId:b,setSelectedItemId:g,setBulkSelectedIds:h,onDetailContent:i}),A=_(async($,z)=>{n(O=>{if(!O)return O;let X=Jn(O.items,$,z);return X===O.items?O:{...O,items:X}});try{let O=await fetch(`/api/rex/items/${$}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(z)});if(!O.ok){console.error("Failed to update item:",await O.text()),await s();return}await s(),await r()}catch(O){console.error("Failed to update item:",O),await s()}},[n,s,r]),j=_(async $=>{let z=await fetch("/api/rex/items",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($)});if(!z.ok){let X=await z.json().catch(()=>({error:"Failed to add item"}));throw new Error(X.error||`HTTP ${z.status}`)}let O=await z.json();a(`Created ${O.level}: ${O.title}`),await s(),await r()},[s,r,a]),U=_(async $=>{let z=await fetch("/api/hench/execute",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({taskId:$})}),O=await z.json();if(!z.ok)throw new Error(O.error||`HTTP ${z.status}`);a("Hench execution started for task")},[a]),se=_(async $=>{let z=await fetch("/api/rex/items",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($)});if(!z.ok){let X=await z.json().catch(()=>({error:"Failed to add item"}));throw new Error(X.error||`HTTP ${z.status}`)}let O=await z.json();a(`Created ${O.level}: ${O.title}`),m(null),v(null),await s(),await r()},[s,r,a]),V=_(async $=>{let z=await fetch("/api/rex/items",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($)});if(!z.ok){let X=await z.json().catch(()=>({error:"Failed to add item"}));throw new Error(X.error||`HTTP ${z.status}`)}let O=await z.json();a(`Created ${O.level}: ${O.title}`),await s(),await r()},[s,r,a]),q=_(()=>{m(null),h(new Set),a("Items merged successfully"),s(),r()},[h,s,r,a]),G=_(()=>{m(null),a("Completed items pruned and archived"),s(),r()},[s,r,a]),K=_(()=>{m("merge")},[]),N=_(()=>{if(!t||!b||!i){i&&i(null);return}let $=Pe(t.items,b);if(!$){i(null);return}o&&o({type:"prd",title:$.title,id:$.id,level:$.level,status:$.status,description:$.description,acceptanceCriteria:$.acceptanceCriteria,priority:$.priority,tags:$.tags,blockedBy:$.blockedBy,startedAt:$.startedAt,completedAt:$.completedAt}),i(e(Wl,{item:$,taskUsage:l[$.id],weeklyBudget:c,showTokenBudget:u??!1,allItems:t.items,onUpdate:A,onNavigateToItem:C,onExecuteTask:U,onPrdChanged:()=>{s(),r()},onAddChild:j,onRemove:P,navigateTo:d}))},[t,b,l,c,u,o,i,A,C,U,s,r,j,P,d]);return{selectedItemId:b,activeTab:p,setActiveTab:m,addParentId:f,setAddParentId:v,bulkSelectedIds:y,selectedItems:x,deleteTarget:I,setDeleteTarget:E,deletingItemId:D,handleItemUpdate:A,handleSelectItem:S,handleBulkSelect:T,clearBulkSelection:w,handleNavigateToItem:C,handleAddChild:j,handleExecuteTask:U,handleAddItem:se,handleInlineAddItem:V,handleRemoveItemFromTree:M,handleConfirmDelete:R,handleRemoveFromDetail:P,handleMergeComplete:q,handlePruneComplete:G,handleOpenMerge:K,syncDetailContent:N}}function Da(t){let n=t.onMessage,s=t.defaultDelayMs??250,r=t.delays??{},a=t.maxPendingPerType??20,o=t.throttledTypes===void 0?null:t.throttledTypes instanceof Set?t.throttledTypes:new Set(t.throttledTypes),i=new Map,l=!1;function c(y){return o===null?!0:o.has(y)}function u(y){return r[y]??s}function d(y){let h=i.get(y);return h||(h={pending:[],timer:null},i.set(y,h)),h}function p(y){y.timer!==null&&(clearTimeout(y.timer),y.timer=null)}function m(y){let h=i.get(y);if(!h||h.pending.length===0)return;p(h);let x=h.pending;h.pending=[];for(let S of x)n(S)}function f(y,h){p(h),h.timer=setTimeout(()=>{h.timer=null,m(y)},u(y))}function v(y){if(l)return;let h=y.type;if(!c(h)){n(y);return}let x=d(h);if(x.pending.push(y),x.pending.length>=a){m(h);return}f(h,x)}function b(){if(!l)for(let y of i.keys())m(y)}function g(){l=!0;for(let y of i.values())p(y),y.pending=[];i.clear()}return{push:v,flush:b,dispose:g}}function Pa(t){let n=t.windowMs??150,s=t.maxBatchSize??50,r=t.onFlush,a=t.onMessage??null,o=[],i=new Set,l=new Map,c=null,u=!1;function d(){c!==null&&(clearTimeout(c),c=null)}function p(){return{types:i,countByType:l,messages:o,size:o.length}}function m(){o=[],i=new Set,l=new Map}function f(){if(d(),o.length===0)return;let h=p();m(),r(h)}function v(){d(),c=setTimeout(f,n)}function b(h){if(!u){if(a&&a(h),o.push(h),i.add(h.type),l.set(h.type,(l.get(h.type)??0)+1),o.length>=s){f();return}v()}}function g(){u||f()}function y(){u=!0,d(),m()}return{push:b,flush:g,dispose:y}}function Qn(t){let n=Pa({onMessage:t.onMessage,onFlush:t.onFlush,windowMs:t.coalescerWindowMs}),s=Da({onMessage:r=>n.push(r),defaultDelayMs:t.defaultDelayMs,delays:t.delays,throttledTypes:t.throttledTypes,maxPendingPerType:t.maxPendingPerType});return{push(r){s.push(r)},flush(){s.flush(),n.flush()},dispose(){s.dispose(),n.dispose()}}}function Ma(t,n){let s=n?.minIntervalMs??500,r=0,a=!1,o=null,i=null,l=null,c=null,u=!1;function d(){return r=Date.now(),a=!0,t().then(b=>(a=!1,b),b=>{throw a=!1,b})}function p(){if(u)return Promise.reject(new Error("CallRateLimiter has been disposed"));let g=Date.now()-r;if(g>=s)return d();if(c!==null)return c;c=new Promise((h,x)=>{i=h,l=x});let y=s-g;return o=setTimeout(()=>{let h=i,x=l;o=null,i=null,l=null,c=null,d().then(h,x)},y),c}function m(){return a}function f(){return c!==null}function v(){u=!0,o!==null&&(clearTimeout(o),o=null),i=null,l=null,c=null,a=!1}return{execute:p,isExecuting:m,isPending:f,dispose:v}}function Sn(t,n){let s=hs(t),r=Ma(()=>s.execute(),{minIntervalMs:n?.minIntervalMs});return{execute(){return r.execute()},isExecuting(){return r.isExecuting()},isPending(){return r.isPending()},isInFlight(){return s.isInFlight()},dispose(){r.dispose(),s.dispose()}}}function Xm(t){let n=t?.source,s=t?.budget;return{budget:typeof s=="number"&&Number.isFinite(s)?s:null,source:n??"missing_budget"}}function Jm(t,n){let s={};for(let[r,a]of Object.entries(t))s[r]={totalTokens:a.totalTokens,runCount:a.runCount,utilization:st(a.totalTokens,n)};return s}function Qm(t,n){let s={};for(let[r,a]of Object.entries(t))s[r]={...a,utilization:st(a.totalTokens,n)};return s}function Xl(t){let[n,s]=k(t??null),[r,a]=k(!t),[o,i]=k(null),[l,c]=k({}),[u,d]=k(null),p=H(u);p.current=u;let m=H(Sn(async()=>{try{let g=await fetch("/data/prd.json");if(!g.ok){g.status===404?i("No PRD data found. Run 'rex init' then 'rex analyze' to create one."):i(`Failed to load PRD data (${g.status})`);return}let y=await g.json();s(h=>Kl(h,y)),i(null)}catch{i("Could not fetch PRD data. Is the server running?")}},{minIntervalMs:500})),f=_(async()=>{await m.current.execute()},[]),v=H(Sn(async()=>{let[g,y]=await Promise.allSettled([fetch("/api/hench/task-usage"),fetch("/api/token/utilization")]),h=p.current;if(y.status==="fulfilled"&&y.value.ok)try{let x=await y.value.json();h=Xm(x.weeklyBudget),d(h),c(S=>Qm(S,h))}catch{}if(g.status==="fulfilled"&&g.value.ok)try{let x=await g.value.json();c(Jm(x.taskUsage??{},h))}catch{}},{minIntervalMs:500})),b=_(async()=>{await v.current.execute()},[]);return F(()=>{if(t){s(t),a(!1),b();return}f().then(()=>a(!1)),b()},[t,f,b]),Me("prd:task-usage",b,1e4),F(()=>{let g=m.current,y=v.current;return()=>{g.dispose(),y.dispose()}},[]),{data:n,setData:s,loading:r,error:o,setError:i,taskUsageById:l,weeklyBudget:u,fetchPRDData:f,fetchTaskUsage:b}}function Jl({initialTaskId:t,loading:n,data:s,onSelectItem:r}){let[a,o]=k(null),[i,l]=k(null),[c,u]=k(null),d=H(!1),p=H(r);return p.current=r,F(()=>{if(d.current||!t||n||!s)return;d.current=!0;let m=Pe(s.items,t);if(!m){o(`Task "${t}" not found`),history.replaceState({view:"prd",file:null,zone:null,runId:null,taskId:null},"","/prd");return}let f=wl(s.items,t);f.length>0&&u(new Set(f)),l(t),p.current(m);let v=setTimeout(()=>l(null),3e3);return()=>clearTimeout(v)},[t,n,s]),{deepLinkError:a,setDeepLinkError:o,highlightedTaskId:i,deepLinkExpandIds:c}}function Ql({setData:t,fetchPRDData:n,fetchTaskUsage:s}){F(()=>{let r=null,a=fa(),o=da({batcher:a}),i=Qn({onMessage:c=>{if(c.type==="rex:item-updated"&&c.itemId&&c.updates){o.schedule(t,u=>{if(!u)return u;let d=Jn(u.items,c.itemId,c.updates);return d===u.items?u:{...u,items:d}});return}c.type==="rex:item-deleted"&&c.itemId&&o.schedule(t,u=>{if(!u)return u;let d=kn(u.items,c.itemId);return d===u.items?u:{...u,items:d}})},onFlush:c=>{o.flush(),(c.types.has("rex:item-updated")||c.types.has("rex:item-deleted")||c.types.has("rex:prd-changed"))&&(n(),s())},defaultDelayMs:250,delays:{"rex:prd-changed":300,"rex:item-updated":200,"rex:item-deleted":200},throttledTypes:["rex:prd-changed","rex:item-updated","rex:item-deleted"],maxPendingPerType:20}),l=pa({flushDownstream:[()=>i.flush(),()=>o.flush()],onResume:()=>{n(),s()}});try{let c=location.protocol==="https:"?"wss:":"ws:";r=new WebSocket(`${c}//${location.host}`),r.onmessage=u=>{try{let d=JSON.parse(u.data);if(!l.accept())return;i.push(d)}catch{}}}catch{}return()=>{if(l.dispose(),i.dispose(),o.dispose(),a.dispose(),r)try{r.close()}catch{}}},[t,n,s])}var Ws=null,Gs=null;async function eg(){try{let t=await fetch("/api/project");return t.ok?await t.json():null}catch{return null}}function tg(){return Ws?Promise.resolve(Ws):(Gs||(Gs=eg().then(t=>(Ws=t,Gs=null,t))),Gs)}function qs(){let[t,n]=k(Ws);return F(()=>{tg().then(s=>{s&&n(s)})},[]),t}var ng=1e4,ec=null,es=null;async function sg(){return es||(es=(async()=>{try{let t=await fetch("/api/status");if(!t.ok)return null;let n=await t.json();return ec=n,n}catch{return null}finally{es=null}})(),es)}function Ks(){let[t,n]=k(ec),s=H(!0),[r,a]=k(()=>Ne("autoRefresh"));F(()=>Fe(l=>{a(l.disabledFeatures.has("autoRefresh"))}),[]);let o=_(async()=>{let i=await sg();s.current&&n(i)},[]);return F(()=>{s.current=!0,o();let i=null,l=Qn({onFlush:c=>{if(!s.current)return;(c.types.has("hench:run-changed")||c.types.has("hench:task-execution-progress")||c.types.has("rex:prd-changed"))&&o()},defaultDelayMs:250,delays:{"rex:prd-changed":300,"hench:task-execution-progress":200},throttledTypes:["rex:prd-changed","hench:task-execution-progress"],maxPendingPerType:20});try{let c=location.protocol==="https:"?"wss:":"ws:";i=new WebSocket(`${c}//${location.host}`),i.onmessage=u=>{if(s.current)try{let d=JSON.parse(u.data);l.push(d)}catch{}}}catch{}return()=>{if(s.current=!1,l.dispose(),i)try{i.close()}catch{}}},[o]),Me("status-indicators",o,ng,!r),t}var tc=5e3,nc=800,sc={normal:1,elevated:2,warning:4,critical:1/0},rg={normal:3,elevated:2,warning:1,critical:0},$a={low:0,normal:1,high:2},Tn={baseIntervalMs:tc,avgRefreshMs:nc,onChange:null},We=[],ts=0,rc=0,Oe="normal",Ys=null,Cn=null,Xs=[];function ag(){let t=sc[Oe];return isFinite(t)?Tn.baseIntervalMs*t:1/0}function ns(){return rg[Oe]}function og(){let t=We.length+ts;if(t===0)return 0;if(Oe==="critical")return-1;let n=ns();return n===0?-1:Math.ceil(t/n)*Tn.avgRefreshMs}function ac(){return{queueLength:We.length,activeCount:ts,paused:Oe==="critical",memoryLevel:Oe,recommendedIntervalMs:ag(),maxConcurrency:ns(),estimatedCompletionMs:og(),completedCount:rc}}function ss(){let t=ac();Tn.onChange&&Tn.onChange(t);for(let n of Xs)n(t)}function ig(){We.sort((t,n)=>{let s=$a[n.priority]-$a[t.priority];return s!==0?s:t.enqueuedAt.localeCompare(n.enqueuedAt)})}function lg(){let t=ns();for(;We.length>0&&ts<t;){let n=We.shift();if(!n)break;ts++,ss(),n.execute().catch(()=>{}).finally(()=>{ts--,rc++,ss(),rs()})}}function rs(){Cn===null&&(Cn=setTimeout(()=>{Cn=null,lg()},0))}function cg(t){let n=t.level;if(n===Oe)return;let s=Oe;Oe=n,ss(),$a[n]===void 0&&ns()>0&&rs(),ns()>0&&We.length>0&&rs()}function oc(t={}){Aa(),Tn={baseIntervalMs:t.baseIntervalMs??tc,avgRefreshMs:t.avgRefreshMs??nc,onChange:t.onChange??null};let n=fn();n?Oe=n.level:Oe=ll(),Ys=pn(cg),ss(),We.length>0&&rs()}function Aa(){Ys&&(Ys(),Ys=null),Cn!==null&&(clearTimeout(Cn),Cn=null)}function ic(t,n,s="normal"){We=We.filter(a=>a.key!==t);let r={key:t,execute:n,priority:s,enqueuedAt:new Date().toISOString()};return We.push(r),ig(),ss(),rs(),!0}function lc(t=Tn.baseIntervalMs){let n=sc[Oe];return isFinite(n)?t*n:1/0}function cc(t){return Xs.push(t),()=>{Xs=Xs.filter(n=>n!==t)}}function La(){return ac()}function uc(t={}){let{baseIntervalMs:n=5e3,avgRefreshMs:s=800,enabled:r=!0}=t,[a,o]=k(La);F(()=>{if(!r)return;oc({baseIntervalMs:n,avgRefreshMs:s});let c=cc(u=>{o(u)});return o(La()),()=>{c(),Aa()}},[r,n,s]);let i=_((c,u,d)=>ic(c,u,d),[]),l=_(c=>lc(c),[a]);return{state:a,queueLength:a.queueLength,isProcessing:a.activeCount>0,paused:a.paused,memoryLevel:a.memoryLevel,recommendedIntervalMs:a.recommendedIntervalMs,estimatedCompletionMs:a.estimatedCompletionMs,enqueue:i,getInterval:l}}var ug=new Set(["prd","hench-runs"]);function dc(t,n){let s=t.trim().toLowerCase(),r=(n??"").trim().toLowerCase();return(s==="rex-dashboard"||s==="rex")&&(r==="token-usage"||r==="token_usage"||r==="llm-utilization")?"token-usage":null}function dg(t){let s=(t.startsWith("#")?t.slice(1):t).trim();try{s=decodeURIComponent(s)}catch{}s=s.replace(/^\/+/,""),s.startsWith("sourcevision/")&&(s=s.slice(13)),s.startsWith("sourcevision:")&&(s=s.slice(13));let r=s.search(/[?&]/);return r>=0&&(s=s.slice(0,r)),s.replace(/^\/+/,"").replace(/\/+$/,"")}function pg(t){let n=t.trim().toLowerCase();return n==="prmarkdown"||n==="pr_markdown"?"pr-markdown":n}function pc(t,n){let s=t.slice(1).replace(/^\/+/,"").replace(/\/+$/,"");if(!s)return null;let r=s.indexOf("/"),a=r>0?s.slice(0,r):s,o=r>0?s.slice(r+1):"",i=dc(a,o||null);if(i&&n.has(i))return{view:i,subId:null};if(n.has(s))return{view:s,subId:null};if(r>0){let l=a;if(n.has(l)&&o&&ug.has(l))return{view:l,subId:o}}return null}function Fa(t,n){if(!t)return null;let s=dg(t);if(!s)return null;let r=s.indexOf("/"),a=r>0?s.slice(0,r):s,o=r>0?s.slice(r+1):"",i=dc(a,o||null);if(i&&n.has(i))return{view:i,subId:null};let l=pg(a),c=o?`/${l}/${o}`:`/${l}`,u=pc(c,n);return u||null}function as(t,n,s){return Fa(n,s)??pc(t,s)}function fc(t){return t.values().next().value}function fg(t){return as(location.pathname,location.hash,t)?.view??fc(t)}function mg(t){let n=as(location.pathname,location.hash,t);return!n||n.view!=="hench-runs"?null:n.subId}function gg(t){let n=as(location.pathname,location.hash,t);return!n||n.view!=="prd"?null:n.subId}function mc(t){let[n,s]=k(()=>fg(t)),[r,a]=k(()=>mg(t)),[o,i]=k(()=>gg(t)),[l,c]=k(null),[u,d]=k(null),p=_((f,v)=>{let b=v?.file??null,g=v?.zone??null,y=v?.runId??null,h=v?.taskId??null;c(b),d(g),a(y),i(h),s(f);let x=y??h,S=x?`/${f}/${x}`:`/${f}`;history.pushState({view:f,file:b,zone:g,runId:y,taskId:h},"",S)},[]),m=_(f=>{c(null),d(null),a(null),i(null),s(f),history.pushState({view:f,file:null,zone:null,runId:null,taskId:null},"",`/${f}`)},[]);return F(()=>{let f=Fa(location.hash,t);if(f){let b=f.view==="hench-runs",g=f.view==="prd",y=b?f.subId:null,h=g?f.subId:null;s(f.view),c(null),d(null),a(y),i(h);let x=f.subId?`/${f.view}/${f.subId}`:`/${f.view}`;history.replaceState({view:f.view,file:null,zone:null,runId:y,taskId:h},"",x)}else{let b=r??o,g=b?`/${n}/${b}`:`/${n}`;history.replaceState({view:n,file:l,zone:u,runId:r,taskId:o},"",g)}let v=b=>{if(b.state){let S=b.state;if(S.view&&t.has(S.view)){s(S.view),c(S.file??null),d(S.zone??null),a(S.runId??null),i(S.taskId??null);return}}let g=as(location.pathname,location.hash,t)??{view:fc(t),subId:null};s(g.view),c(null),d(null);let y=g.view==="hench-runs",h=g.view==="prd";a(y?g.subId:null),i(h?g.subId:null);let x=g.subId?`/${g.view}/${g.subId}`:`/${g.view}`;history.replaceState({view:g.view,file:null,zone:null,runId:y?g.subId:null,taskId:h?g.subId:null},"",x)};return window.addEventListener("popstate",v),()=>{window.removeEventListener("popstate",v)}},[]),{view:n,selectedFile:l,setSelectedFile:c,selectedZone:u,selectedRunId:r,selectedTaskId:o,navigateTo:p,handleSidebarNav:m}}var hg=80,gc=28,vc=10,vg=22,hc=15;function Na(t,n,s,r){let a=t.y+hg-4,o=Math.min(s,vc);for(let i=0;i<o;i++)if(a+=gc,r?.has(n[i].id)){let l=Math.min(n[i].files.length,hc);a+=l*vg+(n[i].files.length>hc?20:0)}return a+gc/2}function bg(t,n,s){let r=t.x+t.w/2,a=t.y+t.h/2,o=n-r,i=s-a;if(o===0&&i===0)return{x:r,y:a};let l=t.w/2,c=t.h/2,u=o!==0?l/Math.abs(o):1/0,d=i!==0?c/Math.abs(i):1/0,p=Math.min(u,d);return{x:r+o*p,y:a+i*p}}function bc(t,n,s,r,a,o){let i=B(()=>{let c=[];for(let[u,d]of a){if(!s.has(u)||!d.subZones||d.subZones.length===0)continue;let p=n.get(u);if(!p)continue;let m=r.get(u),f=d.subZones.slice(0,vc),v=new Map(f.map((g,y)=>[g.id,y]));if(d.subCrossings)for(let g of d.subCrossings){let y=v.get(g.from),h=v.get(g.to);if(y===void 0||h===void 0)continue;let x=Na(p,f,y,m),S=Na(p,f,h,m),T=p.x+p.w+30,w=`M ${p.x+p.w} ${x} C ${T} ${x} ${T} ${S} ${p.x+p.w} ${S}`,C=f[y];c.push({key:`szc-${u}-${g.from}-${g.to}`,d:w,color:C.color,weight:g.weight,dashed:!0})}let b=new Map;for(let g=0;g<f.length;g++)for(let y of f[g].files)b.set(y.path,g);for(let g of t){let y=g.from===u,h=g.to===u;if(!y&&!h)continue;let x=y?g.to:g.from,S=n.get(x);if(!S)continue;let T=new Map;for(let[w,C]of o){let I=b.get(w);if(I!==void 0)for(let E of C)E.targetZoneId===x&&T.set(I,(T.get(I)??0)+E.weight)}for(let[w,C]of T){let I=Na(p,f,w,m),E=S.x>p.x?p.x+p.w:p.x,D=Math.max(p.y+4,Math.min(I,p.y+p.h-4)),M=bg(S,E,D),R=M.x-E,P=E+R*.4,A=E+R*.6,j=`M ${E} ${D} C ${P} ${D} ${A} ${M.y} ${M.x} ${M.y}`,U=f[w];c.push({key:`sze-${u}-${U.id}-${x}`,d:j,color:U.color,weight:C})}}}return c},[t,n,s,r,a,o]),l=B(()=>{let c=new Set;for(let u of t){let d=a.get(u.from),p=a.get(u.to),m=s.has(u.from)&&d?.subZones?.length,f=s.has(u.to)&&p?.subZones?.length;(m||f)&&i.some(b=>b.key.includes(u.from)||b.key.includes(u.to))&&c.add(`${u.from}->${u.to}`)}return c},[t,s,a,i]);return{subZoneEdgeElements:i,hiddenZoneEdges:l}}function yc(t,n){let s=H(t);s.current=t;let r=H(n);r.current=n;let a=_(()=>r.current(s.current),[]),[o,i]=k(a),l=H(o);return F(()=>{let c=a();c!==l.current&&(l.current=c,i(c))},[t,a]),F(()=>ua(a,i,l),[a]),o}function kc(){let[t,n]=k(null),[s,r]=k("success"),a=_((o,i="success",l=3e3)=>{n(o),r(i),setTimeout(()=>n(null),l)},[]);return{toast:t,toastType:s,showToast:a}}function wc(t,n){let[s,r]=k(new Map),a=H(null),o=_(()=>a.current!==null,[]),i=_((u,d)=>{let p=s.get(u)??{dx:0,dy:0};a.current={zoneId:u,startX:d.clientX,startY:d.clientY,origDx:p.dx,origDy:p.dy,moved:!1}},[s]),l=_(u=>{if(!a.current||!t.current)return;let d=t.current.getBoundingClientRect(),p=n.w/d.width,m=n.h/d.height,f=(u.clientX-a.current.startX)*p,v=(u.clientY-a.current.startY)*m;if(!a.current.moved&&(Math.abs(f)>3||Math.abs(v)>3)&&(a.current.moved=!0),a.current.moved){let b=a.current.zoneId,g=a.current.origDx+f,y=a.current.origDy+v;r(h=>{let x=new Map(h);return x.set(b,{dx:g,dy:y}),x})}},[t,n.w,n.h]),c=_(()=>{if(!a.current)return null;let u=a.current.moved?null:a.current.zoneId;return a.current=null,u},[]);return{dragOffsets:s,isDragging:o,startDrag:i,moveDrag:l,endDrag:c}}function Rn({startedAt:t,formatter:n,class:s,title:r}){let a=yc(t,n);return e("span",{class:s??void 0,title:r??void 0,"data-elapsed":!0},a)}var yg=5*60*1e3;function kg(t){return t.lastActivityAt?Date.now()-new Date(t.lastActivityAt).getTime()>yg:!0}function xc(t){let n=Date.now()-new Date(t).getTime();if(n<0)return"0s";let s=Math.floor(n/1e3);if(s<60)return`${s}s`;let r=Math.floor(s/60),a=s%60;if(r<60)return`${r}m ${a}s`;let o=Math.floor(r/60),i=r%60;return`${o}h ${i}m`}function Js(t){return new Date(t).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",second:"2-digit"})}function wg({run:t,navigateTo:n}){let s=kg(t);return e("div",{class:`active-task-card${s?" active-task-card-stale":""}`},e("div",{class:"active-task-pulse-wrapper","aria-hidden":"true"},e("span",{class:`active-task-pulse${s?" active-task-pulse-stale":""}`})),e("div",{class:"active-task-content"},e("div",{class:"active-task-title-row"},n&&t.taskId?e(Ae,{task:{id:t.taskId,title:t.taskTitle,status:t.taskStatus??"in_progress"},navigateTo:n,compact:!0,showStatus:!1,class:"active-task-link"}):e("span",{class:"active-task-title"},t.taskTitle),s?e("span",{class:"active-task-stale-badge"},"Possibly stuck"):null),e("div",{class:"active-task-meta"},e("span",{class:"active-task-elapsed",title:"Elapsed time"},e("span",{class:"active-task-meta-icon","aria-hidden":"true"},"\u23F1"),e(Rn,{startedAt:t.startedAt,formatter:xc})),e("span",{class:"active-task-started",title:`Started at ${Js(t.startedAt)}`},e("span",{class:"active-task-meta-icon","aria-hidden":"true"},"\u25B6"),Js(t.startedAt)),t.turns>0?e("span",{class:"active-task-turns",title:`${t.turns} turns completed`},e("span",{class:"active-task-meta-icon","aria-hidden":"true"},"\u21BB"),`${t.turns} turns`):null,e("span",{class:`active-task-model active-task-model-${t.model}`},t.model))))}function xg({exec:t}){let n=t.status==="starting";return e("div",{class:`active-task-card${n?" active-task-card-starting":""}`},e("div",{class:"active-task-pulse-wrapper","aria-hidden":"true"},e("span",{class:`active-task-pulse${n?" active-task-pulse-starting":""}`})),e("div",{class:"active-task-content"},e("div",{class:"active-task-title-row"},e("span",{class:"active-task-title"},t.taskTitle),n?e("span",{class:"active-task-starting-badge"},"Starting\u2026"):null),e("div",{class:"active-task-meta"},e("span",{class:"active-task-elapsed",title:"Elapsed time"},e("span",{class:"active-task-meta-icon","aria-hidden":"true"},"\u23F1"),e(Rn,{startedAt:t.startedAt,formatter:xc})),e("span",{class:"active-task-started",title:`Started at ${Js(t.startedAt)}`},e("span",{class:"active-task-meta-icon","aria-hidden":"true"},"\u25B6"),Js(t.startedAt)))))}function Oa({runs:t,navigateTo:n}){let[s,r]=k([]),a=H(null),o=_(async()=>{try{let u=await fetch("/api/hench/execute/status");if(u.ok){let p=((await u.json()).executions??[]).filter(m=>m.status==="running"||m.status==="starting");r(p)}}catch{}},[]);F(()=>{let u=!0;o();let p=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,m=null;try{m=new WebSocket(p),a.current=m,m.onmessage=v=>{if(u)try{let b=JSON.parse(v.data);if(b.type==="hench:task-execution-progress"&&b.state){let g=b.state;r(y=>{if(g.status==="completed"||g.status==="failed")return y.filter(x=>x.taskId!==g.taskId);let h=y.findIndex(x=>x.taskId===g.taskId);if(h>=0){let x=[...y];return x[h]=g,x}return[...y,g]})}}catch{}},m.onclose=()=>{a.current=null}}catch{}let f=setInterval(o,5e3);return()=>{if(u=!1,clearInterval(f),m)try{m.close()}catch{}a.current=null}},[o]);let i=new Set(t.map(u=>u.taskId)),l=s.filter(u=>!i.has(u.taskId)),c=t.length+l.length;return c===0?null:e("div",{class:"active-tasks-panel",role:"region","aria-label":`${c} active task${c===1?"":"s"}`},e("div",{class:"active-tasks-header"},e("div",{class:"active-tasks-header-left"},e("span",{class:"active-tasks-icon","aria-hidden":"true"},"\u25D0"),e("h3",{class:"active-tasks-title"},`Active Task${c===1?"":"s"}`),e("span",{class:"active-tasks-count"},String(c)))),e("div",{class:"active-tasks-list"},...t.map(u=>e(wg,{key:u.id,run:u,navigateTo:n})),...l.map(u=>e(xg,{key:u.runId,exec:u}))))}var Sg={low:{color:"var(--green)",barColor:"var(--green)",label:"Available",icon:"\u25CF"},moderate:{color:"var(--accent)",barColor:"var(--accent)",label:"Active",icon:"\u25D0"},high:{color:"var(--orange)",barColor:"var(--orange)",label:"Nearing limit",icon:"\u25D5"},at_limit:{color:"var(--red)",barColor:"var(--red)",label:"At limit",icon:"\u25CF"}},Cg={processCount:0,maxConcurrent:3,slotsAvailable:3,level:"low",utilization:0,totalRunning:0,dashboardActive:0,diskRunning:0,pendingTasks:0,timestamp:""};function Va(){let[t,n]=k(Cg),[s,r]=k(!1),a=H(null),o=_(async()=>{try{let b=await fetch("/api/hench/concurrency");if(b.ok){let g=await b.json();n(g),r(!0)}}catch{}},[]);if(F(()=>{let b=!0;o();let y=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,h=null;try{h=new WebSocket(y),a.current=h,h.onmessage=S=>{if(b)try{let T=JSON.parse(S.data);T.type==="hench:concurrency-status"&&(n(w=>({processCount:T.processCount,maxConcurrent:T.maxConcurrent,slotsAvailable:T.slotsAvailable,level:T.level,utilization:T.utilization,totalRunning:T.totalRunning,dashboardActive:T.dashboardActive,diskRunning:T.diskRunning,pendingTasks:w.pendingTasks,timestamp:T.timestamp})),r(!0))}catch{}},h.onclose=()=>{a.current=null}}catch{}let x=setInterval(o,15e3);return()=>{if(b=!1,clearInterval(x),h)try{h.close()}catch{}a.current=null}},[o]),!s)return null;let{processCount:i,maxConcurrent:l,slotsAvailable:c,level:u,utilization:d,totalRunning:p,pendingTasks:m}=t,f=Sg[u],v=Math.round(d*100);return e("div",{class:`concurrency-panel concurrency-panel-${u}`,role:"region","aria-label":"Concurrent execution status"},e("div",{class:"concurrency-header"},e("div",{class:"concurrency-header-left"},e("span",{class:`concurrency-icon concurrency-icon-${u}`,"aria-hidden":"true"},f.icon),e("h3",{class:"concurrency-title"},"Concurrency"),e("span",{class:`concurrency-level-badge concurrency-level-${u}`},f.label)),e("div",{class:"concurrency-header-right"},e("span",{class:"concurrency-ratio",style:`color: ${f.color}`},e("span",{class:"concurrency-ratio-current"},String(i)),e("span",{class:"concurrency-ratio-sep"},"/"),e("span",{class:"concurrency-ratio-max"},String(l))))),e("div",{class:"concurrency-bar-container"},e("div",{class:"concurrency-bar-track"},e("div",{class:`concurrency-bar-fill concurrency-bar-${u}`,style:`width: ${v}%`,role:"progressbar","aria-valuenow":i,"aria-valuemin":0,"aria-valuemax":l,"aria-label":`${i} of ${l} concurrent processes`}),...Array.from({length:l-1},(b,g)=>e("div",{key:g,class:"concurrency-bar-segment",style:`left: ${(g+1)/l*100}%`,"aria-hidden":"true"}))),e("span",{class:"concurrency-bar-pct"},`${v}%`)),e("div",{class:"concurrency-stats"},e("div",{class:"concurrency-stat"},e("span",{class:"concurrency-stat-value"},String(c)),e("span",{class:"concurrency-stat-label"},`slot${c===1?"":"s"} available`)),e("div",{class:"concurrency-stat"},e("span",{class:"concurrency-stat-value"},String(p)),e("span",{class:"concurrency-stat-label"},`task${p===1?"":"s"} running`)),m>0?e("div",{class:"concurrency-stat"},e("span",{class:"concurrency-stat-value concurrency-stat-pending"},String(m)),e("span",{class:"concurrency-stat-label"},`pending task${m===1?"":"s"}`)):null))}var Tg={healthy:{color:"var(--green)",barColor:"var(--green)",label:"Healthy",icon:"\u25CF"},warning:{color:"var(--orange)",barColor:"var(--orange)",label:"Pressure",icon:"\u25D5"},critical:{color:"var(--red)",barColor:"var(--red)",label:"Critical",icon:"\u25CF"}};function En(t){if(t<1024)return`${t} B`;let n=t/1024;if(n<1024)return`${Math.round(n)} KB`;let s=n/1024;return s<1024?`${s.toFixed(1)} MB`:`${(s/1024).toFixed(1)} GB`}var Rg={system:{totalBytes:0,freeBytes:0,usedBytes:0,usedPercent:0},server:{pid:0,rssBytes:0,heapUsedBytes:0,heapTotalBytes:0,externalBytes:0},processes:[],health:"healthy",loadAvg:[0,0,0],cpuCount:1,timestamp:""};function Ba(){let[t,n]=k(Rg),[s,r]=k(!1),a=H(null),o=_(async()=>{try{let f=await fetch("/api/hench/memory");if(f.ok){let v=await f.json();n(v),r(!0)}}catch{}},[]);if(F(()=>{let f=!0;o();let b=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,g=null;try{g=new WebSocket(b),a.current=g,g.onmessage=h=>{if(f)try{let x=JSON.parse(h.data);x.type==="hench:memory-status"&&(n({system:x.system,server:x.server,processes:x.processes,health:x.health,loadAvg:x.loadAvg,cpuCount:x.cpuCount,timestamp:x.timestamp}),r(!0))}catch{}},g.onclose=()=>{a.current=null}}catch{}let y=setInterval(o,15e3);return()=>{if(f=!1,clearInterval(y),g)try{g.close()}catch{}a.current=null}},[o]),!s)return null;let{system:i,server:l,processes:c,health:u,loadAvg:d,cpuCount:p}=t,m=Tg[u];return e("div",{class:`memory-panel memory-panel-${u}`,role:"region","aria-label":"System memory and resource status"},e("div",{class:"memory-header"},e("div",{class:"memory-header-left"},e("span",{class:`memory-icon memory-icon-${u}`,"aria-hidden":"true"},m.icon),e("h3",{class:"memory-title"},"Memory"),e("span",{class:`memory-health-badge memory-health-${u}`},m.label)),e("div",{class:"memory-header-right"},e("span",{class:"memory-pct-display",style:`color: ${m.color}`},e("span",{class:"memory-pct-value"},`${i.usedPercent}`),e("span",{class:"memory-pct-sign"},"%")))),u!=="healthy"?e("div",{class:`memory-pressure-alert memory-pressure-${u}`},e("span",{class:"memory-pressure-icon","aria-hidden":"true"},u==="critical"?"\u25B2":"\u25B3"),e("span",{class:"memory-pressure-text"},u==="critical"?"System memory critically low \u2014 task performance may degrade":"Memory usage elevated \u2014 monitor for potential issues")):null,e("div",{class:"memory-bar-container"},e("div",{class:"memory-bar-label"},e("span",null,"System"),e("span",{class:"memory-bar-detail"},`${En(i.usedBytes)} / ${En(i.totalBytes)}`)),e("div",{class:"memory-bar-track"},e("div",{class:`memory-bar-fill memory-bar-${u}`,style:`width: ${i.usedPercent}%`,role:"progressbar","aria-valuenow":i.usedPercent,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`System memory: ${i.usedPercent}% used`}))),e("div",{class:"memory-bar-container"},e("div",{class:"memory-bar-label"},e("span",null,"Server (n-dx)"),e("span",{class:"memory-bar-detail"},En(l.rssBytes))),e("div",{class:"memory-bar-track"},e("div",{class:"memory-bar-fill memory-bar-server",style:`width: ${i.totalBytes>0?Math.min(100,Math.round(l.rssBytes/i.totalBytes*100)):0}%`,"aria-label":`Server process: ${En(l.rssBytes)}`}))),c.length>0?e("div",{class:"memory-processes"},e("div",{class:"memory-processes-header"},e("span",{class:"memory-processes-title"},"Task Processes"),e("span",{class:"memory-processes-count"},String(c.length))),...c.map(f=>e("div",{key:f.taskId,class:"memory-process-row"},e("div",{class:"memory-process-info"},e("span",{class:"memory-process-name"},f.taskTitle),e("span",{class:"memory-process-pid"},`PID ${f.pid}`)),e("span",{class:"memory-process-rss"},En(f.rssBytes))))):null,e("div",{class:"memory-stats"},e("div",{class:"memory-stat"},e("span",{class:"memory-stat-value"},En(i.freeBytes)),e("span",{class:"memory-stat-label"},"free")),e("div",{class:"memory-stat"},e("span",{class:"memory-stat-value"},d[0].toFixed(2)),e("span",{class:"memory-stat-label"},"load (1m)")),e("div",{class:"memory-stat"},e("span",{class:"memory-stat-value"},String(p)),e("span",{class:"memory-stat-label"},`CPU${p===1?"":"s"}`))))}var Eg={healthy:{color:"var(--green)",barColor:"var(--green)",label:"Healthy",icon:"\u25CF"},degraded:{color:"var(--orange)",barColor:"var(--orange)",label:"Degraded",icon:"\u25D5"},unhealthy:{color:"var(--red)",barColor:"var(--red)",label:"Unhealthy",icon:"\u25CF"}};function Ig(t){if(t<1e3)return`${t}ms`;let n=t/1e3;if(n<60)return`${n.toFixed(1)}s`;let s=Math.floor(n/60),r=Math.round(n%60);if(s<60)return`${s}m ${r}s`;let a=Math.floor(s/60),o=s%60;return`${a}h ${o}m`}function _g(t){let n=Math.floor(t/1e3);if(n<60)return`${n}s`;let s=Math.floor(n/60);if(s<60)return`${s}m`;let r=Math.floor(s/60),a=s%60;if(r<24)return`${r}h ${a}m`;let o=Math.floor(r/24),i=r%24;return`${o}d ${i}h`}var Dg={close:"Clean close",error:"Socket error",end:"Half-close",ping_timeout:"Ping timeout",prune:"Pre-broadcast prune",shutdown:"Server shutdown",write_fail:"Write failure"},Pg=new Set(["close","error","end","shutdown"]),Mg={activeConnections:0,peakConnections:0,totalConnectionsAccepted:0,totalConnectionsRemoved:0,cleanupsByReason:{close:0,error:0,end:0,ping_timeout:0,prune:0,shutdown:0,write_fail:0},recentCleanups:0,avgConnectionDurationMs:0,totalBroadcasts:0,totalBroadcastWriteFailures:0,cleanupSuccessRate:1,avgCleanupLatencyMs:0,health:"healthy",uptimeMs:0,timestamp:""};function za(){let[t,n]=k(Mg),[s,r]=k(!1),a=H(null),o=_(async()=>{try{let w=await fetch("/api/ws/health");if(w.ok){let C=await w.json();n(C),r(!0)}}catch{}},[]);if(F(()=>{let w=!0;o();let I=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,E=null;try{E=new WebSocket(I),a.current=E,E.onmessage=M=>{if(w)try{let R=JSON.parse(M.data);R.type==="ws:health-status"&&(n({activeConnections:R.activeConnections,peakConnections:R.peakConnections,totalConnectionsAccepted:R.totalConnectionsAccepted,totalConnectionsRemoved:R.totalConnectionsRemoved,cleanupsByReason:R.cleanupsByReason,recentCleanups:R.recentCleanups,avgConnectionDurationMs:R.avgConnectionDurationMs,totalBroadcasts:R.totalBroadcasts,totalBroadcastWriteFailures:R.totalBroadcastWriteFailures,cleanupSuccessRate:R.cleanupSuccessRate,avgCleanupLatencyMs:R.avgCleanupLatencyMs,health:R.health,uptimeMs:R.uptimeMs,timestamp:R.timestamp}),r(!0))}catch{}},E.onclose=()=>{a.current=null}}catch{}let D=setInterval(o,15e3);return()=>{if(w=!1,clearInterval(D),E)try{E.close()}catch{}a.current=null}},[o]),!s)return null;let{activeConnections:i,peakConnections:l,totalConnectionsAccepted:c,totalConnectionsRemoved:u,cleanupsByReason:d,recentCleanups:p,avgConnectionDurationMs:m,totalBroadcasts:f,totalBroadcastWriteFailures:v,cleanupSuccessRate:b,health:g,uptimeMs:y}=t,h=Eg[g],x=Math.round(b*100),S=Object.entries(d).filter(([,w])=>w>0).sort((w,C)=>C[1]-w[1]),T=f>0?(v/f*100).toFixed(1):"0.0";return e("div",{class:`ws-health-panel ws-health-panel-${g}`,role:"region","aria-label":"WebSocket connection health"},e("div",{class:"ws-health-header"},e("div",{class:"ws-health-header-left"},e("span",{class:`ws-health-icon ws-health-icon-${g}`,"aria-hidden":"true"},h.icon),e("h3",{class:"ws-health-title"},"WebSocket Health"),e("span",{class:`ws-health-badge ws-health-badge-${g}`},h.label)),e("div",{class:"ws-health-header-right"},e("span",{class:"ws-health-connection-count",style:`color: ${h.color}`},e("span",{class:"ws-health-count-value"},String(i)),e("span",{class:"ws-health-count-label"}," active")))),l>0?e("div",{class:"ws-health-bar-container"},e("div",{class:"ws-health-bar-label"},e("span",null,"Connections"),e("span",{class:"ws-health-bar-detail"},`${i} active / ${l} peak`)),e("div",{class:"ws-health-bar-track"},e("div",{class:`ws-health-bar-fill ws-health-bar-${g}`,style:`width: ${Math.min(100,Math.round(i/Math.max(1,l)*100))}%`,role:"progressbar","aria-valuenow":i,"aria-valuemin":0,"aria-valuemax":l,"aria-label":`${i} of ${l} peak connections`}))):null,u>0?e("div",{class:"ws-health-bar-container"},e("div",{class:"ws-health-bar-label"},e("span",null,"Cleanup Success"),e("span",{class:"ws-health-bar-detail"},`${x}%`)),e("div",{class:"ws-health-bar-track"},e("div",{class:`ws-health-bar-fill ws-health-bar-${x>=90?"healthy":x>=70?"degraded":"unhealthy"}`,style:`width: ${x}%`,role:"progressbar","aria-valuenow":x,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`Cleanup success rate: ${x}%`}))):null,S.length>0?e("div",{class:"ws-health-cleanup-breakdown"},e("div",{class:"ws-health-cleanup-header"},e("span",{class:"ws-health-cleanup-title"},"Cleanup Reasons"),e("span",{class:"ws-health-cleanup-recent"},`${p} in last 60s`)),...S.map(([w,C])=>e("div",{key:w,class:`ws-health-cleanup-row${Pg.has(w)?"":" ws-health-cleanup-row-warn"}`},e("span",{class:"ws-health-cleanup-reason"},Dg[w]),e("span",{class:"ws-health-cleanup-count"},String(C))))):null,e("div",{class:"ws-health-stats"},e("div",{class:"ws-health-stat"},e("span",{class:"ws-health-stat-value"},String(c)),e("span",{class:"ws-health-stat-label"},"total accepted")),e("div",{class:"ws-health-stat"},e("span",{class:"ws-health-stat-value"},String(f)),e("span",{class:"ws-health-stat-label"},"broadcasts")),e("div",{class:"ws-health-stat"},e("span",{class:"ws-health-stat-value"},m>0?Ig(m):"\u2014"),e("span",{class:"ws-health-stat-label"},"avg duration")),e("div",{class:"ws-health-stat"},e("span",{class:"ws-health-stat-value"},_g(y)),e("span",{class:"ws-health-stat-label"},"uptime"))),v>0?e("div",{class:"ws-health-failure-alert"},e("span",{class:"ws-health-failure-icon","aria-hidden":"true"},"\u25B3"),e("span",{class:"ws-health-failure-text"},`${v} broadcast write failure${v===1?"":"s"} (${T}% of broadcasts)`)):null)}var $g={paused:!1,pausedAt:null,concurrencyOverride:null,effectiveMaxConcurrent:3,configMaxConcurrent:3,lastEmergencyStopAt:null,lastEmergencyStopCount:0,activeExecutions:0,timestamp:""};function Sc(t){let n=Date.now()-new Date(t).getTime(),s=Math.floor(n/1e3);if(s<60)return`${s}s ago`;let r=Math.floor(s/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}function Ha(){let[t,n]=k($g),[s,r]=k(!1),[a,o]=k(null),[i,l]=k(null),[c,u]=k(!1),[d,p]=k(3),m=H(null),f=_(async()=>{try{let D=await fetch("/api/hench/throttle");if(D.ok){let M=await D.json();n(M),p(M.effectiveMaxConcurrent),r(!0)}}catch{}},[]);F(()=>{let D=!0;f();let R=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,P=null;try{P=new WebSocket(R),m.current=P,P.onmessage=j=>{if(D)try{let U=JSON.parse(j.data);U.type==="hench:throttle-state"&&(n({paused:U.paused,pausedAt:U.pausedAt,concurrencyOverride:U.concurrencyOverride,effectiveMaxConcurrent:U.effectiveMaxConcurrent,configMaxConcurrent:U.configMaxConcurrent,lastEmergencyStopAt:U.lastEmergencyStopAt,lastEmergencyStopCount:U.lastEmergencyStopCount,activeExecutions:U.activeExecutions,timestamp:U.timestamp}),p(U.effectiveMaxConcurrent),r(!0))}catch{}},P.onclose=()=>{m.current=null}}catch{}let A=setInterval(f,1e4);return()=>{if(D=!1,clearInterval(A),P)try{P.close()}catch{}m.current=null}},[f]);let v=_(async D=>{o("concurrency"),l(null);try{let M=D===t.configMaxConcurrent,R=await fetch("/api/hench/throttle",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({maxConcurrent:M?null:D})});if(R.ok)await f();else{let P=await R.json();l(P.error||"Failed to update concurrency limit")}}catch(M){l(String(M))}finally{o(null)}},[t.configMaxConcurrent,f]),b=_(async()=>{o("pause"),l(null);try{let D=await fetch("/api/hench/throttle/pause",{method:"POST"});if(D.ok)await f();else{let M=await D.json();l(M.error||"Failed to pause")}}catch(D){l(String(D))}finally{o(null)}},[f]),g=_(async()=>{o("resume"),l(null);try{let D=await fetch("/api/hench/throttle/resume",{method:"POST"});if(D.ok)await f();else{let M=await D.json();l(M.error||"Failed to resume")}}catch(D){l(String(D))}finally{o(null)}},[f]),y=_(async()=>{o("stop"),l(null);try{let D=await fetch("/api/hench/throttle/emergency-stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirm:!0})}),M=await D.json();D.ok?await f():l(M.error||"Emergency stop failed")}catch(D){l(String(D))}finally{o(null),u(!1)}},[f]);if(!s)return null;let{paused:h,pausedAt:x,concurrencyOverride:S,effectiveMaxConcurrent:T,configMaxConcurrent:w,activeExecutions:C,lastEmergencyStopAt:I}=t,E=S!==null;return e("div",{class:`throttle-controls${h?" throttle-controls-paused":""}`,role:"region","aria-label":"Execution throttle controls"},e("div",{class:"throttle-header"},e("div",{class:"throttle-header-left"},e("span",{class:`throttle-icon${h?" throttle-icon-paused":""}`,"aria-hidden":"true"},h?"\u23F8":"\u2699"),e("h3",{class:"throttle-title"},"Throttle Controls"),h?e("span",{class:"throttle-paused-badge"},"Paused"):null),C>0?e("span",{class:"throttle-active-count"},`${C} active`):null),i?e("div",{class:"throttle-error",role:"alert"},i):null,e("div",{class:"throttle-section"},e("div",{class:"throttle-section-header"},e("span",{class:"throttle-section-label"},"Concurrency Limit"),e("span",{class:"throttle-section-value"},E?e("span",null,e("span",{class:"throttle-override-value"},String(T)),e("span",{class:"throttle-config-hint"},` (config: ${w})`)):String(T))),e("div",{class:"throttle-slider-row"},e("span",{class:"throttle-slider-min"},"1"),e("input",{type:"range",class:"throttle-slider",min:1,max:10,step:1,value:d,disabled:a==="concurrency","aria-label":"Adjust maximum concurrent processes",onInput:D=>{let M=parseInt(D.target.value,10);p(M)},onChange:D=>{let M=parseInt(D.target.value,10);v(M)}}),e("span",{class:"throttle-slider-max"},"10")),E?e("button",{class:"throttle-reset-btn",onClick:()=>v(w),disabled:a==="concurrency","aria-label":"Reset to config default"},`Reset to default (${w})`):null),e("div",{class:"throttle-section"},e("div",{class:"throttle-section-header"},e("span",{class:"throttle-section-label"},"New Executions"),e("span",{class:`throttle-status-indicator${h?" throttle-status-paused":" throttle-status-active"}`},h?"Paused":"Accepting")),h?e("div",{class:"throttle-pause-info"},e("p",{class:"throttle-pause-desc"},"New task executions are blocked. Running tasks continue until they finish."),x?e("span",{class:"throttle-pause-time"},`Paused ${Sc(x)}`):null,e("button",{class:"throttle-resume-btn",onClick:g,disabled:a==="resume","aria-label":"Resume new executions"},a==="resume"?"Resuming\u2026":"\u25B6 Resume Executions")):e("button",{class:"throttle-pause-btn",onClick:b,disabled:a==="pause","aria-label":"Pause new executions"},a==="pause"?"Pausing\u2026":"\u23F8 Pause New Executions")),e("div",{class:"throttle-section throttle-section-danger"},e("div",{class:"throttle-section-header"},e("span",{class:"throttle-section-label throttle-danger-label"},"Emergency Stop")),c?e("div",{class:"throttle-stop-confirm"},e("p",{class:"throttle-stop-warn"},`This will terminate ${C} running execution${C!==1?"s":""} and pause new ones. Are you sure?`),e("div",{class:"throttle-stop-actions"},e("button",{class:"throttle-stop-confirm-btn",onClick:y,disabled:a==="stop","aria-label":"Confirm emergency stop"},a==="stop"?"Stopping\u2026":"\u26A0 Confirm Stop All"),e("button",{class:"throttle-stop-cancel-btn",onClick:()=>u(!1),disabled:a==="stop"},"Cancel"))):e("button",{class:"throttle-stop-btn",onClick:()=>u(!0),disabled:C===0,"aria-label":C===0?"No active executions to stop":"Emergency stop all executions"},C===0?"No Active Executions":`\u26D4 Stop All Executions (${C})`),I?e("span",{class:"throttle-stop-last"},`Last stop: ${Sc(I)}`):null))}var Qs=["#00E5B9","#6c41f0","#ff5926","#d52e66","#00bd81","#001769","#7dd3fc","#fbbf24"];function ge(t){return Qs[t%Qs.length]}function er(t){let n=new Map;return t&&t.zones.forEach((s,r)=>{n.set(s.id,ge(r))}),n}function gt(t,n=!1){let s=n?1-t:t;return s>=.7?"good":s>=.4?"mid":"bad"}function In(t){let n=new Map;return t&&t.zones.forEach((s,r)=>{let a=ge(r);for(let o of s.files)n.set(o,{id:s.id,name:s.name,color:a})}),n}function tr(t){let n=new Map;for(let s of t){let r=`${s.fromZone}->${s.toZone}`;n.set(r,(n.get(r)||0)+1)}return[...n.entries()].map(([s,r])=>{let[a,o]=s.split("->");return{from:a,to:o,weight:r}})}function nr(t,n){let s=new Map;for(let r of t){if(!r.calleeFile)continue;let a=n.get(r.callerFile),o=n.get(r.calleeFile);if(!a||!o||a.id===o.id)continue;let i=`${a.id}->${o.id}`;s.set(i,(s.get(i)||0)+1)}return[...s.entries()].map(([r,a])=>{let[o,i]=r.split("->");return{from:o,to:i,weight:a}})}function sr(t,n,s){let r=new Map,a=new Map;for(let i of s.zones)for(let l of i.files){let c=l.split("/");if(c.length>=2&&c[0]==="packages"){let u=`packages/${c[1]}`,d=l.includes("/src/"),p=a.get(u);(!p||d&&!p.hasSrc)&&a.set(u,{zoneId:i.id,hasSrc:d})}}for(let i of t){let l=i.package;if(r.has(l))continue;if(l.startsWith("@n-dx/")){let u=l.slice(6),d=a.get(`packages/${u}`);if(d){r.set(l,d.zoneId);continue}}let c=a.get(`packages/${l}`);if(c){r.set(l,c.zoneId);continue}}let o=new Map;for(let i of t){let l=r.get(i.package);if(l)for(let c of i.importedBy){let u=n.get(c);if(!u||u.id===l)continue;let d=`${u.id}->${l}`;o.set(d,(o.get(d)??0)+1)}}return[...o.entries()].map(([i,l])=>{let[c,u]=i.split("->");return{from:c,to:u,weight:l}})}function Ve({data:t,width:n=500,height:s}){if(t.length===0)return null;let r=22,a=4,o=150,i=50,l=s??t.length*(r+a),c=n-o-i-16,u=Math.max(...t.map(d=>d.value),1);return e("svg",{viewBox:`0 0 ${n} ${l}`,class:"chart-block",preserveAspectRatio:"xMinYMin meet"},t.map((d,p)=>{let m=p*(r+a),f=Math.max(d.value/u*c,2);return e("g",{key:d.label},e("text",{x:o-8,y:m+r/2+4,"text-anchor":"end",class:"bar-chart-label"},Ag(d.label)),e("rect",{x:o,y:m+2,width:f,height:r-4,rx:3,fill:d.color||"var(--accent)",opacity:.85}),e("text",{x:o+f+6,y:m+r/2+4,class:"bar-chart-value"},String(d.value)))}))}function Ag(t){return t.length>22?t.slice(0,21)+"\u2026":t}function _n({value:t,label:n,size:s=80,inverted:r=!1}){let a=Math.max(0,Math.min(1,t)),o=r?1-a:a,i=o>=.7?"var(--green)":o>=.4?"var(--orange)":"var(--red)",l=8,c=(s-l)/2,u=2*Math.PI*c,d=a*u,p=s/2,m=s/2;return e("div",{class:"health-gauge",style:`width: ${s}px`},e("svg",{viewBox:`0 0 ${s} ${s}`,width:s,height:s},e("circle",{cx:p,cy:m,r:c,fill:"none",stroke:"var(--border)","stroke-width":l}),e("circle",{cx:p,cy:m,r:c,fill:"none",stroke:i,"stroke-width":l,"stroke-linecap":"round","stroke-dasharray":`${d} ${u}`,"stroke-dashoffset":0,transform:`rotate(-90 ${p} ${m})`,style:"transition: stroke-dasharray 0.3s ease"}),e("text",{x:p,y:m,"text-anchor":"middle","dominant-baseline":"central",class:"health-gauge-value",fill:i},a.toFixed(2))),e("div",{class:"health-gauge-label"},n))}function rr({type:t,label:n}){let s=t==="pattern"?"\u2713":"\u26A0";return e("span",{class:`pattern-badge ${t}`},e("span",{class:"pattern-icon"},s),n)}function ke({value:t,label:n,trend:s,color:r}){let a=s==="up"?"\u2191":s==="down"?"\u2193":"";return e("div",{class:"metric-card"},e("div",{class:"metric-value",style:r?`color: ${r}`:""},t,s?e("span",{class:`metric-trend metric-trend-${s}`},a):null),e("div",{class:"metric-label"},n))}var Cc="collapsible-section:";function Lg(t,n){if(!t)return n;try{let s=localStorage.getItem(Cc+t);if(s==="true")return!0;if(s==="false")return!1}catch{}return n}function qe({title:t,count:n,defaultOpen:s=!0,threshold:r=8,storageKey:a,children:o}){let l=(Array.isArray(o)?o:o?[o]:[]).flat().filter(Boolean),c=n??l.length,u=l.length>r,[d,p]=k(()=>Lg(a,s)),[m,f]=k(!1),v=_(y=>{if(p(y),a)try{localStorage.setItem(Cc+a,String(y))}catch{}},[a]),b=u&&!m?l.slice(0,r):l,g=l.length-r;return e("div",{class:"mb-16"},e("div",{class:"collapsible-header",onClick:()=>v(!d),role:"button",tabIndex:0,"aria-expanded":String(d),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.preventDefault(),v(!d))}},e("span",{class:`collapsible-chevron ${d?"open":""}`,"aria-hidden":"true"},"\u25B6"),e("span",{class:"collapsible-title"},t),c>0?e("span",{class:"collapsible-count"},String(c)):null),d?e(Q,null,u&&m?e("div",{class:"collapsible-scroll-container"},l,e("div",{class:"collapsible-sticky-footer"},e("button",{class:"collapsible-toggle",onClick:()=>f(!1)},"Show less"))):e(Q,null,b,u?e("button",{class:"collapsible-toggle",onClick:()=>f(!0)},`Show ${g} more`):null)):null)}function Ht({placeholder:t="Search...",value:n,onInput:s,resultCount:r,totalCount:a,filters:o}){return e("div",{role:"search"},e("div",{class:"filter-bar"},e("input",{class:"filter-input",type:"search",placeholder:t,value:n,"aria-label":t,onInput:i=>s(i.target.value)}),...(o??[]).map(i=>e("select",{key:i.value,class:"filter-select",value:i.value,"aria-label":i.label,onChange:l=>{let c=i.options.find(u=>u.value===l.target.value);c&&l.target.dispatchEvent(new CustomEvent("filter-change",{detail:c.value}))}},i.options.map(l=>e("option",{key:l.value,value:l.value},l.label)))),r!=null&&a!=null?e("span",{class:"filter-result-count","aria-live":"polite"},`Showing ${r} of ${a}`):null))}var Fg={critical:"\u26D4",warning:"\u26A0",info:"\u2139"},Ng={pattern:"\u2B22",relationship:"\u2194","anti-pattern":"\u2718",suggestion:"\u2728"};function jt({findings:t,legacyInsights:n=[],groupBy:s="severity",searchable:r=!0,threshold:a=8}){let[o,i]=k(""),l=B(()=>{if(!o)return t;let p=o.toLowerCase();return t.filter(m=>m.text.toLowerCase().includes(p)||m.scope.toLowerCase().includes(p)||(m.related??[]).some(f=>f.toLowerCase().includes(p)))},[t,o]),c=B(()=>{if(!o)return n;let p=o.toLowerCase();return n.filter(m=>m.toLowerCase().includes(p))},[n,o]),u=B(()=>{let p=new Map;for(let m of l){let f;switch(s){case"severity":f=m.severity||"info";break;case"scope":f=m.scope==="global"?"Global":m.scope;break;case"type":f=m.type;break;default:f="all"}let v=p.get(f);v||(v=[],p.set(f,v)),v.push(m)}if(s==="severity"){let m=new Map;for(let f of["critical","warning","info"]){let v=p.get(f);v&&m.set(f,v)}return m}return p},[l,s]);function d(p,m){let f=p.severity||"info",v=Fg[f]||Ng[p.type]||"\u2022";return e("div",{key:m,class:`finding-card severity-${f}`,role:"article"},e("div",{class:"finding-header"},e("span",{class:"finding-icon","aria-hidden":"true"},v),e("span",{class:`severity-badge severity-${f}`},f),e("span",{class:"finding-type-badge"},p.type),p.scope&&p.scope!=="global"?e("span",{class:"finding-scope-link"},e("span",{class:"finding-zone-dot",style:"background: var(--accent)"}),p.scope):null),e("p",{class:"finding-text"},p.text),p.related?.length?e("div",{class:"finding-meta"},e("span",{class:"finding-related-label"},"Related:"),e("div",{class:"finding-related"},p.related.map((b,g)=>e("code",{key:g},b)))):null)}return e("div",{role:"region","aria-label":"Findings list"},r?e(Ht,{placeholder:"Search findings...",value:o,onInput:i,resultCount:l.length+c.length,totalCount:t.length+n.length}):null,[...u.entries()].map(([p,m])=>e(qe,{key:p,title:Og(p,s),count:m.length,defaultOpen:!0,threshold:a},...m.map(d))),c.length>0?e(qe,{title:"Insights",count:c.length,defaultOpen:!0,threshold:a},...c.map((p,m)=>e("div",{key:m,class:"finding-card severity-info",role:"article"},e("div",{class:"finding-header"},e("span",{class:"finding-icon","aria-hidden":"true"},"\u2139"),e("span",{class:"severity-badge severity-info"},"insight")),e("p",{class:"finding-text"},p)))):null,l.length===0&&c.length===0?e("p",{class:"section-sub"},"No findings match your search."):null)}function Og(t,n){return n==="severity"?{critical:"\u26D4 Critical",warning:"\u26A0 Warnings",info:"\u2139 Info"}[t]||ja(t):n==="type"&&{pattern:"\u2B22 Patterns",relationship:"\u2194 Relationships","anti-pattern":"\u2718 Anti-Patterns",suggestion:"\u2728 Suggestions"}[t]||ja(t)}function ja(t){return t.charAt(0).toUpperCase()+t.slice(1)}function ar({nodes:t,renderNode:n,defaultExpandDepth:s=2,filterMatch:r}){let[a,o]=k(()=>{let u=new Set;function d(p,m){for(let f of p)m<s&&(u.add(f.id),d(f.children,m+1))}return d(t,0),u}),i=r?Vg(t,r):a,l=u=>{if(r)return;let d=new Set(a);d.has(u)?d.delete(u):d.add(u),o(d)};function c(u,d,p=!1){return u.map((m,f)=>{let v=m.children.length>0,b=i.has(m.id),g=f===u.length-1;if(r&&!Tc(m,r))return null;let y=d*24;return e("div",{key:m.id,class:"tree-node"},e("div",{class:`tree-node-row${v?" tree-node-expandable":""}`,style:`padding-left: ${y+8}px`,onClick:v?()=>l(m.id):void 0,role:v?"treeitem":void 0,"aria-expanded":v?String(b):void 0,tabIndex:v?0:void 0,onKeyDown:v?h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),l(m.id))}:void 0},d>0?e("span",{class:`tree-line${g?" tree-line-last":""}`,style:`left: ${y-12}px`,"aria-hidden":"true"}):null,e("span",{class:`tree-chevron${v&&b?" tree-chevron-open":""}`,"aria-hidden":"true"},v?"\u25B6":"\u2500"),e("span",{class:"tree-node-content"},n(m,d))),v&&b?e("div",{class:"tree-children",role:"group"},c(m.children,d+1,g)):null)}).filter(Boolean)}return e("div",{class:"route-tree",role:"tree","aria-label":"Tree view"},c(t,0))}function Vg(t,n){let s=new Set;function r(a){let o=!1;for(let i of a){let l=r(i.children);(n.has(i.id)||l)&&(s.add(i.id),o=!0)}return o}return r(t),s}function Tc(t,n){return n.has(t.id)?!0:t.children.some(s=>Tc(s,n))}function he(t){return t.split("/").pop()||t}function Rc(t,n=18){if(t.length<=n)return t;let s=t.lastIndexOf(".");if(s<=0)return t.slice(0,n-1)+"\u2026";let r=t.slice(s),a=n-r.length-1;return a<4?t.slice(0,n-1)+"\u2026":t.slice(0,s).slice(0,a)+"\u2026"+r}function Za({detail:t,data:n,navigateTo:s,onClose:r,prdDetailContent:a}){if(F(()=>{if(!t)return;let i=l=>{l.key==="Escape"&&r()};return document.addEventListener("keydown",i),()=>document.removeEventListener("keydown",i)},[t,r]),!t)return null;let o;return t.type==="prd"&&a?o=a:t.type==="file"?o=Hg(t,n,s,r):t.type==="zone"?o=jg(t,n,s):o=Zg(t),e(Q,null,e("div",{class:"detail-backdrop",onClick:r,"aria-hidden":"true"}),e("div",{class:"detail-panel open",role:"complementary","aria-label":"Item details"},e("div",{class:"detail-header"},e("h3",{title:t.title||"Details"},t.title||"Details"),e("button",{class:"detail-close",onClick:r,"aria-label":"Close detail panel",title:"Close (Esc)"},"\u2715",e("span",{class:"sr-only"},"Close"))),o))}function Hg(t,n,s,r){let a=t.path,o=n?.imports,i=n?.zones,l=null;if(i)for(let d=0;d<i.zones.length;d++){let p=i.zones[d];if(p.files.includes(a)){l={id:p.id,name:p.name,color:ge(d)};break}}let c=o?.edges.filter(d=>d.to===a).map(d=>d.from)??[],u=o?.edges.filter(d=>d.from===a).map(d=>d.to)??[];return e(Q,null,e("div",{class:"detail-code"},a),t.language?e("div",{class:"detail-row"},e("span",{class:"label"},"Language"),e("span",null,t.language)):null,t.size?e("div",{class:"detail-row"},e("span",{class:"label"},"Size"),e("span",null,t.size)):null,t.lines?e("div",{class:"detail-row"},e("span",{class:"label"},"Lines"),e("span",null,String(t.lines))):null,t.role?e("div",{class:"detail-row"},e("span",{class:"label"},"Role"),e("span",null,t.role)):null,t.category?e("div",{class:"detail-row"},e("span",{class:"label"},"Category"),e("span",null,t.category)):null,l?e("div",{class:"detail-row"},e("span",{class:"label"},"Zone"),e("span",{class:"zone-badge",style:`--zone-color: ${l.color}`},l.name)):null,c.length>0?e("div",{class:"mt-12"},e("div",{class:"label mb-6"},`Imported by (${c.length})`),e("div",{class:"detail-import-list"},c.slice(0,10).map(d=>e("div",{key:d,class:"detail-import-item",title:d},he(d))),c.length>10?e("div",{class:"detail-import-item text-dim"},`... and ${c.length-10} more`):null)):null,u.length>0?e("div",{class:"mt-12"},e("div",{class:"label mb-6"},`Imports (${u.length})`),e("div",{class:"detail-import-list"},u.slice(0,10).map(d=>e("div",{key:d,class:"detail-import-item",title:d},he(d))),u.length>10?e("div",{class:"detail-import-item text-dim"},`... and ${u.length-10} more`):null)):null,s?e("button",{class:"detail-nav-btn",onClick:()=>s("graph",{file:a})},"\u2B95 View in Graph"):null)}function jg(t,n,s){let r=t.zoneId||t.id,a=n?.zones,o=a?.zones.find(u=>u.id===r),i=parseFloat(t.cohesion??String(o?.cohesion??0)),l=parseFloat(t.coupling??String(o?.coupling??0)),c=a?.findings?.filter(u=>u.scope===r)??[];return e(Q,null,t.description?e("p",{class:"section-sub"},t.description):null,e("div",{class:"detail-row"},e("span",{class:"label"},"Files"),e("span",null,String(t.files))),o&&o.entryPoints.length>0?e("div",{class:"mt-8"},e("div",{class:"label"},"Entry Points"),e("div",{class:"detail-import-list"},o.entryPoints.map(u=>e("div",{key:u,class:"detail-import-item",title:u},he(u))))):null,e("div",{class:"mt-12"},e("div",{class:"detail-row"},e("span",{class:"label"},"Cohesion"),e("span",null,i.toFixed(2))),e("div",{class:"meter"},e("div",{class:`meter-fill ${gt(i)}`,style:`width: ${i*100}%`}))),e("div",{class:"mt-8"},e("div",{class:"detail-row"},e("span",{class:"label"},"Coupling"),e("span",null,l.toFixed(2))),e("div",{class:"meter"},e("div",{class:`meter-fill ${gt(l,!0)}`,style:`width: ${l*100}%`}))),c.length>0?e("div",{class:"mt-12"},e("div",{class:"label mb-6"},`Findings (${c.length})`),c.slice(0,5).map((u,d)=>e("div",{key:d,class:"detail-finding-item"},u.text)),c.length>5?e("div",{class:"detail-more"},`... and ${c.length-5} more`):null):null,s?e("div",{class:"detail-nav-group"},e("button",{class:"detail-nav-btn",onClick:()=>s("files",{zone:r})},"\u2630 View in Files"),e("button",{class:"detail-nav-btn",onClick:()=>s("problems")},"\u26A0 View Problems"),e("button",{class:"detail-nav-btn",onClick:()=>s("suggestions")},"\u2728 View Suggestions")):null)}function Zg(t){let n=Object.entries(t).filter(([s,r])=>s!=="type"&&r!==void 0&&r!==null);return e(Q,null,n.map(([s,r])=>{if(s==="title")return null;let a=Array.isArray(r)?r.length>5?`${r.slice(0,5).join(", ")}... (${r.length} total)`:r.join(", "):typeof r=="object"?JSON.stringify(r):String(r);return e("div",{key:s,class:"detail-row"},e("span",{class:"label"},Ug(s)),e("span",null,a))}))}function Ug(t){return t.replace(/([A-Z])/g," $1").replace(/^./,n=>n.toUpperCase()).trim()}function Ua({visible:t,crashLoop:n,recentCrashCount:s,recoveredState:r,onDismiss:a,onRestore:o}){if(!t)return null;let i=r!==null,l=n?"Repeated crashes detected":"Recovered from a crash",c=n?`The page has crashed ${s} times recently, likely due to high memory usage. Heavy views have been avoided to prevent another crash.`:"The page was automatically recovered after an unexpected crash. This was likely caused by high memory usage.";return e("div",{class:`crash-recovery-banner${n?" crash-recovery-loop":""}`,role:"alert","aria-live":"assertive"},e("div",{class:"crash-recovery-content"},e("span",{class:"crash-recovery-icon","aria-hidden":"true"},n?"\u{1F504}":"\u2705"),e("div",{class:"crash-recovery-text"},e("strong",null,l),e("p",{class:"crash-recovery-description"},c),i&&!n?e("p",{class:"crash-recovery-state-info"},`Your previous location (${Gg(r.view)}) has been saved.`):null),e("div",{class:"crash-recovery-actions"},i&&!n?e("button",{class:"crash-recovery-restore",onClick:o,type:"button"},"Restore view"):null,e("button",{class:"crash-recovery-dismiss",onClick:a,"aria-label":"Dismiss crash recovery message",type:"button"},n?"Dismiss":i?"Start fresh":"Dismiss"))))}function Gg(t){return t.replace(/-/g," ").replace(/\b\w/g,n=>n.toUpperCase())}var Wg={autoRefresh:"Auto-refresh",deferredLoading:"Background loading",graphRendering:"Graph view",animations:"Animations",detailPanel:"Detail panel"},qg={normal:"",elevated:"\u26A1",warning:"\u26A0\uFE0F",critical:"\u{1F6D1}"};function Ga({tier:t,isDegraded:n,summary:s,disabledFeatures:r,visible:a,onDismiss:o}){if(!a||!n||t==="normal")return null;let i=qg[t],l=t==="critical"?"degradation-banner degradation-critical":t==="warning"?"degradation-banner degradation-warning":"degradation-banner degradation-elevated",c=Array.from(r).map(u=>Wg[u]).join(", ");return e("div",{class:l,role:"status","aria-live":"polite"},e("div",{class:"degradation-content"},e("span",{class:"degradation-icon","aria-hidden":"true"},i),e("div",{class:"degradation-text"},e("strong",null,"Reduced functionality"),e("p",{class:"degradation-summary"},s),e("p",{class:"degradation-features"},`Disabled: ${c}`)),e("button",{class:"degradation-dismiss",onClick:o,"aria-label":"Dismiss degradation notice",type:"button"},"\u2715")))}var Kg={warning:{icon:"\u26A0\uFE0F",label:"High memory usage",className:"memory-warning-banner memory-warning-level-warning",advice:"Consider closing the graph view or other heavy views to free memory."},critical:{icon:"\u{1F6D1}",label:"Critical memory usage",className:"memory-warning-banner memory-warning-level-critical",advice:"Memory is nearly exhausted. Close heavy views or refresh the page to avoid a crash."}};function Wa({snapshot:t,level:n,visible:s,onDismiss:r}){if(!s||n!=="warning"&&n!=="critical")return null;let a=Kg[n],o=t?Fs(t.usedJSHeapSize):"N/A",i=t?Fs(t.jsHeapSizeLimit):"N/A",l=t?Xr(t.usageRatio):"N/A";return e("div",{class:a.className,role:"alert","aria-live":"assertive"},e("div",{class:"memory-warning-content"},e("span",{class:"memory-warning-icon","aria-hidden":"true"},a.icon),e("div",{class:"memory-warning-text"},e("strong",null,a.label),e("span",{class:"memory-warning-detail"},` \u2014 ${l} of heap used (${o} / ${i})`),e("p",{class:"memory-warning-advice"},a.advice)),e("button",{class:"memory-warning-dismiss",onClick:r,"aria-label":"Dismiss memory warning",type:"button"},"\u2715")))}var Yg={sourcevision:"overview",rex:"rex-dashboard",hench:"hench-runs"},Ec={overview:{product:"sourcevision",label:"Overview",productLabel:"SourceVision"},graph:{product:"sourcevision",label:"Import Graph",productLabel:"SourceVision"},zones:{product:"sourcevision",label:"Zones",productLabel:"SourceVision"},files:{product:"sourcevision",label:"Files",productLabel:"SourceVision"},routes:{product:"sourcevision",label:"Routes",productLabel:"SourceVision"},architecture:{product:"sourcevision",label:"Architecture",productLabel:"SourceVision"},problems:{product:"sourcevision",label:"Problems",productLabel:"SourceVision"},suggestions:{product:"sourcevision",label:"Suggestions",productLabel:"SourceVision"},"pr-markdown":{product:"sourcevision",label:"PR Markdown",productLabel:"SourceVision"},"rex-dashboard":{product:"rex",label:"Dashboard",productLabel:"Rex"},prd:{product:"rex",label:"Tasks",productLabel:"Rex"},"token-usage":{product:"global",label:"Token Usage",productLabel:"Global"},validation:{product:"rex",label:"Validation",productLabel:"Rex"},"notion-config":{product:"rex",label:"Notion",productLabel:"Rex"},integrations:{product:"rex",label:"Integrations",productLabel:"Rex"},"hench-runs":{product:"hench",label:"Runs",productLabel:"Hench"},"hench-audit":{product:"hench",label:"Audit",productLabel:"Hench"},"hench-config":{product:"hench",label:"Config",productLabel:"Hench"},"hench-templates":{product:"hench",label:"Templates",productLabel:"Hench"},"hench-optimization":{product:"hench",label:"Optimization",productLabel:"Hench"},"feature-toggles":{product:"rex",label:"Feature Flags",productLabel:"Settings"}};function Ic(){return e("svg",{class:"breadcrumb-sep",width:12,height:12,viewBox:"0 0 12 12",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","aria-hidden":"true"},e("path",{d:"M4.5 2.5l3 3.5-3 3.5"}))}function qa({view:t,navigateTo:n,scope:s}){let r=qs();F(()=>{let l=Ec[t],c=[];l&&c.push(`${l.label} \u2014 ${l.productLabel}`),r&&c.push(r.name),c.push("n-dx"),document.title=c.join(" | ")},[r,t]);let a=Ec[t],o=B(()=>{if(!r)return null;let l=r.name;return l.length>28?l.slice(0,26)+"\u2026":l},[r]),i=r?.git?.branch??null;return e("nav",{class:"breadcrumb","aria-label":"Breadcrumb"},e("ol",{class:"breadcrumb-list"},r&&o?e("li",{class:"breadcrumb-item"},e("span",{class:"breadcrumb-project",title:r.name.length>28?r.name:void 0},o),i?e("span",{class:"breadcrumb-branch",title:`Branch: ${i}`},e("svg",{class:"breadcrumb-branch-icon",width:11,height:11,viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true"},e("path",{d:"M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5z"})),i.length>20?i.slice(0,18)+"\u2026":i):null,Ic()):null,a&&a.product!=="global"?e("li",{class:"breadcrumb-item"},e("button",{class:`breadcrumb-link breadcrumb-product breadcrumb-product-${a.product}`,onClick:()=>n(Yg[a.product]),type:"button"},a.productLabel),Ic()):null,a?e("li",{class:"breadcrumb-item breadcrumb-current","aria-current":"page"},a.label):null))}var Xg=3e4;function Jg(){let[t,n]=k(null),s=H(!0);return F(()=>{s.current=!0;let r=async()=>{try{let o=await fetch("/api/ndx-config");if(!o.ok)return;let i=await o.json();s.current&&n(i)}catch{}};r();let a=setInterval(r,Xg);return()=>{s.current=!1,clearInterval(a)}},[]),t}function _c(t){if(!t)return"default";if(t.startsWith("claude-")){let n=t.split("-");if(n.length>=3)return`${n[1]} ${n[2]}`}return t}function Qg(t){return t===null||t===0?"unlimited":t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}var Dc={"api-key":"API Key",cli:"Claude CLI",none:"Not configured"},eh={"api-key":"\u{1F511}",cli:"\u{1F4BB}",none:"\u26A0"};function Ka(){let t=Jg(),[n,s]=k(!1);return t?e("div",{class:`config-footer${n?" config-footer-expanded":""}`,role:"region","aria-label":"Project configuration"},e("button",{class:"config-footer-toggle",onClick:()=>s(!n),"aria-expanded":String(n),"aria-controls":"config-footer-details",title:n?"Collapse configuration":"Show configuration"},e("span",{class:"config-footer-summary"},e("span",{class:"config-badge config-badge-model",title:`Model: ${t.model??"default"}`},_c(t.model)),e("span",{class:`config-badge config-badge-auth config-badge-auth-${t.authMethod}`,title:`Auth: ${Dc[t.authMethod]}`},eh[t.authMethod])),e("svg",{class:`config-footer-chevron${n?" config-footer-chevron-open":""}`,width:10,height:10,viewBox:"0 0 12 12",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","aria-hidden":"true"},e("path",{d:"M3 8.5l3-3 3 3"}))),n?e("div",{id:"config-footer-details",class:"config-footer-details",role:"group","aria-label":"Configuration details"},e("div",{class:"config-row"},e("span",{class:"config-label"},"Model"),e("span",{class:"config-value"},_c(t.model))),e("div",{class:"config-row"},e("span",{class:"config-label"},"Auth"),e("span",{class:"config-value"},Dc[t.authMethod])),t.provider?e("div",{class:"config-row"},e("span",{class:"config-label"},"Provider"),e("span",{class:"config-value"},t.provider)):null,e("div",{class:"config-row"},e("span",{class:"config-label"},"Budget"),e("span",{class:"config-value"},Qg(t.tokenBudget))),t.maxTurns?e("div",{class:"config-row"},e("span",{class:"config-label"},"Max turns"),e("span",{class:"config-value"},String(t.maxTurns))):null):null):null}var Mc={ndx:"/n-dx.png",sourcevision:"/SourceVision-F.png",rex:"/Rex-F.png",hench:"/Hench-F.png"},$c={overview:"sourcevision",graph:"sourcevision",zones:"sourcevision",files:"sourcevision",routes:"sourcevision",architecture:"sourcevision",problems:"sourcevision",suggestions:"sourcevision","pr-markdown":"sourcevision","rex-dashboard":"rex",prd:"rex",validation:"rex","hench-runs":"hench","hench-audit":"hench"},Dn=null;function th(){if(Dn)return Dn;let t=document.querySelector('link[rel="icon"]');if(t)return Dn=t,Dn;let n=document.createElement("link");return n.rel="icon",n.type="image/png",document.head.appendChild(n),Dn=n,Dn}var Pc=null;function Ya(t){let n=$c[t]??"ndx";if(n===Pc)return;Pc=n;let s=th();s.type="image/png",s.href=Mc[n]}function Xa(){let n=localStorage.getItem("sv-theme")||(matchMedia("(prefers-color-scheme: light)").matches?"light":"dark");document.documentElement.setAttribute("data-theme",n)}function nh(){let[t,n]=k(()=>document.documentElement.getAttribute("data-theme")||"dark");return{theme:t,toggle:()=>{let r=t==="dark"?"light":"dark";document.documentElement.setAttribute("data-theme",r),localStorage.setItem("sv-theme",r),n(r)}}}function Ja(){let{theme:t,toggle:n}=nh();return e("button",{class:"sidebar-control-btn",onClick:n,title:t==="dark"?"Switch to light mode":"Switch to dark mode","aria-label":t==="dark"?"Switch to light mode":"Switch to dark mode"},t==="dark"?"\u2600":"\u263E")}var sh={sourcevision:"/SourceVision-F.png",rex:"/Rex-F.png",hench:"/Hench-F.png"};function Zt({size:t=36,class:n}){return e("img",{src:"/n-dx.png",width:t,height:t,alt:"","aria-hidden":"true",class:`logo logo-ndx-png${n?` ${n}`:""}`})}function Ut({product:t,size:n=20,class:s}){let r=sh[t];return r?e("img",{src:r,width:n,height:n,alt:"","aria-hidden":"true",class:`logo logo-product-png${s?` ${s}`:""}`}):null}function te({product:t,title:n,class:s}){return e("div",{class:`branded-header${s?` ${s}`:""}`},e(Ut,{product:t,size:16,class:"branded-header-logo"}),e("span",{class:"branded-header-label"},n))}function Qa({isSuspended:t,suspendedCount:n,onRefresh:s}){if(!t)return null;let r=n===1?"1 data source paused":`${n} data sources paused`;return e("div",{class:"polling-suspension-indicator",role:"status","aria-live":"polite","aria-label":"Auto-refresh suspended due to memory pressure"},e("span",{class:"polling-suspension-icon","aria-hidden":"true"},"\u23F8\uFE0F"),e("div",{class:"polling-suspension-info"},e("span",{class:"polling-suspension-title"},"Auto-refresh paused"),e("span",{class:"polling-suspension-detail"},`${r} \u2014 memory pressure`)),e("button",{class:"polling-suspension-refresh",onClick:s,type:"button","aria-label":"Refresh data now"},"Refresh"))}var rh={normal:"Normal speed",elevated:"Throttled (2\xD7 interval)",warning:"Heavily throttled (4\xD7 interval)",critical:"Paused \u2014 memory critical"},ah={normal:"\u{1F504}",elevated:"\u26A1",warning:"\u26A0\uFE0F",critical:"\u23F8\uFE0F"};function oh(t){if(t<0)return"unknown";if(t===0)return"done";if(t<1e3)return"< 1s";let n=Math.ceil(t/1e3);return n<60?`~${n}s`:`~${Math.ceil(n/60)}m`}function eo({state:t,visible:n}){if(!n)return null;let{queueLength:s,activeCount:r,paused:a,memoryLevel:o,estimatedCompletionMs:i}=t,l=s>0||r>0,c=o!=="normal";if(!l&&!c)return null;let u=ah[o],d=rh[o];return e("div",{class:a?"refresh-queue-status refresh-queue-paused":c?"refresh-queue-status refresh-queue-throttled":"refresh-queue-status refresh-queue-active",role:"status","aria-live":"polite","aria-label":"Refresh queue status"},e("span",{class:"refresh-queue-icon","aria-hidden":"true"},u),e("div",{class:"refresh-queue-info"},e("span",{class:"refresh-queue-level"},d),l?e("span",{class:"refresh-queue-detail"},a?`${s} queued \u2014 waiting for memory to stabilize`:`${r} active, ${s} queued`,i>0?` \u2014 ETA ${oh(i)}`:null):null))}function ih(t){if(t<1)return"just now";if(t<60)return`${t}m ago`;let n=Math.floor(t/60);return n<24?`${n}h ago`:`${Math.floor(n/24)}d ago`}function to({status:t,onNavigate:n,tabIndex:s}){if(t.freshness==="unavailable")return e("div",{class:"sidebar-indicator sidebar-indicator-warning",role:"status","aria-label":"SourceVision analysis not available"},e("span",{class:"indicator-dot indicator-dot-unavailable","aria-hidden":"true"}),e("span",{class:"indicator-text"},"No analysis"));let r=t.freshness==="stale",a=t.minutesAgo!=null?ih(t.minutesAgo):"";return e("div",{class:`sidebar-indicator${r?" sidebar-indicator-warning":" sidebar-indicator-ok"}`,role:"button",tabIndex:s,"aria-label":`Analysis ${r?"stale":"fresh"}${a?` \u2014 last run ${a}`:""} \u2014 click to view`,onClick:()=>n("overview"),onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),n("overview"))}},e("span",{class:`indicator-dot ${r?"indicator-dot-stale":"indicator-dot-fresh"}`,"aria-hidden":"true"}),e("span",{class:"indicator-text"},r?`Stale (${a})`:`Fresh (${a})`))}function no({status:t,onNavigate:n,tabIndex:s}){if(!t.exists)return e("div",{class:"sidebar-indicator sidebar-indicator-warning",role:"status","aria-label":"No PRD data"},e("span",{class:"indicator-dot indicator-dot-unavailable","aria-hidden":"true"}),e("span",{class:"indicator-text"},"No PRD"));let{percentComplete:r,stats:a,hasPending:o,hasInProgress:i,nextTaskTitle:l}=t,c=a?.total??0,u=a?.completed??0,d=a?.inProgress??0,p=a?.pending??0,m=i?"indicator-fill-active":"indicator-fill-default",f=[`PRD: ${r}% complete`,`${u}/${c} tasks done`,d>0?`${d} in progress`:null,p>0?`${p} pending`:null,l?`Next: ${l}`:null].filter(Boolean).join(", ");return e("div",{class:"sidebar-indicator sidebar-indicator-prd",role:"button",tabIndex:s,"aria-label":`${f} \u2014 click to view`,onClick:()=>n("rex-dashboard"),onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),n("rex-dashboard"))}},e("div",{class:"indicator-row"},e("span",{class:"indicator-pct"},`${r}%`),e("span",{class:"indicator-meta"},c>0?`${u}/${c}`:"empty"),i?e("span",{class:"indicator-badge indicator-badge-active",title:`${d} in progress`},d):null,o?e("span",{class:"indicator-badge indicator-badge-pending",title:`${p} pending`},p):null),e("div",{class:"indicator-bar",role:"progressbar","aria-valuenow":String(r),"aria-valuemin":"0","aria-valuemax":"100"},e("div",{class:`indicator-fill ${m}`,style:`width: ${r}%`})),l?e("div",{class:"indicator-next",title:l},e("span",{class:"indicator-next-label"},"Next: "),l):null)}function so({status:t,onNavigate:n,tabIndex:s}){if(!t.configured)return e("div",{class:"sidebar-indicator sidebar-indicator-warning",role:"status","aria-label":"Hench not configured"},e("span",{class:"indicator-dot indicator-dot-unavailable","aria-hidden":"true"}),e("span",{class:"indicator-text"},"Not configured"));let r=t.staleRuns>0;return e("div",{class:`sidebar-indicator ${r?"sidebar-indicator-warning":"sidebar-indicator-ok"}`,role:"button",tabIndex:s,"aria-label":`Hench: ${t.totalRuns} runs${r?`, ${t.staleRuns} stuck`:""} \u2014 click to view`,onClick:()=>n("hench-runs"),onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),n("hench-runs"))}},e("span",{class:`indicator-dot ${r?"indicator-dot-stale":"indicator-dot-fresh"}`,"aria-hidden":"true"}),e("span",{class:"indicator-text"},r?`${t.staleRuns} stuck run${t.staleRuns===1?"":"s"}`:`${t.totalRuns} run${t.totalRuns===1?"":"s"}`))}var lh=[{value:"epic",label:"Epic"},{value:"feature",label:"Feature"},{value:"task",label:"Task"},{value:"subtask",label:"Subtask"}],ch=[{value:"pending",label:"Pending"},{value:"in_progress",label:"In Progress"},{value:"completed",label:"Completed"},{value:"blocked",label:"Blocked"}],uh=[{value:"critical",label:"Critical"},{value:"high",label:"High"},{value:"medium",label:"Medium"},{value:"low",label:"Low"}],Ac=50,dh=200,ph={pending:"Pending",in_progress:"In Progress",completed:"Completed",blocked:"Blocked",failing:"Failing",deferred:"Deferred",deleted:"Deleted"};function Lc(t,n,s=200){if(!t||n.length===0)return[Fc(t??"",s)];let r=t.toLowerCase(),a=[];for(let c of n){let u=c.toLowerCase(),d=0;for(;d<r.length;){let p=r.indexOf(u,d);if(p===-1)break;let m=fh(r,p,u.length);a.push({start:p,end:p+u.length,exact:m}),d=p+1}}if(a.length===0)return[Fc(t,s)];a.sort((c,u)=>c.start-u.start);let o=mh(a),i=[],l=0;for(let c of o){c.start>l&&i.push(t.slice(l,c.start));let u=c.exact?"search-highlight-exact":"search-highlight-partial";i.push(e("mark",{class:u},t.slice(c.start,c.end))),l=c.end}return l<t.length&&i.push(t.slice(l)),i}function fh(t,n,s){let r=n===0||/[^a-z0-9]/.test(t[n-1]),a=n+s>=t.length||/[^a-z0-9]/.test(t[n+s]);return r&&a}function mh(t){if(t.length===0)return[];let n=[{...t[0]}];for(let s=1;s<t.length;s++){let r=n[n.length-1],a=t[s];a.start<=r.end?(r.end=Math.max(r.end,a.end),a.exact&&(r.exact=!0)):n.push({...a})}return n}function Fc(t,n){return t.length<=n?t:t.slice(0,n)+"\u2026"}function gh(t,n){if(!t)return null;let s=t.toLowerCase();for(let r of n){let a=s.indexOf(r.toLowerCase());if(a!==-1){let o=Math.max(0,a-Ac),i=Math.min(t.length,a+r.length+Ac),l=t.slice(o,i);return o>0&&(l="\u2026"+l),i<t.length&&(l=l+"\u2026"),l}}return null}function hh(t){let n=[],s=/"([^"]+)"/g,r;for(;(r=s.exec(t))!==null;)n.push(r[1].trim());let o=t.replace(/"[^"]*"/g,"").replace(/\bOR\b/g," ").split(/\s+/).filter(i=>i.length>0);return n.push(...o),n}function ao({visible:t,onClose:n,navigateTo:s}){let[r,a]=k(""),[o,i]=k([]),[l,c]=k(!1),[u,d]=k(-1),[p,m]=k(!1),[f,v]=k({levels:new Set,statuses:new Set,priorities:new Set}),[b,g]=k(null),y=H(null),h=H(null),x=H(null),S=B(()=>hh(r),[r]),T=f.levels.size+f.statuses.size+f.priorities.size,w=B(()=>T===0?o:o.filter(P=>!(f.levels.size>0&&!f.levels.has(P.level)||f.statuses.size>0&&!f.statuses.has(P.status))),[o,f,T]);F(()=>{t?requestAnimationFrame(()=>{y.current?.focus()}):(a(""),i([]),d(-1),m(!1),g(null))},[t]);let C=_(async P=>{if(!P.trim()){i([]),g(null),c(!1);return}c(!0);try{let A=new URLSearchParams({q:P.trim(),limit:"50"}),j=await fetch(`/api/search?${A.toString()}`);if(!j.ok){i([]);return}let U=await j.json();i(U.results),g(U.elapsed_ms),d(-1)}catch{i([])}finally{c(!1)}},[]),I=_(P=>{a(P),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>C(P),dh)},[C]),E=_(P=>{n(),s("prd",{taskId:P.id})},[n,s]),D=_((P,A)=>{v(j=>{let U={...j,[P]:new Set(j[P])};return U[P].has(A)?U[P].delete(A):U[P].add(A),U})},[]),M=_(P=>{if(t)switch(P.key){case"Escape":P.preventDefault(),n();break;case"ArrowDown":P.preventDefault(),d(A=>{let j=w.length-1,U=A<j?A+1:0;return R(U),U});break;case"ArrowUp":P.preventDefault(),d(A=>{let j=w.length-1,U=A>0?A-1:j;return R(U),U});break;case"Enter":P.preventDefault(),u>=0&&u<w.length&&E(w[u]);break}},[t,u,w,n,E]),R=P=>{requestAnimationFrame(()=>{let A=h.current;if(!A)return;A.querySelectorAll("[data-result-index]")[P]?.scrollIntoView({block:"nearest"})})};return F(()=>{if(!t)return;let P=A=>M(A);return document.addEventListener("keydown",P),()=>document.removeEventListener("keydown",P)},[t,M]),F(()=>()=>{x.current&&clearTimeout(x.current)},[]),t?e("div",{class:"search-overlay",role:"dialog","aria-label":"Search PRD items","aria-modal":"true",onClick:P=>{P.target.classList.contains("search-overlay")&&n()}},e("div",{class:"search-overlay-panel"},e("div",{class:"search-overlay-header"},e("div",{class:"search-overlay-input-row"},e("span",{class:"search-overlay-icon","aria-hidden":"true"},"\u{1F50D}"),e("input",{ref:y,class:"search-overlay-input",type:"search",placeholder:"Search PRD items\u2026",value:r,"aria-label":"Search PRD items","aria-autocomplete":"list","aria-controls":"search-results-list","aria-activedescendant":u>=0?`search-result-${u}`:void 0,onInput:P=>I(P.target.value)}),e("kbd",{class:"search-overlay-kbd"},"esc")),e("div",{class:"search-overlay-filter-toggle"},e("button",{class:`search-overlay-filter-btn${p?" active":""}`,onClick:()=>m(P=>!P),"aria-expanded":p,"aria-controls":"search-filters"},"Filters",T>0?e("span",{class:"search-overlay-filter-badge"},String(T)):null),r&&!l?e("span",{class:"search-overlay-stats","aria-live":"polite"},`${w.length} result${w.length!==1?"s":""}`,b!=null?` (${b}ms)`:""):null)),p?e("div",{id:"search-filters",class:"search-overlay-filters",role:"group","aria-label":"Search filters"},ro("Type","levels",lh,f.levels,D),ro("Status","statuses",ch,f.statuses,D),ro("Priority","priorities",uh,f.priorities,D)):null,e("div",{ref:h,id:"search-results-list",class:"search-overlay-results",role:"listbox","aria-label":"Search results"},l?e("div",{class:"search-overlay-loading"},"Searching\u2026"):r&&w.length===0?e("div",{class:"search-overlay-empty"},"No results found"):w.map((P,A)=>vh(P,A,A===u,S,E))),e("div",{class:"search-overlay-footer"},e("span",null,e("kbd",null,"\u2191\u2193")," navigate ",e("kbd",null,"\u21B5")," select ",e("kbd",null,"esc")," close")))):null}function ro(t,n,s,r,a){return e("div",{class:"search-filter-group"},e("span",{class:"search-filter-group-label"},t),e("div",{class:"search-filter-group-options"},...s.map(o=>e("label",{class:`search-filter-chip${r.has(o.value)?" active":""}`,key:o.value},e("input",{type:"checkbox",checked:r.has(o.value),onChange:()=>a(n,o.value),class:"sr-only"}),o.label))))}function vh(t,n,s,r,a){let o=t.description?gh(t.description,r):null,i=`status-badge status-badge--${t.status}`,l=ph[t.status]??t.status,c=Hl(t.level);return e("div",{id:`search-result-${n}`,key:t.id,class:`search-overlay-result${s?" active":""}`,role:"option","aria-selected":s,"data-result-index":n,tabIndex:-1,onClick:()=>a(t),onMouseEnter:()=>{}},e("div",{class:"search-result-header"},e("span",{class:"search-result-level",title:t.level},c),e("span",{class:"search-result-title"},...Lc(t.title,r)),e("span",{class:i},l)),t.parentChain.length>0?e("div",{class:"search-result-breadcrumb"},t.parentChain.join(" \u203A ")):null,o?e("div",{class:"search-result-context"},...Lc(o,r,200)):null,t.matchedFields.length>0?e("div",{class:"search-result-meta"},"Matched: ",t.matchedFields.join(", ")):null)}function oo(){let[t,n]=k(!1),s=_(()=>n(!0),[]),r=_(()=>n(!1),[]);return F(()=>{let a=o=>{(o.ctrlKey||o.metaKey)&&o.key==="k"&&(o.preventDefault(),n(i=>!i))};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[]),[t,s,r]}var bh=[{title:"Getting Started",items:[{question:"How do I set up n-dx for a new project?",answer:"Run 'ndx init .' in your project root. This initializes SourceVision (static analysis), Rex (PRD management), and Hench (autonomous agent) directories.",docLink:{label:"Overview",hash:"overview"}},{question:"What does 'ndx plan' do?",answer:"It runs SourceVision analysis on your codebase and feeds the results into Rex, which proposes epics, features, and tasks for your PRD. Use 'ndx plan --accept' to add proposals to your PRD."},{question:"How do I execute tasks autonomously?",answer:"Run 'ndx work .' to let Hench pick the next Rex task, build a brief, and execute it using Claude in a tool-use loop. You can target a specific task with '--task=ID'."}]},{title:"SourceVision",items:[{question:"What are zones and how are they detected?",answer:"Zones are architectural areas detected by Louvain community detection on the import graph. Files with strong internal connections cluster into zones. Low cohesion (<0.4) suggests a zone should be split; high coupling (>0.6) suggests merging.",docLink:{label:"Zones view",hash:"zones"}},{question:"What are enrichment passes?",answer:"SourceVision runs multiple analysis passes. Pass 1 covers inventory, imports, zones, and components. Passes 2-4 add AI-generated architecture insights, problem detection, and suggestions. Run additional 'sourcevision analyze' passes for deeper analysis."},{question:"What does the import graph show?",answer:"A force-directed visualization where nodes are files colored by zone. Orange cross-zone edges highlight potential boundary violations. Dense clusters suggest tight coupling; isolated nodes may be dead code.",docLink:{label:"Import Graph",hash:"graph"}}]},{title:"Rex (PRD Management)",items:[{question:"How is the PRD structured?",answer:"The PRD is a tree: epics contain features, features contain tasks, and tasks can have subtasks. Each item has a status (pending, in_progress, completed, deferred, blocked, deleted), priority, and optional acceptance criteria.",docLink:{label:"Tasks view",hash:"prd"}},{question:"How does Rex determine the next task?",answer:"Rex considers priority (critical > high > medium > low), dependency blocking (items with unresolved blockers are skipped), and tree position (earlier items in the tree are preferred).",docLink:{label:"Rex Dashboard",hash:"rex-dashboard"}},{question:"Can I sync my PRD with Notion?",answer:"Yes. Configure a Notion adapter, then run 'ndx sync .' to bidirectionally sync your local PRD with a Notion database. Use '--push' or '--pull' for one-way sync."}]},{title:"Hench (Autonomous Agent)",items:[{question:"What happens during an autonomous run?",answer:"Hench picks the next Rex task, generates a detailed brief with context from SourceVision and Rex, then calls Claude in a tool-use loop. It reads files, writes code, runs tests, and commits changes. Runs are recorded in .hench/runs/.",docLink:{label:"Hench Runs",hash:"hench-runs"}},{question:"How do I monitor agent progress?",answer:"Use 'ndx status .' to check PRD completion. The Hench Runs view in this dashboard shows run history, transcripts, and token usage for each autonomous execution.",docLink:{label:"Token Usage",hash:"token-usage"}},{question:"Can I limit which tasks Hench works on?",answer:"Yes. Use 'ndx work --task=ID' to target a specific task. You can also use '--dry-run' to see what Hench would do without executing. Configure model and max turns in .hench/config.json."}]},{title:"Dashboard",items:[{question:"How do I switch between light and dark mode?",answer:"Use the theme toggle (sun/moon icon) in the sidebar footer. Your preference is saved automatically and persists across sessions."},{question:"What do the locked navigation items mean?",answer:"Items marked with P2, P3, or P4 badges require additional SourceVision enrichment passes. Run more 'sourcevision analyze' passes to unlock Architecture, Problems, and Suggestions views."},{question:"Can I run the dashboard in the background?",answer:"Yes. Run 'ndx web --background .' to start the dashboard as a daemon. Use 'ndx web stop' to stop it and 'ndx web status' to check if it's running."}]}];function yh({onClose:t,initialSection:n}){let[s,r]=k(n),a=_(o=>{r(i=>i===o?null:o)},[]);return e("div",{class:"faq-overlay",onClick:t,role:"dialog","aria-label":"Help and FAQ","aria-modal":"true"},e("div",{class:"faq-modal",onClick:o=>o.stopPropagation()},e("div",{class:"faq-header"},e("h2",null,"Help & FAQ"),e("button",{class:"faq-close",onClick:t,"aria-label":"Close FAQ"},"\u2715")),e("div",{class:"faq-body"},bh.map(o=>{let i=s===o.title;return e("div",{key:o.title,class:"faq-section"},e("div",{class:"faq-section-header",role:"button",tabIndex:0,"aria-expanded":String(i),onClick:()=>a(o.title),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),a(o.title))}},e("span",{class:`faq-section-chevron${i?" faq-section-chevron-open":""}`,"aria-hidden":"true"},"\u25B8"),e("span",null,o.title)),i?e("div",{class:"faq-section-items"},o.items.map((l,c)=>e("div",{key:c,class:"faq-item"},e("div",{class:"faq-question"},l.question),e("div",{class:"faq-answer"},l.answer),l.docLink?e("a",{class:"faq-doc-link",href:`#${l.docLink.hash}`,onClick:t},`\u2192 ${l.docLink.label}`):null))):null)})),e("div",{class:"faq-footer"},e("p",null,"For CLI reference, run ",e("code",null,"ndx --help")," or ",e("code",null,"ndx <command> --help")))))}function io(){let[t,n]=k(!1);return F(()=>{if(!t)return;let s=r=>{r.key==="Escape"&&n(!1)};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[t]),e(Q,null,e("button",{class:"sidebar-control-btn global-faq-btn",onClick:()=>n(!0),title:"Help & FAQ","aria-label":"Open help and FAQ"},e("svg",{width:14,height:14,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},e("circle",{cx:8,cy:8,r:7}),e("path",{d:"M5.5 6a2.5 2.5 0 0 1 4.9.5c0 1.5-2.4 2-2.4 3"}),e("circle",{cx:8,cy:12,r:.5,fill:"currentColor",stroke:"none"}))),t?e(yh,{onClose:()=>n(!1),initialSection:null}):null)}var Ke={architecture:2,problems:3,suggestions:4};var lo=[{id:"overview",icon:"\u25A3",label:"Overview",minPass:0},{id:"graph",icon:"\u2B95",label:"Import Graph",minPass:0,featureGate:"sourcevision.callGraph"},{id:"zones",icon:"\u2B22",label:"Zones",minPass:0},{id:"files",icon:"\u2630",label:"Files",minPass:0},{id:"routes",icon:"\u25C7",label:"Routes",minPass:0},{id:"architecture",icon:"\u25E8",label:"Architecture",minPass:Ke.architecture},{id:"problems",icon:"\u26A0",label:"Problems",minPass:Ke.problems},{id:"suggestions",icon:"\u2728",label:"Suggestions",minPass:Ke.suggestions},{id:"pr-markdown",icon:"\u270D",label:"PR Markdown",minPass:0}],Nc=lo.map(t=>t.id);var Oc="sidebar-expanded-section",kh=[{type:"section",label:"SOURCEVISION",product:"sourcevision"},...lo.map(t=>({type:"item",...t})),{type:"section",label:"REX",product:"rex"},{type:"item",id:"rex-dashboard",icon:"\u25A8",label:"Dashboard",minPass:0},{type:"item",id:"prd",icon:"\u2611",label:"Tasks",minPass:0},{type:"item",id:"validation",icon:"\u2714",label:"Validation",minPass:0},{type:"item",id:"notion-config",icon:"\u{1F50C}",label:"Notion",minPass:0,featureGate:"rex.notionSync"},{type:"item",id:"integrations",icon:"\u{1F517}",label:"Integrations",minPass:0,featureGate:"rex.integrations"},{type:"section",label:"HENCH",product:"hench"},{type:"item",id:"hench-runs",icon:"\u25B6",label:"Runs",minPass:0},{type:"item",id:"hench-audit",icon:"\u2638",label:"Audit",minPass:0},{type:"item",id:"hench-config",icon:"\u2699",label:"Config",minPass:0},{type:"item",id:"hench-templates",icon:"\u25A6",label:"Templates",minPass:0},{type:"item",id:"hench-optimization",icon:"\u26A1",label:"Optimization",minPass:0},{type:"section",label:"TOKEN USAGE"},{type:"item",id:"token-usage",icon:"\u229A",label:"Token Usage",minPass:0},{type:"section",label:"SETTINGS"},{type:"item",id:"feature-toggles",icon:"\u2699",label:"Feature Flags",minPass:0}];function wh(){let t=[],n=null;for(let s of kh)s.type==="section"?(n={label:s.label,product:s.product,items:[]},t.push(n)):n&&n.items.push(s);return t}var Gt=wh();function co(t){for(let n of Gt)if(n.items.some(s=>s.id===t))return n.label;return Gt[0].label}function Vc(t){return co(t)}var Bc={};for(let t of Gt)t.product&&t.items.length>0&&(Bc[t.product]=t.items[0].id);function uo({view:t,onNavigate:n,manifest:s,zones:r,sidebarCollapsed:a,onToggleSidebar:o,scope:i}){let[l,c]=k(!1),u=Ks(),d=qs(),p=wn("sourcevision.callGraph",!1),m=wn("rex.notionSync",!1),f=wn("rex.integrations",!1),v=B(()=>{let M=new Map;return M.set("sourcevision.callGraph",p),M.set("rex.notionSync",m),M.set("rex.integrations",f),M},[p,m,f]),b=B(()=>(i&&i!=="all"?Gt.filter(R=>R.product===i||!R.product):Gt).map(R=>({...R,items:R.items.filter(P=>P.featureGate?v.get(P.featureGate)??!1:!0)})),[i,v]),[g,y]=k(()=>i?b[0]?.label??Vc(t):Vc(t)),h=r?.enrichmentPass??0,x=s?.modules??{},S=["inventory","imports","classifications","zones","components","callgraph"],T=S.filter(M=>x[M]?.status==="complete").length,w=B(()=>{let M=co(t);return Gt.find(P=>P.label===M)?.product??null},[t]),C=B(()=>{for(let M of Gt){let R=M.items.find(P=>P.id===t);if(R)return R.label}return null},[t]),I=_(M=>{n(M),c(!1)},[n]),E=_(M=>{y(R=>{let P=R===M?"":M;try{localStorage.setItem(Oc,P)}catch{}return P})},[]),D=H(t);return F(()=>{if(D.current===t)return;D.current=t;let M=co(t);y(R=>{if(R===M)return R;try{localStorage.setItem(Oc,M)}catch{}return M})},[t]),F(()=>{let M=R=>{(R.metaKey||R.ctrlKey)&&R.key==="b"&&(R.preventDefault(),o())};return window.addEventListener("keydown",M),()=>window.removeEventListener("keydown",M)},[o]),F(()=>{if(!l)return;let M=R=>{R.key==="Escape"&&c(!1)};return window.addEventListener("keydown",M),()=>window.removeEventListener("keydown",M)},[l]),e("div",{class:`sidebar${l?" mobile-open":""}${a?" sidebar-collapsed":""}`,role:"navigation","aria-label":"Main navigation"},a?e("div",{class:"sidebar-rail","aria-label":"Collapsed navigation"},e("div",{class:"sidebar-rail-logo",onClick:()=>I(b[0]?.items[0]?.id??"overview"),role:"button",tabIndex:0,title:i?`${i} \u2014 Home`:"n-dx \u2014 Overview","aria-label":i?`Go to ${i} home`:"Go to Overview",onKeyDown:M=>{(M.key==="Enter"||M.key===" ")&&(M.preventDefault(),I(b[0]?.items[0]?.id??"overview"))}},i?e(Ut,{product:i,size:48}):e(Zt,{size:48})),e("div",{class:"sidebar-rail-divider","aria-hidden":"true"}),e("nav",{class:"sidebar-rail-nav","aria-label":"Section navigation"},b.filter(M=>M.product).map(M=>{let R=M.product,P=w===R,A=Bc[R];return e("button",{key:R,class:`sidebar-rail-section${P?" sidebar-rail-section-active":""} sidebar-rail-section-${R}`,onClick:()=>I(A),title:`${M.label}${P&&C?` \u2014 ${C}`:""}`,"aria-label":`${M.label}${P?" (current section)":""}`,"aria-current":P?"true":void 0},P?e("span",{class:"sidebar-rail-accent","aria-hidden":"true"}):null,e(Ut,{product:R,size:48,class:"sidebar-rail-icon"}))})),e("button",{class:"sidebar-rail-expand",onClick:o,"aria-label":"Expand sidebar",title:"Expand sidebar (\u2318B)"},e("svg",{width:16,height:16,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},e("path",{d:"M5 2l6 6-6 6"})))):null,e("div",{class:"sidebar-header"},e("div",{class:"sidebar-brand"},i?e(Ut,{product:i,size:36,class:"sidebar-logo"}):e(Zt,{size:20,class:"sidebar-logo-sm"}),e("div",{class:"sidebar-brand-text"},e("h1",{class:"sidebar-project-name",title:d?.name??void 0},d?.name??i??"n-dx"),i?e("div",{class:"sidebar-subtitle"},"standalone viewer"):e("div",{class:"sidebar-subtitle"},"n-dx"))),e("button",{class:"mobile-menu-btn",onClick:()=>c(!l),"aria-label":l?"Close menu":"Open menu","aria-expanded":String(l)},l?"\u2715":"\u2630")),e("nav",{class:"sidebar-nav","aria-label":"View navigation"},b.map(M=>{let R=g===M.label;return e("div",{key:M.label,class:"nav-section"},e("div",{class:`nav-section-header${M.product?` nav-section-${M.product}`:""}`,role:"button",tabIndex:0,"aria-expanded":String(R),"aria-controls":`nav-section-${M.label}`,onClick:()=>E(M.label),onKeyDown:P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),E(M.label))}},M.product?e(Ut,{product:M.product,size:40,class:"nav-section-logo"}):null,e("span",{class:"nav-section-label"},M.label),e("svg",{class:`nav-section-chevron${R?" nav-section-chevron-open":""}`,width:12,height:12,viewBox:"0 0 12 12",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","aria-hidden":"true"},e("path",{d:"M3 4.5l3 3 3-3"}))),e("div",{id:`nav-section-${M.label}`,class:`nav-section-items${R?"":" nav-section-items-collapsed"}`,role:"group","aria-label":`${M.label} views`},M.items.map(P=>{let A=P.minPass>0&&h<P.minPass;return e("div",{key:P.id,class:`nav-item ${t===P.id?"active":""} ${A?"locked":""}`,onClick:A?void 0:()=>I(P.id),role:"button",tabIndex:A||!R?-1:0,"aria-current":t===P.id?"page":void 0,"aria-disabled":A?"true":void 0,onKeyDown:j=>{!A&&(j.key==="Enter"||j.key===" ")&&(j.preventDefault(),I(P.id))}},e("span",{class:"nav-icon","aria-hidden":"true"},P.icon),P.label,A?e("span",{class:"nav-badge"},`P${P.minPass}`):null)}),M.product==="sourcevision"&&s?e("div",{class:"sidebar-progress",role:"button",tabIndex:R?0:-1,"aria-label":`Analysis progress: ${T} of ${S.length} complete \u2014 click to view`,onClick:()=>I("overview"),onKeyDown:P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),I("overview"))}},e("div",{class:"progress-label"},`Analysis: ${T}/${S.length}`),e("div",{class:"progress-bar",role:"progressbar","aria-valuenow":String(T),"aria-valuemin":"0","aria-valuemax":String(S.length)},e("div",{class:"progress-fill",style:`width: ${T/S.length*100}%`})),e("div",{class:"progress-modules"},S.map(P=>{let A=x[P]?.status;return e("span",{key:P,class:`progress-module ${A==="complete"?"done":A==="error"?"error":""}`,title:P},A==="complete"?"\u2713":A==="error"?"\u2717":"\u25CB")}))):null,M.product==="sourcevision"&&u?.sv?e(to,{status:u.sv,onNavigate:I,tabIndex:R?0:-1}):null,M.product==="rex"&&u?.rex?e(no,{status:u.rex,onNavigate:I,tabIndex:R?0:-1}):null,M.product==="hench"&&u?.hench?e(so,{status:u.hench,onNavigate:I,tabIndex:R?0:-1}):null))})),a?null:e("div",{class:"sidebar-footer",role:"group","aria-label":"Sidebar controls"},e("div",{class:"sidebar-footer-divider","aria-hidden":"true"}),e(Ka,null),e("div",{class:"sidebar-footer-divider","aria-hidden":"true"}),e("div",{class:"sidebar-footer-controls"},e(Ja,null),e(io,null),e("button",{class:"sidebar-control-btn sidebar-collapse-btn",onClick:o,title:"Collapse sidebar (\u2318B)","aria-label":"Collapse sidebar"},e("svg",{width:14,height:14,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round"},e("path",{d:"M11 2L5 8l6 6"}))))),l?e("div",{class:"sidebar-backdrop",onClick:()=>c(!1),"aria-hidden":"true"}):null)}var zc={overview:{title:"Overview",description:"Dashboard showing high-level project statistics: file counts, languages, import density, zone structure, and module completion status.",lookFor:"High import counts on single files (hub files). Circular dependencies. Unbalanced language distribution.",actions:"Check module status table to see which analysis phases have completed. Run additional 'sourcevision analyze' passes for deeper AI-generated insights."},graph:{title:"Import Graph",description:"Force-directed visualization of the import graph. Nodes are colored by zone. Cross-zone edges are highlighted in orange.",lookFor:"Dense clusters suggest tightly-coupled modules. Orange cross-zone edges indicate zone boundary violations. Isolated nodes may be dead code.",actions:"Click nodes to inspect. Look for hub files that could be split. Consider if cross-zone imports suggest zones should be merged or boundaries clarified."},zones:{title:"Zones",description:"Architectural zones detected by Louvain community detection. Each zone groups files with strong internal import connections.",lookFor:"Cohesion < 0.4 means files in a zone aren't well-related \u2014 consider splitting. Coupling > 0.6 means heavy cross-zone dependencies. Large zones (>50 files) may need decomposition.",actions:"Click a zone to see its files and entry points. Review AI-generated insights. Check if zone boundaries match your intended architecture."},files:{title:"Files",description:"Sortable, filterable table of all project files with language, role, size, and category information.",lookFor:"Very large files (>500 lines) that might benefit from splitting. Files classified as 'other' role that should be reclassified. Category groupings that reveal organizational patterns.",actions:"Sort by line count to find the largest files. Filter by role to focus on source, test, or config files. Use search to locate specific files."},routes:{title:"Routes",description:"Route tree showing React Router v7 / Remix file-based routes with their convention exports (loader, action, meta, etc).",lookFor:"Route modules missing loaders (data fetching). Missing ErrorBoundary exports. Deep layout nesting. Routes without meta exports (SEO gaps).",actions:"Check convention coverage stats to identify missing exports. Review the route tree for proper nesting. Look at component usage for shared UI patterns."},architecture:{title:"Architecture",description:"Architectural patterns and relationships identified by AI analysis. Requires enrichment pass 2.",lookFor:"Cross-cutting concerns, shared utilities, interface boundaries between zones, dependency direction patterns.",actions:"Compare observed patterns against your intended architecture. Look for findings tagged as relationships \u2014 these show how zones interact."},problems:{title:"Problems",description:"Anti-patterns and issues identified by AI analysis. Grouped by severity (critical, warning, info). Requires enrichment pass 3.",lookFor:"Critical issues first. Circular dependencies between zones. God files. Leaky abstractions. Tight coupling patterns.",actions:"Address critical findings first. Group related warnings for batch fixes. Use related file references to understand the scope of each issue."},suggestions:{title:"Suggestions",description:"Improvement suggestions from AI analysis. Requires enrichment pass 4.",lookFor:"Quick wins vs larger refactors. Suggestions that align with your current sprint goals. Patterns that could benefit from abstraction.",actions:"Prioritize suggestions by scope (global vs zone-specific). Start with suggestions that reduce coupling or improve cohesion."},"pr-markdown":{title:"PR Markdown",description:"PR-ready markdown generated for copy/paste into pull request descriptions.",lookFor:"Clear summary, accurate file/change grouping, and any missing sections before sharing.",actions:"Copy sections into your PR description and refresh after major changes to keep the text current."},"rex-dashboard":{title:"Rex Dashboard",description:"PRD completion overview showing epic progress, priority distribution, and recent activity. Each epic displays a segmented progress bar with status breakdowns.",lookFor:"Epics with low completion rates or many blocked tasks. Imbalanced priority distribution (too many critical items may indicate scope creep). Stalled items that haven't progressed.",actions:"Click an epic to see its tasks. Review blocked items and resolve dependencies. Use the execution panel to run the next task autonomously."},prd:{title:"Tasks",description:"Interactive PRD tree showing the full hierarchy: epics \u2192 features \u2192 tasks \u2192 subtasks. Each item shows its status, priority, and tags. Supports multi-select for bulk operations.",lookFor:"Tasks stuck in 'in_progress' for too long. Blocked items with unresolved dependencies. Orphaned subtasks without clear parent context. Items missing acceptance criteria.",actions:"Click items to view details in the side panel. Use bulk actions to update multiple items at once. Merge duplicate tasks. Add new items at any level of the hierarchy."},"token-usage":{title:"Token Usage",description:"Analytics dashboard showing token consumption across autonomous agent runs. Tracks input/output tokens, costs, and usage trends over time.",lookFor:"Runs with unusually high token counts (may indicate stuck loops). Cost trends over time. Token distribution across epics to understand where effort is spent.",actions:"Review high-cost runs for optimization opportunities. Compare token usage across similar tasks. Use the grouping controls to view usage by day, week, or month."},validation:{title:"Validation",description:"PRD integrity checks that verify the health of your task tree. Detects orphaned items, circular dependencies, invalid references, and structural issues.",lookFor:"Critical validation errors (must be fixed). Orphaned items disconnected from the tree. Circular blockedBy references that create deadlocks. Items with invalid status transitions.",actions:"Fix critical errors first \u2014 they can prevent task execution. Resolve orphaned items by reparenting or deleting them. Clear circular dependencies by editing blockedBy fields."},"hench-runs":{title:"Execution History",description:"Timeline of autonomous agent runs showing status, duration, token usage, and task associations. Each run records the full execution transcript.",lookFor:"Failed runs that need investigation. Runs with high turn counts (may indicate the agent struggled). Patterns in which tasks succeed vs fail autonomously.",actions:"Click a run to see its full details and token breakdown. Review failed runs to understand what went wrong. Use insights to improve task descriptions and acceptance criteria."}};function po({view:t}){let[n,s]=k(!1),r=zc[t]||zc.overview;return F(()=>{if(!n)return;let a=o=>{o.key==="Escape"&&s(!1)};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[n]),e(Q,null,e("button",{class:"guide-btn",onClick:()=>s(!n),title:"View guide","aria-label":"View guide for this page","aria-expanded":String(n)},"?"),n?e("div",{class:"guide-overlay",onClick:()=>s(!1),role:"dialog","aria-modal":"true","aria-label":`Guide: ${r.title}`},e("div",{class:"guide-modal",onClick:a=>a.stopPropagation()},e("div",{class:"guide-header"},e("h2",null,r.title),e("button",{class:"guide-close",onClick:()=>s(!1),"aria-label":"Close guide"},"\u2715")),e("div",{class:"guide-body"},e("section",null,e("h3",null,"What you're looking at"),e("p",null,r.description)),e("section",null,e("h3",null,"What to look for"),e("p",null,r.lookFor)),e("section",null,e("h3",null,"What actions to take"),e("p",null,r.actions))))):null)}function xh(t){return"status"in t&&typeof t.status=="string"&&(t.status==="red"||t.status==="yellow")}var mo="notion-schema-validation";function Sh(){try{let t=sessionStorage.getItem(mo);return t?JSON.parse(t):null}catch{return null}}function Ch(t){try{sessionStorage.setItem(mo,JSON.stringify(t))}catch{}}function Th(){try{sessionStorage.removeItem(mo)}catch{}}var Rh={title:"Title",status:"Status",select:"Select",multi_select:"Multi-select",rich_text:"Text"};function fo(t){return Rh[t]??t}function Eh(t){switch(t){case"ok":return"\u2705";case"missing":return"\u274C";case"wrong_type":return"\u26A0\uFE0F"}}function Ih({prop:t,selected:n,onToggle:s}){let r=t.status==="missing"&&t.canAutoCreate;return e("div",{class:`schema-prop-row schema-prop-${t.status}`},e("div",{class:"schema-prop-check"},r?e("input",{type:"checkbox",checked:n,onChange:()=>s(t.name),"aria-label":`Select ${t.name} for auto-creation`}):null),e("span",{class:"schema-prop-icon"},Eh(t.status)),e("div",{class:"schema-prop-info"},e("div",{class:"schema-prop-name-row"},e("span",{class:"schema-prop-name"},t.name),t.required?e("span",{class:"schema-prop-required"},"required"):e("span",{class:"schema-prop-optional"},"optional"),e("span",{class:"schema-prop-type"},fo(t.expectedType))),t.status==="wrong_type"?e("div",{class:"schema-prop-error"},`Type mismatch: found "${fo(t.actualType??"unknown")}" instead of "${fo(t.expectedType)}"`):null,t.guidance?e("div",{class:"schema-prop-guidance"},t.guidance):null))}function _h({summary:t,valid:n}){return e("div",{class:`schema-summary ${n?"schema-summary-valid":"schema-summary-invalid"}`},e("div",{class:"schema-summary-status"},n?e(Q,null,e("span",{class:"schema-summary-icon schema-summary-icon-ok"},"\u2705"),e("span",null,"Database schema is valid for PRD sync")):e(Q,null,e("span",{class:"schema-summary-icon schema-summary-icon-error"},"\u26A0\uFE0F"),e("span",null,"Database schema needs attention"))),e("div",{class:"schema-summary-counts"},e("span",{class:"schema-count schema-count-ok"},`${t.ok} ok`),t.missing>0?e("span",{class:"schema-count schema-count-missing"},`${t.missing} missing`):null,t.wrongType>0?e("span",{class:"schema-count schema-count-wrong"},`${t.wrongType} wrong type`):null))}function go({isConfigured:t}){let[n,s]=k(!1),[r,a]=k(()=>Sh()),[o,i]=k(null),[l,c]=k(!1),[u,d]=k(null),[p,m]=k(new Set);F(()=>{t||(Th(),a(null))},[t]),F(()=>{if(r){let h=r.properties.filter(x=>x.status==="missing"&&x.canAutoCreate).map(x=>x.name);m(new Set(h))}},[r]);let f=_(async()=>{s(!0),i(null),d(null);try{let h=await fetch("/api/notion/schema",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!h.ok){let S=await h.json().catch(()=>({error:"Validation failed"}));i(S.error??"Schema validation failed");return}let x=await h.json();if(xh(x)){i(x.message);return}a(x),Ch(x)}catch(h){i(h instanceof Error?h.message:"Schema validation failed")}finally{s(!1)}},[]),v=_(h=>{m(x=>{let S=new Set(x);return S.has(h)?S.delete(h):S.add(h),S})},[]),b=_(async()=>{if(p.size!==0){c(!0),d(null);try{let h=await fetch("/api/notion/schema/fix",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({properties:[...p]})});if(!h.ok){let S=await h.json().catch(()=>({error:"Fix failed"}));i(S.error??"Property creation failed");return}let x=await h.json();d(x),x.created.length>0&&setTimeout(()=>f(),1e3)}catch(h){i(h instanceof Error?h.message:"Property creation failed")}finally{c(!1)}}},[p,f]),g=r?r.properties.filter(h=>h.status==="missing"&&h.canAutoCreate&&p.has(h.name)).length:0,y=r?r.properties.some(h=>h.status==="missing"&&h.canAutoCreate):!1;return e("div",{class:"schema-wizard"},e("h3",{class:"notion-config-section-title"},e("span",{class:"notion-config-section-icon"},"\u{1F9E9}"),"Database Schema"),e("p",{class:"schema-wizard-desc"},"Validate that your Notion database has the required properties for PRD sync."),e("div",{class:"schema-wizard-actions"},e("button",{type:"button",class:"schema-validate-btn",onClick:f,disabled:n||!t},n?"Validating...":r?"Re-validate Schema":"Validate Schema"),t?null:e("span",{class:"schema-wizard-hint"},"Save credentials first")),o?e("div",{class:"schema-wizard-error"},o):null,u?e("div",{class:u.failed.length>0?"schema-fix-result schema-fix-partial":"schema-fix-result schema-fix-success"},u.created.length>0?e("div",null,e("strong",null,`Created ${u.created.length} properties: `),u.created.join(", ")):null,u.failed.length>0?e("div",{class:"schema-fix-failures"},...u.failed.map(h=>e("div",null,e("strong",null,`${h.name}: `),h.error))):null):null,r?e("div",{class:"schema-results"},e("div",{class:"schema-db-title"},e("span",{class:"schema-db-title-label"},"Database: "),e("span",{class:"schema-db-title-name"},r.databaseTitle)),e(_h,{summary:r.summary,valid:r.valid}),e("div",{class:"schema-prop-list"},...r.properties.map(h=>e(Ih,{prop:h,selected:p.has(h.name),onToggle:v}))),y?e("div",{class:"schema-fix-actions"},e("p",{class:"schema-fix-desc"},"Select missing properties above and click to create them automatically."),e("button",{type:"button",class:"schema-fix-btn",onClick:b,disabled:l||g===0},l?"Creating...":`Create ${g} Missing ${g===1?"Property":"Properties"}`)):null,r.properties.some(h=>h.status==="missing"&&!h.canAutoCreate&&h.required)?e("div",{class:"schema-manual-hint"},e("span",{class:"schema-manual-hint-icon"},"\u{1F6E0}\uFE0F"),e("div",null,e("strong",null,"Manual setup required"),e("p",null,"Some required properties (like Status) cannot be created via the API. ","Open your database in Notion and create them manually."))):null):null)}function ho({zone:t,crossings:n,allZones:s,onClose:r,onFileClick:a,navigateTo:o}){let[i,l]=k(!1);F(()=>{l(!1)},[t?.id]),F(()=>{if(!t)return;let b=g=>{g.key==="Escape"&&r()};return document.addEventListener("keydown",b),()=>document.removeEventListener("keydown",b)},[t,r]);let c=_(b=>{b&&b.focus()},[]);if(!t)return null;let u=s.indexOf(t),d=ge(u>=0?u:0),p=n.filter(b=>b.toZone===t.id),m=n.filter(b=>b.fromZone===t.id),f=Hc(p,b=>b.fromZone),v=Hc(m,b=>b.toZone);return e(Q,null,e("div",{class:"zone-slideout-backdrop open",onClick:r,"aria-hidden":"true"}),e("aside",{ref:c,class:"zone-slideout open",role:"complementary","aria-label":`Zone details: ${t.name}`,tabIndex:-1,style:`--zone-accent: ${d}`},e("div",{class:"zone-slideout-header"},e("div",{class:"zone-slideout-title"},e("span",{class:"zone-slideout-dot",style:`background: ${d}`}),e("h3",null,t.name)),e("button",{class:"zone-slideout-close",onClick:r,"aria-label":"Close zone details",title:"Close (Esc)"},"\u2715")),t.description?e("p",{class:"zone-slideout-desc"},t.description):null,e("div",{class:"zone-slideout-metrics"},e("div",{class:"zone-slideout-metric"},e("span",{class:"zone-slideout-metric-val"},t.files.length),e("span",{class:"zone-slideout-metric-lbl"},"files")),e("div",{class:"zone-slideout-metric"},e("span",{class:"zone-slideout-metric-val",style:`color: ${Dh(t.cohesion)}`},t.cohesion.toFixed(2)),e("span",{class:"zone-slideout-metric-lbl"},"cohesion")),e("div",{class:"zone-slideout-metric"},e("span",{class:"zone-slideout-metric-val",style:`color: ${Ph(t.coupling)}`},t.coupling.toFixed(2)),e("span",{class:"zone-slideout-metric-lbl"},"coupling"))),e("div",{class:"zone-slideout-meter-row"},e("span",{class:"zone-slideout-meter-label"},"Cohesion"),e("div",{class:"meter"},e("div",{class:`meter-fill ${gt(t.cohesion)}`,style:`width: ${t.cohesion*100}%`}))),e("div",{class:"zone-slideout-meter-row"},e("span",{class:"zone-slideout-meter-label"},"Coupling"),e("div",{class:"meter"},e("div",{class:`meter-fill ${gt(t.coupling,!0)}`,style:`width: ${t.coupling*100}%`}))),t.entryPoints.length>0?e("div",{class:"zone-slideout-section"},e("h4",null,"Entry Points"),e("ul",{class:"zone-slideout-list"},t.entryPoints.slice(0,8).map(b=>e("li",{key:b,class:`zone-slideout-list-item mono-sm ${a?"clickable":""}`,title:b,onClick:a?()=>a(b):void 0},he(b))),t.entryPoints.length>8?e("li",{class:"zone-slideout-list-more"},`+${t.entryPoints.length-8} more`):null)):null,t.insights&&t.insights.length>0?e("div",{class:"zone-slideout-section"},e("h4",null,"Insights"),e("ul",{class:"zone-slideout-list"},t.insights.slice(0,6).map((b,g)=>e("li",{key:g,class:"zone-slideout-list-item"},b)),t.insights.length>6?e("li",{class:"zone-slideout-list-more"},`+${t.insights.length-6} more`):null)):null,t.subZones&&t.subZones.length>0?e("div",{class:"zone-slideout-section"},e("h4",null,"Sub-zones"),e("ul",{class:"zone-slideout-list"},t.subZones.slice(0,6).map(b=>e("li",{key:b.id,class:"zone-slideout-dep-item"},e("span",null,b.name),e("span",{class:"zone-slideout-dep-count"},`${b.files.length} files`))),t.subZones.length>6?e("li",{class:"zone-slideout-list-more"},`+${t.subZones.length-6} more`):null)):null,Object.keys(f).length>0||Object.keys(v).length>0?e("div",{class:"zone-slideout-section"},e("h4",null,"Dependencies"),e("div",{class:"zone-slideout-deps"},Object.keys(v).length>0?e("div",{class:"zone-slideout-dep-col"},e("span",{class:"zone-slideout-dep-label"},"Depends on"),...Object.entries(v).slice(0,6).map(([b,g])=>{let y=s.find(h=>h.id===b);return e("div",{key:b,class:"zone-slideout-dep-item"},e("span",null,y?.name||b),e("span",{class:"zone-slideout-dep-count"},g.length))})):null,Object.keys(f).length>0?e("div",{class:"zone-slideout-dep-col"},e("span",{class:"zone-slideout-dep-label"},"Used by"),...Object.entries(f).slice(0,6).map(([b,g])=>{let y=s.find(h=>h.id===b);return e("div",{key:b,class:"zone-slideout-dep-item"},e("span",null,y?.name||b),e("span",{class:"zone-slideout-dep-count"},g.length))})):null)):null,e("div",{class:"zone-slideout-section"},e("button",{class:"zone-slideout-files-toggle",onClick:()=>l(!i)},i?"Hide files":`Show ${t.files.length} files`),i?e("ul",{class:"zone-slideout-file-list"},t.files.map(b=>e("li",{key:b,class:`zone-slideout-file-item mono-sm ${a?"clickable":""}`,onClick:a?()=>a(b):void 0},e("span",{class:"zone-slideout-file-path"},b),t.entryPoints.includes(b)?e("span",{class:"zone-slideout-entry-badge"},"entry"):null))):null),o?e("div",{class:"zone-slideout-nav"},e("button",{class:"zone-slideout-nav-btn",onClick:()=>o("files",{zone:t.id})},"\u2630 View in Files"),e("button",{class:"zone-slideout-nav-btn",onClick:()=>o("problems")},"\u26A0 View Problems"),e("button",{class:"zone-slideout-nav-btn",onClick:()=>o("suggestions")},"\u2728 View Suggestions")):null))}function Dh(t){return t>=.7?"var(--green)":t>=.4?"var(--orange)":"var(--red)"}function Ph(t){return t<=.3?"var(--green)":t<=.5?"var(--orange)":"var(--red)"}function Hc(t,n){let s={};for(let r of t){let a=n(r);s[a]||(s[a]=[]),s[a].push(r)}return s}function jc(){Hs()&&(fl(),document.body.classList.add("ndx-deployed")),Xa(),Ts(),Br(),ca(),ra()}var Mh={TypeScript:"#3178c6",JavaScript:"#f7df1e",CSS:"var(--purple)",HTML:"#e34f26",JSON:"#8b90a8",Markdown:"#8b90a8",SCSS:"#cc6699",Python:"#3776ab",Rust:"#dea584",Go:"#00add8"};function vo({data:t,navigateTo:n,onSelect:s}){let{manifest:r,inventory:a,imports:o,zones:i,components:l}=t;if(!r&&!a&&!o&&!i)return e("div",{class:"loading"},"No data loaded. Use 'sourcevision serve' or drop files.");let c=i&&i.zones.length>0,u=o&&o.edges.length>0,d=r&&(!u||!c),p=B(()=>{if(!i)return null;let b=i.zones.length>0?i.zones.reduce((w,C)=>w+C.cohesion,0)/i.zones.length:0,g=i.zones.length>0?i.zones.reduce((w,C)=>w+C.coupling,0)/i.zones.length:0,y=[],h=[];if(i.zones.filter(w=>w.cohesion>=.8).length>i.zones.length/2&&y.push("Well-structured modules"),i.zones.filter(w=>w.coupling<=.3).length>i.zones.length/2&&y.push("Clean boundaries"),o&&o.summary.circularCount>0&&h.push(`${o.summary.circularCount} circular deps`),o&&o.summary.mostImported.length>0){let w=o.summary.mostImported.filter(C=>C.count>10);w.length>0&&h.push(`${w.length} hub file${w.length>1?"s":""}`)}let T=(i.findings??[]).filter(w=>w.text.includes("Bidirectional"));return T.length>0&&h.push(`${T.length} bidirectional couplings`),{avgCohesion:b,avgCoupling:g,patterns:y,antipatterns:h}},[i,o]),m=B(()=>i?[...i.zones].sort((b,g)=>g.files.length-b.files.length).slice(0,5):[],[i]),f=B(()=>a?Object.entries(a.summary.byLanguage).sort(([,b],[,g])=>g-b).slice(0,8).map(([b,g])=>({label:b,value:g,color:Mh[b]||"var(--accent)"})):[],[a]),v=B(()=>i?i.zones.filter(b=>b.cohesion<.4||b.coupling>.5).length:0,[i]);return e("div",{class:"overview-container"},r?e("div",{class:"overview-header view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"view-title"},he(r.targetPath)),e("p",{class:"overview-meta"},r.gitBranch?`${r.gitBranch} `:"",r.gitSha?`(${r.gitSha.slice(0,7)}) \u2022 `:"",new Date(r.analyzedAt).toLocaleString())):e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"view-title"},"Overview")),d?e("div",{class:"getting-started"},e("h3",null,"Getting Started"),e("p",null,"Complete the analysis to see architectural insights:"),e("ol",null,u?null:e("li",null,e("code",null,"sourcevision analyze --phase=2")," \u2014 Build import graph"),c?null:e("li",null,e("code",null,"sourcevision analyze --phase=3")," \u2014 Detect zones"),e("li",null,e("code",null,"sourcevision analyze --full")," \u2014 Run full analysis"))):null,e("div",{class:"overview-metrics"},a?e(ke,{value:a.summary.totalFiles,label:"Files"}):null,a?e(ke,{value:Math.round(a.summary.totalLines/1e3)+"k",label:"Lines of Code"}):null,i?e(ke,{value:i.zones.length,label:"Zones",color:"var(--accent)"}):null,o?e(ke,{value:o.summary.circularCount,label:"Circular Deps",color:o.summary.circularCount>0?"var(--orange)":"var(--green)"}):null),p&&i?e("div",{class:"overview-section"},e("div",{class:"section-header-row"},e("h3",null,"Architecture Health"),i.enrichmentPass?e("span",{class:"enrichment-badge"},`Pass ${i.enrichmentPass}${i.metaEvaluationCount?` + ${i.metaEvaluationCount} meta`:""}`):null,i.lastReset?e("span",{class:"enrichment-badge reset-badge"},`Reset from Pass ${i.lastReset.from} \u2192 ${i.lastReset.to}`):null),e("div",{class:"health-row"},e(_n,{value:p.avgCohesion,label:"Avg Cohesion",size:90}),e(_n,{value:p.avgCoupling,label:"Avg Coupling",size:90,inverted:!0}),e("div",{class:"pattern-list"},p.patterns.map(b=>e(rr,{key:b,type:"pattern",label:b})),p.antipatterns.map(b=>e(rr,{key:b,type:"antipattern",label:b}))))):null,e("div",{class:"overview-columns"},f.length>0?e("div",{class:"overview-col"},e("h3",null,"Languages"),e(Ve,{data:f})):null,m.length>0?e("div",{class:"overview-col"},e("div",{class:"section-header-row"},e("h3",null,"Top Zones"),n?e("button",{class:"link-btn",onClick:()=>n("zones")},"View all \u2192"):null),e("div",{class:"top-zones-list"},m.map((b,g)=>{let y=i.zones.indexOf(b),h=ge(y),x=b.cohesion>=.7?"var(--green)":b.cohesion>=.4?"var(--orange)":"var(--red)";return e("div",{key:b.id,class:"top-zone-item",onClick:n?()=>n("zones",{zone:b.id}):void 0},e("span",{class:"zone-dot",style:`background: ${h}`}),e("span",{class:"zone-name"},b.name),e("span",{class:"zone-files"},`${b.files.length} files`),e("span",{class:"health-dot",style:`background: ${x}`,title:`Cohesion: ${b.cohesion.toFixed(2)} / Coupling: ${b.coupling.toFixed(2)}`}))})),v>0?e("div",{class:"zone-attention-note"},`${v} zone${v>1?"s":""} need${v===1?"s":""} attention`):null):null),o?.summary.circulars.length?e("div",{class:"overview-section"},e("h3",null,`${o.summary.circularCount} Circular Dep${o.summary.circularCount>1?"s":""}`),e("div",{class:"circular-list"},o.summary.circulars.slice(0,3).map((b,g)=>e("div",{key:g,class:"circular-dep-block"},b.cycle.join(" \u2192 ")+" \u2192 "+b.cycle[0])),o.summary.circulars.length>3?e("div",{class:"attention-more"},`+${o.summary.circulars.length-3} more`):null)):null)}function $h(t){let r=-150/Math.sqrt(Math.max(t,1)),a=.01,o=Math.max(40,80/Math.sqrt(Math.max(t/20,1))),i=t>200,l=.9,c=2.5,u=.03,d=-800/Math.sqrt(Math.max(t,1));return{alphaDecay:.02,velocityDecay:.6,repulsionStrength:r,centerGravityStrength:a,linkRestLength:o,useBH:i,bhTheta:l,crossZoneLinkMultiplier:c,zoneCohesionStrength:u,zoneRepulsionStrength:d}}function or(t){let n=0;for(let s=0;s<t.length;s++)n=(n<<5)-n+t.charCodeAt(s)|0;return(n&2147483647)/2147483647}function Zc(t,n,s){let r=new Map,a=[];for(let l of t)if(l.zone){let c=r.get(l.zone);c||(c=[],r.set(l.zone,c)),c.push(l)}else a.push(l);let o=[...r.keys()].sort(),i=Math.min(n,s)*.38;for(let l=0;l<o.length;l++){let c=o[l],u=r.get(c),d=2*Math.PI*l/Math.max(o.length,1)+Math.PI/6,p=n/2+i*Math.cos(d),m=s/2+i*Math.sin(d),f=Math.min(25*Math.sqrt(u.length),150);for(let v of u){let b=or(v.id+":x"),g=or(v.id+":y");v.x=p+(b-.5)*f,v.y=m+(g-.5)*f,v.vx=0,v.vy=0}}for(let l of a){let c=or(l.id+":x"),u=or(l.id+":y");l.x=n/2+(c-.5)*n*.15,l.y=s/2+(u-.5)*s*.15,l.vx=0,l.vy=0}}function Ah(t){let n=new Map;for(let s of t){if(!s.zone)continue;let r=n.get(s.zone);r||(r={x:0,y:0,count:0},n.set(s.zone,r)),r.x+=s.x,r.y+=s.y,r.count++}for(let s of n.values())s.x/=s.count,s.y/=s.count;return n}function Lh(t,n,s,r){let a=[...n.keys()],o=a.length;if(o<2)return;let i=new Map;for(let l of a)i.set(l,{fx:0,fy:0});for(let l=0;l<o;l++){let c=n.get(a[l]);for(let u=l+1;u<o;u++){let d=n.get(a[u]),p=d.x-c.x,m=d.y-c.y,f=p*p+m*m;if(f<1)continue;let v=Math.sqrt(f),b=Math.sqrt(c.count*d.count),g=s*r*b/f,y=p/v*g,h=m/v*g;i.get(a[l]).fx+=y,i.get(a[l]).fy+=h,i.get(a[u]).fx-=y,i.get(a[u]).fy-=h}}for(let l of t){if(!l.zone)continue;let c=i.get(l.zone),u=n.get(l.zone);!c||!u||(l.vx+=c.fx/u.count,l.vy+=c.fy/u.count)}}function Fh(t,n){if(n===0)return null;let s=1/0,r=1/0,a=-1/0,o=-1/0;for(let d of t)d.x<s&&(s=d.x),d.y<r&&(r=d.y),d.x>a&&(a=d.x),d.y>o&&(o=d.y);let i=Math.max(a-s,o-r)*.01+1;s-=i,r-=i,a+=i,o+=i;let l={cx:0,cy:0,mass:0,x0:s,y0:r,x1:a,y1:o,children:null,nodeIdx:-1};function c(d,p,m,f){if(d.mass===0&&d.children===null){d.nodeIdx=p,d.cx=m,d.cy=f,d.mass=1;return}if(d.children===null){d.children=[null,null,null,null];let g=(d.x0+d.x1)/2,y=(d.y0+d.y1)/2,h=d.nodeIdx;d.nodeIdx=-1,u(d,h,d.cx,d.cy,g,y)}let v=(d.x0+d.x1)/2,b=(d.y0+d.y1)/2;d.cx=(d.cx*d.mass+m)/(d.mass+1),d.cy=(d.cy*d.mass+f)/(d.mass+1),d.mass++,u(d,p,m,f,v,b)}function u(d,p,m,f,v,b){let g=(m<v?0:1)+(f<b?0:2);if(!d.children[g]){let y=g&1?v:d.x0,h=g&1?d.x1:v,x=g&2?b:d.y0,S=g&2?d.y1:b;d.children[g]={cx:0,cy:0,mass:0,x0:y,y0:x,x1:h,y1:S,children:null,nodeIdx:-1}}c(d.children[g],p,m,f)}for(let d=0;d<n;d++)c(l,d,t[d].x,t[d].y);return l}function Uc(t,n,s,r,a,o,i,l){if(!t||t.mass===0)return;let c=t.cx-s,u=t.cy-r,d=c*c+u*u,p=t.x1-t.x0;if(t.children===null||p*p/d<l*l){if(d<.01)return;let m=Math.sqrt(d),f=i*a*t.mass/d,v=c/m*f,b=u/m*f;o[n].vx+=v,o[n].vy+=b;return}for(let m of t.children)m&&Uc(m,n,s,r,a,o,i,l)}function os(t,n){let{nodes:s,resolvedLinks:r,width:a,height:o}=t,i=s.length,{alphaDecay:l,velocityDecay:c,repulsionStrength:u,centerGravityStrength:d,linkRestLength:p,useBH:m,bhTheta:f,crossZoneLinkMultiplier:v,zoneCohesionStrength:b,zoneRepulsionStrength:g}=$h(i);if(t.alpha.value*=1-l,t.frameCount++,t.alpha.value<.1&&t.frameCount%2!==0){t.alpha.value>.01&&n.scheduleNextTick(()=>os(t,n));return}let y=t.alpha.value;t.zoneCentroids=Ah(s);for(let w of s)w.vx+=(a/2-w.x)*d*y,w.vy+=(o/2-w.y)*d*y;if(m){let w=Fh(s,i);for(let C=0;C<i;C++)Uc(w,C,s[C].x,s[C].y,y,s,u,f)}else for(let w=0;w<i;w++)for(let C=w+1;C<i;C++){let I=s[C].x-s[w].x,E=s[C].y-s[w].y,D=Math.sqrt(I*I+E*E)||1,M=u*y/(D*D),R=I/D*M,P=E/D*M;s[w].vx-=R,s[w].vy-=P,s[C].vx+=R,s[C].vy+=P}for(let w of r){let C=w.source,I=w.target,E=I.x-C.x,D=I.y-C.y,M=Math.sqrt(E*E+D*D)||1,R=w.crossZone?p*v:p,P=(M-R)*.005*y,A=E/M*P,j=D/M*P;C.vx+=A,C.vy+=j,I.vx-=A,I.vy-=j}if(t.zoneCentroids){let w=t.zoneCentroids;for(let C of s){if(!C.zone)continue;let I=w.get(C.zone);I&&(C.vx+=(I.x-C.x)*b*y,C.vy+=(I.y-C.y)*b*y)}Lh(s,w,g,y)}let h=Math.min(a,o)*.6,x=.05,S=a/2,T=o/2;for(let w of s){let C=w.x-S,I=w.y-T,E=Math.sqrt(C*C+I*I);if(E>h){let D=(E-h)/E;w.vx-=C*D*x*y,w.vy-=I*D*x*y}}for(let w of s)w.fx!=null?(w.x=w.fx,w.vx=0):(w.vx*=c,w.x+=w.vx),w.fy!=null?(w.y=w.fy,w.vy=0):(w.vy*=c,w.y+=w.vy);n.updateDOM(t),t.frameCount<=100&&t.frameCount%20===0&&n.fitToContent(),!t.hasFitted&&t.alpha.value<.1&&(t.hasFitted=!0,n.fitToContent()),t.alpha.value>.01&&n.scheduleNextTick(()=>os(t,n))}var Ce="http://www.w3.org/2000/svg",ir=class{nodes;nodeGroups;svg;g;linkElements;nodeRadii;resolvedLinks;nodeEdgeMap;ac;sim;width;height;viewX=0;viewY=0;viewW;viewH;scale=1;destroyed=!1;selectedNodeId=null;wasPanning=!1;labelsHidden=!1;labelRects;tooltip;zoneInfos;zoneHullGroup;zoneHullElements=new Map;zoneLabelElements=new Map;collapsedZones=new Set;zoneNodeIndices=new Map;zonesVisible=!0;onZoneSelect;zoneLabelLayer;constructor(n){let{svg:s,nodes:r,links:a,width:o,height:i,onNodeSelect:l,onNodeDblClick:c,onZoneSelect:u,zoneInfos:d}=n;this.svg=s,this.nodes=r,this.width=o,this.height=i,this.viewW=o,this.viewH=i,this.nodeGroups=[],this.linkElements=[],this.nodeRadii=[],this.ac=new AbortController,this.zoneInfos=d,this.onZoneSelect=u,s.innerHTML="",this.updateViewBox(),this.createSvgDefs(s),this.g=document.createElementNS(Ce,"g"),s.appendChild(this.g),this.buildZoneNodeMap(),this.zoneHullGroup=this.createSvgLayer("zone-hulls"),this.zoneLabelLayer=document.createElementNS(Ce,"g"),this.zoneLabelLayer.setAttribute("class","zone-label-layer"),this.createZoneHulls();let p=new Map;for(let f of r)p.set(f.id,f);Zc(r,o,i),this.resolvedLinks=this.resolveGraphLinks(a,p),this.nodeEdgeMap=this.buildAdjacencyMap(),this.createLinkElements();let m=this.createSvgLayer("graph-node-layer");this.createNodeElements(m),this.labelRects=this.allocateLabelRects(),this.tooltip=this.createTooltipElement(),this.g.appendChild(this.zoneLabelLayer),this.g.appendChild(this.tooltip),this.sim={nodes:r,resolvedLinks:this.resolvedLinks,width:o,height:i,alpha:{value:1},frameCount:0,hasFitted:!1,scale:this.scale,nodeRadii:this.nodeRadii},this.setupZoom(),this.setupPanAndDrag(l,c),this.setupHoverHighlighting(),this.setupLabelTooltips(),this.setupTouchInteraction(l,c),this.startSimulation()}highlightNode(n){if(this.g.querySelectorAll(".graph-search-ring").forEach(i=>i.remove()),!n)return;let r=this.nodes.findIndex(i=>i.id===n);if(r<0)return;let a=Ce,o=document.createElementNS(a,"circle");o.setAttribute("class","graph-search-ring"),o.setAttribute("r",String(this.nodeRadii[r]+4)),o.setAttribute("fill","none"),o.setAttribute("stroke","var(--accent)"),o.setAttribute("stroke-width","2"),this.nodeGroups[r].appendChild(o)}centerOnNode(n){let s=this.nodes.findIndex(a=>a.id===n);if(s<0)return;let r=this.nodes[s];r.x==null||r.y==null||(this.viewX=r.x-this.viewW/2,this.viewY=r.y-this.viewH/2,this.updateViewBox())}selectNode(n){if(this.clearSelection(),!n)return;let s=this.nodes.findIndex(r=>r.id===n);s<0||(this.selectedNodeId=n,this.applySelectionHighlight(n),this.nodeGroups[s].classList.add("selected"))}clearSelection(){if(!this.selectedNodeId)return;let n=this.nodes.findIndex(s=>s.id===this.selectedNodeId);n>=0&&this.nodeGroups[n].classList.remove("selected"),this.selectedNodeId=null;for(let s=0;s<this.nodes.length;s++)this.nodeGroups[s].style.opacity="";for(let s=0;s<this.linkElements.length;s++)this.linkElements[s].style.strokeOpacity="",this.linkElements[s].style.stroke=""}toggleLabels(){return this.labelsHidden=!this.labelsHidden,this.updateLOD(),!this.labelsHidden}get labelsVisible(){return!this.labelsHidden}toggleZones(){return this.zonesVisible=!this.zonesVisible,this.zoneHullGroup.style.display=this.zonesVisible?"":"none",this.zoneLabelLayer.style.display=this.zonesVisible?"":"none",this.zonesVisible}get zonesGroupsVisible(){return this.zonesVisible}collapseZone(n){this.collapsedZones.has(n)||(this.collapsedZones.add(n),this.applyZoneCollapse(n))}expandZone(n){this.collapsedZones.has(n)&&(this.collapsedZones.delete(n),this.applyZoneExpand(n))}toggleZoneCollapse(n){return this.collapsedZones.has(n)?(this.expandZone(n),!1):(this.collapseZone(n),!0)}isZoneCollapsed(n){return this.collapsedZones.has(n)}zoomIn(n=1.25){this.applyZoomFromCenter(1/n)}zoomOut(n=1.25){this.applyZoomFromCenter(n)}resetView(){this.fitToContent(),this.updateLOD()}destroy(){this.destroyed=!0,this.ac.abort(),this.sim.alpha.value=0,this.nodeEdgeMap.clear(),this.zoneHullElements.clear(),this.zoneLabelElements.clear(),this.collapsedZones.clear(),this.zoneNodeIndices.clear(),this.resolvedLinks.length=0,this.linkElements.length=0,this.nodeGroups.length=0,this.nodes.length=0,this.labelRects.length=0}createSvgDefs(n){let s=Ce,r=document.createElementNS(s,"defs"),a=document.createElementNS(s,"marker");a.setAttribute("id","arrowhead"),a.setAttribute("viewBox","0 0 10 7"),a.setAttribute("refX","10"),a.setAttribute("refY","3.5"),a.setAttribute("markerWidth","6"),a.setAttribute("markerHeight","5"),a.setAttribute("orient","auto");let o=document.createElementNS(s,"polygon");o.setAttribute("points","0 0, 10 3.5, 0 7"),o.setAttribute("fill","var(--border)"),a.appendChild(o),r.appendChild(a),n.appendChild(r)}buildZoneNodeMap(){for(let n=0;n<this.nodes.length;n++){let s=this.nodes[n].zone;if(!s)continue;let r=this.zoneNodeIndices.get(s);r||(r=[],this.zoneNodeIndices.set(s,r)),r.push(n)}}createSvgLayer(n){let s=document.createElementNS(Ce,"g");return s.setAttribute("class",n),this.g.appendChild(s),s}resolveGraphLinks(n,s){return n.map(r=>({...r,source:s.get(typeof r.source=="string"?r.source:r.source.id),target:s.get(typeof r.target=="string"?r.target:r.target.id)})).filter(r=>r.source&&r.target)}buildAdjacencyMap(){let n=new Map;for(let s=0;s<this.resolvedLinks.length;s++){let r=this.resolvedLinks[s],a=r.source.id,o=r.target.id;n.has(a)||n.set(a,new Set),n.has(o)||n.set(o,new Set),n.get(a).add(s),n.get(o).add(s)}return n}createLinkElements(){for(let n of this.resolvedLinks){let s=document.createElementNS(Ce,"line");s.setAttribute("class",`graph-link${n.crossZone?" cross-zone":""}`),s.setAttribute("marker-end","url(#arrowhead)"),this.g.appendChild(s),this.linkElements.push(s)}}createNodeElements(n){for(let s of this.nodes){let r=document.createElementNS(Ce,"g");r.setAttribute("class","graph-node");let a=Math.min(3+Math.sqrt(s.importCount)*2,16);this.nodeRadii.push(a);let o=document.createElementNS(Ce,"circle");o.setAttribute("r",String(Math.max(a+4,10))),o.setAttribute("fill","transparent"),o.setAttribute("class","graph-node-hit"),r.appendChild(o);let i=document.createElementNS(Ce,"circle");i.setAttribute("r",String(a)),i.setAttribute("fill",s.zoneColor||"#555"),r.appendChild(i);let l=he(s.id),c=document.createElementNS(Ce,"text");c.setAttribute("class","graph-label"),c.setAttribute("dy",String(-a-3)),c.setAttribute("text-anchor","middle"),c.setAttribute("data-full",l),c.textContent=Rc(l),r.appendChild(c),n.appendChild(r),this.nodeGroups.push(r)}}allocateLabelRects(){let n=new Array(this.nodes.length);for(let s=0;s<this.nodes.length;s++)n[s]={x:0,y:0,w:0,h:0};return n}createTooltipElement(){let n=document.createElementNS(Ce,"g");n.setAttribute("class","graph-tooltip"),n.style.display="none",n.style.pointerEvents="none";let s=document.createElementNS(Ce,"rect");s.setAttribute("class","graph-tooltip-bg"),s.setAttribute("rx","3"),s.setAttribute("ry","3"),n.appendChild(s);let r=document.createElementNS(Ce,"text");return r.setAttribute("class","graph-tooltip-text"),r.setAttribute("dy","0.35em"),n.appendChild(r),n}applySelectionHighlight(n){let s=this.nodeEdgeMap.get(n)??new Set,r=new Set([n]);for(let a of s){let o=this.resolvedLinks[a];r.add(o.source.id),r.add(o.target.id)}for(let a=0;a<this.nodes.length;a++){let o=this.nodeGroups[a];r.has(this.nodes[a].id)?o.style.opacity="1":o.style.opacity="0.2"}for(let a=0;a<this.linkElements.length;a++)s.has(a)?(this.linkElements[a].style.strokeOpacity="0.9",this.linkElements[a].style.stroke="var(--accent)"):this.linkElements[a].style.strokeOpacity="0.05"}createZoneHulls(){let n=Ce,s=this.ac.signal;for(let r of this.zoneInfos){let a=this.zoneNodeIndices.get(r.id);if(!a||a.length<2)continue;let o=document.createElementNS(n,"g");o.setAttribute("class","zone-hull-group"),o.setAttribute("data-zone",r.id);let i=document.createElementNS(n,"path");i.setAttribute("class","zone-hull"),i.setAttribute("fill",r.color),i.setAttribute("stroke",r.color),o.appendChild(i),this.zoneHullElements.set(r.id,i);let l=document.createElementNS(n,"g");l.setAttribute("class","zone-hull-label-group"),l.setAttribute("data-zone",r.id);let c=document.createElementNS(n,"rect");c.setAttribute("class","zone-hull-label-bg"),c.setAttribute("rx","4"),c.setAttribute("ry","4"),l.appendChild(c);let u=document.createElementNS(n,"text");u.setAttribute("class","zone-hull-label"),u.setAttribute("text-anchor","middle"),u.setAttribute("dy","0.35em"),u.textContent=r.name,l.appendChild(u),this.zoneLabelLayer.appendChild(l),this.zoneLabelElements.set(r.id,l),this.zoneHullGroup.appendChild(o),o.addEventListener("click",d=>{if(d.target.tagName!=="circle"){if(this.wasPanning){this.wasPanning=!1;return}d.stopPropagation(),this.onZoneSelect&&this.onZoneSelect(r.id)}},{signal:s}),o.addEventListener("dblclick",d=>{d.target.tagName!=="circle"&&(d.preventDefault(),d.stopPropagation(),this.toggleZoneCollapse(r.id))},{signal:s})}}updateZoneHulls(){if(!this.zonesVisible)return;let n=Math.max(10,Math.min(14,12/Math.sqrt(this.scale)));for(let s of this.zoneInfos){let r=this.zoneNodeIndices.get(s.id);if(!r||r.length<2)continue;let a=this.zoneHullElements.get(s.id),o=this.zoneLabelElements.get(s.id);if(!a||!o)continue;if(this.collapsedZones.has(s.id)){a.parentElement?.style.setProperty("display","none"),o.style.display="none";continue}a.parentElement?.style.removeProperty("display"),o.style.display="";let i=[],l=0,c=0;for(let g of r){let y=this.nodes[g];y.x!=null&&y.y!=null&&(i.push([y.x,y.y]),l+=y.x,c+=y.y)}if(i.length<2)continue;l/=i.length,c/=i.length;let u=25,d=Nh(i),p=Oh(d,u),m=Vh(p);a.setAttribute("d",m);let f=c-this.getZoneRadius(r)-15,v=o.querySelector("text"),b=o.querySelector("rect");if(v&&b){v.style.fontSize=`${n}px`,o.setAttribute("transform",`translate(${l},${f})`);let g=(v.textContent||"").length,y=n*.55,h=g*y+12,x=n+8;b.setAttribute("x",String(-h/2)),b.setAttribute("y",String(-x/2)),b.setAttribute("width",String(h)),b.setAttribute("height",String(x))}}}getZoneRadius(n){if(n.length===0)return 0;let s=0,r=0;for(let o of n)s+=this.nodes[o].x??0,r+=this.nodes[o].y??0;s/=n.length,r/=n.length;let a=0;for(let o of n){let i=(this.nodes[o].x??0)-s,l=(this.nodes[o].y??0)-r;a=Math.max(a,Math.sqrt(i*i+l*l))}return a}applyZoneCollapse(n){let s=this.zoneNodeIndices.get(n);if(!s)return;let r=0,a=0;for(let l of s)r+=this.nodes[l].x??0,a+=this.nodes[l].y??0;r/=s.length,a/=s.length;for(let l of s)this.nodeGroups[l].style.display="none";let o=new Set(s.map(l=>this.nodes[l].id));for(let l=0;l<this.resolvedLinks.length;l++){let c=this.resolvedLinks[l],u=o.has(c.source.id),d=o.has(c.target.id);u&&d?this.linkElements[l].style.display="none":(u||d)&&(this.linkElements[l].style.opacity="0.3")}let i=this.zoneHullGroup.querySelector(`[data-zone="${n}"]`);if(i){i.classList.add("collapsed");let l=Ce,c=i.querySelector(".zone-collapse-badge");if(!c){c=document.createElementNS(l,"g"),c.setAttribute("class","zone-collapse-badge");let u=document.createElementNS(l,"circle");u.setAttribute("r","18"),u.setAttribute("class","zone-collapse-circle");let d=this.zoneInfos.find(m=>m.id===n);d&&u.setAttribute("fill",d.color),c.appendChild(u);let p=document.createElementNS(l,"text");p.setAttribute("class","zone-collapse-count"),p.setAttribute("text-anchor","middle"),p.setAttribute("dy","0.35em"),p.textContent=String(s.length),c.appendChild(p),i.appendChild(c)}c.setAttribute("transform",`translate(${r},${a})`),c.style.display=""}}applyZoneExpand(n){let s=this.zoneNodeIndices.get(n);if(!s)return;for(let o of s)this.nodeGroups[o].style.display="";let r=new Set(s.map(o=>this.nodes[o].id));for(let o=0;o<this.resolvedLinks.length;o++){let i=this.resolvedLinks[o],l=r.has(i.source.id),c=r.has(i.target.id);(l||c)&&(this.linkElements[o].style.display="",this.linkElements[o].style.opacity="")}let a=this.zoneHullGroup.querySelector(`[data-zone="${n}"]`);if(a){a.classList.remove("collapsed");let o=a.querySelector(".zone-collapse-badge");o&&(o.style.display="none")}}updateViewBox(){this.svg.setAttribute("viewBox",`${this.viewX} ${this.viewY} ${this.viewW} ${this.viewH}`),this.scale=this.viewW/this.width}fitToContent(){if(this.nodes.length===0)return;let n=this.nodes.map(g=>g.x).sort((g,y)=>g-y),s=this.nodes.map(g=>g.y).sort((g,y)=>g-y),r=Math.floor(this.nodes.length*.02),a=Math.min(Math.ceil(this.nodes.length*.98),this.nodes.length-1),o=n[r],i=n[a],l=s[r],c=s[a],u=60,d=i-o+u*2,p=c-l+u*2,m=o-u,f=l-u,v=this.width/this.height;if(d/p>v){let g=d/v;f-=(g-p)/2,p=g}else{let g=p*v;m-=(g-d)/2,d=g}this.viewX=m,this.viewY=f,this.viewW=d,this.viewH=p,this.scale=this.viewW/this.width,this.updateViewBox()}updateLOD(){let n=this.nodes.length,s=Math.max(7,Math.min(11,9/Math.sqrt(this.scale))),r=s*.55,a=s*1.3,o=new Array(n);for(let u=0;u<n;u++){let d=this.nodeRadii[u]/this.scale,p=this.nodeGroups[u].querySelector("circle:not(.graph-node-hit)");this.nodeGroups[u].style.display="",p&&d<1?p.setAttribute("r",String(this.scale)):p&&p.setAttribute("r",String(this.nodeRadii[u]));let m=this.nodeGroups[u].querySelector(".graph-node-hit");if(m){let f=Math.max(this.nodeRadii[u]+4,10);m.setAttribute("r",String(d<1?this.scale+4:f))}o[u]=!this.labelsHidden&&d>=3}let i=this.getSortedLabelOrder(),l=[],c=new Array(n).fill(!1);if(this.zonesVisible){let u=Math.max(10,Math.min(14,12/Math.sqrt(this.scale))),d=u*.55;for(let p of this.zoneInfos){let m=this.zoneNodeIndices.get(p.id);if(!m||m.length<2||this.collapsedZones.has(p.id))continue;let f=this.zoneLabelElements.get(p.id);if(!f||f.style.display==="none")continue;let v=f.querySelector("text");if(!v)continue;let g=(v.textContent||"").length*d+12,y=u+8,x=f.getAttribute("transform")?.match(/translate\(([-\d.]+),([-\d.]+)\)/);if(x){let S=parseFloat(x[1]),T=parseFloat(x[2]);l.push({x:S-g/2,y:T-y/2,w:g,h:y})}}}for(let u=0;u<n;u++){let d=i[u];if(!o[d])continue;let p=this.nodes[d],m=this.nodeGroups[d].querySelector("text");if(!m)continue;let v=(m.textContent||"").length*r,b=a,g=(p.x??0)-v/2,y=(p.y??0)-this.nodeRadii[d]-3-b,h=!1;for(let x=0;x<l.length;x++){let S=l[x];if(g<S.x+S.w&&g+v>S.x&&y<S.y+S.h&&y+b>S.y){h=!0;break}}if(!h){c[d]=!0;let x=this.labelRects[d];x.x=g,x.y=y,x.w=v,x.h=b,l.push(x)}}for(let u=0;u<n;u++){let d=this.nodeGroups[u].querySelector("text");d&&(c[u]?(d.style.display="",d.style.fontSize=`${s}px`,d.classList.remove("graph-label-hidden")):(d.style.display="none",d.classList.add("graph-label-hidden")))}}_sortedOrder=null;_sortedOrderLen=-1;getSortedLabelOrder(){let n=this.nodes.length;if(this._sortedOrder&&this._sortedOrderLen===n)return this._sortedOrder;let s=new Array(n);for(let a=0;a<n;a++)s[a]=a;let r=this.nodes;return s.sort((a,o)=>r[o].importCount-r[a].importCount),this._sortedOrder=s,this._sortedOrderLen=n,s}updateDOM(){for(let n=0;n<this.resolvedLinks.length;n++){let s=this.resolvedLinks[n];this.linkElements[n].setAttribute("x1",String(s.source.x)),this.linkElements[n].setAttribute("y1",String(s.source.y)),this.linkElements[n].setAttribute("x2",String(s.target.x)),this.linkElements[n].setAttribute("y2",String(s.target.y))}for(let n=0;n<this.nodes.length;n++)this.nodeGroups[n].setAttribute("transform",`translate(${this.nodes[n].x},${this.nodes[n].y})`);this.updateLOD(),this.updateZoneHulls()}tickCallbacks(){return{updateDOM:()=>this.updateDOM(),fitToContent:()=>this.fitToContent(),scheduleNextTick:n=>{this.destroyed||requestAnimationFrame(n)}}}startSimulation(){if(this.destroyed)return;requestAnimationFrame(()=>{this.destroyed||os(this.sim,this.tickCallbacks())})}reheat(){this.destroyed||(this.sim.alpha.value<.01?(this.sim.alpha.value=.3,requestAnimationFrame(()=>{this.destroyed||os(this.sim,this.tickCallbacks())})):this.sim.alpha.value=Math.max(this.sim.alpha.value,.3))}clientToViewBox(n,s){let r=this.svg.getBoundingClientRect();return{x:this.viewX+(n-r.left)/r.width*this.viewW,y:this.viewY+(s-r.top)/r.height*this.viewH}}findNodeIndex(n){let s=n;for(;s&&s!==this.svg;){if(s.classList?.contains("graph-node"))return this.nodeGroups.indexOf(s);if((s.tagName==="circle"||s.tagName==="text")&&s.parentElement?.classList?.contains("graph-node"))return this.nodeGroups.indexOf(s.parentElement);s=s.parentElement}return-1}applyZoomFromCenter(n){let s=this.viewX+this.viewW/2,r=this.viewY+this.viewH/2,a=this.viewW*n,o=this.viewH*n;this.viewX=s-a/2,this.viewY=r-o/2,this.viewW=a,this.viewH=o,this.scale=this.viewW/this.width,this.updateViewBox(),this.updateLOD()}setupZoom(){this.svg.addEventListener("wheel",n=>{n.preventDefault();let s=this.clientToViewBox(n.clientX,n.clientY),r=n.deltaY>0?1.1:.9,a=this.viewW*r,o=this.viewH*r;this.viewX=s.x-(s.x-this.viewX)*(a/this.viewW),this.viewY=s.y-(s.y-this.viewY)*(o/this.viewH),this.viewW=a,this.viewH=o,this.scale=this.viewW/this.width,this.updateViewBox(),this.updateLOD()},{passive:!1,signal:this.ac.signal})}setupPanAndDrag(n,s){let r=!1,a=0,o=0,i=0,l=0,c=null,u=-1,d=null,p=!1,m=3,f=this.ac.signal;this.svg.addEventListener("dblclick",g=>{let y=g.target,h=this.findNodeIndex(y);h>=0&&s&&(g.preventDefault(),s(this.nodes[h].id))},{signal:f}),this.svg.addEventListener("mousedown",g=>{if(g.button!==0)return;this.wasPanning=!1;let y=g.target,h=this.findNodeIndex(y);if(h>=0){g.preventDefault(),c=this.nodes[h],u=h,d={x:g.clientX,y:g.clientY},p=!1;return}(y===this.svg||y===this.g)&&this.clearSelection(),g.preventDefault(),r=!0,a=g.clientX,o=g.clientY,i=this.viewX,l=this.viewY,this.svg.classList.add("grabbing")},{signal:f});let v=g=>{if(c&&d){let y=g.clientX-d.x,h=g.clientY-d.y;if(!p){Math.sqrt(y*y+h*h)>m&&(p=!0,c.fx=c.x,c.fy=c.y,this.svg.classList.add("node-dragging"),u>=0&&this.nodeGroups[u].classList.add("dragging"),this.reheat());return}let x=this.clientToViewBox(g.clientX,g.clientY);c.fx=x.x,c.fy=x.y;return}if(r){let y=g.clientX-a,h=g.clientY-o;(Math.abs(y)>1||Math.abs(h)>1)&&(this.wasPanning=!0);let x=this.svg.getBoundingClientRect();this.viewX=i-y/x.width*this.viewW,this.viewY=l-h/x.height*this.viewH,this.updateViewBox()}},b=()=>{if(c){if(!p&&u>=0){let g=this.nodes[u],y=he(g.id);this.selectNode(g.id),n({title:y,path:g.id,zone:g.zone||"unzoned",incomingImports:g.importCount})}else p&&(c.x=c.fx,c.y=c.fy,c.vx=0,c.vy=0);this.svg.classList.remove("node-dragging"),u>=0&&this.nodeGroups[u].classList.remove("dragging"),c.fx=null,c.fy=null,c=null,u=-1,d=null,p=!1}r&&(r=!1,this.svg.classList.remove("grabbing"))};window.addEventListener("mousemove",v,{signal:f}),window.addEventListener("mouseup",b,{signal:f})}setupTouchInteraction(n,s){let r=null,a=-1,o=null,i=!1,l=8,c=!1,u=0,d=0,p=0,m=0,f=0,v=-1,b=300,g=0,y=0,h=0,x=0,S=0,T=this.ac.signal;this.svg.addEventListener("touchstart",w=>{if(w.touches.length===2){w.preventDefault(),c=!1,r=null;let D=w.touches[0],M=w.touches[1];g=Math.hypot(M.clientX-D.clientX,M.clientY-D.clientY),y=this.viewW,h=this.viewH;let R=(D.clientX+M.clientX)/2,P=(D.clientY+M.clientY)/2,A=this.clientToViewBox(R,P);x=A.x,S=A.y;return}if(w.touches.length!==1)return;let C=w.touches[0],I=C.target,E=this.findNodeIndex(I);if(E>=0){w.preventDefault(),r=this.nodes[E],a=E,o={x:C.clientX,y:C.clientY},i=!1;return}c=!0,u=C.clientX,d=C.clientY,p=this.viewX,m=this.viewY},{passive:!1,signal:T}),this.svg.addEventListener("touchmove",w=>{if(w.touches.length===2){w.preventDefault();let I=w.touches[0],E=w.touches[1],D=Math.hypot(E.clientX-I.clientX,E.clientY-I.clientY),M=g/D,R=y*M,P=h*M;this.viewX=x-(x-this.viewX)*(R/this.viewW),this.viewY=S-(S-this.viewY)*(P/this.viewH),this.viewW=R,this.viewH=P,this.scale=this.viewW/this.width,this.updateViewBox(),this.updateLOD();return}if(w.touches.length!==1)return;let C=w.touches[0];if(r&&o){let I=C.clientX-o.x,E=C.clientY-o.y;if(!i){Math.hypot(I,E)>l&&(i=!0,r.fx=r.x,r.fy=r.y,this.svg.classList.add("node-dragging"),a>=0&&this.nodeGroups[a].classList.add("dragging"),this.reheat());return}w.preventDefault();let D=this.clientToViewBox(C.clientX,C.clientY);r.fx=D.x,r.fy=D.y;return}if(c){let I=C.clientX-u,E=C.clientY-d,D=this.svg.getBoundingClientRect();this.viewX=p-I/D.width*this.viewW,this.viewY=m-E/D.height*this.viewH,this.updateViewBox()}},{passive:!1,signal:T}),this.svg.addEventListener("touchend",w=>{if(r){if(!i&&a>=0){let C=this.nodes[a],I=Date.now();if(I-f<b&&v===a)s&&s(C.id),f=0,v=-1;else{f=I,v=a;let E=he(C.id);this.selectNode(C.id),n({title:E,path:C.id,zone:C.zone||"unzoned",incomingImports:C.importCount})}}else i&&r&&(r.x=r.fx,r.y=r.fy,r.vx=0,r.vy=0);this.svg.classList.remove("node-dragging"),a>=0&&this.nodeGroups[a].classList.remove("dragging"),r&&(r.fx=null,r.fy=null),r=null,a=-1,o=null,i=!1}w.touches.length===0&&(c=!1)},{signal:T}),this.svg.addEventListener("touchcancel",()=>{this.svg.classList.remove("node-dragging"),a>=0&&this.nodeGroups[a].classList.remove("dragging"),r&&(r.fx=null,r.fy=null,r=null),a=-1,o=null,i=!1,c=!1},{signal:T})}setupLabelTooltips(){let n=this.ac.signal,s=this.tooltip.querySelector("text"),r=this.tooltip.querySelector("rect");for(let a=0;a<this.nodes.length;a++)this.nodeGroups[a].addEventListener("mouseenter",()=>{let o=this.nodes[a],i=he(o.id),l=this.nodeGroups[a].querySelector("text")?.textContent||"",u=this.nodeGroups[a].querySelector("text")?.style.display==="none";if(i===l&&!u)return;s.textContent=i;let d=o.x??0,p=(o.y??0)-this.nodeRadii[a]-18;this.tooltip.setAttribute("transform",`translate(${d},${p})`);let f=i.length*(9*.55)+8;r.setAttribute("x",String(-f/2)),r.setAttribute("y","-8"),r.setAttribute("width",String(f)),r.setAttribute("height","16"),s.setAttribute("text-anchor","middle"),this.tooltip.style.display=""},{signal:n}),this.nodeGroups[a].addEventListener("mouseleave",()=>{this.tooltip.style.display="none"},{signal:n})}setupHoverHighlighting(){let n=null,s=this.ac.signal;for(let r=0;r<this.nodes.length;r++){let a=this.nodes[r].id;this.nodeGroups[r].addEventListener("mouseenter",()=>{if(this.selectedNodeId||n===a)return;n=a;let o=this.nodeEdgeMap.get(a)??new Set,i=new Set([a]);for(let l of o){let c=this.resolvedLinks[l];i.add(c.source.id),i.add(c.target.id)}for(let l=0;l<this.nodes.length;l++){let c=this.nodeGroups[l];i.has(this.nodes[l].id)?c.style.opacity="1":c.style.opacity="0.2"}for(let l=0;l<this.linkElements.length;l++)o.has(l)?(this.linkElements[l].style.strokeOpacity="0.9",this.linkElements[l].style.stroke="var(--accent)"):this.linkElements[l].style.strokeOpacity="0.05"},{signal:s}),this.nodeGroups[r].addEventListener("mouseleave",()=>{if(!this.selectedNodeId&&n===a){n=null;for(let o=0;o<this.nodes.length;o++)this.nodeGroups[o].style.opacity="";for(let o=0;o<this.linkElements.length;o++)this.linkElements[o].style.strokeOpacity="",this.linkElements[o].style.stroke=""}},{signal:s})}}};function Nh(t){if(t.length<=2)return[...t];let n=[...t].sort((o,i)=>o[0]-i[0]||o[1]-i[1]),s=(o,i,l)=>(i[0]-o[0])*(l[1]-o[1])-(i[1]-o[1])*(l[0]-o[0]),r=[];for(let o of n){for(;r.length>=2&&s(r[r.length-2],r[r.length-1],o)<=0;)r.pop();r.push(o)}let a=[];for(let o=n.length-1;o>=0;o--){let i=n[o];for(;a.length>=2&&s(a[a.length-2],a[a.length-1],i)<=0;)a.pop();a.push(i)}return r.pop(),a.pop(),r.concat(a)}function Oh(t,n){if(t.length<3){let i=t.map(m=>m[0]),l=t.map(m=>m[1]),c=Math.min(...i)-n,u=Math.max(...i)+n,d=Math.min(...l)-n,p=Math.max(...l)+n;return[[c,d],[u,d],[u,p],[c,p]]}let s=[],r=t.length,a=0,o=0;for(let[i,l]of t)a+=i,o+=l;a/=r,o/=r;for(let[i,l]of t){let c=i-a,u=l-o,d=Math.sqrt(c*c+u*u)||1;s.push([i+c/d*n,l+u/d*n])}return s}function Vh(t){if(t.length<3)return"";let n=t.length,s=.3,r=[],a=(t[n-1][0]+t[0][0])/2,o=(t[n-1][1]+t[0][1])/2;r.push(`M ${a} ${o}`);for(let i=0;i<n;i++){let l=t[(i-1+n)%n],c=t[i],u=t[(i+1)%n],d=t[(i+2)%n],p=c[0]+(u[0]-l[0])*s,m=c[1]+(u[1]-l[1])*s,f=u[0]-(d[0]-c[0])*s,v=u[1]-(d[1]-c[1])*s;r.push(`C ${p} ${m}, ${f} ${v}, ${u[0]} ${u[1]}`)}return r.push("Z"),r.join(" ")}var Gc="import-graph-visible";function Bh(){try{return localStorage.getItem(Gc)==="true"}catch{return!1}}function bo({data:t,onSelect:n,selectedFile:s,selectedZone:r,navigateTo:a}){let o=H(null),i=H(null),[l,c]=k(!1),[u,d]=k(""),[p,m]=k(!0),[f,v]=k(!0),[b,g]=k(new Set),[y,h]=k(Bh),{imports:x,zones:S,inventory:T}=t,w=B(()=>{let N=new Map;return S&&S.zones.forEach($=>{for(let z of $.files)N.set(z,$.id)}),N},[S]),C=B(()=>er(S),[S]),I=B(()=>{let N=new Set;if(S)for(let $ of S.crossings)N.add(`${$.from}\0${$.to}`);return N},[S]),E=B(()=>{let N=new Map;if(T)for(let $ of T.files)N.set($.path,{language:$.language,size:$.size,lines:$.lineCount,role:$.role,category:$.category});return N},[T]),D=B(()=>S?S.zones.map((N,$)=>({id:N.id,name:N.name,color:ge($),files:N.files})):[],[S]),M=_(N=>{a&&a("files",{file:N})},[a]),R=_(()=>{if(i.current){let N=i.current.toggleLabels();m(N)}},[]),P=_(()=>{if(i.current){let N=i.current.toggleZones();v(N)}},[]),A=_(()=>{i.current?.zoomIn()},[]),j=_(()=>{i.current?.zoomOut()},[]),U=_(()=>{i.current?.resetView()},[]),se=_(N=>{if(!i.current)return;let $=i.current.toggleZoneCollapse(N);g(z=>{let O=new Set(z);return $?O.add(N):O.delete(N),O})},[]),V=_(()=>{h(N=>{let $=!N;try{localStorage.setItem(Gc,String($))}catch{}return $||(i.current?.destroy(),i.current=null,c(!1)),$})},[]),q=_(N=>{if(!S)return;let $=S.zones.find(z=>z.id===N);$&&n({type:"zone",title:$.name,id:$.id,zoneId:$.id,description:$.description,files:$.files.length,entryPoints:$.entryPoints,cohesion:$.cohesion.toFixed(2),coupling:$.coupling.toFixed(2)})},[S,n]);if(!x)return e("div",{class:"loading"},"No import data available.");F(()=>{if(!o.current||!x||l)return;let N=o.current,$=N.clientWidth||800,z=N.clientHeight||600,O=new Set;for(let le of x.edges)O.add(le.from),O.add(le.to);let X=new Map;for(let le of x.edges)X.set(le.to,(X.get(le.to)||0)+1);let ue=Array.from(O).map(le=>({id:le,zone:w.get(le),zoneColor:w.has(le)?C.get(w.get(le)):"var(--text-dim)",importCount:X.get(le)||0})),pe=x.edges.map(le=>({source:le.from,target:le.to,crossZone:I.has(`${le.from}\0${le.to}`)})),ve=new ir({svg:N,nodes:ue,links:pe,width:$,height:z,onNodeSelect:le=>{let ce=E.get(le.path),ot={type:"file",...le,...ce?{language:ce.language,size:zh(ce.size),lines:ce.lines,role:ce.role,category:ce.category}:{}};n(ot)},onNodeDblClick:M,onZoneSelect:q,zoneInfos:D});return i.current=ve,c(!0),()=>{i.current?.destroy(),i.current=null}},[x,l,y]),F(()=>{i.current&&s&&(i.current.highlightNode(s),i.current.centerOnNode(s))},[s]),F(()=>{if(!i.current||!u){i.current&&i.current.highlightNode(null);return}let N=u.toLowerCase(),$=i.current.nodes.find(z=>z.id.toLowerCase().includes(N));$&&(i.current.highlightNode($.id),i.current.centerOnNode($.id))},[u]);let G=B(()=>S?S.zones.map((N,$)=>({name:N.name,color:ge($)})):[],[S]),K=new Set([...x.edges.map(N=>N.from),...x.edges.map(N=>N.to)]).size;return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Import Graph")),e("p",{class:"section-sub"},`${x.edges.length} edges between ${K} files`,S?` across ${S.zones.length} zones`:""),e("div",{class:"graph-visibility-bar"},e("button",{class:`filter-toggle-btn${y?" active":""}`,onClick:V,"aria-pressed":String(y),title:y?"Hide graph visualization":"Show graph visualization"},y?"\u2713 Graph Visible":"Show Graph"),y?null:e("span",{class:"graph-visibility-hint"},"The force-directed graph is hidden to improve performance. Click to enable.")),y?e("div",null,e("div",{class:"graph-search-bar"},e("input",{type:"text",class:"filter-input",placeholder:"Search nodes...",value:u,onInput:N=>d(N.target.value)})),e("div",{class:"graph-container",style:"position: relative;"},e("svg",{ref:o}),e("button",{class:"graph-label-toggle",onClick:R,title:p?"Hide labels":"Show labels"},p?"Labels":"Labels off"),e("button",{class:"graph-zone-toggle",onClick:P,title:f?"Hide zone groups":"Show zone groups"},f?"Zones":"Zones off"),e("div",{class:"graph-zoom-controls"},e("button",{class:"graph-zoom-btn",onClick:A,title:"Zoom in","aria-label":"Zoom in"},"+"),e("button",{class:"graph-zoom-btn",onClick:j,title:"Zoom out","aria-label":"Zoom out"},"\u2212"),e("button",{class:"graph-zoom-btn graph-zoom-fit",onClick:U,title:"Fit to content","aria-label":"Fit to content"},"\u2922")),G.length>0?e("div",{class:"graph-legend"},e("div",{class:"graph-legend-title",style:"font-size: 10px; color: var(--text-dim); margin-bottom: 4px; opacity: 0.7;"},"Click to toggle zone"),G.map(N=>e("div",{key:N.name,class:`graph-legend-item${b.has(S?.zones.find($=>$.name===N.name)?.id??"")?" collapsed":""}`,onClick:()=>{let $=S?.zones.find(z=>z.name===N.name);$&&se($.id)}},e("span",{class:"graph-legend-dot",style:`background: ${N.color};`}),N.name))):null)):e("div",{class:"graph-hidden-placeholder"},e("div",{class:"graph-hidden-icon"},"\u2B95"),e("div",{class:"graph-hidden-stats"},e("span",{class:"stat-card"},e("span",{class:"value"},String(K)),e("span",{class:"label"},"Files")),e("span",{class:"stat-card"},e("span",{class:"value"},String(x.edges.length)),e("span",{class:"label"},"Edges")),S?e("span",{class:"stat-card"},e("span",{class:"value"},String(S.zones.length)),e("span",{class:"label"},"Zones")):null)))}function zh(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}var yo=200,rt=80,Wt=22,at=15,Wc=80,qc=60,lr=40,ur=28,is=10,ko=12;function wo(t){return t.map((n,s)=>{let r={id:n.id,name:n.name,color:ge(s),description:n.description,cohesion:n.cohesion,coupling:n.coupling,files:[],totalFiles:n.files.length,totalFunctions:0,internalCalls:0,crossZoneCalls:0};return n.subZones&&n.subZones.length>0&&(r.subZones=wo(n.subZones),r.subCrossings=xo(n.subCrossings),r.hasDrillDown=!0),r})}function xo(t){if(!t||t.length===0)return[];let n=new Map;for(let s of t){let r=`${s.fromZone}->${s.toZone}`;n.set(r,(n.get(r)??0)+1)}return[...n.entries()].map(([s,r])=>{let[a,o]=s.split("->");return{from:a,to:o,weight:r}})}function Xc(t,n,s){let r=new Map(n.map(a=>[a.path,a]));for(let a=0;a<t.length;a++){let o=s[a];if(!o)continue;let i=[];for(let l of o.files){let c=r.get(l);c&&i.push(c)}i.sort((l,c)=>c.crossZoneCalls-l.crossZoneCalls||l.path.localeCompare(c.path)),t[a].files=i,t[a].subZones&&o.subZones&&Xc(t[a].subZones,i,o.subZones)}}function Hh(t,n,s){let r=new Map;for(let d of t.functions){let p=r.get(d.file);p||(p=[],r.set(d.file,p)),p.push(d)}let a=new Map;for(let d of t.functions)a.set(`${d.file}:${d.qualifiedName}`,{fn:d,outgoing:[],incoming:[]});let o=new Map,i=new Map;for(let d of t.edges){if(!d.calleeFile)continue;let p=`${d.callerFile}:${d.caller}`,m=`${d.calleeFile}:${d.callee}`,f=n.get(d.callerFile),v=n.get(d.calleeFile),b=!!(f&&v&&f.id!==v.id),g=a.get(p);g&&g.outgoing.push({funcName:d.callee,file:d.calleeFile,crossZone:b});let y=a.get(m);y&&y.incoming.push({funcName:d.caller,file:d.callerFile,crossZone:b}),b?(i.set(d.callerFile,(i.get(d.callerFile)??0)+1),i.set(d.calleeFile,(i.get(d.calleeFile)??0)+1)):o.set(d.callerFile,(o.get(d.callerFile)??0)+1)}let l=new Map,c=[];for(let[d,p]of r){let m=p.map(b=>a.get(`${d}:${b.qualifiedName}`)).filter(Boolean),f={path:d,functions:m,internalCalls:o.get(d)??0,crossZoneCalls:i.get(d)??0},v=n.get(d);if(v){let b=l.get(v.id);b||(b=[],l.set(v.id,b)),b.push(f)}else c.push(f)}let u=[];if(s)for(let d=0;d<s.zones.length;d++){let p=s.zones[d],m=l.get(p.id)??[];m.sort((y,h)=>h.crossZoneCalls-y.crossZoneCalls||y.path.localeCompare(h.path));let f=m.reduce((y,h)=>y+h.functions.length,0),v=m.reduce((y,h)=>y+h.internalCalls,0),b=m.reduce((y,h)=>y+h.crossZoneCalls,0),g={id:p.id,name:p.name,color:ge(d),description:p.description,cohesion:p.cohesion,coupling:p.coupling,files:m,totalFiles:p.files.length,totalFunctions:f,internalCalls:v,crossZoneCalls:b};p.subZones&&p.subZones.length>0&&(g.subZones=wo(p.subZones),Xc(g.subZones,m,p.subZones),g.subCrossings=xo(p.subCrossings),g.hasDrillDown=!0),u.push(g)}return c.sort((d,p)=>d.path.localeCompare(p.path)),{zoneDataList:u,unzonedFiles:c}}function jh(t,n,s,r){let a=new Map,o=(l,c)=>{let u=a.get(l);u||(u=new Map,a.set(l,u)),u.set(c,(u.get(c)??0)+1)};for(let l of t.edges){if(!l.calleeFile)continue;let c=s.get(l.callerFile),u=s.get(l.calleeFile);!c||!u||c.id===u.id||(o(l.callerFile,u.id),o(l.calleeFile,c.id))}if(r){let l=new Map;for(let u of r.zones)for(let d of u.files){let p=d.split("/");if(p.length>=2&&p[0]==="packages"){let m=`packages/${p[1]}`,f=d.includes("/src/"),v=l.get(m);(!v||f&&!v.hasSrc)&&l.set(m,{zoneId:u.id,hasSrc:f})}}let c=new Map;for(let u of n){let d=u.package;if(c.has(d))continue;if(d.startsWith("@n-dx/")){let m=l.get(`packages/${d.slice(6)}`);if(m){c.set(d,m.zoneId);continue}}let p=l.get(`packages/${d}`);p&&c.set(d,p.zoneId)}for(let u of n){let d=c.get(u.package);if(d)for(let p of u.importedBy){let m=s.get(p);!m||m.id===d||o(p,d)}}}let i=new Map;for(let[l,c]of a)i.set(l,[...c.entries()].map(([u,d])=>({targetZoneId:u,weight:d})));return i}function Zh(t,n){let s=new Map,r=(a,o)=>{let i=s.get(a);i||(i=new Map,s.set(a,i)),i.set(o,(i.get(o)??0)+1)};for(let a of t.edges){if(!a.calleeFile)continue;let o=n.get(a.callerFile),i=n.get(a.calleeFile);!o||!i||o.id===i.id||r(a.callerFile,a.calleeFile)}return s}function Kc(t,n,s){if(!n)return rt;if(t.subZones&&t.subZones.length>0){let a=Math.min(t.subZones.length,is),o=rt+a*ur+16;if(s){for(let i of t.subZones.slice(0,is))if(s.has(i.id)){let l=Math.min(i.files.length,at);o+=l*Wt+(i.files.length>at?20:0)}}return t.subZones.length>is&&(o+=20),o}let r=Math.min(t.files.length,at);return rt+r*Wt+16+(t.files.length>at?20:0)}function dr(t,n,s){let r=t.x+t.w/2,a=t.y+t.h/2,o=n-r,i=s-a;if(o===0&&i===0)return{x:r,y:a};let l=t.w/2,c=t.h/2,u=o!==0?l/Math.abs(o):1/0,d=i!==0?c/Math.abs(i):1/0,p=Math.min(u,d);return{x:r+o*p,y:a+i*p}}function Uh(t,n,s,r){if(t.length===0)return{boxes:new Map,totalW:0,totalH:0};let a=new Map;for(let w of t)a.set(w.id,new Map);for(let w of n){if(!a.has(w.from)||!a.has(w.to))continue;let C=a.get(w.from);C.set(w.to,(C.get(w.to)??0)+w.weight);let I=a.get(w.to);I.set(w.from,(I.get(w.from)??0)+w.weight)}let o=new Map;for(let[w,C]of a){let I=0;for(let E of C.values())I+=E;o.set(w,I)}let i=[...t].sort((w,C)=>(o.get(C.id)??0)-(o.get(w.id)??0)),l=new Map,c=new Set,u=(w,C)=>`${w},${C}`;l.set(i[0].id,{col:0,row:0}),c.add(u(0,0));let d=[i[0].id],p=new Set([i[0].id]),m=w=>{let C=a.get(w);return C?[...C.entries()].filter(([I])=>!p.has(I)).sort((I,E)=>E[1]-I[1]).map(([I])=>I):[]};for(;d.length>0;){let w=d.shift(),C=l.get(w),I=m(w);for(let E of I){if(p.has(E))continue;p.add(E);let D=C.col+1,M=C.row,R=!1;for(let P=1;P<=10&&!R;P++)for(let A=-P;A<=P&&!R;A++)for(let j=-P;j<=P&&!R;j++){if(Math.abs(A)!==P&&Math.abs(j)!==P)continue;let U=C.col+A,se=C.row+j;c.has(u(U,se))||(D=U,M=se,R=!0)}l.set(E,{col:D,row:M}),c.add(u(D,M)),d.push(E)}}for(let w of t)if(!l.has(w.id))for(let C=0;;C++){for(let I=0;I<4;I++)if(!c.has(u(I,C))){l.set(w.id,{col:I,row:C}),c.add(u(I,C));break}if(l.has(w.id))break}let f=1/0,v=1/0;for(let w of l.values())f=Math.min(f,w.col),v=Math.min(v,w.row);for(let w of l.values())w.col-=f,w.row-=v;let b=0,g=0;for(let w of l.values())b=Math.max(b,w.col),g=Math.max(g,w.row);let y=new Array(g+1).fill(rt),h=new Map(t.map(w=>[w.id,w]));for(let[w,C]of l){let I=h.get(w);if(!I)continue;let E=Kc(I,s.has(w),r?.get(w));y[C.row]=Math.max(y[C.row],E)}let x=new Map;for(let[w,C]of l){let I=h.get(w);if(!I)continue;let E=lr+C.col*(yo+Wc),D=lr;for(let M=0;M<C.row;M++)D+=y[M]+qc;x.set(w,{x:E,y:D,w:yo,h:Kc(I,s.has(w),r?.get(w)),gridCol:C.col,gridRow:C.row})}let S=lr*2+(b+1)*yo+b*Wc,T=lr*2;for(let w of y)T+=w;return T+=g*qc,{boxes:x,totalW:S,totalH:T}}function Gh(t,n,s,r){let a=t.x+t.w/2,o=t.y+t.h/2,i=n.x+n.w/2,l=n.y+n.h/2,c=dr(t,i,l),u=dr(n,a,o),d=(c.x+u.x)/2,p=(c.y+u.y)/2,m=u.x-c.x,f=u.y-c.y,v=Math.sqrt(m*m+f*f)||1,b=-f/v,g=m/v,y=r>1?(s-(r-1)/2)*25:v>200?20:12,h=d+b*y,x=p+g*y;return`M ${c.x} ${c.y} Q ${h} ${x} ${u.x} ${u.y}`}function cr({value:t,label:n,color:s}){return e("div",{class:"stat-card",style:"padding: 8px 16px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: 8px; font-size: 12px;"},e("div",{style:`font-weight: 600; color: ${s??"var(--text)"};`},t),e("div",{style:"color: var(--text-dim);"},n))}function Wh(){return e("svg",{class:"zone-breadcrumb-sep",width:12,height:12,viewBox:"0 0 12 12",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","aria-hidden":"true"},e("path",{d:"M4.5 2.5l3 3.5-3 3.5"}))}function qh({drillPath:t,onNavigate:n}){return t.length<=1?null:e("nav",{class:"zone-breadcrumb","aria-label":"Zone navigation"},e("ol",{class:"zone-breadcrumb-list"},...t.map((s,r)=>{let a=r===t.length-1;return e("li",{key:s.zoneId??"root",class:`zone-breadcrumb-item${a?" zone-breadcrumb-current":""}`},a?e("span",{"aria-current":"location"},s.label):[e("button",{class:"zone-breadcrumb-link",type:"button",onClick:()=>n(r)},s.label),Wh()])})))}function Yc({file:t,y:n,boxX:s,boxW:r,searchMatch:a,hasCrossZone:o,onClick:i,onDblClick:l}){let c=t.functions.reduce((f,v)=>f+v.incoming.length,0),u=t.functions.reduce((f,v)=>f+v.outgoing.length,0),d=he(t.path),p=`${t.functions.length}fn`,m=`${c>0?"\u2190"+c:""}${u>0?"\u2192"+u:""}`;return e("g",{class:`cg-file-row${a?" search-match":""}${o?" cross-zone":""}`,onClick:f=>{f.stopPropagation(),i()},onDblClick:f=>{f.stopPropagation(),l()}},e("rect",{class:"cg-file-bg",x:s+8,y:n,width:r-16,height:Wt-2,rx:3}),o?e("rect",{class:"cg-file-xzone-bar",x:s+8,y:n,width:2,height:Wt-2,rx:1}):null,e("text",{class:"cg-file-name",x:s+(o?16:14),y:n+14},d.length>20?d.slice(0,18)+"\u2026":d),e("text",{class:"cg-file-stats",x:s+r-14,y:n+14,"text-anchor":"end"},`${p} ${m}`))}function Kh({edge:t,fromBox:n,toBox:s,maxWeight:r,edgeIndex:a,totalEdgesBetweenPair:o,hovered:i,onHover:l,onLeave:c}){let u=Gh(n,s,a,o),d=t.weight>r*.5,p=Math.max(1.5,Math.min(6,t.weight/r*5+1));return e("g",null,e("path",{d:u,fill:"none",stroke:"transparent","stroke-width":Math.max(12,p+8),onMouseEnter:l,onMouseLeave:c,style:"cursor: pointer;"}),e("path",{class:`cg-edge${d?" heavy":""}${i?" hovered":""}`,d:u,fill:"none","stroke-width":i?p+1:p,"marker-end":"url(#cg-arrow)",style:"pointer-events: none;"}))}function Yh({edge:t,fromBox:n,toBox:s,hovered:r}){let a=n.x+n.w/2,o=n.y+n.h/2,i=s.x+s.w/2,l=s.y+s.h/2,c=dr(n,i,l),u=dr(s,a,o),d=(c.x+u.x)/2,p=(c.y+u.y)/2;return e("text",{class:`cg-edge-label${r?" visible":""}`,x:d,y:p-8,"text-anchor":"middle"},`${t.weight} call${t.weight!==1?"s":""}`)}function Xh({subZone:t,y:n,boxX:s,boxW:r,expanded:a,onToggle:o}){let i=t.name.length>14?t.name.slice(0,12)+"\u2026":t.name;return e("g",{class:`cg-subzone-row${a?" expanded":""}`,style:`--zone-color: ${t.color}`,onClick:l=>{l.stopPropagation(),o()}},e("rect",{class:"cg-subzone-bg",x:s+6,y:n,width:r-12,height:ur-2,rx:4}),e("rect",{x:s+6,y:n,width:3,height:ur-2,rx:1.5,fill:t.color,style:"pointer-events: none;"}),e("text",{class:"cg-subzone-name",x:s+14,y:n+18},i),e("text",{class:"cg-subzone-stats",x:s+r-30,y:n+18,"text-anchor":"end"},`${t.totalFiles}f`),e("text",{class:"cg-subzone-expand-icon",x:s+r-16,y:n+18,"text-anchor":"end"},a?"\u25B4":"\u25BE"))}function Jh({zone:t,box:n,expanded:s,selected:r,dimmed:a,searchQ:o,matchingFiles:i,fileConnections:l,expandedSubZoneIds:c,onToggle:u,onSelectZone:d,onSelectFile:p,onDblClickFile:m,onDrillDown:f,onToggleSubZone:v}){let b=t.totalFiles,g=!!(t.subZones&&t.subZones.length>0),y=()=>{let x=t.files.slice(0,at),S=t.files.length-at;return[...x.map((T,w)=>{let C=n.y+rt-4+w*Wt,I=!o||i.has(T.path),E=l.has(T.path);return e(Yc,{key:T.path,file:T,y:C,boxX:n.x,boxW:n.w,searchMatch:o?I:!1,hasCrossZone:E,onClick:()=>p(T.path),onDblClick:()=>m(T.path)})}),S>0?e("text",{key:"overflow",class:"cg-file-overflow",x:n.x+14,y:n.y+rt-4+at*Wt+14},`+${S} more`):null]},h=()=>{if(!t.subZones)return[];let x=t.subZones.slice(0,is),S=t.subZones.length-is,T=[],w=n.y+rt-4;for(let C of x){let I=c?.has(C.id)??!1;if(T.push(e(Xh,{key:C.id,subZone:C,y:w,boxX:n.x,boxW:n.w,expanded:I,onToggle:()=>v?.(C.id)})),w+=ur,I){let E=C.files.slice(0,at),D=C.files.length-at;for(let M=0;M<E.length;M++){let R=E[M],P=w,A=l.has(R.path);T.push(e(Yc,{key:`${C.id}-${R.path}`,file:R,y:P,boxX:n.x+ko,boxW:n.w-ko,searchMatch:o?i.has(R.path):!1,hasCrossZone:A,onClick:()=>p(R.path),onDblClick:()=>m(R.path)})),w+=Wt}D>0&&(T.push(e("text",{key:`${C.id}-overflow`,class:"cg-file-overflow",x:n.x+ko+14,y:w+14},`+${D} more`)),w+=20)}}return S>0&&T.push(e("text",{key:"sz-overflow",class:"cg-file-overflow",x:n.x+14,y:w+14},`+${S} more sub-zones`)),T};return e("g",{class:`cg-zone-box${s?" expanded":""}${r?" selected":""}${a?" search-dim":""}`,"data-zone-id":t.id,style:"cursor: grab;"},e("rect",{class:"cg-zone-rect",x:n.x,y:n.y,width:n.w,height:n.h,rx:8,style:`--zone-color: ${t.color};`}),e("rect",{x:n.x,y:n.y,width:4,height:n.h,rx:2,fill:t.color,style:"pointer-events: none;"}),e("text",{class:"cg-zone-name",x:n.x+14,y:n.y+22},t.name),e("text",{class:"cg-zone-stats",x:n.x+14,y:n.y+40},`${b} file${b!==1?"s":""} \xB7 ${t.totalFunctions} fn`),e("text",{class:"cg-zone-stats",x:n.x+14,y:n.y+56},`${t.internalCalls+t.crossZoneCalls} calls`,t.crossZoneCalls>0?` \xB7 ${t.crossZoneCalls} cross-zone`:""),e("g",{class:"cg-zone-toggle-btn",onMouseDown:x=>x.stopPropagation(),onClick:x=>{x.stopPropagation(),u()},style:"cursor: pointer;"},e("rect",{x:n.x+n.w-32,y:n.y+6,width:24,height:22,rx:4,fill:"transparent",style:"pointer-events: all;"}),e("text",{class:"cg-zone-expand-icon",x:n.x+n.w-18,y:n.y+22,"text-anchor":"end",style:"pointer-events: none;"},s?"\u25B4":"\u25BE")),t.hasDrillDown&&t.subZones&&f?e("g",{class:"cg-zone-drill-btn",onClick:x=>{x.stopPropagation(),f()}},e("rect",{x:n.x+n.w-88,y:n.y+36,width:74,height:20,rx:4,class:"cg-drill-btn-bg",style:`--zone-color: ${t.color}`}),e("text",{x:n.x+n.w-56,y:n.y+50,"text-anchor":"middle",class:"cg-drill-btn-label"},`${t.subZones.length} sub-zones \u203A`)):null,s?e("g",null,e("g",{class:"cg-zone-detail-btn",onClick:x=>{x.stopPropagation(),d()}},e("title",null,"View zone details"),e("rect",{x:n.x+n.w-38,y:n.y+34,width:22,height:22,rx:11,class:"cg-detail-btn-bg"}),e("text",{x:n.x+n.w-27,y:n.y+49,"text-anchor":"middle",class:"cg-detail-btn-text"},"\u24D8")),e("line",{x1:n.x+8,y1:n.y+rt-12,x2:n.x+n.w-8,y2:n.y+rt-12,class:"cg-zone-divider"}),...g?h():y()):null)}function Qh({onZoomIn:t,onZoomOut:n,onFit:s}){return e("div",{class:"cg-zoom-controls"},e("button",{class:"cg-zoom-btn",onClick:t,title:"Zoom in","aria-label":"Zoom in"},"+"),e("button",{class:"cg-zoom-btn",onClick:n,title:"Zoom out","aria-label":"Zoom out"},"\u2212"),e("button",{class:"cg-zoom-btn",onClick:s,title:"Fit to content","aria-label":"Fit to content"},"\u2922"))}function ev({zones:t,edges:n,expandedZones:s,expandedSubZones:r,selectedZoneId:a,searchQ:o,fileConnections:i,fileToFileMap:l,onToggleZone:c,onSelectZone:u,onSelectFile:d,onDblClickFile:p,onDblClickZone:m,onDrillDown:f,onToggleSubZone:v}){let[b,g]=k(null),y=B(()=>new Map(t.map($=>[$.id,$])),[t]),{boxes:h,totalW:x,totalH:S}=B(()=>Uh(t,n,s,r),[t,n,s,r]),T=B(()=>({x:0,y:0,w:Math.max(x,400),h:Math.max(S,300)}),[x,S]),w=$l(T),C=wc(w.svgRef,w.viewBox),I=B(()=>{if(C.dragOffsets.size===0)return h;let $=new Map;for(let[z,O]of h){let X=C.dragOffsets.get(z);X?$.set(z,{...O,x:O.x+X.dx,y:O.y+X.dy}):$.set(z,O)}return $},[h,C.dragOffsets]),{fileEdgeElements:E,hiddenZoneEdges:D}=Il(n,I,s,y,i,l),{subZoneEdgeElements:M,hiddenZoneEdges:R}=bc(n,I,s,r,y,i),P=B(()=>{let $=new Set(D);for(let z of R)$.add(z);return $},[D,R]),A=B(()=>{let $=1;for(let z of n)z.weight>$&&($=z.weight);return $},[n]),j=B(()=>{let $=new Map;for(let z of n){let O=[z.from,z.to].sort().join("|");$.set(O,($.get(O)??0)+1)}return $},[n]),U=B(()=>{let $=new Map,z=new Map;for(let O of n){let X=[O.from,O.to].sort().join("|"),ue=z.get(X)??0;$.set(`${O.from}->${O.to}`,ue),z.set(X,ue+1)}return $},[n]),{dimmedZones:se,matchingFilesByZone:V}=B(()=>{if(!o)return{dimmedZones:new Set,matchingFilesByZone:new Map};let $=o.toLowerCase(),z=new Set,O=new Map;for(let X of t){let ue=X.name.toLowerCase().includes($),pe=new Set;for(let ve of X.files)(ve.path.toLowerCase().includes($)||ve.functions.some(le=>le.fn.qualifiedName.toLowerCase().includes($)))&&pe.add(ve.path);O.set(X.id,pe),!ue&&pe.size===0&&z.add(X.id)}return{dimmedZones:z,matchingFilesByZone:O}},[t,o]),q=_($=>{let z=$.target?.closest(".cg-zone-box");if(z){let O=z.getAttribute("data-zone-id");if(O){C.startDrag(O,$);return}}w.startPan($)},[C,w]),G=_($=>{if(C.isDragging()){C.moveDrag($);return}w.movePan($)},[C,w]),K=_($=>{let z=C.endDrag();if(z){let O=y.get(z);O&&u(O);return}w.endPan()},[C,w,y,u]);if(F(()=>{let $=()=>{let z=C.endDrag();if(z){let O=y.get(z);O&&u(O)}w.endPan()};return window.addEventListener("mouseup",$),()=>window.removeEventListener("mouseup",$)},[C,w,y,u]),t.length===0)return null;let N=`${w.viewBox.x} ${w.viewBox.y} ${w.viewBox.w} ${w.viewBox.h}`;return e("div",{class:"cg-diagram-container"},e("svg",{ref:w.svgRef,class:`cg-diagram${w.panning?" dragging":""}`,viewBox:N,preserveAspectRatio:"xMidYMid meet",onWheel:w.handleWheel,onMouseDown:q,onMouseMove:G,onMouseUp:K,onDblClick:$=>{let z=$.target?.closest?.(".cg-zone-box[data-zone-id]");if(z){let O=z.getAttribute("data-zone-id");O&&m(O)}}},e("defs",null,e("marker",{id:"cg-arrow",viewBox:"0 0 10 8",refX:9,refY:4,markerWidth:8,markerHeight:6,orient:"auto-start-reverse"},e("path",{d:"M 0 0 L 10 4 L 0 8 z",class:"cg-arrow-marker"}))),e("g",{class:"cg-edges"},n.map($=>{let z=`${$.from}->${$.to}`;if(P.has(z))return null;let O=I.get($.from),X=I.get($.to);if(!O||!X)return null;let ue=[$.from,$.to].sort().join("|"),pe=j.get(ue)??1,ve=U.get(z)??0;return e(Kh,{key:z,edge:$,fromBox:O,toBox:X,maxWeight:A,edgeIndex:ve,totalEdgesBetweenPair:pe,hovered:b===z,onHover:()=>g(z),onLeave:()=>g(null)})})),e("g",{class:"cg-subzone-edges"},M.map($=>e("path",{key:$.key,class:$.dashed?"cg-subzone-edge":"cg-file-edge",d:$.d,fill:"none",stroke:$.color,"stroke-width":Math.max(1,Math.min(2.5,$.weight*.4+.8)),opacity:$.dashed?.4:.55,"stroke-dasharray":$.dashed?"4 3":void 0}))),e("g",{class:"cg-file-edges"},E.map($=>e("path",{key:$.key,class:"cg-file-edge",d:$.d,fill:"none",stroke:$.color,"stroke-width":Math.max(1,Math.min(2.5,$.weight*.4+.8)),opacity:.55}))),e("g",{class:"cg-edge-labels"},n.map($=>{let z=`${$.from}->${$.to}`;if(P.has(z))return null;let O=I.get($.from),X=I.get($.to);return!O||!X?null:e(Yh,{key:`label-${z}`,edge:$,fromBox:O,toBox:X,hovered:b===z})})),e("g",{class:"cg-zones"},t.map($=>{let z=I.get($.id);return z?e(Jh,{key:$.id,zone:$,box:z,expanded:s.has($.id),selected:a===$.id,dimmed:se.has($.id),searchQ:o,matchingFiles:V.get($.id)??new Set,fileConnections:i,expandedSubZoneIds:r.get($.id),onToggle:()=>c($.id),onSelectZone:()=>u($),onSelectFile:d,onDblClickFile:p,onDrillDown:$.hasDrillDown&&f?()=>f($.id):void 0,onToggleSubZone:O=>v($.id,O)}):null}))),e(Qh,{onZoomIn:w.handleZoomIn,onZoomOut:w.handleZoomOut,onFit:w.handleFit}))}function tv({summary:t}){let n=t.mostCalled.length>0,s=t.mostCalling.length>0;return!n&&!s?null:e(qe,{title:"Top Functions",count:void 0,defaultOpen:!1},e("div",{style:"display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-top: 8px;"},n?e("div",null,e("h3",{style:"font-size: 14px; margin-bottom: 8px; color: var(--text);"},"Most Called Functions"),e("table",{class:"data-table",style:"width: 100%; font-size: 12px;"},e("thead",null,e("tr",null,e("th",{style:"text-align: left; padding: 4px 8px;"},"Function"),e("th",{style:"text-align: left; padding: 4px 8px;"},"File"),e("th",{style:"text-align: right; padding: 4px 8px;"},"Callers"))),e("tbody",null,t.mostCalled.slice(0,10).map((r,a)=>e("tr",{key:a,style:"border-top: 1px solid var(--border);"},e("td",{style:"padding: 4px 8px; font-family: var(--font-mono); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px;"},r.qualifiedName),e("td",{style:"padding: 4px 8px; color: var(--text-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px;"},he(r.file)),e("td",{style:"padding: 4px 8px; text-align: right; font-weight: 600;"},String(r.callerCount))))))):null,s?e("div",null,e("h3",{style:"font-size: 14px; margin-bottom: 8px; color: var(--text);"},"Most Complex Functions"),e("table",{class:"data-table",style:"width: 100%; font-size: 12px;"},e("thead",null,e("tr",null,e("th",{style:"text-align: left; padding: 4px 8px;"},"Function"),e("th",{style:"text-align: left; padding: 4px 8px;"},"File"),e("th",{style:"text-align: right; padding: 4px 8px;"},"Callees"))),e("tbody",null,t.mostCalling.slice(0,10).map((r,a)=>e("tr",{key:a,style:"border-top: 1px solid var(--border);"},e("td",{style:"padding: 4px 8px; font-family: var(--font-mono); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px;"},r.qualifiedName),e("td",{style:"padding: 4px 8px; color: var(--text-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px;"},he(r.file)),e("td",{style:"padding: 4px 8px; text-align: right; font-weight: 600;"},String(r.calleeCount))))))):null))}function So({data:t,onSelect:n,navigateTo:s}){let{zones:r,callGraph:a,imports:o}=t,[i,l]=k(""),[c,u]=k(new Set),[d,p]=k(new Map),[m,f]=k(null),v={zoneId:null,label:"All Zones"},[b,g]=k([v]);if(!r)return e("div",{class:"loading"},"No zone data available.");let y=B(()=>In(r),[r]),{zoneDataList:h}=B(()=>a?Hh(a,y,r):r?{zoneDataList:r.zones.map((N,$)=>{let z={id:N.id,name:N.name,color:ge($),description:N.description,cohesion:N.cohesion,coupling:N.coupling,files:N.files.map(O=>({path:O,functions:[],internalCalls:0,crossZoneCalls:0})),totalFiles:N.files.length,totalFunctions:0,internalCalls:0,crossZoneCalls:0};return N.subZones&&N.subZones.length>0&&(z.subZones=wo(N.subZones),z.subCrossings=xo(N.subCrossings),z.hasDrillDown=!0),z}),unzonedFiles:[]}:{zoneDataList:[],unzonedFiles:[]},[a,y,r]),x=B(()=>{let K=r?tr(r.crossings):[],N=a?nr(a.edges,y):[],$=o&&r?sr(o.external,y,r):[],z=new Map;for(let O of[...K,...N,...$]){let X=`${O.from}->${O.to}`,ue=z.get(X);ue?ue.weight+=O.weight:z.set(X,{...O})}return[...z.values()]},[a,y,o,r]),{visibleZones:S,visibleCrossings:T}=B(()=>{if(b.length<=1)return{visibleZones:h,visibleCrossings:x};let K=h,N=x;for(let $=1;$<b.length;$++){let z=b[$],O=K.find(X=>X.id===z.zoneId);if(!O?.subZones)return{visibleZones:K,visibleCrossings:N};K=O.subZones,N=O.subCrossings??[]}return{visibleZones:K,visibleCrossings:N}},[b,h,x]),w=B(()=>a?jh(a,o?.external??[],y,r):new Map,[a,o,y,r]),C=B(()=>a?Zh(a,y):new Map,[a,y]),I=B(()=>x.reduce((K,N)=>K+N.weight,0),[x]),E=i.toLowerCase(),D=B(()=>{if(!i)return r.zones;let K=i.toLowerCase();return r.zones.filter(N=>N.name.toLowerCase().includes(K)||N.description.toLowerCase().includes(K)||N.files.some($=>$.toLowerCase().includes(K)))},[r.zones,i]),M=B(()=>{if(!E)return c;let K=new Set(c);for(let N of S){let $=N.name.toLowerCase().includes(E),z=N.files.some(O=>O.path.toLowerCase().includes(E)||O.functions.some(X=>X.fn.qualifiedName.toLowerCase().includes(E)));($||z)&&K.add(N.id)}return K},[E,S,c]),R=_(K=>{u(N=>{let $=new Set(N);return $.has(K)?($.delete(K),p(z=>{if(!z.has(K))return z;let O=new Map(z);return O.delete(K),O})):$.add(K),$})},[]),P=_((K,N)=>{p($=>{let z=new Map($),O=new Set($.get(K)??[]);return O.has(N)?O.delete(N):O.add(N),O.size===0?z.delete(K):z.set(K,O),z})},[]),A=_(K=>{if(!r)return;let N=r.zones.find($=>$.id===K);N&&f(N)},[r]),j=_(K=>{if(!r)return;let N=r.zones.find($=>$.id===K.id);N&&f(N)},[r]),U=_(K=>{n({type:"file",title:he(K),path:K,zone:y.get(K)?.name})},[y,n]),se=_(K=>{s&&s("files",{file:K})},[s]),V=_(()=>{f(null)},[]),q=_(K=>{g(N=>N.slice(0,K+1)),u(new Set)},[]),G=_(K=>{let N=S.find($=>$.id===K);N?.hasDrillDown&&(g($=>[...$,{zoneId:K,label:N.name}]),u(new Set))},[S]);return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Zones")),e("p",{class:"section-sub"},b.length<=1?`${r.zones.length} zones, ${r.crossings.length} cross-zone dependencies, ${r.unzoned.length} unzoned files`:`${S.length} sub-zones in ${b[b.length-1].label}`),e(Ht,{placeholder:"Search zones, files...",value:i,onInput:l,resultCount:D.length,totalCount:r.zones.length}),a?e("div",{style:"display: flex; gap: 16px; margin: 12px 0; flex-wrap: wrap;"},e(cr,{value:String(a.summary.totalFunctions),label:"Functions"}),e(cr,{value:String(a.summary.totalCalls),label:"Calls"}),I>0?e(cr,{value:String(I),label:"Cross-Zone",color:"var(--orange)"}):null,a.summary.cycleCount>0?e(cr,{value:String(a.summary.cycleCount),label:"Cycles",color:"var(--orange)"}):null):null,e(qh,{drillPath:b,onNavigate:q}),S.length>0?e(ev,{zones:S,edges:T,expandedZones:M,expandedSubZones:d,selectedZoneId:m?.id??null,searchQ:E,fileConnections:w,fileToFileMap:C,onToggleZone:R,onSelectZone:j,onSelectFile:U,onDblClickFile:se,onDblClickZone:A,onDrillDown:G,onToggleSubZone:P}):null,r.unzoned.length?e(qe,{title:"Unzoned Files",count:r.unzoned.length,defaultOpen:!1,threshold:10},...r.unzoned.map(K=>e("div",{key:K,class:"mono-sm text-dim",style:"line-height: 1.8"},K))):null,a?e(tv,{summary:a.summary}):null,e(ho,{zone:m,crossings:r.crossings,allZones:r.zones,onClose:V,onFileClick:U,navigateTo:s}))}var nv=[".hench/",".rex/",".sourcevision/"],sv={source:"tag-source",test:"tag-test",config:"tag-config",docs:"tag-docs",generated:"tag-other",asset:"tag-other",build:"tag-other",other:"tag-other"};function Co({data:t,onSelect:n,selectedFile:s,setSelectedFile:r,selectedZone:a,navigateTo:o}){let{inventory:i,zones:l}=t,[c,u]=k(""),[d,p]=k("all"),[m,f]=k("all"),[v,b]=k("all"),[g,y]=k("path"),[h,x]=k("asc"),[S,T]=k(100),[w,C]=k(!1);if(F(()=>{a&&b(a)},[a]),!i)return e("div",{class:"loading"},"No inventory data available.");let I=B(()=>In(l),[l]),E=B(()=>l?l.zones.map((V,q)=>({id:V.id,name:V.name,color:ge(q)})):[],[l]),D=B(()=>Object.keys(i.summary.byLanguage).sort(),[i]),M=B(()=>Object.keys(i.summary.byRole).sort(),[i]),R=B(()=>{let V=i.files;if(w||(V=V.filter(q=>!nv.some(G=>q.path.startsWith(G)))),c){let q=c.toLowerCase();V=V.filter(G=>G.path.toLowerCase().includes(q)||G.category.toLowerCase().includes(q))}return d!=="all"&&(V=V.filter(q=>q.role===d)),m!=="all"&&(V=V.filter(q=>q.language===m)),v!=="all"&&(v==="__unzoned__"?V=V.filter(q=>!I.has(q.path)):V=V.filter(q=>I.get(q.path)?.id===v)),V=[...V].sort((q,G)=>{let K=q[g],N=G[g],$=typeof K=="number"&&typeof N=="number"?K-N:String(K).localeCompare(String(N));return h==="asc"?$:-$}),V},[i,c,d,m,v,g,h,I,w]);B(()=>T(100),[c,d,m,v,w]);let P=V=>{g===V?x(h==="asc"?"desc":"asc"):(y(V),x("asc"))},A=V=>g!==V?"":h==="asc"?" \u25B2":" \u25BC",j=V=>{r&&r(V.path),n({type:"file",title:he(V.path),path:V.path,language:V.language,size:Jc(V.size),lines:V.lineCount,role:V.role,category:V.category,hash:V.hash})},U=R.slice(0,S),se=R.length-S;return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Files")),e("p",{class:"section-sub"},`${i.summary.totalFiles} files, ${i.summary.totalLines.toLocaleString()} lines`),e("div",{class:"filter-bar"},e("input",{class:"filter-input",type:"text",placeholder:"Search files or categories...",value:c,onInput:V=>u(V.target.value)}),e("select",{class:"filter-select",value:d,onChange:V=>p(V.target.value)},e("option",{value:"all"},"All Roles"),M.map(V=>e("option",{key:V,value:V},V))),e("select",{class:"filter-select",value:m,onChange:V=>f(V.target.value)},e("option",{value:"all"},"All Languages"),D.map(V=>e("option",{key:V,value:V},V))),E.length>0?e("select",{class:"filter-select",value:v,onChange:V=>b(V.target.value)},e("option",{value:"all"},"All Zones"),E.map(V=>e("option",{key:V.id,value:V.id},V.name)),e("option",{value:"__unzoned__"},"Unzoned")):null,e("button",{class:`filter-toggle-btn${w?" active":""}`,onClick:()=>C(!w),title:w?"Hide internal tool directories":"Show all files including internal directories","aria-pressed":String(w)},w?"\u2713 All Files":"Show All Files"),e("span",{class:"filter-result-count"},`Showing ${Math.min(S,R.length)} of ${R.length} files`)),e("div",{class:"data-table-wrapper"},e("table",{class:"data-table"},e("thead",null,e("tr",null,e("th",{onClick:()=>P("path")},`Path${A("path")}`),E.length>0?e("th",null,"Zone"):null,e("th",{onClick:()=>P("language")},`Language${A("language")}`),e("th",{onClick:()=>P("lineCount")},`Lines${A("lineCount")}`),e("th",{onClick:()=>P("size")},`Size${A("size")}`),e("th",{onClick:()=>P("role")},`Role${A("role")}`),e("th",{onClick:()=>P("category")},`Category${A("category")}`))),e("tbody",null,U.map(V=>{let q=I.get(V.path);return e("tr",{key:V.path,onClick:()=>j(V),style:`cursor: pointer;${s===V.path?" background: var(--bg-hover);":""}`},e("td",{class:"mono-sm"},V.path),E.length>0?e("td",null,q?e("span",{class:"zone-badge",style:`--zone-color: ${q.color}`},q.name):null):null,e("td",null,V.language),e("td",{class:"text-right"},V.lineCount.toLocaleString()),e("td",{class:"text-right"},Jc(V.size)),e("td",null,e("span",{class:`tag ${sv[V.role]||"tag-other"}`},V.role)),e("td",null,V.category))})))),se>0?e("div",{class:"empty-state"},e("button",{class:"collapsible-toggle",onClick:()=>T(S+100)},`Show ${Math.min(se,100)} more (${se} remaining)`)):null)}function Jc(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function To({data:t,onSelect:n,navigateTo:s}){let{zones:r}=t,a=r?.enrichmentPass??0;if(a<Ke.architecture)return e("div",{class:"locked-view"},e("div",{class:"locked-icon"},"\u{1F512}"),e("h2",null,"Architecture"),e("p",null,"Requires enrichment pass 2 (current: ",a,")"),e("p",{class:"locked-hint"},"Run ",e("code",null,"sourcevision analyze")," again to unlock."));let o=(r?.findings??[]).filter(m=>m.type==="pattern"||m.type==="relationship"),i=o.length===0?(r?.insights??[]).filter(m=>/pattern|architect|relationship|layer|boundary|abstract/i.test(m)):[],l=o.filter(m=>m.type==="pattern"),c=o.filter(m=>m.type==="relationship"),u=B(()=>r?r.zones.map(m=>({label:m.name,value:m.files.length,color:m.cohesion>=.6?"var(--green)":m.cohesion>=.4?"var(--orange)":"var(--red)"})):[],[r]),d=r?.crossings?.length??0,p=o.filter(m=>/bidirectional/i.test(m.text)).length;return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Architecture")),e("p",{class:"section-sub"},`${o.length} findings from ${r?.zones.length??0} zones`),e("div",{class:"stat-grid"},e("div",{class:"stat-card"},e("div",{class:"value"},String(l.length)),e("div",{class:"label"},"Patterns")),e("div",{class:"stat-card"},e("div",{class:"value"},String(c.length)),e("div",{class:"label"},"Relationships")),e("div",{class:"stat-card"},e("div",{class:"value"},String(d)),e("div",{class:"label"},"Cross-Zone Imports")),e("div",{class:"stat-card"},e("div",{class:`value${p>0?" text-orange":""}`},String(p)),e("div",{class:"label"},"Bidirectional Couplings"))),u.length>0?e(Q,null,e("h3",{class:"section-header-sm"},"Zone Sizes"),e("p",{class:"section-sub"},"Files per zone. Green = high cohesion, orange = moderate, red = low."),e(Ve,{data:u})):null,e(jt,{findings:o,legacyInsights:i,groupBy:"type",searchable:!0}))}function Ro({data:t}){let{zones:n}=t,s=n?.enrichmentPass??0;if(s<Ke.problems)return e("div",{class:"locked-view"},e("div",{class:"locked-icon"},"\u{1F512}"),e("h2",null,"Problems"),e("p",null,"Requires enrichment pass 3 (current: ",s,")"),e("p",{class:"locked-hint"},"Run ",e("code",null,"sourcevision analyze")," again to unlock."));let r=(n?.findings??[]).filter(u=>u.type==="anti-pattern"),a=r.length===0?(n?.insights??[]).filter(u=>/problem|anti.?pattern|coupling|split|merge|smell|violation/i.test(u)):[],o=r.filter(u=>u.severity==="critical").length,i=r.filter(u=>u.severity==="warning").length,l=r.filter(u=>!u.severity||u.severity==="info").length,c=B(()=>{let u=new Map;for(let d of r)d.scope&&d.scope!=="global"&&u.set(d.scope,(u.get(d.scope)||0)+1);return[...u.entries()].sort((d,p)=>p[1]-d[1]).map(([d,p])=>({label:d,value:p,color:p>=3?"var(--red)":p>=2?"var(--orange)":"var(--accent)"}))},[r]);return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Problems")),e("p",{class:"section-sub"},`${r.length} anti-patterns detected`),r.length>0?e("div",{class:"stat-grid"},e("div",{class:"stat-card"},e("div",{class:"value text-red"},String(o)),e("div",{class:"label"},"Critical")),e("div",{class:"stat-card"},e("div",{class:"value text-orange"},String(i)),e("div",{class:"label"},"Warnings")),e("div",{class:"stat-card"},e("div",{class:"value"},String(l)),e("div",{class:"label"},"Info"))):null,c.length>0?e(Q,null,e("h3",{class:"section-header-sm"},"Problems by Zone"),e("p",{class:"section-sub"},"Which zones have the most anti-patterns."),e(Ve,{data:c})):null,e(jt,{findings:r,legacyInsights:a,groupBy:"severity",searchable:!0}))}function Eo({data:t}){let{zones:n}=t,s=n?.enrichmentPass??0;if(s<Ke.suggestions)return e("div",{class:"locked-view"},e("div",{class:"locked-icon"},"\u{1F512}"),e("h2",null,"Suggestions"),e("p",null,"Requires enrichment pass 4 (current: ",s,")"),e("p",{class:"locked-hint"},"Run ",e("code",null,"sourcevision analyze")," again to unlock."));let r=(n?.findings??[]).filter(c=>c.type==="suggestion"),a=r.length===0?(n?.insights??[]).filter(c=>/suggest|refactor|improv|consider|opportunity|extract/i.test(c)):[],o=r.filter(c=>c.scope==="global").length,i=r.filter(c=>c.scope!=="global").length,l=B(()=>{let c=new Set;for(let u of r)u.scope!=="global"&&c.add(u.scope);return c.size},[r]);return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Suggestions")),e("p",{class:"section-sub"},`${r.length} suggestions for improvement`),r.length>0?e("div",{class:"stat-grid"},e("div",{class:"stat-card"},e("div",{class:"value"},String(o)),e("div",{class:"label"},"Global Suggestions")),e("div",{class:"stat-card"},e("div",{class:"value"},String(i)),e("div",{class:"label"},"Zone-Specific")),e("div",{class:"stat-card"},e("div",{class:"value"},String(l)),e("div",{class:"label"},"Zones Affected"))):null,e(jt,{findings:r,legacyInsights:a,groupBy:"severity",searchable:!0}))}var rv=2e3,eu="sv:pr-markdown:view-mode";function av(t){return t==="raw"?"raw":"preview"}function ov(){if(typeof window>"u")return"preview";try{return av(window.sessionStorage.getItem(eu))}catch{return"preview"}}function iv(t){if(!(typeof window>"u"))try{window.sessionStorage.setItem(eu,t)}catch{}}function lv(t){return typeof t!="string"?null:t.trim().length>0?t:null}function Qc(t){if(!t)return null;let n=new Date(t);return Number.isNaN(n.getTime())?null:`${new Intl.DateTimeFormat("en-US",{year:"numeric",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:"UTC"}).format(n)} UTC`}function cv(t){if(!t||t<=0)return"the freshness window";let n=Math.round(t/6e4);if(n<60)return`${n} minute${n===1?"":"s"}`;let s=Math.round(n/60);return`${s} hour${s===1?"":"s"}`}function uv(t){try{let n=document.createElement("textarea");n.value=t,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select();let s=document.execCommand("copy");return document.body.removeChild(n),s}catch{return!1}}function dv(t){return t instanceof Error?t.name==="NotAllowedError"||/permission/i.test(t.message)||/denied/i.test(t.message):!1}function pv(t){let n=t.replace(/\r\n/g,`
31
+ `).split(`
32
+ `),s=[],r=0,a=0;for(;r<n.length;){let o=n[r]??"",i=o.trim();if(!i){r+=1;continue}let l=o.match(/^(#{1,6})\s+(.+)$/);if(l){let p=l[1].length,m=l[2].trim(),f=`h${p}`;s.push(e(f,{class:"pr-markdown-preview-heading",key:`h-${a+=1}`},m)),r+=1;continue}if(/^```/.test(i)){let m=i.match(/^```([\w-]+)?\s*$/)?.[1]??"",f=[];for(r+=1;r<n.length&&!/^```/.test((n[r]??"").trim());)f.push(n[r]??""),r+=1;r<n.length&&(r+=1),s.push(e("pre",{class:"pr-markdown-preview-code",key:`c-${a+=1}`},e("code",{class:m?`language-${m}`:void 0},f.join(`
33
+ `))));continue}if(o.match(/^[-*+]\s+(.+)$/)){let p=[];for(;r<n.length;){let f=(n[r]??"").match(/^[-*+]\s+(.+)$/);if(!f)break;p.push(e("li",{key:`ul-item-${a+=1}`},f[1].trim())),r+=1}s.push(e("ul",{class:"pr-markdown-preview-list",key:`ul-${a+=1}`},p));continue}if(o.match(/^\d+\.\s+(.+)$/)){let p=[];for(;r<n.length;){let f=(n[r]??"").match(/^\d+\.\s+(.+)$/);if(!f)break;p.push(e("li",{key:`ol-item-${a+=1}`},f[1].trim())),r+=1}s.push(e("ol",{class:"pr-markdown-preview-list",key:`ol-${a+=1}`},p));continue}let d=[];for(;r<n.length;){let p=n[r]??"",m=p.trim();if(!m||/^(#{1,6})\s+/.test(p)||/^```/.test(m)||/^[-*+]\s+/.test(p)||/^\d+\.\s+/.test(p))break;d.push(m),r+=1}s.push(e("p",{class:"pr-markdown-preview-paragraph",key:`p-${a+=1}`},d.join(" ")))}return s}function Io(){let[t,n]=k(!0),[s,r]=k(null),[a,o]=k(null),[i,l]=k("ready"),[c,u]=k(null),[d,p]=k(null),[m,f]=k(null),[v,b]=k("missing"),[g,y]=k(null),[h,x]=k(null),[S,T]=k(null),[w,C]=k("idle"),[I,E]=k(null),[D,M]=k(()=>ov()),R=H(!1),P=H(!1),A=H(null),j=H(!1),U=H(null),se=_(async()=>{let O=await fetch("/api/sv/pr-markdown");if(!O.ok)throw new Error(`Failed to load PR markdown (${O.status})`);let X=await O.json();return lv(X.markdown)},[]),V=_(O=>{let X=O.availability??"ready",ue=typeof O.message=="string"?O.message:null,pe=typeof O.warning=="string"?O.warning:null,ve=typeof O.baseRange=="string"&&O.baseRange.length>0?O.baseRange:null,le=typeof O.signature=="string"&&O.signature.length>0?O.signature:`${X}:unknown`,ce=O.cacheStatus??"missing",ot=typeof O.generatedAt=="string"&&O.generatedAt.length>0?O.generatedAt:null,ie=typeof O.staleAfterMs=="number"&&Number.isFinite(O.staleAfterMs)?Math.max(0,O.staleAfterMs):null;return l(X),u(ue),p(pe),f(ve),T(le),b(ce),y(ot),x(ie),{availability:X,signature:le}},[]),q=_(async(O=!1)=>{if(!R.current){R.current=!0,P.current||n(!0),o(null);try{let X=await fetch("/api/sv/pr-markdown/state");if(!X.ok)throw new Error(`Failed to load PR markdown state (${X.status})`);let ue=await X.json(),pe=V(ue);if(pe.availability!=="ready"){A.current=null,j.current=!1,r(null),P.current=!0;return}if(O||A.current!==pe.signature){let ve=await se();r(ve),j.current=ve!==null,A.current=pe.signature}P.current=!0}catch(X){let ue=X instanceof Error?X.message:"Failed to load PR markdown";P.current&&j.current,o(ue)}finally{n(!1),R.current=!1}}},[V,se]),G=_(O=>{C(O),U.current!==null&&(window.clearTimeout(U.current),U.current=null),O!=="idle"&&(U.current=window.setTimeout(()=>{C("idle"),U.current=null},rv))},[]),K=_(async()=>{if(s)try{await navigator.clipboard.writeText(s),E(null),G("success")}catch(O){if(uv(s)){E(null),G("success");return}E(dv(O)?"permission-denied":"generic"),G("error")}},[s,G]),N=_(O=>{M(O),iv(O)},[]);F(()=>(q(),()=>{U.current!==null&&window.clearTimeout(U.current)}),[q]),F(()=>{C("idle"),E(null)},[s]);let $=w==="success"?"Copied markdown to clipboard.":w==="error"?I==="permission-denied"?"Clipboard access was blocked by browser permissions. Copy manually: select the markdown and press Cmd+C (macOS) or Ctrl+C (Windows/Linux).":"Failed to copy markdown to clipboard. Copy manually: select the markdown and press Cmd+C (macOS) or Ctrl+C (Windows/Linux).":"",z=i==="unsupported"?"Git is unavailable":i==="no-repo"?"No git repository detected":i==="error"?"Unable to inspect git state":"";return e("div",{class:"pr-markdown-container"},e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"PR Markdown")),e("p",{class:"section-sub"},"PR markdown is generated automatically during ",e("code",null,"sourcevision analyze"),". Run an analysis to update."),t?e("div",{class:"loading",role:"status","aria-live":"polite"},"Loading PR markdown..."):null,!t&&a?e("div",{class:"card pr-markdown-empty"},e("h3",{class:"section-header-sm"},"Unable to load PR markdown"),e("p",null,a)):null,!t&&!a&&i!=="ready"?e("div",{class:"card pr-markdown-empty",role:"status","aria-live":"polite"},e("h3",{class:"section-header-sm"},z),e("p",null,c??"PR markdown is unavailable in this environment.")):null,!t&&!a&&i==="ready"&&d?e("div",{class:"card pr-markdown-warning",role:"status","aria-live":"polite"},e("h3",{class:"section-header-sm"},"Partial git metadata only"),e("p",null,d),e("p",null,c??"PR markdown generation is degraded."),e("p",{class:"section-sub pr-markdown-warning-meta"},`Base range: ${m??"unresolved"} | Signature: ${S?S.slice(0,12):"unknown"}`)):null,!t&&!a&&i==="ready"&&!s?e("div",{class:"card pr-markdown-empty",role:"status","aria-live":"polite"},e("h3",{class:"section-header-sm"},"No PR markdown available"),e("p",null,"PR markdown has not been generated yet."),e("p",null,"Run ",e("code",null,"sourcevision analyze")," to generate PR markdown automatically.")):null,!t&&!a&&i==="ready"&&v==="stale"&&s?e("div",{class:"card pr-markdown-warning",role:"status","aria-live":"polite"},e("h3",{class:"section-header-sm"},"Cached PR markdown is stale"),e("p",null,`This cached artifact is older than ${cv(h)}.`),e("p",null,"Run ",e("code",null,"sourcevision analyze")," to regenerate."),e("p",{class:"section-sub pr-markdown-warning-meta"},`Generated at: ${Qc(g)??"unknown"}`)):null,!t&&!a&&s?e("div",{class:"card pr-markdown-success",role:"status","aria-live":"polite"},e("h3",{class:"section-header-sm"},"PR markdown ready"),g?e("p",{class:"section-sub pr-markdown-gen-meta"},v==="fresh"?"\u2713 ":"",`Generated ${Qc(g)??"at unknown time"}`,v==="fresh"?" \u2014 fresh":""):null,e("div",{class:"pr-markdown-mode-toggle",role:"group","aria-label":"PR markdown view mode"},e("button",{type:"button",class:`toggle-btn${D==="preview"?" active":""}`,"aria-pressed":String(D==="preview"),"aria-controls":"pr-markdown-panel-preview",onClick:()=>N("preview")},"Preview"),e("button",{type:"button",class:`toggle-btn${D==="raw"?" active":""}`,"aria-pressed":String(D==="raw"),"aria-controls":"pr-markdown-panel-raw",onClick:()=>N("raw")},"Raw")),D==="preview"?e("section",{class:"pr-markdown-panel",id:"pr-markdown-panel-preview"},e("h4",{class:"section-header-sm"},"Preview"),e("div",{class:"pr-markdown-preview"},pv(s))):e("section",{class:"pr-markdown-panel",id:"pr-markdown-panel-raw"},e("div",{class:"pr-markdown-raw-header"},e("h4",{class:"section-header-sm"},"Raw Markdown"),e("button",{type:"button",class:"btn pr-markdown-copy-btn",onClick:()=>{K()}},w==="success"?"Copied":"Copy Markdown")),e("pre",{class:"pr-markdown-raw"},s),e("p",{class:"section-sub pr-markdown-copy-feedback",role:"status","aria-live":"polite"},$))):null)}function su(t){return{id:t.file,routePattern:t.routePattern,file:t.file,children:t.children.map(su)}}function fv(t,n){let s=new Map,r=new Set;for(let l of t){let c=l.from,u=s.get(c);u||(u=[],s.set(c,u)),u.push({name:l.componentName,file:l.to,count:l.usageCount}),r.add(`${l.to}:${l.componentName}`)}let a=new Set;for(let l of t)r.has(`${l.from}:${l.from.split("/").pop()?.replace(/\.\w+$/,"")||""}`)||a.add(l.from);if(a.size===0)for(let l of s.keys())a.add(l);let o=new Set;function i(l,c){let u=[];if(c<4&&!o.has(l)){o.add(l);let d=s.get(l)??[];for(let p of d)u.push({id:`${l}->${p.file}:${p.name}`,componentName:p.name,file:p.file,usageCount:p.count,children:i(p.file,c+1).children});o.delete(l)}return{id:l,file:l,children:u}}return[...a].map(l=>{let c=i(l,0);return c.file=l,c}).filter(l=>l.children.length>0)}function _o({data:t}){let n=t.components,[s,r]=k("");if(!n)return e("div",{class:"locked-view"},e("div",{class:"locked-icon"},"\u25C7"),e("h2",null,"No Component Data"),e("p",null,"Run the component analyzer to see routes and component usage."),e("div",{class:"locked-hint"},e("code",null,"sourcevision analyze")));let{routeModules:a,routeTree:o,usageEdges:i,summary:l}=n,c=n.components,u=B(()=>o.map(su),[o]),d=B(()=>{let g=new Map;for(let y of a)g.set(y.file,y);return g},[a]),p=B(()=>{if(!i||i.length===0)return[];let g=new Set(c.map(y=>y.file));return fv(i,g)},[i,c]),m=B(()=>{if(!s)return null;let g=s.toLowerCase(),y=new Set;function h(x){for(let S of x){let T=String(S.routePattern||"").toLowerCase(),w=String(S.file||"").toLowerCase();(T.includes(g)||w.includes(g))&&y.add(S.id),h(S.children)}}return h(u),y},[s,u]),f=B(()=>{let g={loader:"#6cb4ee",action:"#6cb4ee",default:"var(--green)",ErrorBoundary:"var(--orange)",HydrateFallback:"var(--orange)",meta:"var(--purple)",links:"var(--purple)",headers:"var(--purple)",handle:"var(--purple)"};return Object.entries(l.routeConventions).map(([y,h])=>({label:y,value:h,color:g[y]||"var(--accent)"}))},[l.routeConventions]),v=(g,y)=>{let h=d.get(String(g.file));return e(Q,null,e("span",{class:"route-pattern"},String(g.routePattern||"/")),e("span",{class:"route-file"},String(g.file)),...(h?.exports??[]).map(x=>e("span",{key:x,class:`route-badge route-badge-${nu(x)}`},x)),h?.isLayout?e("span",{class:"tag tag-source route-badge"},"layout"):null,h?.isIndex?e("span",{class:"tag tag-test route-badge"},"index"):null)},b=(g,y)=>{let h=g.componentName,x=g.file,S=g.usageCount;return e(Q,null,h?e("span",{class:"component-name"},h):e("span",{class:"component-file"},tu(x)),h?e("span",{class:"component-file"},tu(x)):null,S!=null&&S>0?e("span",{class:"component-usage-badge"},`${S}x`):null)};return e("div",null,e("div",{class:"view-header"},e(te,{product:"sourcevision",title:"SourceVision",class:"branded-header-sv"}),e("h2",{class:"section-header"},"Routes & Components")),e("div",{class:"stat-grid"},e("div",{class:"stat-card"},e("div",{class:"value"},String(l.totalComponents)),e("div",{class:"label"},"Components")),e("div",{class:"stat-card"},e("div",{class:"value"},String(l.totalRouteModules)),e("div",{class:"label"},"Route Modules")),e("div",{class:"stat-card"},e("div",{class:"value"},String(l.totalUsageEdges)),e("div",{class:"label"},"Usage Edges")),e("div",{class:"stat-card"},e("div",{class:"value"},String(l.layoutDepth)),e("div",{class:"label"},"Layout Depth"))),o.length>0||p.length>0?e(Ht,{placeholder:"Search routes, files, or components...",value:s,onInput:r}):null,u.length>0?e(Q,null,e("h3",{class:"section-header-sm"},"Route Tree"),e(ar,{nodes:u,renderNode:v,defaultExpandDepth:3,filterMatch:m})):null,p.length>0?e(Q,null,e("h3",{class:"section-header-sm mt-24"},"Component Usage Tree"),e("p",{class:"section-sub"},"How components are used across files. Arrows show which files import and render each component."),e(ar,{nodes:p,renderNode:b,defaultExpandDepth:2})):null,f.length>0?e(Q,null,e("h3",{class:"section-header-sm mt-24"},"Convention Coverage"),e(Ve,{data:f})):null,a.length>0?e(qe,{title:"Route Modules",count:a.length,defaultOpen:!0,threshold:20},e("div",{class:"data-table-wrapper"},e("table",{class:"data-table"},e("thead",null,e("tr",null,e("th",null,"File"),e("th",null,"Pattern"),e("th",null,"Exports"),e("th",null,"Layout"))),e("tbody",null,a.map(g=>e("tr",{key:g.file},e("td",null,g.file),e("td",null,g.routePattern||e("span",{class:"route-file"},"(pathless)")),e("td",null,g.exports.map(y=>e("span",{key:y,class:`route-badge route-badge-${nu(y)}`},y))),e("td",null,g.isLayout?e("span",{class:"tag tag-source"},"layout"):null,g.isIndex?e("span",{class:"tag tag-test"},"index"):null))))))):null,l.mostUsedComponents.length>0?e(qe,{title:"Most Used Components",count:l.mostUsedComponents.length,defaultOpen:!0,threshold:15},e("div",{class:"data-table-wrapper"},e("table",{class:"data-table component-usage-table"},e("thead",null,e("tr",null,e("th",null,"Component"),e("th",null,"File"),e("th",null,"Usage Count"))),e("tbody",null,l.mostUsedComponents.map(g=>e("tr",{key:`${g.file}:${g.name}`},e("td",null,g.name),e("td",null,g.file),e("td",null,String(g.usageCount)))))))):null)}function tu(t){let n=t.split("/");return n.length>2?`.../${n.slice(-2).join("/")}`:t}function nu(t){switch(t){case"loader":case"action":return"data";case"default":return"component";case"ErrorBoundary":case"HydrateFallback":return"boundary";default:return"meta"}}var mv={epic:"feature",feature:"task",task:"subtask"},gv={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"},hv=[{value:"",label:"None"},{value:"critical",label:"Critical"},{value:"high",label:"High"},{value:"medium",label:"Medium"},{value:"low",label:"Low"}];function ru({parentLevel:t,parentId:n,depth:s,onSubmit:r,onCancel:a}){let[o,i]=k(""),[l,c]=k(""),[u,d]=k(""),[p,m]=k(!1),[f,v]=k(null),[b,g]=k(!1),y=H(null);F(()=>{let I=setTimeout(()=>y.current?.focus(),50);return()=>clearTimeout(I)},[]);let h=mv[t];if(!h)return null;let x=gv[h],S=(s+1)*24,T=_(async I=>{I&&I.preventDefault();let E=o.trim();if(!E){v("Title is required"),y.current?.focus();return}m(!0),v(null);try{await r({title:E,parentId:n,level:h,description:l.trim()||void 0,priority:u||void 0})}catch(D){v(String(D)),m(!1)}},[o,l,u,n,h,r]),w=_(I=>{I.key==="Escape"&&(I.preventDefault(),I.stopPropagation(),a()),I.key==="Enter"&&(I.ctrlKey||I.metaKey)&&(I.preventDefault(),T())},[a,T]),C=_(I=>{I.key==="Enter"&&!I.shiftKey&&!b&&(I.preventDefault(),T()),w(I)},[T,w,b]);return e("div",{class:"prd-inline-add-form",style:`padding-left: ${S+8}px`,onKeyDown:w},f?e("div",{class:"prd-inline-add-error",role:"alert"},f):null,e("div",{class:"prd-inline-add-row"},e("span",{class:`prd-level-badge prd-level-${h}`},x),e("input",{ref:y,class:"prd-inline-add-title",type:"text",value:o,placeholder:`New ${x.toLowerCase()} title...`,onInput:I=>{i(I.target.value),f&&v(null)},onKeyDown:C,disabled:p,"aria-label":`New ${x.toLowerCase()} title`}),e("button",{type:"button",class:`prd-inline-add-more${b?" active":""}`,onClick:()=>g(!b),title:b?"Hide extra fields":"Show description & priority","aria-label":b?"Hide extra fields":"Show extra fields",disabled:p},"\u22EF"),e("button",{type:"button",class:"prd-inline-add-submit",onClick:()=>T(),disabled:p||!o.trim(),title:`Add ${x.toLowerCase()}`,"aria-label":`Add ${x.toLowerCase()}`},p?"\u2026":"\u2713"),e("button",{type:"button",class:"prd-inline-add-cancel",onClick:a,disabled:p,title:"Cancel (Esc)","aria-label":"Cancel"},"\u2715")),b?e("div",{class:"prd-inline-add-extra"},e("textarea",{class:"prd-inline-add-description",value:l,placeholder:"Description (optional)",onInput:I=>c(I.target.value),onKeyDown:w,rows:2,disabled:p,"aria-label":"Description"}),e("div",{class:"prd-inline-add-priority-row"},e("span",{class:"prd-inline-add-priority-label"},"Priority:"),e("select",{class:"prd-inline-add-priority",value:u,onChange:I=>d(I.target.value),disabled:p,"aria-label":"Priority"},hv.map(I=>e("option",{key:I.value,value:I.value},I.label))))):null)}var au=[{value:"pending",label:"Pending",icon:"\u25CB"},{value:"in_progress",label:"In Progress",icon:"\u25D0"},{value:"completed",label:"Completed",icon:"\u25CF"},{value:"failing",label:"Failing",icon:"\u26A0"},{value:"blocked",label:"Blocked",icon:"\u2298"},{value:"deferred",label:"Deferred",icon:"\u25CC"},{value:"deleted",label:"Deleted",icon:"\u2715"}];function ou({currentStatus:t,anchorRect:n,onSelect:s,onClose:r}){let a=H(null);F(()=>{let u=p=>{a.current&&!a.current.contains(p.target)&&r()},d=p=>{p.key==="Escape"&&(p.stopPropagation(),r())};return document.addEventListener("mousedown",u),document.addEventListener("keydown",d,!0),()=>{document.removeEventListener("mousedown",u),document.removeEventListener("keydown",d,!0)}},[r]),F(()=>{if(!a.current)return;let u=a.current.querySelector(".prd-status-picker-option.active");u&&u.focus()},[]);let o=au.length*32+8,l=window.innerHeight-n.bottom<o&&n.top>o,c={position:"fixed",left:`${Math.min(n.left,window.innerWidth-160)}px`,zIndex:"9999"};return l?c.bottom=`${window.innerHeight-n.top+4}px`:c.top=`${n.bottom+4}px`,e("div",{ref:a,class:"prd-status-picker",style:c,role:"listbox","aria-label":"Change status"},au.map(u=>e("button",{key:u.value,class:`prd-status-picker-option prd-status-${u.value}${t===u.value?" active":""}`,role:"option","aria-selected":String(t===u.value),onClick:d=>{d.stopPropagation(),u.value!==t&&s(u.value),r()},onKeyDown:d=>{if(d.key==="ArrowDown"){d.preventDefault();let p=d.currentTarget.nextElementSibling;p&&p.focus()}if(d.key==="ArrowUp"){d.preventDefault();let p=d.currentTarget.previousElementSibling;p&&p.focus()}(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),u.value!==t&&s(u.value),r())}},e("span",{class:"prd-status-picker-icon"},u.icon),e("span",{class:"prd-status-picker-label"},u.label),t===u.value?e("span",{class:"prd-status-picker-check","aria-hidden":"true"},"\u2713"):null)))}function iu(t){let n=t?.closest?.("[data-node-id]");if(!n)return null;let s=n.getAttribute("data-node-id");return s?{el:n,id:s}:null}function lu(t){let n=H(t);n.current=t;let s=_(a=>{let o=a.target,i=iu(o);if(!i)return;let l=n.current,c=l.getItem(i.id);if(!c)return;let u=i.el.hasAttribute("data-has-children");if(o.closest(".prd-inline-add-btn")){l.onInlineAdd&&l.onInlineAdd(c);return}if(o.closest(".prd-node-action-edit")){l.onSelectItem&&l.onSelectItem(c);return}if(o.closest(".prd-node-action-status")){if(l.onStatusClick){let p=o.closest(".prd-node-action-status").getBoundingClientRect();l.onStatusClick(c,{left:p.left,top:p.top,bottom:p.bottom})}return}if(o.closest(".prd-node-action-delete")){l.onRemoveItem&&l.onRemoveItem(c);return}if(o.classList.contains("prd-chevron")){u&&l.onToggle(i.id);return}if(l.onBulkSelect){let d={ctrlKey:a.ctrlKey||a.metaKey,shiftKey:a.shiftKey};l.onBulkSelect(c,d)}else l.onSelectItem?l.onSelectItem(c):u&&l.onToggle(i.id)},[]),r=_(a=>{let o=iu(a.target);if(!o)return;let i=n.current,l=i.getItem(o.id);if(!l)return;let c=o.el.hasAttribute("data-has-children"),u=i.expanded.has(o.id);if((a.key==="Enter"||a.key===" ")&&(a.preventDefault(),i.onBulkSelect?i.onBulkSelect(l,{ctrlKey:!0,shiftKey:!1}):i.onSelectItem?i.onSelectItem(l):c&&i.onToggle(o.id)),c&&a.key==="ArrowRight"&&!u&&(a.preventDefault(),i.onToggle(o.id)),c&&a.key==="ArrowLeft"&&u&&(a.preventDefault(),i.onToggle(o.id)),a.key==="ArrowDown"||a.key==="ArrowUp"){a.preventDefault();let d=a.currentTarget,p=Array.from(d.querySelectorAll('[role="treeitem"]')),m=p.indexOf(o.el);if(m<0)return;let f=a.key==="ArrowDown"?m+1:m-1;if(f>=0&&f<p.length&&(p[f].focus(),a.shiftKey&&i.onBulkSelect)){let v=p[f].getAttribute("data-node-id");if(v){let b=i.getItem(v);b&&i.onBulkSelect(b,{ctrlKey:!1,shiftKey:!0})}}}},[]);return{onClick:s,onKeyDown:r}}function vv(t,n){if(n.statuses&&n.statuses.size>0&&!n.statuses.has(t.status))return!1;if(n.tags&&n.tags.size>0){let s=t.tags??[];for(let r of n.tags)if(!s.includes(r))return!1}return!0}function cu(t,n,s){let r=n.trim().toLowerCase(),a=r.length>0,o=s!=null&&(s.tags!=null&&s.tags.size>0||s.statuses!=null&&s.statuses.size>0);if(!a&&!o)return{matchIds:new Set,ancestorIds:new Set,visibleIds:new Set,expandIds:new Set,matchCount:0};let i=new Set,l=new Set;function c(p,m){let f=!1;for(let v of p){let b=!0;if(a){let S=v.title.toLowerCase().includes(r),T=v.description?v.description.toLowerCase().includes(r):!1;b=S||T}let g=o?vv(v,s):!0,y=b&&g,h=[...m,v.id],x=v.children?c(v.children,h):!1;if(y){i.add(v.id);for(let S of m)l.add(S);f=!0}x&&(f=!0)}return f}c(t,[]);let u=new Set([...i,...l]),d=new Set(l);return{matchIds:i,ancestorIds:l,visibleIds:u,expandIds:d,matchCount:i.size}}function uu(t){let n=new Set;function s(r){for(let a of r){if(a.tags)for(let o of a.tags)n.add(o);a.children&&s(a.children)}}return s(t),[...n].sort()}function Do(t,n){return n.has(t.id)?!0:t.children?t.children.some(s=>Do(s,n)):!1}function du(t,n){let s=n.trim().toLowerCase();if(!s||!t)return[t];let r=t.toLowerCase(),a=[],o=0;for(;o<t.length;){let i=r.indexOf(s,o);if(i===-1){a.push(t.slice(o));break}i>o&&a.push(t.slice(o,i)),a.push(e("mark",{class:"prd-search-highlight"},t.slice(i,i+s.length))),o=i+s.length}return a}var pu=40,fu=10;function Po(t,n,s,r=0,a){let o=[];for(let i of t){if(!Ra(i,s)||a&&a.size>0&&!Do(i,a))continue;let l=i.children??[],c=l.length>0,u=n.has(i.id);if(o.push({item:i,depth:r,isExpanded:u,hasChildren:c}),c&&u){let d=Po(l,n,s,r+1,a);for(let p of d)o.push(p)}}return o}function bv(t,n,s,r=pu,a=fu){if(s===0)return{start:0,end:0,offsetY:0};if(n<=0)return{start:0,end:s,offsetY:0};let o=Math.floor(t/r),i=Math.ceil(n/r),l=Math.max(0,o-a),c=Math.min(s,o+i+a),u=l*r;return{start:l,end:c,offsetY:u}}function mu(t,n){for(let s=0;s<t.length;s++)if(t[s].item.id===n)return s;return-1}function gu({flatNodes:t,containerRef:n,config:s={}}){let r=s.itemHeight??pu,a=s.bufferCount??fu,[o,i]=k(0),[l,c]=k(0);F(()=>{let y=n.current;if(!y||(c(y.clientHeight),typeof ResizeObserver>"u"))return;let h=new ResizeObserver(x=>{for(let S of x)c(S.contentRect.height)});return h.observe(y),()=>h.disconnect()},[n]);let u=H(t.length);F(()=>{u.current!==t.length&&(u.current=t.length,Math.abs(u.current-t.length)>t.length*.5&&i(0))},[t.length]);let d=t.length*r,p=l>0,m=B(()=>bv(o,l,t.length,r,a),[o,l,t.length,r,a]),f=B(()=>t.slice(m.start,m.end),[t,m.start,m.end]),v=Math.max(0,d-m.offsetY-f.length*r),b=_(y=>{let h=y.target;i(h.scrollTop)},[]),g=_(y=>{let h=n.current;if(!h)return;let x=Math.max(0,y*r-l/2+r/2);h.scrollTop=x},[n,r,l]);return{visibleNodes:f,totalHeight:d,offsetY:m.offsetY,afterSpaceHeight:v,onScroll:b,scrollToIndex:g,renderedCount:f.length,totalCount:t.length,isActive:p}}var yv=new Set(["epic","feature","task"]),bu={completed:{icon:"\u25CF",cssClass:"prd-status-completed",label:"Completed"},in_progress:{icon:"\u25D0",cssClass:"prd-status-in-progress",label:"In Progress"},pending:{icon:"\u25CB",cssClass:"prd-status-pending",label:"Pending"},failing:{icon:"\u26A0",cssClass:"prd-status-failing",label:"Failing"},deferred:{icon:"\u25CC",cssClass:"prd-status-deferred",label:"Deferred"},blocked:{icon:"\u2298",cssClass:"prd-status-blocked",label:"Blocked"},deleted:{icon:"\u2715",cssClass:"prd-status-deleted",label:"Deleted"}},kv={critical:{cssClass:"prd-priority-critical"},high:{cssClass:"prd-priority-high"},medium:{cssClass:"prd-priority-medium"},low:{cssClass:"prd-priority-low"}},hu={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"};function yu(t,n,s=0){let r=new Set;if(s>=n)return r;for(let a of t)if(r.add(a.id),a.children&&a.children.length>0)for(let o of yu(a.children,n,s+1))r.add(o);return r}function wv({status:t}){let n=bu[t];return e("span",{class:`prd-status-icon ${n.cssClass}`,title:n.label,"aria-label":n.label},n.icon)}function xv({priority:t}){let n=kv[t];return e("span",{class:`prd-priority-badge ${n.cssClass}`},t)}function Sv({ratio:t}){let n=Math.round(t*100),s=n>=100?"prd-bar-done":n>=50?"prd-bar-mid":"prd-bar-low";return e("div",{class:"prd-progress-wrapper",title:`${n}% complete`,role:"progressbar","aria-valuenow":String(n),"aria-valuemin":"0","aria-valuemax":"100","aria-label":`${n}% complete`},e("div",{class:"prd-progress-track","aria-hidden":"true"},e("div",{class:`prd-progress-fill ${s}`,style:`width: ${n}%`})),e("span",{class:"prd-progress-pct","aria-hidden":"true"},`${n}%`))}function Cv({tags:t}){return e("span",{class:"prd-tag-list"},t.map(n=>e("span",{key:n,class:"prd-tag"},n)))}function vu(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function Tv({item:t}){if(t.status==="completed"&&t.completedAt){let n=xn(t.completedAt);if(n)return e("span",{class:"prd-timestamp"},`done ${n}`)}if(t.status==="in_progress"&&t.startedAt){let n=xn(t.startedAt);if(n)return e("span",{class:"prd-timestamp"},`started ${n}`)}return t.status==="failing"&&t.failureReason?e("span",{class:"prd-timestamp prd-failure-reason"},t.failureReason):null}var Mo=class extends Kt{shouldComponentUpdate(n){let s=this.props;return s.item!==n.item||s.isExpanded!==n.isExpanded||s.isSelected!==n.isSelected||s.isBulkSelected!==n.isBulkSelected||s.isInlineAddActive!==n.isInlineAddActive||s.isHighlighted!==n.isHighlighted||s.isDeleting!==n.isDeleting||s.depth!==n.depth||s.hasChildren!==n.hasChildren||s.canInlineAdd!==n.canInlineAdd||s.canDelete!==n.canDelete||s.showTokenBudget!==n.showTokenBudget||s.taskUsage!==n.taskUsage||s.weeklyBudget!==n.weeklyBudget||s.searchQuery!==n.searchQuery||s.isSearchMatch!==n.isSearchMatch}render(){let{item:n,taskUsage:s,weeklyBudget:r,showTokenBudget:a,depth:o,isExpanded:i,hasChildren:l,isSelected:c,isBulkSelected:u,canInlineAdd:d,isInlineAddActive:p,isHighlighted:m,nodeRef:f,canDelete:v,isDeleting:b,searchQuery:g,isSearchMatch:y}=this.props,h=n.children??[],x=l?Xn(h):null,S=x?Us(x):0,T=yv.has(n.level),w=s??{totalTokens:0,runCount:0,utilization:st(0,r)},C=w.utilization??st(w.totalTokens,r),I=o*24;return e("div",{class:`prd-node-row${l?" prd-node-expandable":""}${c?" prd-node-selected":""}${u?" prd-node-bulk-selected":""}${m?" prd-node-highlighted":""}${b?" prd-node-deleting":""}${y?" prd-node-search-match":""} prd-level-${n.level}`,style:`padding-left: ${I+8}px`,"data-node-id":n.id,...l?{"data-has-children":""}:{},role:"treeitem","aria-expanded":l?String(i):void 0,"aria-selected":String(u||c),tabIndex:0,ref:f},e("span",{class:`prd-chevron${l&&i?" prd-chevron-open":""}`,"aria-hidden":"true"},l?"\u25B6":""),e(wv,{status:n.status}),e("span",{class:`prd-level-badge prd-level-${n.level}`},hu[n.level]),e("span",{class:"prd-node-title",title:n.title},...g?du(n.title,g):[n.title]),n.priority?e(xv,{priority:n.priority}):null,x&&x.total>0?e(Q,null,e(Sv,{ratio:S}),e("span",{class:"prd-count"},`${x.completed}/${x.total}`)):null,n.tags&&n.tags.length>0?e(Cv,{tags:n.tags}):null,zt(n.level)&&w.totalTokens>0?e("span",{class:`prd-token-badge${a?" prd-token-badge--budget":""}`,...a?{"data-utilization-reason":C.reason}:{},title:a?`${w.runCount} associated run${w.runCount===1?"":"s"} | ${C.label} weekly utilization`:`${w.runCount} associated run${w.runCount===1?"":"s"}`},a?`${vu(w.totalTokens)} tokens | ${C.label}`:`${vu(w.totalTokens)} tokens`):null,e(Tv,{item:n}),e("span",{class:"prd-node-actions"},T&&d?e("button",{class:`prd-node-action prd-inline-add-btn${p?" active":""}`,title:`Add child to ${n.title}`,"aria-label":`Add child item to ${n.title}`,tabIndex:0},"+"):null,e("button",{class:"prd-node-action prd-node-action-edit",title:`Edit ${n.title}`,"aria-label":`Edit ${n.title}`,tabIndex:0},"\u270E"),e("button",{class:"prd-node-action prd-node-action-status",title:`Change status of ${n.title}`,"aria-label":`Change status of ${n.title}`,tabIndex:0},"\u21C5"),v?e("button",{class:"prd-node-action prd-node-action-delete",title:`Delete ${hu[n.level]} "${n.title}"`,"aria-label":`Delete ${n.title}`,tabIndex:0},"\u2717"):null))}};function Rv({items:t}){let n=Xn(t),s=n.total>0?Math.round(n.completed/n.total*100):0,a=[{status:"completed",count:n.completed,label:"Completed"},{status:"in_progress",count:n.inProgress,label:"In Progress"},{status:"pending",count:n.pending,label:"Pending"},{status:"failing",count:n.failing,label:"Failing"},{status:"blocked",count:n.blocked,label:"Blocked"},{status:"deferred",count:n.deferred,label:"Deferred"},{status:"deleted",count:n.deleted,label:"Deleted"}].filter(o=>o.count>0);return e("div",{class:"prd-summary"},e("div",{class:"prd-summary-bar"},a.map(o=>e("div",{key:o.status,class:`prd-summary-segment prd-status-bg-${o.status}`,style:`width: ${o.count/n.total*100}%`,title:`${o.label}: ${o.count}`}))),e("div",{class:"prd-summary-stats"},a.map(o=>e("span",{key:o.status,class:"prd-summary-stat"},e("span",{class:`prd-status-dot ${bu[o.status].cssClass}`}),`${o.count} ${o.label}`)),e("span",{class:"prd-summary-pct"},`${s}% complete (${n.completed}/${n.total})`)))}function Ev({onExpandAll:t,onCollapseAll:n}){return e("div",{class:"prd-toolbar"},e("button",{class:"prd-toolbar-btn",onClick:t,title:"Expand all nodes"},"Expand All"),e("button",{class:"prd-toolbar-btn",onClick:n,title:"Collapse all nodes"},"Collapse All"))}function Iv(t){let n=new Map;function s(r){for(let a of r)n.set(a.id,a),a.children&&s(a.children)}return s(t),n}function $o({document:t,taskUsageById:n,weeklyBudget:s,showTokenBudget:r,defaultExpandDepth:a=2,onSelectItem:o,selectedItemId:i,bulkSelectedIds:l,onBulkSelect:c,onInlineAddSubmit:u,highlightedItemId:d,deepLinkExpandIds:p,onRemoveItem:m,onUpdateItem:f,deletingItemId:v,activeStatuses:b,searchQuery:g,searchVisibleIds:y,searchMatchIds:h,chunkSize:x}){let S=B(()=>Iv(t.items),[t.items]),T=_(ie=>S.get(ie)??null,[S]),w=B(()=>{let ie=new Set;function de(be){for(let vt of be)ie.add(vt.id),vt.children&&de(vt.children)}return de(t.items),ie},[t.items]),[C,I]=k(()=>yu(t.items,a));F(()=>{!p||p.size===0||I(ie=>{let de=new Set(ie);for(let be of p)de.add(be);return de})},[p]);let[E]=k(()=>Kn()),D=b??E;F(()=>{!y||y.size===0||I(ie=>{let de=new Set(ie);for(let be of y)de.add(be);return de})},[y]);let M=B(()=>Po(t.items,C,D,0,y),[t.items,C,D,y]),R=H(null),P=gu({flatNodes:M,containerRef:R}),A=H(!1);F(()=>{if(!d){A.current=!1;return}if(A.current)return;let ie=mu(M,d);ie>=0&&(A.current=!0,requestAnimationFrame(()=>{P.scrollToIndex(ie)}))},[d,M,P.scrollToIndex]);let j=_(ie=>{ie&&d&&requestAnimationFrame(()=>{ie.scrollIntoView({behavior:"smooth",block:"nearest"})})},[d]),[U,se]=k(null),V=_(ie=>{se(de=>de===ie.id?null:ie.id),I(de=>{let be=new Set(de);return be.add(ie.id),be})},[]),q=_(()=>{se(null)},[]),G=_(async ie=>{u&&(await u(ie),se(null))},[u]),K=_(ie=>{I(de=>{let be=new Set(de);return be.has(ie)?be.delete(ie):be.add(ie),be})},[]),N=_(()=>I(new Set(w)),[w]),$=_(()=>I(new Set),[]),[z,O]=k(null),X=_((ie,de)=>{O(be=>be?.item.id===ie.id?null:{item:ie,anchorRect:de})},[]),ue=_(()=>{O(null)},[]),pe=_(ie=>{!z||!f||f(z.item.id,{status:ie})},[z,f]),ve=_((ie,de)=>{if(!c)return;let be=M.map(vt=>vt.item.id);c(ie,de,be)},[c,M]),le=lu({getItem:T,onToggle:K,onSelectItem:o,onBulkSelect:c?ve:void 0,onInlineAdd:u?V:void 0,onRemoveItem:m,onStatusClick:f?X:void 0,expanded:C});if(t.items.length===0)return e("div",{class:"prd-empty"},e("p",null,"No PRD items yet."),e("p",{class:"prd-empty-hint"},"Run ",e("code",null,'rex add epic --title="..."')," to get started."));let ce=!!u,ot=!!m;return e("div",{class:"prd-tree-container"},e("div",{class:"prd-header"},e("h2",{class:"prd-title"},t.title),e(Ev,{onExpandAll:N,onCollapseAll:$})),e(Rv,{items:t.items}),e("div",{ref:R,class:"prd-tree prd-tree-virtual",role:"tree","aria-label":"PRD hierarchy",onScroll:P.onScroll,onClick:le.onClick,onKeyDown:le.onKeyDown},P.offsetY>0?e("div",{class:"prd-virtual-spacer",style:`height: ${P.offsetY}px`,"aria-hidden":"true"}):null,P.visibleNodes.map(ie=>{let{item:de,depth:be,isExpanded:vt,hasChildren:ld}=ie,Xo=U===de.id,Jo=d===de.id;return e(Q,{key:de.id},e(Mo,{item:de,taskUsage:n?.[de.id],weeklyBudget:s,showTokenBudget:r,depth:be,isExpanded:vt,hasChildren:ld,isSelected:i===de.id,isBulkSelected:l?.has(de.id),canInlineAdd:ce,isInlineAddActive:Xo,isHighlighted:Jo,nodeRef:Jo?j:void 0,canDelete:ot,isDeleting:v===de.id,searchQuery:g,isSearchMatch:h?.has(de.id)}),Xo&&u?e(ru,{parentLevel:de.level,parentId:de.id,depth:be,onSubmit:G,onCancel:q}):null)}),P.afterSpaceHeight>0?e("div",{class:"prd-virtual-spacer",style:`height: ${P.afterSpaceHeight}px`,"aria-hidden":"true"}):null,z&&f?e(ou,{currentStatus:z.item.status,anchorRect:z.anchorRect,onSelect:pe,onClose:ue}):null))}var _v=[{status:"pending",label:"Pending",icon:"\u25CB",cssClass:"prd-status-pending"},{status:"in_progress",label:"In Progress",icon:"\u25D0",cssClass:"prd-status-in-progress"},{status:"completed",label:"Completed",icon:"\u25CF",cssClass:"prd-status-completed"},{status:"failing",label:"Failing",icon:"\u26A0",cssClass:"prd-status-failing"},{status:"blocked",label:"Blocked",icon:"\u2298",cssClass:"prd-status-blocked"},{status:"deferred",label:"Deferred",icon:"\u25CC",cssClass:"prd-status-deferred"}],Ao=20;function Lo({availableTags:t,activeTags:n,activeStatuses:s,onTagsChange:r,onStatusesChange:a,onClearAll:o}){let i=n.size>0||s.size>0,[l,c]=k(""),[u,d]=k(!1),[p,m]=k(-1),f=H(null),v=H(null),b=B(()=>{let T=l.trim().toLowerCase();return t.filter(C=>!n.has(C)&&(!T||C.toLowerCase().includes(T))).slice(0,Ao)},[t,n,l]),g=B(()=>{let T=l.trim().toLowerCase();return t.filter(w=>!n.has(w)&&(!T||w.toLowerCase().includes(T))).length},[t,n,l]);F(()=>{m(-1)},[b.length,l]),F(()=>{let T=w=>{f.current&&!f.current.contains(w.target)&&d(!1)};return document.addEventListener("mousedown",T),()=>document.removeEventListener("mousedown",T)},[]);let y=_(T=>{let w=new Set(n);w.add(T),r(w),c(""),d(!1),v.current?.focus()},[n,r]),h=_(T=>{let w=new Set(n);w.delete(T),r(w)},[n,r]),x=_(T=>{let w=new Set(s);w.has(T)?w.delete(T):w.add(T),a(w)},[s,a]),S=_(T=>{if(T.key==="ArrowDown")T.preventDefault(),m(w=>Math.min(w+1,b.length-1));else if(T.key==="ArrowUp")T.preventDefault(),m(w=>Math.max(w-1,0));else if(T.key==="Enter"&&p>=0&&p<b.length)T.preventDefault(),y(b[p]);else if(T.key==="Escape")d(!1),c("");else if(T.key==="Backspace"&&l===""&&n.size>0){let w=[...n].pop();w&&h(w)}},[b,p,y,l,n,h]);return e("div",{class:"prd-facet-filter",role:"group","aria-label":"Search facets"},e("div",{class:"prd-facet-row"},e("span",{class:"prd-facet-label"},"Status:"),e("div",{class:"prd-facet-chips",role:"toolbar","aria-label":"Status facets"},_v.map(T=>{let w=s.has(T.status);return e("button",{key:T.status,class:`prd-facet-chip prd-facet-status${w?" active":""} ${T.cssClass}`,onClick:()=>x(T.status),title:`${w?"Remove":"Add"} ${T.label.toLowerCase()} filter`,"aria-pressed":String(w),type:"button"},e("span",{class:"prd-facet-chip-icon"},T.icon),e("span",{class:"prd-facet-chip-label"},T.label))}))),e("div",{class:"prd-facet-row prd-facet-row--tags"},e("span",{class:"prd-facet-label"},"Tags:"),t.length>0?e("div",{class:"prd-tag-typeahead",ref:f},n.size>0?e("div",{class:"prd-facet-chips prd-tag-selected",role:"toolbar","aria-label":"Active tag filters"},[...n].sort().map(T=>e("button",{key:T,class:"prd-facet-chip prd-facet-tag active",onClick:()=>h(T),title:`Remove "${T}" tag filter`,"aria-pressed":"true",type:"button"},e("span",{class:"prd-facet-chip-icon"},"#"),e("span",{class:"prd-facet-chip-label"},T),e("span",{class:"prd-tag-remove"},"\xD7")))):null,e("div",{class:"prd-tag-input-wrap"},e("input",{ref:v,type:"text",class:"prd-tag-input",placeholder:`Search ${t.length} tags\u2026`,value:l,onInput:T=>{c(T.target.value),d(!0)},onFocus:()=>d(!0),onKeyDown:S,"aria-label":"Search tags","aria-expanded":String(u&&b.length>0),"aria-autocomplete":"list",autocomplete:"off"}),u&&l.trim().length>0&&b.length>0?e("ul",{class:"prd-tag-dropdown",role:"listbox"},b.map((T,w)=>e("li",{key:T,class:`prd-tag-option${w===p?" highlighted":""}`,role:"option","aria-selected":String(w===p),onMouseDown:C=>{C.preventDefault(),y(T)},onMouseEnter:()=>m(w)},e("span",{class:"prd-tag-option-hash"},"#"),T)),g>Ao?e("li",{class:"prd-tag-option prd-tag-more"},`+${g-Ao} more\u2026 refine your search`):null):u&&l.trim().length>0&&b.length===0?e("ul",{class:"prd-tag-dropdown",role:"listbox"},e("li",{class:"prd-tag-option prd-tag-no-match"},"No matching tags")):null)):e("span",{class:"prd-facet-empty"},"No tags in current PRD")),i?e("button",{class:"prd-facet-clear",onClick:o,title:"Clear all facet filters",type:"button"},"\xD7 Clear facets"):null)}function Dv(t){return t.map(n=>({epicTitle:n.epic.title,epicDescription:n.epic.description??"",selected:!0,expanded:!0,features:n.features.map(s=>({title:s.title,description:s.description??"",selected:!0,expanded:!1,tasks:s.tasks.map(r=>({title:r.title,description:r.description??"",priority:r.priority??"",tags:(r.tags??[]).join(", "),selected:!0}))}))}))}function ku(t){let n=[];for(let s=0;s<t.length;s++){let r=t[s];if(r.selected){r.epicTitle.trim()||n.push({path:`${s}`,message:"Epic title is required"});for(let a=0;a<r.features.length;a++){let o=r.features[a];if(o.selected){o.title.trim()||n.push({path:`${s}.${a}`,message:"Feature title is required"});for(let i=0;i<o.tasks.length;i++){let l=o.tasks[i];l.selected&&(l.title.trim()||n.push({path:`${s}.${a}.${i}`,message:"Task title is required"}))}}}}}return n}function Pv(t){let n=0,s=0,r=0;for(let a of t)if(a.selected){n++;for(let o of a.features)o.selected&&(s++,r+=o.tasks.filter(i=>i.selected).length)}return{epics:n,features:s,tasks:r}}function pr({proposals:t,onAccepted:n,onCancel:s}){let[r,a]=k(()=>Dv(t)),[o,i]=k(!1),[l,c]=k(null),[u,d]=k(!1),p=B(()=>ku(r),[r]),m=B(()=>Pv(r),[r]),f=m.epics+m.features+m.tasks,v=_((C,I)=>{a(E=>{let D=[...E];return D[C]={...D[C],...I},D})},[]),b=_((C,I,E)=>{a(D=>{let M=[...D],R=[...M[C].features];return R[I]={...R[I],...E},M[C]={...M[C],features:R},M})},[]),g=_((C,I,E,D)=>{a(M=>{let R=[...M],P=[...R[C].features],A=[...P[I].tasks];return A[E]={...A[E],...D},P[I]={...P[I],tasks:A},R[C]={...R[C],features:P},R})},[]),y=_(C=>{a(I=>{let E=[...I],D=!E[C].selected,M=E[C].features.map(R=>({...R,selected:D,tasks:R.tasks.map(P=>({...P,selected:D}))}));return E[C]={...E[C],selected:D,features:M},E})},[]),h=_((C,I)=>{a(E=>{let D=[...E],M=[...D[C].features],R=!M[I].selected;return M[I]={...M[I],selected:R,tasks:M[I].tasks.map(P=>({...P,selected:R}))},D[C]={...D[C],features:M},D})},[]),x=_((C,I,E)=>{a(D=>{let M=[...D],R=[...M[C].features],P=[...R[I].tasks];return P[E]={...P[E],selected:!P[E].selected},R[I]={...R[I],tasks:P},M[C]={...M[C],features:R},M})},[]),S=_(()=>{a(C=>C.map(I=>({...I,selected:!0,features:I.features.map(E=>({...E,selected:!0,tasks:E.tasks.map(D=>({...D,selected:!0}))}))})))},[]),T=_(()=>{a(C=>C.map(I=>({...I,selected:!1,features:I.features.map(E=>({...E,selected:!1,tasks:E.tasks.map(D=>({...D,selected:!1}))}))})))},[]),w=_(async()=>{d(!0);let C=ku(r);if(C.length>0){c(`${C.length} validation error${C.length>1?"s":""} \u2014 fix highlighted fields before accepting`);return}if(f===0){c("No items selected");return}i(!0),c(null);try{let I=r.map(D=>({epic:{title:D.epicTitle,description:D.epicDescription||void 0},features:D.features.map(M=>({title:M.title,description:M.description||void 0,tasks:M.tasks.map(R=>({title:R.title,description:R.description||void 0,priority:R.priority||void 0,tags:R.tags?R.tags.split(",").map(P=>P.trim()).filter(Boolean):void 0,selected:R.selected})),selected:M.selected})),selected:D.selected})),E=await fetch("/api/rex/proposals/accept-edited",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proposals:I})});if(!E.ok){let D=await E.json().catch(()=>({error:"Accept failed"}));throw new Error(D.error||`HTTP ${E.status}`)}n()}catch(I){c(String(I))}finally{i(!1)}},[r,f,n]);return e("div",{class:"proposal-editor"},e("div",{class:"proposal-editor-header"},e("h3",{class:"proposal-editor-title"},"Review & Edit Proposals"),e("p",{class:"proposal-editor-subtitle"},"Edit titles and descriptions, then select which items to accept into the PRD.")),e("div",{class:"proposal-editor-toolbar"},e("div",{class:"proposal-editor-counts"},e("span",{class:"proposal-editor-count-badge"},`${m.epics} epic${m.epics!==1?"s":""}`),e("span",{class:"proposal-editor-count-badge"},`${m.features} feature${m.features!==1?"s":""}`),e("span",{class:"proposal-editor-count-badge"},`${m.tasks} task${m.tasks!==1?"s":""}`)),e("div",{class:"proposal-editor-select-btns"},e("button",{class:"proposal-editor-select-btn",onClick:S,type:"button"},"Select All"),e("button",{class:"proposal-editor-select-btn",onClick:T,type:"button"},"Select None"))),u&&p.length>0?e("div",{class:"proposal-editor-errors",role:"alert"},e("strong",null,`${p.length} validation error${p.length>1?"s":""}:`),e("ul",null,p.map((C,I)=>e("li",{key:I},C.message)))):null,l&&(!u||p.length===0)?e("div",{class:"proposal-editor-error",role:"alert"},l):null,e("div",{class:"proposal-editor-tree"},r.map((C,I)=>e(Mv,{key:I,proposal:C,pi:I,showValidation:u,validationErrors:p,onToggle:()=>y(I),onExpand:()=>v(I,{expanded:!C.expanded}),onUpdateTitle:E=>v(I,{epicTitle:E}),onUpdateDescription:E=>v(I,{epicDescription:E}),onToggleFeature:E=>h(I,E),onExpandFeature:E=>{let D=C.features[E];b(I,E,{expanded:!D.expanded})},onUpdateFeature:(E,D)=>b(I,E,D),onToggleTask:(E,D)=>x(I,E,D),onUpdateTask:(E,D,M)=>g(I,E,D,M)}))),e("div",{class:"proposal-editor-actions"},e("button",{class:"proposal-editor-btn proposal-editor-btn-cancel",onClick:s,type:"button",disabled:o},"Cancel"),e("button",{class:"proposal-editor-btn proposal-editor-btn-accept",onClick:w,type:"button",disabled:o||f===0},o?"Accepting...":`Accept ${f} Item${f!==1?"s":""}`)))}function Mv({proposal:t,pi:n,showValidation:s,validationErrors:r,onToggle:a,onExpand:o,onUpdateTitle:i,onUpdateDescription:l,onToggleFeature:c,onExpandFeature:u,onUpdateFeature:d,onToggleTask:p,onUpdateTask:m}){let f=s&&r.some(g=>g.path===`${n}`),v=t.features.length,b=t.features.reduce((g,y)=>g+y.tasks.length,0);return e("div",{class:`proposal-editor-epic${t.selected?"":" deselected"}${f?" has-error":""}`},e("div",{class:"proposal-editor-epic-header"},e("input",{type:"checkbox",checked:t.selected,onChange:a,"aria-label":`Select epic: ${t.epicTitle}`}),e("span",{class:"prd-level-badge prd-level-epic"},"Epic"),e("input",{type:"text",class:`proposal-editor-input proposal-editor-input-title${f?" input-error":""}`,value:t.epicTitle,onInput:g=>i(g.target.value),placeholder:"Epic title (required)",disabled:!t.selected}),e("span",{class:"proposal-editor-item-count"},`${v}F / ${b}T`),e("button",{class:`proposal-editor-expand${t.expanded?" open":""}`,onClick:o,type:"button","aria-label":t.expanded?"Collapse":"Expand"},"\u25B6")),t.expanded?e(Q,null,e("div",{class:"proposal-editor-epic-body"},e("textarea",{class:"proposal-editor-textarea",value:t.epicDescription,onInput:g=>l(g.target.value),placeholder:"Description (optional)",rows:2,disabled:!t.selected})),t.features.map((g,y)=>e($v,{key:y,feature:g,pi:n,fi:y,parentSelected:t.selected,showValidation:s,validationErrors:r,onToggle:()=>c(y),onExpand:()=>u(y),onUpdate:h=>d(y,h),onToggleTask:h=>p(y,h),onUpdateTask:(h,x)=>m(y,h,x)}))):null)}function $v({feature:t,pi:n,fi:s,parentSelected:r,showValidation:a,validationErrors:o,onToggle:i,onExpand:l,onUpdate:c,onToggleTask:u,onUpdateTask:d}){let p=a&&o.some(f=>f.path===`${n}.${s}`),m=!r||!t.selected;return e("div",{class:`proposal-editor-feature${t.selected?"":" deselected"}${p?" has-error":""}`},e("div",{class:"proposal-editor-feature-header"},e("input",{type:"checkbox",checked:t.selected,onChange:i,disabled:!r,"aria-label":`Select feature: ${t.title}`}),e("span",{class:"prd-level-badge prd-level-feature"},"Feature"),e("input",{type:"text",class:`proposal-editor-input proposal-editor-input-title${p?" input-error":""}`,value:t.title,onInput:f=>c({title:f.target.value}),placeholder:"Feature title (required)",disabled:m}),e("span",{class:"proposal-editor-item-count"},`${t.tasks.length} task${t.tasks.length!==1?"s":""}`),e("button",{class:`proposal-editor-expand${t.expanded?" open":""}`,onClick:l,type:"button","aria-label":t.expanded?"Collapse":"Expand"},"\u25B6")),t.expanded?e(Q,null,e("div",{class:"proposal-editor-feature-body"},e("textarea",{class:"proposal-editor-textarea",value:t.description,onInput:f=>c({description:f.target.value}),placeholder:"Description (optional)",rows:2,disabled:m})),t.tasks.map((f,v)=>e(Av,{key:v,task:f,pi:n,fi:s,ti:v,parentSelected:r&&t.selected,showValidation:a,validationErrors:o,onToggle:()=>u(v),onUpdate:b=>d(v,b)}))):null)}function Av({task:t,pi:n,fi:s,ti:r,parentSelected:a,showValidation:o,validationErrors:i,onToggle:l,onUpdate:c}){let[u,d]=k(!1),p=o&&i.some(f=>f.path===`${n}.${s}.${r}`),m=!a||!t.selected;return e("div",{class:`proposal-editor-task${t.selected?"":" deselected"}${p?" has-error":""}`},e("div",{class:"proposal-editor-task-header"},e("input",{type:"checkbox",checked:t.selected,onChange:l,disabled:!a,"aria-label":`Select task: ${t.title}`}),e("span",{class:"prd-level-badge prd-level-task"},"Task"),e("input",{type:"text",class:`proposal-editor-input proposal-editor-input-title${p?" input-error":""}`,value:t.title,onInput:f=>c({title:f.target.value}),placeholder:"Task title (required)",disabled:m}),t.priority?e("span",{class:`prd-priority-badge prd-priority-${t.priority}`},t.priority):null,e("button",{class:`proposal-editor-expand${u?" open":""}`,onClick:()=>d(!u),type:"button","aria-label":u?"Collapse":"Expand"},"\u25B6")),u?e("div",{class:"proposal-editor-task-body"},e("textarea",{class:"proposal-editor-textarea",value:t.description,onInput:f=>c({description:f.target.value}),placeholder:"Description (optional)",rows:2,disabled:m}),e("div",{class:"proposal-editor-task-meta"},e("label",{class:"proposal-editor-meta-label"},"Priority",e("select",{class:"proposal-editor-select",value:t.priority,onChange:f=>c({priority:f.target.value}),disabled:m},e("option",{value:""},"None"),e("option",{value:"critical"},"Critical"),e("option",{value:"high"},"High"),e("option",{value:"medium"},"Medium"),e("option",{value:"low"},"Low"))),e("label",{class:"proposal-editor-meta-label"},"Tags",e("input",{type:"text",class:"proposal-editor-input proposal-editor-input-tags",value:t.tags,onInput:f=>c({tags:f.target.value}),placeholder:"comma-separated tags",disabled:m})))):null)}var ls=10,Lv=["Add user authentication with OAuth2 and JWT tokens","Create a settings page with profile editing and notification preferences","Add dark mode support with system preference detection","Implement real-time search with debounced filtering and result highlights"];function Fo({onPrdChanged:t,compact:n}){let[s,r]=k(""),[a,o]=k("idle"),[i,l]=k([]),[c,u]=k(0),[d,p]=k([]),[m,f]=k(null),[v,b]=k(!1),[g,y]=k(!1),[h,x]=k([]),[S,T]=k(""),[w,C]=k(!1),I=H(0),E=H(null);F(()=>{if(w)return;let N=!1;async function $(){try{let pe=function(ve,le){for(let ce of ve)Bl(ce.level)&&(ue.push({id:ce.id,title:ce.title,level:ce.level,depth:le}),Vl(ce.level)&&Array.isArray(ce.children)&&pe(ce.children,le+1))};var z=pe;let O=await fetch("/api/rex/prd");if(!O.ok)return;let X=await O.json();if(N)return;let ue=[];Array.isArray(X.items)&&pe(X.items,0),x(ue)}catch{}finally{N||C(!0)}}return $(),()=>{N=!0}},[w]);let D=_(()=>{C(!1)},[]),M=s.length,R=s.trim().length,P=_(async(N,$,z)=>{E.current&&E.current.abort();let O=new AbortController;E.current=O,o("loading"),f(null);try{let X={text:N};z&&(X.parentId=z);let ue=await fetch("/api/rex/smart-add-preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(X),signal:O.signal});if($!==I.current)return;if(!ue.ok){let ve=await ue.json().catch(()=>({error:"Preview failed"}));throw new Error(ve.error||`HTTP ${ue.status}`)}let pe=await ue.json();if($!==I.current)return;l(pe.proposals??[]),u(pe.confidence??0),p(pe.qualityIssues??[]),o((pe.proposals?.length>0,"done"))}catch(X){if(X instanceof DOMException&&X.name==="AbortError"||$!==I.current)return;f(String(X)),o("error")}},[]),A=_(N=>{r(N)},[]),j=_(()=>{let N=s.trim();if(N.length<ls)return;let $=++I.current;P(N,$,S||void 0)},[s,P,S]);F(()=>()=>{E.current&&E.current.abort()},[]);let U=_(async()=>{if(i.length!==0){y(!0);try{let N=i.map(z=>({epic:{title:z.epic.title,description:z.epic.description},features:z.features.map(O=>({title:O.title,description:O.description,tasks:O.tasks.map(X=>({title:X.title,description:X.description,priority:X.priority,tags:X.tags,selected:!0})),selected:!0})),selected:!0})),$=await fetch("/api/rex/proposals/accept-edited",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proposals:N})});if(!$.ok){let z=await $.json().catch(()=>({error:"Accept failed"}));throw new Error(z.error||`HTTP ${$.status}`)}r(""),l([]),u(0),o("idle"),D(),t()}catch(N){f(String(N))}finally{y(!1)}}},[i,t,D]),se=_(()=>{b(!1),r(""),l([]),u(0),o("idle"),D(),t()},[t,D]);if(v&&i.length>0)return e("div",{class:"smart-add-panel"},e(pr,{proposals:i,onAccepted:se,onCancel:()=>b(!1)}));let V=i.reduce((N,$)=>N+$.features.reduce((z,O)=>z+O.tasks.length,0),0),q=i.reduce((N,$)=>N+$.features.length,0),G=B(()=>{if(!S)return null;let N=h.find($=>$.id===S);return N?`${N.level}: ${N.title}`:null},[S,h]);return e("div",{class:n?"smart-add-panel smart-add-panel-compact":"smart-add-panel"},e("div",{class:"smart-add-header"},e("h3",{class:"smart-add-title"},"Smart Add"),e("p",{class:"smart-add-subtitle"},"Describe what you want to build, then click Generate.")),h.length>0?e("div",{class:"smart-add-scope"},e("label",{class:"smart-add-scope-label"},"Scope"),e("select",{class:"smart-add-scope-select",value:S,onChange:N=>{T(N.target.value)},"aria-label":"Scope proposals under an existing epic or feature"},e("option",{value:""},"Entire project (new epics)"),h.map(N=>e("option",{key:N.id,value:N.id},`${" ".repeat(N.depth)}${Se(N.level)}: ${N.title}`))),S?e("span",{class:"smart-add-scope-active"},`Adding under ${G}`):null):null,a==="idle"&&R===0?e("div",{class:"smart-add-examples"},e("span",{class:"smart-add-examples-label"},"Try something like:"),e("div",{class:"smart-add-examples-list"},Lv.map((N,$)=>e("button",{key:$,type:"button",class:"smart-add-example-chip",onClick:()=>A(N),"aria-label":`Use example: ${N}`},N)))):null,e("div",{class:"smart-add-input-area"},e("textarea",{class:"smart-add-textarea",value:s,placeholder:"Describe a feature, improvement, or idea...",onInput:N=>A(N.target.value),rows:n?3:4,"aria-label":"Smart add description"}),e("div",{class:"smart-add-input-status"},M>0?e("span",{class:`smart-add-char-count${R<ls?" smart-add-char-count-warn":""}`},`${M} chars`):null,R>0&&R<ls?e("span",{class:"smart-add-hint"},`${ls-R} more to generate proposals`):null,a==="loading"?e("span",{class:"smart-add-loading-badge"},e("span",{class:"smart-add-spinner","aria-hidden":"true"})," Generating..."):null),e("button",{class:"smart-add-btn smart-add-btn-generate",type:"button",disabled:R<ls||a==="loading",onClick:j,"aria-label":"Generate proposals"},a==="loading"?"Generating...":"Generate")),a==="loading"?e("div",{class:"smart-add-loading",role:"status","aria-live":"polite"},e("div",{class:"smart-add-loading-bar"},e("div",{class:"smart-add-loading-bar-fill"})),e("span",{class:"smart-add-loading-text"},"Analyzing description and generating proposals...")):null,m?e("div",{class:"smart-add-error",role:"alert","aria-live":"assertive"},e("span",{class:"smart-add-error-icon"},"\u26A0"),e("span",null,m)):null,a==="done"&&i.length===0?e("div",{class:"smart-add-empty"},e("p",null,"No proposals generated."),e("p",{class:"smart-add-empty-hint"},"Try a more detailed description or different phrasing.")):null,a==="done"&&i.length>0?e(Q,null,e(Fv,{confidence:c}),d.length>0?e("div",{class:"smart-add-quality-issues"},e("span",{class:"smart-add-quality-icon"},"\u26A0"),e("span",null,`${d.length} quality warning${d.length!==1?"s":""}`)):null,e("div",{class:"smart-add-stats"},e("span",{class:"smart-add-stat"},e("span",{class:"smart-add-stat-count"},String(i.length)),` epic${i.length!==1?"s":""}`),e("span",{class:"smart-add-stat-sep"},"\u2022"),e("span",{class:"smart-add-stat"},e("span",{class:"smart-add-stat-count"},String(q)),` feature${q!==1?"s":""}`),e("span",{class:"smart-add-stat-sep"},"\u2022"),e("span",{class:"smart-add-stat"},e("span",{class:"smart-add-stat-count"},String(V)),` task${V!==1?"s":""}`)),e("div",{class:"smart-add-preview"},i.map((N,$)=>e(Nv,{key:$,proposal:N,index:$}))),e("div",{class:"smart-add-actions"},e("button",{class:"smart-add-btn smart-add-btn-review",onClick:()=>b(!0),disabled:g,type:"button"},"\u270E Review & Edit"),e("button",{class:"smart-add-btn smart-add-btn-accept",onClick:U,disabled:g,type:"button"},g?"Accepting...":`Accept All (${i.length+q+V} items)`))):null)}function Fv({confidence:t}){let n=t>=80?"high":t>=50?"medium":"low";return e("div",{class:"smart-add-confidence"},e("div",{class:"smart-add-confidence-header"},e("span",{class:"smart-add-confidence-label"},n==="high"?"High confidence":n==="medium"?"Moderate confidence":"Low confidence"),e("span",{class:`smart-add-confidence-value smart-add-confidence-${n}`},`${t}%`)),e("div",{class:"smart-add-confidence-track"},e("div",{class:`smart-add-confidence-fill smart-add-confidence-${n}`,style:{width:`${t}%`},role:"progressbar","aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`Confidence: ${t}%`})))}function Nv({proposal:t,index:n}){let[s,r]=k(!0),a=t.features.reduce((o,i)=>o+i.tasks.length,0);return e("div",{class:"smart-add-preview-card"},e("div",{class:"smart-add-preview-epic",onClick:()=>r(!s),role:"button",tabIndex:0,"aria-expanded":s,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),r(!s))}},e("span",{class:`smart-add-preview-expand${s?" open":""}`,"aria-hidden":"true"},"\u25B6"),e("span",{class:"prd-level-badge prd-level-epic"},"Epic"),e("span",{class:"smart-add-preview-title"},t.epic.title),e("span",{class:"smart-add-preview-count"},`${t.features.length}F / ${a}T`)),s?e("div",{class:"smart-add-preview-body"},t.epic.description?e("p",{class:"smart-add-preview-desc"},t.epic.description):null,t.features.map((o,i)=>e("div",{key:i,class:"smart-add-preview-feature"},e("div",{class:"smart-add-preview-feature-header"},e("span",{class:"prd-level-badge prd-level-feature"},"Feature"),e("span",{class:"smart-add-preview-feature-title"},o.title),o.description?e("span",{class:"smart-add-preview-feature-desc"},` \u2014 ${o.description}`):null),o.tasks.length>0?e("div",{class:"smart-add-preview-tasks"},o.tasks.map((l,c)=>e("div",{key:c,class:"smart-add-preview-task"},e("span",{class:"prd-level-badge prd-level-task"},"Task"),e("span",{class:"smart-add-preview-task-title"},l.title),l.priority?e("span",{class:`prd-priority-badge prd-priority-${l.priority}`},l.priority):null,l.acceptanceCriteria&&l.acceptanceCriteria.length>0?e("span",{class:"smart-add-preview-ac-badge"},`${l.acceptanceCriteria.length} AC`):null))):null))):null)}var wu=[{value:"epic",label:"Epic"},{value:"feature",label:"Feature"},{value:"task",label:"Task"},{value:"subtask",label:"Subtask"}],Ov=[{value:"",label:"None"},{value:"critical",label:"Critical"},{value:"high",label:"High"},{value:"medium",label:"Medium"},{value:"low",label:"Low"}],fr={epic:[null],feature:["epic"],task:["feature","epic"],subtask:["task"]},xu={epic:"feature",feature:"task",task:"subtask"};function Cu(t,n=0){let s=[];for(let r of t)s.push({item:r,depth:n}),r.children&&r.children.length>0&&s.push(...Cu(r.children,n+1));return s}function Su(t,n){let s=fr[t];return n===null?s.includes(null):s.includes(n)}function Tu({allItems:t,onSubmit:n,onCancel:s,defaultParentId:r}){let[a,o]=k(""),[i,l]=k(""),[c,u]=k(r?"":"epic"),[d,p]=k(r??""),[m,f]=k(""),[v,b]=k(!1),[g,y]=k(null),[h,x]=k(!1),S=H(null);F(()=>{S.current?.focus()},[]);let T=B(()=>Cu(t),[t]),w=B(()=>{if(c)return c;if(d){let R=T.find(P=>P.item.id===d);if(R)return xu[R.item.level]??""}return"epic"},[c,d,T]),C=B(()=>w?T.filter(R=>Su(w,R.item.level)):T,[w,T]),I=w?fr[w].includes(null):!0,E=h&&!a.trim()?"Title is required":null,D=_(async R=>{if(R.preventDefault(),x(!0),!a.trim()){y("Title is required"),S.current?.focus();return}b(!0),y(null);try{await n({title:a.trim(),level:w||void 0,parentId:d||void 0,description:i.trim()||void 0,priority:m||void 0}),o(""),l(""),u(""),p(""),f(""),x(!1)}catch(P){y(String(P))}finally{b(!1)}},[a,w,d,i,m,n]),M=w?wu.find(R=>R.value===w)?.label??w:"item";return e("form",{class:"rex-add-form",onSubmit:D},e("div",{class:"rex-add-form-header"},e("h3",{class:"rex-add-form-title"},"Add New Item"),e("button",{type:"button",class:"rex-add-form-close",onClick:s,"aria-label":"Close"},"\xD7")),g?e("div",{class:"rex-add-form-error",role:"alert","aria-live":"assertive"},g):null,e("div",{class:"rex-add-form-field"},e("label",{class:"rex-add-form-label",id:"add-form-type-label"},"Type"),e("div",{class:"rex-add-form-level-group",role:"group","aria-labelledby":"add-form-type-label"},wu.map(R=>e("button",{key:R.value,type:"button",class:`rex-add-form-level-btn prd-level-${R.value}${w===R.value?" active":""}`,"aria-pressed":w===R.value?"true":"false",onClick:()=>{if(u(R.value),d){let P=T.find(A=>A.item.id===d);P&&!Su(R.value,P.item.level)&&p("")}fr[R.value].length===1&&fr[R.value][0]===null&&p("")}},R.label)))),w!=="epic"?e("div",{class:"rex-add-form-field"},e("label",{class:"rex-add-form-label",for:"add-form-parent"},"Parent"),e("select",{id:"add-form-parent",class:"rex-add-form-select",value:d,onChange:R=>{let P=R.target.value;if(p(P),P&&!c){let A=T.find(j=>j.item.id===P);if(A){let j=xu[A.item.level];j&&u(j)}}}},I?e("option",{value:""},"(root item)"):e("option",{value:"",disabled:!0},"Select a parent..."),C.map(R=>e("option",{key:R.item.id,value:R.item.id},`${" ".repeat(R.depth)}${R.item.title} (${R.item.level})`)))):null,e("div",{class:`rex-add-form-field${E?" rex-add-form-field-error":""}`},e("label",{class:"rex-add-form-label",for:"add-form-title"},"Title"),e("input",{id:"add-form-title",class:`rex-add-form-input${E?" rex-add-form-input-error":""}`,type:"text",value:a,placeholder:`Enter ${M} title...`,onInput:R=>o(R.target.value),onBlur:()=>x(!0),required:!0,"aria-required":"true","aria-invalid":E?"true":void 0,"aria-describedby":E?"add-form-title-error":void 0,ref:S}),E?e("div",{class:"rex-add-form-field-hint rex-add-form-field-hint-error",id:"add-form-title-error",role:"alert"},E):null),e("div",{class:"rex-add-form-field"},e("label",{class:"rex-add-form-label",for:"add-form-description"},"Description ",e("span",{class:"rex-add-form-optional"},"(optional)")),e("textarea",{id:"add-form-description",class:"rex-add-form-textarea",value:i,placeholder:"Describe the item...",onInput:R=>l(R.target.value),rows:3})),e("div",{class:"rex-add-form-field"},e("label",{class:"rex-add-form-label",for:"add-form-priority"},"Priority"),e("select",{id:"add-form-priority",class:"rex-add-form-select",value:m,onChange:R=>f(R.target.value)},Ov.map(R=>e("option",{key:R.value,value:R.value},R.label)))),e("div",{class:"rex-add-form-actions"},e("button",{type:"button",class:"rex-add-form-btn rex-add-form-btn-cancel",onClick:s},"Cancel"),e("button",{type:"submit",class:"rex-add-form-btn rex-add-form-btn-submit",disabled:v||!a.trim()},v?"Adding...":`Add ${M}`)))}var Vv=[{value:"pending",label:"Pending",icon:"\u25CB"},{value:"in_progress",label:"In Progress",icon:"\u25D0"},{value:"completed",label:"Completed",icon:"\u25CF"},{value:"blocked",label:"Blocked",icon:"\u2298"},{value:"deferred",label:"Deferred",icon:"\u25CC"},{value:"deleted",label:"Deleted",icon:"\u2715"}];function Ru({selectedIds:t,onClearSelection:n,onActionComplete:s,onMerge:r}){let[a,o]=k(!1),[i,l]=k(null),c=_(async d=>{if(t.size!==0){o(!0),l(null);try{let p=await fetch("/api/rex/items/bulk",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({ids:[...t],updates:{status:d}})});if(!p.ok){let v=await p.json().catch(()=>({error:"Update failed"}));throw new Error(v.error||`HTTP ${p.status}`)}let f=(await p.json()).results?.filter(v=>v.ok).length??0;l(`Updated ${f} item${f!==1?"s":""} to ${d.replace("_"," ")}`),setTimeout(()=>{l(null),s(),n()},1500)}catch(p){l(`Error: ${p}`),setTimeout(()=>l(null),3e3)}finally{o(!1)}}},[t,s,n]);if(t.size===0)return null;let u=t.size>=2&&r;return e("div",{class:"rex-bulk-bar"},e("div",{class:"rex-bulk-count"},e("span",{class:"rex-bulk-count-num"},String(t.size)),e("span",null,` item${t.size!==1?"s":""} selected`)),i?e("div",{class:"rex-bulk-result"},i):e("div",{class:"rex-bulk-actions"},e("span",{class:"rex-bulk-label"},"Set status:"),Vv.map(d=>e("button",{key:d.value,class:`rex-bulk-action-btn prd-status-${d.value}`,onClick:()=>c(d.value),disabled:a,title:d.label},e("span",{class:"rex-bulk-action-icon"},d.icon),e("span",{class:"rex-bulk-action-label"},d.label))),u?e("button",{class:"rex-bulk-action-btn rex-bulk-merge-btn",onClick:r,disabled:a,title:"Merge selected items into one"},e("span",{class:"rex-bulk-action-icon"},"\u2A06"),e("span",{class:"rex-bulk-action-label"},"Merge")):null),e("button",{class:"rex-bulk-clear",onClick:n,title:"Clear selection"},"\xD7"))}var Bv={completed:"\u25CF",in_progress:"\u25D0",pending:"\u25CB",deferred:"\u25CC",blocked:"\u2298",deleted:"\u2715"},zv={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"};function Eu({selectedItems:t,onMergeComplete:n,onCancel:s}){let[r,a]=k(t[0]?.id??""),[o,i]=k(""),[l,c]=k(null),[u,d]=k(!1),[p,m]=k(!1),[f,v]=k(null),[b,g]=k(null),y=t.map(T=>T.id),h=_(async()=>{if(!(y.length<2||!r)){d(!0),v(null);try{let T={sourceIds:y,targetId:r,preview:!0};o.trim()&&(T.title=o.trim());let w=await fetch("/api/rex/items/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(T)});if(!w.ok){let I=await w.json().catch(()=>({error:"Preview failed"}));throw new Error(I.error||`HTTP ${w.status}`)}let C=await w.json();c(C.preview)}catch(T){v(String(T))}finally{d(!1)}}},[y.join(","),r,o]);F(()=>{h()},[h]);let x=_(async()=>{m(!0),v(null);try{let T={sourceIds:y,targetId:r};o.trim()&&(T.title=o.trim());let w=await fetch("/api/rex/items/merge",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(T)});if(!w.ok){let E=await w.json().catch(()=>({error:"Merge failed"}));throw new Error(E.error||`HTTP ${w.status}`)}let I=(await w.json()).absorbedIds?.length??0;g(`Merged ${I+1} items successfully`),setTimeout(()=>{n()},1200)}catch(T){v(String(T)),m(!1)}},[y.join(","),r,o,n]);if(t.length<2)return e("div",{class:"merge-preview-empty"},"Select at least 2 sibling items to merge.");let S=t.find(T=>T.id===r);return e("div",{class:"merge-preview"},e("div",{class:"merge-preview-header"},e("h3",null,"Merge Items"),e("button",{class:"merge-preview-close",onClick:s,title:"Cancel","aria-label":"Cancel merge"},"\xD7")),f?e("div",{class:"merge-preview-error",role:"alert"},f):null,b?e("div",{class:"merge-preview-success",role:"status"},b):null,b?null:e("div",{class:"merge-preview-section"},e("label",{class:"merge-preview-label"},"Keep (target item):"),e("select",{class:"merge-preview-select",value:r,onChange:T=>a(T.target.value),disabled:p},t.map(T=>e("option",{key:T.id,value:T.id},`${Bv[T.status]??"\u25CB"} ${T.title}`)))),b?null:e("div",{class:"merge-preview-section"},e("label",{class:"merge-preview-label"},"Title (optional override):"),e("input",{class:"merge-preview-input",type:"text",value:o,placeholder:S?.title??"Keep original title",onInput:T=>i(T.target.value),disabled:p})),u?e("div",{class:"merge-preview-loading"},"Loading preview..."):null,l&&!b?e("div",{class:"merge-preview-details"},e("div",{class:"merge-preview-target"},e("h4",null,"Result:"),e("div",{class:"merge-preview-card merge-preview-card-target"},e("div",{class:"merge-preview-card-title"},e("span",{class:"merge-preview-card-icon"},"\u2713"),e("strong",null,l.target.title)),l.target.acceptanceCriteria.length>0?e("div",{class:"merge-preview-field"},e("span",{class:"merge-preview-field-label"},"Acceptance Criteria:"),e("ul",{class:"merge-preview-criteria"},l.target.acceptanceCriteria.map((T,w)=>e("li",{key:w},T)))):null,l.target.tags.length>0?e("div",{class:"merge-preview-field"},e("span",{class:"merge-preview-field-label"},"Tags: "),e("span",{class:"merge-preview-tags"},l.target.tags.map(T=>e("span",{key:T,class:"prd-tag"},T)))):null,l.target.childCount>0?e("div",{class:"merge-preview-field"},e("span",{class:"merge-preview-field-label"},`${l.target.childCount} child item${l.target.childCount!==1?"s":""}`)):null)),e("div",{class:"merge-preview-absorbed"},e("h4",null,`Absorbed (${l.absorbed.length} item${l.absorbed.length!==1?"s":""} removed):`),l.absorbed.map(T=>e("div",{key:T.id,class:"merge-preview-card merge-preview-card-absorbed"},e("div",{class:"merge-preview-card-title"},e("span",{class:"merge-preview-card-icon absorbed"},"\u2715"),e("span",null,T.title),e("span",{class:`prd-level-badge prd-level-${T.level}`},zv[T.level]??T.level)),T.childCount>0?e("div",{class:"merge-preview-field"},e("span",{class:"merge-preview-field-label"},`${T.childCount} child${T.childCount!==1?"ren":""} will be reparented`)):null))),l.rewrittenDependencyCount>0?e("div",{class:"merge-preview-deps"},e("span",{class:"merge-preview-deps-label"},`${l.rewrittenDependencyCount} dependency reference${l.rewrittenDependencyCount!==1?"s":""} will be rewritten`)):null):null,b?null:e("div",{class:"merge-preview-actions"},e("button",{class:"merge-preview-btn merge-preview-btn-cancel",onClick:s,disabled:p},"Cancel"),e("button",{class:"merge-preview-btn merge-preview-btn-merge",onClick:x,disabled:p||u||!l},p?"Merging...":"Merge Items")))}var Hv={completed:"\u25CF",in_progress:"\u25D0",pending:"\u25CB",deferred:"\u25CC",blocked:"\u2298",deleted:"\u2715"},jv={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"};function mr(t,n){return n.has(t.id)?!0:t.children?t.children.some(s=>mr(s,n)):!1}function Zv(t){let n=new Set;function s(r){for(let a of r)n.add(a.id),a.children&&s(a.children)}return s(t),n}function Uv(t,n){let s=new Set;function r(a){let o=!1;for(let i of a)if(n.has(i.id)){if(s.add(i.id),o=!0,i.children)for(let l of i.children)s.add(l.id)}else i.children&&i.children.some(l=>mr(l,n))&&(s.add(i.id),o=!0,r(i.children));return o}return r(t),s}function Gv({impact:t}){let n=t.after.pct-t.before.pct,s=n>0?`+${n}%`:n<0?`${n}%`:"0%";return e("span",{class:"prune-diff-epic-impact"},e("span",{class:"prune-diff-impact-before"},`${t.before.completed}/${t.before.total}`),e("span",{class:"prune-diff-impact-arrow"},"\u2192"),e("span",{class:"prune-diff-impact-after"},`${t.after.completed}/${t.after.total}`),e("span",{class:`prune-diff-impact-pct${n>=0?" prune-diff-impact-positive":" prune-diff-impact-negative"}`},s),e("span",{class:"prune-diff-impact-removed"},`-${t.removedCount} item${t.removedCount!==1?"s":""}`))}function Wv({item:t,depth:n,isExpanded:s,hasChildren:r,isPrunable:a,isAffectedParent:o,epicImpact:i,onToggle:l}){let c=n*24,u=t.children??[],d=r?Xn(u):null,p=d?Us(d):0,m=["prune-diff-node-row",r?"prune-diff-node-expandable":"",a?"prune-diff-node-prunable":"",o?"prune-diff-node-affected":"",`prd-level-${t.level}`].filter(Boolean).join(" "),f=v=>{if(v.target.classList.contains("prune-diff-chevron")){r&&l();return}r&&l()};return e("div",{class:m,style:`padding-left: ${c+8}px`,onClick:f,role:"treeitem","aria-expanded":r?String(s):void 0},e("span",{class:`prune-diff-chevron${r&&s?" prune-diff-chevron-open":""}`,"aria-hidden":"true"},r?"\u25B6":""),a?e("span",{class:"prune-diff-indicator prune-diff-indicator-remove",title:"Will be removed"},"\u2212"):o?e("span",{class:"prune-diff-indicator prune-diff-indicator-modified",title:"Children affected"},"\u2022"):e("span",{class:"prune-diff-indicator"}),e("span",{class:`prune-diff-status prd-status-${t.status}${a?" prune-diff-status-prunable":""}`},Hv[t.status]??"\u25CF"),e("span",{class:`prd-level-badge prd-level-${t.level}`},jv[t.level]),e("span",{class:`prune-diff-title${a?" prune-diff-title-prunable":""}`},t.title),d&&d.total>0?e("span",{class:"prune-diff-progress"},`${d.completed}/${d.total}`,e("span",{class:"prune-diff-pct"},` ${Math.round(p*100)}%`)):null,i?e(Gv,{impact:i}):null)}function Iu({items:t,depth:n,expanded:s,prunableIds:r,epicImpactMap:a,onToggle:o}){return e(Q,null,t.map(i=>{let l=i.children??[],c=l.length>0,u=s.has(i.id),d=r.has(i.id),p=!d&&mr(i,r);return e("div",{key:i.id,class:"prune-diff-node"},e(Wv,{item:i,depth:n,isExpanded:u,hasChildren:c,isPrunable:d,isAffectedParent:p,epicImpact:a.get(i.id),onToggle:()=>o(i.id)}),c&&u?e("div",{class:"prune-diff-children",role:"group"},e(Iu,{items:l,depth:n+1,expanded:s,prunableIds:r,epicImpactMap:a,onToggle:o})):null)}))}function _u({prunableIds:t,epicImpact:n,onLoad:s}){let[r,a]=k(null),[o,i]=k(!0),[l,c]=k(null),[u,d]=k(new Set),[p,m]=k("affected");F(()=>{let E=!1;return(async()=>{try{let D=await fetch("/data/prd.json");if(!D.ok){c("Could not load PRD tree");return}let M=await D.json();if(!E){a(M);let R=Uv(M.items,t);d(R),s?.()}}catch{E||c("Could not load PRD tree")}finally{E||i(!1)}})(),()=>{E=!0}},[t,s]);let f=B(()=>{let E=new Map;for(let D of n)E.set(D.id,D);return E},[n]),v=B(()=>{if(!r||p==="all")return r?.items??[];function E(D){let M=[];for(let R of D)mr(R,t)&&M.push({...R,children:R.children?E(R.children):void 0});return M}return E(r.items)},[r,p,t]),b=B(()=>r?Zv(r.items):new Set,[r]),g=_(E=>{d(D=>{let M=new Set(D);return M.has(E)?M.delete(E):M.add(E),M})},[]),y=_(()=>d(new Set(b)),[b]),h=_(()=>d(new Set),[]);if(o)return e("div",{class:"prune-diff-loading"},e("div",{class:"rex-analyze-spinner"}),e("span",null,"Loading tree diff..."));if(l)return e("div",{class:"prune-diff-error"},l);if(!r||v.length===0)return e("div",{class:"prune-diff-empty"},"No affected items to display.");let x=n.reduce((E,D)=>E+D.before.total,0),S=n.reduce((E,D)=>E+D.before.completed,0),T=n.reduce((E,D)=>E+D.after.total,0),w=n.reduce((E,D)=>E+D.after.completed,0),C=x>0?Math.round(S/x*100):0,I=T>0?Math.round(w/T*100):0;return e("div",{class:"prune-diff-container"},e("div",{class:"prune-diff-header"},e("h4",null,"Tree Diff"),e("div",{class:"prune-diff-controls"},e("button",{class:`prune-diff-filter-btn${p==="affected"?" active":""}`,onClick:()=>m("affected"),title:"Show only affected branches"},"Affected"),e("button",{class:`prune-diff-filter-btn${p==="all"?" active":""}`,onClick:()=>m("all"),title:"Show full tree"},"Full Tree"),e("span",{class:"prune-diff-separator"}),e("button",{class:"prune-diff-toolbar-btn",onClick:y,title:"Expand all"},"Expand"),e("button",{class:"prune-diff-toolbar-btn",onClick:h,title:"Collapse all"},"Collapse"))),e("div",{class:"prune-diff-legend"},e("span",{class:"prune-diff-legend-item prune-diff-legend-remove"},e("span",{class:"prune-diff-indicator prune-diff-indicator-remove"},"\u2212"),"Will be removed"),e("span",{class:"prune-diff-legend-item prune-diff-legend-affected"},e("span",{class:"prune-diff-indicator prune-diff-indicator-modified"},"\u2022"),"Children affected")),n.length>0?e("div",{class:"prune-diff-overall-impact"},e("span",{class:"prune-diff-overall-label"},"Overall Completion:"),e("span",{class:"prune-diff-impact-before"},`${C}%`),e("span",{class:"prune-diff-impact-arrow"},"\u2192"),e("span",{class:`prune-diff-impact-after${I!==C?" prune-diff-impact-changed":""}`},`${I}%`),I!==C?e("span",{class:"prune-diff-impact-delta"},`(${I>C?"+":""}${I-C}pp)`):null):null,e("div",{class:"prune-diff-tree",role:"tree","aria-label":"Prune diff tree"},e(Iu,{items:v,depth:0,expanded:u,prunableIds:t,epicImpactMap:f,onToggle:g})))}function qv(t){return t.split("/").pop()||t}var Kv={epic:"\u25A0",feature:"\u25C6",task:"\u25CF",subtask:"\u25CB"},Yv=[{value:0,label:"Any age"},{value:1,label:"1+ day old"},{value:7,label:"7+ days old"},{value:14,label:"14+ days old"},{value:30,label:"30+ days old"},{value:90,label:"90+ days old"}],Xv=[{value:"completed",label:"Completed"},{value:"deferred",label:"Deferred"},{value:"deleted",label:"Deleted"}];function Jv(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Qv(t){if(!t)return"unknown";let n=Math.floor((Date.now()-new Date(t).getTime())/(1e3*60*60*24));return n===0?"today":n===1?"1 day ago":`${n} days ago`}function Du({onPruneComplete:t,onCancel:n}){let[s,r]=k("criteria"),[a,o]=k(null),[i,l]=k(null),[c,u]=k(!1),[d,p]=k(!1),[m,f]=k(null),[v,b]=k(!0),[g,y]=k(0),[h,x]=k(["completed"]),[S,T]=k("diff"),w=_(()=>({minAgeDays:g,statuses:h}),[g,h]),C=_(async R=>{let P=R??w();u(!0),f(null);try{let A=new URLSearchParams;P.minAgeDays>0&&A.set("minAge",String(P.minAgeDays)),P.statuses.length>0&&A.set("statuses",P.statuses.join(","));let j=A.toString(),U=await fetch(`/api/rex/prune/preview${j?`?${j}`:""}`);if(!U.ok){let V=await U.json().catch(()=>({error:"Preview failed"}));throw new Error(V.error||`HTTP ${U.status}`)}let se=await U.json();o(se),r("preview")}catch(A){f(String(A))}finally{u(!1)}},[w]),I=_(R=>{x(P=>P.includes(R)?P.length===1?P:P.filter(A=>A!==R):[...P,R])},[]),E=_(async()=>{if(a){p(!0),f(null);try{let R=await fetch("/api/rex/prune",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({backup:v,confirmCount:a.totalItemCount,criteria:a.criteria})});if(!R.ok){let A=await R.json().catch(()=>({error:"Prune failed"}));throw new Error(A.error||`HTTP ${R.status}`)}let P=await R.json();l(P),r("result"),setTimeout(()=>{t()},2e3)}catch(R){f(String(R)),p(!1)}}},[a,v,t]),D=(()=>{switch(s){case"criteria":return"Prune Completed Items";case"preview":return"Dry-Run Preview";case"confirm":return"Confirm Prune";case"result":return"Prune Complete"}})(),M=()=>e("div",{class:"prune-confirmation-header"},e("h3",null,D),e("button",{class:"prune-confirmation-close",onClick:n,title:"Cancel","aria-label":"Cancel prune",disabled:d},"\xD7"));return c?e("div",{class:"prune-confirmation"},M(),e("div",{class:"prune-confirmation-loading"},e("div",{class:"rex-analyze-spinner"}),e("span",null,"Scanning for eligible items..."))):m&&!a&&s!=="criteria"?e("div",{class:"prune-confirmation"},M(),e("div",{class:"prune-confirmation-error",role:"alert"},m),e("div",{class:"prune-confirmation-actions"},e("button",{class:"prune-confirmation-btn prune-confirmation-btn-cancel",onClick:()=>{f(null),r("criteria")}},"Back to Criteria"))):s==="result"&&i?e("div",{class:"prune-confirmation"},M(),e("div",{class:"prune-confirmation-success",role:"status"},`Pruned ${i.prunedCount} item${i.prunedCount!==1?"s":""} successfully.`),e("div",{class:"prune-confirmation-result-details"},e("div",{class:"prune-confirmation-field"},e("span",{class:"prune-confirmation-field-label"},"Archived to: "),e("code",null,i.archivedTo)),i.backupPath?e("div",{class:"prune-confirmation-field"},e("span",{class:"prune-confirmation-field-label"},"Backup saved: "),e("code",null,qv(i.backupPath))):null)):s==="criteria"?e("div",{class:"prune-confirmation"},M(),e("p",{class:"prune-criteria-desc"},"Configure which completed items are eligible for pruning. Only fully completed subtrees (where all children are also complete) will be included."),e("div",{class:"prune-criteria-section"},e("label",{class:"prune-criteria-label"},"Eligible statuses"),e("div",{class:"prune-criteria-chips"},Xv.map(({value:R,label:P})=>e("button",{key:R,class:`prune-criteria-chip${h.includes(R)?" active":""}`,onClick:()=>I(R),"aria-pressed":String(h.includes(R))},P)))),e("div",{class:"prune-criteria-section"},e("label",{class:"prune-criteria-label"},"Minimum completion age"),e("select",{class:"prune-criteria-select",value:String(g),onChange:R=>y(Number(R.target.value))},Yv.map(({value:R,label:P})=>e("option",{key:R,value:String(R)},P))),e("span",{class:"prune-criteria-hint"},g===0?"All completed items are eligible regardless of when they were completed.":`Only items completed ${g}+ days ago will be included.`)),m?e("div",{class:"prune-confirmation-error",role:"alert"},m):null,e("div",{class:"prune-confirmation-actions"},e("button",{class:"prune-confirmation-btn prune-confirmation-btn-cancel",onClick:n},"Cancel"),e("button",{class:"prune-confirmation-btn prune-confirmation-btn-next",onClick:()=>C(),disabled:h.length===0},"Dry Run"))):s==="preview"&&a&&!a.hasPrunableItems?e("div",{class:"prune-confirmation"},M(),e("div",{class:"prune-criteria-active"},e("span",{class:"prune-criteria-active-label"},"Criteria:"),e("span",{class:"prune-criteria-active-value"},`${a.criteria.statuses.join(", ")}`),a.criteria.minAgeDays>0?e("span",{class:"prune-criteria-active-value"},`${a.criteria.minAgeDays}+ days old`):null),e("div",{class:"prune-confirmation-empty"},e("p",null,"Nothing to prune with current criteria."),e("p",{class:"prune-confirmation-hint"},"Only fully completed subtrees (all children also completed) are eligible. Try adjusting the criteria.")),e("div",{class:"prune-confirmation-actions"},e("button",{class:"prune-confirmation-btn prune-confirmation-btn-cancel",onClick:()=>{r("criteria"),o(null)}},"Adjust Criteria"),e("button",{class:"prune-confirmation-btn prune-confirmation-btn-cancel",onClick:n},"Close"))):e("div",{class:"prune-confirmation"},M(),a?e("div",{class:"prune-criteria-active"},e("span",{class:"prune-criteria-active-label"},"Criteria:"),e("span",{class:"prune-criteria-active-value"},a.criteria.statuses.join(", ")),a.criteria.minAgeDays>0?e("span",{class:"prune-criteria-active-value"},`${a.criteria.minAgeDays}+ days`):null,s==="preview"?e("button",{class:"prune-criteria-edit-btn",onClick:()=>{r("criteria"),o(null)},title:"Edit pruning criteria"},"Edit"):null):null,m?e("div",{class:"prune-confirmation-error",role:"alert"},m):null,s==="confirm"?e("div",{class:"prune-confirmation-warning",role:"alert"},e("div",{class:"prune-confirmation-warning-icon"},"\u26A0"),e("div",null,e("strong",null,"This action is irreversible."),e("p",null,"Pruned items will be removed from the PRD and archived. They cannot be restored from the UI."))):null,s==="preview"?e("div",{class:"prune-dryrun-badge"},e("span",{class:"prune-dryrun-icon"},"\u25B6"),"Dry-run preview \u2014 no changes have been made"):null,a?e("div",{class:"prune-confirmation-summary"},e("div",{class:"prune-confirmation-summary-stat"},e("span",{class:"prune-confirmation-summary-num"},String(a.totalItemCount)),e("span",null,` item${a.totalItemCount!==1?"s":""} will be removed`)),e("div",{class:"prune-confirmation-summary-stat"},e("span",{class:"prune-confirmation-summary-num"},String(a.items.length)),e("span",null,` subtree${a.items.length!==1?"s":""}`)),e("div",{class:"prune-storage-stat"},e("span",{class:"prune-storage-savings"},Jv(a.estimatedBytes)),e("span",null," estimated savings"),a.totalPrdBytes>0?e("span",{class:"prune-storage-pct"},` (${Math.round(a.estimatedBytes/a.totalPrdBytes*100)}% of PRD)`):null),Object.keys(a.levelBreakdown).length>0?e("div",{class:"prune-confirmation-breakdown"},Object.entries(a.levelBreakdown).map(([R,P])=>e("span",{key:R,class:`prune-confirmation-level-chip prd-level-${R}`},`${P} ${P!==1?zl(R).toLowerCase():Se(R).toLowerCase()}`))):null):null,s==="preview"&&a?e("div",{class:"prune-confirmation-items"},e("div",{class:"prune-diff-view-toggle"},e("button",{class:`prune-diff-view-tab${S==="diff"?" active":""}`,onClick:()=>T("diff")},"\u{1F333} Tree Diff"),e("button",{class:`prune-diff-view-tab${S==="list"?" active":""}`,onClick:()=>T("list")},"\u{1F4CB} Item List")),S==="diff"&&a.prunableIds&&a.epicImpact?e(_u,{prunableIds:new Set(a.prunableIds),epicImpact:a.epicImpact}):null,S==="list"?e("div",null,e("h4",null,"Items to be pruned:"),e("div",{class:"prune-confirmation-item-list"},a.items.map(R=>e("div",{key:R.id,class:"prune-confirmation-item"},e("span",{class:`prune-confirmation-item-icon prd-level-${R.level}`},Kv[R.level]??"\u2022"),e("span",{class:"prune-confirmation-item-title"},R.title),e("span",{class:`prd-level-badge prd-level-${R.level}`},Se(R.level)),R.totalCount>1?e("span",{class:"prune-confirmation-item-count"},`${R.totalCount} items`):null,R.completedAt?e("span",{class:"prune-confirmation-item-age"},Qv(R.completedAt)):null)))):null):null,s==="confirm"?e("div",{class:"prune-confirmation-option"},e("label",{class:"prune-confirmation-option-label"},e("input",{type:"checkbox",checked:v,onChange:R=>b(R.target.checked),disabled:d,class:"prune-confirmation-checkbox"}),e("span",null,"Create backup before pruning")),e("span",{class:"prune-confirmation-option-hint"},"Saves a copy of the current PRD to .rex/")):null,e("div",{class:"prune-confirmation-actions"},e("button",{class:"prune-confirmation-btn prune-confirmation-btn-cancel",onClick:s==="confirm"?()=>r("preview"):s==="preview"?()=>{r("criteria"),o(null)}:n,disabled:d},s==="confirm"?"Back":s==="preview"?"Adjust Criteria":"Cancel"),s==="preview"?e("button",{class:"prune-confirmation-btn prune-confirmation-btn-next",onClick:()=>r("confirm")},"Review & Confirm"):e("button",{class:"prune-confirmation-btn prune-confirmation-btn-prune",onClick:E,disabled:d},d?"Pruning...":`Prune ${a?.totalItemCount??0} Items`)))}var eb={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"};function Pu({item:t,onConfirm:n,onCancel:s}){let[r,a]=k(!1),o=H(null),i=H(null),l=eb[t.level]||t.level,c=ka(t);F(()=>{i.current?.focus()},[]),F(()=>{let p=m=>{m.key==="Escape"&&!r&&s()};return document.addEventListener("keydown",p),()=>document.removeEventListener("keydown",p)},[s,r]);let u=_(p=>{r||o.current&&!o.current.contains(p.target)&&s()},[s,r]),d=_(async()=>{a(!0);try{await n(t.id)}catch{a(!1)}},[n,t.id]);return e("div",{class:"delete-modal-backdrop",onClick:u,role:"dialog","aria-modal":"true","aria-labelledby":"delete-modal-title"},e("div",{ref:o,class:"delete-modal"},e("div",{class:"delete-modal-header"},e("span",{class:"delete-modal-icon"},"\u26A0"),e("span",{id:"delete-modal-title",class:"delete-modal-title"},`Delete ${l}`)),e("div",{class:"delete-modal-body"},e("div",{class:"delete-modal-item"},e("span",{class:`prd-level-badge prd-level-${t.level}`},l),e("span",{class:"delete-modal-item-title"},t.title)),c>0?e("div",{class:"delete-modal-warning"},e("span",{class:"delete-modal-warning-icon"},"\u26A0"),e("span",null,`This will also permanently delete ${c} child item${c!==1?"s":""}.`)):null,e("p",{class:"delete-modal-message"},"This action cannot be undone.")),e("div",{class:"delete-modal-actions"},e("button",{ref:i,class:"delete-modal-cancel-btn",onClick:s,disabled:r},"Cancel"),e("button",{class:"delete-modal-confirm-btn",onClick:d,disabled:r},r?"Deleting\u2026":`Delete ${l}`))))}function No({prdData:t,onSelectItem:n,onDetailContent:s,initialTaskId:r,navigateTo:a}){let{toast:o,toastType:i,showToast:l}=kc(),{data:c,setData:u,loading:d,error:p,setError:m,taskUsageById:f,weeklyBudget:v,fetchPRDData:b,fetchTaskUsage:g}=Xl(t),y=wn("rex.showTokenBudget",!1);Ql({setData:u,fetchPRDData:b,fetchTaskUsage:g});let h=Yl({data:c,setData:u,fetchPRDData:b,fetchTaskUsage:g,showToast:l,onSelectItem:n,onDetailContent:s,taskUsageById:f,weeklyBudget:v,showTokenBudget:y,navigateTo:a}),{activeStatuses:x,setActiveStatuses:S}=Nl(),[T,w]=k(""),C=H(null),{activeTags:I,activeSearchStatuses:E,searchFacets:D,setActiveTags:M,setActiveSearchStatuses:R,clearFacets:P,hasFacets:A}=Cl(),j=B(()=>c?uu(c.items):[],[c]);F(()=>{if(I.size===0)return;let N=new Set(j),$=new Set;for(let z of I)N.has(z)&&$.add(z);$.size!==I.size&&M($)},[j,I,M]);let U=B(()=>c?cu(c.items,T,D):null,[c,T,D]);F(()=>{let N=$=>{if(($.ctrlKey||$.metaKey)&&$.key==="f"){if(!c)return;$.preventDefault(),C.current?.focus()}};return document.addEventListener("keydown",N),()=>document.removeEventListener("keydown",N)},[c]);let se=_(N=>{N.key==="Escape"&&(w(""),P(),N.target.blur())},[P]),{deepLinkError:V,setDeepLinkError:q,highlightedTaskId:G,deepLinkExpandIds:K}=Jl({initialTaskId:r,loading:d,data:c,onSelectItem:h.handleSelectItem});return F(()=>{h.syncDetailContent()},[h.syncDetailContent]),F(()=>{if(h.bulkSelectedIds.size===0)return;let N=$=>{let z=$.target;z.closest(".prd-tree")||z.closest(".rex-bulk-bar")||z.closest(".merge-preview")||h.clearBulkSelection()};return document.addEventListener("click",N,!0),()=>document.removeEventListener("click",N,!0)},[h.bulkSelectedIds.size,h.clearBulkSelection]),d?e("div",{class:"loading"},"Loading PRD..."):p?e("div",{class:"prd-empty"},e("p",null,p)):c?e(Q,null,e("div",{class:"view-header"},e(te,{product:"rex",title:"Rex",class:"branded-header-rex"}),e("h2",{class:"section-header"},"Tasks")),V?e("div",{class:"prd-deep-link-error",role:"alert"},e("span",null,V),e("button",{class:"prd-deep-link-error-dismiss",onClick:()=>q(null),"aria-label":"Dismiss"},"\xD7")):null,e("div",{class:"rex-command-bar"},e("button",{class:`rex-command-btn${h.activeTab==="add"?" active":""}`,onClick:()=>{h.setActiveTab(h.activeTab==="add"?null:"add"),h.setAddParentId(null)},title:"Add a new item to the PRD"},"+ Add Item"),e("button",{class:`rex-command-btn${h.activeTab==="prune"?" active":""}`,onClick:()=>{h.setActiveTab(h.activeTab==="prune"?null:"prune")},title:"Remove completed subtrees from the PRD"},"\u2702 Prune")),h.activeTab==="add"?e(Tu,{allItems:c.items,onSubmit:h.handleAddItem,onCancel:()=>{h.setActiveTab(null),h.setAddParentId(null)},defaultParentId:h.addParentId}):null,h.activeTab==="merge"&&h.selectedItems.length>=2?e(Eu,{selectedItems:h.selectedItems,onMergeComplete:h.handleMergeComplete,onCancel:()=>h.setActiveTab(null)}):null,h.activeTab==="prune"?e(Du,{onPruneComplete:h.handlePruneComplete,onCancel:()=>h.setActiveTab(null)}):null,e("div",{class:"prd-filter-bar"},e("div",{class:"prd-search-row"},e("input",{ref:C,class:"prd-search-input",type:"search",placeholder:"Search tasks\u2026 (Ctrl+F)",value:T,"aria-label":"Search PRD tree",onInput:N=>w(N.target.value),onKeyDown:se}),(T||A)&&U?e("span",{class:"prd-search-count","aria-live":"polite"},`${U.matchCount} match${U.matchCount!==1?"es":""}`):null,T||A?e("button",{class:"prd-search-clear",onClick:()=>{w(""),P(),C.current?.focus()},"aria-label":"Clear search and facets",title:"Clear search and facets"},"\xD7"):null),e(Lo,{availableTags:j,activeTags:I,activeStatuses:E,onTagsChange:M,onStatusesChange:R,onClearAll:P}),e(Ta,{activeStatuses:x,onChange:S})),e($o,{document:c,taskUsageById:f,weeklyBudget:v,showTokenBudget:y,defaultExpandDepth:2,onSelectItem:h.handleSelectItem,selectedItemId:h.selectedItemId,bulkSelectedIds:h.bulkSelectedIds,onBulkSelect:h.handleBulkSelect,onInlineAddSubmit:h.handleInlineAddItem,highlightedItemId:G,deepLinkExpandIds:K,onRemoveItem:h.handleRemoveItemFromTree,onUpdateItem:h.handleItemUpdate,deletingItemId:h.deletingItemId,activeStatuses:x,searchQuery:T||void 0,searchVisibleIds:U?.visibleIds,searchMatchIds:U?.matchIds}),e(Ru,{selectedIds:h.bulkSelectedIds,onClearSelection:()=>{h.clearBulkSelection(),h.setActiveTab(null)},onActionComplete:b,onMerge:h.handleOpenMerge}),o?e("div",{class:`rex-toast${i==="error"?" rex-toast-error":""}`,role:i==="error"?"alert":"status","aria-live":i==="error"?"assertive":"polite"},o):null,h.deleteTarget?e(Pu,{item:h.deleteTarget,onConfirm:h.handleConfirmDelete,onCancel:()=>h.setDeleteTarget(null)}):null):e("div",{class:"prd-empty"},e("p",null,"No PRD data available."))}var Mu={pending:"\u25CB",running:"\u25D0",completed:"\u25CF",skipped:"\u25CC",failed:"\u2715"},tb={pending:"Pending",running:"Running",completed:"Completed",skipped:"Skipped",failed:"Failed"};function $u({onPrdChanged:t}){let[n,s]=k(null),[r,a]=k(!1),[o,i]=k(!1),[l,c]=k(null),u=H(null),[d,p]=k(()=>Ne("autoRefresh"));F(()=>Fe(T=>{p(T.disabledFeatures.has("autoRefresh"))}),[]);let m=H(Sn(async()=>{let S=await fetch("/api/rex/execute/status");if(S.ok){let T=await S.json();s(T),c(null)}})),f=_(async()=>{try{await m.current.execute()}catch{}},[]);F(()=>{f();let T=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`,w;try{w=new WebSocket(T),u.current=w,w.onmessage=C=>{try{let I=JSON.parse(C.data);I.type==="rex:execution-progress"&&I.state&&(s(I.state),t&&t(),f())}catch{}},w.onclose=()=>{u.current=null}}catch{}return()=>{if(u.current){try{u.current.close()}catch{}u.current=null}}},[f,t]),F(()=>{let S=m.current;return()=>S.dispose()},[]),Me("execution-panel",f,3e3,!d);let v=_(async()=>{i(!0),c(null);try{let S=await fetch("/api/rex/execute/epic-by-epic",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),T=await S.json();S.ok?await f():c(T.error||"Failed to start execution")}catch(S){c(String(S))}finally{i(!1)}},[f]),b=_(async()=>{a(!0);try{let S=await fetch("/api/rex/execute/pause",{method:"POST"}),T=await S.json();S.ok?await f():c(T.error||"Failed to pause")}catch(S){c(String(S))}finally{a(!1)}},[f]),g=_(async()=>{a(!0);try{let S=await fetch("/api/rex/execute/resume",{method:"POST"}),T=await S.json();S.ok?await f():c(T.error||"Failed to resume")}catch(S){c(String(S))}finally{a(!1)}},[f]),y=!n||n.status==="idle",h=n&&(n.status==="running"||n.status==="paused"),x=n&&(n.status==="completed"||n.status==="failed");return e("div",{class:"exec-panel"},e("div",{class:"exec-panel-header"},e("h3",{class:"exec-panel-title"},"Epic-by-Epic Execution"),h?e("span",{class:`status-badge status-badge--${n.status}`},n.status==="running"?"Running":"Paused"):x?e("span",{class:`status-badge status-badge--${n.status}`},n.status==="completed"?"Complete":"Failed"):null),l?e("div",{class:"exec-panel-error",role:"alert"},l):null,y?e("div",{class:"exec-panel-idle"},e("p",{class:"exec-panel-desc"},"Execute all epics sequentially. Each epic's tasks will be processed by the hench agent before moving to the next."),e("button",{class:"exec-panel-start-btn",onClick:v,disabled:o,"aria-label":"Start epic-by-epic execution"},o?"Starting\u2026":"Start Epic-by-Epic Execution")):null,h?e("div",{class:"exec-panel-active"},e("div",{class:"exec-panel-progress"},e("div",{class:"exec-panel-progress-header"},e("span",{class:"exec-panel-progress-label"},`Epic ${Math.min(n.currentEpicIndex+1,n.totalEpics)} of ${n.totalEpics}`),e("span",{class:"exec-panel-progress-pct"},`${n.percentComplete}%`)),e("div",{class:"exec-panel-progress-bar",role:"progressbar","aria-valuenow":String(n.percentComplete),"aria-valuemin":"0","aria-valuemax":"100","aria-label":`Execution progress: ${n.percentComplete}%`},e("div",{class:"exec-panel-progress-fill",style:`width: ${n.percentComplete}%`})),e("span",{class:"exec-panel-progress-detail"},`${n.completedTasks}/${n.totalTasks} tasks completed`)),e("div",{class:"exec-panel-controls"},n.status==="running"?e("button",{class:"exec-panel-pause-btn",onClick:b,disabled:r,"aria-label":"Pause execution"},r?"Pausing\u2026":"\u23F8 Pause"):e("button",{class:"exec-panel-resume-btn",onClick:g,disabled:r,"aria-label":"Resume execution"},r?"Resuming\u2026":"\u25B6 Resume")),e("div",{class:"exec-panel-epic-list"},...n.epics.map(S=>e("div",{key:S.id,class:["exec-panel-epic",S.status==="running"?"exec-panel-epic-running":"",S.status==="completed"?"exec-panel-epic-done":"",S.status==="skipped"?"exec-panel-epic-skipped":"",S.status==="failed"?"exec-panel-epic-failed":""].filter(Boolean).join(" ")},e("div",{class:"exec-panel-epic-row"},e("span",{class:`exec-panel-epic-icon exec-panel-epic-icon-${S.status}`,"aria-label":tb[S.status]??S.status},Mu[S.status]??"\u25CB"),e("span",{class:"exec-panel-epic-title",title:S.title},S.title),e("span",{class:"exec-panel-epic-count"},`${S.tasksCompleted}/${S.tasksTotal}`)),S.tasksTotal>0?e("div",{class:"exec-panel-epic-bar"},e("div",{class:`exec-panel-epic-fill${S.status==="completed"?" done":S.tasksCompleted>0?" mid":""}`,style:`width: ${S.tasksTotal>0?Math.round(S.tasksCompleted/S.tasksTotal*100):0}%`})):null)))):null,x?e("div",{class:"exec-panel-done"},e("div",{class:"exec-panel-summary"},n.status==="completed"?e("span",{class:"exec-panel-summary-icon exec-panel-summary-success"},"\u2713"):e("span",{class:"exec-panel-summary-icon exec-panel-summary-fail"},"\u2715"),e("span",null,n.status==="completed"?`Completed: ${n.completedEpics}/${n.totalEpics} epics processed, ${n.completedTasks}/${n.totalTasks} tasks done`:`Failed: ${n.error||"Unknown error"}`)),n.epics.length>0?e("div",{class:"exec-panel-epic-list"},...n.epics.map(S=>e("div",{key:S.id,class:["exec-panel-epic",S.status==="completed"?"exec-panel-epic-done":"",S.status==="skipped"?"exec-panel-epic-skipped":"",S.status==="failed"?"exec-panel-epic-failed":""].filter(Boolean).join(" ")},e("div",{class:"exec-panel-epic-row"},e("span",{class:`exec-panel-epic-icon exec-panel-epic-icon-${S.status}`},Mu[S.status]??"\u25CB"),e("span",{class:"exec-panel-epic-title",title:S.title},S.title),e("span",{class:"exec-panel-epic-count"},`${S.tasksCompleted}/${S.tasksTotal}`))))):null,e("button",{class:"exec-panel-start-btn exec-panel-restart-btn",onClick:v,disabled:o},o?"Starting\u2026":"Run Again")):null)}var nb={merge:"\u2295",move:"\u2192",split:"\u2442",delete:"\u2715",prune:"\u2702",collapse:"\u229F"},sb={merge:"\u2295",update:"\u270E",reparent:"\u2192",obsolete:"\u2715",split:"\u2442"},rb={low:"reorg-risk-low",medium:"reorg-risk-medium",high:"reorg-risk-high"};function Au({open:t,onClose:n,onApplied:s}){let[r,a]=k([]),[o,i]=k([]),[l,c]=k(!1),[u,d]=k(!1),[p,m]=k(new Set),[f,v]=k(new Set),[b,g]=k(null),[y,h]=k(null),x=_(async()=>{c(!0),g(null);try{let R=await fetch("/api/rex/reorganize?mode=fast");if(!R.ok){g(`Failed to fetch proposals (${R.status})`);return}let P=await R.json(),A=P.structural??P;a(A.proposals??[]),i(P.llm??[]),m(new Set),v(new Set)}catch{g("Could not fetch reorganization proposals.")}finally{c(!1)}},[]);F(()=>{t&&(x(),h(null))},[t,x]);let S=_(R=>{m(P=>{let A=new Set(P);return A.has(R)?A.delete(R):A.add(R),A})},[]),T=_(R=>{v(P=>{let A=new Set(P);return A.has(R)?A.delete(R):A.add(R),A})},[]),w=_(async()=>{if(!(p.size===0&&f.size===0)){d(!0),g(null);try{let R=await fetch("/api/rex/reorganize/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proposalIds:[...p],llmProposalIds:[...f]})});if(!R.ok){g(`Apply failed (${R.status})`);return}let P=await R.json();h(`Applied ${P.applied} proposal(s)${P.failed>0?`, ${P.failed} failed`:""}`),P.applied>0&&(s?.(),await x())}catch{g("Failed to apply proposals.")}finally{d(!1)}}},[p,f,s,x]),C=_(async()=>{let R=r.filter(P=>P.risk==="low").map(P=>P.id);if(R.length!==0){d(!0),g(null);try{let P=await fetch("/api/rex/reorganize/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proposalIds:R})});if(!P.ok){g(`Apply failed (${P.status})`);return}let A=await P.json();h(`Applied ${A.applied} low-risk proposal(s)`),A.applied>0&&(s?.(),await x())}catch{g("Failed to apply proposals.")}finally{d(!1)}}},[r,s,x]);if(!t)return null;let I=r.filter(R=>R.risk==="low").length,E=p.size+f.size,D=r.length>0,M=o.length>0;return e("div",{class:"reorg-overlay"},e("div",{class:"reorg-panel"},e("div",{class:"reorg-header"},e("h3",null,"Reorganize PRD"),e("button",{class:"reorg-close",onClick:n,"aria-label":"Close"},"\xD7")),e("div",{class:"reorg-body"},b?e("div",{class:"reorg-error"},b):null,y?e("div",{class:"reorg-success"},y):null,l?e("div",{class:"reorg-loading"},"Analyzing structure..."):!D&&!M?e("div",{class:"reorg-empty"},"No structural issues detected."):e("div",{class:"reorg-list"},D?e("div",null,e("div",{class:"reorg-section-header"},"Structural Proposals"),r.map(R=>e("label",{key:`s-${R.id}`,class:`reorg-card ${p.has(R.id)?"reorg-card-selected":""}`},e("input",{type:"checkbox",checked:p.has(R.id),onChange:()=>S(R.id),class:"reorg-checkbox"}),e("div",{class:"reorg-card-content"},e("div",{class:"reorg-card-top"},e("span",{class:"reorg-type-icon"},nb[R.type]??"?"),e("span",{class:"reorg-type-label"},R.type),e("span",{class:`reorg-risk ${rb[R.risk]??""}`},R.risk),e("span",{class:"reorg-confidence"},`${Math.round(R.confidence*100)}%`)),e("div",{class:"reorg-description"},R.description),R.items.length>0?e("div",{class:"reorg-affected"},`Affects: ${R.items.join(", ")}`):null)))):null,M?e("div",null,e("div",{class:"reorg-section-header"},"LLM Proposals"),o.map(R=>e("label",{key:`l-${R.id}`,class:`reorg-card ${f.has(R.id)?"reorg-card-selected":""} reorg-card-llm`},e("input",{type:"checkbox",checked:f.has(R.id),onChange:()=>T(R.id),class:"reorg-checkbox"}),e("div",{class:"reorg-card-content"},e("div",{class:"reorg-card-top"},e("span",{class:"reorg-type-icon"},sb[R.action]??"?"),e("span",{class:"reorg-type-label"},R.action),e("span",{class:"reorg-source-badge"},"LLM")),e("div",{class:"reorg-description"},R.reason))))):null)),D||M?e("div",{class:"reorg-footer"},I>0?e("button",{class:"reorg-btn reorg-btn-secondary",onClick:C,disabled:u},`Apply All Low-Risk (${I})`):null,e("button",{class:"reorg-btn reorg-btn-primary",onClick:w,disabled:u||E===0},u?"Applying...":`Apply Selected (${E})`)):null))}var ab={completed:"\u25CF",in_progress:"\u25D0",pending:"\u25CB",deferred:"\u25CC",blocked:"\u2298"},Lu={completed:"Completed",in_progress:"In Progress",pending:"Pending",deferred:"Deferred",blocked:"Blocked"};function ob({stats:t,percentComplete:n}){if(t.total===0)return null;let s=[{key:"completed",count:t.completed,cls:"prd-status-bg-completed"},{key:"in_progress",count:t.inProgress,cls:"prd-status-bg-in_progress"},{key:"pending",count:t.pending,cls:"prd-status-bg-pending"},{key:"blocked",count:t.blocked,cls:"prd-status-bg-blocked"},{key:"deferred",count:t.deferred,cls:"prd-status-bg-deferred"}].filter(r=>r.count>0);return e("div",{class:"rex-dash-progress"},e("div",{class:"rex-dash-progress-header"},e("span",{class:"rex-dash-progress-label"},"Overall Progress"),e("span",{class:"rex-dash-progress-pct"},`${n}%`)),e("div",{class:"rex-dash-progress-bar",role:"progressbar","aria-valuenow":String(n),"aria-valuemin":"0","aria-valuemax":"100","aria-label":`Overall completion: ${n}%`},...s.map(r=>e("div",{key:r.key,class:`rex-dash-progress-seg ${r.cls}`,style:`width: ${r.count/t.total*100}%`,title:`${Lu[r.key]??r.key}: ${r.count}`}))),e("div",{class:"rex-dash-progress-legend"},...s.map(r=>e("span",{key:r.key,class:"rex-dash-legend-item"},e("span",{class:`prd-status-dot prd-status-${r.key.replace("_","-")}`}),e("span",{class:"rex-dash-legend-label"},Lu[r.key]??r.key),e("span",{class:"rex-dash-legend-count"},String(r.count))))))}function Pn({value:t,label:n,color:s,accent:r}){return e("div",{class:`rex-dash-stat${r?" rex-dash-stat-accent":""}`},e("span",{class:"rex-dash-stat-value",style:s?`color: ${s}`:""},String(t)),e("span",{class:"rex-dash-stat-label"},n))}function ib({taskId:t,onStarted:n}){let[s,r]=k(!1),[a,o]=k(null),i=_(async l=>{l.stopPropagation(),r(!0),o(null);try{let c=await fetch(`/api/rex/items/${t}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:"in_progress"})});if(!c.ok){let u=await c.json().catch(()=>({error:`HTTP ${c.status}`}));throw new Error(u.error||`Failed (${c.status})`)}n()}catch(c){o(c instanceof Error?c.message:"Failed to start task"),setTimeout(()=>o(null),4e3)}finally{r(!1)}},[t,n]);return e("div",{class:"rex-dash-start-wrapper"},e("button",{class:"rex-dash-start-btn",onClick:i,disabled:s,"aria-label":"Start this task"},s?"Starting\u2026":"Start Task"),a?e("div",{class:"rex-dash-start-error",role:"alert"},a):null)}function lb({epic:t,navigateTo:n}){let{stats:s}=t,r=t.percentComplete>=100,a=t.status==="in_progress",o=r?"done":t.percentComplete>=50?"mid":"";return e("div",{class:["rex-dash-epic",r?"rex-dash-epic-done":"",a?"rex-dash-epic-active":""].filter(Boolean).join(" ")},e("div",{class:"rex-dash-epic-top"},e("div",{class:"rex-dash-epic-info"},e(Ae,{task:{id:t.id,title:t.title,status:t.status,level:"epic",priority:t.priority},navigateTo:n,compact:!0,showStatus:!0,class:"rex-dash-epic-link"}),s.inProgress>0?e("span",{class:"status-badge status-badge--in_progress"},`${s.inProgress} active`):null,s.blocked>0?e("span",{class:"status-badge status-badge--blocked"},`${s.blocked} blocked`):null),e("span",{class:`rex-dash-epic-pct${r?" done":""}`},`${t.percentComplete}%`)),e("div",{class:"rex-dash-epic-bar"},e("div",{class:"rex-dash-epic-track"},s.total>0?e("div",{class:`rex-dash-epic-fill${o?` ${o}`:""}`,style:`width: ${t.percentComplete}%`}):null),e("span",{class:"rex-dash-epic-count"},`${s.completed}/${s.total}`)))}function Oo({navigateTo:t}){let[n,s]=k(null),[r,a]=k(!0),[o,i]=k(null),[l,c]=k(null),[u,d]=k(!1),[p,m]=k(0),f=_(async()=>{try{let E=await fetch("/api/rex/dashboard");if(!E.ok){E.status===404?i("No PRD data found. Run 'rex init' then 'rex analyze' to create one."):i(`Failed to load dashboard data (${E.status})`);return}let D=await E.json();s(D),i(null)}catch{i("Could not fetch dashboard data. Is the server running?")}},[]),v=_(async()=>{try{let E=await fetch("/api/rex/health");E.ok&&c(await E.json())}catch{}},[]),b=_(async()=>{try{let E=await fetch("/api/rex/reorganize?mode=fast");if(E.ok){let D=await E.json();m(D.proposals?.length??0)}}catch{}},[]);if(F(()=>{Promise.all([f(),v()]).then(()=>a(!1)),b()},[f,v,b]),Me("rex-dashboard",f,1e4),r)return e("div",{class:"loading"},"Loading PRD dashboard...");if(o)return e("div",{class:"prd-empty"},e("p",null,o));if(!n)return e("div",{class:"prd-empty"},e("p",null,"No PRD data available."));let{stats:g,percentComplete:y,epics:h,nextTask:x,priorities:S}=n,T=B(()=>[...h].sort((E,D)=>{let M={in_progress:0,pending:1,blocked:2,deferred:3,completed:4},R=M[E.status]??1,P=M[D.status]??1;return R!==P?R-P:D.percentComplete-E.percentComplete}),[h]),w=B(()=>[{label:"Critical",count:S.critical,color:"var(--red)",cls:"critical"},{label:"High",count:S.high,color:"var(--orange)",cls:"high"},{label:"Medium",count:S.medium,color:"var(--text-dim)",cls:"medium"},{label:"Low",count:S.low,color:"var(--text-dim)",cls:"low"}].filter(E=>E.count>0),[S]),C=w.reduce((E,D)=>E+D.count,0)+S.unset,I=h.filter(E=>E.status==="in_progress").length;return e("div",{class:"rex-dash"},e("div",{class:"rex-dash-header"},e(te,{product:"rex",title:"Rex",class:"branded-header-rex"}),e("div",{class:"rex-dash-title-row"},e("h2",{class:"rex-dash-title"},n.title),e("div",{class:"rex-dash-header-actions"},t?e("button",{class:"rex-dash-view-tasks-btn",onClick:()=>t("prd"),"aria-label":"View all tasks in PRD tree"},"View All Tasks \u2192"):null))),e("div",{class:"rex-dash-stats"},e(Pn,{value:g.total,label:"Total"}),e(Pn,{value:g.completed,label:"Done",color:"var(--green)",accent:!0}),e(Pn,{value:g.inProgress,label:"Active",color:"var(--accent)"}),e(Pn,{value:g.pending,label:"Pending"}),g.blocked>0?e(Pn,{value:g.blocked,label:"Blocked",color:"var(--red)"}):null,g.deferred>0?e(Pn,{value:g.deferred,label:"Deferred",color:"var(--orange)"}):null),e(ob,{stats:g,percentComplete:y}),e("div",{class:"rex-dash-grid"},e("div",{class:"rex-dash-main"},e("div",{class:"rex-dash-next"},e("div",{class:"rex-dash-section-header"},e("h3",null,"Up Next"),I>0?e("span",{class:"rex-dash-section-meta"},`${I} epic${I!==1?"s":""} in progress`):null),x?e("div",{class:`rex-dash-next-card${x.priority==="critical"?" rex-dash-next-critical":x.priority==="high"?" rex-dash-next-high":""}`},e("div",{class:"rex-dash-next-top"},e("div",{class:"rex-dash-next-badges"},e("span",{class:`prd-status-icon prd-status-${x.status.replace("_","-")}`},ab[x.status]??"\u25CB"),e("span",{class:`prd-level-badge prd-level-${x.level}`},x.level.charAt(0).toUpperCase()+x.level.slice(1)),x.priority?e("span",{class:`prd-priority-badge prd-priority-${x.priority}`},x.priority):null),x.status==="pending"?e(ib,{taskId:x.id,onStarted:f}):x.status==="in_progress"?e("span",{class:"status-badge status-badge--in_progress"},"In Progress"):null),e(Ae,{task:{id:x.id,title:x.title,status:x.status,level:x.level,priority:x.priority},navigateTo:t,showStatus:!1,class:"rex-dash-next-link"}),x.description?e("div",{class:"rex-dash-next-desc"},x.description.length>160?x.description.slice(0,160)+"\u2026":x.description):null,x.tags&&x.tags.length>0?e("div",{class:"rex-dash-next-tags"},x.tags.map(E=>e("span",{key:E,class:"prd-tag"},E))):null):e("div",{class:"rex-dash-next-empty"},e("span",{class:"rex-dash-next-empty-icon"},"\u2713"),e("span",null,"All tasks completed or blocked"))),e("div",{class:"rex-dash-smart-add"},e("div",{class:"rex-dash-section-header"},e("h3",null,"Quick Add")),e(Fo,{onPrdChanged:f,compact:!0})),e("div",{class:"rex-dash-epics"},e("div",{class:"rex-dash-section-header"},e("h3",null,"Epic Progress"),e("span",{class:"rex-dash-section-meta"},`${h.length} epic${h.length!==1?"s":""}`)),T.length>0?e("div",{class:"rex-dash-epic-list"},T.map(E=>e(lb,{key:E.id,epic:E,navigateTo:t}))):e("div",{class:"rex-dash-empty-hint"},"No epics defined yet.")),h.length>0?e($u,{onPrdChanged:f}):null),e("div",{class:"rex-dash-sidebar"},w.length>0?e("div",{class:"rex-dash-panel"},e("h3",{class:"rex-dash-panel-title"},"Priority Distribution"),e("div",{class:"rex-dash-priority-bars"},w.map(E=>e("div",{key:E.label,class:"rex-dash-priority-row"},e("span",{class:`rex-dash-priority-label rex-dash-priority-${E.cls}`},E.label),e("div",{class:"rex-dash-priority-track"},e("div",{class:`rex-dash-priority-fill rex-dash-priority-fill-${E.cls}`,style:`width: ${C>0?E.count/C*100:0}%`})),e("span",{class:"rex-dash-priority-count"},String(E.count)))))):null,l?e("div",{class:"rex-dash-panel"},e("h3",{class:"rex-dash-panel-title"},"Structure Health"),e("div",{class:"rex-dash-health"},e("div",{class:"rex-dash-health-gauge"},e(_n,{value:l.overall/100,label:"Overall",size:80})),e("div",{class:"rex-dash-health-dims"},...["depth","balance","granularity","completeness","staleness"].map(E=>e("div",{key:E,class:"rex-dash-health-dim"},e("span",{class:"rex-dash-health-dim-label"},E.charAt(0).toUpperCase()+E.slice(1)),e("div",{class:"rex-dash-health-dim-track"},e("div",{class:`rex-dash-health-dim-fill${l.dimensions[E]>=70?" good":l.dimensions[E]>=40?" mid":" low"}`,style:`width: ${l.dimensions[E]}%`})),e("span",{class:"rex-dash-health-dim-val"},String(Math.round(l.dimensions[E])))))),l.suggestions.length>0?e("ul",{class:"rex-dash-health-suggestions"},l.suggestions.slice(0,3).map((E,D)=>e("li",{key:D},E))):null)):null,e("div",{class:"rex-dash-panel"},e("h3",{class:"rex-dash-panel-title"},"Status Breakdown"),e("div",{class:"rex-dash-status-grid"},e("div",{class:"rex-dash-status-item"},e("span",{class:"prd-status-dot prd-status-completed"}),e("span",{class:"rex-dash-status-label"},"Completed"),e("span",{class:"rex-dash-status-count"},String(g.completed))),e("div",{class:"rex-dash-status-item"},e("span",{class:"prd-status-dot prd-status-in-progress"}),e("span",{class:"rex-dash-status-label"},"In Progress"),e("span",{class:"rex-dash-status-count"},String(g.inProgress))),e("div",{class:"rex-dash-status-item"},e("span",{class:"prd-status-dot prd-status-pending"}),e("span",{class:"rex-dash-status-label"},"Pending"),e("span",{class:"rex-dash-status-count"},String(g.pending))),g.blocked>0?e("div",{class:"rex-dash-status-item"},e("span",{class:"prd-status-dot prd-status-blocked"}),e("span",{class:"rex-dash-status-label"},"Blocked"),e("span",{class:"rex-dash-status-count"},String(g.blocked))):null,g.deferred>0?e("div",{class:"rex-dash-status-item"},e("span",{class:"prd-status-dot prd-status-deferred"}),e("span",{class:"rex-dash-status-label"},"Deferred"),e("span",{class:"rex-dash-status-count"},String(g.deferred))):null)),t?e("div",{class:"rex-dash-panel rex-dash-panel-actions"},e("h3",{class:"rex-dash-panel-title"},"Quick Actions"),e("div",{class:"rex-dash-actions"},e("button",{class:"rex-dash-action-btn",onClick:()=>t("prd")},"Browse Tasks"),e("button",{class:"rex-dash-action-btn",onClick:()=>t("validation")},"Validate PRD"),e("button",{class:`rex-dash-action-btn${p>0?" rex-dash-action-btn-accent":""}`,onClick:()=>d(!0)},p>0?`Reorganize (${p})`:"Reorganize"))):null)),e(Au,{open:u,onClose:()=>d(!1),onApplied:()=>{f(),v(),b()}}))}var Fu="token-usage";function Be(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function $e(t){return t.toLocaleString()}function ub(t,n){let s=t?new Date(t).toLocaleDateString():"start",r=n?new Date(n).toLocaleDateString():"now";return`${s} \u2192 ${r}`}var ht={hench:"var(--brand-teal)",rex:"var(--brand-purple)",sv:"var(--brand-orange)"},cs={hench:"Hench",rex:"Rex",sv:"Sourcevision"};function Nu({label:t,dim:n}){let s=Math.min(n.percent,100),r=n.severity==="exceeded"?"budget-bar-exceeded":n.severity==="warning"?"budget-bar-warning":"budget-bar-ok";return e("div",{class:"budget-indicator"},e("div",{class:"budget-header"},e("span",{class:"budget-label"},t),e("span",{class:`budget-pct budget-${n.severity}`},`${n.percent.toFixed(0)}%`)),e("div",{class:"budget-track"},e("div",{class:`budget-fill ${r}`,style:`width: ${s}%`}),n.severity!=="ok"?e("div",{class:"budget-threshold",style:"left: 80%"}):null),e("div",{class:"budget-detail"},t==="Tokens"?`${$e(n.used)} / ${$e(n.budget)}`:`$${n.used.toFixed(2)} / $${n.budget.toFixed(2)}`))}function db({buckets:t}){if(t.length===0)return e("div",{class:"token-empty"},"No data for the selected period");let n=Math.max(...t.map(c=>c.usage.totalInputTokens+c.usage.totalOutputTokens),1),s=Math.max(20,Math.min(60,600/t.length)),r=Math.max(600,t.length*(s+8)+80),a=220,o=20,l=a-o-40;return e("div",{class:"period-chart-container"},e("svg",{viewBox:`0 0 ${r} ${a}`,class:"period-chart",preserveAspectRatio:"xMinYMin meet"},[0,.25,.5,.75,1].map(c=>{let u=o+l*(1-c),d=Be(n*c);return e(Q,{key:`y-${c}`},e("line",{x1:55,x2:r,y1:u,y2:u,stroke:"var(--border)","stroke-dasharray":"3,3",opacity:.5}),e("text",{x:50,y:u+4,"text-anchor":"end",class:"chart-axis-label"},d))}),t.map((c,u)=>{let d=60+u*(s+8),p=c.usage.totalInputTokens+c.usage.totalOutputTokens,m=c.usage.packages.hench.inputTokens+c.usage.packages.hench.outputTokens,f=c.usage.packages.rex.inputTokens+c.usage.packages.rex.outputTokens,v=c.usage.packages.sv.inputTokens+c.usage.packages.sv.outputTokens,b=m/n*l,g=f/n*l,y=v/n*l,h=o+l,x=c.period.length>7?c.period.slice(5):c.period;return e("g",{key:c.period},b>0?e("rect",{x:d,y:h-b,width:s,height:b,rx:2,fill:ht.hench,opacity:.85},e("title",null,`Hench: ${Be(m)} tokens`)):null,g>0?e("rect",{x:d,y:h-b-g,width:s,height:g,rx:2,fill:ht.rex,opacity:.85},e("title",null,`Rex: ${Be(f)} tokens`)):null,y>0?e("rect",{x:d,y:h-b-g-y,width:s,height:y,rx:2,fill:ht.sv,opacity:.85},e("title",null,`SV: ${Be(v)} tokens`)):null,e("text",{x:d+s/2,y:h+16,"text-anchor":"middle",class:"chart-axis-label",transform:t.length>14?`rotate(-45, ${d+s/2}, ${h+16})`:void 0},x),e("title",null,`${c.period}: ${Be(p)} tokens (${c.estimatedCost.total})`))})),e("div",{class:"chart-legend"},["hench","rex","sv"].map(c=>e("span",{key:c,class:"legend-item"},e("span",{class:"legend-dot",style:`background: ${ht[c]}`}),cs[c]))))}function pb({usage:t}){let n=t.totalInputTokens+t.totalOutputTokens;if(n===0)return e("div",{class:"token-empty"},"No token usage recorded");let s=[{key:"hench",total:t.packages.hench.inputTokens+t.packages.hench.outputTokens},{key:"rex",total:t.packages.rex.inputTokens+t.packages.rex.outputTokens},{key:"sv",total:t.packages.sv.inputTokens+t.packages.sv.outputTokens}].filter(d=>d.total>0),r=160,a=r/2,o=r/2,i=60,l=20,c=-Math.PI/2,u=s.map(d=>{let p=d.total/n,m=c+p*2*Math.PI,f=p>.5?1:0,v=a+i*Math.cos(c),b=o+i*Math.sin(c),g=a+i*Math.cos(m-.001),y=o+i*Math.sin(m-.001),h=`M ${v} ${b} A ${i} ${i} 0 ${f} 1 ${g} ${y}`;return c=m,{...d,d:h,fraction:p}});return e("div",{class:"pkg-breakdown"},e("svg",{viewBox:`0 0 ${r} ${r}`,width:r,height:r,class:"donut-chart"},u.map(d=>e("path",{key:d.key,d:d.d,fill:"none",stroke:ht[d.key],"stroke-width":l,"stroke-linecap":"round"},e("title",null,`${cs[d.key]}: ${Be(d.total)} (${(d.fraction*100).toFixed(0)}%)`))),e("text",{x:a,y:o-6,"text-anchor":"middle","dominant-baseline":"central",class:"donut-total"},Be(n)),e("text",{x:a,y:o+12,"text-anchor":"middle",class:"donut-label"},"tokens")),e("div",{class:"pkg-details"},s.map(d=>e("div",{key:d.key,class:"pkg-row"},e("span",{class:"legend-dot",style:`background: ${ht[d.key]}`}),e("span",{class:"pkg-name"},cs[d.key]),e("span",{class:"pkg-tokens"},Be(d.total)),e("span",{class:"pkg-pct"},`${(d.total/n*100).toFixed(0)}%`)))))}function Vo(){let[t,n]=k(!0),[s,r]=k(null),[a,o]=k("day"),[i,l]=k(""),[c,u]=k(""),[d,p]=k("all"),[m,f]=k(null),[v,b]=k([]),[g,y]=k([]),[h,x]=k(null),S=B(()=>{let D=new URLSearchParams;return i&&D.set("since",new Date(i).toISOString()),c&&D.set("until",new Date(c).toISOString()),D.set("period",a),D},[i,c,a]),T=_(async()=>{n(!0),r(null);try{let D=await fetch(`/api/token/utilization?${S.toString()}`);if(!D.ok)throw new Error("Failed to fetch utilization data");let M=await D.json();f(M),b(M.commands??[]),x(M.budget??null),y((M.trend??[]).map(R=>{let P={packages:R.toolBreakdown,totalInputTokens:R.toolBreakdown.rex.inputTokens+R.toolBreakdown.hench.inputTokens+R.toolBreakdown.sv.inputTokens,totalOutputTokens:R.toolBreakdown.rex.outputTokens+R.toolBreakdown.hench.outputTokens+R.toolBreakdown.sv.outputTokens,totalCalls:R.toolBreakdown.rex.calls+R.toolBreakdown.hench.calls+R.toolBreakdown.sv.calls};return{period:R.period,usage:P,estimatedCost:R.estimatedCost}}))}catch(D){r(D instanceof Error?D.message:String(D))}finally{n(!1)}},[S]);F(()=>{T()},[T]),Me(Fu,T,1e4);let w=B(()=>d==="all"?v:v.filter(D=>D.package===d),[v,d]),C=B(()=>w.slice(0,10).map(D=>({label:`${cs[D.package]??D.package}: ${D.command}`,value:D.inputTokens+D.outputTokens,color:ht[D.package]??"var(--accent)"})),[w]);if(t&&!m)return e("div",{class:"loading"},"Loading token usage data...");if(s)return e("div",{class:"token-error"},e("h3",null,"Error loading token data"),e("p",null,s),e("button",{class:"btn",onClick:T},"Retry"));let I=m?.usage,E=m?.cost;return e("div",{class:"token-usage-container"},e("div",{class:"token-header"},e(te,{product:"rex",title:"Rex",class:"branded-header-rex"}),e("h2",null,"LLM Utilization"),e("div",{class:"token-controls"},e("label",{class:"filter-label"},"From:",e("input",{type:"date",class:"filter-input",value:i,onInput:D=>l(D.target.value)})),e("label",{class:"filter-label"},"To:",e("input",{type:"date",class:"filter-input",value:c,onInput:D=>u(D.target.value)})),e("label",{class:"filter-label"},"Package:",e("select",{class:"filter-input",value:d,onChange:D=>p(D.target.value)},e("option",{value:"all"},"All"),e("option",{value:"hench"},"Hench"),e("option",{value:"rex"},"Rex"),e("option",{value:"sv"},"Sourcevision"))),i||c?e("button",{class:"btn btn-small",onClick:()=>{l(""),u("")}},"Clear"):null)),m?e("div",{class:"token-section"},e("h3",null,"Usage Source & Window"),e("div",{class:"token-source-grid"},e("div",{class:"token-source-item"},e("span",{class:"cost-label"},"Configured"),e("code",{class:"cost-value"},`${m.configured.vendor}/${m.configured.model}`)),e("div",{class:"token-source-item"},e("span",{class:"cost-label"},"Window"),e("span",{class:"cost-value"},ub(m.window.since,m.window.until))),e("div",{class:"token-source-item"},e("span",{class:"cost-label"},"Rex source"),e("code",null,m.source.rex)),e("div",{class:"token-source-item"},e("span",{class:"cost-label"},"Hench source"),e("code",null,m.source.hench)),e("div",{class:"token-source-item"},e("span",{class:"cost-label"},"Sourcevision source"),e("code",null,m.source.sourcevision)))):null,h&&h.severity!=="ok"?e("div",{class:`budget-alert budget-alert-${h.severity}`},e("strong",null,h.severity==="exceeded"?"Budget Exceeded":"Budget Warning"),...h.warnings.map((D,M)=>e("p",{key:M},D))):null,I?e("div",{class:"overview-metrics token-metrics"},e(ke,{value:Be(I.totalInputTokens+I.totalOutputTokens),label:"Total Tokens"}),e(ke,{value:E?.total??"$0.00",label:"Est. Cost",color:"var(--brand-green)"}),e(ke,{value:I.totalCalls,label:"API Calls",color:"var(--brand-purple)"}),e(ke,{value:Be(I.totalInputTokens),label:"Input Tokens"}),e(ke,{value:Be(I.totalOutputTokens),label:"Output Tokens"})):null,h&&(h.tokens||h.cost)?e("div",{class:"token-section"},e("h3",null,"Budget Status"),e("div",{class:"budget-indicators"},h.tokens?e(Nu,{label:"Tokens",dim:h.tokens}):null,h.cost?e(Nu,{label:"Cost",dim:h.cost}):null)):null,m&&m.byVendorModel.length>0?e("div",{class:"token-section"},e("h3",null,"Totals By Vendor/Model"),e("div",{class:"token-table-wrapper"},e("table",{class:"token-table"},e("thead",null,e("tr",null,e("th",null,"Vendor"),e("th",null,"Model"),e("th",{class:"num"},"Input Tokens"),e("th",{class:"num"},"Output Tokens"),e("th",{class:"num"},"Total"),e("th",{class:"num"},"Calls"))),e("tbody",null,m.byVendorModel.map(D=>e("tr",{key:`${D.vendor}:${D.model}`},e("td",null,D.vendor),e("td",null,D.model),e("td",{class:"num"},$e(D.inputTokens)),e("td",{class:"num"},$e(D.outputTokens)),e("td",{class:"num"},$e(D.inputTokens+D.outputTokens)),e("td",{class:"num"},$e(D.calls)))))))):null,e("div",{class:"token-section"},e("div",{class:"section-header-row"},e("h3",null,"Usage Over Time"),e("div",{class:"period-toggle"},["day","week","month"].map(D=>e("button",{key:D,class:`toggle-btn ${a===D?"active":""}`,onClick:()=>o(D)},D.charAt(0).toUpperCase()+D.slice(1))))),e(db,{buckets:g})),e("div",{class:"overview-columns"},I?e("div",{class:"overview-col"},e("h3",null,"By Package"),e(pb,{usage:I})):null,C.length>0?e("div",{class:"overview-col"},e("h3",null,"By Command"),e(Ve,{data:C})):e("div",{class:"overview-col"},e("h3",null,"By Command"),e("div",{class:"token-empty"},"No command data available"))),w.length>0?e("div",{class:"token-section"},e("h3",null,"Command Details"),e("div",{class:"token-table-wrapper"},e("table",{class:"token-table"},e("thead",null,e("tr",null,e("th",null,"Package"),e("th",null,"Command"),e("th",{class:"num"},"Input Tokens"),e("th",{class:"num"},"Output Tokens"),e("th",{class:"num"},"Total"),e("th",{class:"num"},"Calls"))),e("tbody",null,w.map(D=>{let M=D.inputTokens+D.outputTokens;return e("tr",{key:`${D.package}:${D.command}`},e("td",null,e("span",{class:"pkg-badge",style:`background: ${ht[D.package]??"var(--accent)"}`},cs[D.package]??D.package)),e("td",null,D.command),e("td",{class:"num"},$e(D.inputTokens)),e("td",{class:"num"},$e(D.outputTokens)),e("td",{class:"num"},$e(M)),e("td",{class:"num"},$e(D.calls)))}))))):null,E&&I?e("div",{class:"token-section"},e("h3",null,"Cost Breakdown"),e("div",{class:"cost-breakdown"},e("div",{class:"cost-item"},e("span",{class:"cost-label"},"Input tokens"),e("span",{class:"cost-value"},`$${E.inputCost.toFixed(4)}`),e("span",{class:"cost-detail"},`${$e(I.totalInputTokens)} tokens @ $3/M`)),e("div",{class:"cost-item"},e("span",{class:"cost-label"},"Output tokens"),e("span",{class:"cost-value"},`$${E.outputCost.toFixed(4)}`),e("span",{class:"cost-detail"},`${$e(I.totalOutputTokens)} tokens @ $15/M`)),e("div",{class:"cost-item cost-total"},e("span",{class:"cost-label"},"Total estimated"),e("span",{class:"cost-value"},E.total)))):null,t?e("div",{class:"token-loading-overlay"},"Refreshing..."):null)}var Ou={completed:"\u25CF",in_progress:"\u25D0",pending:"\u25CB",blocked:"\u2298",deferred:"\u25CC"},fb={epic:"Epic",feature:"Feature",task:"Task",subtask:"Subtask"};function Bo(t,n){return t.length>n?t.slice(0,n-1)+"\u2026":t}function mb({report:t}){return e("div",{class:"val-summary"},e("div",{class:`val-summary-badge ${t.ok?"val-pass":"val-fail"}`},t.ok?"\u2713 All Checks Passed":"\u2717 Validation Failed"),e("div",{class:"val-summary-stats"},e("span",{class:"val-stat"},e("span",{class:"val-stat-num val-stat-passed"},String(t.summary.passed))," passed"),t.summary.failed>0?e("span",{class:"val-stat"},e("span",{class:"val-stat-num val-stat-failed"},String(t.summary.failed))," failed"):null,t.summary.warnings>0?e("span",{class:"val-stat"},e("span",{class:"val-stat-num val-stat-warnings"},String(t.summary.warnings))," warnings"):null))}function gb({check:t,onNavigate:n}){let[s,r]=k(!t.pass),a=!t.pass&&t.severity==="warn",o=t.pass?"\u2713":a?"\u26A0":"\u2717",i=t.pass?"val-check-pass":a?"val-check-warn":"val-check-fail";return e("div",{class:`val-check ${i}`},e("div",{class:"val-check-header",onClick:()=>t.errors.length>0&&r(!s),role:t.errors.length>0?"button":void 0,tabIndex:t.errors.length>0?0:void 0},e("span",{class:"val-check-icon"},o),e("span",{class:"val-check-name"},t.name),t.errors.length>0?e("span",{class:"val-check-count"},`${t.errors.length} issue${t.errors.length!==1?"s":""}`):null,t.errors.length>0?e("span",{class:"val-check-chevron"},s?"\u25BC":"\u25B6"):null),s&&t.errors.length>0?e("div",{class:"val-check-errors"},t.errors.map((l,c)=>e("div",{key:c,class:`val-error-item${l.itemId?" val-error-clickable":""}`,onClick:l.itemId?()=>n(l.itemId):void 0,role:l.itemId?"button":void 0,tabIndex:l.itemId?0:void 0},e("span",{class:"val-error-msg"},l.message),l.itemTitle?e("span",{class:"val-error-item-title"},l.itemTitle):null,l.itemId?e("span",{class:"val-error-item-id"},l.itemId.slice(0,8)):null))):null)}function hb(t,n,s){if(t.nodes.length===0)return{nodes:[],edges:[]};let r=new Set(t.cycleNodeIds),a=new Map,o=new Map;for(let h of t.edges)a.has(h.source)||a.set(h.source,[]),a.get(h.source).push(h.target),o.has(h.target)||o.set(h.target,[]),o.get(h.target).push(h.source);let i=new Map,l=[];for(let h of t.nodes)(!h.blockedBy||h.blockedBy.length===0)&&(i.set(h.id,0),l.push(h.id));for(let h of r)i.has(h)||(i.set(h,0),l.push(h));let c=0;for(;c<l.length;){let h=l[c++],x=i.get(h)??0,S=a.get(h)??[];for(let T of S){let w=i.get(T)??-1,C=x+1;C>w&&i.set(T,C),l.includes(T)||l.push(T)}}for(let h of t.nodes)i.has(h.id)||i.set(h.id,0);let u=new Map;for(let[h,x]of i)u.has(x)||u.set(x,[]),u.get(x).push(h);let d=Math.max(...Array.from(u.keys()),0),p=new Map(t.nodes.map(h=>[h.id,h])),m=60,f=n-m*2,v=s-m*2,b=d>0?v/d:0,g=new Map;for(let[h,x]of u){let S=x.length>1?f/(x.length-1):0,T=x.length>1?m:n/2;x.forEach((w,C)=>{let I=p.get(w);I&&g.set(w,{id:w,title:I.title,level:I.level,status:I.status,x:T+C*S,y:m+h*b,inCycle:r.has(w),blockedByCount:(o.get(w)??[]).length,blocksCount:(a.get(w)??[]).length})})}let y=[];for(let h of t.edges){let x=g.get(h.source),S=g.get(h.target);x&&S&&y.push({source:x,target:S,resolved:h.resolved})}return{nodes:Array.from(g.values()),edges:y}}function vb(){return e("defs",null,e("marker",{id:"dep-arrow",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse"},e("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"var(--text-dim)"})),e("marker",{id:"dep-arrow-resolved",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse"},e("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"var(--brand-teal)"})),e("marker",{id:"dep-arrow-cycle",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse"},e("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:"var(--brand-orange)"})))}function bb({edge:t,cycleSet:n}){let s=n.has(t.source.id)&&n.has(t.target.id),r=s?"dep-edge dep-edge-cycle":t.resolved?"dep-edge dep-edge-resolved":"dep-edge",a=s?"url(#dep-arrow-cycle)":t.resolved?"url(#dep-arrow-resolved)":"url(#dep-arrow)",o=t.target.x-t.source.x,i=t.target.y-t.source.y,l=t.source.x+o*.1,c=t.source.y+i*.5,u=t.target.x-o*.1,d=t.target.y-i*.5;return e("path",{class:r,d:`M ${t.source.x} ${t.source.y} C ${l} ${c}, ${u} ${d}, ${t.target.x} ${t.target.y}`,"marker-end":a})}function yb({node:t,selected:n,onSelect:s}){let r=t.blocksCount>2?24:t.blocksCount>0?20:16;return e("g",{class:`dep-node dep-node-${t.status}${t.inCycle?" dep-node-cycle":""}${n?" dep-node-selected":""}`,transform:`translate(${t.x}, ${t.y})`,onClick:()=>s(t.id),role:"button",tabIndex:0},e("circle",{r,class:"dep-node-circle"}),t.inCycle?e("circle",{r:r+4,class:"dep-node-cycle-ring",fill:"none"}):null,e("text",{class:"dep-node-label",dy:r+14,textAnchor:"middle"},Bo(t.title,20)),e("text",{class:"dep-node-status-icon",textAnchor:"middle",dy:"4"},Ou[t.status]||"\u25CB"))}function kb({data:t,onNavigate:n}){let s=H(null),[r,a]=k({width:800,height:500}),[o,i]=k(null);F(()=>{if(!s.current)return;let p=s.current.getBoundingClientRect();a({width:Math.max(p.width,400),height:Math.max(t.nodes.length*60,300)})},[t.nodes.length]);let l=B(()=>hb(t,r.width,r.height),[t,r.width,r.height]),c=B(()=>new Set(t.cycleNodeIds),[t.cycleNodeIds]),u=_(p=>{i(p===o?null:p)},[o]);if(t.nodes.length===0)return e("div",{class:"dep-empty"},e("div",{class:"dep-empty-icon"},"\u2713"),e("p",null,"No dependency relationships found."),e("p",{class:"dep-empty-hint"},"Add blockedBy relationships to tasks to see the dependency graph."));let d=o?t.nodes.find(p=>p.id===o):null;return e("div",{class:"dep-graph-container",ref:s},e("svg",{class:"dep-graph-svg",viewBox:`0 0 ${r.width} ${r.height}`,width:"100%",height:r.height,"aria-label":"Dependency graph"},e(vb,null),e("g",{class:"dep-edges"},l.edges.map((p,m)=>e(bb,{key:m,edge:p,cycleSet:c}))),e("g",{class:"dep-nodes"},l.nodes.map(p=>e(yb,{key:p.id,node:p,selected:p.id===o,onSelect:u})))),d?e("div",{class:"dep-node-detail"},e("div",{class:"dep-detail-header"},e("span",{class:`prd-level-badge prd-level-${d.level}`},fb[d.level]||d.level),e("span",{class:`prd-status-icon prd-status-${d.status}`},Ou[d.status]||"\u25CB"),e("span",{class:"dep-detail-title"},d.title)),e("div",{class:"dep-detail-id"},d.id.slice(0,8)),d.blockedBy.length>0?e("div",{class:"dep-detail-deps"},e("span",{class:"dep-detail-label"},"Blocked by: "),d.blockedBy.map(p=>{let m=t.nodes.find(f=>f.id===p);return e("span",{key:p,class:"dep-detail-dep-link",onClick:()=>n(p),role:"button",tabIndex:0},m?Bo(m.title,30):p.slice(0,8))})):null,e("button",{class:"dep-detail-nav-btn",onClick:()=>n(d.id)},"View in Tasks \u2192")):null,e("div",{class:"dep-legend"},e("div",{class:"dep-legend-item"},e("span",{class:"dep-legend-line dep-legend-resolved"}),"Resolved dependency"),e("div",{class:"dep-legend-item"},e("span",{class:"dep-legend-line dep-legend-unresolved"}),"Unresolved dependency"),t.cycleNodeIds.length>0?e("div",{class:"dep-legend-item"},e("span",{class:"dep-legend-line dep-legend-cycle"}),"Circular dependency"):null))}function wb({blockers:t,onNavigate:n}){return t.length===0?null:e("div",{class:"dep-blockers"},e("h3",{class:"dep-section-title"},"Critical Blockers"),e("p",{class:"dep-section-desc"},"Items blocking the most other items. Prioritize these for maximum unblocking."),e("div",{class:"dep-blocker-list"},t.map(s=>e("div",{key:s.id,class:"dep-blocker-item",onClick:()=>n(s.id),role:"button",tabIndex:0},e("span",{class:"dep-blocker-count"},String(s.blockingCount)),e("span",{class:"dep-blocker-title"},s.title),e("span",{class:"dep-blocker-id"},s.id.slice(0,8))))))}function xb({chains:t,nodes:n,onNavigate:s}){if(t.length===0)return null;let r=new Map(n.map(a=>[a.id,a]));return e("div",{class:"dep-chains"},e("h3",{class:"dep-section-title"},"Longest Blocking Chains"),e("p",{class:"dep-section-desc"},"These dependency chains create the longest wait paths. Consider parallelizing or breaking them."),e("div",{class:"dep-chain-list"},t.slice(0,5).map((a,o)=>e("div",{key:o,class:"dep-chain"},e("span",{class:"dep-chain-length"},`${a.path.length} steps`),e("div",{class:"dep-chain-path"},a.path.map((i,l)=>{let c=r.get(i);return e(Q,{key:i},l>0?e("span",{class:"dep-chain-arrow"},"\u2192"):null,e("span",{class:`dep-chain-node dep-chain-node-${c?.status??"pending"}`,onClick:()=>s(i),role:"button",tabIndex:0,title:c?.title??i},Bo(c?.title??i.slice(0,8),20)))}))))))}function zo({navigateTo:t}){let[n,s]=k(null),[r,a]=k(null),[o,i]=k(!1),[l,c]=k(!0),[u,d]=k(null),[p,m]=k("validation"),f=_(async()=>{c(!0);try{let g=await fetch("/api/rex/dependency-graph");if(!g.ok){g.status===404?a(null):console.error("Failed to fetch dependency graph");return}let y=await g.json();a(y)}catch{console.error("Failed to fetch dependency graph")}finally{c(!1)}},[]);F(()=>{f()},[f]);let v=_(async()=>{i(!0),d(null);try{let g=await fetch("/api/rex/validate");if(!g.ok){let h=await g.json().catch(()=>({error:"Validation failed"}));d(h.error||`HTTP ${g.status}`);return}let y=await g.json();s(y)}catch{d("Could not run validation. Is the server running?")}finally{i(!1)}},[]),b=_(g=>{t?t("prd",{taskId:g}):history.pushState({view:"prd",file:null,zone:null},"",`/prd/${g}`),window.dispatchEvent(new CustomEvent("prd-navigate",{detail:{itemId:g}}))},[t]);return e(Q,null,e("div",{class:"val-container"},e("div",{class:"val-header"},e(te,{product:"rex",title:"Rex",class:"branded-header-rex"}),e("h2",{class:"val-title"},"Validation & Dependencies"),e("div",{class:"val-tabs"},e("button",{class:`val-tab${p==="validation"?" active":""}`,onClick:()=>m("validation")},"\u2713 Validation"),e("button",{class:`val-tab${p==="dependencies"?" active":""}`,onClick:()=>m("dependencies")},"\u2B95 Dependencies"))),p==="validation"?e("div",{class:"val-panel"},e("div",{class:"val-actions"},e("button",{class:"val-run-btn",onClick:v,disabled:o},o?"Running\u2026":"Run Validation"),e("p",{class:"val-actions-hint"},"Check for orphaned items, circular dependencies, stuck tasks, and hierarchy issues.")),u?e("div",{class:"val-error"},u):null,n?e("div",{class:"val-results"},e(mb,{report:n}),e("div",{class:"val-checks"},n.checks.map((g,y)=>e(gb,{key:y,check:g,onNavigate:b})))):!o&&!u?e("div",{class:"val-placeholder"},e("p",null,'Click "Run Validation" to check your PRD for issues.')):null):null,p==="dependencies"?e("div",{class:"dep-panel"},l?e("div",{class:"loading"},"Loading dependency graph\u2026"):r?e(Q,null,e("div",{class:"dep-stats"},e("div",{class:"dep-stat"},e("span",{class:"dep-stat-num"},String(r.nodes.length)),e("span",{class:"dep-stat-label"},"nodes")),e("div",{class:"dep-stat"},e("span",{class:"dep-stat-num"},String(r.edges.length)),e("span",{class:"dep-stat-label"},"edges")),r.cycleNodeIds.length>0?e("div",{class:"dep-stat dep-stat-warn"},e("span",{class:"dep-stat-num"},String(r.cycleNodeIds.length)),e("span",{class:"dep-stat-label"},"in cycles")):null,e("button",{class:"dep-refresh-btn",onClick:f,title:"Refresh graph"},"\u21BB Refresh")),e(kb,{data:r,onNavigate:b}),e("div",{class:"dep-details-grid"},e(wb,{blockers:r.criticalBlockers,onNavigate:b}),e(xb,{chains:r.blockingChains,nodes:r.nodes,onNavigate:b}))):e("div",{class:"dep-empty"},e("div",{class:"dep-empty-icon"},"\u2713"),e("p",null,"No PRD data found."),e("p",{class:"dep-empty-hint"},"Run 'rex init' and 'rex analyze' to create a PRD."))):null))}function Vu(t){return t>=1073741824?`${(t/1073741824).toFixed(1)} GB`:t>=1048576?`${(t/1048576).toFixed(1)} MB`:t>=1024?`${(t/1024).toFixed(1)} KB`:`${t} B`}function Sb(t){if(t<0)return"0s";let n=Math.floor(t/1e3);if(n<60)return`${n}s`;let s=Math.floor(n/60),r=n%60;if(s<60)return`${s}m ${r}s`;let a=Math.floor(s/60),o=s%60;return`${a}h ${o}m`}function Cb(t){if(t<60)return`${t}s`;let n=Math.floor(t/60);if(n<60)return`${n}m`;let s=Math.floor(n/60),r=n%60;if(s<24)return`${s}h ${r}m`;let a=Math.floor(s/24),o=s%24;return`${a}d ${o}h`}function Tb(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function Rb(t){let n=Date.now()-new Date(t).getTime();if(n<0)return"just now";let s=Math.floor(n/1e3);if(s<5)return"just now";if(s<60)return`${s}s ago`;let r=Math.floor(s/60);return r<60?`${r}m ago`:`${Math.floor(r/60)}h ago`}function Eb(t){return Sb(Date.now()-new Date(t).getTime())}function Ib(t){switch(t){case"healthy":return"Healthy";case"warning":return"Delayed";case"unresponsive":return"Unresponsive";case"unknown":return"Unknown";default:return""}}function _b({info:t}){let n=t.memoryUsage.heapTotal>0?Math.round(t.memoryUsage.heapUsed/t.memoryUsage.heapTotal*100):0;return e("div",{class:"audit-system-panel"},e("h3",null,"Server Resources"),e("div",{class:"audit-system-grid"},e("div",{class:"audit-system-item"},e("span",{class:"audit-system-label"},"Server PID"),e("span",{class:"audit-system-value audit-mono"},String(t.serverPid))),e("div",{class:"audit-system-item"},e("span",{class:"audit-system-label"},"Uptime"),e("span",{class:"audit-system-value"},Cb(t.serverUptime))),e("div",{class:"audit-system-item"},e("span",{class:"audit-system-label"},"Heap Used"),e("span",{class:"audit-system-value"},Vu(t.memoryUsage.heapUsed),e("span",{class:"audit-system-pct"},` (${n}%)`))),e("div",{class:"audit-system-item"},e("span",{class:"audit-system-label"},"RSS"),e("span",{class:"audit-system-value"},Vu(t.memoryUsage.rss))),e("div",{class:"audit-system-item"},e("span",{class:"audit-system-label"},"Active Processes"),e("span",{class:"audit-system-value"},String(t.activeExecutions)))))}function Db({entry:t,navigateTo:n,onTerminate:s,onViewLogs:r,terminating:a,expanded:o,onToggle:i}){let l=t.heartbeatStatus==="unresponsive"?"audit-task-card audit-task-unresponsive":t.stale?"audit-task-card audit-task-stale":t.heartbeatStatus==="warning"?"audit-task-card audit-task-heartbeat-warning":"audit-task-card";return e("div",{class:l},e("div",{class:"audit-task-header"},e("div",{class:"audit-task-pulse-wrapper","aria-hidden":"true"},e("span",{class:`audit-task-pulse${t.stale?" audit-task-pulse-stale":""}`})),e("div",{class:"audit-task-info"},e("div",{class:"audit-task-title-row"},n&&t.taskId?e(Ae,{task:{id:t.taskId,title:t.taskTitle,status:"in_progress"},navigateTo:n,compact:!0,showStatus:!1,class:"audit-task-link"}):e("span",{class:"audit-task-title"},t.taskTitle),t.heartbeatStatus==="unresponsive"?e("span",{class:"audit-task-unresponsive-badge"},"Unresponsive"):t.stale?e("span",{class:"audit-task-stale-badge"},"Possibly stuck"):t.heartbeatStatus==="warning"?e("span",{class:"audit-task-warning-badge"},"Heartbeat delayed"):null),e("div",{class:"audit-task-meta"},t.pid?e("span",{class:"audit-chip audit-chip-pid",title:"Process ID"},e("span",{class:"audit-chip-icon"},"\u2699"),`PID ${t.pid}`):e("span",{class:"audit-chip audit-chip-nopid",title:"No PID (CLI-triggered run)"},e("span",{class:"audit-chip-icon"},"\u2699"),"No PID"),e("span",{class:"audit-chip",title:"Elapsed time"},e("span",{class:"audit-chip-icon"},"\u23F1"),e(Rn,{startedAt:t.startedAt,formatter:Eb})),e("span",{class:"audit-chip",title:"Run ID"},e("span",{class:"audit-chip-icon"},"\u25B6"),t.runId.length>16?t.runId.slice(0,16)+"\u2026":t.runId),e("span",{class:`audit-chip audit-chip-source audit-chip-source-${t.source}`},t.source==="dashboard"?"Dashboard":"CLI"),t.model?e("span",{class:`audit-chip audit-chip-model audit-chip-model-${t.model}`},t.model):null,t.turns!=null?e("span",{class:"audit-chip"},`${t.turns} turns`):null,t.tokenUsage?e("span",{class:"audit-chip"},Tb((t.tokenUsage.input??0)+(t.tokenUsage.output??0))," tokens"):null,t.heartbeatStatus&&t.heartbeatStatus!=="healthy"?e("span",{class:`audit-chip audit-chip-heartbeat audit-chip-heartbeat-${t.heartbeatStatus}`,title:t.missedHeartbeats?`${t.missedHeartbeats} missed heartbeat${t.missedHeartbeats===1?"":"s"}`:"Heartbeat status"},e("span",{class:"audit-chip-icon"},"\u2665"),Ib(t.heartbeatStatus)):null,t.lastActivityAt?e("span",{class:"audit-chip audit-chip-heartbeat-time",title:`Last heartbeat: ${new Date(t.lastActivityAt).toLocaleString()}`},e("span",{class:"audit-chip-icon"},"\u2665"),Rb(t.lastActivityAt)):null)),e("div",{class:"audit-task-actions"},e("button",{class:"audit-btn audit-btn-logs",onClick:c=>{c.stopPropagation(),i()},title:o?"Hide logs":"View logs","aria-expanded":String(o)},o?"Hide Logs":"View Logs"),e("button",{class:"audit-btn audit-btn-terminate",onClick:c=>{c.stopPropagation(),s(t.taskId)},disabled:a,title:"Terminate this task"},a?"Terminating\u2026":"Terminate"))),t.lastOutput?e("div",{class:"audit-task-last-output"},e("span",{class:"audit-last-output-label"},"Last output:"),e("code",null,t.lastOutput)):null)}function Pb({runId:t}){let[n,s]=k(null),[r,a]=k(!0),[o,i]=k(null),[l,c]=k(!0),u=H(null),d=_(async()=>{try{let m=await fetch(`/api/hench/runs/${t}`);if(!m.ok){i(`Failed to load run (${m.status})`);return}let f=await m.json();s(f),i(null)}catch{i("Failed to fetch run logs")}finally{a(!1)}},[t]);if(F(()=>{d();let m=setInterval(d,5e3);return()=>clearInterval(m)},[d]),F(()=>{l&&u.current&&u.current.scrollIntoView({behavior:"smooth"})},[n,l]),r)return e("div",{class:"audit-log-loading"},"Loading logs\u2026");if(o)return e("div",{class:"audit-log-error"},o);if(!n)return null;let p=n.toolCalls??[];return e("div",{class:"audit-log-viewer"},e("div",{class:"audit-log-header"},e("span",{class:"audit-log-count"},`${p.length} tool call${p.length===1?"":"s"}`),e("label",{class:"audit-log-autoscroll"},e("input",{type:"checkbox",checked:l,onChange:()=>c(!l)})," Auto-scroll")),e("div",{class:"audit-log-entries"},p.length===0?e("div",{class:"audit-log-empty"},"No tool calls recorded yet."):p.map((m,f)=>e("div",{key:f,class:"audit-log-entry"},e("div",{class:"audit-log-entry-header"},e("span",{class:"audit-log-turn"},`Turn ${m.turn}`),e("span",{class:"audit-log-tool"},m.tool),m.durationMs!=null?e("span",{class:"audit-log-duration"},`${m.durationMs}ms`):null),m.output?e("pre",{class:"audit-log-output"},typeof m.output=="string"?m.output.length>500?m.output.slice(0,500)+"\u2026":m.output:JSON.stringify(m.output,null,2).slice(0,500)):null)),e("div",{ref:u})),n.error?e("div",{class:"audit-log-error-box"},e("strong",null,"Error: "),n.error):null,n.summary?e("div",{class:"audit-log-summary"},e("strong",null,"Summary: "),e("pre",null,n.summary)):null)}function Ho({navigateTo:t}={}){let[n,s]=k(null),[r,a]=k(!0),[o,i]=k(null),[l,c]=k(new Set),[u,d]=k(new Set),[p,m]=k(null),f=H(null),v=_(async()=>{try{let x=await fetch("/api/hench/audit");if(!x.ok){i(`Failed to load audit data (${x.status})`);return}let S=await x.json();s(S),i(null)}catch{i("Could not fetch audit data. Is the server running?")}finally{a(!1)}},[]);F(()=>{v();let x=setInterval(v,3e3),T=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}`;try{let w=new WebSocket(T);f.current=w,w.onmessage=C=>{try{let I=JSON.parse(C.data);if(I.type==="hench:task-execution-progress")v();else if(I.type==="hench:heartbeat-alert"){let E=I.heartbeatStatus,D=I.taskTitle||"Unknown task",M=I.missedHeartbeats||0;E==="unresponsive"?m(`Task "${D}" is unresponsive (${M} missed heartbeats)`):E==="warning"&&m(`Task "${D}" heartbeat delayed (${M} missed)`),v()}}catch{}},w.onclose=()=>{f.current=null}}catch{}return()=>{if(clearInterval(x),f.current){try{f.current.close()}catch{}f.current=null}}},[v]);let b=_(async x=>{c(S=>new Set(S).add(x));try{let S=await fetch(`/api/hench/execute/${x}/terminate`,{method:"POST"});if(S.ok){let T=await S.json();m(`Task terminated${T.pid?` (PID ${T.pid})`:""}`),v()}else{let T=await S.json().catch(()=>({error:"Unknown error"}));m(`Failed: ${T.error}`)}}catch{m("Failed to terminate task")}finally{c(S=>{let T=new Set(S);return T.delete(x),T})}},[v]),g=_(x=>{d(S=>{let T=new Set(S);return T.has(x)?T.delete(x):T.add(x),T})},[]);if(F(()=>{if(!p)return;let x=setTimeout(()=>m(null),3e3);return()=>clearTimeout(x)},[p]),r)return e("div",{class:"loading"},"Loading audit data\u2026");if(o)return e("div",{class:"audit-container"},e(te,{product:"hench",title:"Hench",class:"branded-header-hench"}),e("h2",null,"Task Audit"),e("div",{class:"audit-error"},e("p",null,o),e("button",{class:"btn",onClick:v},"Retry")));let y=n?.entries??[],h=n?.systemInfo;return e("div",{class:"audit-container"},e("div",{class:"audit-header"},e(te,{product:"hench",title:"Hench",class:"branded-header-hench"}),e("div",{class:"audit-title-row"},e("h2",null,"Task Audit"),y.length>0?e("span",{class:"audit-count-badge"},String(y.length)):null,n?.timestamp?e("span",{class:"audit-timestamp"},"Updated ",new Date(n.timestamp).toLocaleTimeString()):null)),h?e(_b,{info:h}):null,e("div",{class:"audit-section"},e("h3",null,"Active Tasks"),y.length===0?e("div",{class:"audit-empty"},e("div",{class:"audit-empty-icon"},"\u2713"),e("p",null,"No active tasks."),e("p",{class:"audit-empty-hint"},"Tasks will appear here when running via ",e("code",null,"ndx work")," or the dashboard.")):e("div",{class:"audit-tasks-list"},y.map(x=>{let S=u.has(x.runId);return e("div",{key:x.runId,class:"audit-task-wrapper"},e(Db,{entry:x,navigateTo:t,onTerminate:b,onViewLogs:T=>g(T),terminating:l.has(x.taskId),expanded:S,onToggle:()=>g(x.runId)}),S?e(Pb,{runId:x.runId}):null)}))),p?e("div",{class:"audit-toast",role:"status","aria-live":"polite"},p):null)}var zu={"token-efficiency":"Token Efficiency","failure-prevention":"Failure Prevention","turn-optimization":"Turn Optimization","config-tuning":"Config Tuning","task-health":"Task Health"},Hu={"token-efficiency":"\u229A","failure-prevention":"\u26A0","turn-optimization":"\u21BB","config-tuning":"\u2699","task-health":"\u2764"},Bu={high:"wf-priority-high",medium:"wf-priority-medium",low:"wf-priority-low"};function Mb(t){return t.toLocaleString(void 0,{maximumFractionDigits:0})}function $b(t){return`${Math.round(t*100)}%`}function Ab(t){return t<1e3?`${Math.round(t)}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${(t/6e4).toFixed(1)}m`}function jo(t){return t==null?"null":Array.isArray(t)?t.join(", "):String(t)}function Lb({stats:t,totalRuns:n,timeRange:s}){return e("div",{class:"wf-stats"},e("div",{class:"wf-stats-grid"},e("div",{class:"wf-stat-card"},e("div",{class:"wf-stat-value"},String(n)),e("div",{class:"wf-stat-label"},"Total Runs")),e("div",{class:`wf-stat-card${t.successRate<.5?" wf-stat-warn":""}`},e("div",{class:"wf-stat-value"},$b(t.successRate)),e("div",{class:"wf-stat-label"},"Success Rate")),e("div",{class:"wf-stat-card"},e("div",{class:"wf-stat-value"},t.avgTurns.toFixed(1)),e("div",{class:"wf-stat-label"},"Avg Turns")),e("div",{class:"wf-stat-card"},e("div",{class:"wf-stat-value"},Mb(t.avgTokensPerRun)),e("div",{class:"wf-stat-label"},"Avg Tokens/Run")),e("div",{class:"wf-stat-card"},e("div",{class:"wf-stat-value"},Ab(t.avgDurationMs)),e("div",{class:"wf-stat-label"},"Avg Duration")),t.turnLimitHits>0?e("div",{class:"wf-stat-card wf-stat-warn"},e("div",{class:"wf-stat-value"},String(t.turnLimitHits)),e("div",{class:"wf-stat-label"},"Turn Limit Hits")):null),s?e("div",{class:"wf-stats-time-range"},"Analysis covers: ",e("strong",null,new Date(s.earliest).toLocaleDateString())," \u2014 ",e("strong",null,new Date(s.latest).toLocaleDateString())):null,Object.keys(t.failuresByStatus).length>0?e("div",{class:"wf-failure-breakdown"},e("h4",null,"Failure Breakdown"),e("div",{class:"wf-failure-chips"},...Object.entries(t.failuresByStatus).map(([r,a])=>e("span",{key:r,class:"wf-failure-chip"},e("span",{class:"wf-failure-chip-count"},String(a)),e("span",{class:"wf-failure-chip-label"},r))))):null)}function Fb({diff:t,onApply:n,onCancel:s,applying:r}){return e("div",{class:"wf-preview-panel"},e("h4",null,"Preview Changes"),e("table",{class:"wf-preview-table"},e("thead",null,e("tr",null,e("th",null,"Setting"),e("th",null,"Current"),e("th",null,"New"))),e("tbody",null,...t.map(a=>e("tr",{key:a.path},e("td",{class:"wf-preview-path"},a.path),e("td",{class:"wf-preview-old"},jo(a.oldValue)),e("td",{class:"wf-preview-new"},jo(a.newValue)))))),e("div",{class:"wf-preview-actions"},e("button",{class:"wf-btn wf-btn-primary",onClick:n,disabled:r},r?"Applying...":"Apply Changes"),e("button",{class:"wf-btn wf-btn-secondary",onClick:s,disabled:r},"Cancel")))}function Nb({suggestion:t,onPreview:n,onDecision:s,decidingId:r}){let[a,o]=k(!1),i=r===t.id;return e("div",{class:`wf-suggestion-card ${Bu[t.priority]??""}`},e("div",{class:"wf-suggestion-header",onClick:()=>o(!a)},e("div",{class:"wf-suggestion-title-row"},e("span",{class:"wf-suggestion-icon"},Hu[t.category]??"\u2022"),e("h3",{class:"wf-suggestion-title"},t.title),e("span",{class:`wf-suggestion-priority-badge ${Bu[t.priority]??""}`},t.priority)),e("span",{class:"wf-suggestion-category"},zu[t.category]??t.category)),e("div",{class:"wf-suggestion-body"},e("p",{class:"wf-suggestion-description"},t.description)),a?e("div",{class:"wf-suggestion-detail"},e("div",{class:"wf-suggestion-detail-section"},e("h4",null,"Rationale"),e("p",null,t.rationale)),e("div",{class:"wf-suggestion-detail-section"},e("h4",null,"Expected Impact"),e("p",null,t.impact)),t.configChanges&&Object.keys(t.configChanges).length>0?e("div",{class:"wf-suggestion-detail-section"},e("h4",null,"Config Changes"),e("div",{class:"wf-config-changes"},...Object.entries(t.configChanges).map(([l,c])=>e("div",{key:l,class:"wf-config-change-row"},e("code",null,l),e("span",null," \u2192 "),e("code",{class:"wf-config-new-value"},jo(c)))))):null,t.affectedTaskIds&&t.affectedTaskIds.length>0?e("div",{class:"wf-suggestion-detail-section"},e("h4",null,`Affected Tasks (${t.affectedTaskIds.length})`),e("div",{class:"wf-affected-tasks"},...t.affectedTaskIds.map(l=>e("code",{key:l,class:"wf-task-id"},l.slice(0,8))))):null):null,e("div",{class:"wf-suggestion-actions"},e("button",{class:"wf-btn wf-btn-expand",onClick:()=>o(!a)},a?"Less":"Details"),t.autoApplicable?e("button",{class:"wf-btn wf-btn-primary",onClick:()=>n(t),disabled:i},"Preview & Apply"):null,e("button",{class:"wf-btn wf-btn-secondary",onClick:()=>s(t.id,"deferred",t),disabled:i},"Defer"),e("button",{class:"wf-btn wf-btn-reject",onClick:()=>s(t.id,"rejected",t),disabled:i},"Dismiss")))}function Ob({history:t}){return t.total===0?null:e("div",{class:"wf-history-bar"},e("span",{class:"wf-history-label"},"Past decisions: "),e("span",{class:"wf-history-stat wf-history-accepted"},`${t.accepted} accepted`),e("span",{class:"wf-history-stat wf-history-rejected"},`${t.rejected} dismissed`),e("span",{class:"wf-history-stat wf-history-deferred"},`${t.deferred} deferred`))}function Zo(){let[t,n]=k(null),[s,r]=k(!0),[a,o]=k(null),[i,l]=k("all"),[c,u]=k(null),[d,p]=k(null),[m,f]=k(!1),[v,b]=k(null),[g,y]=k(null),h=_(E=>{y(E),setTimeout(()=>y(null),3e3)},[]),x=_(async()=>{try{let E=await fetch("/api/hench/workflow/analysis");if(!E.ok){let M=await E.json().catch(()=>({error:"Failed to load"}));o(M.error??"Failed to load analysis");return}let D=await E.json();n(D),o(null)}catch(E){o(E instanceof Error?E.message:"Failed to load workflow analysis")}finally{r(!1)}},[]);F(()=>{x()},[x]);let S=B(()=>t?i==="all"?t.suggestions:t.suggestions.filter(E=>E.category===i):[],[t,i]),T=B(()=>t?[...new Set(t.suggestions.map(D=>D.category))]:[],[t]),w=_(async E=>{if(E.configChanges){u(E);try{let D=await fetch("/api/hench/workflow/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({changes:E.configChanges,preview:!0})});if(!D.ok){h("Failed to preview changes");return}let M=await D.json();p(M.diff)}catch{h("Error previewing changes")}}},[h]),C=_(async()=>{if(c?.configChanges){f(!0);try{if(!(await fetch("/api/hench/workflow/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({changes:c.configChanges,suggestionId:c.id,title:c.title,category:c.category})})).ok){h("Failed to apply changes");return}h("Changes applied successfully"),u(null),p(null),await x()}catch{h("Error applying changes")}finally{f(!1)}}},[c,h,x]),I=_(async(E,D,M)=>{b(E);try{if(!(await fetch(`/api/hench/workflow/suggestions/${E}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({decision:D,title:M.title,category:M.category})})).ok){h("Failed to record decision");return}h(`Suggestion ${D==="rejected"?"dismissed":"deferred"}`),n(P=>P&&{...P,suggestions:P.suggestions.filter(A=>A.id!==E),decisionHistory:{...P.decisionHistory,total:P.decisionHistory.total+1,[D]:P.decisionHistory[D]+1}})}catch{h("Error recording decision")}finally{b(null)}},[h]);return s?e("div",{class:"wf-container"},e("div",{class:"loading"},"Analyzing workflow...")):a?e("div",{class:"wf-container"},e(te,{product:"hench",title:"Workflow Optimization"}),e("div",{class:"wf-error"},e("p",null,a),e("p",{class:"wf-error-hint"},"Make sure ",e("code",null,".hench/runs/")," exists with run data. Run ",e("code",null,"hench run")," to generate data."))):!t||t.totalRuns===0?e("div",{class:"wf-container"},e(te,{product:"hench",title:"Workflow Optimization"}),e("div",{class:"wf-empty"},e("p",null,"No run data available for analysis."),e("p",{class:"wf-empty-hint"},"Execute some tasks with ",e("code",null,"ndx work")," to generate workflow data."))):e("div",{class:"wf-container"},e("div",{class:"wf-header"},e(te,{product:"hench",title:"Workflow Optimization"}),e("p",{class:"wf-subtitle"},"Analyzes your agent execution history to identify bottlenecks and suggest optimizations.")),e(Lb,{stats:t.stats,totalRuns:t.totalRuns,timeRange:t.timeRange}),e(Ob,{history:t.decisionHistory}),e("div",{class:"wf-suggestions-section"},e("div",{class:"wf-suggestions-header"},e("h2",null,`Suggestions (${S.length})`),T.length>1?e("select",{class:"wf-category-filter",value:i,onChange:E=>l(E.target.value)},e("option",{value:"all"},"All Categories"),...T.map(E=>e("option",{key:E,value:E},`${Hu[E]??""} ${zu[E]??E}`))):null),S.length===0?e("div",{class:"wf-no-suggestions"},e("p",null,"\u2713 No optimization suggestions at this time. Your workflow is looking good!")):e("div",{class:"wf-suggestions-list"},...S.map(E=>e(Nb,{key:E.id,suggestion:E,onPreview:w,onDecision:I,decidingId:v})))),c&&d?e("div",{class:"wf-preview-overlay"},e("div",{class:"wf-preview-container"},e("h3",null,`Applying: ${c.title}`),e(Fb,{diff:d,onApply:C,onCancel:()=>{u(null),p(null)},applying:m}))):null,g?e("div",{class:"wf-toast"},e("span",null,g)):null)}function qt(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function Zu(t,n){if(!n)return"running\u2026";let s=new Date(n).getTime()-new Date(t).getTime();if(s<0)return"\u2014";let r=Math.floor(s/1e3);if(r<60)return`${r}s`;let a=Math.floor(r/60),o=r%60;if(a<60)return`${a}m ${o}s`;let i=Math.floor(a/60),l=a%60;return`${i}h ${l}m`}function ju(t){let n=new Date(t),r=new Date().getTime()-n.getTime(),a=r/(1e3*60*60);if(a<1){let o=Math.floor(r/6e4);return o<=0?"just now":`${o}m ago`}return a<24?`${Math.floor(a)}h ago`:a<168?n.toLocaleDateString(void 0,{weekday:"short",hour:"numeric",minute:"2-digit"}):n.toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}var Vb={completed:{icon:"\u25CF",label:"Completed",color:"var(--green)"},failed:{icon:"\u2715",label:"Failed",color:"var(--red)"},running:{icon:"\u25D0",label:"Running",color:"var(--accent)"},in_progress:{icon:"\u25D0",label:"Running",color:"var(--accent)"},error:{icon:"\u2715",label:"Error",color:"var(--red)"}};function Uu(t){return Vb[t]??{icon:"\u25CB",label:t,color:"var(--text-dim)"}}var Bb=5*60*1e3;function zb(t){return t.status!=="running"?!1:t.lastActivityAt?Date.now()-new Date(t.lastActivityAt).getTime()>Bb:!0}function Hb({runs:t}){let n=t.length,s=t.filter(i=>i.status==="completed").length,r=t.filter(i=>i.status==="failed"||i.status==="error").length,a=t.reduce((i,l)=>{let c=l.tokenUsage;return i+(c.input??0)+(c.output??0)+(c.cacheCreationInput??0)+(c.cacheReadInput??0)},0),o=t.reduce((i,l)=>i+(l.turns??0),0);return e("div",{class:"overview-metrics hench-metrics"},e(ke,{value:n,label:"Total Runs"}),e(ke,{value:s,label:"Succeeded",color:"var(--green)"}),r>0?e(ke,{value:r,label:"Failed",color:"var(--red)"}):null,e(ke,{value:o,label:"Total Turns",color:"var(--brand-purple)"}),e(ke,{value:qt(a),label:"Total Tokens",color:"var(--brand-teal)"}))}function jb({run:t,isSelected:n,isHighlighted:s,onClick:r,navigateTo:a,cardRef:o}){let i=Uu(t.status),l=zb(t),c=(t.tokenUsage.input??0)+(t.tokenUsage.output??0)+(t.tokenUsage.cacheCreationInput??0)+(t.tokenUsage.cacheReadInput??0),u=t.structuredSummary?.counts;return e("div",{ref:o,class:`hench-run-card${n?" selected":""}${t.status==="failed"||t.status==="error"?" failed":""}${l?" stale":""}${s?" hench-run-highlighted":""}`,onClick:r,role:"button",tabIndex:0,onKeyDown:d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),r())}},e("div",{class:"hench-run-header"},e("span",{class:"hench-run-status",style:`color: ${i.color}`,title:i.label},i.icon),a&&t.taskId?e(Ae,{task:{id:t.taskId,title:t.taskTitle,status:t.taskStatus??"pending"},navigateTo:a,compact:!0,showStatus:!1,class:"hench-run-task-link"}):e("span",{class:"hench-run-title"},t.taskTitle),e("span",{class:"hench-run-time"},ju(t.startedAt))),e("div",{class:"hench-run-meta"},e("span",{class:"hench-run-chip"},Zu(t.startedAt,t.finishedAt)),e("span",{class:"hench-run-chip"},`${t.turns} turns`),e("span",{class:"hench-run-chip"},qt(c)+" tokens"),e("span",{class:`hench-run-model hench-run-model-${t.model}`},t.model),u&&u.filesChanged>0?e("span",{class:"hench-run-chip"},`${u.filesChanged} file${u.filesChanged===1?"":"s"} changed`):null,t.lastActivityAt&&t.status==="running"?e("span",{class:"hench-run-chip"},`Active ${ju(t.lastActivityAt)}`):null,l?e("span",{class:"hench-run-chip hench-run-chip-warning"},"Possibly stuck"):null))}function Zb({run:t,onBack:n,navigateTo:s}){let r=Uu(t.status),a=(t.tokenUsage.input??0)+(t.tokenUsage.output??0)+(t.tokenUsage.cacheCreationInput??0)+(t.tokenUsage.cacheReadInput??0),o=t.structuredSummary?.counts;return e("div",{class:"hench-run-detail"},e("div",{class:"hench-detail-header"},e("div",{class:"hench-detail-header-top"},e("button",{class:"hench-back-btn",onClick:n,"aria-label":"Back to runs list"},"\u2190 Back"),e(Fn,{path:`/hench-runs/${t.id}`,compact:!0})),e("div",{class:"hench-detail-title-row"},e("span",{class:"hench-run-status",style:`color: ${r.color}; font-size: 18px`},r.icon),e("h2",null,t.taskTitle))),t.taskId?e("div",{class:"hench-detail-section hench-detail-task-section"},e("h3",null,"Rex Task"),e("div",{class:"hench-detail-task-card"},e(Ae,{task:{id:t.taskId,title:t.taskTitle,status:t.taskStatus??"pending"},navigateTo:s,showStatus:!0,showLevel:!1}),e("div",{class:"hench-detail-task-id"},t.taskId))):null,e("div",{class:"hench-detail-info"},e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Status"),e("span",{class:"hench-info-value",style:`color: ${r.color}`},r.label)),e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Started"),e("span",{class:"hench-info-value"},new Date(t.startedAt).toLocaleString())),t.finishedAt?e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Duration"),e("span",{class:"hench-info-value"},Zu(t.startedAt,t.finishedAt))):null,e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Model"),e("span",{class:"hench-info-value"},t.model)),e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Turns"),e("span",{class:"hench-info-value"},String(t.turns))),e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Tokens"),e("span",{class:"hench-info-value"},qt(a))),e("div",{class:"hench-info-row"},e("span",{class:"hench-info-label"},"Run ID"),e("span",{class:"hench-info-value hench-info-mono"},t.id))),o?e("div",{class:"hench-detail-section"},e("h3",null,"Activity"),e("div",{class:"hench-activity-grid"},o.filesRead>0?e("div",{class:"hench-activity-item"},e("span",{class:"hench-activity-val"},String(o.filesRead)),e("span",{class:"hench-activity-label"},"Files Read")):null,o.filesChanged>0?e("div",{class:"hench-activity-item"},e("span",{class:"hench-activity-val"},String(o.filesChanged)),e("span",{class:"hench-activity-label"},"Files Changed")):null,o.commandsExecuted>0?e("div",{class:"hench-activity-item"},e("span",{class:"hench-activity-val"},String(o.commandsExecuted)),e("span",{class:"hench-activity-label"},"Commands")):null,o.testsRun>0?e("div",{class:"hench-activity-item"},e("span",{class:"hench-activity-val"},String(o.testsRun)),e("span",{class:"hench-activity-label"},"Tests Run")):null,o.toolCallsTotal>0?e("div",{class:"hench-activity-item"},e("span",{class:"hench-activity-val"},String(o.toolCallsTotal)),e("span",{class:"hench-activity-label"},"Tool Calls")):null)):null,e("div",{class:"hench-detail-section"},e("h3",null,"Token Breakdown"),e("div",{class:"hench-token-grid"},e("div",{class:"hench-token-item"},e("span",{class:"hench-token-val"},qt(t.tokenUsage.input??0)),e("span",{class:"hench-token-label"},"Input")),e("div",{class:"hench-token-item"},e("span",{class:"hench-token-val"},qt(t.tokenUsage.output??0)),e("span",{class:"hench-token-label"},"Output")),t.tokenUsage.cacheCreationInput?e("div",{class:"hench-token-item"},e("span",{class:"hench-token-val"},qt(t.tokenUsage.cacheCreationInput)),e("span",{class:"hench-token-label"},"Cache Write")):null,t.tokenUsage.cacheReadInput?e("div",{class:"hench-token-item"},e("span",{class:"hench-token-val"},qt(t.tokenUsage.cacheReadInput)),e("span",{class:"hench-token-label"},"Cache Read")):null)),t.error?e("div",{class:"hench-detail-section"},e("h3",null,"Error"),e("pre",{class:"hench-error-box"},t.error)):null,t.summary?e("div",{class:"hench-detail-section"},e("h3",null,"Summary"),e("pre",{class:"hench-summary-box"},t.summary)):null,t.status==="running"?e("div",{class:"hench-detail-section"},e("h3",null,"Actions"),e("div",{class:"hench-detail-actions"},e("button",{class:"btn btn-danger",onClick:async()=>{try{(await fetch(`/api/hench/runs/${t.id}/mark-stuck`,{method:"POST"})).ok&&n()}catch{}}},"Mark as Stuck"),t.lastActivityAt?e("span",{class:"hench-detail-activity"},`Last activity: ${new Date(t.lastActivityAt).toLocaleString()}`):e("span",{class:"hench-detail-activity hench-detail-activity-unknown"},"No activity timestamp (legacy run)"))):null)}function Uo({navigateTo:t,initialRunId:n}={}){let[s,r]=k([]),[a,o]=k(!0),[i,l]=k(null),[c,u]=k(null),[d,p]=k(null),[m,f]=k(!1),[v,b]=k("all"),[g,y]=k(null),[h,x]=k(null),S=H(!1),T=_(async()=>{try{let A=await fetch("/api/hench/runs");if(!A.ok){l(`Failed to load runs (${A.status})`);return}let j=await A.json();r(j.runs??[]),l(null)}catch{l("Could not fetch runs. Is the server running?")}},[]);F(()=>{T().then(()=>o(!1))},[T]),Me("hench-runs",T,1e4),F(()=>{if(S.current||!n||a||s.length===0)return;if(S.current=!0,!s.some(U=>U.id===n)){y(`Run "${n}" not found`),history.replaceState({view:"hench-runs",file:null,zone:null,runId:null},"","/hench-runs");return}u(n),x(n),w(n);let j=setTimeout(()=>x(null),3e3);return()=>clearTimeout(j)},[n,a,s]);let w=_(async A=>{f(!0);try{let j=await fetch(`/api/hench/runs/${A}`);if(!j.ok){p(null),A===n&&y(`Failed to load run details (${j.status})`);return}let U=await j.json();p(U)}catch{p(null)}finally{f(!1)}},[n]),C=_(A=>{y(null),c===A?(u(null),p(null),history.replaceState({view:"hench-runs",file:null,zone:null,runId:null},"","/hench-runs")):(u(A),w(A),history.replaceState({view:"hench-runs",file:null,zone:null,runId:A},"",`/hench-runs/${A}`))},[c,w]),I=_(()=>{u(null),p(null),y(null),history.replaceState({view:"hench-runs",file:null,zone:null,runId:null},"","/hench-runs")},[]),E=B(()=>v==="all"?s:v==="failed"?s.filter(A=>A.status==="failed"||A.status==="error"):s.filter(A=>A.status===v),[s,v]),D=B(()=>{let A={all:s.length,completed:0,failed:0,running:0};for(let j of s)j.status==="completed"?A.completed++:j.status==="failed"||j.status==="error"?A.failed++:(j.status==="running"||j.status==="in_progress")&&A.running++;return A},[s]),M=H(!1),R=_(A=>{A&&!M.current&&(M.current=!0,requestAnimationFrame(()=>{A.scrollIntoView({behavior:"smooth",block:"center"})}))},[]),P=B(()=>s.filter(A=>A.status==="running"||A.status==="in_progress").map(A=>({id:A.id,taskId:A.taskId,taskTitle:A.taskTitle,taskStatus:A.taskStatus,startedAt:A.startedAt,lastActivityAt:A.lastActivityAt,status:A.status,turns:A.turns,model:A.model})),[s]);return a?e("div",{class:"loading"},"Loading execution history..."):i?e("div",{class:"prd-empty"},e("p",null,i),e("button",{class:"btn",onClick:T},"Retry")):s.length===0?e("div",{class:"hench-runs-container"},e("div",{class:"hench-runs-header"},e(te,{product:"hench",title:"Hench",class:"branded-header-hench"}),e("h2",null,"Execution History")),g?e("div",{class:"hench-deep-link-error",role:"alert"},e("span",null,g),e("button",{class:"hench-deep-link-error-dismiss",onClick:()=>y(null),"aria-label":"Dismiss"},"\xD7")):null,e("div",{class:"hench-empty"},e("div",{class:"hench-empty-icon"},"\u25B6"),e("p",null,"No runs yet."),e("p",{class:"hench-empty-hint"},"Run ",e("code",null,"ndx work")," to start executing tasks."))):c&&!m&&d?e("div",{class:"hench-runs-container"},e(Zb,{run:d,onBack:I,navigateTo:t})):c&&m?e("div",{class:"hench-runs-container"},e("div",{class:"loading"},"Loading run detail...")):e("div",{class:"hench-runs-container"},e("div",{class:"hench-runs-header"},e(te,{product:"hench",title:"Hench",class:"branded-header-hench"}),e("div",{class:"hench-runs-title-row"},e("h2",null,"Execution History"),e("div",{class:"hench-runs-count"},`${s.length} run${s.length===1?"":"s"}`))),g?e("div",{class:"hench-deep-link-error",role:"alert"},e("span",null,g),e("button",{class:"hench-deep-link-error-dismiss",onClick:()=>y(null),"aria-label":"Dismiss"},"\xD7")):null,e(Oa,{runs:P,navigateTo:t}),e(Va,null),e(Ba,null),e(za,null),e(Ha,null),e(Hb,{runs:s}),e("div",{class:"hench-filter-bar"},["all","completed","failed","running"].map(A=>e("button",{key:A,class:`toggle-btn${v===A?" active":""}`,onClick:()=>b(A)},A==="all"?"All":A.charAt(0).toUpperCase()+A.slice(1),D[A]>0?e("span",{class:"hench-filter-count"},` (${D[A]})`):null))),e("div",{class:"hench-runs-list"},E.map(A=>{let j=h===A.id;return e(jb,{key:A.id,run:A,isSelected:c===A.id,isHighlighted:j,onClick:()=>C(A.id),navigateTo:t,cardRef:j?R:void 0})}),E.length===0?e("div",{class:"hench-no-results"},"No runs match the selected filter."):null))}var Ub={execution:{label:"Execution Strategy",icon:"\u25B6",description:"Controls how the agent runs: model selection, turn limits, and token budgets"},"task-selection":{label:"Task Selection",icon:"\u2611",description:"How tasks are picked and when they're considered stuck"},retry:{label:"Retry Policy",icon:"\u21BA",description:"How transient API errors are handled with exponential backoff"},guard:{label:"Guard Rails",icon:"\u26A0",description:"Security boundaries: blocked paths, allowed commands, size limits"},general:{label:"General",icon:"\u2699",description:"Miscellaneous configuration settings"}},Gb=["execution","task-selection","retry","guard","general"];function Mn(t){return Array.isArray(t)?t.join(", "):t==null?"":String(t)}function Wu(t,n){switch(t.type){case"number":{let s=Number(n);if(n.trim()===""||isNaN(s))throw new Error(`${t.label} must be a valid number`);if(s<0)throw new Error(`${t.label} must be non-negative`);return s}case"boolean":return n==="true";case"enum":if(t.enumValues&&!t.enumValues.includes(n))throw new Error(`${t.label} must be one of: ${t.enumValues.join(", ")}`);return n;case"array":return n.split(",").map(s=>s.trim()).filter(Boolean);default:if(n.trim()==="")throw new Error(`${t.label} must not be empty`);return n}}function Gu(t,n){try{return Wu(t,n),null}catch(s){return s instanceof Error?s.message:String(s)}}function qu(t,n){return n!==Mn(t.value)}function Ku(t,n){try{let s;switch(t.type){case"number":if(s=Number(n),isNaN(s))return"";break;case"array":s=n.split(",").map(r=>r.trim()).filter(Boolean);break;default:s=n}switch(t.path){case"provider":return s==="cli"?"Agent will use Claude Code CLI":"Agent will call Anthropic API directly";case"model":return`Agent will use model "${s}"`;case"maxTurns":{let r=Number(s);return`Agent will stop after ${r} turns (${r<=10?"short":r<=30?"medium":"long"} runs)`}case"maxTokens":return`Each API response limited to ${Number(s).toLocaleString()} tokens`;case"tokenBudget":return Number(s)===0?"No token limit per run (unlimited)":`Run will stop after ${Number(s).toLocaleString()} total tokens`;case"loopPauseMs":return`${Number(s)/1e3}s pause between consecutive task runs`;case"maxFailedAttempts":return`Tasks skipped as stuck after ${s} consecutive failures`;case"retry.maxRetries":return`Transient errors retried up to ${s} times`;case"retry.baseDelayMs":return`First retry after ${Number(s)/1e3}s, then exponential backoff`;case"retry.maxDelayMs":return`Retry delay capped at ${Number(s)/1e3}s`;case"guard.commandTimeout":return`Commands killed after ${Number(s)/1e3}s`;case"guard.maxFileSize":return`File write limit: ${(Number(s)/1024/1024).toFixed(1)}MB`;case"guard.blockedPaths":return`${s.length} blocked path patterns`;case"guard.allowedCommands":return`Allowed: ${s.join(", ")}`;default:return""}}catch{return""}}function Wb({value:t,onChange:n,disabled:s}){let[r,a]=k(""),o=t.split(",").map(u=>u.trim()).filter(Boolean),i=_(()=>{let u=r.trim();if(!u)return;let d=[...o,u];n(d.join(", ")),a("")},[r,o,n]),l=_(u=>{let d=o.filter((p,m)=>m!==u);n(d.join(", "))},[o,n]),c=_(u=>{u.key==="Enter"&&(u.preventDefault(),i())},[i]);return e("div",{class:"hench-config-tags"},e("div",{class:"hench-config-tag-list"},...o.map((u,d)=>e("span",{key:`${u}-${d}`,class:"hench-config-tag"},e("span",{class:"hench-config-tag-text"},u),s?null:e("button",{type:"button",class:"hench-config-tag-remove",onClick:()=>l(d),"aria-label":`Remove ${u}`},"\xD7")))),s?null:e("div",{class:"hench-config-tag-input-row"},e("input",{type:"text",class:"hench-config-tag-input",value:r,placeholder:"Add item...",onInput:u=>a(u.target.value),onKeyDown:c}),e("button",{type:"button",class:"hench-config-tag-add-btn",onClick:i,disabled:!r.trim()},"Add")))}function qb({field:t,value:n,onChange:s,error:r}){let a=`hench-config-input${r?" input-error":""}`;switch(t.type){case"enum":return e("select",{class:`hench-config-select${r?" input-error":""}`,value:n,onChange:o=>s(o.target.value)},...(t.enumValues??[]).map(o=>e("option",{value:o,key:o},o)));case"number":return e("input",{class:a,type:"number",value:n,min:"0",onInput:o=>s(o.target.value)});case"boolean":return e("label",{class:"hench-config-toggle"},e("input",{type:"checkbox",checked:n==="true",onChange:o=>s(String(o.target.checked))}),e("span",{class:"hench-config-toggle-slider"}),e("span",{class:"hench-config-toggle-label"},n==="true"?"Enabled":"Disabled"));case"array":return e(Wb,{value:n,onChange:s});default:return e("input",{class:a,type:"text",value:n,onInput:o=>s(o.target.value)})}}function Kb({field:t,editValue:n,error:s,onFieldChange:r}){let a=qu(t,n),o=a?Ku(t,n):null,i=_(c=>{r(t.path,c)},[t.path,r]),l=_(()=>{r(t.path,Mn(t.value))},[t.path,t.value,r]);return e("div",{class:`hench-config-field${t.isDefault?"":" modified"}${a?" dirty":""}`},e("div",{class:"hench-config-field-header"},e("div",{class:"hench-config-field-label"},e("span",{class:"hench-config-field-name"},t.label),t.isDefault?null:e("span",{class:"hench-config-modified-badge"},"modified"),a?e("span",{class:"hench-config-dirty-badge"},"unsaved"):null),e("div",{class:"hench-config-field-actions"},e("span",{class:"hench-config-field-path"},t.path),a?e("button",{type:"button",class:"hench-config-reset-btn",onClick:l,title:"Revert to current saved value"},"Revert"):null)),e("p",{class:"hench-config-field-desc"},t.description),e("div",{class:"hench-config-control-row"},e(qb,{field:t,value:n,onChange:i,error:s})),a&&o?e("div",{class:"hench-config-preview"},e("span",{class:"hench-config-preview-label"},"Impact: "),e("span",null,o)):e("div",{class:"hench-config-impact"},e("span",null,t.impact)),s?e("div",{class:"hench-config-error"},s):null)}function Yb({category:t,fields:n,editValues:s,errors:r,onFieldChange:a}){let o=Ub[t]??{label:t,icon:"\u2022",description:""};return e("div",{class:"hench-config-category"},e("div",{class:"hench-config-category-header"},e("span",{class:"hench-config-category-icon"},o.icon),e("div",null,e("h3",{class:"hench-config-category-title"},o.label),e("p",{class:"hench-config-category-desc"},o.description))),e("div",{class:"hench-config-fields"},...n.map(i=>e(Kb,{key:i.path,field:i,editValue:s[i.path]??Mn(i.value),error:r[i.path]??null,onFieldChange:a}))))}function Xb({pendingChanges:t,onSave:n,onDiscard:s,saving:r}){return t.length===0?null:e("div",{class:"hench-config-changes-panel"},e("div",{class:"hench-config-changes-header"},e("span",{class:"hench-config-changes-title"},`${t.length} unsaved change${t.length>1?"s":""}`)),e("div",{class:"hench-config-changes-list"},...t.map(a=>e("div",{key:a.path,class:"hench-config-change-item"},e("div",{class:"hench-config-change-label"},a.label),e("div",{class:"hench-config-change-diff"},e("span",{class:"hench-config-change-old"},a.oldDisplay||"(empty)"),e("span",{class:"hench-config-change-arrow"},"\u2192"),e("span",{class:"hench-config-change-new"},a.newDisplay||"(empty)")),e("div",{class:"hench-config-change-impact"},a.impact)))),e("div",{class:"hench-config-changes-actions"},e("button",{type:"button",class:"hench-config-discard-btn",onClick:s,disabled:r},"Discard All"),e("button",{type:"button",class:"hench-config-save-all-btn",onClick:n,disabled:r},r?"Saving...":"Save All Changes")))}function Jb({changes:t}){return t.length===0?null:e("div",{class:"hench-config-toast"},e("span",{class:"hench-config-toast-icon"},"\u2714"),e("span",null,`Saved ${t.length} change${t.length>1?"s":""}`))}function Go(){let[t,n]=k(null),[s,r]=k(!0),[a,o]=k(null),[i,l]=k([]),[c,u]=k(!1),[d,p]=k({}),[m,f]=k({}),v=H(null),b=_(async()=>{try{let C=await fetch("/api/hench/config");if(!C.ok){let E=await C.json().catch(()=>({error:"Failed to load"}));o(E.error??"Failed to load configuration");return}let I=await C.json();n(I),o(null),p({}),f({})}catch(C){o(C instanceof Error?C.message:"Failed to load configuration")}finally{r(!1)}},[]);F(()=>{b()},[b]),F(()=>()=>{v.current&&clearTimeout(v.current)},[]);let g=_((C,I)=>{if(p(E=>({...E,[C]:I})),t){let E=t.fields.find(D=>D.path===C);if(E){let D=Gu(E,I);f(M=>({...M,[C]:D}))}}},[t]),y=B(()=>{if(!t)return[];let C=[];for(let I of t.fields){let E=d[I.path];E!==void 0&&qu(I,E)&&C.push({path:I.path,label:I.label,oldDisplay:Mn(I.value),newDisplay:E,impact:Ku(I,E)})}return C},[t,d]),h=B(()=>{if(!t)return!1;for(let C of y){let I=t.fields.find(E=>E.path===C.path);if(I&&Gu(I,d[I.path]??Mn(I.value)))return!0}return!1},[t,y,d]),x=_(async()=>{if(!(!t||y.length===0||h)){u(!0),o(null);try{let C={};for(let D of y){let M=t.fields.find(R=>R.path===D.path);M&&(C[M.path]=Wu(M,d[M.path]??Mn(M.value)))}let I=await fetch("/api/hench/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({changes:C})});if(!I.ok){let D=await I.json().catch(()=>({error:"Save failed"}));o(D.error??"Save failed");return}let E=await I.json();l(E.applied),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>l([]),3e3),await b()}catch(C){o(C instanceof Error?C.message:"Save failed")}finally{u(!1)}}},[t,y,h,d,b]),S=_(()=>{p({}),f({})},[]);if(s)return e("div",{class:"hench-config-container"},e("div",{class:"loading"},"Loading configuration..."));if(a&&!t)return e("div",{class:"hench-config-container"},e(te,{product:"hench",title:"Workflow Configuration"}),e("div",{class:"hench-config-error-state"},e("p",null,a),e("p",{class:"hench-config-error-hint"},"Make sure ",e("code",null,".hench/")," exists. Run ",e("code",null,"hench init")," to create it.")));if(!t)return null;let T=new Map;for(let C of t.fields)T.has(C.category)||T.set(C.category,[]),T.get(C.category).push(C);let w=t.fields.filter(C=>!C.isDefault).length;return e("div",{class:"hench-config-container"},e("div",{class:"hench-config-header"},e(te,{product:"hench",title:"Workflow Configuration"}),w>0?e("span",{class:"hench-config-modified-count"},`${w} field${w>1?"s differ":" differs"} from defaults`):null),a?e("div",{class:"hench-config-save-error"},a):null,e(Xb,{pendingChanges:y,onSave:x,onDiscard:S,saving:c}),...Gb.filter(C=>T.has(C)).map(C=>e(Yb,{key:C,category:C,fields:T.get(C),editValues:d,errors:m,onFieldChange:g})),e(Jb,{changes:i}))}function Xu(t,n=""){let s=[];for(let[r,a]of Object.entries(t)){let o=n?`${n}.${r}`:r;a!==null&&typeof a=="object"&&!Array.isArray(a)?s.push(...Xu(a,o)):s.push([o,a])}return s}function Qb(t){return Array.isArray(t)?t.join(", "):t==null?"":String(t)}function Yu({template:t,onApply:n,onDelete:s,applying:r}){let[a,o]=k(!1),i=Xu(t.config),l=r===t.id;return e("div",{class:`hench-template-card${t.builtIn?" built-in":" user-defined"}`},e("div",{class:"hench-template-card-header",onClick:()=>o(!a)},e("div",{class:"hench-template-card-title-row"},e("h3",{class:"hench-template-card-name"},t.name),t.builtIn?e("span",{class:"hench-template-badge built-in"},"built-in"):e("span",{class:"hench-template-badge user"},"custom")),e("p",{class:"hench-template-card-desc"},t.description),t.tags.length>0?e("div",{class:"hench-template-tags"},...t.tags.map(c=>e("span",{key:c,class:"hench-template-tag"},c))):null),a?e("div",{class:"hench-template-card-detail"},t.useCases.length>0?e("div",{class:"hench-template-use-cases"},e("h4",null,"Recommended use cases"),e("ul",null,...t.useCases.map((c,u)=>e("li",{key:u},c)))):null,i.length>0?e("div",{class:"hench-template-config"},e("h4",null,"Config overrides"),e("table",{class:"hench-template-config-table"},e("tbody",null,...i.map(([c,u])=>e("tr",{key:c},e("td",{class:"hench-template-config-key"},c),e("td",{class:"hench-template-config-value"},Qb(u))))))):null,t.createdAt?e("p",{class:"hench-template-created"},"Created: ",new Date(t.createdAt).toLocaleDateString()):null):null,e("div",{class:"hench-template-card-actions"},e("button",{class:"hench-template-expand-btn",onClick:()=>o(!a)},a?"Less":"Details"),e("button",{class:"hench-template-apply-btn",onClick:()=>n(t.id),disabled:l},l?"Applying...":"Apply"),t.builtIn?null:e("button",{class:"hench-template-delete-btn",onClick:()=>s(t.id)},"Delete")))}function ey({onSave:t,saving:n}){let[s,r]=k(!1),[a,o]=k(""),[i,l]=k(""),[c,u]=k(""),[d,p]=k(""),[m,f]=k(null),v=_(async()=>{if(!a.match(/^[a-z][a-z0-9-]{1,49}$/)){f("ID must be lowercase, start with a letter, use hyphens (2-50 chars)");return}f(null);try{await t({id:a,name:i||a,description:c,tags:d}),r(!1),o(""),l(""),u(""),p("")}catch(b){f(b instanceof Error?b.message:String(b))}},[a,i,c,d,t]);return s?e("div",{class:"hench-template-save-form"},e("h3",null,"Save Current Config as Template"),e("div",{class:"hench-template-form-field"},e("label",null,"Template ID"),e("input",{type:"text",value:a,placeholder:"my-template",onInput:b=>o(b.target.value)})),e("div",{class:"hench-template-form-field"},e("label",null,"Name"),e("input",{type:"text",value:i,placeholder:"My Template",onInput:b=>l(b.target.value)})),e("div",{class:"hench-template-form-field"},e("label",null,"Description"),e("input",{type:"text",value:c,placeholder:"Brief description of this template",onInput:b=>u(b.target.value)})),e("div",{class:"hench-template-form-field"},e("label",null,"Tags (comma-separated)"),e("input",{type:"text",value:d,placeholder:"fast, lightweight",onInput:b=>p(b.target.value)})),m?e("div",{class:"hench-template-form-error"},m):null,e("div",{class:"hench-template-form-actions"},e("button",{class:"hench-template-apply-btn",onClick:v,disabled:n||!a},n?"Saving...":"Save Template"),e("button",{class:"hench-template-cancel-btn",onClick:()=>r(!1)},"Cancel"))):e("button",{class:"hench-template-save-current-btn",onClick:()=>r(!0)},"Save Current Config as Template")}function ty({message:t}){return t?e("div",{class:"hench-template-toast"},e("span",{class:"hench-template-toast-icon"},"\u2714"),e("span",null,t)):null}function Wo(){let[t,n]=k([]),[s,r]=k(!0),[a,o]=k(null),[i,l]=k(null),[c,u]=k(!1),[d,p]=k(null),m=_(x=>{p(x),setTimeout(()=>p(null),3e3)},[]),f=_(async()=>{try{let x=await fetch("/api/hench/templates");if(!x.ok){let T=await x.json().catch(()=>({error:"Failed to load"}));o(T.error??"Failed to load templates");return}let S=await x.json();n(S.templates),o(null)}catch(x){o(x instanceof Error?x.message:"Failed to load templates")}finally{r(!1)}},[]);F(()=>{f()},[f]);let v=_(async x=>{l(x);try{let S=await fetch(`/api/hench/templates/${x}/apply`,{method:"POST"});if(!S.ok){let w=await S.json().catch(()=>({error:"Apply failed"}));throw new Error(w.error??"Apply failed")}let T=await S.json();m(`Applied template "${T.templateName}"`)}catch(S){m(`Error: ${S instanceof Error?S.message:String(S)}`)}finally{l(null)}},[m]),b=_(async x=>{try{let S=await fetch(`/api/hench/templates/${x}`,{method:"DELETE"});if(!S.ok){let T=await S.json().catch(()=>({error:"Delete failed"}));throw new Error(T.error??"Delete failed")}m(`Deleted template "${x}"`),await f()}catch(S){m(`Error: ${S instanceof Error?S.message:String(S)}`)}},[m,f]),g=_(async x=>{u(!0);try{let S=await fetch("/api/hench/config");if(!S.ok)throw new Error("Failed to load current config");let T=await S.json(),{schema:w,...C}=T.config,I=await fetch("/api/hench/templates",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:x.id,name:x.name,description:x.description,tags:x.tags.split(",").map(E=>E.trim()).filter(Boolean),config:C})});if(!I.ok){let E=await I.json().catch(()=>({error:"Save failed"}));throw new Error(E.error??"Save failed")}m(`Saved template "${x.name||x.id}"`),await f()}finally{u(!1)}},[m,f]);if(s)return e("div",{class:"hench-templates-container"},e("div",{class:"loading"},"Loading templates..."));if(a)return e("div",{class:"hench-templates-container"},e(te,{product:"hench",title:"Workflow Templates"}),e("div",{class:"hench-templates-error"},e("p",null,a),e("p",{class:"hench-templates-error-hint"},"Make sure ",e("code",null,".hench/")," exists. Run ",e("code",null,"hench init")," to create it.")));let y=t.filter(x=>x.builtIn),h=t.filter(x=>!x.builtIn);return e("div",{class:"hench-templates-container"},e("div",{class:"hench-templates-header"},e(te,{product:"hench",title:"Workflow Templates"}),e("p",{class:"hench-templates-subtitle"},"Pre-configured workflow setups for common development patterns. Apply a template to quickly configure your agent.")),e(ey,{onSave:g,saving:c}),y.length>0?e("div",{class:"hench-templates-section"},e("h2",{class:"hench-templates-section-title"},"Built-in Templates"),e("div",{class:"hench-templates-grid"},...y.map(x=>e(Yu,{key:x.id,template:x,onApply:v,onDelete:b,applying:i})))):null,h.length>0?e("div",{class:"hench-templates-section"},e("h2",{class:"hench-templates-section-title"},"Custom Templates"),e("div",{class:"hench-templates-grid"},...h.map(x=>e(Yu,{key:x.id,template:x,onApply:v,onDelete:b,applying:i})))):null,e(ty,{message:d}))}function Ju(t){if(!t||t.trim().length===0)return"API key is required";let n=t.trim();return!n.startsWith("secret_")&&!n.startsWith("ntn_")?"API key must start with 'secret_' or 'ntn_'":n.length<20?"API key appears too short":null}function Qu(t){if(!t||t.trim().length===0)return"Database ID is required";let n=t.trim().replace(/-/g,"");return/^[0-9a-f]{32}$/i.test(n)?null:"Database ID must be a valid UUID (32 hex characters)"}function ny({result:t,testing:n}){if(n)return e("div",{class:"notion-status notion-status-testing"},e("span",{class:"notion-status-dot notion-status-dot-testing"}),e("span",{class:"notion-status-text"},"Testing connection..."));if(!t)return e("div",{class:"notion-status notion-status-unknown"},e("span",{class:"notion-status-dot notion-status-dot-unknown"}),e("span",{class:"notion-status-text"},"Not tested"));let s=`notion-status-dot notion-status-dot-${t.status}`;return e("div",{class:`notion-status notion-status-${t.status}`},e("span",{class:s}),e("div",{class:"notion-status-info"},e("span",{class:"notion-status-text"},t.message),t.details?.databaseTitle?e("span",{class:"notion-status-detail"},`Database: ${t.details.databaseTitle}`):null))}function sy({envVar:t}){return t?e("div",{class:"notion-env-hint"},e("span",{class:"notion-env-hint-icon"},"\u{1F512}"),e("div",{class:"notion-env-hint-content"},e("p",{class:"notion-env-hint-title"},"Credential stored securely"),e("p",{class:"notion-env-hint-desc"},"The API key is redacted on disk. Set the environment variable at runtime:"),e("code",{class:"notion-env-hint-code"},`export ${t}="your-token"`))):null}function qo(){let[t,n]=k(!0),[s,r]=k(null),[a,o]=k(null),[i,l]=k(""),[c,u]=k(""),[d,p]=k(!1),[m,f]=k({}),[v,b]=k(!1),[g,y]=k(!1),h=H(null),[x,S]=k(!1),[T,w]=k(null),[C,I]=k(!1),[E,D]=k(!1),M=_(async()=>{try{let V=await fetch("/api/notion/config");if(!V.ok){let G=await V.json().catch(()=>({error:"Failed to load"}));o(G.error??"Failed to load configuration");return}let q=await V.json();r(q),o(null),q.configured&&(u(q.databaseId??""),l(""))}catch(V){o(V instanceof Error?V.message:"Failed to load configuration")}finally{n(!1)}},[]);F(()=>(M(),()=>{h.current&&clearTimeout(h.current)}),[M]);let R=_(V=>{let q=V.target.value;if(l(q),q.trim().length>0){let G=Ju(q);f(K=>({...K,token:G??void 0}))}else f(G=>({...G,token:void 0}))},[]),P=_(V=>{let q=V.target.value;if(u(q),q.trim().length>0){let G=Qu(q);f(K=>({...K,databaseId:G??void 0}))}else f(G=>({...G,databaseId:void 0}))},[]),A=_(async()=>{let V={};if(i.trim().length>0){let q=Ju(i);if(q){f(G=>({...G,token:q}));return}V.token=i.trim()}if(c.trim().length>0){let q=Qu(c);if(q){f(G=>({...G,databaseId:q}));return}V.databaseId=c.trim()}if(Object.keys(V).length===0){o("Enter at least one field to save");return}b(!0),o(null),y(!1);try{let q=await fetch("/api/notion/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)});if(!q.ok){let G=await q.json().catch(()=>({error:"Save failed"}));G.errors?f(G.errors):o(G.error??"Save failed");return}y(!0),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>y(!1),3e3),l(""),p(!1),await M()}catch(q){o(q instanceof Error?q.message:"Save failed")}finally{b(!1)}},[i,c,M]),j=_(async()=>{S(!0),w(null);try{let V={};i.trim().length>0&&(V.token=i.trim()),c.trim().length>0&&(V.databaseId=c.trim());let q=await fetch("/api/notion/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)});if(!q.ok){w({status:"red",message:"Connection test request failed"});return}let G=await q.json();w(G)}catch(V){w({status:"red",message:V instanceof Error?V.message:"Connection test failed"})}finally{S(!1)}},[i,c]),U=_(async()=>{D(!0);try{let V=await fetch("/api/notion/config",{method:"DELETE"});if(!V.ok){let q=await V.json().catch(()=>({error:"Remove failed"}));o(q.error??"Remove failed");return}l(""),u(""),w(null),I(!1),await M()}catch(V){o(V instanceof Error?V.message:"Remove failed")}finally{D(!1)}},[M]);if(t)return e("div",{class:"notion-config-container"},e("div",{class:"loading"},"Loading Notion configuration..."));if(a&&!s)return e("div",{class:"notion-config-container"},e(te,{product:"rex",title:"Notion Integration"}),e("div",{class:"notion-config-error-state"},e("p",null,a),e("p",{class:"notion-config-error-hint"},"Make sure ",e("code",null,".rex/")," exists. Run ",e("code",null,"rex init")," to create it.")));let se=s?.configured??!1;return e("div",{class:"notion-config-container"},e("div",{class:"notion-config-header"},e(te,{product:"rex",title:"Notion Integration"}),e("p",{class:"notion-config-subtitle"},"Connect your PRD to a Notion database for two-way sync.")),e("div",{class:"notion-config-section"},e("h3",{class:"notion-config-section-title"},e("span",{class:"notion-config-section-icon"},"\u{1F50C}"),"Connection Status"),e(ny,{result:T,testing:x}),se?e(sy,{envVar:s?.tokenEnvVar??null}):null),a?e("div",{class:"notion-config-error-banner"},a):null,g?e("div",{class:"notion-config-toast"},e("span",{class:"notion-config-toast-icon"},"\u2714"),"Configuration saved"):null,e("div",{class:"notion-config-section"},e("h3",{class:"notion-config-section-title"},e("span",{class:"notion-config-section-icon"},"\u{1F511}"),"Credentials"),e("div",{class:`notion-config-field${m.token?" notion-config-field-error":""}`},e("label",{class:"notion-config-label"},"Notion API Key",se?e("span",{class:"notion-config-badge"},"configured"):null),e("p",{class:"notion-config-field-desc"},"Integration token from ",e("a",{href:"https://www.notion.so/my-integrations",target:"_blank",rel:"noopener noreferrer"},"notion.so/my-integrations"),". Starts with ",e("code",null,"secret_")," or ",e("code",null,"ntn_"),"."),e("div",{class:"notion-config-input-row"},e("input",{type:d?"text":"password",class:"notion-config-input",value:i,placeholder:se?`Current: ${s?.tokenMasked??"****"}`:"secret_xxxxx or ntn_xxxxx",onInput:R,autocomplete:"off",spellcheck:!1}),e("button",{type:"button",class:"notion-config-toggle-visibility",onClick:()=>p(!d),title:d?"Hide token":"Show token","aria-label":d?"Hide token":"Show token"},d?"\u{1F441}":"\u{1F441}\u200D\u{1F5E8}")),m.token?e("div",{class:"notion-config-field-error-text"},m.token):null),e("div",{class:`notion-config-field${m.databaseId?" notion-config-field-error":""}`},e("label",{class:"notion-config-label"},"Database ID",se&&s?.databaseId?e("span",{class:"notion-config-badge"},"configured"):null),e("p",{class:"notion-config-field-desc"},"The UUID of your Notion database. Find it in the database URL: ",e("code",null,"notion.so/{workspace}/{database_id}?v=...")),e("input",{type:"text",class:"notion-config-input",value:c,placeholder:"e.g. a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",onInput:P,autocomplete:"off",spellcheck:!1}),m.databaseId?e("div",{class:"notion-config-field-error-text"},m.databaseId):null)),e("div",{class:"notion-config-actions"},e("div",{class:"notion-config-actions-primary"},e("button",{type:"button",class:"notion-config-save-btn",onClick:A,disabled:v||i.trim().length===0&&c.trim().length===0},v?"Saving...":"Save Configuration"),e("button",{type:"button",class:"notion-config-test-btn",onClick:j,disabled:x},x?"Testing...":"Test Connection")),se?e("div",{class:"notion-config-actions-danger"},C?e(Q,null,e("span",{class:"notion-config-confirm-text"},"Remove Notion config?"),e("button",{type:"button",class:"notion-config-confirm-yes",onClick:U,disabled:E},E?"Removing...":"Yes, Remove"),e("button",{type:"button",class:"notion-config-confirm-no",onClick:()=>I(!1)},"Cancel")):e("button",{type:"button",class:"notion-config-remove-btn",onClick:()=>I(!0)},"Remove Configuration")):null),e("div",{class:"notion-config-section"},e(go,{isConfigured:se})),e("div",{class:"notion-config-section notion-config-help"},e("h3",{class:"notion-config-section-title"},e("span",{class:"notion-config-section-icon"},"\u2139"),"Setup Guide"),e("ol",{class:"notion-config-steps"},e("li",null,e("strong",null,"Create an integration")," at ",e("a",{href:"https://www.notion.so/my-integrations",target:"_blank",rel:"noopener noreferrer"},"notion.so/my-integrations")," and copy the token."),e("li",null,e("strong",null,"Create or select a database")," in your Notion workspace for storing PRD items."),e("li",null,e("strong",null,"Share the database")," with your integration (click \u2022\u2022\u2022 in the database, then Connections)."),e("li",null,e("strong",null,"Copy the database ID")," from the URL and paste it above."),e("li",null,e("strong",null,"Test the connection")," to verify everything works.")),e("div",{class:"notion-config-security-note"},e("span",{class:"notion-config-security-icon"},"\u{1F6E1}"),e("div",null,e("strong",null,"Security note: "),"Your API key is redacted on disk after saving. The actual token value is stored as an environment variable reference (",e("code",null,"REX_NOTION_TOKEN"),"). The key is never committed to version control."))))}function ed(t,n){let s=t==null?"":String(t);if(n.required&&s.trim().length===0)return`${n.label??"This field"} is required`;if(s.trim().length===0||!n.validationRules)return null;for(let r of n.validationRules)switch(r.type){case"pattern":if(r.pattern&&!new RegExp(r.pattern).test(s))return r.message;break;case"minLength":if(r.minLength!==void 0&&s.length<r.minLength)return r.message;break;case"maxLength":if(r.maxLength!==void 0&&s.length>r.maxLength)return r.message;break;case"min":if(r.min!==void 0&&Number(t)<r.min)return r.message;break;case"max":if(r.max!==void 0&&Number(t)>r.max)return r.message;break}return null}function ry(t){let n=new Map;for(let[a,o]of Object.entries(t.fields)){let i=o.group??null;n.has(i)||n.set(i,[]),n.get(i).push({key:a,schema:o})}for(let a of n.values())a.sort((o,i)=>(o.schema.order??999)-(i.schema.order??999));let s=[],r=Array.from(n.keys()).sort((a,o)=>{if(a===null)return 1;if(o===null)return-1;let i=t.groups?.[a],l=t.groups?.[o];return(i?.order??999)-(l?.order??999)});for(let a of r)s.push({groupKey:a,group:a?t.groups?.[a]??null:null,fields:n.get(a)??[]});return s}function ay({fieldKey:t,schema:n,value:s,error:r,configured:a,masked:o,onInput:i}){let[l,c]=k(!1),u=n.inputType??"text",d=s==null?"":String(s),p=!!r,m=_(v=>{let b=v.target;u==="checkbox"?i(t,b.checked):i(t,b.value)},[t,u,i]),f=_(v=>{i(t,v.target.value)},[t,i]);return e("div",{class:`intg-field${p?" intg-field-error":""}`},e("label",{class:"intg-field-label"},n.label??t,a&&(n.sensitive&&o)?e("span",{class:"intg-field-badge"},"configured"):null,n.required?e("span",{class:"intg-field-required"},"*"):null),n.helpText?e("p",{class:"intg-field-help"},n.helpText,n.docUrl?e(Q,null," ",e("a",{href:n.docUrl,target:"_blank",rel:"noopener noreferrer",class:"intg-field-doc-link"},n.docLabel??"Learn more")):null):null,u==="checkbox"?e("label",{class:"intg-checkbox-wrapper"},e("input",{type:"checkbox",checked:s===!0||s==="true",onChange:m}),e("span",{class:"intg-checkbox-label"},n.description)):u==="select"?e("select",{class:"intg-input intg-select",value:d||(n.defaultValue!==void 0?String(n.defaultValue):""),onChange:f},e("option",{value:""},"\u2014 Select \u2014"),(n.options??[]).map(v=>e("option",{key:v.value,value:v.value,title:v.description},v.label))):u==="textarea"?e("textarea",{class:"intg-input intg-textarea",value:d,placeholder:a&&o?`Current: ${o}`:n.placeholder??"",onInput:m,rows:4}):u==="password"?e("div",{class:"intg-input-row"},e("input",{type:l?"text":"password",class:"intg-input",value:d,placeholder:a&&o?`Current: ${o}`:n.placeholder??"",onInput:m,autocomplete:"off",spellcheck:!1}),e("button",{type:"button",class:"intg-toggle-vis",onClick:()=>c(!l),title:l?"Hide":"Show","aria-label":l?"Hide value":"Show value"},l?"\u{1F441}":"\u{1F441}\u200D\u{1F5E8}")):e("input",{type:u,class:"intg-input",value:d,placeholder:a&&o?`Current: ${o}`:n.placeholder??"",onInput:m,autocomplete:"off",spellcheck:!1}),p?e("div",{class:"intg-field-error-text"},r):null)}function oy({schema:t,onBack:n}){let[s,r]=k(!0),[a,o]=k(null),[i,l]=k({}),[c,u]=k({}),[d,p]=k(null),[m,f]=k(!1),[v,b]=k(!1),[g,y]=k(!1),[h,x]=k(!1),S=H(null),T=B(()=>ry(t),[t]),w=_(async()=>{try{let R=await fetch(`/api/integrations/${t.id}/config`);if(!R.ok){let A=await R.json().catch(()=>({error:"Failed to load"}));p(A.error??"Failed to load configuration");return}let P=await R.json();o(P),p(null),P.configured&&l({...P.values})}catch(R){p(R instanceof Error?R.message:"Failed to load configuration")}finally{r(!1)}},[t.id]);F(()=>(w(),()=>{S.current&&clearTimeout(S.current)}),[w]);let C=_((R,P)=>{l(j=>({...j,[R]:P}));let A=t.fields[R];if(A)if((P==null?"":String(P)).trim().length>0){let U=ed(P,A);u(se=>{let V={...se};return U?V[R]=U:delete V[R],V})}else u(U=>{let se={...U};return delete se[R],se})},[t.fields]),I=_(async()=>{let R={},P={};for(let[A,j]of Object.entries(i))if((j==null?"":String(j)).trim().length>0){let se=t.fields[A];if(se){let V=ed(j,se);V?R[A]=V:P[A]=j}}if(Object.keys(R).length>0){u(R);return}if(Object.keys(P).length===0){p("Enter at least one field to save");return}f(!0),p(null),b(!1);try{let A=await fetch(`/api/integrations/${t.id}/config`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(P)});if(!A.ok){let j=await A.json().catch(()=>({error:"Save failed"}));j.errors?u(j.errors):p(j.error??"Save failed");return}b(!0),S.current&&clearTimeout(S.current),S.current=setTimeout(()=>b(!1),3e3),l(j=>{let U={...j};for(let[se,V]of Object.entries(t.fields))V.sensitive&&delete U[se];return U}),await w()}catch(A){p(A instanceof Error?A.message:"Save failed")}finally{f(!1)}},[i,t,w]),E=_(async()=>{x(!0);try{let R=await fetch(`/api/integrations/${t.id}/config`,{method:"DELETE"});if(!R.ok){let P=await R.json().catch(()=>({error:"Remove failed"}));p(P.error??"Remove failed");return}l({}),y(!1),await w()}catch(R){p(R instanceof Error?R.message:"Remove failed")}finally{x(!1)}},[t.id,w]),D=Object.entries(i).some(([,R])=>(R==null?"":String(R)).trim().length>0),M=a?.configured??!1;return s?e("div",{class:"intg-container"},e("div",{class:"loading"},`Loading ${t.name} configuration...`)):e("div",{class:"intg-container"},e("button",{type:"button",class:"intg-back-btn",onClick:n},"\u2190 All Integrations"),e("div",{class:"intg-header"},e(te,{product:"rex",title:`${t.name} Integration`}),e("p",{class:"intg-subtitle"},t.description)),d?e("div",{class:"intg-error-banner"},d):null,v?e("div",{class:"intg-toast"},e("span",{class:"intg-toast-icon"},"\u2714"),"Configuration saved"):null,T.map(({groupKey:R,group:P,fields:A})=>e("div",{key:R??"__ungrouped",class:"intg-section"},P?e("h3",{class:"intg-section-title"},P.icon?e("span",{class:"intg-section-icon"},P.icon):null,P.label):null,P?.description?e("p",{class:"intg-section-desc"},P.description):null,A.map(({key:j,schema:U})=>e(ay,{key:j,fieldKey:j,schema:U,value:i[j],error:c[j],configured:M,masked:a?.masked[j],onInput:C})))),e("div",{class:"intg-actions"},e("div",{class:"intg-actions-primary"},e("button",{type:"button",class:"intg-save-btn",onClick:I,disabled:m||!D},m?"Saving...":"Save Configuration")),M?e("div",{class:"intg-actions-danger"},g?e(Q,null,e("span",{class:"intg-confirm-text"},`Remove ${t.name} config?`),e("button",{type:"button",class:"intg-confirm-yes",onClick:E,disabled:h},h?"Removing...":"Yes, Remove"),e("button",{type:"button",class:"intg-confirm-no",onClick:()=>y(!1)},"Cancel")):e("button",{type:"button",class:"intg-remove-btn",onClick:()=>y(!0)},"Remove Configuration")):null),M&&Object.keys(a?.envVars??{}).length>0?e("div",{class:"intg-section"},e("div",{class:"intg-env-hint"},e("span",{class:"intg-env-hint-icon"},"\u{1F512}"),e("div",{class:"intg-env-hint-content"},e("p",{class:"intg-env-hint-title"},"Credentials stored securely"),e("p",{class:"intg-env-hint-desc"},"Sensitive fields are redacted on disk. Set these environment variables at runtime:"),Object.entries(a.envVars).map(([R,P])=>e("code",{key:R,class:"intg-env-hint-code"},`export ${P}="your-${R}"`))))):null,t.setupGuide&&t.setupGuide.length>0?e("div",{class:"intg-section intg-help"},e("h3",{class:"intg-section-title"},e("span",{class:"intg-section-icon"},"\u2139"),"Setup Guide"),e("ol",{class:"intg-steps"},t.setupGuide.map((R,P)=>e("li",{key:P},R))),t.docsUrl?e("p",{class:"intg-docs-link"},e("a",{href:t.docsUrl,target:"_blank",rel:"noopener noreferrer"},`${t.name} documentation \u2192`)):null):null)}function iy({schema:t,configured:n,onClick:s}){return e("div",{class:`intg-card${n?" intg-card-configured":""}`,onClick:s,role:"button",tabIndex:0,onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),s())}},e("div",{class:"intg-card-icon"},t.icon??"\u{1F50C}"),e("div",{class:"intg-card-content"},e("div",{class:"intg-card-header"},e("h3",{class:"intg-card-name"},t.name),n?e("span",{class:"intg-card-badge"},"\u2714 Configured"):null,t.builtIn?e("span",{class:"intg-card-builtin"},"Built-in"):null),e("p",{class:"intg-card-desc"},t.description),e("div",{class:"intg-card-meta"},e("span",null,`${Object.keys(t.fields).length} fields`),t.supportsConnectionTest?e("span",null,"\u2022 Connection test"):null)),e("span",{class:"intg-card-arrow"},"\u203A"))}function Ko(){let[t,n]=k(!0),[s,r]=k([]),[a,o]=k(new Set),[i,l]=k(null),[c,u]=k(null),d=_(async()=>{try{let m=await fetch("/api/integrations");if(!m.ok){u("Failed to load integrations");return}let f=await m.json();r(f.integrations);let v=new Set;for(let b of f.integrations)try{let g=await fetch(`/api/integrations/${b.id}/config`);g.ok&&(await g.json()).configured&&v.add(b.id)}catch{}o(v)}catch(m){u(m instanceof Error?m.message:"Failed to load integrations")}finally{n(!1)}},[]);F(()=>{d()},[d]);let p=B(()=>s.find(m=>m.id===i)??null,[s,i]);return p?e(oy,{schema:p,onBack:()=>{l(null),d()}}):t?e("div",{class:"intg-container"},e("div",{class:"loading"},"Loading integrations...")):e("div",{class:"intg-container"},e("div",{class:"intg-header"},e(te,{product:"rex",title:"Integrations"}),e("p",{class:"intg-subtitle"},"Connect external services to sync PRD data bidirectionally.")),c?e("div",{class:"intg-error-banner"},c):null,e("div",{class:"intg-list"},s.map(m=>e(iy,{key:m.id,schema:m,configured:a.has(m.id),onClick:()=>l(m.id)}))),s.length===0?e("div",{class:"intg-empty"},e("p",null,"No integrations available."),e("p",{class:"intg-empty-hint"},"Integration schemas are registered by the rex adapter system.")):null)}var ly={sourcevision:{label:"SourceVision",icon:"\u25A3",description:"Static analysis, file inventory, import graph, and zone detection"},rex:{label:"Rex",icon:"\u25A8",description:"PRD management, task tracking, and analysis proposals"},hench:{label:"Hench",icon:"\u25B6",description:"Autonomous agent execution, retry policies, and guard rails"}},cy=["sourcevision","rex","hench"],td={experimental:{label:"Experimental",class:"ft-badge-experimental"},stable:{label:"Stable",class:"ft-badge-stable"},deprecated:{label:"Deprecated",class:"ft-badge-deprecated"}};function uy({toggle:t,onToggle:n,saving:s}){let r=s===t.key,a=t.enabled!==t.defaultValue,o=td[t.stability]??td.stable,i=_(()=>{n(t.key,!t.enabled)},[t.key,t.enabled,n]);return e("div",{class:`ft-toggle-item${a?" ft-toggle-modified":""}`},e("div",{class:"ft-toggle-header"},e("div",{class:"ft-toggle-title-row"},e("span",{class:"ft-toggle-label"},t.label),e("span",{class:`ft-badge ${o.class}`},o.label),a?e("span",{class:"ft-badge ft-badge-modified"},"modified"):null),e("label",{class:"ft-toggle-switch"},e("input",{type:"checkbox",checked:t.enabled,onChange:i,disabled:r,"aria-label":`Toggle ${t.label}`}),e("span",{class:"ft-toggle-slider"}),e("span",{class:"ft-toggle-status"},r?"Saving...":t.enabled?"Enabled":"Disabled"))),e("p",{class:"ft-toggle-desc"},t.description),e("div",{class:"ft-toggle-impact"},e("span",{class:"ft-toggle-impact-icon","aria-hidden":"true"},"\u26A0"),e("span",null,t.impact)))}function dy({pkg:t,toggles:n,onToggle:s,saving:r}){let a=ly[t]??{label:t,icon:"\u2022",description:""};return e("div",{class:"ft-package-section"},e("div",{class:`ft-package-header ft-package-${t}`},e("span",{class:"ft-package-icon"},a.icon),e("div",null,e("h3",{class:"ft-package-title"},a.label),e("p",{class:"ft-package-desc"},a.description))),e("div",{class:"ft-toggle-list"},...n.map(o=>e(uy,{key:o.key,toggle:o,onToggle:s,saving:r}))))}function py({message:t}){return t?e("div",{class:"ft-toast",role:"status","aria-live":"polite"},e("span",{class:"ft-toast-icon"},"\u2714"),e("span",null,t)):null}function fy({toggles:t}){let n=t.length,s=t.filter(o=>o.enabled).length,r=t.filter(o=>o.stability==="experimental").length,a=t.filter(o=>o.enabled!==o.defaultValue).length;return e("div",{class:"ft-stats"},e("div",{class:"ft-stat"},e("span",{class:"ft-stat-value"},String(s)),e("span",{class:"ft-stat-label"},`of ${n} enabled`)),e("div",{class:"ft-stat"},e("span",{class:"ft-stat-value"},String(r)),e("span",{class:"ft-stat-label"},"experimental")),e("div",{class:"ft-stat"},e("span",{class:"ft-stat-value"},String(a)),e("span",{class:"ft-stat-label"},"modified from defaults")))}function Yo(){let[t,n]=k([]),[s,r]=k(!0),[a,o]=k(null),[i,l]=k(null),[c,u]=k(null),d=H(null),p=_(async()=>{try{let v=await fetch("/api/features");if(!v.ok){let g=await v.json().catch(()=>({error:"Failed to load"}));o(g.error??"Failed to load feature toggles");return}let b=await v.json();n(b.toggles),o(null)}catch(v){o(v instanceof Error?v.message:"Failed to load feature toggles")}finally{r(!1)}},[]);F(()=>{p()},[p]),F(()=>()=>{d.current&&clearTimeout(d.current)},[]);let m=_(async(v,b)=>{l(v),o(null);try{let g=await fetch("/api/features",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({changes:{[v]:b}})});if(!g.ok){let S=await g.json().catch(()=>({error:"Save failed"}));o(S.error??"Failed to save");return}n(S=>S.map(T=>T.key===v?{...T,enabled:b}:T)),window.dispatchEvent(new CustomEvent("feature-toggle-changed",{detail:{key:v,enabled:b}}));let h=t.find(S=>S.key===v)?.label??v;u(`${h} ${b?"enabled":"disabled"}`),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>u(null),3e3)}catch(g){o(g instanceof Error?g.message:"Failed to save")}finally{l(null)}},[t]);if(s)return e("div",{class:"ft-container"},e("div",{class:"loading"},"Loading feature toggles..."));if(a&&t.length===0)return e("div",{class:"ft-container"},e("div",{class:"ft-header"},e("div",{class:"ft-header-brand"},e(Zt,{size:16,class:"ft-header-logo"}),e("span",{class:"ft-header-title"},"Feature Flags"))),e("div",{class:"ft-error-state"},e("p",null,a),e("p",{class:"ft-error-hint"},"Make sure the n-dx server is running. Run ",e("code",null,"ndx start .")," to start it.")));let f=new Map;for(let v of t)f.has(v.package)||f.set(v.package,[]),f.get(v.package).push(v);return e("div",{class:"ft-container"},e("div",{class:"ft-header"},e("div",{class:"ft-header-brand"},e(Zt,{size:16,class:"ft-header-logo"}),e("span",{class:"ft-header-title"},"Feature Flags")),e("p",{class:"ft-header-subtitle"},"Manage experimental and stable features across all n-dx packages. ","Changes apply immediately without restart.")),a?e("div",{class:"ft-error-banner"},a):null,e(fy,{toggles:t}),...cy.filter(v=>f.has(v)).map(v=>e(dy,{key:v,pkg:v,toggles:f.get(v),onToggle:m,saving:i})),e("div",{class:"ft-legend"},e("span",{class:"ft-legend-title"},"Stability Levels:"),e("span",{class:"ft-badge ft-badge-stable"},"Stable"),e("span",{class:"ft-legend-sep"},"\u2014 Production-ready features"),e("span",{class:"ft-badge ft-badge-experimental"},"Experimental"),e("span",{class:"ft-legend-sep"},"\u2014 May change or have rough edges"),e("span",{class:"ft-badge ft-badge-deprecated"},"Deprecated"),e("span",{class:"ft-legend-sep"},"\u2014 Will be removed in a future version")),e(py,{message:c}))}var my={overview:({data:t})=>e(vo,{data:t}),graph:({data:t,setDetail:n,selectedFile:s,selectedZone:r,navigateTo:a,isFeatureDisabled:o})=>o("graphRendering")?e("div",{class:"degraded-view-placeholder",role:"status"},e("h2",null,"Graph view unavailable"),e("p",null,"The graph view has been temporarily disabled to conserve memory. It will be re-enabled automatically when memory usage decreases, or you can refresh the page.")):e(bo,{data:t,onSelect:n,selectedFile:s,selectedZone:r,navigateTo:a}),zones:({data:t,setDetail:n,navigateTo:s})=>e(So,{data:t,onSelect:n,navigateTo:s}),files:({data:t,setDetail:n,selectedFile:s,setSelectedFile:r,selectedZone:a,navigateTo:o})=>e(Co,{data:t,onSelect:n,selectedFile:s,setSelectedFile:r,selectedZone:a,navigateTo:o}),routes:({data:t})=>e(_o,{data:t}),architecture:({data:t,setDetail:n,navigateTo:s})=>e(To,{data:t,onSelect:n,navigateTo:s}),problems:({data:t})=>e(Ro,{data:t}),suggestions:({data:t})=>e(Eo,{data:t}),"pr-markdown":()=>e(Io,null),"rex-dashboard":({navigateTo:t})=>e(Oo,{navigateTo:t}),prd:({setDetail:t,setPrdDetailContent:n,selectedTaskId:s,navigateTo:r})=>e(No,{onSelectItem:t,onDetailContent:n,initialTaskId:s,navigateTo:r}),"token-usage":()=>e(Vo,null),validation:({navigateTo:t})=>e(zo,{navigateTo:t}),"notion-config":()=>e(qo,null),integrations:()=>e(Ko,null),"hench-runs":({navigateTo:t,selectedRunId:n})=>e(Uo,{navigateTo:t,initialRunId:n}),"hench-audit":({navigateTo:t})=>e(Ho,{navigateTo:t}),"hench-config":()=>e(Go,null),"hench-templates":()=>e(Wo,null),"hench-optimization":()=>e(Zo,null),"feature-toggles":()=>e(Yo,null)};function nd(t,n){let s=my[t];return s?s(n):null}var sd={sourcevision:Nc,rex:["rex-dashboard","prd","validation","notion-config","integrations"],hench:["hench-runs","hench-audit","hench-config","hench-templates","hench-optimization"]},rd=["token-usage","feature-toggles"],gy=new Set([...Object.values(sd).flat(),...rd]);function ad(t){return!t||t==="all"?gy:new Set([...sd[t]??[],...rd])}jc();async function hy(){try{let t=await fetch("/api/config");return t.ok?(await t.json()).scope??null:null}catch{return null}}var id="sidebar-collapsed";function vy(){try{return localStorage.getItem(id)==="true"}catch{return!1}}function by({scope:t}){let n=B(()=>ad(t),[t]),{view:s,selectedFile:r,setSelectedFile:a,selectedZone:o,selectedRunId:i,selectedTaskId:l,navigateTo:c,handleSidebarNav:u}=mc(n),{snapshot:d,level:p,showWarning:m,dismiss:f}=Ml(),{tier:v,isDegraded:b,summary:g,disabledFeatures:y,isDisabled:h}=_l(),{state:x}=uc(),{isSuspended:S,suspendedCount:T}=Ol(),[w,,C]=oo(),{data:I,loading:E,refreshToast:D,showDrop:M}=ml({pausePolling:h("autoRefresh")}),{showRecovery:R,crashLoop:P,recentCrashCount:A,recoveredState:j,dismiss:U,restore:se}=kl({view:s,selectedFile:r,selectedZone:o,selectedRunId:i,selectedTaskId:l}),[V,q]=k(null),[G,K]=k(!1),[N,$]=k(vy),[z,O]=k(null),X=()=>{let ce=se();ce&&c(ce.view,{file:ce.selectedFile??void 0,zone:ce.selectedZone??void 0,runId:ce.selectedRunId??void 0,taskId:ce.selectedTaskId??void 0})},ue=_(()=>{window.location.reload()},[]),pe=()=>{$(ce=>{let ot=!ce;try{localStorage.setItem(id,String(ot))}catch{}return ot})};F(()=>{b&&K(!1)},[v]),F(()=>{let ce=document.documentElement;return h("animations")?ce.classList.add("degradation-no-animations"):ce.classList.remove("degradation-no-animations"),()=>{ce.classList.remove("degradation-no-animations")}},[h]),F(()=>{document.getElementById("main-content")?.scrollTo(0,0)},[s]),F(()=>{Ya(s)},[s]);let ve=I.manifest||I.inventory||I.imports||I.zones,le=b&&!G&&!m;return e(Q,null,e(Ua,{visible:R,crashLoop:P,recentCrashCount:A,recoveredState:j,onDismiss:U,onRestore:X}),e(Wa,{snapshot:d,level:p,visible:m,onDismiss:f}),e(Ga,{tier:v,isDegraded:b,summary:g,disabledFeatures:y,visible:le,onDismiss:()=>K(!0)}),e("a",{href:"#main-content",class:"skip-link"},"Skip to main content"),e(uo,{view:s,onNavigate:u,manifest:I.manifest,zones:I.zones,sidebarCollapsed:N,onToggleSidebar:pe,scope:t}),e("main",{id:"main-content",class:"main",role:"main","aria-label":"Main content"},e("div",{class:"page-context-bar",role:"group","aria-label":"Page navigation and help"},e(qa,{view:s,navigateTo:c,scope:t}),e("div",{class:"page-context-actions"},e(po,{view:s}))),E?e("div",{class:"loading",role:"status","aria-live":"polite"},"Loading..."):nd(s,{data:I,setDetail:q,setPrdDetailContent:O,selectedFile:r,setSelectedFile:a,selectedZone:o,selectedRunId:i,selectedTaskId:l,navigateTo:c,isFeatureDisabled:h})),h("detailPanel")?null:e(Za,{detail:V,data:I,navigateTo:c,onClose:()=>{q(null),O(null)},prdDetailContent:z}),D&&!h("autoRefresh")?e("div",{class:"refresh-toast",role:"status","aria-live":"polite"},"Data updated"):null,e(eo,{state:x,visible:!h("autoRefresh")}),e(Qa,{isSuspended:S,suspendedCount:T,onRefresh:ue}),M&&!ve?e("div",{class:"drop-overlay",role:"dialog","aria-label":"File drop zone"},e("div",{class:"drop-box"},e("h2",null,"Drop .sourcevision files"),e("p",null,`Drag and drop ${Tr.join(", ")}`))):null,e(ao,{visible:w,onClose:C,navigateTo:c}))}var od=document.getElementById("app");od&&hy().then(t=>{mi(e(by,{scope:t}),od)});
34
+ </script>
35
+ </body>
36
+ </html>