claude-code-workflow 7.2.15 → 7.2.16

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 (526) hide show
  1. package/.ccw/workflows/cli-templates/schemas/team-tasks-schema.json +255 -0
  2. package/.codex/agents/team-supervisor.toml +39 -0
  3. package/.codex/agents/team-worker.toml +46 -0
  4. package/.codex/skills/team-arch-opt/SKILL.md +151 -698
  5. package/.codex/skills/team-arch-opt/roles/analyzer/role.md +78 -0
  6. package/.codex/skills/team-arch-opt/roles/coordinator/commands/analyze.md +57 -0
  7. package/.codex/skills/team-arch-opt/roles/coordinator/commands/dispatch.md +287 -0
  8. package/.codex/skills/team-arch-opt/roles/coordinator/commands/monitor.md +204 -0
  9. package/.codex/skills/team-arch-opt/roles/coordinator/role.md +162 -0
  10. package/.codex/skills/team-arch-opt/roles/designer/role.md +115 -0
  11. package/.codex/skills/team-arch-opt/roles/refactorer/role.md +102 -0
  12. package/.codex/skills/team-arch-opt/roles/reviewer/role.md +111 -0
  13. package/.codex/skills/team-arch-opt/roles/validator/role.md +115 -0
  14. package/.codex/skills/team-arch-opt/specs/pipelines.md +102 -0
  15. package/.codex/skills/team-arch-opt/specs/team-config.json +263 -0
  16. package/.codex/skills/team-brainstorm/SKILL.md +167 -724
  17. package/.codex/skills/team-brainstorm/roles/challenger/role.md +61 -0
  18. package/.codex/skills/team-brainstorm/roles/coordinator/commands/analyze.md +58 -0
  19. package/.codex/skills/team-brainstorm/roles/coordinator/commands/dispatch.md +162 -0
  20. package/.codex/skills/team-brainstorm/roles/coordinator/commands/monitor.md +171 -0
  21. package/.codex/skills/team-brainstorm/roles/coordinator/role.md +140 -0
  22. package/.codex/skills/team-brainstorm/roles/evaluator/role.md +56 -0
  23. package/.codex/skills/team-brainstorm/roles/ideator/role.md +69 -0
  24. package/.codex/skills/team-brainstorm/roles/synthesizer/role.md +57 -0
  25. package/.codex/skills/team-brainstorm/specs/pipelines.md +72 -0
  26. package/.codex/skills/team-brainstorm/specs/team-config.json +86 -0
  27. package/.codex/skills/team-coordinate/SKILL.md +267 -667
  28. package/.codex/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +247 -0
  29. package/.codex/skills/team-coordinate/roles/coordinator/commands/dispatch.md +126 -0
  30. package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +327 -0
  31. package/.codex/skills/team-coordinate/roles/coordinator/role.md +361 -0
  32. package/.codex/skills/team-coordinate/specs/knowledge-transfer.md +111 -0
  33. package/.codex/skills/team-coordinate/specs/pipelines.md +97 -0
  34. package/.codex/skills/team-coordinate/specs/quality-gates.md +112 -0
  35. package/.codex/skills/team-coordinate/specs/role-spec-template.md +192 -0
  36. package/.codex/skills/team-designer/SKILL.md +153 -691
  37. package/.codex/skills/team-designer/phases/01-requirements-analysis.md +250 -0
  38. package/.codex/skills/team-designer/phases/02-scaffold-generation.md +228 -0
  39. package/.codex/skills/team-designer/phases/03-content-generation.md +330 -0
  40. package/.codex/skills/team-designer/phases/04-validation.md +320 -0
  41. package/.codex/skills/team-executor/SKILL.md +191 -515
  42. package/.codex/skills/team-executor/roles/executor/commands/monitor.md +280 -0
  43. package/.codex/skills/team-executor/roles/executor/role.md +170 -0
  44. package/.codex/skills/team-executor/specs/session-schema.md +264 -0
  45. package/.codex/skills/team-frontend/SKILL.md +129 -750
  46. package/.codex/skills/team-frontend/roles/analyst/role.md +92 -0
  47. package/.codex/skills/team-frontend/roles/architect/role.md +86 -0
  48. package/.codex/skills/team-frontend/roles/coordinator/commands/analyze.md +52 -0
  49. package/.codex/skills/team-frontend/roles/coordinator/commands/dispatch.md +151 -0
  50. package/.codex/skills/team-frontend/roles/coordinator/commands/monitor.md +188 -0
  51. package/.codex/skills/team-frontend/roles/coordinator/role.md +157 -0
  52. package/.codex/skills/team-frontend/roles/developer/role.md +93 -0
  53. package/.codex/skills/team-frontend/roles/qa/role.md +79 -0
  54. package/.codex/skills/team-frontend/specs/pipelines.md +76 -0
  55. package/.codex/skills/team-frontend/specs/team-config.json +84 -0
  56. package/.codex/skills/team-frontend-debug/SKILL.md +191 -821
  57. package/.codex/skills/team-frontend-debug/roles/analyzer/role.md +208 -0
  58. package/.codex/skills/team-frontend-debug/roles/coordinator/commands/analyze.md +174 -0
  59. package/.codex/skills/team-frontend-debug/roles/coordinator/commands/dispatch.md +198 -0
  60. package/.codex/skills/team-frontend-debug/roles/coordinator/commands/monitor.md +143 -0
  61. package/.codex/skills/team-frontend-debug/roles/coordinator/role.md +131 -0
  62. package/.codex/skills/team-frontend-debug/roles/fixer/role.md +147 -0
  63. package/.codex/skills/team-frontend-debug/roles/reproducer/role.md +147 -0
  64. package/.codex/skills/team-frontend-debug/roles/tester/role.md +231 -0
  65. package/.codex/skills/team-frontend-debug/roles/verifier/role.md +172 -0
  66. package/.codex/skills/team-frontend-debug/specs/debug-tools.md +215 -0
  67. package/.codex/skills/team-frontend-debug/specs/pipelines.md +94 -0
  68. package/.codex/skills/team-issue/SKILL.md +166 -751
  69. package/.codex/skills/team-issue/roles/coordinator/commands/analyze.md +64 -0
  70. package/.codex/skills/team-issue/roles/coordinator/commands/dispatch.md +273 -0
  71. package/.codex/skills/team-issue/roles/coordinator/commands/monitor.md +194 -0
  72. package/.codex/skills/team-issue/roles/coordinator/role.md +175 -0
  73. package/.codex/skills/team-issue/roles/explorer/role.md +94 -0
  74. package/.codex/skills/team-issue/roles/implementer/role.md +87 -0
  75. package/.codex/skills/team-issue/roles/integrator/role.md +84 -0
  76. package/.codex/skills/team-issue/roles/planner/role.md +81 -0
  77. package/.codex/skills/team-issue/roles/reviewer/role.md +86 -0
  78. package/.codex/skills/team-issue/specs/pipelines.md +124 -0
  79. package/.codex/skills/team-issue/specs/team-config.json +70 -0
  80. package/.codex/skills/team-iterdev/SKILL.md +134 -825
  81. package/.codex/skills/team-iterdev/roles/architect/role.md +65 -0
  82. package/.codex/skills/team-iterdev/roles/coordinator/commands/analyze.md +62 -0
  83. package/.codex/skills/team-iterdev/roles/coordinator/commands/dispatch.md +187 -0
  84. package/.codex/skills/team-iterdev/roles/coordinator/commands/monitor.md +186 -0
  85. package/.codex/skills/team-iterdev/roles/coordinator/role.md +161 -0
  86. package/.codex/skills/team-iterdev/roles/developer/role.md +74 -0
  87. package/.codex/skills/team-iterdev/roles/reviewer/role.md +66 -0
  88. package/.codex/skills/team-iterdev/roles/tester/role.md +88 -0
  89. package/.codex/skills/team-iterdev/specs/pipelines.md +94 -0
  90. package/.codex/skills/team-iterdev/specs/team-config.json +172 -0
  91. package/.codex/skills/team-lifecycle-v4/MIGRATION-PLAN.md +512 -0
  92. package/.codex/skills/team-lifecycle-v4/SKILL.md +166 -723
  93. package/.codex/skills/team-lifecycle-v4/roles/analyst/role.md +104 -0
  94. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/analyze.md +56 -0
  95. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +61 -0
  96. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +177 -0
  97. package/.codex/skills/team-lifecycle-v4/roles/coordinator/role.md +152 -0
  98. package/.codex/skills/team-lifecycle-v4/roles/executor/commands/fix.md +35 -0
  99. package/.codex/skills/team-lifecycle-v4/roles/executor/commands/implement.md +63 -0
  100. package/.codex/skills/team-lifecycle-v4/roles/executor/role.md +89 -0
  101. package/.codex/skills/team-lifecycle-v4/roles/planner/role.md +108 -0
  102. package/.codex/skills/team-lifecycle-v4/roles/reviewer/commands/review-code.md +57 -0
  103. package/.codex/skills/team-lifecycle-v4/roles/reviewer/commands/review-spec.md +44 -0
  104. package/.codex/skills/team-lifecycle-v4/roles/reviewer/role.md +98 -0
  105. package/.codex/skills/team-lifecycle-v4/roles/supervisor/role.md +210 -0
  106. package/.codex/skills/team-lifecycle-v4/roles/tester/role.md +126 -0
  107. package/.codex/skills/team-lifecycle-v4/roles/writer/role.md +125 -0
  108. package/.codex/skills/team-lifecycle-v4/schemas/tasks-schema.md +82 -160
  109. package/.codex/skills/team-lifecycle-v4/specs/knowledge-transfer.md +136 -0
  110. package/.codex/skills/team-lifecycle-v4/specs/pipelines.md +125 -0
  111. package/.codex/skills/team-lifecycle-v4/specs/quality-gates.md +130 -0
  112. package/.codex/skills/team-perf-opt/SKILL.md +169 -697
  113. package/.codex/skills/team-perf-opt/roles/benchmarker/role.md +89 -0
  114. package/.codex/skills/team-perf-opt/roles/coordinator/commands/analyze.md +61 -0
  115. package/.codex/skills/team-perf-opt/roles/coordinator/commands/dispatch.md +262 -0
  116. package/.codex/skills/team-perf-opt/roles/coordinator/commands/monitor.md +320 -0
  117. package/.codex/skills/team-perf-opt/roles/coordinator/role.md +147 -0
  118. package/.codex/skills/team-perf-opt/roles/optimizer/role.md +97 -0
  119. package/.codex/skills/team-perf-opt/roles/profiler/role.md +73 -0
  120. package/.codex/skills/team-perf-opt/roles/reviewer/role.md +75 -0
  121. package/.codex/skills/team-perf-opt/roles/strategist/role.md +94 -0
  122. package/.codex/skills/team-perf-opt/specs/pipelines.md +65 -0
  123. package/.codex/skills/team-perf-opt/specs/team-config.json +246 -0
  124. package/.codex/skills/team-planex/SKILL.md +103 -477
  125. package/.codex/skills/team-planex/roles/coordinator/commands/analyze.md +52 -0
  126. package/.codex/skills/team-planex/roles/coordinator/commands/dispatch.md +80 -0
  127. package/.codex/skills/team-planex/roles/coordinator/commands/monitor.md +164 -0
  128. package/.codex/skills/team-planex/roles/coordinator/role.md +140 -0
  129. package/.codex/skills/team-planex/roles/executor/role.md +91 -0
  130. package/.codex/skills/team-planex/roles/planner/role.md +112 -0
  131. package/.codex/skills/team-planex/specs/pipelines.md +93 -0
  132. package/.codex/skills/team-quality-assurance/SKILL.md +148 -813
  133. package/.codex/skills/team-quality-assurance/roles/analyst/role.md +80 -0
  134. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/analyze.md +72 -0
  135. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +108 -0
  136. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +209 -0
  137. package/.codex/skills/team-quality-assurance/roles/coordinator/role.md +143 -0
  138. package/.codex/skills/team-quality-assurance/roles/executor/role.md +66 -0
  139. package/.codex/skills/team-quality-assurance/roles/generator/role.md +68 -0
  140. package/.codex/skills/team-quality-assurance/roles/scout/role.md +67 -0
  141. package/.codex/skills/team-quality-assurance/roles/strategist/role.md +71 -0
  142. package/.codex/skills/team-quality-assurance/specs/pipelines.md +115 -0
  143. package/.codex/skills/team-quality-assurance/specs/team-config.json +131 -0
  144. package/.codex/skills/team-review/SKILL.md +148 -533
  145. package/.codex/skills/team-review/roles/coordinator/commands/analyze.md +71 -0
  146. package/.codex/skills/team-review/roles/coordinator/commands/dispatch.md +90 -0
  147. package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +185 -0
  148. package/.codex/skills/team-review/roles/coordinator/role.md +142 -0
  149. package/.codex/skills/team-review/roles/fixer/role.md +76 -0
  150. package/.codex/skills/team-review/roles/reviewer/role.md +68 -0
  151. package/.codex/skills/team-review/roles/scanner/role.md +71 -0
  152. package/.codex/skills/team-review/specs/dimensions.md +82 -0
  153. package/.codex/skills/team-review/specs/finding-schema.json +82 -0
  154. package/.codex/skills/team-review/specs/pipelines.md +102 -0
  155. package/.codex/skills/team-review/specs/team-config.json +27 -0
  156. package/.codex/skills/team-roadmap-dev/SKILL.md +162 -683
  157. package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/analyze.md +61 -0
  158. package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/dispatch.md +241 -0
  159. package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/monitor.md +468 -0
  160. package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/pause.md +90 -0
  161. package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/resume.md +137 -0
  162. package/.codex/skills/team-roadmap-dev/roles/coordinator/commands/roadmap-discuss.md +243 -0
  163. package/.codex/skills/team-roadmap-dev/roles/coordinator/role.md +303 -0
  164. package/.codex/skills/team-roadmap-dev/roles/executor/role.md +71 -0
  165. package/.codex/skills/team-roadmap-dev/roles/planner/role.md +76 -0
  166. package/.codex/skills/team-roadmap-dev/roles/verifier/role.md +74 -0
  167. package/.codex/skills/team-roadmap-dev/specs/pipelines.md +93 -0
  168. package/.codex/skills/team-roadmap-dev/specs/team-config.json +95 -0
  169. package/.codex/skills/team-tech-debt/SKILL.md +129 -708
  170. package/.codex/skills/team-tech-debt/roles/assessor/role.md +69 -0
  171. package/.codex/skills/team-tech-debt/roles/coordinator/commands/analyze.md +47 -0
  172. package/.codex/skills/team-tech-debt/roles/coordinator/commands/dispatch.md +163 -0
  173. package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +231 -0
  174. package/.codex/skills/team-tech-debt/roles/coordinator/role.md +141 -0
  175. package/.codex/skills/team-tech-debt/roles/executor/role.md +76 -0
  176. package/.codex/skills/team-tech-debt/roles/planner/role.md +69 -0
  177. package/.codex/skills/team-tech-debt/roles/scanner/role.md +82 -0
  178. package/.codex/skills/team-tech-debt/roles/validator/role.md +75 -0
  179. package/.codex/skills/team-tech-debt/specs/pipelines.md +47 -0
  180. package/.codex/skills/team-tech-debt/specs/team-config.json +129 -0
  181. package/.codex/skills/team-testing/SKILL.md +144 -769
  182. package/.codex/skills/team-testing/roles/analyst/role.md +95 -0
  183. package/.codex/skills/team-testing/roles/coordinator/commands/analyze.md +70 -0
  184. package/.codex/skills/team-testing/roles/coordinator/commands/dispatch.md +106 -0
  185. package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +242 -0
  186. package/.codex/skills/team-testing/roles/coordinator/role.md +151 -0
  187. package/.codex/skills/team-testing/roles/executor/role.md +96 -0
  188. package/.codex/skills/team-testing/roles/generator/role.md +95 -0
  189. package/.codex/skills/team-testing/roles/strategist/role.md +83 -0
  190. package/.codex/skills/team-testing/specs/pipelines.md +101 -0
  191. package/.codex/skills/team-testing/specs/team-config.json +93 -0
  192. package/.codex/skills/team-uidesign/SKILL.md +133 -767
  193. package/.codex/skills/team-uidesign/roles/coordinator/commands/analyze.md +59 -0
  194. package/.codex/skills/team-uidesign/roles/coordinator/commands/dispatch.md +156 -0
  195. package/.codex/skills/team-uidesign/roles/coordinator/commands/monitor.md +194 -0
  196. package/.codex/skills/team-uidesign/roles/coordinator/role.md +179 -0
  197. package/.codex/skills/team-uidesign/roles/designer/role.md +69 -0
  198. package/.codex/skills/team-uidesign/roles/implementer/role.md +72 -0
  199. package/.codex/skills/team-uidesign/roles/researcher/role.md +82 -0
  200. package/.codex/skills/team-uidesign/roles/reviewer/role.md +67 -0
  201. package/.codex/skills/team-uidesign/specs/pipelines.md +76 -0
  202. package/.codex/skills/team-uidesign/specs/team-config.json +107 -0
  203. package/.codex/skills/team-ultra-analyze/SKILL.md +166 -786
  204. package/.codex/skills/team-ultra-analyze/roles/analyst/role.md +90 -0
  205. package/.codex/skills/team-ultra-analyze/roles/coordinator/commands/analyze.md +73 -0
  206. package/.codex/skills/team-ultra-analyze/roles/coordinator/commands/dispatch.md +225 -0
  207. package/.codex/skills/team-ultra-analyze/roles/coordinator/commands/monitor.md +327 -0
  208. package/.codex/skills/team-ultra-analyze/roles/coordinator/role.md +223 -0
  209. package/.codex/skills/team-ultra-analyze/roles/discussant/role.md +104 -0
  210. package/.codex/skills/team-ultra-analyze/roles/explorer/role.md +74 -0
  211. package/.codex/skills/team-ultra-analyze/roles/synthesizer/role.md +78 -0
  212. package/.codex/skills/team-ultra-analyze/specs/pipelines.md +64 -0
  213. package/.codex/skills/team-ultra-analyze/specs/team-config.json +129 -0
  214. package/.codex/skills/team-ux-improve/SKILL.md +142 -638
  215. package/.codex/skills/team-ux-improve/roles/coordinator/commands/analyze.md +62 -0
  216. package/.codex/skills/team-ux-improve/roles/coordinator/commands/dispatch.md +233 -0
  217. package/.codex/skills/team-ux-improve/roles/coordinator/commands/monitor.md +160 -0
  218. package/.codex/skills/team-ux-improve/roles/coordinator/role.md +138 -0
  219. package/.codex/skills/team-ux-improve/roles/designer/role.md +122 -0
  220. package/.codex/skills/team-ux-improve/roles/diagnoser/role.md +93 -0
  221. package/.codex/skills/team-ux-improve/roles/explorer/role.md +77 -0
  222. package/.codex/skills/team-ux-improve/roles/implementer/role.md +102 -0
  223. package/.codex/skills/team-ux-improve/roles/scanner/role.md +93 -0
  224. package/.codex/skills/team-ux-improve/roles/tester/role.md +84 -0
  225. package/.codex/skills/team-ux-improve/specs/pipelines.md +54 -0
  226. package/.codex/skills/team-ux-improve/specs/team-config.json +181 -0
  227. package/.codex/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +17 -0
  228. package/.codex/skills/team-ux-improve/wisdom/contributions/.gitkeep +0 -0
  229. package/.codex/skills/team-ux-improve/wisdom/patterns/state-management.md +14 -0
  230. package/.codex/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +16 -0
  231. package/.codex/skills/team-ux-improve/wisdom/principles/general-ux.md +16 -0
  232. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
  233. package/ccw/dist/core/routes/cli-settings-routes.js +135 -133
  234. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -1
  235. package/ccw/frontend/dist/assets/{AlertDialog-BW9jiZ-p.js → AlertDialog-CnpjWAGm.js} +2 -2
  236. package/ccw/frontend/dist/assets/{AlertDialog-BW9jiZ-p.js.map → AlertDialog-CnpjWAGm.js.map} +1 -1
  237. package/ccw/frontend/dist/assets/{AnalysisPage-ds-w_nVO.js → AnalysisPage-BT2rDDUD.js} +2 -2
  238. package/ccw/frontend/dist/assets/{AnalysisPage-ds-w_nVO.js.map → AnalysisPage-BT2rDDUD.js.map} +1 -1
  239. package/ccw/frontend/dist/assets/{ApiSettingsPage-DlCbXxTz.js → ApiSettingsPage-DGpjiNVu.js} +2 -2
  240. package/ccw/frontend/dist/assets/{ApiSettingsPage-DlCbXxTz.js.map → ApiSettingsPage-DGpjiNVu.js.map} +1 -1
  241. package/ccw/frontend/dist/assets/{CliModeToggle-Dq3nL4fF.js → CliModeToggle-BqUadHn3.js} +2 -2
  242. package/ccw/frontend/dist/assets/{CliModeToggle-Dq3nL4fF.js.map → CliModeToggle-BqUadHn3.js.map} +1 -1
  243. package/ccw/frontend/dist/assets/{CliSessionSharePage-BNDkEE4u.js → CliSessionSharePage-C3AdsDkm.js} +2 -2
  244. package/ccw/frontend/dist/assets/{CliSessionSharePage-BNDkEE4u.js.map → CliSessionSharePage-C3AdsDkm.js.map} +1 -1
  245. package/ccw/frontend/dist/assets/{CliViewerPage-ChM-uNx_.js → CliViewerPage-BZXpgY0N.js} +2 -2
  246. package/ccw/frontend/dist/assets/{CliViewerPage-ChM-uNx_.js.map → CliViewerPage-BZXpgY0N.js.map} +1 -1
  247. package/ccw/frontend/dist/assets/{CodexLensPage-DOcsYNQk.js → CodexLensPage-CePoJz-u.js} +2 -2
  248. package/ccw/frontend/dist/assets/{CodexLensPage-DOcsYNQk.js.map → CodexLensPage-CePoJz-u.js.map} +1 -1
  249. package/ccw/frontend/dist/assets/{Collapsible-CRNbykXN.js → Collapsible-DXVzWwmb.js} +2 -2
  250. package/ccw/frontend/dist/assets/{Collapsible-CRNbykXN.js.map → Collapsible-DXVzWwmb.js.map} +1 -1
  251. package/ccw/frontend/dist/assets/{CommandsManagerPage-C2JWcemF.js → CommandsManagerPage-B6wJYF0z.js} +2 -2
  252. package/ccw/frontend/dist/assets/{CommandsManagerPage-C2JWcemF.js.map → CommandsManagerPage-B6wJYF0z.js.map} +1 -1
  253. package/ccw/frontend/dist/assets/{DeepWikiPage-CvleOtJy.js → DeepWikiPage-D55fcvSk.js} +2 -2
  254. package/ccw/frontend/dist/assets/{DeepWikiPage-CvleOtJy.js.map → DeepWikiPage-D55fcvSk.js.map} +1 -1
  255. package/ccw/frontend/dist/assets/{EndpointsPage-CMOWQG64.js → EndpointsPage-DcGziJ5t.js} +2 -2
  256. package/ccw/frontend/dist/assets/{EndpointsPage-CMOWQG64.js.map → EndpointsPage-DcGziJ5t.js.map} +1 -1
  257. package/ccw/frontend/dist/assets/{ExplorerPage-DaFPRlNo.js → ExplorerPage-C4eKzn7F.js} +2 -2
  258. package/ccw/frontend/dist/assets/{ExplorerPage-DaFPRlNo.js.map → ExplorerPage-C4eKzn7F.js.map} +1 -1
  259. package/ccw/frontend/dist/assets/{FixSessionPage-CC4p04Az.js → FixSessionPage-BUHh954A.js} +2 -2
  260. package/ccw/frontend/dist/assets/{FixSessionPage-CC4p04Az.js.map → FixSessionPage-BUHh954A.js.map} +1 -1
  261. package/ccw/frontend/dist/assets/{FloatingFileBrowser-DROn1xZ5.js → FloatingFileBrowser-C3GF_u1C.js} +2 -2
  262. package/ccw/frontend/dist/assets/{FloatingFileBrowser-DROn1xZ5.js.map → FloatingFileBrowser-C3GF_u1C.js.map} +1 -1
  263. package/ccw/frontend/dist/assets/{FloatingPanel-CmL_yhDv.js → FloatingPanel-Cn-q9PyJ.js} +2 -2
  264. package/ccw/frontend/dist/assets/{FloatingPanel-CmL_yhDv.js.map → FloatingPanel-Cn-q9PyJ.js.map} +1 -1
  265. package/ccw/frontend/dist/assets/{GraphExplorerPage-DCV5ybKE.js → GraphExplorerPage-DIpqgvoU.js} +2 -2
  266. package/ccw/frontend/dist/assets/{GraphExplorerPage-DCV5ybKE.js.map → GraphExplorerPage-DIpqgvoU.js.map} +1 -1
  267. package/ccw/frontend/dist/assets/{HistoryPage-D0fYQZgc.js → HistoryPage-DzSvEAFe.js} +2 -2
  268. package/ccw/frontend/dist/assets/{HistoryPage-D0fYQZgc.js.map → HistoryPage-DzSvEAFe.js.map} +1 -1
  269. package/ccw/frontend/dist/assets/{HookManagerPage-D2FuJfsM.js → HookManagerPage-C6LDhWrH.js} +2 -2
  270. package/ccw/frontend/dist/assets/{HookManagerPage-D2FuJfsM.js.map → HookManagerPage-C6LDhWrH.js.map} +1 -1
  271. package/ccw/frontend/dist/assets/{InstallationsPage-tjklillZ.js → InstallationsPage-D9ct9xFV.js} +2 -2
  272. package/ccw/frontend/dist/assets/{InstallationsPage-tjklillZ.js.map → InstallationsPage-D9ct9xFV.js.map} +1 -1
  273. package/ccw/frontend/dist/assets/{IssueHubPage-E4JVrhO1.js → IssueHubPage-CXgDC8pS.js} +2 -2
  274. package/ccw/frontend/dist/assets/{IssueHubPage-E4JVrhO1.js.map → IssueHubPage-CXgDC8pS.js.map} +1 -1
  275. package/ccw/frontend/dist/assets/{LiteTasksPage-aJuRoyLt.js → LiteTasksPage-DMkauCwG.js} +2 -2
  276. package/ccw/frontend/dist/assets/{LiteTasksPage-aJuRoyLt.js.map → LiteTasksPage-DMkauCwG.js.map} +1 -1
  277. package/ccw/frontend/dist/assets/{McpManagerPage-BJeuWJv1.js → McpManagerPage-DhLDydgc.js} +2 -2
  278. package/ccw/frontend/dist/assets/{McpManagerPage-BJeuWJv1.js.map → McpManagerPage-DhLDydgc.js.map} +1 -1
  279. package/ccw/frontend/dist/assets/{MemoryPage-BI4FAXhs.js → MemoryPage-Be3nhq40.js} +2 -2
  280. package/ccw/frontend/dist/assets/{MemoryPage-BI4FAXhs.js.map → MemoryPage-Be3nhq40.js.map} +1 -1
  281. package/ccw/frontend/dist/assets/{NotFoundPage-DD2svchp.js → NotFoundPage-0yGnCePd.js} +2 -2
  282. package/ccw/frontend/dist/assets/{NotFoundPage-DD2svchp.js.map → NotFoundPage-0yGnCePd.js.map} +1 -1
  283. package/ccw/frontend/dist/assets/{OrchestratorPage-FC__7yYa.js → OrchestratorPage-_SmXZcGl.js} +2 -2
  284. package/ccw/frontend/dist/assets/{OrchestratorPage-FC__7yYa.js.map → OrchestratorPage-_SmXZcGl.js.map} +1 -1
  285. package/ccw/frontend/dist/assets/{ProjectOverviewPage-DBB_-FzV.js → ProjectOverviewPage-BeXTMsdo.js} +2 -2
  286. package/ccw/frontend/dist/assets/{ProjectOverviewPage-DBB_-FzV.js.map → ProjectOverviewPage-BeXTMsdo.js.map} +1 -1
  287. package/ccw/frontend/dist/assets/{PromptHistoryPage-BwOAvCH8.js → PromptHistoryPage-DS6ycuAv.js} +2 -2
  288. package/ccw/frontend/dist/assets/{PromptHistoryPage-BwOAvCH8.js.map → PromptHistoryPage-DS6ycuAv.js.map} +1 -1
  289. package/ccw/frontend/dist/assets/{ReviewSessionPage-Dd1-g_gp.js → ReviewSessionPage-BoqyjhPo.js} +2 -2
  290. package/ccw/frontend/dist/assets/{ReviewSessionPage-Dd1-g_gp.js.map → ReviewSessionPage-BoqyjhPo.js.map} +1 -1
  291. package/ccw/frontend/dist/assets/{RulesManagerPage-B3RGdsKD.js → RulesManagerPage-DMAwkKlc.js} +2 -2
  292. package/ccw/frontend/dist/assets/{RulesManagerPage-B3RGdsKD.js.map → RulesManagerPage-DMAwkKlc.js.map} +1 -1
  293. package/ccw/frontend/dist/assets/{SessionDetailPage-DM-W5R8K.js → SessionDetailPage-BgJRHIF4.js} +2 -2
  294. package/ccw/frontend/dist/assets/{SessionDetailPage-DM-W5R8K.js.map → SessionDetailPage-BgJRHIF4.js.map} +1 -1
  295. package/ccw/frontend/dist/assets/{SessionsPage-BVz1KCc7.js → SessionsPage-DBPdWlji.js} +2 -2
  296. package/ccw/frontend/dist/assets/{SessionsPage-BVz1KCc7.js.map → SessionsPage-DBPdWlji.js.map} +1 -1
  297. package/ccw/frontend/dist/assets/{SettingsPage-ComW7EZS.js → SettingsPage-BY3QiJhm.js} +4 -4
  298. package/ccw/frontend/dist/assets/{SettingsPage-ComW7EZS.js.map → SettingsPage-BY3QiJhm.js.map} +1 -1
  299. package/ccw/frontend/dist/assets/{SkillsManagerPage-CKom9XwV.js → SkillsManagerPage-DS101Adm.js} +2 -2
  300. package/ccw/frontend/dist/assets/{SkillsManagerPage-CKom9XwV.js.map → SkillsManagerPage-DS101Adm.js.map} +1 -1
  301. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DQz7WP2s.js → SpecsSettingsPage-BcsLu1qq.js} +2 -2
  302. package/ccw/frontend/dist/assets/{SpecsSettingsPage-DQz7WP2s.js.map → SpecsSettingsPage-BcsLu1qq.js.map} +1 -1
  303. package/ccw/frontend/dist/assets/{Switch-BPMdND9H.js → Switch-BL9AmNPC.js} +2 -2
  304. package/ccw/frontend/dist/assets/{Switch-BPMdND9H.js.map → Switch-BL9AmNPC.js.map} +1 -1
  305. package/ccw/frontend/dist/assets/{TabsNavigation-qqt70VYL.js → TabsNavigation-BUcjsLeE.js} +2 -2
  306. package/ccw/frontend/dist/assets/{TabsNavigation-qqt70VYL.js.map → TabsNavigation-BUcjsLeE.js.map} +1 -1
  307. package/ccw/frontend/dist/assets/{TaskDrawer-BqK_qiHX.js → TaskDrawer-BNvfS6dq.js} +2 -2
  308. package/ccw/frontend/dist/assets/{TaskDrawer-BqK_qiHX.js.map → TaskDrawer-BNvfS6dq.js.map} +1 -1
  309. package/ccw/frontend/dist/assets/{TeamPage-u5_i0Rgh.js → TeamPage-CT-zNCrF.js} +2 -2
  310. package/ccw/frontend/dist/assets/{TeamPage-u5_i0Rgh.js.map → TeamPage-CT-zNCrF.js.map} +1 -1
  311. package/ccw/frontend/dist/assets/{TerminalDashboardPage-rUtC9e40.js → TerminalDashboardPage-DfZFGs8g.js} +2 -2
  312. package/ccw/frontend/dist/assets/{TerminalDashboardPage-rUtC9e40.js.map → TerminalDashboardPage-DfZFGs8g.js.map} +1 -1
  313. package/ccw/frontend/dist/assets/{archive-C3u8YNQF.js → archive-Cev1SaQq.js} +2 -2
  314. package/ccw/frontend/dist/assets/{archive-C3u8YNQF.js.map → archive-Cev1SaQq.js.map} +1 -1
  315. package/ccw/frontend/dist/assets/{archive-restore-DfQ998g5.js → archive-restore-BIVluaHZ.js} +2 -2
  316. package/ccw/frontend/dist/assets/{archive-restore-DfQ998g5.js.map → archive-restore-BIVluaHZ.js.map} +1 -1
  317. package/ccw/frontend/dist/assets/{arrow-right-BshJM9Po.js → arrow-right-DrivbS5j.js} +2 -2
  318. package/ccw/frontend/dist/assets/{arrow-right-BshJM9Po.js.map → arrow-right-DrivbS5j.js.map} +1 -1
  319. package/ccw/frontend/dist/assets/{bookmark-plus-D03qJyOZ.js → bookmark-plus-DKyzL0Xg.js} +2 -2
  320. package/ccw/frontend/dist/assets/{bookmark-plus-D03qJyOZ.js.map → bookmark-plus-DKyzL0Xg.js.map} +1 -1
  321. package/ccw/frontend/dist/assets/{bot-CyzWuwq0.js → bot-GBUkPAe3.js} +2 -2
  322. package/ccw/frontend/dist/assets/{bot-CyzWuwq0.js.map → bot-GBUkPAe3.js.map} +1 -1
  323. package/ccw/frontend/dist/assets/{braces-BPgtyjsG.js → braces-BWhm2c4g.js} +2 -2
  324. package/ccw/frontend/dist/assets/{braces-BPgtyjsG.js.map → braces-BWhm2c4g.js.map} +1 -1
  325. package/ccw/frontend/dist/assets/{circle-stop-Dix1AOmw.js → circle-stop-CBcZSKNp.js} +2 -2
  326. package/ccw/frontend/dist/assets/{circle-stop-Dix1AOmw.js.map → circle-stop-CBcZSKNp.js.map} +1 -1
  327. package/ccw/frontend/dist/assets/{cpu-CCQ4Q0Zh.js → cpu-CzNmuTZD.js} +2 -2
  328. package/ccw/frontend/dist/assets/{cpu-CCQ4Q0Zh.js.map → cpu-CzNmuTZD.js.map} +1 -1
  329. package/ccw/frontend/dist/assets/{ellipsis-vertical-BpTysg-Y.js → ellipsis-vertical-BoIyQKaI.js} +2 -2
  330. package/ccw/frontend/dist/assets/{ellipsis-vertical-BpTysg-Y.js.map → ellipsis-vertical-BoIyQKaI.js.map} +1 -1
  331. package/ccw/frontend/dist/assets/{eye-DGY1rAZs.js → eye-BqxyhxQq.js} +2 -2
  332. package/ccw/frontend/dist/assets/{eye-DGY1rAZs.js.map → eye-BqxyhxQq.js.map} +1 -1
  333. package/ccw/frontend/dist/assets/{eye-off-D8t3JfWG.js → eye-off-D9dTZP1A.js} +2 -2
  334. package/ccw/frontend/dist/assets/{eye-off-D8t3JfWG.js.map → eye-off-D9dTZP1A.js.map} +1 -1
  335. package/ccw/frontend/dist/assets/{file-json-BAdJb0n8.js → file-json-CLYEUI6e.js} +2 -2
  336. package/ccw/frontend/dist/assets/{file-json-BAdJb0n8.js.map → file-json-CLYEUI6e.js.map} +1 -1
  337. package/ccw/frontend/dist/assets/{file-text-DrJFiOUB.js → file-text-D5j9C5XC.js} +2 -2
  338. package/ccw/frontend/dist/assets/{file-text-DrJFiOUB.js.map → file-text-D5j9C5XC.js.map} +1 -1
  339. package/ccw/frontend/dist/assets/{filter-CKqzYbz7.js → filter-CEUK5jsA.js} +2 -2
  340. package/ccw/frontend/dist/assets/{filter-CKqzYbz7.js.map → filter-CEUK5jsA.js.map} +1 -1
  341. package/ccw/frontend/dist/assets/{folder-CV8511y9.js → folder-BEOY8txM.js} +2 -2
  342. package/ccw/frontend/dist/assets/{folder-CV8511y9.js.map → folder-BEOY8txM.js.map} +1 -1
  343. package/ccw/frontend/dist/assets/{gauge-XKvmu_uU.js → gauge-CbumHmVn.js} +2 -2
  344. package/ccw/frontend/dist/assets/{gauge-XKvmu_uU.js.map → gauge-CbumHmVn.js.map} +1 -1
  345. package/ccw/frontend/dist/assets/{globe-C56cDUzX.js → globe-D8_IB9gV.js} +2 -2
  346. package/ccw/frontend/dist/assets/{globe-C56cDUzX.js.map → globe-D8_IB9gV.js.map} +1 -1
  347. package/ccw/frontend/dist/assets/{grid-3x3-Bya-suFW.js → grid-3x3-BpzWmYF5.js} +2 -2
  348. package/ccw/frontend/dist/assets/{grid-3x3-Bya-suFW.js.map → grid-3x3-BpzWmYF5.js.map} +1 -1
  349. package/ccw/frontend/dist/assets/{hard-drive-CmuTZpsB.js → hard-drive-QIHpGln7.js} +2 -2
  350. package/ccw/frontend/dist/assets/{hard-drive-CmuTZpsB.js.map → hard-drive-QIHpGln7.js.map} +1 -1
  351. package/ccw/frontend/dist/assets/{hash-CRPT_tJQ.js → hash-CP0YRHVs.js} +2 -2
  352. package/ccw/frontend/dist/assets/{hash-CRPT_tJQ.js.map → hash-CP0YRHVs.js.map} +1 -1
  353. package/ccw/frontend/dist/assets/{history-C1pJZQCL.js → history-hOjgVKax.js} +2 -2
  354. package/ccw/frontend/dist/assets/{history-C1pJZQCL.js.map → history-hOjgVKax.js.map} +1 -1
  355. package/ccw/frontend/dist/assets/{index-Dmt9OiEf.js → index-B_ysvdnP.js} +2 -2
  356. package/ccw/frontend/dist/assets/{index-Dmt9OiEf.js.map → index-B_ysvdnP.js.map} +1 -1
  357. package/ccw/frontend/dist/assets/{index-dWT2M6Ef.js → index-C5Oqx2xI.js} +3 -3
  358. package/ccw/frontend/dist/assets/{index-dWT2M6Ef.js.map → index-C5Oqx2xI.js.map} +1 -1
  359. package/ccw/frontend/dist/assets/{index-CI8-rBff.js → index-CJi0bWL-.js} +2 -2
  360. package/ccw/frontend/dist/assets/{index-CI8-rBff.js.map → index-CJi0bWL-.js.map} +1 -1
  361. package/ccw/frontend/dist/assets/{index-anSMmEF8.js → index-CdQpo1x0.js} +2 -2
  362. package/ccw/frontend/dist/assets/{index-anSMmEF8.js.map → index-CdQpo1x0.js.map} +1 -1
  363. package/ccw/frontend/dist/assets/{layout-grid-TSO0BFQE.js → layout-grid-C38fQyLs.js} +2 -2
  364. package/ccw/frontend/dist/assets/{layout-grid-TSO0BFQE.js.map → layout-grid-C38fQyLs.js.map} +1 -1
  365. package/ccw/frontend/dist/assets/{lightbulb-Caj6fIQD.js → lightbulb-CClbCUzu.js} +2 -2
  366. package/ccw/frontend/dist/assets/{lightbulb-Caj6fIQD.js.map → lightbulb-CClbCUzu.js.map} +1 -1
  367. package/ccw/frontend/dist/assets/{link-2-DE9lMxa-.js → link-2-CB-LKbI0.js} +2 -2
  368. package/ccw/frontend/dist/assets/{link-2-DE9lMxa-.js.map → link-2-CB-LKbI0.js.map} +1 -1
  369. package/ccw/frontend/dist/assets/{link-BZtPgLW0.js → link-BK6SBzHS.js} +2 -2
  370. package/ccw/frontend/dist/assets/{link-BZtPgLW0.js.map → link-BK6SBzHS.js.map} +1 -1
  371. package/ccw/frontend/dist/assets/{list-DubWyY-U.js → list-BME_WOA_.js} +2 -2
  372. package/ccw/frontend/dist/assets/{list-DubWyY-U.js.map → list-BME_WOA_.js.map} +1 -1
  373. package/ccw/frontend/dist/assets/{map-pin-DwN_48AF.js → map-pin-ADsnCyjJ.js} +2 -2
  374. package/ccw/frontend/dist/assets/{map-pin-DwN_48AF.js.map → map-pin-ADsnCyjJ.js.map} +1 -1
  375. package/ccw/frontend/dist/assets/{messages-square-bjxvaiM9.js → messages-square-CLflB1Cq.js} +2 -2
  376. package/ccw/frontend/dist/assets/{messages-square-bjxvaiM9.js.map → messages-square-CLflB1Cq.js.map} +1 -1
  377. package/ccw/frontend/dist/assets/{minimize-2-CGfBKD_V.js → minimize-2-B3ZNzfGr.js} +2 -2
  378. package/ccw/frontend/dist/assets/{minimize-2-CGfBKD_V.js.map → minimize-2-B3ZNzfGr.js.map} +1 -1
  379. package/ccw/frontend/dist/assets/{package-nzWY6ilt.js → package-CByPhtMG.js} +2 -2
  380. package/ccw/frontend/dist/assets/{package-nzWY6ilt.js.map → package-CByPhtMG.js.map} +1 -1
  381. package/ccw/frontend/dist/assets/{plug-CiLce49C.js → plug-BggRzPX9.js} +2 -2
  382. package/ccw/frontend/dist/assets/{plug-CiLce49C.js.map → plug-BggRzPX9.js.map} +1 -1
  383. package/ccw/frontend/dist/assets/{power-CFLmB-U9.js → power-CWuxQSJK.js} +2 -2
  384. package/ccw/frontend/dist/assets/{power-CFLmB-U9.js.map → power-CWuxQSJK.js.map} +1 -1
  385. package/ccw/frontend/dist/assets/{save-DuO6OF0C.js → save-BdJ6EX4Q.js} +2 -2
  386. package/ccw/frontend/dist/assets/{save-DuO6OF0C.js.map → save-BdJ6EX4Q.js.map} +1 -1
  387. package/ccw/frontend/dist/assets/{send-CZk9p0mM.js → send-Ce9wuY7Q.js} +2 -2
  388. package/ccw/frontend/dist/assets/{send-CZk9p0mM.js.map → send-Ce9wuY7Q.js.map} +1 -1
  389. package/ccw/frontend/dist/assets/{square-check-big-BY_1YQQg.js → square-check-big-D6jItkfw.js} +2 -2
  390. package/ccw/frontend/dist/assets/{square-check-big-BY_1YQQg.js.map → square-check-big-D6jItkfw.js.map} +1 -1
  391. package/ccw/frontend/dist/assets/{square-pen-CnZgm6g-.js → square-pen-Byxq21zp.js} +2 -2
  392. package/ccw/frontend/dist/assets/{square-pen-CnZgm6g-.js.map → square-pen-Byxq21zp.js.map} +1 -1
  393. package/ccw/frontend/dist/assets/{star-Cn1F0qy7.js → star-Codj9dvK.js} +2 -2
  394. package/ccw/frontend/dist/assets/{star-Cn1F0qy7.js.map → star-Codj9dvK.js.map} +1 -1
  395. package/ccw/frontend/dist/assets/{style-Dxs1iXCV.js → style-4bYpUGcc.js} +2 -2
  396. package/ccw/frontend/dist/assets/{style-Dxs1iXCV.js.map → style-4bYpUGcc.js.map} +1 -1
  397. package/ccw/frontend/dist/assets/{target-Bz1fLRKH.js → target-DKBoDNCn.js} +2 -2
  398. package/ccw/frontend/dist/assets/{target-Bz1fLRKH.js.map → target-DKBoDNCn.js.map} +1 -1
  399. package/ccw/frontend/dist/assets/{test-tube-C6qCYlDr.js → test-tube-DTqZcBtA.js} +2 -2
  400. package/ccw/frontend/dist/assets/{test-tube-C6qCYlDr.js.map → test-tube-DTqZcBtA.js.map} +1 -1
  401. package/ccw/frontend/dist/assets/{upload-C71kd4Qs.js → upload-DlUl-e6b.js} +2 -2
  402. package/ccw/frontend/dist/assets/{upload-C71kd4Qs.js.map → upload-DlUl-e6b.js.map} +1 -1
  403. package/ccw/frontend/dist/assets/{useApiSettings-CqP2BAJ7.js → useApiSettings-D4zhKKT-.js} +2 -2
  404. package/ccw/frontend/dist/assets/{useApiSettings-CqP2BAJ7.js.map → useApiSettings-D4zhKKT-.js.map} +1 -1
  405. package/ccw/frontend/dist/assets/{useCli-PCoPoVeM.js → useCli-D-qDwsAH.js} +2 -2
  406. package/ccw/frontend/dist/assets/{useCli-PCoPoVeM.js.map → useCli-D-qDwsAH.js.map} +1 -1
  407. package/ccw/frontend/dist/assets/{useCommands-3OfPQPw4.js → useCommands-B0sidbbW.js} +2 -2
  408. package/ccw/frontend/dist/assets/{useCommands-3OfPQPw4.js.map → useCommands-B0sidbbW.js.map} +1 -1
  409. package/ccw/frontend/dist/assets/{useDebounce-bXiFhQx9.js → useDebounce-eTtbKevt.js} +2 -2
  410. package/ccw/frontend/dist/assets/{useDebounce-bXiFhQx9.js.map → useDebounce-eTtbKevt.js.map} +1 -1
  411. package/ccw/frontend/dist/assets/{useFileExplorer-DEyUm46_.js → useFileExplorer-MGSK0h33.js} +2 -2
  412. package/ccw/frontend/dist/assets/{useFileExplorer-DEyUm46_.js.map → useFileExplorer-MGSK0h33.js.map} +1 -1
  413. package/ccw/frontend/dist/assets/{useLocale-sXTrdxcJ.js → useLocale-DDNxU7pJ.js} +2 -2
  414. package/ccw/frontend/dist/assets/{useLocale-sXTrdxcJ.js.map → useLocale-DDNxU7pJ.js.map} +1 -1
  415. package/ccw/frontend/dist/assets/{useSkills-D0W0kXYm.js → useSkills-CZCRBtMY.js} +3 -3
  416. package/ccw/frontend/dist/assets/{useSkills-D0W0kXYm.js.map → useSkills-CZCRBtMY.js.map} +1 -1
  417. package/ccw/frontend/dist/assets/{useSystemSettings-DZ-8lZsG.js → useSystemSettings-DfQEFXSD.js} +2 -2
  418. package/ccw/frontend/dist/assets/{useSystemSettings-DZ-8lZsG.js.map → useSystemSettings-DfQEFXSD.js.map} +1 -1
  419. package/ccw/frontend/dist/assets/{wand-sparkles-83GmAYuw.js → wand-sparkles-DCLvfgl1.js} +2 -2
  420. package/ccw/frontend/dist/assets/{wand-sparkles-83GmAYuw.js.map → wand-sparkles-DCLvfgl1.js.map} +1 -1
  421. package/ccw/frontend/dist/index.html +1 -1
  422. package/package.json +1 -1
  423. package/.codex/skills/team-arch-opt/agents/completion-handler.md +0 -138
  424. package/.codex/skills/team-arch-opt/agents/fix-cycle-handler.md +0 -146
  425. package/.codex/skills/team-arch-opt/agents/plan-reviewer.md +0 -150
  426. package/.codex/skills/team-arch-opt/instructions/agent-instruction.md +0 -114
  427. package/.codex/skills/team-arch-opt/schemas/tasks-schema.md +0 -174
  428. package/.codex/skills/team-brainstorm/agents/gc-controller.md +0 -122
  429. package/.codex/skills/team-brainstorm/agents/topic-clarifier.md +0 -126
  430. package/.codex/skills/team-brainstorm/instructions/agent-instruction.md +0 -105
  431. package/.codex/skills/team-brainstorm/schemas/tasks-schema.md +0 -171
  432. package/.codex/skills/team-coordinate/agents/completion-handler.md +0 -127
  433. package/.codex/skills/team-coordinate/agents/plan-reviewer.md +0 -145
  434. package/.codex/skills/team-coordinate/instructions/agent-instruction.md +0 -184
  435. package/.codex/skills/team-coordinate/schemas/tasks-schema.md +0 -165
  436. package/.codex/skills/team-designer/agents/requirement-clarifier.md +0 -247
  437. package/.codex/skills/team-designer/agents/validation-reporter.md +0 -186
  438. package/.codex/skills/team-designer/instructions/agent-instruction.md +0 -163
  439. package/.codex/skills/team-designer/schemas/tasks-schema.md +0 -180
  440. package/.codex/skills/team-executor/instructions/agent-instruction.md +0 -62
  441. package/.codex/skills/team-executor/schemas/tasks-schema.md +0 -141
  442. package/.codex/skills/team-frontend/agents/completion-handler.md +0 -131
  443. package/.codex/skills/team-frontend/agents/qa-gate-reviewer.md +0 -153
  444. package/.codex/skills/team-frontend/instructions/agent-instruction.md +0 -197
  445. package/.codex/skills/team-frontend/schemas/tasks-schema.md +0 -188
  446. package/.codex/skills/team-frontend-debug/agents/completion-handler.md +0 -142
  447. package/.codex/skills/team-frontend-debug/agents/conditional-skip-gate.md +0 -130
  448. package/.codex/skills/team-frontend-debug/agents/iteration-handler.md +0 -120
  449. package/.codex/skills/team-frontend-debug/instructions/agent-instruction.md +0 -272
  450. package/.codex/skills/team-frontend-debug/schemas/tasks-schema.md +0 -198
  451. package/.codex/skills/team-issue/agents/reviewer.md +0 -204
  452. package/.codex/skills/team-issue/instructions/agent-instruction.md +0 -198
  453. package/.codex/skills/team-issue/schemas/tasks-schema.md +0 -198
  454. package/.codex/skills/team-iterdev/agents/gc-controller.md +0 -193
  455. package/.codex/skills/team-iterdev/agents/task-analyzer.md +0 -206
  456. package/.codex/skills/team-iterdev/instructions/agent-instruction.md +0 -118
  457. package/.codex/skills/team-iterdev/schemas/tasks-schema.md +0 -174
  458. package/.codex/skills/team-lifecycle/SKILL.md +0 -906
  459. package/.codex/skills/team-lifecycle/agents/analyst.md +0 -424
  460. package/.codex/skills/team-lifecycle/agents/architect.md +0 -274
  461. package/.codex/skills/team-lifecycle/agents/discuss-agent.md +0 -422
  462. package/.codex/skills/team-lifecycle/agents/executor.md +0 -423
  463. package/.codex/skills/team-lifecycle/agents/explore-agent.md +0 -471
  464. package/.codex/skills/team-lifecycle/agents/fe-developer.md +0 -239
  465. package/.codex/skills/team-lifecycle/agents/fe-qa.md +0 -357
  466. package/.codex/skills/team-lifecycle/agents/planner.md +0 -437
  467. package/.codex/skills/team-lifecycle/agents/reviewer.md +0 -483
  468. package/.codex/skills/team-lifecycle/agents/tester.md +0 -423
  469. package/.codex/skills/team-lifecycle/agents/writer.md +0 -502
  470. package/.codex/skills/team-lifecycle/phases/01-requirement-clarification.md +0 -209
  471. package/.codex/skills/team-lifecycle/phases/02-team-initialization.md +0 -263
  472. package/.codex/skills/team-lifecycle/phases/03-task-chain-creation.md +0 -251
  473. package/.codex/skills/team-lifecycle/phases/04-pipeline-coordination.md +0 -831
  474. package/.codex/skills/team-lifecycle/phases/05-completion-report.md +0 -309
  475. package/.codex/skills/team-lifecycle/specs/document-standards.md +0 -192
  476. package/.codex/skills/team-lifecycle/specs/quality-gates.md +0 -207
  477. package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +0 -165
  478. package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +0 -163
  479. package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +0 -182
  480. package/.codex/skills/team-perf-opt/agents/completion-handler.md +0 -141
  481. package/.codex/skills/team-perf-opt/agents/fix-cycle-handler.md +0 -156
  482. package/.codex/skills/team-perf-opt/agents/plan-reviewer.md +0 -150
  483. package/.codex/skills/team-perf-opt/instructions/agent-instruction.md +0 -122
  484. package/.codex/skills/team-perf-opt/schemas/tasks-schema.md +0 -174
  485. package/.codex/skills/team-planex/instructions/agent-instruction.md +0 -301
  486. package/.codex/skills/team-planex/schemas/tasks-schema.md +0 -198
  487. package/.codex/skills/team-planex-v2/SKILL.md +0 -652
  488. package/.codex/skills/team-planex-v2/instructions/agent-instruction.md +0 -193
  489. package/.codex/skills/team-planex-v2/schemas/tasks-schema.md +0 -206
  490. package/.codex/skills/team-quality-assurance/agents/executor.md +0 -192
  491. package/.codex/skills/team-quality-assurance/agents/gc-loop-handler.md +0 -163
  492. package/.codex/skills/team-quality-assurance/instructions/agent-instruction.md +0 -185
  493. package/.codex/skills/team-quality-assurance/schemas/tasks-schema.md +0 -190
  494. package/.codex/skills/team-review/agents/fixer.md +0 -360
  495. package/.codex/skills/team-review/instructions/agent-instruction.md +0 -102
  496. package/.codex/skills/team-review/schemas/tasks-schema.md +0 -143
  497. package/.codex/skills/team-roadmap-dev/agents/roadmap-discusser.md +0 -176
  498. package/.codex/skills/team-roadmap-dev/agents/roadmap-planner.md +0 -194
  499. package/.codex/skills/team-roadmap-dev/agents/roadmap-verifier.md +0 -221
  500. package/.codex/skills/team-roadmap-dev/instructions/executor-instruction.md +0 -55
  501. package/.codex/skills/team-roadmap-dev/schemas/tasks-schema.md +0 -144
  502. package/.codex/skills/team-tech-debt/agents/gc-loop-manager.md +0 -130
  503. package/.codex/skills/team-tech-debt/agents/plan-approver.md +0 -151
  504. package/.codex/skills/team-tech-debt/instructions/agent-instruction.md +0 -390
  505. package/.codex/skills/team-tech-debt/schemas/tasks-schema.md +0 -196
  506. package/.codex/skills/team-testing/agents/executor.md +0 -195
  507. package/.codex/skills/team-testing/agents/gc-loop-handler.md +0 -155
  508. package/.codex/skills/team-testing/instructions/agent-instruction.md +0 -142
  509. package/.codex/skills/team-testing/schemas/tasks-schema.md +0 -172
  510. package/.codex/skills/team-uidesign/agents/completion-handler.md +0 -177
  511. package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +0 -162
  512. package/.codex/skills/team-uidesign/instructions/agent-instruction.md +0 -509
  513. package/.codex/skills/team-uidesign/schemas/tasks-schema.md +0 -187
  514. package/.codex/skills/team-ultra-analyze/agents/discussion-feedback.md +0 -155
  515. package/.codex/skills/team-ultra-analyze/agents/topic-analyzer.md +0 -153
  516. package/.codex/skills/team-ultra-analyze/instructions/agent-instruction.md +0 -169
  517. package/.codex/skills/team-ultra-analyze/schemas/tasks-schema.md +0 -180
  518. package/.codex/skills/team-ux-improve/agents/ux-designer.md +0 -136
  519. package/.codex/skills/team-ux-improve/agents/ux-explorer.md +0 -158
  520. package/.codex/skills/team-ux-improve/agents/ux-tester.md +0 -174
  521. package/.codex/skills/team-ux-improve/instructions/ux-worker-instruction.md +0 -55
  522. package/.codex/skills/team-ux-improve/schemas/tasks-schema.md +0 -87
  523. /package/.codex/skills/{team-lifecycle/templates/architecture-doc.md → team-lifecycle-v4/templates/architecture.md} +0 -0
  524. /package/.codex/skills/{team-lifecycle/templates/epics-template.md → team-lifecycle-v4/templates/epics.md} +0 -0
  525. /package/.codex/skills/{team-lifecycle → team-lifecycle-v4}/templates/product-brief.md +0 -0
  526. /package/.codex/skills/{team-lifecycle/templates/requirements-prd.md → team-lifecycle-v4/templates/requirements.md} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AlertDialog-BW9jiZ-p.js","sources":["../../../../node_modules/@radix-ui/react-alert-dialog/dist/index.mjs","../../src/components/ui/AlertDialog.tsx"],"sourcesContent":["\"use client\";\n\n// src/alert-dialog.tsx\nimport * as React from \"react\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { createDialogScope } from \"@radix-ui/react-dialog\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createSlottable } from \"@radix-ui/react-slot\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar ROOT_NAME = \"AlertDialog\";\nvar [createAlertDialogContext, createAlertDialogScope] = createContextScope(ROOT_NAME, [\n createDialogScope\n]);\nvar useDialogScope = createDialogScope();\nvar AlertDialog = (props) => {\n const { __scopeAlertDialog, ...alertDialogProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...dialogScope, ...alertDialogProps, modal: true });\n};\nAlertDialog.displayName = ROOT_NAME;\nvar TRIGGER_NAME = \"AlertDialogTrigger\";\nvar AlertDialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...triggerProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { ...dialogScope, ...triggerProps, ref: forwardedRef });\n }\n);\nAlertDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"AlertDialogPortal\";\nvar AlertDialogPortal = (props) => {\n const { __scopeAlertDialog, ...portalProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { ...dialogScope, ...portalProps });\n};\nAlertDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"AlertDialogOverlay\";\nvar AlertDialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...overlayProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, { ...dialogScope, ...overlayProps, ref: forwardedRef });\n }\n);\nAlertDialogOverlay.displayName = OVERLAY_NAME;\nvar CONTENT_NAME = \"AlertDialogContent\";\nvar [AlertDialogContentProvider, useAlertDialogContentContext] = createAlertDialogContext(CONTENT_NAME);\nvar Slottable = createSlottable(\"AlertDialogContent\");\nvar AlertDialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, children, ...contentProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const cancelRef = React.useRef(null);\n return /* @__PURE__ */ jsx(\n DialogPrimitive.WarningProvider,\n {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"alert-dialog\",\n children: /* @__PURE__ */ jsx(AlertDialogContentProvider, { scope: __scopeAlertDialog, cancelRef, children: /* @__PURE__ */ jsxs(\n DialogPrimitive.Content,\n {\n role: \"alertdialog\",\n ...dialogScope,\n ...contentProps,\n ref: composedRefs,\n onOpenAutoFocus: composeEventHandlers(contentProps.onOpenAutoFocus, (event) => {\n event.preventDefault();\n cancelRef.current?.focus({ preventScroll: true });\n }),\n onPointerDownOutside: (event) => event.preventDefault(),\n onInteractOutside: (event) => event.preventDefault(),\n children: [\n /* @__PURE__ */ jsx(Slottable, { children }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef })\n ]\n }\n ) })\n }\n );\n }\n);\nAlertDialogContent.displayName = CONTENT_NAME;\nvar TITLE_NAME = \"AlertDialogTitle\";\nvar AlertDialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...titleProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Title, { ...dialogScope, ...titleProps, ref: forwardedRef });\n }\n);\nAlertDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"AlertDialogDescription\";\nvar AlertDialogDescription = React.forwardRef((props, forwardedRef) => {\n const { __scopeAlertDialog, ...descriptionProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Description, { ...dialogScope, ...descriptionProps, ref: forwardedRef });\n});\nAlertDialogDescription.displayName = DESCRIPTION_NAME;\nvar ACTION_NAME = \"AlertDialogAction\";\nvar AlertDialogAction = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...actionProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...actionProps, ref: forwardedRef });\n }\n);\nAlertDialogAction.displayName = ACTION_NAME;\nvar CANCEL_NAME = \"AlertDialogCancel\";\nvar AlertDialogCancel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...cancelProps } = props;\n const { cancelRef } = useAlertDialogContentContext(CANCEL_NAME, __scopeAlertDialog);\n const dialogScope = useDialogScope(__scopeAlertDialog);\n const ref = useComposedRefs(forwardedRef, cancelRef);\n return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...cancelProps, ref });\n }\n);\nAlertDialogCancel.displayName = CANCEL_NAME;\nvar DescriptionWarning = ({ contentRef }) => {\n const MESSAGE = `\\`${CONTENT_NAME}\\` requires a description for the component to be accessible for screen reader users.\n\nYou can add a description to the \\`${CONTENT_NAME}\\` by passing a \\`${DESCRIPTION_NAME}\\` component as a child, which also benefits sighted users by adding visible context to the dialog.\n\nAlternatively, you can use your own component as a description by assigning it an \\`id\\` and passing the same value to the \\`aria-describedby\\` prop in \\`${CONTENT_NAME}\\`. If the description is confusing or duplicative for sighted users, you can use the \\`@radix-ui/react-visually-hidden\\` primitive as a wrapper around your description component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;\n React.useEffect(() => {\n const hasDescription = document.getElementById(\n contentRef.current?.getAttribute(\"aria-describedby\")\n );\n if (!hasDescription) console.warn(MESSAGE);\n }, [MESSAGE, contentRef]);\n return null;\n};\nvar Root2 = AlertDialog;\nvar Trigger2 = AlertDialogTrigger;\nvar Portal2 = AlertDialogPortal;\nvar Overlay2 = AlertDialogOverlay;\nvar Content2 = AlertDialogContent;\nvar Action = AlertDialogAction;\nvar Cancel = AlertDialogCancel;\nvar Title2 = AlertDialogTitle;\nvar Description2 = AlertDialogDescription;\nexport {\n Action,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n Cancel,\n Content2 as Content,\n Description2 as Description,\n Overlay2 as Overlay,\n Portal2 as Portal,\n Root2 as Root,\n Title2 as Title,\n Trigger2 as Trigger,\n createAlertDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","// ========================================\r\n// AlertDialog Component\r\n// ========================================\r\n// Dialog component for confirmations and critical actions\r\n\r\nimport * as React from \"react\";\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst AlertDialog = AlertDialogPrimitive.Root;\r\n\r\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\r\n\r\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\r\n\r\nconst AlertDialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/60 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n));\r\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\r\n\r\nconst AlertDialogContent = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPortal>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-card p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AlertDialogPortal>\r\n));\r\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\r\n\r\nconst AlertDialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n);\r\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\r\n\r\nconst AlertDialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n);\r\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\r\n\r\nconst AlertDialogTitle = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold text-foreground\", className)}\r\n {...props}\r\n />\r\n));\r\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\r\n\r\nconst AlertDialogDescription = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n));\r\nAlertDialogDescription.displayName =\r\n AlertDialogPrimitive.Description.displayName;\r\n\r\nconst AlertDialogAction = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Action\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\r\n\r\nconst AlertDialogCancel = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Cancel\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 px-4 py-2 mt-2 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\r\n\r\nexport {\r\n AlertDialog,\r\n AlertDialogPortal,\r\n AlertDialogOverlay,\r\n AlertDialogTrigger,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n};\r\n"],"names":["ROOT_NAME","createAlertDialogContext","createContextScope","createDialogScope","useDialogScope","AlertDialog","props","__scopeAlertDialog","alertDialogProps","dialogScope","jsx","DialogPrimitive.Root","TRIGGER_NAME","AlertDialogTrigger","React.forwardRef","forwardedRef","triggerProps","DialogPrimitive.Trigger","PORTAL_NAME","AlertDialogPortal","portalProps","DialogPrimitive.Portal","OVERLAY_NAME","AlertDialogOverlay","overlayProps","DialogPrimitive.Overlay","CONTENT_NAME","AlertDialogContentProvider","useAlertDialogContentContext","Slottable","createSlottable","AlertDialogContent","children","contentProps","contentRef","React.useRef","composedRefs","useComposedRefs","cancelRef","DialogPrimitive.WarningProvider","TITLE_NAME","jsxs","DialogPrimitive.Content","composeEventHandlers","event","_a","DescriptionWarning","AlertDialogTitle","titleProps","DialogPrimitive.Title","DESCRIPTION_NAME","AlertDialogDescription","descriptionProps","DialogPrimitive.Description","ACTION_NAME","AlertDialogAction","actionProps","DialogPrimitive.Close","CANCEL_NAME","AlertDialogCancel","cancelProps","ref","MESSAGE","React.useEffect","Root2","Trigger2","Portal2","Overlay2","Content2","Action","Cancel","Title2","Description2","AlertDialogPrimitive.Root","AlertDialogPrimitive.Trigger","AlertDialogPrimitive.Portal","className","AlertDialogPrimitive.Overlay","cn","AlertDialogPrimitive.Content","AlertDialogHeader","AlertDialogFooter","AlertDialogPrimitive.Title","AlertDialogPrimitive.Description","AlertDialogPrimitive.Action","AlertDialogPrimitive.Cancel"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"AlertDialog-CnpjWAGm.js","sources":["../../../../node_modules/@radix-ui/react-alert-dialog/dist/index.mjs","../../src/components/ui/AlertDialog.tsx"],"sourcesContent":["\"use client\";\n\n// src/alert-dialog.tsx\nimport * as React from \"react\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { createDialogScope } from \"@radix-ui/react-dialog\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createSlottable } from \"@radix-ui/react-slot\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar ROOT_NAME = \"AlertDialog\";\nvar [createAlertDialogContext, createAlertDialogScope] = createContextScope(ROOT_NAME, [\n createDialogScope\n]);\nvar useDialogScope = createDialogScope();\nvar AlertDialog = (props) => {\n const { __scopeAlertDialog, ...alertDialogProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...dialogScope, ...alertDialogProps, modal: true });\n};\nAlertDialog.displayName = ROOT_NAME;\nvar TRIGGER_NAME = \"AlertDialogTrigger\";\nvar AlertDialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...triggerProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { ...dialogScope, ...triggerProps, ref: forwardedRef });\n }\n);\nAlertDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"AlertDialogPortal\";\nvar AlertDialogPortal = (props) => {\n const { __scopeAlertDialog, ...portalProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { ...dialogScope, ...portalProps });\n};\nAlertDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"AlertDialogOverlay\";\nvar AlertDialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...overlayProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, { ...dialogScope, ...overlayProps, ref: forwardedRef });\n }\n);\nAlertDialogOverlay.displayName = OVERLAY_NAME;\nvar CONTENT_NAME = \"AlertDialogContent\";\nvar [AlertDialogContentProvider, useAlertDialogContentContext] = createAlertDialogContext(CONTENT_NAME);\nvar Slottable = createSlottable(\"AlertDialogContent\");\nvar AlertDialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, children, ...contentProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const cancelRef = React.useRef(null);\n return /* @__PURE__ */ jsx(\n DialogPrimitive.WarningProvider,\n {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"alert-dialog\",\n children: /* @__PURE__ */ jsx(AlertDialogContentProvider, { scope: __scopeAlertDialog, cancelRef, children: /* @__PURE__ */ jsxs(\n DialogPrimitive.Content,\n {\n role: \"alertdialog\",\n ...dialogScope,\n ...contentProps,\n ref: composedRefs,\n onOpenAutoFocus: composeEventHandlers(contentProps.onOpenAutoFocus, (event) => {\n event.preventDefault();\n cancelRef.current?.focus({ preventScroll: true });\n }),\n onPointerDownOutside: (event) => event.preventDefault(),\n onInteractOutside: (event) => event.preventDefault(),\n children: [\n /* @__PURE__ */ jsx(Slottable, { children }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef })\n ]\n }\n ) })\n }\n );\n }\n);\nAlertDialogContent.displayName = CONTENT_NAME;\nvar TITLE_NAME = \"AlertDialogTitle\";\nvar AlertDialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...titleProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Title, { ...dialogScope, ...titleProps, ref: forwardedRef });\n }\n);\nAlertDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"AlertDialogDescription\";\nvar AlertDialogDescription = React.forwardRef((props, forwardedRef) => {\n const { __scopeAlertDialog, ...descriptionProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Description, { ...dialogScope, ...descriptionProps, ref: forwardedRef });\n});\nAlertDialogDescription.displayName = DESCRIPTION_NAME;\nvar ACTION_NAME = \"AlertDialogAction\";\nvar AlertDialogAction = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...actionProps } = props;\n const dialogScope = useDialogScope(__scopeAlertDialog);\n return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...actionProps, ref: forwardedRef });\n }\n);\nAlertDialogAction.displayName = ACTION_NAME;\nvar CANCEL_NAME = \"AlertDialogCancel\";\nvar AlertDialogCancel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeAlertDialog, ...cancelProps } = props;\n const { cancelRef } = useAlertDialogContentContext(CANCEL_NAME, __scopeAlertDialog);\n const dialogScope = useDialogScope(__scopeAlertDialog);\n const ref = useComposedRefs(forwardedRef, cancelRef);\n return /* @__PURE__ */ jsx(DialogPrimitive.Close, { ...dialogScope, ...cancelProps, ref });\n }\n);\nAlertDialogCancel.displayName = CANCEL_NAME;\nvar DescriptionWarning = ({ contentRef }) => {\n const MESSAGE = `\\`${CONTENT_NAME}\\` requires a description for the component to be accessible for screen reader users.\n\nYou can add a description to the \\`${CONTENT_NAME}\\` by passing a \\`${DESCRIPTION_NAME}\\` component as a child, which also benefits sighted users by adding visible context to the dialog.\n\nAlternatively, you can use your own component as a description by assigning it an \\`id\\` and passing the same value to the \\`aria-describedby\\` prop in \\`${CONTENT_NAME}\\`. If the description is confusing or duplicative for sighted users, you can use the \\`@radix-ui/react-visually-hidden\\` primitive as a wrapper around your description component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/alert-dialog`;\n React.useEffect(() => {\n const hasDescription = document.getElementById(\n contentRef.current?.getAttribute(\"aria-describedby\")\n );\n if (!hasDescription) console.warn(MESSAGE);\n }, [MESSAGE, contentRef]);\n return null;\n};\nvar Root2 = AlertDialog;\nvar Trigger2 = AlertDialogTrigger;\nvar Portal2 = AlertDialogPortal;\nvar Overlay2 = AlertDialogOverlay;\nvar Content2 = AlertDialogContent;\nvar Action = AlertDialogAction;\nvar Cancel = AlertDialogCancel;\nvar Title2 = AlertDialogTitle;\nvar Description2 = AlertDialogDescription;\nexport {\n Action,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n Cancel,\n Content2 as Content,\n Description2 as Description,\n Overlay2 as Overlay,\n Portal2 as Portal,\n Root2 as Root,\n Title2 as Title,\n Trigger2 as Trigger,\n createAlertDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","// ========================================\r\n// AlertDialog Component\r\n// ========================================\r\n// Dialog component for confirmations and critical actions\r\n\r\nimport * as React from \"react\";\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst AlertDialog = AlertDialogPrimitive.Root;\r\n\r\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\r\n\r\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\r\n\r\nconst AlertDialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-50 bg-black/60 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n));\r\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\r\n\r\nconst AlertDialogContent = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPortal>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-card p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AlertDialogPortal>\r\n));\r\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\r\n\r\nconst AlertDialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n);\r\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\r\n\r\nconst AlertDialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n);\r\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\r\n\r\nconst AlertDialogTitle = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold text-foreground\", className)}\r\n {...props}\r\n />\r\n));\r\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\r\n\r\nconst AlertDialogDescription = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n));\r\nAlertDialogDescription.displayName =\r\n AlertDialogPrimitive.Description.displayName;\r\n\r\nconst AlertDialogAction = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Action\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\r\n\r\nconst AlertDialogCancel = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Cancel\r\n ref={ref}\r\n className={cn(\r\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 px-4 py-2 mt-2 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\r\n\r\nexport {\r\n AlertDialog,\r\n AlertDialogPortal,\r\n AlertDialogOverlay,\r\n AlertDialogTrigger,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n};\r\n"],"names":["ROOT_NAME","createAlertDialogContext","createContextScope","createDialogScope","useDialogScope","AlertDialog","props","__scopeAlertDialog","alertDialogProps","dialogScope","jsx","DialogPrimitive.Root","TRIGGER_NAME","AlertDialogTrigger","React.forwardRef","forwardedRef","triggerProps","DialogPrimitive.Trigger","PORTAL_NAME","AlertDialogPortal","portalProps","DialogPrimitive.Portal","OVERLAY_NAME","AlertDialogOverlay","overlayProps","DialogPrimitive.Overlay","CONTENT_NAME","AlertDialogContentProvider","useAlertDialogContentContext","Slottable","createSlottable","AlertDialogContent","children","contentProps","contentRef","React.useRef","composedRefs","useComposedRefs","cancelRef","DialogPrimitive.WarningProvider","TITLE_NAME","jsxs","DialogPrimitive.Content","composeEventHandlers","event","_a","DescriptionWarning","AlertDialogTitle","titleProps","DialogPrimitive.Title","DESCRIPTION_NAME","AlertDialogDescription","descriptionProps","DialogPrimitive.Description","ACTION_NAME","AlertDialogAction","actionProps","DialogPrimitive.Close","CANCEL_NAME","AlertDialogCancel","cancelProps","ref","MESSAGE","React.useEffect","Root2","Trigger2","Portal2","Overlay2","Content2","Action","Cancel","Title2","Description2","AlertDialogPrimitive.Root","AlertDialogPrimitive.Trigger","AlertDialogPrimitive.Portal","className","AlertDialogPrimitive.Overlay","cn","AlertDialogPrimitive.Content","AlertDialogHeader","AlertDialogFooter","AlertDialogPrimitive.Title","AlertDialogPrimitive.Description","AlertDialogPrimitive.Action","AlertDialogPrimitive.Cancel"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{j as e,c as w,r as o,ck as ae,B as b,ap as re,ao as O,C as S,a9 as le,o as E,ab as V,dr as I,e as p,b as ne,I as ie,N as q,m as R,ds as ce,fG as oe,fH as de,fI as me,fJ as xe,fK as ue,X as he,l as _,M as L,aV as fe,aR as pe,fL as je,fM as ge}from"./index-dWT2M6Ef.js";import{T as Ne}from"./TabsNavigation-qqt70VYL.js";import{M as ve}from"./index-Dmt9OiEf.js";import{M as we,a as be}from"./minimize-2-CGfBKD_V.js";import{F as B}from"./file-text-DrJFiOUB.js";import"./braces-BPgtyjsG.js";import"./index-anSMmEF8.js";function K(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Q(t){return Array.isArray(t)}function ye(t){return t.replace(/_/g," ").replace(/([A-Z])/g," $1").replace(/^./,a=>a.toUpperCase()).trim()}function W({value:t}){return t==null?e.jsx("span",{className:"text-muted-foreground italic",children:"null"}):typeof t=="boolean"?e.jsx(b,{variant:t?"default":"secondary",children:t?"true":"false"}):typeof t=="number"?e.jsx("span",{className:"text-blue-600 dark:text-blue-400 font-mono",children:t}):typeof t=="string"?t.startsWith("http://")||t.startsWith("https://")?e.jsx("a",{href:t,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 dark:text-blue-400 hover:underline break-all",children:t}):t.length>100?e.jsx("div",{className:"text-sm text-foreground bg-muted/50 p-2 rounded whitespace-pre-wrap break-words",children:t}):e.jsx("span",{className:"text-foreground",children:t}):e.jsx("span",{children:String(t)})}function G({items:t,displayName:a="items"}){const[l,n]=o.useState(!0);return t.length===0?e.jsxs("div",{className:"text-muted-foreground text-sm flex items-center gap-2 p-3 bg-muted/30 rounded-md",children:[e.jsx(ae,{className:"w-4 h-4"}),e.jsxs("span",{children:["No ",a," entries."]})]}):t.every(i=>typeof i!="object"||i===null)?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map((i,d)=>e.jsx(b,{variant:"outline",className:"font-normal",children:String(i)},d))}):e.jsxs("div",{className:"space-y-2",children:[e.jsxs("button",{onClick:()=>n(!l),className:"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground",children:[l?e.jsx(re,{className:"w-4 h-4"}):e.jsx(O,{className:"w-4 h-4"}),t.length," items"]}),l&&e.jsx("div",{className:"space-y-2 pl-4 border-l-2 border-border",children:t.map((i,d)=>e.jsxs(S,{className:"p-3",children:[e.jsxs("div",{className:"text-xs text-muted-foreground mb-2",children:["#",d+1]}),K(i)?e.jsx(z,{data:i}):e.jsx(W,{value:i})]},d))})]})}function z({data:t,depth:a=0}){const l=Object.entries(t);return l.length===0?e.jsx("div",{className:"text-muted-foreground italic text-sm",children:"Empty object"}):e.jsx("div",{className:"space-y-3",children:l.map(([n,r])=>e.jsx(Ce,{label:n,value:r,depth:a},n))})}function Ce({label:t,value:a,depth:l=0}){const n=ye(t);return K(a)?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"font-medium text-sm text-foreground",children:n}),e.jsx("div",{className:w("pl-3 border-l-2 border-border",l>1&&"ml-2"),children:e.jsx(z,{data:a,depth:l+1})})]}):Q(a)?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"font-medium text-sm text-foreground",children:n}),e.jsx(G,{items:a,displayName:n.toLowerCase()})]}):e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("div",{className:"font-medium text-sm text-muted-foreground min-w-[120px] shrink-0",children:n}),e.jsx("div",{className:"flex-1 text-sm",children:e.jsx(W,{value:a})})]})}function T({data:t,className:a}){return t?Q(t)?e.jsx("div",{className:w("space-y-3",a),children:e.jsx(G,{items:t})}):e.jsx("div",{className:w("space-y-4",a),children:e.jsx(z,{data:t})}):e.jsx("div",{className:"text-muted-foreground italic text-sm",children:"No data available"})}const M=16;function Se({session:t,onClick:a,onStatusClick:l,isStatusFiltered:n}){const r=i=>{i.stopPropagation(),l(t.status)};return e.jsxs(S,{className:"p-3 cursor-pointer transition-all hover:shadow-md hover:border-primary/50 h-full flex flex-col",onClick:a,children:[e.jsx("h3",{className:"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug",children:t.topic}),e.jsx("p",{className:"text-xs text-muted-foreground truncate mb-2",children:t.id}),e.jsxs("div",{className:"flex items-center justify-between text-xs mt-auto pt-2 border-t",children:[e.jsx(b,{variant:t.status==="completed"?"success":"warning",className:w("text-[10px] px-1.5 py-0 cursor-pointer transition-all",n&&"ring-2 ring-primary ring-offset-1"),onClick:r,children:t.status==="completed"?e.jsxs(e.Fragment,{children:[e.jsx(L,{className:"w-2.5 h-2.5 mr-0.5"}),"完成"]}):e.jsxs(e.Fragment,{children:[e.jsx(_,{className:"w-2.5 h-2.5 mr-0.5"}),"进行中"]})}),e.jsx("span",{className:"text-muted-foreground",children:t.createdAt})]}),t.hasConclusions&&e.jsxs("div",{className:"flex items-center gap-1 text-[10px] text-muted-foreground mt-1",children:[e.jsx(B,{className:"w-2.5 h-2.5"}),e.jsx("span",{children:"有结论"})]})]})}function ke({sessionId:t,projectPath:a}){const[l,n]=o.useState("discussion"),{data:r,isLoading:i,error:d}=V({queryKey:["analysis-detail",t,a],queryFn:()=>je(t,a)});if(i)return e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(q,{className:"w-6 h-6 animate-spin text-muted-foreground"})});if(d)return e.jsx("div",{className:"flex items-center justify-center h-full p-4",children:e.jsxs("div",{className:"flex items-center gap-2 text-destructive",children:[e.jsx(R,{className:"w-5 h-5"}),e.jsxs("span",{children:["加载失败: ",d.message]})]})});if(!r)return null;const c=[{value:"discussion",label:"讨论记录",icon:e.jsx(fe,{className:"w-4 h-4"})},{value:"conclusions",label:"结论",icon:e.jsx(L,{className:"w-4 h-4"})},{value:"explorations",label:"代码探索",icon:e.jsx(pe,{className:"w-4 h-4"})},{value:"perspectives",label:"视角分析",icon:e.jsx(B,{className:"w-4 h-4"})}].filter(m=>{const y=m.value;return r[y]});return!c.find(m=>m.value===l)&&c.length>0&&n(c[0].value),e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsx("div",{className:"px-4 pb-3 border-b shrink-0",children:e.jsxs("div",{className:"min-w-0",children:[e.jsx("h2",{className:"font-semibold truncate",children:r.topic}),e.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[e.jsx(b,{variant:r.status==="completed"?"default":"secondary",className:"text-xs",children:r.status==="completed"?"完成":"进行中"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:r.createdAt})]})]})}),c.length>0?e.jsxs(e.Fragment,{children:[e.jsx(Ne,{value:l,onValueChange:n,tabs:c,className:"px-4"}),e.jsxs("div",{className:"flex-1 overflow-auto min-h-0 p-4",children:[l==="discussion"&&r.discussion&&e.jsx(ve,{content:r.discussion,format:"markdown"}),l==="conclusions"&&r.conclusions&&e.jsx(T,{data:r.conclusions}),l==="explorations"&&r.explorations&&e.jsx(T,{data:r.explorations}),l==="perspectives"&&r.perspectives&&e.jsx(T,{data:r.perspectives})]})]}):e.jsx("div",{className:"flex-1 flex items-center justify-center text-muted-foreground",children:"暂无分析内容"})]})}const Ae=[{value:"all",label:"全部"},{value:"today",label:"今天"},{value:"week",label:"本周"},{value:"month",label:"本月"}],De=[{value:"all",label:"全部",icon:e.jsx(I,{className:"w-4 h-4"})},{value:"in_progress",label:"进行中",icon:e.jsx(_,{className:"w-4 h-4"})},{value:"completed",label:"已完成",icon:e.jsx(L,{className:"w-4 h-4"})}];function Oe(){const t=le(s=>s.projectPath),a=E(s=>s.isImmersiveMode),l=E(s=>s.toggleImmersiveMode),[n,r]=o.useState(""),[i,d]=o.useState(null),[c,h]=o.useState(1),[m,y]=o.useState("all"),[j,k]=o.useState("all"),[g,A]=o.useState(null),{data:C=[],isLoading:H,error:P}=V({queryKey:["analysis-sessions",t],queryFn:()=>ge(t)}),J=o.useMemo(()=>{const s=new Map;return C.forEach(x=>{const f=s.get(x.createdAt)||0;s.set(x.createdAt,f+1)}),Array.from(s.entries()).sort((x,f)=>f[0].localeCompare(x[0])).slice(0,10).map(([x,f])=>({date:x,label:x.slice(5),count:f}))},[C]),N=o.useMemo(()=>{const s=new Date,x=s.toISOString().split("T")[0],f=new Date(s.getTime()-10080*60*1e3).toISOString().split("T")[0],se=new Date(s.getTime()-720*60*60*1e3).toISOString().split("T")[0];return C.filter(u=>{const F=u.topic.toLowerCase().includes(n.toLowerCase())||u.id.toLowerCase().includes(n.toLowerCase()),te=j==="all"||u.status===j;let v=!0;return g?v=u.createdAt===g:m==="today"?v=u.createdAt===x:m==="week"?v=u.createdAt>=f:m==="month"&&(v=u.createdAt>=se),F&&te&&v}).sort((u,F)=>F.createdAt.localeCompare(u.createdAt))},[C,n,m,j,g]),U=s=>{g===s?A(null):(A(s),y("all")),h(1)},Z=s=>{k(j===s?"all":s),h(1)},D=Math.ceil(N.length/M),X=o.useMemo(()=>{const s=(c-1)*M;return N.slice(s,s+M)},[N,c]),$=s=>{r(s),h(1)},Y=s=>{y(s),h(1)},ee=s=>{k(s),A(null),h(1)};return e.jsxs("div",{className:w("h-full flex overflow-hidden",a&&"fixed inset-0 z-50 bg-background"),children:[e.jsxs("div",{className:"flex-1 flex flex-col p-4 space-y-3 overflow-auto",children:[e.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{className:"w-5 h-5 text-primary"}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl font-semibold text-foreground",children:"Analysis Viewer"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5",children:"查看 /workflow:analyze-with-file 命令的分析结果"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",N.length," 个会话"]}),e.jsx(p,{variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:l,title:a?"退出全屏":"全屏模式",children:a?e.jsx(we,{className:"w-4 h-4"}):e.jsx(be,{className:"w-4 h-4"})})]})]}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsxs("div",{className:"relative flex-1 max-w-md",children:[e.jsx(ne,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx(ie,{placeholder:"搜索分析会话...",value:n,onChange:s=>$(s.target.value),className:"pl-9"})]}),e.jsx("div",{className:"flex items-center gap-1 bg-muted/50 rounded-lg p-1",children:De.map(s=>e.jsxs(p,{variant:j===s.value?"default":"ghost",size:"sm",className:"h-7 px-3 text-xs gap-1",onClick:()=>ee(s.value),children:[s.icon,s.label]},s.value))}),e.jsx("div",{className:"flex items-center gap-1 bg-muted/50 rounded-lg p-1",children:Ae.map(s=>e.jsx(p,{variant:m===s.value?"default":"ghost",size:"sm",className:"h-7 px-3 text-xs",onClick:()=>Y(s.value),children:s.label},s.value))})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap shrink-0",children:J.map(s=>e.jsxs(p,{variant:g===s.date?"default":"outline",size:"sm",className:"h-7 px-2 text-xs gap-1",onClick:()=>U(s.date),children:[e.jsx("span",{children:s.label}),e.jsx(b,{variant:"secondary",className:"ml-1 px-1.5 py-0 text-[10px]",children:s.count})]},s.date))}),H?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(q,{className:"w-6 h-6 animate-spin text-muted-foreground"})}):P?e.jsx(S,{className:"p-6",children:e.jsxs("div",{className:"flex items-center gap-2 text-destructive",children:[e.jsx(R,{className:"w-5 h-5"}),e.jsxs("span",{children:["加载失败: ",P.message]})]})}):N.length===0?e.jsxs(S,{className:"p-12 text-center",children:[e.jsx(I,{className:"w-12 h-12 mx-auto text-muted-foreground mb-4"}),e.jsx("p",{className:"text-muted-foreground",children:n?"没有匹配的分析会话":"暂无分析会话"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"使用 /workflow:analyze-with-file 命令创建分析"})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex-1 grid grid-cols-4 gap-3 content-start",children:X.map(s=>e.jsx(Se,{session:s,onClick:()=>d(s.id),onStatusClick:Z,isStatusFiltered:j!=="all"},s.id))}),D>1&&e.jsxs("div",{className:"flex items-center justify-center gap-2 pt-4",children:[e.jsx(p,{variant:"outline",size:"sm",disabled:c===1,onClick:()=>h(s=>s-1),children:e.jsx(ce,{className:"w-4 h-4"})}),e.jsxs("span",{className:"text-sm text-muted-foreground px-3",children:[c," / ",D]}),e.jsx(p,{variant:"outline",size:"sm",disabled:c===D,onClick:()=>h(s=>s+1),children:e.jsx(O,{className:"w-4 h-4"})})]})]})]}),e.jsx(oe,{open:!!i,onOpenChange:s=>!s&&d(null),children:e.jsxs(de,{side:"right",className:"w-1/2 h-full max-w-none",children:[e.jsxs(me,{className:"shrink-0",children:[e.jsx(xe,{children:"分析详情"}),e.jsx(ue,{asChild:!0,children:e.jsx(p,{variant:"ghost",size:"sm",className:"absolute right-4 top-4",children:e.jsx(he,{className:"w-4 h-4"})})})]}),i&&e.jsx(ke,{sessionId:i,projectPath:t})]})})]})}export{Oe as AnalysisPage,Oe as default};
2
- //# sourceMappingURL=AnalysisPage-ds-w_nVO.js.map
1
+ import{j as e,c as w,r as o,ck as ae,B as b,ap as re,ao as O,C as S,a9 as le,o as E,ab as V,dr as I,e as p,b as ne,I as ie,N as q,m as R,ds as ce,fG as oe,fH as de,fI as me,fJ as xe,fK as ue,X as he,l as _,M as L,aV as fe,aR as pe,fL as je,fM as ge}from"./index-C5Oqx2xI.js";import{T as Ne}from"./TabsNavigation-BUcjsLeE.js";import{M as ve}from"./index-B_ysvdnP.js";import{M as we,a as be}from"./minimize-2-B3ZNzfGr.js";import{F as B}from"./file-text-D5j9C5XC.js";import"./braces-BWhm2c4g.js";import"./index-CdQpo1x0.js";function K(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Q(t){return Array.isArray(t)}function ye(t){return t.replace(/_/g," ").replace(/([A-Z])/g," $1").replace(/^./,a=>a.toUpperCase()).trim()}function W({value:t}){return t==null?e.jsx("span",{className:"text-muted-foreground italic",children:"null"}):typeof t=="boolean"?e.jsx(b,{variant:t?"default":"secondary",children:t?"true":"false"}):typeof t=="number"?e.jsx("span",{className:"text-blue-600 dark:text-blue-400 font-mono",children:t}):typeof t=="string"?t.startsWith("http://")||t.startsWith("https://")?e.jsx("a",{href:t,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 dark:text-blue-400 hover:underline break-all",children:t}):t.length>100?e.jsx("div",{className:"text-sm text-foreground bg-muted/50 p-2 rounded whitespace-pre-wrap break-words",children:t}):e.jsx("span",{className:"text-foreground",children:t}):e.jsx("span",{children:String(t)})}function G({items:t,displayName:a="items"}){const[l,n]=o.useState(!0);return t.length===0?e.jsxs("div",{className:"text-muted-foreground text-sm flex items-center gap-2 p-3 bg-muted/30 rounded-md",children:[e.jsx(ae,{className:"w-4 h-4"}),e.jsxs("span",{children:["No ",a," entries."]})]}):t.every(i=>typeof i!="object"||i===null)?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map((i,d)=>e.jsx(b,{variant:"outline",className:"font-normal",children:String(i)},d))}):e.jsxs("div",{className:"space-y-2",children:[e.jsxs("button",{onClick:()=>n(!l),className:"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground",children:[l?e.jsx(re,{className:"w-4 h-4"}):e.jsx(O,{className:"w-4 h-4"}),t.length," items"]}),l&&e.jsx("div",{className:"space-y-2 pl-4 border-l-2 border-border",children:t.map((i,d)=>e.jsxs(S,{className:"p-3",children:[e.jsxs("div",{className:"text-xs text-muted-foreground mb-2",children:["#",d+1]}),K(i)?e.jsx(z,{data:i}):e.jsx(W,{value:i})]},d))})]})}function z({data:t,depth:a=0}){const l=Object.entries(t);return l.length===0?e.jsx("div",{className:"text-muted-foreground italic text-sm",children:"Empty object"}):e.jsx("div",{className:"space-y-3",children:l.map(([n,r])=>e.jsx(Ce,{label:n,value:r,depth:a},n))})}function Ce({label:t,value:a,depth:l=0}){const n=ye(t);return K(a)?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"font-medium text-sm text-foreground",children:n}),e.jsx("div",{className:w("pl-3 border-l-2 border-border",l>1&&"ml-2"),children:e.jsx(z,{data:a,depth:l+1})})]}):Q(a)?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"font-medium text-sm text-foreground",children:n}),e.jsx(G,{items:a,displayName:n.toLowerCase()})]}):e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("div",{className:"font-medium text-sm text-muted-foreground min-w-[120px] shrink-0",children:n}),e.jsx("div",{className:"flex-1 text-sm",children:e.jsx(W,{value:a})})]})}function T({data:t,className:a}){return t?Q(t)?e.jsx("div",{className:w("space-y-3",a),children:e.jsx(G,{items:t})}):e.jsx("div",{className:w("space-y-4",a),children:e.jsx(z,{data:t})}):e.jsx("div",{className:"text-muted-foreground italic text-sm",children:"No data available"})}const M=16;function Se({session:t,onClick:a,onStatusClick:l,isStatusFiltered:n}){const r=i=>{i.stopPropagation(),l(t.status)};return e.jsxs(S,{className:"p-3 cursor-pointer transition-all hover:shadow-md hover:border-primary/50 h-full flex flex-col",onClick:a,children:[e.jsx("h3",{className:"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug",children:t.topic}),e.jsx("p",{className:"text-xs text-muted-foreground truncate mb-2",children:t.id}),e.jsxs("div",{className:"flex items-center justify-between text-xs mt-auto pt-2 border-t",children:[e.jsx(b,{variant:t.status==="completed"?"success":"warning",className:w("text-[10px] px-1.5 py-0 cursor-pointer transition-all",n&&"ring-2 ring-primary ring-offset-1"),onClick:r,children:t.status==="completed"?e.jsxs(e.Fragment,{children:[e.jsx(L,{className:"w-2.5 h-2.5 mr-0.5"}),"完成"]}):e.jsxs(e.Fragment,{children:[e.jsx(_,{className:"w-2.5 h-2.5 mr-0.5"}),"进行中"]})}),e.jsx("span",{className:"text-muted-foreground",children:t.createdAt})]}),t.hasConclusions&&e.jsxs("div",{className:"flex items-center gap-1 text-[10px] text-muted-foreground mt-1",children:[e.jsx(B,{className:"w-2.5 h-2.5"}),e.jsx("span",{children:"有结论"})]})]})}function ke({sessionId:t,projectPath:a}){const[l,n]=o.useState("discussion"),{data:r,isLoading:i,error:d}=V({queryKey:["analysis-detail",t,a],queryFn:()=>je(t,a)});if(i)return e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx(q,{className:"w-6 h-6 animate-spin text-muted-foreground"})});if(d)return e.jsx("div",{className:"flex items-center justify-center h-full p-4",children:e.jsxs("div",{className:"flex items-center gap-2 text-destructive",children:[e.jsx(R,{className:"w-5 h-5"}),e.jsxs("span",{children:["加载失败: ",d.message]})]})});if(!r)return null;const c=[{value:"discussion",label:"讨论记录",icon:e.jsx(fe,{className:"w-4 h-4"})},{value:"conclusions",label:"结论",icon:e.jsx(L,{className:"w-4 h-4"})},{value:"explorations",label:"代码探索",icon:e.jsx(pe,{className:"w-4 h-4"})},{value:"perspectives",label:"视角分析",icon:e.jsx(B,{className:"w-4 h-4"})}].filter(m=>{const y=m.value;return r[y]});return!c.find(m=>m.value===l)&&c.length>0&&n(c[0].value),e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsx("div",{className:"px-4 pb-3 border-b shrink-0",children:e.jsxs("div",{className:"min-w-0",children:[e.jsx("h2",{className:"font-semibold truncate",children:r.topic}),e.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[e.jsx(b,{variant:r.status==="completed"?"default":"secondary",className:"text-xs",children:r.status==="completed"?"完成":"进行中"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:r.createdAt})]})]})}),c.length>0?e.jsxs(e.Fragment,{children:[e.jsx(Ne,{value:l,onValueChange:n,tabs:c,className:"px-4"}),e.jsxs("div",{className:"flex-1 overflow-auto min-h-0 p-4",children:[l==="discussion"&&r.discussion&&e.jsx(ve,{content:r.discussion,format:"markdown"}),l==="conclusions"&&r.conclusions&&e.jsx(T,{data:r.conclusions}),l==="explorations"&&r.explorations&&e.jsx(T,{data:r.explorations}),l==="perspectives"&&r.perspectives&&e.jsx(T,{data:r.perspectives})]})]}):e.jsx("div",{className:"flex-1 flex items-center justify-center text-muted-foreground",children:"暂无分析内容"})]})}const Ae=[{value:"all",label:"全部"},{value:"today",label:"今天"},{value:"week",label:"本周"},{value:"month",label:"本月"}],De=[{value:"all",label:"全部",icon:e.jsx(I,{className:"w-4 h-4"})},{value:"in_progress",label:"进行中",icon:e.jsx(_,{className:"w-4 h-4"})},{value:"completed",label:"已完成",icon:e.jsx(L,{className:"w-4 h-4"})}];function Oe(){const t=le(s=>s.projectPath),a=E(s=>s.isImmersiveMode),l=E(s=>s.toggleImmersiveMode),[n,r]=o.useState(""),[i,d]=o.useState(null),[c,h]=o.useState(1),[m,y]=o.useState("all"),[j,k]=o.useState("all"),[g,A]=o.useState(null),{data:C=[],isLoading:H,error:P}=V({queryKey:["analysis-sessions",t],queryFn:()=>ge(t)}),J=o.useMemo(()=>{const s=new Map;return C.forEach(x=>{const f=s.get(x.createdAt)||0;s.set(x.createdAt,f+1)}),Array.from(s.entries()).sort((x,f)=>f[0].localeCompare(x[0])).slice(0,10).map(([x,f])=>({date:x,label:x.slice(5),count:f}))},[C]),N=o.useMemo(()=>{const s=new Date,x=s.toISOString().split("T")[0],f=new Date(s.getTime()-10080*60*1e3).toISOString().split("T")[0],se=new Date(s.getTime()-720*60*60*1e3).toISOString().split("T")[0];return C.filter(u=>{const F=u.topic.toLowerCase().includes(n.toLowerCase())||u.id.toLowerCase().includes(n.toLowerCase()),te=j==="all"||u.status===j;let v=!0;return g?v=u.createdAt===g:m==="today"?v=u.createdAt===x:m==="week"?v=u.createdAt>=f:m==="month"&&(v=u.createdAt>=se),F&&te&&v}).sort((u,F)=>F.createdAt.localeCompare(u.createdAt))},[C,n,m,j,g]),U=s=>{g===s?A(null):(A(s),y("all")),h(1)},Z=s=>{k(j===s?"all":s),h(1)},D=Math.ceil(N.length/M),X=o.useMemo(()=>{const s=(c-1)*M;return N.slice(s,s+M)},[N,c]),$=s=>{r(s),h(1)},Y=s=>{y(s),h(1)},ee=s=>{k(s),A(null),h(1)};return e.jsxs("div",{className:w("h-full flex overflow-hidden",a&&"fixed inset-0 z-50 bg-background"),children:[e.jsxs("div",{className:"flex-1 flex flex-col p-4 space-y-3 overflow-auto",children:[e.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{className:"w-5 h-5 text-primary"}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl font-semibold text-foreground",children:"Analysis Viewer"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5",children:"查看 /workflow:analyze-with-file 命令的分析结果"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-xs text-muted-foreground",children:["共 ",N.length," 个会话"]}),e.jsx(p,{variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:l,title:a?"退出全屏":"全屏模式",children:a?e.jsx(we,{className:"w-4 h-4"}):e.jsx(be,{className:"w-4 h-4"})})]})]}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsxs("div",{className:"relative flex-1 max-w-md",children:[e.jsx(ne,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx(ie,{placeholder:"搜索分析会话...",value:n,onChange:s=>$(s.target.value),className:"pl-9"})]}),e.jsx("div",{className:"flex items-center gap-1 bg-muted/50 rounded-lg p-1",children:De.map(s=>e.jsxs(p,{variant:j===s.value?"default":"ghost",size:"sm",className:"h-7 px-3 text-xs gap-1",onClick:()=>ee(s.value),children:[s.icon,s.label]},s.value))}),e.jsx("div",{className:"flex items-center gap-1 bg-muted/50 rounded-lg p-1",children:Ae.map(s=>e.jsx(p,{variant:m===s.value?"default":"ghost",size:"sm",className:"h-7 px-3 text-xs",onClick:()=>Y(s.value),children:s.label},s.value))})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap shrink-0",children:J.map(s=>e.jsxs(p,{variant:g===s.date?"default":"outline",size:"sm",className:"h-7 px-2 text-xs gap-1",onClick:()=>U(s.date),children:[e.jsx("span",{children:s.label}),e.jsx(b,{variant:"secondary",className:"ml-1 px-1.5 py-0 text-[10px]",children:s.count})]},s.date))}),H?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(q,{className:"w-6 h-6 animate-spin text-muted-foreground"})}):P?e.jsx(S,{className:"p-6",children:e.jsxs("div",{className:"flex items-center gap-2 text-destructive",children:[e.jsx(R,{className:"w-5 h-5"}),e.jsxs("span",{children:["加载失败: ",P.message]})]})}):N.length===0?e.jsxs(S,{className:"p-12 text-center",children:[e.jsx(I,{className:"w-12 h-12 mx-auto text-muted-foreground mb-4"}),e.jsx("p",{className:"text-muted-foreground",children:n?"没有匹配的分析会话":"暂无分析会话"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"使用 /workflow:analyze-with-file 命令创建分析"})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex-1 grid grid-cols-4 gap-3 content-start",children:X.map(s=>e.jsx(Se,{session:s,onClick:()=>d(s.id),onStatusClick:Z,isStatusFiltered:j!=="all"},s.id))}),D>1&&e.jsxs("div",{className:"flex items-center justify-center gap-2 pt-4",children:[e.jsx(p,{variant:"outline",size:"sm",disabled:c===1,onClick:()=>h(s=>s-1),children:e.jsx(ce,{className:"w-4 h-4"})}),e.jsxs("span",{className:"text-sm text-muted-foreground px-3",children:[c," / ",D]}),e.jsx(p,{variant:"outline",size:"sm",disabled:c===D,onClick:()=>h(s=>s+1),children:e.jsx(O,{className:"w-4 h-4"})})]})]})]}),e.jsx(oe,{open:!!i,onOpenChange:s=>!s&&d(null),children:e.jsxs(de,{side:"right",className:"w-1/2 h-full max-w-none",children:[e.jsxs(me,{className:"shrink-0",children:[e.jsx(xe,{children:"分析详情"}),e.jsx(ue,{asChild:!0,children:e.jsx(p,{variant:"ghost",size:"sm",className:"absolute right-4 top-4",children:e.jsx(he,{className:"w-4 h-4"})})})]}),i&&e.jsx(ke,{sessionId:i,projectPath:t})]})})]})}export{Oe as AnalysisPage,Oe as default};
2
+ //# sourceMappingURL=AnalysisPage-BT2rDDUD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalysisPage-ds-w_nVO.js","sources":["../../src/components/shared/JsonCardView.tsx","../../src/pages/AnalysisPage.tsx"],"sourcesContent":["// ========================================\r\n// JsonCardView Component\r\n// ========================================\r\n// Renders JSON data as structured cards for better readability\r\n\r\nimport { useState } from 'react';\r\nimport { ChevronDown, ChevronRight, Database } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface JsonCardViewProps {\r\n /** JSON data to render - accepts any object type */\r\n data: object | unknown[] | null;\r\n /** Additional CSS className */\r\n className?: string;\r\n /** Initial expanded state */\r\n defaultExpanded?: boolean;\r\n}\r\n\r\ninterface CardItemProps {\r\n label: string;\r\n value: unknown;\r\n depth?: number;\r\n}\r\n\r\n// ========== Helper Functions ==========\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n}\r\n\r\nfunction formatLabel(key: string): string {\r\n return key\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n\r\n// ========== Sub Components ==========\r\n\r\nfunction PrimitiveValue({ value }: { value: unknown }) {\r\n if (value === null || value === undefined) {\r\n return <span className=\"text-muted-foreground italic\">null</span>;\r\n }\r\n if (typeof value === 'boolean') {\r\n return (\r\n <Badge variant={value ? 'default' : 'secondary'}>\r\n {value ? 'true' : 'false'}\r\n </Badge>\r\n );\r\n }\r\n if (typeof value === 'number') {\r\n return <span className=\"text-blue-600 dark:text-blue-400 font-mono\">{value}</span>;\r\n }\r\n if (typeof value === 'string') {\r\n // Check if it's a URL\r\n if (value.startsWith('http://') || value.startsWith('https://')) {\r\n return (\r\n <a\r\n href={value}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-blue-600 dark:text-blue-400 hover:underline break-all\"\r\n >\r\n {value}\r\n </a>\r\n );\r\n }\r\n // Long text\r\n if (value.length > 100) {\r\n return (\r\n <div className=\"text-sm text-foreground bg-muted/50 p-2 rounded whitespace-pre-wrap break-words\">\r\n {value}\r\n </div>\r\n );\r\n }\r\n return <span className=\"text-foreground\">{value}</span>;\r\n }\r\n return <span>{String(value)}</span>;\r\n}\r\n\r\nfunction ArrayView({ items, displayName = 'items' }: { items: unknown[]; displayName?: string }) {\r\n const [expanded, setExpanded] = useState(true);\r\n\r\n if (items.length === 0) {\r\n return (\r\n <div className=\"text-muted-foreground text-sm flex items-center gap-2 p-3 bg-muted/30 rounded-md\">\r\n <Database className=\"w-4 h-4\" />\r\n <span>No {displayName} entries.</span>\r\n </div>\r\n );\r\n }\r\n\r\n // Simple array of primitives\r\n const allPrimitives = items.every(\r\n (item) => typeof item !== 'object' || item === null\r\n );\r\n\r\n if (allPrimitives) {\r\n return (\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {items.map((item, index) => (\r\n <Badge key={index} variant=\"outline\" className=\"font-normal\">\r\n {String(item)}\r\n </Badge>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground\"\r\n >\r\n {expanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n {items.length} items\r\n </button>\r\n {expanded && (\r\n <div className=\"space-y-2 pl-4 border-l-2 border-border\">\r\n {items.map((item, index) => (\r\n <Card key={index} className=\"p-3\">\r\n <div className=\"text-xs text-muted-foreground mb-2\">#{index + 1}</div>\r\n {isObject(item) ? (\r\n <ObjectView data={item} />\r\n ) : (\r\n <PrimitiveValue value={item} />\r\n )}\r\n </Card>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectView({ data, depth = 0 }: { data: Record<string, unknown>; depth?: number }) {\r\n const entries = Object.entries(data);\r\n\r\n if (entries.length === 0) {\r\n return <div className=\"text-muted-foreground italic text-sm\">Empty object</div>;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {entries.map(([key, value]) => (\r\n <CardItem key={key} label={key} value={value} depth={depth} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CardItem({ label, value, depth = 0 }: CardItemProps) {\r\n const formattedLabel = formatLabel(label);\r\n\r\n // Nested object\r\n if (isObject(value)) {\r\n return (\r\n <div className=\"space-y-2\">\r\n <div className=\"font-medium text-sm text-foreground\">{formattedLabel}</div>\r\n <div className={cn('pl-3 border-l-2 border-border', depth > 1 && 'ml-2')}>\r\n <ObjectView data={value} depth={depth + 1} />\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Array\r\n if (isArray(value)) {\r\n return (\r\n <div className=\"space-y-2\">\r\n <div className=\"font-medium text-sm text-foreground\">{formattedLabel}</div>\r\n <ArrayView items={value} displayName={formattedLabel.toLowerCase()} />\r\n </div>\r\n );\r\n }\r\n\r\n // Primitive value\r\n return (\r\n <div className=\"flex items-start gap-2\">\r\n <div className=\"font-medium text-sm text-muted-foreground min-w-[120px] shrink-0\">\r\n {formattedLabel}\r\n </div>\r\n <div className=\"flex-1 text-sm\">\r\n <PrimitiveValue value={value} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\nexport function JsonCardView({ data, className }: JsonCardViewProps) {\r\n if (!data) {\r\n return (\r\n <div className=\"text-muted-foreground italic text-sm\">No data available</div>\r\n );\r\n }\r\n\r\n // Handle array at root level\r\n if (isArray(data)) {\r\n return (\r\n <div className={cn('space-y-3', className)}>\r\n <ArrayView items={data} />\r\n </div>\r\n );\r\n }\r\n\r\n // Handle object\r\n return (\r\n <div className={cn('space-y-4', className)}>\r\n <ObjectView data={data as Record<string, unknown>} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default JsonCardView;\r\n","// ========================================\r\n// Analysis Viewer Page\r\n// ========================================\r\n// View analysis sessions from /workflow:analyze-with-file command\r\n\r\nimport { useState, useMemo } from 'react';\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n FileSearch,\r\n Search,\r\n CheckCircle,\r\n Clock,\r\n ChevronLeft,\r\n ChevronRight,\r\n Loader2,\r\n AlertCircle,\r\n X,\r\n FileText,\r\n Code,\r\n MessageSquare,\r\n Maximize2,\r\n Minimize2,\r\n} from 'lucide-react';\r\nimport { useWorkflowStore } from '@/stores/workflowStore';\r\nimport { useAppStore } from '@/stores/appStore';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport {\r\n Drawer,\r\n DrawerContent,\r\n DrawerHeader,\r\n DrawerTitle,\r\n DrawerClose,\r\n} from '@/components/ui/Drawer';\r\nimport { fetchAnalysisSessions, fetchAnalysisDetail } from '@/lib/api';\r\nimport { MessageRenderer } from '@/components/shared/CliStreamMonitor/MessageRenderer';\r\nimport { JsonCardView } from '@/components/shared/JsonCardView';\r\nimport { cn } from '@/lib/utils';\r\nimport type { AnalysisSessionSummary } from '@/types/analysis';\r\n\r\nconst PAGE_SIZE = 16; // 4 rows × 4 columns\r\n\r\n// ========== Session Card Component (Compact) ==========\r\n\r\ninterface SessionCardProps {\r\n session: AnalysisSessionSummary;\r\n onClick: () => void;\r\n onStatusClick: (status: string) => void;\r\n isStatusFiltered: boolean;\r\n}\r\n\r\nfunction SessionCard({ session, onClick, onStatusClick, isStatusFiltered }: SessionCardProps) {\r\n const handleStatusClick = (e: React.MouseEvent) => {\r\n e.stopPropagation(); // Prevent card click\r\n onStatusClick(session.status);\r\n };\r\n\r\n return (\r\n <Card\r\n className=\"p-3 cursor-pointer transition-all hover:shadow-md hover:border-primary/50 h-full flex flex-col\"\r\n onClick={onClick}\r\n >\r\n {/* Topic - smaller font */}\r\n <h3 className=\"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug\">\r\n {session.topic}\r\n </h3>\r\n\r\n {/* Session ID - truncate */}\r\n <p className=\"text-xs text-muted-foreground truncate mb-2\">\r\n {session.id}\r\n </p>\r\n\r\n {/* Status and Date */}\r\n <div className=\"flex items-center justify-between text-xs mt-auto pt-2 border-t\">\r\n <Badge\r\n variant={session.status === 'completed' ? 'success' : 'warning'}\r\n className={cn(\r\n \"text-[10px] px-1.5 py-0 cursor-pointer transition-all\",\r\n isStatusFiltered && \"ring-2 ring-primary ring-offset-1\"\r\n )}\r\n onClick={handleStatusClick}\r\n >\r\n {session.status === 'completed' ? (\r\n <><CheckCircle className=\"w-2.5 h-2.5 mr-0.5\" />完成</>\r\n ) : (\r\n <><Clock className=\"w-2.5 h-2.5 mr-0.5\" />进行中</>\r\n )}\r\n </Badge>\r\n <span className=\"text-muted-foreground\">{session.createdAt}</span>\r\n </div>\r\n\r\n {/* Conclusions indicator */}\r\n {session.hasConclusions && (\r\n <div className=\"flex items-center gap-1 text-[10px] text-muted-foreground mt-1\">\r\n <FileText className=\"w-2.5 h-2.5\" />\r\n <span>有结论</span>\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Detail Panel Component ==========\r\n\r\ninterface DetailPanelProps {\r\n sessionId: string;\r\n projectPath: string;\r\n}\r\n\r\nfunction DetailPanel({ sessionId, projectPath }: DetailPanelProps) {\r\n const [activeTab, setActiveTab] = useState('discussion');\r\n\r\n const { data: detail, isLoading, error } = useQuery({\r\n queryKey: ['analysis-detail', sessionId, projectPath],\r\n queryFn: () => fetchAnalysisDetail(sessionId, projectPath),\r\n });\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full p-4\">\r\n <div className=\"flex items-center gap-2 text-destructive\">\r\n <AlertCircle className=\"w-5 h-5\" />\r\n <span>加载失败: {(error as Error).message}</span>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!detail) return null;\r\n\r\n // Build available tabs based on content\r\n const tabs = [\r\n { value: 'discussion', label: '讨论记录', icon: <MessageSquare className=\"w-4 h-4\" /> },\r\n { value: 'conclusions', label: '结论', icon: <CheckCircle className=\"w-4 h-4\" /> },\r\n { value: 'explorations', label: '代码探索', icon: <Code className=\"w-4 h-4\" /> },\r\n { value: 'perspectives', label: '视角分析', icon: <FileText className=\"w-4 h-4\" /> },\r\n ].filter(tab => {\r\n const key = tab.value as keyof typeof detail;\r\n return detail[key];\r\n });\r\n\r\n // Ensure activeTab is valid\r\n const validTab = tabs.find(t => t.value === activeTab);\r\n if (!validTab && tabs.length > 0) {\r\n setActiveTab(tabs[0].value);\r\n }\r\n\r\n return (\r\n <div className=\"h-full flex flex-col\">\r\n {/* Session Info (in drawer, header is already shown) */}\r\n <div className=\"px-4 pb-3 border-b shrink-0\">\r\n <div className=\"min-w-0\">\r\n <h2 className=\"font-semibold truncate\">{detail.topic}</h2>\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n <Badge variant={detail.status === 'completed' ? 'default' : 'secondary'} className=\"text-xs\">\r\n {detail.status === 'completed' ? '完成' : '进行中'}\r\n </Badge>\r\n <span className=\"text-xs text-muted-foreground\">{detail.createdAt}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs Content */}\r\n {tabs.length > 0 ? (\r\n <>\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={setActiveTab}\r\n tabs={tabs}\r\n className=\"px-4\"\r\n />\r\n <div className=\"flex-1 overflow-auto min-h-0 p-4\">\r\n {/* Discussion Tab */}\r\n {activeTab === 'discussion' && detail.discussion && (\r\n <MessageRenderer content={detail.discussion} format=\"markdown\" />\r\n )}\r\n\r\n {/* Conclusions Tab */}\r\n {activeTab === 'conclusions' && detail.conclusions && (\r\n <JsonCardView data={detail.conclusions} />\r\n )}\r\n\r\n {/* Explorations Tab */}\r\n {activeTab === 'explorations' && detail.explorations && (\r\n <JsonCardView data={detail.explorations} />\r\n )}\r\n\r\n {/* Perspectives Tab */}\r\n {activeTab === 'perspectives' && detail.perspectives && (\r\n <JsonCardView data={detail.perspectives} />\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center text-muted-foreground\">\r\n 暂无分析内容\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\ntype DateFilter = 'all' | 'today' | 'week' | 'month';\r\ntype StatusFilter = 'all' | 'in_progress' | 'completed';\r\n\r\nconst DATE_FILTERS: { value: DateFilter; label: string }[] = [\r\n { value: 'all', label: '全部' },\r\n { value: 'today', label: '今天' },\r\n { value: 'week', label: '本周' },\r\n { value: 'month', label: '本月' },\r\n];\r\n\r\nconst STATUS_FILTERS: { value: StatusFilter; label: string; icon: React.ReactNode }[] = [\r\n { value: 'all', label: '全部', icon: <FileSearch className=\"w-4 h-4\" /> },\r\n { value: 'in_progress', label: '进行中', icon: <Clock className=\"w-4 h-4\" /> },\r\n { value: 'completed', label: '已完成', icon: <CheckCircle className=\"w-4 h-4\" /> },\r\n];\r\n\r\nexport function AnalysisPage() {\r\n const projectPath = useWorkflowStore((state) => state.projectPath);\r\n const isImmersiveMode = useAppStore((s) => s.isImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedSession, setSelectedSession] = useState<string | null>(null);\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [dateFilter, setDateFilter] = useState<DateFilter>('all');\r\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\r\n const [selectedDate, setSelectedDate] = useState<string | null>(null);\r\n\r\n const { data: sessions = [], isLoading, error } = useQuery({\r\n queryKey: ['analysis-sessions', projectPath],\r\n queryFn: () => fetchAnalysisSessions(projectPath),\r\n });\r\n\r\n // Get unique dates with counts for quick filter bubbles\r\n const uniqueDates = useMemo(() => {\r\n const dateCounts = new Map<string, number>();\r\n sessions.forEach((session) => {\r\n const count = dateCounts.get(session.createdAt) || 0;\r\n dateCounts.set(session.createdAt, count + 1);\r\n });\r\n // Sort by date descending, show top 10\r\n return Array.from(dateCounts.entries())\r\n .sort((a, b) => b[0].localeCompare(a[0]))\r\n .slice(0, 10)\r\n .map(([date, count]) => ({\r\n date,\r\n label: date.slice(5), // MM-DD format\r\n count,\r\n }));\r\n }, [sessions]);\r\n\r\n // Filter by date, status and search query\r\n const filteredSessions = useMemo(() => {\r\n const now = new Date();\r\n const today = now.toISOString().split('T')[0];\r\n const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\r\n const monthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\r\n\r\n let filtered = sessions.filter((session) => {\r\n // Search filter\r\n const matchesSearch = session.topic.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n session.id.toLowerCase().includes(searchQuery.toLowerCase());\r\n\r\n // Status filter\r\n const matchesStatus = statusFilter === 'all' || session.status === statusFilter;\r\n\r\n // Date filter\r\n let matchesDate = true;\r\n if (selectedDate) {\r\n matchesDate = session.createdAt === selectedDate;\r\n } else if (dateFilter === 'today') {\r\n matchesDate = session.createdAt === today;\r\n } else if (dateFilter === 'week') {\r\n matchesDate = session.createdAt >= weekAgo;\r\n } else if (dateFilter === 'month') {\r\n matchesDate = session.createdAt >= monthAgo;\r\n }\r\n\r\n return matchesSearch && matchesStatus && matchesDate;\r\n });\r\n\r\n // Sort by createdAt descending (newest first)\r\n return filtered.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\r\n }, [sessions, searchQuery, dateFilter, statusFilter, selectedDate]);\r\n\r\n // Handle date select\r\n const handleDateSelect = (date: string) => {\r\n if (selectedDate === date) {\r\n setSelectedDate(null);\r\n } else {\r\n setSelectedDate(date);\r\n setDateFilter('all');\r\n }\r\n setCurrentPage(1);\r\n };\r\n\r\n // Handle status filter from card click\r\n const handleStatusClick = (status: string) => {\r\n if (statusFilter === status) {\r\n setStatusFilter('all');\r\n } else {\r\n setStatusFilter(status as StatusFilter);\r\n }\r\n setCurrentPage(1);\r\n };\r\n\r\n // Pagination\r\n const totalPages = Math.ceil(filteredSessions.length / PAGE_SIZE);\r\n const paginatedSessions = useMemo(() => {\r\n const start = (currentPage - 1) * PAGE_SIZE;\r\n return filteredSessions.slice(start, start + PAGE_SIZE);\r\n }, [filteredSessions, currentPage]);\r\n\r\n // Reset to page 1 when filters change\r\n const handleSearchChange = (value: string) => {\r\n setSearchQuery(value);\r\n setCurrentPage(1);\r\n };\r\n\r\n const handleDateFilterChange = (filter: DateFilter) => {\r\n setDateFilter(filter);\r\n setCurrentPage(1);\r\n };\r\n\r\n const handleStatusFilterChange = (filter: StatusFilter) => {\r\n setStatusFilter(filter);\r\n setSelectedDate(null);\r\n setCurrentPage(1);\r\n };\r\n\r\n return (\r\n <div className={cn(\r\n \"h-full flex overflow-hidden\",\r\n isImmersiveMode && \"fixed inset-0 z-50 bg-background\"\r\n )}>\r\n {/* Main Content - List */}\r\n <div className=\"flex-1 flex flex-col p-4 space-y-3 overflow-auto\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between shrink-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileSearch className=\"w-5 h-5 text-primary\" />\r\n <div>\r\n <h1 className=\"text-xl font-semibold text-foreground\">\r\n Analysis Viewer\r\n </h1>\r\n <p className=\"text-xs text-muted-foreground mt-0.5\">\r\n 查看 /workflow:analyze-with-file 命令的分析结果\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n 共 {filteredSessions.length} 个会话\r\n </span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7 w-7 p-0\"\r\n onClick={toggleImmersiveMode}\r\n title={isImmersiveMode ? '退出全屏' : '全屏模式'}\r\n >\r\n {isImmersiveMode ? (\r\n <Minimize2 className=\"w-4 h-4\" />\r\n ) : (\r\n <Maximize2 className=\"w-4 h-4\" />\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters */}\r\n <div className=\"flex items-center gap-4 shrink-0\">\r\n {/* Search */}\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder=\"搜索分析会话...\"\r\n value={searchQuery}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n\r\n {/* Status Filter Tabs */}\r\n <div className=\"flex items-center gap-1 bg-muted/50 rounded-lg p-1\">\r\n {STATUS_FILTERS.map((filter) => (\r\n <Button\r\n key={filter.value}\r\n variant={statusFilter === filter.value ? 'default' : 'ghost'}\r\n size=\"sm\"\r\n className=\"h-7 px-3 text-xs gap-1\"\r\n onClick={() => handleStatusFilterChange(filter.value)}\r\n >\r\n {filter.icon}\r\n {filter.label}\r\n </Button>\r\n ))}\r\n </div>\r\n\r\n {/* Date Filter Tabs */}\r\n <div className=\"flex items-center gap-1 bg-muted/50 rounded-lg p-1\">\r\n {DATE_FILTERS.map((filter) => (\r\n <Button\r\n key={filter.value}\r\n variant={dateFilter === filter.value ? 'default' : 'ghost'}\r\n size=\"sm\"\r\n className=\"h-7 px-3 text-xs\"\r\n onClick={() => handleDateFilterChange(filter.value)}\r\n >\r\n {filter.label}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Date Quick Filter Bubbles */}\r\n <div className=\"flex items-center gap-2 flex-wrap shrink-0\">\r\n {uniqueDates.map((date) => (\r\n <Button\r\n key={date.date}\r\n variant={selectedDate === date.date ? 'default' : 'outline'}\r\n size=\"sm\"\r\n className=\"h-7 px-2 text-xs gap-1\"\r\n onClick={() => handleDateSelect(date.date)}\r\n >\r\n <span>{date.label}</span>\r\n <Badge variant=\"secondary\" className=\"ml-1 px-1.5 py-0 text-[10px]\">\r\n {date.count}\r\n </Badge>\r\n </Button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n {isLoading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : error ? (\r\n <Card className=\"p-6\">\r\n <div className=\"flex items-center gap-2 text-destructive\">\r\n <AlertCircle className=\"w-5 h-5\" />\r\n <span>加载失败: {(error as Error).message}</span>\r\n </div>\r\n </Card>\r\n ) : filteredSessions.length === 0 ? (\r\n <Card className=\"p-12 text-center\">\r\n <FileSearch className=\"w-12 h-12 mx-auto text-muted-foreground mb-4\" />\r\n <p className=\"text-muted-foreground\">\r\n {searchQuery ? '没有匹配的分析会话' : '暂无分析会话'}\r\n </p>\r\n <p className=\"text-sm text-muted-foreground mt-2\">\r\n 使用 /workflow:analyze-with-file 命令创建分析\r\n </p>\r\n </Card>\r\n ) : (\r\n <>\r\n {/* Grid - flex-1 to fill remaining space */}\r\n <div className=\"flex-1 grid grid-cols-4 gap-3 content-start\">\r\n {paginatedSessions.map((session) => (\r\n <SessionCard\r\n key={session.id}\r\n session={session}\r\n onClick={() => setSelectedSession(session.id)}\r\n onStatusClick={handleStatusClick}\r\n isStatusFiltered={statusFilter !== 'all'}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"flex items-center justify-center gap-2 pt-4\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n disabled={currentPage === 1}\r\n onClick={() => setCurrentPage(p => p - 1)}\r\n >\r\n <ChevronLeft className=\"w-4 h-4\" />\r\n </Button>\r\n <span className=\"text-sm text-muted-foreground px-3\">\r\n {currentPage} / {totalPages}\r\n </span>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n disabled={currentPage === totalPages}\r\n onClick={() => setCurrentPage(p => p + 1)}\r\n >\r\n <ChevronRight className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Detail Drawer */}\r\n <Drawer open={!!selectedSession} onOpenChange={(open) => !open && setSelectedSession(null)}>\r\n <DrawerContent side=\"right\" className=\"w-1/2 h-full max-w-none\">\r\n <DrawerHeader className=\"shrink-0\">\r\n <DrawerTitle>分析详情</DrawerTitle>\r\n <DrawerClose asChild>\r\n <Button variant=\"ghost\" size=\"sm\" className=\"absolute right-4 top-4\">\r\n <X className=\"w-4 h-4\" />\r\n </Button>\r\n </DrawerClose>\r\n </DrawerHeader>\r\n {selectedSession && (\r\n <DetailPanel\r\n sessionId={selectedSession}\r\n projectPath={projectPath}\r\n />\r\n )}\r\n </DrawerContent>\r\n </Drawer>\r\n </div>\r\n );\r\n}\r\n\r\nexport default AnalysisPage;\r\n"],"names":["isObject","value","isArray","formatLabel","key","str","PrimitiveValue","jsx","Badge","ArrayView","items","displayName","expanded","setExpanded","useState","jsxs","Database","item","index","ChevronDown","ChevronRight","Card","ObjectView","data","depth","entries","CardItem","label","formattedLabel","cn","JsonCardView","className","PAGE_SIZE","SessionCard","session","onClick","onStatusClick","isStatusFiltered","handleStatusClick","e","Fragment","CheckCircle","Clock","FileText","DetailPanel","sessionId","projectPath","activeTab","setActiveTab","detail","isLoading","error","useQuery","fetchAnalysisDetail","Loader2","AlertCircle","tabs","MessageSquare","Code","tab","t","TabsNavigation","MessageRenderer","DATE_FILTERS","STATUS_FILTERS","FileSearch","AnalysisPage","useWorkflowStore","state","isImmersiveMode","useAppStore","toggleImmersiveMode","searchQuery","setSearchQuery","selectedSession","setSelectedSession","currentPage","setCurrentPage","dateFilter","setDateFilter","statusFilter","setStatusFilter","selectedDate","setSelectedDate","sessions","fetchAnalysisSessions","uniqueDates","useMemo","dateCounts","count","a","b","date","filteredSessions","now","today","weekAgo","monthAgo","matchesSearch","matchesStatus","matchesDate","handleDateSelect","status","totalPages","paginatedSessions","start","handleSearchChange","handleDateFilterChange","filter","handleStatusFilterChange","Button","Minimize2","Maximize2","Search","Input","p","ChevronLeft","Drawer","open","DrawerContent","DrawerHeader","DrawerTitle","DrawerClose","X"],"mappings":"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"}
1
+ {"version":3,"file":"AnalysisPage-BT2rDDUD.js","sources":["../../src/components/shared/JsonCardView.tsx","../../src/pages/AnalysisPage.tsx"],"sourcesContent":["// ========================================\r\n// JsonCardView Component\r\n// ========================================\r\n// Renders JSON data as structured cards for better readability\r\n\r\nimport { useState } from 'react';\r\nimport { ChevronDown, ChevronRight, Database } from 'lucide-react';\r\nimport { cn } from '@/lib/utils';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Badge } from '@/components/ui/Badge';\r\n\r\n// ========== Types ==========\r\n\r\nexport interface JsonCardViewProps {\r\n /** JSON data to render - accepts any object type */\r\n data: object | unknown[] | null;\r\n /** Additional CSS className */\r\n className?: string;\r\n /** Initial expanded state */\r\n defaultExpanded?: boolean;\r\n}\r\n\r\ninterface CardItemProps {\r\n label: string;\r\n value: unknown;\r\n depth?: number;\r\n}\r\n\r\n// ========== Helper Functions ==========\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n}\r\n\r\nfunction formatLabel(key: string): string {\r\n return key\r\n .replace(/_/g, ' ')\r\n .replace(/([A-Z])/g, ' $1')\r\n .replace(/^./, (str) => str.toUpperCase())\r\n .trim();\r\n}\r\n\r\n// ========== Sub Components ==========\r\n\r\nfunction PrimitiveValue({ value }: { value: unknown }) {\r\n if (value === null || value === undefined) {\r\n return <span className=\"text-muted-foreground italic\">null</span>;\r\n }\r\n if (typeof value === 'boolean') {\r\n return (\r\n <Badge variant={value ? 'default' : 'secondary'}>\r\n {value ? 'true' : 'false'}\r\n </Badge>\r\n );\r\n }\r\n if (typeof value === 'number') {\r\n return <span className=\"text-blue-600 dark:text-blue-400 font-mono\">{value}</span>;\r\n }\r\n if (typeof value === 'string') {\r\n // Check if it's a URL\r\n if (value.startsWith('http://') || value.startsWith('https://')) {\r\n return (\r\n <a\r\n href={value}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-blue-600 dark:text-blue-400 hover:underline break-all\"\r\n >\r\n {value}\r\n </a>\r\n );\r\n }\r\n // Long text\r\n if (value.length > 100) {\r\n return (\r\n <div className=\"text-sm text-foreground bg-muted/50 p-2 rounded whitespace-pre-wrap break-words\">\r\n {value}\r\n </div>\r\n );\r\n }\r\n return <span className=\"text-foreground\">{value}</span>;\r\n }\r\n return <span>{String(value)}</span>;\r\n}\r\n\r\nfunction ArrayView({ items, displayName = 'items' }: { items: unknown[]; displayName?: string }) {\r\n const [expanded, setExpanded] = useState(true);\r\n\r\n if (items.length === 0) {\r\n return (\r\n <div className=\"text-muted-foreground text-sm flex items-center gap-2 p-3 bg-muted/30 rounded-md\">\r\n <Database className=\"w-4 h-4\" />\r\n <span>No {displayName} entries.</span>\r\n </div>\r\n );\r\n }\r\n\r\n // Simple array of primitives\r\n const allPrimitives = items.every(\r\n (item) => typeof item !== 'object' || item === null\r\n );\r\n\r\n if (allPrimitives) {\r\n return (\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {items.map((item, index) => (\r\n <Badge key={index} variant=\"outline\" className=\"font-normal\">\r\n {String(item)}\r\n </Badge>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <button\r\n onClick={() => setExpanded(!expanded)}\r\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground\"\r\n >\r\n {expanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n {items.length} items\r\n </button>\r\n {expanded && (\r\n <div className=\"space-y-2 pl-4 border-l-2 border-border\">\r\n {items.map((item, index) => (\r\n <Card key={index} className=\"p-3\">\r\n <div className=\"text-xs text-muted-foreground mb-2\">#{index + 1}</div>\r\n {isObject(item) ? (\r\n <ObjectView data={item} />\r\n ) : (\r\n <PrimitiveValue value={item} />\r\n )}\r\n </Card>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectView({ data, depth = 0 }: { data: Record<string, unknown>; depth?: number }) {\r\n const entries = Object.entries(data);\r\n\r\n if (entries.length === 0) {\r\n return <div className=\"text-muted-foreground italic text-sm\">Empty object</div>;\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {entries.map(([key, value]) => (\r\n <CardItem key={key} label={key} value={value} depth={depth} />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CardItem({ label, value, depth = 0 }: CardItemProps) {\r\n const formattedLabel = formatLabel(label);\r\n\r\n // Nested object\r\n if (isObject(value)) {\r\n return (\r\n <div className=\"space-y-2\">\r\n <div className=\"font-medium text-sm text-foreground\">{formattedLabel}</div>\r\n <div className={cn('pl-3 border-l-2 border-border', depth > 1 && 'ml-2')}>\r\n <ObjectView data={value} depth={depth + 1} />\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Array\r\n if (isArray(value)) {\r\n return (\r\n <div className=\"space-y-2\">\r\n <div className=\"font-medium text-sm text-foreground\">{formattedLabel}</div>\r\n <ArrayView items={value} displayName={formattedLabel.toLowerCase()} />\r\n </div>\r\n );\r\n }\r\n\r\n // Primitive value\r\n return (\r\n <div className=\"flex items-start gap-2\">\r\n <div className=\"font-medium text-sm text-muted-foreground min-w-[120px] shrink-0\">\r\n {formattedLabel}\r\n </div>\r\n <div className=\"flex-1 text-sm\">\r\n <PrimitiveValue value={value} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\nexport function JsonCardView({ data, className }: JsonCardViewProps) {\r\n if (!data) {\r\n return (\r\n <div className=\"text-muted-foreground italic text-sm\">No data available</div>\r\n );\r\n }\r\n\r\n // Handle array at root level\r\n if (isArray(data)) {\r\n return (\r\n <div className={cn('space-y-3', className)}>\r\n <ArrayView items={data} />\r\n </div>\r\n );\r\n }\r\n\r\n // Handle object\r\n return (\r\n <div className={cn('space-y-4', className)}>\r\n <ObjectView data={data as Record<string, unknown>} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default JsonCardView;\r\n","// ========================================\r\n// Analysis Viewer Page\r\n// ========================================\r\n// View analysis sessions from /workflow:analyze-with-file command\r\n\r\nimport { useState, useMemo } from 'react';\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport {\r\n FileSearch,\r\n Search,\r\n CheckCircle,\r\n Clock,\r\n ChevronLeft,\r\n ChevronRight,\r\n Loader2,\r\n AlertCircle,\r\n X,\r\n FileText,\r\n Code,\r\n MessageSquare,\r\n Maximize2,\r\n Minimize2,\r\n} from 'lucide-react';\r\nimport { useWorkflowStore } from '@/stores/workflowStore';\r\nimport { useAppStore } from '@/stores/appStore';\r\nimport { Card } from '@/components/ui/Card';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Badge } from '@/components/ui/Badge';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\r\nimport {\r\n Drawer,\r\n DrawerContent,\r\n DrawerHeader,\r\n DrawerTitle,\r\n DrawerClose,\r\n} from '@/components/ui/Drawer';\r\nimport { fetchAnalysisSessions, fetchAnalysisDetail } from '@/lib/api';\r\nimport { MessageRenderer } from '@/components/shared/CliStreamMonitor/MessageRenderer';\r\nimport { JsonCardView } from '@/components/shared/JsonCardView';\r\nimport { cn } from '@/lib/utils';\r\nimport type { AnalysisSessionSummary } from '@/types/analysis';\r\n\r\nconst PAGE_SIZE = 16; // 4 rows × 4 columns\r\n\r\n// ========== Session Card Component (Compact) ==========\r\n\r\ninterface SessionCardProps {\r\n session: AnalysisSessionSummary;\r\n onClick: () => void;\r\n onStatusClick: (status: string) => void;\r\n isStatusFiltered: boolean;\r\n}\r\n\r\nfunction SessionCard({ session, onClick, onStatusClick, isStatusFiltered }: SessionCardProps) {\r\n const handleStatusClick = (e: React.MouseEvent) => {\r\n e.stopPropagation(); // Prevent card click\r\n onStatusClick(session.status);\r\n };\r\n\r\n return (\r\n <Card\r\n className=\"p-3 cursor-pointer transition-all hover:shadow-md hover:border-primary/50 h-full flex flex-col\"\r\n onClick={onClick}\r\n >\r\n {/* Topic - smaller font */}\r\n <h3 className=\"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug\">\r\n {session.topic}\r\n </h3>\r\n\r\n {/* Session ID - truncate */}\r\n <p className=\"text-xs text-muted-foreground truncate mb-2\">\r\n {session.id}\r\n </p>\r\n\r\n {/* Status and Date */}\r\n <div className=\"flex items-center justify-between text-xs mt-auto pt-2 border-t\">\r\n <Badge\r\n variant={session.status === 'completed' ? 'success' : 'warning'}\r\n className={cn(\r\n \"text-[10px] px-1.5 py-0 cursor-pointer transition-all\",\r\n isStatusFiltered && \"ring-2 ring-primary ring-offset-1\"\r\n )}\r\n onClick={handleStatusClick}\r\n >\r\n {session.status === 'completed' ? (\r\n <><CheckCircle className=\"w-2.5 h-2.5 mr-0.5\" />完成</>\r\n ) : (\r\n <><Clock className=\"w-2.5 h-2.5 mr-0.5\" />进行中</>\r\n )}\r\n </Badge>\r\n <span className=\"text-muted-foreground\">{session.createdAt}</span>\r\n </div>\r\n\r\n {/* Conclusions indicator */}\r\n {session.hasConclusions && (\r\n <div className=\"flex items-center gap-1 text-[10px] text-muted-foreground mt-1\">\r\n <FileText className=\"w-2.5 h-2.5\" />\r\n <span>有结论</span>\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\n// ========== Detail Panel Component ==========\r\n\r\ninterface DetailPanelProps {\r\n sessionId: string;\r\n projectPath: string;\r\n}\r\n\r\nfunction DetailPanel({ sessionId, projectPath }: DetailPanelProps) {\r\n const [activeTab, setActiveTab] = useState('discussion');\r\n\r\n const { data: detail, isLoading, error } = useQuery({\r\n queryKey: ['analysis-detail', sessionId, projectPath],\r\n queryFn: () => fetchAnalysisDetail(sessionId, projectPath),\r\n });\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"flex items-center justify-center h-full p-4\">\r\n <div className=\"flex items-center gap-2 text-destructive\">\r\n <AlertCircle className=\"w-5 h-5\" />\r\n <span>加载失败: {(error as Error).message}</span>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!detail) return null;\r\n\r\n // Build available tabs based on content\r\n const tabs = [\r\n { value: 'discussion', label: '讨论记录', icon: <MessageSquare className=\"w-4 h-4\" /> },\r\n { value: 'conclusions', label: '结论', icon: <CheckCircle className=\"w-4 h-4\" /> },\r\n { value: 'explorations', label: '代码探索', icon: <Code className=\"w-4 h-4\" /> },\r\n { value: 'perspectives', label: '视角分析', icon: <FileText className=\"w-4 h-4\" /> },\r\n ].filter(tab => {\r\n const key = tab.value as keyof typeof detail;\r\n return detail[key];\r\n });\r\n\r\n // Ensure activeTab is valid\r\n const validTab = tabs.find(t => t.value === activeTab);\r\n if (!validTab && tabs.length > 0) {\r\n setActiveTab(tabs[0].value);\r\n }\r\n\r\n return (\r\n <div className=\"h-full flex flex-col\">\r\n {/* Session Info (in drawer, header is already shown) */}\r\n <div className=\"px-4 pb-3 border-b shrink-0\">\r\n <div className=\"min-w-0\">\r\n <h2 className=\"font-semibold truncate\">{detail.topic}</h2>\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n <Badge variant={detail.status === 'completed' ? 'default' : 'secondary'} className=\"text-xs\">\r\n {detail.status === 'completed' ? '完成' : '进行中'}\r\n </Badge>\r\n <span className=\"text-xs text-muted-foreground\">{detail.createdAt}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs Content */}\r\n {tabs.length > 0 ? (\r\n <>\r\n <TabsNavigation\r\n value={activeTab}\r\n onValueChange={setActiveTab}\r\n tabs={tabs}\r\n className=\"px-4\"\r\n />\r\n <div className=\"flex-1 overflow-auto min-h-0 p-4\">\r\n {/* Discussion Tab */}\r\n {activeTab === 'discussion' && detail.discussion && (\r\n <MessageRenderer content={detail.discussion} format=\"markdown\" />\r\n )}\r\n\r\n {/* Conclusions Tab */}\r\n {activeTab === 'conclusions' && detail.conclusions && (\r\n <JsonCardView data={detail.conclusions} />\r\n )}\r\n\r\n {/* Explorations Tab */}\r\n {activeTab === 'explorations' && detail.explorations && (\r\n <JsonCardView data={detail.explorations} />\r\n )}\r\n\r\n {/* Perspectives Tab */}\r\n {activeTab === 'perspectives' && detail.perspectives && (\r\n <JsonCardView data={detail.perspectives} />\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"flex-1 flex items-center justify-center text-muted-foreground\">\r\n 暂无分析内容\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ========== Main Component ==========\r\n\r\ntype DateFilter = 'all' | 'today' | 'week' | 'month';\r\ntype StatusFilter = 'all' | 'in_progress' | 'completed';\r\n\r\nconst DATE_FILTERS: { value: DateFilter; label: string }[] = [\r\n { value: 'all', label: '全部' },\r\n { value: 'today', label: '今天' },\r\n { value: 'week', label: '本周' },\r\n { value: 'month', label: '本月' },\r\n];\r\n\r\nconst STATUS_FILTERS: { value: StatusFilter; label: string; icon: React.ReactNode }[] = [\r\n { value: 'all', label: '全部', icon: <FileSearch className=\"w-4 h-4\" /> },\r\n { value: 'in_progress', label: '进行中', icon: <Clock className=\"w-4 h-4\" /> },\r\n { value: 'completed', label: '已完成', icon: <CheckCircle className=\"w-4 h-4\" /> },\r\n];\r\n\r\nexport function AnalysisPage() {\r\n const projectPath = useWorkflowStore((state) => state.projectPath);\r\n const isImmersiveMode = useAppStore((s) => s.isImmersiveMode);\r\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [selectedSession, setSelectedSession] = useState<string | null>(null);\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [dateFilter, setDateFilter] = useState<DateFilter>('all');\r\n const [statusFilter, setStatusFilter] = useState<StatusFilter>('all');\r\n const [selectedDate, setSelectedDate] = useState<string | null>(null);\r\n\r\n const { data: sessions = [], isLoading, error } = useQuery({\r\n queryKey: ['analysis-sessions', projectPath],\r\n queryFn: () => fetchAnalysisSessions(projectPath),\r\n });\r\n\r\n // Get unique dates with counts for quick filter bubbles\r\n const uniqueDates = useMemo(() => {\r\n const dateCounts = new Map<string, number>();\r\n sessions.forEach((session) => {\r\n const count = dateCounts.get(session.createdAt) || 0;\r\n dateCounts.set(session.createdAt, count + 1);\r\n });\r\n // Sort by date descending, show top 10\r\n return Array.from(dateCounts.entries())\r\n .sort((a, b) => b[0].localeCompare(a[0]))\r\n .slice(0, 10)\r\n .map(([date, count]) => ({\r\n date,\r\n label: date.slice(5), // MM-DD format\r\n count,\r\n }));\r\n }, [sessions]);\r\n\r\n // Filter by date, status and search query\r\n const filteredSessions = useMemo(() => {\r\n const now = new Date();\r\n const today = now.toISOString().split('T')[0];\r\n const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\r\n const monthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\r\n\r\n let filtered = sessions.filter((session) => {\r\n // Search filter\r\n const matchesSearch = session.topic.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n session.id.toLowerCase().includes(searchQuery.toLowerCase());\r\n\r\n // Status filter\r\n const matchesStatus = statusFilter === 'all' || session.status === statusFilter;\r\n\r\n // Date filter\r\n let matchesDate = true;\r\n if (selectedDate) {\r\n matchesDate = session.createdAt === selectedDate;\r\n } else if (dateFilter === 'today') {\r\n matchesDate = session.createdAt === today;\r\n } else if (dateFilter === 'week') {\r\n matchesDate = session.createdAt >= weekAgo;\r\n } else if (dateFilter === 'month') {\r\n matchesDate = session.createdAt >= monthAgo;\r\n }\r\n\r\n return matchesSearch && matchesStatus && matchesDate;\r\n });\r\n\r\n // Sort by createdAt descending (newest first)\r\n return filtered.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\r\n }, [sessions, searchQuery, dateFilter, statusFilter, selectedDate]);\r\n\r\n // Handle date select\r\n const handleDateSelect = (date: string) => {\r\n if (selectedDate === date) {\r\n setSelectedDate(null);\r\n } else {\r\n setSelectedDate(date);\r\n setDateFilter('all');\r\n }\r\n setCurrentPage(1);\r\n };\r\n\r\n // Handle status filter from card click\r\n const handleStatusClick = (status: string) => {\r\n if (statusFilter === status) {\r\n setStatusFilter('all');\r\n } else {\r\n setStatusFilter(status as StatusFilter);\r\n }\r\n setCurrentPage(1);\r\n };\r\n\r\n // Pagination\r\n const totalPages = Math.ceil(filteredSessions.length / PAGE_SIZE);\r\n const paginatedSessions = useMemo(() => {\r\n const start = (currentPage - 1) * PAGE_SIZE;\r\n return filteredSessions.slice(start, start + PAGE_SIZE);\r\n }, [filteredSessions, currentPage]);\r\n\r\n // Reset to page 1 when filters change\r\n const handleSearchChange = (value: string) => {\r\n setSearchQuery(value);\r\n setCurrentPage(1);\r\n };\r\n\r\n const handleDateFilterChange = (filter: DateFilter) => {\r\n setDateFilter(filter);\r\n setCurrentPage(1);\r\n };\r\n\r\n const handleStatusFilterChange = (filter: StatusFilter) => {\r\n setStatusFilter(filter);\r\n setSelectedDate(null);\r\n setCurrentPage(1);\r\n };\r\n\r\n return (\r\n <div className={cn(\r\n \"h-full flex overflow-hidden\",\r\n isImmersiveMode && \"fixed inset-0 z-50 bg-background\"\r\n )}>\r\n {/* Main Content - List */}\r\n <div className=\"flex-1 flex flex-col p-4 space-y-3 overflow-auto\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between shrink-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileSearch className=\"w-5 h-5 text-primary\" />\r\n <div>\r\n <h1 className=\"text-xl font-semibold text-foreground\">\r\n Analysis Viewer\r\n </h1>\r\n <p className=\"text-xs text-muted-foreground mt-0.5\">\r\n 查看 /workflow:analyze-with-file 命令的分析结果\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n 共 {filteredSessions.length} 个会话\r\n </span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7 w-7 p-0\"\r\n onClick={toggleImmersiveMode}\r\n title={isImmersiveMode ? '退出全屏' : '全屏模式'}\r\n >\r\n {isImmersiveMode ? (\r\n <Minimize2 className=\"w-4 h-4\" />\r\n ) : (\r\n <Maximize2 className=\"w-4 h-4\" />\r\n )}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* Filters */}\r\n <div className=\"flex items-center gap-4 shrink-0\">\r\n {/* Search */}\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\r\n <Input\r\n placeholder=\"搜索分析会话...\"\r\n value={searchQuery}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n className=\"pl-9\"\r\n />\r\n </div>\r\n\r\n {/* Status Filter Tabs */}\r\n <div className=\"flex items-center gap-1 bg-muted/50 rounded-lg p-1\">\r\n {STATUS_FILTERS.map((filter) => (\r\n <Button\r\n key={filter.value}\r\n variant={statusFilter === filter.value ? 'default' : 'ghost'}\r\n size=\"sm\"\r\n className=\"h-7 px-3 text-xs gap-1\"\r\n onClick={() => handleStatusFilterChange(filter.value)}\r\n >\r\n {filter.icon}\r\n {filter.label}\r\n </Button>\r\n ))}\r\n </div>\r\n\r\n {/* Date Filter Tabs */}\r\n <div className=\"flex items-center gap-1 bg-muted/50 rounded-lg p-1\">\r\n {DATE_FILTERS.map((filter) => (\r\n <Button\r\n key={filter.value}\r\n variant={dateFilter === filter.value ? 'default' : 'ghost'}\r\n size=\"sm\"\r\n className=\"h-7 px-3 text-xs\"\r\n onClick={() => handleDateFilterChange(filter.value)}\r\n >\r\n {filter.label}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Date Quick Filter Bubbles */}\r\n <div className=\"flex items-center gap-2 flex-wrap shrink-0\">\r\n {uniqueDates.map((date) => (\r\n <Button\r\n key={date.date}\r\n variant={selectedDate === date.date ? 'default' : 'outline'}\r\n size=\"sm\"\r\n className=\"h-7 px-2 text-xs gap-1\"\r\n onClick={() => handleDateSelect(date.date)}\r\n >\r\n <span>{date.label}</span>\r\n <Badge variant=\"secondary\" className=\"ml-1 px-1.5 py-0 text-[10px]\">\r\n {date.count}\r\n </Badge>\r\n </Button>\r\n ))}\r\n </div>\r\n\r\n {/* Content */}\r\n {isLoading ? (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\r\n </div>\r\n ) : error ? (\r\n <Card className=\"p-6\">\r\n <div className=\"flex items-center gap-2 text-destructive\">\r\n <AlertCircle className=\"w-5 h-5\" />\r\n <span>加载失败: {(error as Error).message}</span>\r\n </div>\r\n </Card>\r\n ) : filteredSessions.length === 0 ? (\r\n <Card className=\"p-12 text-center\">\r\n <FileSearch className=\"w-12 h-12 mx-auto text-muted-foreground mb-4\" />\r\n <p className=\"text-muted-foreground\">\r\n {searchQuery ? '没有匹配的分析会话' : '暂无分析会话'}\r\n </p>\r\n <p className=\"text-sm text-muted-foreground mt-2\">\r\n 使用 /workflow:analyze-with-file 命令创建分析\r\n </p>\r\n </Card>\r\n ) : (\r\n <>\r\n {/* Grid - flex-1 to fill remaining space */}\r\n <div className=\"flex-1 grid grid-cols-4 gap-3 content-start\">\r\n {paginatedSessions.map((session) => (\r\n <SessionCard\r\n key={session.id}\r\n session={session}\r\n onClick={() => setSelectedSession(session.id)}\r\n onStatusClick={handleStatusClick}\r\n isStatusFiltered={statusFilter !== 'all'}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"flex items-center justify-center gap-2 pt-4\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n disabled={currentPage === 1}\r\n onClick={() => setCurrentPage(p => p - 1)}\r\n >\r\n <ChevronLeft className=\"w-4 h-4\" />\r\n </Button>\r\n <span className=\"text-sm text-muted-foreground px-3\">\r\n {currentPage} / {totalPages}\r\n </span>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n disabled={currentPage === totalPages}\r\n onClick={() => setCurrentPage(p => p + 1)}\r\n >\r\n <ChevronRight className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Detail Drawer */}\r\n <Drawer open={!!selectedSession} onOpenChange={(open) => !open && setSelectedSession(null)}>\r\n <DrawerContent side=\"right\" className=\"w-1/2 h-full max-w-none\">\r\n <DrawerHeader className=\"shrink-0\">\r\n <DrawerTitle>分析详情</DrawerTitle>\r\n <DrawerClose asChild>\r\n <Button variant=\"ghost\" size=\"sm\" className=\"absolute right-4 top-4\">\r\n <X className=\"w-4 h-4\" />\r\n </Button>\r\n </DrawerClose>\r\n </DrawerHeader>\r\n {selectedSession && (\r\n <DetailPanel\r\n sessionId={selectedSession}\r\n projectPath={projectPath}\r\n />\r\n )}\r\n </DrawerContent>\r\n </Drawer>\r\n </div>\r\n );\r\n}\r\n\r\nexport default AnalysisPage;\r\n"],"names":["isObject","value","isArray","formatLabel","key","str","PrimitiveValue","jsx","Badge","ArrayView","items","displayName","expanded","setExpanded","useState","jsxs","Database","item","index","ChevronDown","ChevronRight","Card","ObjectView","data","depth","entries","CardItem","label","formattedLabel","cn","JsonCardView","className","PAGE_SIZE","SessionCard","session","onClick","onStatusClick","isStatusFiltered","handleStatusClick","e","Fragment","CheckCircle","Clock","FileText","DetailPanel","sessionId","projectPath","activeTab","setActiveTab","detail","isLoading","error","useQuery","fetchAnalysisDetail","Loader2","AlertCircle","tabs","MessageSquare","Code","tab","t","TabsNavigation","MessageRenderer","DATE_FILTERS","STATUS_FILTERS","FileSearch","AnalysisPage","useWorkflowStore","state","isImmersiveMode","useAppStore","toggleImmersiveMode","searchQuery","setSearchQuery","selectedSession","setSelectedSession","currentPage","setCurrentPage","dateFilter","setDateFilter","statusFilter","setStatusFilter","selectedDate","setSelectedDate","sessions","fetchAnalysisSessions","uniqueDates","useMemo","dateCounts","count","a","b","date","filteredSessions","now","today","weekAgo","monthAgo","matchesSearch","matchesStatus","matchesDate","handleDateSelect","status","totalPages","paginatedSessions","start","handleSearchChange","handleDateFilterChange","filter","handleStatusFilterChange","Button","Minimize2","Maximize2","Search","Input","p","ChevronLeft","Drawer","open","DrawerContent","DrawerHeader","DrawerTitle","DrawerClose","X"],"mappings":"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"}