@polderlabs/bizar 10.4.2 → 10.4.4

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 (262) hide show
  1. package/bizar-dash/dist/assets/{ActivityFeed-DtRtg-JN.js → ActivityFeed-RQeyFifx.js} +1 -1
  2. package/bizar-dash/dist/assets/{ActivityFeed-DtRtg-JN.js.map → ActivityFeed-RQeyFifx.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityView-CoTXDyU_.js → ActivityView-CibyssPM.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-CoTXDyU_.js.map → ActivityView-CibyssPM.js.map} +1 -1
  5. package/bizar-dash/dist/assets/AdminView-BjczABeB.js +11 -0
  6. package/bizar-dash/dist/assets/AdminView-BjczABeB.js.map +1 -0
  7. package/bizar-dash/dist/assets/{AgentActivity-CrX7LmQ6.js → AgentActivity-Bywt1twv.js} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-CrX7LmQ6.js.map → AgentActivity-Bywt1twv.js.map} +1 -1
  9. package/bizar-dash/dist/assets/AgentsView-BnOjjM74.js +15 -0
  10. package/bizar-dash/dist/assets/AgentsView-BnOjjM74.js.map +1 -0
  11. package/bizar-dash/dist/assets/{Alert-B6DjfRFI.js → Alert-BZGk39mB.js} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-B6DjfRFI.js.map → Alert-BZGk39mB.js.map} +1 -1
  13. package/bizar-dash/dist/assets/{ArtifactsView-znhN8GTR.js → ArtifactsView-CfYB1le1.js} +3 -3
  14. package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js.map +1 -0
  15. package/bizar-dash/dist/assets/{AuthView-Rk8eKUPr.js → AuthView-D4frSShw.js} +1 -1
  16. package/bizar-dash/dist/assets/{AuthView-Rk8eKUPr.js.map → AuthView-D4frSShw.js.map} +1 -1
  17. package/bizar-dash/dist/assets/Avatar-BYg0rkPA.js +6 -0
  18. package/bizar-dash/dist/assets/Avatar-BYg0rkPA.js.map +1 -0
  19. package/bizar-dash/dist/assets/{BackgroundJobsView-BLWuN9qz.js → BackgroundJobsView-DEStvILz.js} +1 -1
  20. package/bizar-dash/dist/assets/{BackgroundJobsView-BLWuN9qz.js.map → BackgroundJobsView-DEStvILz.js.map} +1 -1
  21. package/bizar-dash/dist/assets/{BackupView-CqbtcnuQ.js → BackupView-B875KQa4.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-CqbtcnuQ.js.map → BackupView-B875KQa4.js.map} +1 -1
  23. package/bizar-dash/dist/assets/Banner-C8HEcT5l.js +1 -0
  24. package/bizar-dash/dist/assets/Banner-C8HEcT5l.js.map +1 -0
  25. package/bizar-dash/dist/assets/{Card-rF59wHiO.js → Card-BtsmkhJa.js} +1 -1
  26. package/bizar-dash/dist/assets/{Card-rF59wHiO.js.map → Card-BtsmkhJa.js.map} +1 -1
  27. package/bizar-dash/dist/assets/ChatView-CkNS0SD8.js +9 -0
  28. package/bizar-dash/dist/assets/ChatView-CkNS0SD8.js.map +1 -0
  29. package/bizar-dash/dist/assets/{Chip-Dc2KmeWl.js → Chip-XPOk0d_E.js} +1 -1
  30. package/bizar-dash/dist/assets/{Chip-Dc2KmeWl.js.map → Chip-XPOk0d_E.js.map} +1 -1
  31. package/bizar-dash/dist/assets/{ClaudeSessionsView-CiaHQdDZ.js → ClaudeSessionsView-BprGo67K.js} +1 -1
  32. package/bizar-dash/dist/assets/{ClaudeSessionsView-CiaHQdDZ.js.map → ClaudeSessionsView-BprGo67K.js.map} +1 -1
  33. package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js +1 -0
  34. package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js.map +1 -0
  35. package/bizar-dash/dist/assets/{ConfigView-B2ysnTZU.js → ConfigView-BntUrW7s.js} +1 -1
  36. package/bizar-dash/dist/assets/{ConfigView-B2ysnTZU.js.map → ConfigView-BntUrW7s.js.map} +1 -1
  37. package/bizar-dash/dist/assets/DiagnosticsView-4x0Zu3yP.js +2 -0
  38. package/bizar-dash/dist/assets/DiagnosticsView-4x0Zu3yP.js.map +1 -0
  39. package/bizar-dash/dist/assets/DialogsView-Xd02dVAX.js +6 -0
  40. package/bizar-dash/dist/assets/DialogsView-Xd02dVAX.js.map +1 -0
  41. package/bizar-dash/dist/assets/{DoctorView-BQwqvMAh.js → DoctorView-DepBdQGR.js} +2 -2
  42. package/bizar-dash/dist/assets/{DoctorView-BQwqvMAh.js.map → DoctorView-DepBdQGR.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-D65J5FQN.js → EmptyState-DjKtY1Qi.js} +1 -1
  44. package/bizar-dash/dist/assets/{EmptyState-D65J5FQN.js.map → EmptyState-DjKtY1Qi.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-DX-3oGH-.js → EnvVarsView-S4Pbm128.js} +3 -3
  46. package/bizar-dash/dist/assets/{EnvVarsView-DX-3oGH-.js.map → EnvVarsView-S4Pbm128.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-DULZnttJ.js → ErrorState-CBJbEQ8B.js} +1 -1
  48. package/bizar-dash/dist/assets/{ErrorState-DULZnttJ.js.map → ErrorState-CBJbEQ8B.js.map} +1 -1
  49. package/bizar-dash/dist/assets/EvalView-BeAyMCD1.js +1 -0
  50. package/bizar-dash/dist/assets/{EvalView-CpdFu_ID.js.map → EvalView-BeAyMCD1.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-Br8oPPfb.js → GoalsView-BZr8In4c.js} +1 -1
  52. package/bizar-dash/dist/assets/{GoalsView-Br8oPPfb.js.map → GoalsView-BZr8In4c.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{Grid-BSXhsCPC.js → Grid--WKvqu5h.js} +1 -1
  54. package/bizar-dash/dist/assets/{Grid-BSXhsCPC.js.map → Grid--WKvqu5h.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{HistoryView-D0J3aoZF.js → HistoryView-djEbzqtk.js} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-D0J3aoZF.js.map → HistoryView-djEbzqtk.js.map} +1 -1
  57. package/bizar-dash/dist/assets/{Input-CZmRw5QX.js → Input-h_nSOtwm.js} +1 -1
  58. package/bizar-dash/dist/assets/{Input-CZmRw5QX.js.map → Input-h_nSOtwm.js.map} +1 -1
  59. package/bizar-dash/dist/assets/LibrariesView-Vez8CvNq.js +6 -0
  60. package/bizar-dash/dist/assets/{LibrariesView-B1YX9wzp.js.map → LibrariesView-Vez8CvNq.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{LightRAGView-CykR0t9y.js → LightRAGView-DvqzQoBp.js} +1 -1
  62. package/bizar-dash/dist/assets/{LightRAGView-CykR0t9y.js.map → LightRAGView-DvqzQoBp.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{ListHeader-Dpun-r36.js → ListHeader-CM8QoIWG.js} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-Dpun-r36.js.map → ListHeader-CM8QoIWG.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MemoryView-BbER5ZKt.js → MemoryView-DnL8E2vI.js} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-BbER5ZKt.js.map → MemoryView-DnL8E2vI.js.map} +1 -1
  67. package/bizar-dash/dist/assets/{MessageBubble-5vUAquDx.js → MessageBubble-CrCJ0SYG.js} +1 -1
  68. package/bizar-dash/dist/assets/{MessageBubble-5vUAquDx.js.map → MessageBubble-CrCJ0SYG.js.map} +1 -1
  69. package/bizar-dash/dist/assets/MiscView-B2YQXhZ_.js +1 -0
  70. package/bizar-dash/dist/assets/MiscView-B2YQXhZ_.js.map +1 -0
  71. package/bizar-dash/dist/assets/{ModsView-P7gDeNHM.js → ModsView-BVM3X5xc.js} +1 -1
  72. package/bizar-dash/dist/assets/{ModsView-P7gDeNHM.js.map → ModsView-BVM3X5xc.js.map} +1 -1
  73. package/bizar-dash/dist/assets/NotificationsView-A-Xs8BL1.js +6 -0
  74. package/bizar-dash/dist/assets/NotificationsView-A-Xs8BL1.js.map +1 -0
  75. package/bizar-dash/dist/assets/ObsidianView-mI3qW9OP.js +1 -0
  76. package/bizar-dash/dist/assets/{ObsidianView-Ci80gnwS.js.map → ObsidianView-mI3qW9OP.js.map} +1 -1
  77. package/bizar-dash/dist/assets/OverviewView-By69Cr5H.js +1 -0
  78. package/bizar-dash/dist/assets/OverviewView-By69Cr5H.js.map +1 -0
  79. package/bizar-dash/dist/assets/{ProgressBar-BahmeJhP.js → ProgressBar-BnaBqv-W.js} +1 -1
  80. package/bizar-dash/dist/assets/{ProgressBar-BahmeJhP.js.map → ProgressBar-BnaBqv-W.js.map} +1 -1
  81. package/bizar-dash/dist/assets/ProjectsView-C81WTFka.js +11 -0
  82. package/bizar-dash/dist/assets/ProjectsView-C81WTFka.js.map +1 -0
  83. package/bizar-dash/dist/assets/{ProvidersView-BftGn8Cr.js → ProvidersView-2cn-TALE.js} +2 -2
  84. package/bizar-dash/dist/assets/{ProvidersView-BftGn8Cr.js.map → ProvidersView-2cn-TALE.js.map} +1 -1
  85. package/bizar-dash/dist/assets/{SchedulesView-CtNxtzN6.js → SchedulesView-o9AtIsH9.js} +1 -1
  86. package/bizar-dash/dist/assets/{SchedulesView-CtNxtzN6.js.map → SchedulesView-o9AtIsH9.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{Select-0VcfTDeL.js → Select-CiGWEN8I.js} +1 -1
  88. package/bizar-dash/dist/assets/{Select-0VcfTDeL.js.map → Select-CiGWEN8I.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsRow-BLic3DQl.js → SettingsRow-CflGJymA.js} +1 -1
  90. package/bizar-dash/dist/assets/{SettingsRow-BLic3DQl.js.map → SettingsRow-CflGJymA.js.map} +1 -1
  91. package/bizar-dash/dist/assets/{SettingsView-BjS3i4nr.js → SettingsView-2HSFJPPK.js} +1 -1
  92. package/bizar-dash/dist/assets/{SettingsView-BjS3i4nr.js.map → SettingsView-2HSFJPPK.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Sheet-BOProMs2.js → Sheet-B-CMP9-_.js} +1 -1
  94. package/bizar-dash/dist/assets/{Sheet-BOProMs2.js.map → Sheet-B-CMP9-_.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Slider-B0eLEEUt.js → Slider-Z4TP_CXY.js} +1 -1
  96. package/bizar-dash/dist/assets/{Slider-B0eLEEUt.js.map → Slider-Z4TP_CXY.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{Sparkline-SSrdgyW0.js → Sparkline-cvkv2HbU.js} +1 -1
  98. package/bizar-dash/dist/assets/{Sparkline-SSrdgyW0.js.map → Sparkline-cvkv2HbU.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{Switch-B3EQzb_q.js → Switch-jcYo4lmp.js} +1 -1
  100. package/bizar-dash/dist/assets/{Switch-B3EQzb_q.js.map → Switch-jcYo4lmp.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{TasksView-SWjF_ZUQ.js → TasksView-CQaSFzWY.js} +2 -2
  102. package/bizar-dash/dist/assets/{TasksView-SWjF_ZUQ.js.map → TasksView-CQaSFzWY.js.map} +1 -1
  103. package/bizar-dash/dist/assets/{Textarea-QuofpMlq.js → Textarea-xnAybFGd.js} +1 -1
  104. package/bizar-dash/dist/assets/{Textarea-QuofpMlq.js.map → Textarea-xnAybFGd.js.map} +1 -1
  105. package/bizar-dash/dist/assets/UpdateView-BUAEcRCX.js +1 -0
  106. package/bizar-dash/dist/assets/UpdateView-BUAEcRCX.js.map +1 -0
  107. package/bizar-dash/dist/assets/{UsageView-BqOw6FBg.js → UsageView-DMFbBOfH.js} +1 -1
  108. package/bizar-dash/dist/assets/{UsageView-BqOw6FBg.js.map → UsageView-DMFbBOfH.js.map} +1 -1
  109. package/bizar-dash/dist/assets/{ViewHeader-B6P-C4GD.js → ViewHeader-C-t1U2cQ.js} +1 -1
  110. package/bizar-dash/dist/assets/{ViewHeader-B6P-C4GD.js.map → ViewHeader-C-t1U2cQ.js.map} +1 -1
  111. package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js +1 -0
  112. package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js.map +1 -0
  113. package/bizar-dash/dist/assets/{brain-CwZt9Kta.js → brain-DhAzcHUk.js} +1 -1
  114. package/bizar-dash/dist/assets/{brain-CwZt9Kta.js.map → brain-DhAzcHUk.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{calendar-C5oK0_nM.js → calendar-B9Wbemh7.js} +1 -1
  116. package/bizar-dash/dist/assets/{calendar-C5oK0_nM.js.map → calendar-B9Wbemh7.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-D1Lc_P2a.js → circle-6NJF_Xl6.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-D1Lc_P2a.js.map → circle-6NJF_Xl6.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{circle-alert-HdHe7m8K.js → circle-alert-Dz8lGfCZ.js} +1 -1
  120. package/bizar-dash/dist/assets/{circle-alert-HdHe7m8K.js.map → circle-alert-Dz8lGfCZ.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{circle-check-Cs-xoV7R.js → circle-check-DFB50ojt.js} +1 -1
  122. package/bizar-dash/dist/assets/{circle-check-Cs-xoV7R.js.map → circle-check-DFB50ojt.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{clock-DEIuPV60.js → clock-ClVA6-hQ.js} +1 -1
  124. package/bizar-dash/dist/assets/{clock-DEIuPV60.js.map → clock-ClVA6-hQ.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{cmdk-DVxytz9i.js → cmdk-C3F6LD6N.js} +5 -5
  126. package/bizar-dash/dist/assets/{cmdk-DVxytz9i.js.map → cmdk-C3F6LD6N.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{dnd-kit-DrHErSkw.js → dnd-kit-BAOLODOI.js} +1 -1
  128. package/bizar-dash/dist/assets/{dnd-kit-DrHErSkw.js.map → dnd-kit-BAOLODOI.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{download-Clkq90Ct.js → download-BvJddD8D.js} +1 -1
  130. package/bizar-dash/dist/assets/{download-Clkq90Ct.js.map → download-BvJddD8D.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{external-link-D5tq2o_I.js → external-link-DvL89gaZ.js} +1 -1
  132. package/bizar-dash/dist/assets/{external-link-D5tq2o_I.js.map → external-link-DvL89gaZ.js.map} +1 -1
  133. package/bizar-dash/dist/assets/{file-text-CQ12t7Oc.js → file-text-BOroDtZE.js} +1 -1
  134. package/bizar-dash/dist/assets/{file-text-CQ12t7Oc.js.map → file-text-BOroDtZE.js.map} +1 -1
  135. package/bizar-dash/dist/assets/{filter-BcbE37wP.js → filter-DwPjMRQt.js} +1 -1
  136. package/bizar-dash/dist/assets/{filter-BcbE37wP.js.map → filter-DwPjMRQt.js.map} +1 -1
  137. package/bizar-dash/dist/assets/{git-pull-request-D1qNDRia.js → git-pull-request-TDb1inux.js} +1 -1
  138. package/bizar-dash/dist/assets/{git-pull-request-D1qNDRia.js.map → git-pull-request-TDb1inux.js.map} +1 -1
  139. package/bizar-dash/dist/assets/{index-CASP1n-5.js → index-B1OIS316.js} +1 -1
  140. package/bizar-dash/dist/assets/{index-CASP1n-5.js.map → index-B1OIS316.js.map} +1 -1
  141. package/bizar-dash/dist/assets/{index-C4Vq_2LM.js → index-CR0TeJmc.js} +1 -1
  142. package/bizar-dash/dist/assets/{index-C4Vq_2LM.js.map → index-CR0TeJmc.js.map} +1 -1
  143. package/bizar-dash/dist/assets/{main-CcQfRfIJ.css → main-B7D_IMTh.css} +1 -1
  144. package/bizar-dash/dist/assets/main-BURAlktW.js +277 -0
  145. package/bizar-dash/dist/assets/main-BURAlktW.js.map +1 -0
  146. package/bizar-dash/dist/assets/{network-DJdvVaHx.js → network-BcCoCzIY.js} +1 -1
  147. package/bizar-dash/dist/assets/{network-DJdvVaHx.js.map → network-BcCoCzIY.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{pause-DUn9L5PB.js → pause-BllItT2_.js} +1 -1
  149. package/bizar-dash/dist/assets/{pause-DUn9L5PB.js.map → pause-BllItT2_.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{pencil-DVrBlYV3.js → pencil-DAwM-CC3.js} +1 -1
  151. package/bizar-dash/dist/assets/{pencil-DVrBlYV3.js.map → pencil-DAwM-CC3.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{play-CZjsr3XM.js → play-mJh67AXo.js} +2 -2
  153. package/bizar-dash/dist/assets/{play-CZjsr3XM.js.map → play-mJh67AXo.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{plug-BKuyIe5W.js → plug-BjfntCMC.js} +1 -1
  155. package/bizar-dash/dist/assets/{plug-BKuyIe5W.js.map → plug-BjfntCMC.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{plus-77h62zZm.js → plus-Cm6-fo14.js} +1 -1
  157. package/bizar-dash/dist/assets/{plus-77h62zZm.js.map → plus-Cm6-fo14.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{power-DLmx-gCP.js → power-CXN9y2KV.js} +1 -1
  159. package/bizar-dash/dist/assets/{power-DLmx-gCP.js.map → power-CXN9y2KV.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{power-off-BFKzHXic.js → power-off-DUZqwMf9.js} +1 -1
  161. package/bizar-dash/dist/assets/{power-off-BFKzHXic.js.map → power-off-DUZqwMf9.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{refresh-ccw-DenGBOcq.js → refresh-ccw-DA8_IB9l.js} +1 -1
  163. package/bizar-dash/dist/assets/{refresh-ccw-DenGBOcq.js.map → refresh-ccw-DA8_IB9l.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{refresh-cw-ENBVR8hW.js → refresh-cw-DwlP59en.js} +1 -1
  165. package/bizar-dash/dist/assets/{refresh-cw-ENBVR8hW.js.map → refresh-cw-DwlP59en.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{rotate-ccw-MxryaY7q.js → rotate-ccw-DMTASfAn.js} +1 -1
  167. package/bizar-dash/dist/assets/{rotate-ccw-MxryaY7q.js.map → rotate-ccw-DMTASfAn.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{rotate-cw-CDOlRtUR.js → rotate-cw-BDX5SE2s.js} +1 -1
  169. package/bizar-dash/dist/assets/{rotate-cw-CDOlRtUR.js.map → rotate-cw-BDX5SE2s.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{save-Db1b-1Uq.js → save-Y0jPK5D6.js} +1 -1
  171. package/bizar-dash/dist/assets/{save-Db1b-1Uq.js.map → save-Y0jPK5D6.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{send-yz6HFZM5.js → send-C8wwPHhR.js} +2 -2
  173. package/bizar-dash/dist/assets/{send-yz6HFZM5.js.map → send-C8wwPHhR.js.map} +1 -1
  174. package/bizar-dash/dist/assets/{shield-alert-DY6RAaC8.js → shield-alert-DEvq9UG0.js} +1 -1
  175. package/bizar-dash/dist/assets/{shield-alert-DY6RAaC8.js.map → shield-alert-DEvq9UG0.js.map} +1 -1
  176. package/bizar-dash/dist/assets/{trash-2-Cv7U38jw.js → trash-2-D6qePV_q.js} +2 -2
  177. package/bizar-dash/dist/assets/{trash-2-Cv7U38jw.js.map → trash-2-D6qePV_q.js.map} +1 -1
  178. package/bizar-dash/dist/assets/{trending-up-CRPNagyX.js → trending-up-BZzo_1ic.js} +1 -1
  179. package/bizar-dash/dist/assets/{trending-up-CRPNagyX.js.map → trending-up-BZzo_1ic.js.map} +1 -1
  180. package/bizar-dash/dist/assets/{triangle-alert-tUTXbcEP.js → triangle-alert-B2oHbmoh.js} +1 -1
  181. package/bizar-dash/dist/assets/{triangle-alert-tUTXbcEP.js.map → triangle-alert-B2oHbmoh.js.map} +1 -1
  182. package/bizar-dash/dist/assets/{upload-Cq7uTsrT.js → upload-Dy59aZn6.js} +1 -1
  183. package/bizar-dash/dist/assets/{upload-Cq7uTsrT.js.map → upload-Dy59aZn6.js.map} +1 -1
  184. package/bizar-dash/dist/assets/{zap-5lAQBAPX.js → zap-DENVhJnO.js} +2 -2
  185. package/bizar-dash/dist/assets/{zap-5lAQBAPX.js.map → zap-DENVhJnO.js.map} +1 -1
  186. package/bizar-dash/dist/index.html +3 -3
  187. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  188. package/bizar-dash/src/web/v8/App.tsx +87 -6
  189. package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +4 -4
  190. package/bizar-dash/src/web/v8/shell/AppShell.tsx +38 -2
  191. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +52 -38
  192. package/bizar-dash/src/web/v8/shell/Topbar.tsx +62 -3
  193. package/bizar-dash/src/web/v8/ui/styles/globals.css +40 -0
  194. package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +11 -6
  195. package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +32 -5
  196. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +36 -4
  197. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +1 -1
  198. package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +13 -1
  199. package/bizar-dash/src/web/v8/views/ClaudeSessions/NewSessionModal.tsx +136 -0
  200. package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +1 -1
  201. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +14 -4
  202. package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +50 -7
  203. package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +1 -1
  204. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +6 -1
  205. package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +1 -1
  206. package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +82 -13
  207. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +19 -0
  208. package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +21 -1
  209. package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +1 -1
  210. package/bizar-dash/tests/admin-labels.test.mjs +42 -0
  211. package/bizar-dash/tests/admin-run-grouping.test.mjs +42 -0
  212. package/bizar-dash/tests/agents-preview-truncate.test.mjs +35 -0
  213. package/bizar-dash/tests/agents-summary-sanitize.test.ts +51 -0
  214. package/bizar-dash/tests/chat-new-session.test.mjs +63 -0
  215. package/bizar-dash/tests/empty-state-docs.test.mjs +55 -0
  216. package/bizar-dash/tests/focus-visible.test.mjs +30 -0
  217. package/bizar-dash/tests/kanban-empty-column.test.mjs +56 -0
  218. package/bizar-dash/tests/library-dedupe.test.mjs +62 -0
  219. package/bizar-dash/tests/notifications-dismiss-restore.test.mjs +85 -0
  220. package/bizar-dash/tests/palette-shortcut-hint.test.mjs +58 -0
  221. package/bizar-dash/tests/projects-filter.test.mjs +48 -0
  222. package/bizar-dash/tests/settings-labels.test.mjs +80 -0
  223. package/bizar-dash/tests/sidebar-distinct-icons.test.mjs +28 -0
  224. package/bizar-dash/tests/sidebar-responsive.test.tsx +48 -0
  225. package/bizar-dash/tests/sidebar-section-toggle.test.tsx +63 -0
  226. package/bizar-dash/tests/theme-toggle-icon.test.mjs +28 -0
  227. package/bizar-dash/tests/topbar-design-system.test.mjs +56 -0
  228. package/bizar-dash/vite.config.ts +8 -0
  229. package/package.json +1 -1
  230. package/packages/sdk/package.json +1 -1
  231. package/bizar-dash/dist/assets/AdminView-DNc5Ll7L.js +0 -11
  232. package/bizar-dash/dist/assets/AdminView-DNc5Ll7L.js.map +0 -1
  233. package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js +0 -13
  234. package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js.map +0 -1
  235. package/bizar-dash/dist/assets/ArtifactsView-znhN8GTR.js.map +0 -1
  236. package/bizar-dash/dist/assets/Avatar-B41upSD1.js +0 -6
  237. package/bizar-dash/dist/assets/Avatar-B41upSD1.js.map +0 -1
  238. package/bizar-dash/dist/assets/ChatView-CUriVEgU.js +0 -9
  239. package/bizar-dash/dist/assets/ChatView-CUriVEgU.js.map +0 -1
  240. package/bizar-dash/dist/assets/ClipboardView-DdP6aVso.js +0 -1
  241. package/bizar-dash/dist/assets/ClipboardView-DdP6aVso.js.map +0 -1
  242. package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js +0 -2
  243. package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js.map +0 -1
  244. package/bizar-dash/dist/assets/DialogsView-BcqDDCZQ.js +0 -6
  245. package/bizar-dash/dist/assets/DialogsView-BcqDDCZQ.js.map +0 -1
  246. package/bizar-dash/dist/assets/EvalView-CpdFu_ID.js +0 -1
  247. package/bizar-dash/dist/assets/LibrariesView-B1YX9wzp.js +0 -6
  248. package/bizar-dash/dist/assets/MiscView-DLNEGdML.js +0 -1
  249. package/bizar-dash/dist/assets/MiscView-DLNEGdML.js.map +0 -1
  250. package/bizar-dash/dist/assets/NotificationsView-DAm2O0yf.js +0 -6
  251. package/bizar-dash/dist/assets/NotificationsView-DAm2O0yf.js.map +0 -1
  252. package/bizar-dash/dist/assets/ObsidianView-Ci80gnwS.js +0 -1
  253. package/bizar-dash/dist/assets/OverviewView-rriw1GjA.js +0 -1
  254. package/bizar-dash/dist/assets/OverviewView-rriw1GjA.js.map +0 -1
  255. package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js +0 -11
  256. package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js.map +0 -1
  257. package/bizar-dash/dist/assets/UpdateView-CEHW2nd6.js +0 -6
  258. package/bizar-dash/dist/assets/UpdateView-CEHW2nd6.js.map +0 -1
  259. package/bizar-dash/dist/assets/VoiceView-CwrPwWgi.js +0 -1
  260. package/bizar-dash/dist/assets/VoiceView-CwrPwWgi.js.map +0 -1
  261. package/bizar-dash/dist/assets/main-Cxeu4LhG.js +0 -244
  262. package/bizar-dash/dist/assets/main-Cxeu4LhG.js.map +0 -1
@@ -1 +1 @@
1
- import{r as h,j as e}from"./cmdk-DVxytz9i.js";import{A as y}from"./Alert-B6DjfRFI.js";import{d as f}from"./main-Cxeu4LhG.js";import{C as j}from"./circle-alert-HdHe7m8K.js";import{R as v}from"./refresh-ccw-DenGBOcq.js";function u(t){return t==null?"":typeof t=="string"?t:t.message}const b=h.forwardRef(function(m,n){const{title:o="Something went wrong",description:s,error:x,onRetry:r,retryLabel:a="Retry",block:p=!1,silent:g=!1,testid:d,className:l,...c}=m,i=g?"":u(x);return p?e.jsxs("div",{ref:n,"data-testid":d??"error-state",className:l,style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",padding:"var(--space-12) var(--space-6)",textAlign:"center",color:"var(--fg-muted)"},...c,children:[e.jsx("div",{style:{color:"var(--danger)",display:"inline-flex"},children:e.jsx(j,{size:28,"aria-hidden":!0})}),e.jsx("div",{style:{fontSize:"var(--fs-16)",fontWeight:600,color:"var(--fg)"},children:o}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",maxWidth:480},children:s}),i!==""&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:i}),r!==void 0&&e.jsxs(f,{variant:"primary",onClick:r,"data-testid":"error-state-retry",children:[e.jsx(v,{size:14,"aria-hidden":!0})," ",a]})]}):e.jsx("div",{ref:n,"data-testid":d??"error-state",className:l,...c,children:e.jsxs(y,{tone:"danger",title:o,action:r!==void 0?e.jsxs(f,{variant:"ghost",onClick:r,"data-testid":"error-state-retry","aria-label":a,children:[e.jsx(v,{size:14,"aria-hidden":!0})," ",a]}):void 0,children:[s,i!==""&&e.jsx("div",{style:{marginTop:"var(--space-1)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:i})]})})});export{b as E};
1
+ import{r as h,j as e}from"./cmdk-C3F6LD6N.js";import{A as y}from"./Alert-BZGk39mB.js";import{B as f}from"./main-BURAlktW.js";import{C as j}from"./circle-alert-Dz8lGfCZ.js";import{R as v}from"./refresh-ccw-DA8_IB9l.js";function u(t){return t==null?"":typeof t=="string"?t:t.message}const b=h.forwardRef(function(m,n){const{title:o="Something went wrong",description:s,error:x,onRetry:r,retryLabel:a="Retry",block:p=!1,silent:g=!1,testid:d,className:l,...c}=m,i=g?"":u(x);return p?e.jsxs("div",{ref:n,"data-testid":d??"error-state",className:l,style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",padding:"var(--space-12) var(--space-6)",textAlign:"center",color:"var(--fg-muted)"},...c,children:[e.jsx("div",{style:{color:"var(--danger)",display:"inline-flex"},children:e.jsx(j,{size:28,"aria-hidden":!0})}),e.jsx("div",{style:{fontSize:"var(--fs-16)",fontWeight:600,color:"var(--fg)"},children:o}),s!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",maxWidth:480},children:s}),i!==""&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:i}),r!==void 0&&e.jsxs(f,{variant:"primary",onClick:r,"data-testid":"error-state-retry",children:[e.jsx(v,{size:14,"aria-hidden":!0})," ",a]})]}):e.jsx("div",{ref:n,"data-testid":d??"error-state",className:l,...c,children:e.jsxs(y,{tone:"danger",title:o,action:r!==void 0?e.jsxs(f,{variant:"ghost",onClick:r,"data-testid":"error-state-retry","aria-label":a,children:[e.jsx(v,{size:14,"aria-hidden":!0})," ",a]}):void 0,children:[s,i!==""&&e.jsx("div",{style:{marginTop:"var(--space-1)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:i})]})})});export{b as E};
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorState-DULZnttJ.js","sources":["../../src/web/v8/ui/feedback/ErrorState.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { AlertCircle, RefreshCcw } from 'lucide-react';\nimport { Alert } from './Alert.js';\nimport { Button } from '../controls/Button.js';\n\n/**\n * ErrorState — surfaced error with optional retry CTA.\n *\n * Use when a view's primary fetch failed and we want to recover,\n * not when the fetch succeeded with zero rows (use EmptyState).\n *\n * Two layout modes:\n * - inline (default): Alert-tone=danger banner with optional retry button\n * - block: centered icon + title + description + retry (mirrors EmptyState)\n *\n * `error` is the raw error (Error | string | null). When non-null,\n * the message is rendered below the title. Use the `silent` flag to\n * omit the message (e.g. when the parent already shows it).\n */\nexport interface ErrorStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: ReactNode;\n description?: ReactNode;\n error?: Error | string | null;\n onRetry?: () => void;\n retryLabel?: string;\n /** Use the centered block layout instead of the inline Alert. */\n block?: boolean;\n /** Hide the error message (parent surfaces it elsewhere). */\n silent?: boolean;\n testid?: string;\n}\n\nfunction errMessage(error: Error | string | null | undefined): string {\n if (error === null || error === undefined) return '';\n return typeof error === 'string' ? error : error.message;\n}\n\nexport const ErrorState = forwardRef<HTMLDivElement, ErrorStateProps>(function ErrorState(\n props,\n ref,\n) {\n const {\n title = 'Something went wrong',\n description,\n error,\n onRetry,\n retryLabel = 'Retry',\n block = false,\n silent = false,\n testid,\n className,\n ...rest\n } = props;\n\n const message = silent ? '' : errMessage(error);\n\n if (block) {\n return (\n <div\n ref={ref}\n data-testid={testid ?? 'error-state'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-12) var(--space-6)',\n textAlign: 'center',\n color: 'var(--fg-muted)',\n }}\n {...rest}\n >\n <div style={{ color: 'var(--danger)', display: 'inline-flex' }}>\n <AlertCircle size={28} aria-hidden />\n </div>\n <div style={{ fontSize: 'var(--fs-16)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', maxWidth: 480 }}>{description}</div>\n )}\n {message !== '' && (\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{message}</code>\n )}\n {onRetry !== undefined && (\n <Button variant=\"primary\" onClick={onRetry} data-testid=\"error-state-retry\">\n <RefreshCcw size={14} aria-hidden /> {retryLabel}\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <div ref={ref} data-testid={testid ?? 'error-state'} className={className} {...rest}>\n <Alert\n tone=\"danger\"\n title={title}\n action={\n onRetry !== undefined ? (\n <Button variant=\"ghost\" onClick={onRetry} data-testid=\"error-state-retry\" aria-label={retryLabel}>\n <RefreshCcw size={14} aria-hidden /> {retryLabel}\n </Button>\n ) : undefined\n }\n >\n {description}\n {message !== '' && (\n <div style={{ marginTop: 'var(--space-1)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>\n {message}\n </div>\n )}\n </Alert>\n </div>\n );\n});"],"names":["errMessage","error","ErrorState","forwardRef","props","ref","title","description","onRetry","retryLabel","block","silent","testid","className","rest","message","jsxs","jsx","AlertCircle","Button","RefreshCcw","Alert"],"mappings":"0NAgCA,SAASA,EAAWC,EAAkD,CACpE,OAAIA,GAAU,KAAoC,GAC3C,OAAOA,GAAU,SAAWA,EAAQA,EAAM,OACnD,CAEO,MAAMC,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CACJ,MAAAC,EAAQ,uBACR,YAAAC,EACA,MAAAN,EACA,QAAAO,EACA,WAAAC,EAAa,QACb,MAAAC,EAAQ,GACR,OAAAC,EAAS,GACT,OAAAC,EACA,UAAAC,EACA,GAAGC,CAAA,EACDV,EAEEW,EAAUJ,EAAS,GAAKX,EAAWC,CAAK,EAE9C,OAAIS,EAEAM,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,cAAaO,GAAU,cACvB,UAAAC,EACA,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,iBACL,QAAS,iCACT,UAAW,SACX,MAAO,iBAAA,EAER,GAAGC,EAEJ,SAAA,CAAAG,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO,gBAAiB,QAAS,aAAA,EAC7C,SAAAA,EAAAA,IAACC,EAAA,CAAY,KAAM,GAAI,cAAW,GAAC,EACrC,EACAD,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAX,CAAA,CAAM,EACrFC,IAAgB,QACfU,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,SAAU,GAAA,EAAQ,SAAAV,CAAA,CAAY,EAEvEQ,IAAY,IACXE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAF,CAAA,CAAQ,EAEhFP,IAAY,QACXQ,OAACG,EAAA,CAAO,QAAQ,UAAU,QAASX,EAAS,cAAY,oBACtD,SAAA,CAAAS,EAAAA,IAACG,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEX,CAAA,CAAA,CACxC,CAAA,CAAA,CAAA,EAONQ,MAAC,OAAI,IAAAZ,EAAU,cAAaO,GAAU,cAAe,UAAAC,EAAuB,GAAGC,EAC7E,SAAAE,EAAAA,KAACK,EAAA,CACC,KAAK,SACL,MAAAf,EACA,OACEE,IAAY,OACVQ,EAAAA,KAACG,EAAA,CAAO,QAAQ,QAAQ,QAASX,EAAS,cAAY,oBAAoB,aAAYC,EACpF,SAAA,CAAAQ,EAAAA,IAACG,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEX,CAAA,CAAA,CACxC,EACE,OAGL,SAAA,CAAAF,EACAQ,IAAY,IACXE,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAW,iBAAkB,WAAY,mBAAoB,SAAU,cAAA,EAClF,SAAAF,CAAA,CACH,CAAA,CAAA,CAAA,EAGN,CAEJ,CAAC"}
1
+ {"version":3,"file":"ErrorState-CBJbEQ8B.js","sources":["../../src/web/v8/ui/feedback/ErrorState.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { AlertCircle, RefreshCcw } from 'lucide-react';\nimport { Alert } from './Alert.js';\nimport { Button } from '../controls/Button.js';\n\n/**\n * ErrorState — surfaced error with optional retry CTA.\n *\n * Use when a view's primary fetch failed and we want to recover,\n * not when the fetch succeeded with zero rows (use EmptyState).\n *\n * Two layout modes:\n * - inline (default): Alert-tone=danger banner with optional retry button\n * - block: centered icon + title + description + retry (mirrors EmptyState)\n *\n * `error` is the raw error (Error | string | null). When non-null,\n * the message is rendered below the title. Use the `silent` flag to\n * omit the message (e.g. when the parent already shows it).\n */\nexport interface ErrorStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: ReactNode;\n description?: ReactNode;\n error?: Error | string | null;\n onRetry?: () => void;\n retryLabel?: string;\n /** Use the centered block layout instead of the inline Alert. */\n block?: boolean;\n /** Hide the error message (parent surfaces it elsewhere). */\n silent?: boolean;\n testid?: string;\n}\n\nfunction errMessage(error: Error | string | null | undefined): string {\n if (error === null || error === undefined) return '';\n return typeof error === 'string' ? error : error.message;\n}\n\nexport const ErrorState = forwardRef<HTMLDivElement, ErrorStateProps>(function ErrorState(\n props,\n ref,\n) {\n const {\n title = 'Something went wrong',\n description,\n error,\n onRetry,\n retryLabel = 'Retry',\n block = false,\n silent = false,\n testid,\n className,\n ...rest\n } = props;\n\n const message = silent ? '' : errMessage(error);\n\n if (block) {\n return (\n <div\n ref={ref}\n data-testid={testid ?? 'error-state'}\n className={className}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-12) var(--space-6)',\n textAlign: 'center',\n color: 'var(--fg-muted)',\n }}\n {...rest}\n >\n <div style={{ color: 'var(--danger)', display: 'inline-flex' }}>\n <AlertCircle size={28} aria-hidden />\n </div>\n <div style={{ fontSize: 'var(--fs-16)', fontWeight: 600, color: 'var(--fg)' }}>{title}</div>\n {description !== undefined && (\n <div style={{ fontSize: 'var(--fs-13)', maxWidth: 480 }}>{description}</div>\n )}\n {message !== '' && (\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-subtle)' }}>{message}</code>\n )}\n {onRetry !== undefined && (\n <Button variant=\"primary\" onClick={onRetry} data-testid=\"error-state-retry\">\n <RefreshCcw size={14} aria-hidden /> {retryLabel}\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <div ref={ref} data-testid={testid ?? 'error-state'} className={className} {...rest}>\n <Alert\n tone=\"danger\"\n title={title}\n action={\n onRetry !== undefined ? (\n <Button variant=\"ghost\" onClick={onRetry} data-testid=\"error-state-retry\" aria-label={retryLabel}>\n <RefreshCcw size={14} aria-hidden /> {retryLabel}\n </Button>\n ) : undefined\n }\n >\n {description}\n {message !== '' && (\n <div style={{ marginTop: 'var(--space-1)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>\n {message}\n </div>\n )}\n </Alert>\n </div>\n );\n});"],"names":["errMessage","error","ErrorState","forwardRef","props","ref","title","description","onRetry","retryLabel","block","silent","testid","className","rest","message","jsxs","jsx","AlertCircle","Button","RefreshCcw","Alert"],"mappings":"0NAgCA,SAASA,EAAWC,EAAkD,CACpE,OAAIA,GAAU,KAAoC,GAC3C,OAAOA,GAAU,SAAWA,EAAQA,EAAM,OACnD,CAEO,MAAMC,EAAaC,EAAAA,WAA4C,SACpEC,EACAC,EACA,CACA,KAAM,CACJ,MAAAC,EAAQ,uBACR,YAAAC,EACA,MAAAN,EACA,QAAAO,EACA,WAAAC,EAAa,QACb,MAAAC,EAAQ,GACR,OAAAC,EAAS,GACT,OAAAC,EACA,UAAAC,EACA,GAAGC,CAAA,EACDV,EAEEW,EAAUJ,EAAS,GAAKX,EAAWC,CAAK,EAE9C,OAAIS,EAEAM,EAAAA,KAAC,MAAA,CACC,IAAAX,EACA,cAAaO,GAAU,cACvB,UAAAC,EACA,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,iBACL,QAAS,iCACT,UAAW,SACX,MAAO,iBAAA,EAER,GAAGC,EAEJ,SAAA,CAAAG,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO,gBAAiB,QAAS,aAAA,EAC7C,SAAAA,EAAAA,IAACC,EAAA,CAAY,KAAM,GAAI,cAAW,GAAC,EACrC,EACAD,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,WAAY,IAAK,MAAO,WAAA,EAAgB,SAAAX,CAAA,CAAM,EACrFC,IAAgB,QACfU,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,SAAU,eAAgB,SAAU,GAAA,EAAQ,SAAAV,CAAA,CAAY,EAEvEQ,IAAY,IACXE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,SAAU,eAAgB,MAAO,kBAAA,EAAuB,SAAAF,CAAA,CAAQ,EAEhFP,IAAY,QACXQ,OAACG,EAAA,CAAO,QAAQ,UAAU,QAASX,EAAS,cAAY,oBACtD,SAAA,CAAAS,EAAAA,IAACG,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEX,CAAA,CAAA,CACxC,CAAA,CAAA,CAAA,EAONQ,MAAC,OAAI,IAAAZ,EAAU,cAAaO,GAAU,cAAe,UAAAC,EAAuB,GAAGC,EAC7E,SAAAE,EAAAA,KAACK,EAAA,CACC,KAAK,SACL,MAAAf,EACA,OACEE,IAAY,OACVQ,EAAAA,KAACG,EAAA,CAAO,QAAQ,QAAQ,QAASX,EAAS,cAAY,oBAAoB,aAAYC,EACpF,SAAA,CAAAQ,EAAAA,IAACG,EAAA,CAAW,KAAM,GAAI,cAAW,GAAC,EAAE,IAAEX,CAAA,CAAA,CACxC,EACE,OAGL,SAAA,CAAAF,EACAQ,IAAY,IACXE,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAW,iBAAkB,WAAY,mBAAoB,SAAU,cAAA,EAClF,SAAAF,CAAA,CACH,CAAA,CAAA,CAAA,EAGN,CAEJ,CAAC"}
@@ -0,0 +1 @@
1
+ import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as P,S as i,I as s,B as d,J as N,h as T,N as q,b as f,i as j,F as y}from"./main-BURAlktW.js";import{V as I}from"./ViewHeader-C-t1U2cQ.js";import{C as R,b as $}from"./Card-BtsmkhJa.js";import{E as M}from"./EmptyState-DjKtY1Qi.js";import{P as V}from"./play-mJh67AXo.js";import{R as J}from"./refresh-cw-DwlP59en.js";import{C as O}from"./calendar-B9Wbemh7.js";import{P as H}from"./plus-Cm6-fo14.js";import{T as U}from"./trash-2-D6qePV_q.js";function W(t){return t==="done"?"success":t==="failed"?"danger":t==="running"?"info":t==="queued"?"warning":"neutral"}function G(t){return!t||t<=0?"—":t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${Math.floor(t/6e4)}m ${Math.round(t%6e4/1e3)}s`}function ne(){var E,F;const t=P("/api/eval/runs?limit=20"),g=P("/api/eval/schedules"),[o,b]=r.useState(!1),[v,A]=r.useState("default"),[C,l]=r.useState(null),[z,m]=r.useState(!1),[n,c]=r.useState({name:"",cron:"",suitePath:"default"}),[w,k]=r.useState(!1);r.useEffect(()=>{var a;if((a=t.data)!=null&&a.runs&&t.data.runs.some(h=>h.status==="running"||h.status==="queued")){const h=setTimeout(()=>{t.refetch()},5e3);return()=>clearTimeout(h)}},[t]);const L=async()=>{b(!0),l(null);try{await j("/api/eval/run",{method:"POST",body:{suite:v}}),t.refetch()}catch(a){l((a instanceof y,a.message))}finally{b(!1)}},p=((E=t.data)==null?void 0:E.runs)??[],B=async()=>{if(!(!n.name.trim()||!n.cron.trim())){k(!0),l(null);try{await j("/api/eval/schedules",{method:"POST",body:n}),m(!1),c({name:"",cron:"",suitePath:"default"}),g.refetch()}catch(a){l((a instanceof y,a.message))}finally{k(!1)}}},D=async a=>{l(null);try{await j(`/api/eval/schedules/${encodeURIComponent(a)}`,{method:"DELETE"}),g.refetch()}catch(u){l((u instanceof y,u.message))}},x=((F=g.data)==null?void 0:F.schedules)??[];return e.jsxs(i,{gap:5,"data-testid":"eval-view",children:[e.jsx(I,{title:"Eval framework",description:"Run evaluation suites against the agent model. Suites live under fixtures/.",actions:e.jsxs(s,{gap:2,align:"center",children:[C!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:C}),e.jsx("input",{value:v,onChange:a=>A(a.target.value),placeholder:"suite name",disabled:o,"data-testid":"eval-suite-input",style:{padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontSize:"var(--fs-13)",fontFamily:"var(--font-mono)"}}),e.jsxs(d,{variant:"primary",onClick:()=>void L(),disabled:o||!v.trim(),"data-testid":"eval-launch",children:[o?e.jsx(N,{size:14,className:"animate-spin","aria-hidden":!0}):e.jsx(V,{size:14,"aria-hidden":!0}),o?"Launching…":"Run suite"]}),e.jsxs(d,{variant:"ghost",onClick:()=>void t.refetch(),"data-testid":"eval-refresh",children:[e.jsx(J,{size:14,"aria-hidden":!0})," Refresh"]})]})}),t.loading&&p.length===0?e.jsxs(i,{gap:2,children:[e.jsx(T,{style:{height:80}}),e.jsx(T,{style:{height:80}})]}):p.length===0?e.jsx(M,{icon:e.jsx(q,{size:32,"aria-hidden":!0}),title:"No eval runs yet",description:"Launch a suite to begin measuring agent quality."}):e.jsx(i,{gap:2,children:p.map(a=>e.jsx(R,{variant:"default",children:e.jsx($,{children:e.jsxs(s,{align:"center",justify:"between",gap:3,children:[e.jsxs(i,{gap:1,style:{flex:1,minWidth:0},children:[e.jsxs(s,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-13)"},children:a.id}),e.jsx(f,{tone:W(a.status),children:a.status??"unknown"}),a.suite&&e.jsx(f,{tone:"neutral",children:a.suite})]}),e.jsxs(s,{align:"center",gap:3,style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:[e.jsx("span",{children:a.startedAt?new Date(a.startedAt).toLocaleString():""}),e.jsx("span",{children:G(a.durationMs)})]})]}),e.jsxs(i,{align:"end",gap:0,children:[e.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-14)"},children:[e.jsx("strong",{style:{color:"var(--success)"},children:a.passed??0})," pass"," / ",e.jsx("strong",{style:{color:"var(--danger)"},children:a.failed??0})," fail"]}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[a.total??0," total"]})]})]})})},a.id))}),e.jsx(R,{variant:"elevated",children:e.jsxs($,{children:[e.jsxs(s,{align:"center",justify:"between",gap:2,children:[e.jsxs(s,{align:"center",gap:2,children:[e.jsx(O,{size:16,"aria-hidden":!0}),e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:"Schedules"}),e.jsx(f,{tone:"neutral",children:x.length})]}),!z&&e.jsxs(d,{variant:"primary",onClick:()=>m(!0),"data-testid":"eval-schedule-add",children:[e.jsx(H,{size:14,"aria-hidden":!0})," Add schedule"]})]}),z&&e.jsxs(i,{gap:2,style:{marginTop:"var(--space-3)"},"data-testid":"eval-schedule-form",children:[e.jsxs(s,{gap:2,align:"center",children:[e.jsx("input",{value:n.name,onChange:a=>c({...n,name:a.target.value}),placeholder:"name","data-testid":"eval-schedule-form-name",style:S}),e.jsx("input",{value:n.cron,onChange:a=>c({...n,cron:a.target.value}),placeholder:"cron (e.g. 0 9 * * *)","data-testid":"eval-schedule-form-cron",style:S}),e.jsx("input",{value:n.suitePath,onChange:a=>c({...n,suitePath:a.target.value}),placeholder:"suite path","data-testid":"eval-schedule-form-suite",style:S})]}),e.jsxs(s,{gap:2,children:[e.jsx(d,{variant:"primary",onClick:()=>void B(),disabled:w,"data-testid":"eval-schedule-form-submit",children:w?"Saving…":"Save"}),e.jsx(d,{variant:"ghost",onClick:()=>m(!1),"data-testid":"eval-schedule-form-cancel",children:"Cancel"})]})]}),x.length===0?e.jsx("div",{style:{marginTop:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"No schedules yet. Add one to run suites on a cron."}):e.jsx(i,{gap:2,style:{marginTop:"var(--space-3)"},children:x.map(a=>e.jsxs(s,{align:"center",justify:"between",gap:2,"data-testid":`eval-schedule-row-${a.id}`,children:[e.jsxs(s,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-13)"},children:a.name}),e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.cron}),a.suitePath&&e.jsx(f,{tone:"neutral",children:a.suitePath})]}),e.jsx(d,{variant:"ghost",onClick:()=>void D(a.id),"data-testid":`eval-schedule-delete-${a.id}`,"aria-label":`Delete schedule ${a.name}`,children:e.jsx(U,{size:14,"aria-hidden":!0})})]},a.id))})]})})]})}const S={padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",background:"var(--surface-0)",color:"var(--fg)",fontSize:"var(--fs-13)",fontFamily:"var(--font-mono)"};export{ne as EvalView};
@@ -1 +1 @@
1
- {"version":3,"file":"EvalView-CpdFu_ID.js","sources":["../../src/web/v8/views/Eval/EvalView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Calendar, FlaskConical, Play, Plus, RefreshCw, Trash2, Loader2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * EvalView — Sprint S35. Eval runs list + launch new suite.\n */\n\ntype Tone = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\ninterface EvalRun {\n id: string;\n suite?: string;\n status?: 'queued' | 'running' | 'done' | 'failed';\n passed?: number;\n failed?: number;\n total?: number;\n startedAt?: string;\n durationMs?: number;\n}\n\ninterface EvalSchedule {\n id: string;\n name: string;\n cron: string;\n suitePath?: string;\n enabled?: boolean;\n}\n\nfunction statusTone(s: EvalRun['status'] | undefined): Tone {\n if (s === 'done') return 'success';\n if (s === 'failed') return 'danger';\n if (s === 'running') return 'info';\n if (s === 'queued') return 'warning';\n return 'neutral';\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n if (!ms || ms <= 0) return '—';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;\n}\n\nexport function EvalView(): JSX.Element {\n const runs = useFetch<{ runs: EvalRun[] }>('/api/eval/runs?limit=20');\n const schedules = useFetch<{ schedules: EvalSchedule[] }>('/api/eval/schedules');\n const [launching, setLaunching] = useState(false);\n const [suite, setSuite] = useState('default');\n const [error, setError] = useState<string | null>(null);\n const [addingSchedule, setAddingSchedule] = useState(false);\n const [scheduleForm, setScheduleForm] = useState({ name: '', cron: '', suitePath: 'default' });\n const [busySchedule, setBusySchedule] = useState(false);\n\n useEffect(() => {\n if (runs.data?.runs) {\n const hasActive = runs.data.runs.some((r) => r.status === 'running' || r.status === 'queued');\n if (hasActive) {\n const id = setTimeout(() => { void runs.refetch(); }, 5_000);\n return () => clearTimeout(id);\n }\n }\n }, [runs]);\n\n const launch = async (): Promise<void> => {\n setLaunching(true);\n setError(null);\n try {\n await fetchJson('/api/eval/run', { method: 'POST', body: { suite } });\n void runs.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setLaunching(false);\n }\n };\n\n const list = runs.data?.runs ?? [];\n\n const addSchedule = async (): Promise<void> => {\n if (!scheduleForm.name.trim() || !scheduleForm.cron.trim()) return;\n setBusySchedule(true);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean }>('/api/eval/schedules', { method: 'POST', body: scheduleForm });\n setAddingSchedule(false);\n setScheduleForm({ name: '', cron: '', suitePath: 'default' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusySchedule(false);\n }\n };\n\n const deleteSchedule = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/eval/schedules/${encodeURIComponent(id)}`, { method: 'DELETE' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const scheduleList = schedules.data?.schedules ?? [];\n\n return (\n <Stack gap={5} data-testid=\"eval-view\">\n <ViewHeader\n title=\"Eval framework\"\n description=\"Run evaluation suites against the agent model. Suites live under fixtures/.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <input\n value={suite}\n onChange={(e) => setSuite(e.target.value)}\n placeholder=\"suite name\"\n disabled={launching}\n data-testid=\"eval-suite-input\"\n style={{\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n }}\n />\n <Button variant=\"primary\" onClick={() => void launch()} disabled={launching || !suite.trim()} data-testid=\"eval-launch\">\n {launching ? <Loader2 size={14} className=\"animate-spin\" aria-hidden /> : <Play size={14} aria-hidden />}\n {launching ? 'Launching…' : 'Run suite'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void runs.refetch()} data-testid=\"eval-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n {runs.loading && list.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 80 }} />\n <Skeleton style={{ height: 80 }} />\n </Stack>\n ) : list.length === 0 ? (\n <EmptyState\n icon={<FlaskConical size={32} aria-hidden />}\n title=\"No eval runs yet\"\n description=\"Launch a suite to begin measuring agent quality.\"\n />\n ) : (\n <Stack gap={2}>\n {list.map((r) => (\n <Card key={r.id} variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{r.id}</strong>\n <Badge tone={statusTone(r.status)}>{r.status ?? 'unknown'}</Badge>\n {r.suite && <Badge tone=\"neutral\">{r.suite}</Badge>}\n </Inline>\n <Inline align=\"center\" gap={3} style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n <span>{r.startedAt ? new Date(r.startedAt).toLocaleString() : ''}</span>\n <span>{fmtDuration(r.durationMs)}</span>\n </Inline>\n </Stack>\n <Stack align=\"end\" gap={0}>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-14)' }}>\n <strong style={{ color: 'var(--success)' }}>{r.passed ?? 0}</strong> pass\n {' / '}\n <strong style={{ color: 'var(--danger)' }}>{r.failed ?? 0}</strong> fail\n </span>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{(r.total ?? 0)} total</span>\n </Stack>\n </Inline>\n </CardBody>\n </Card>\n ))}\n </Stack>\n )}\n\n <Card variant=\"elevated\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Calendar size={16} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-14)' }}>Schedules</strong>\n <Badge tone=\"neutral\">{scheduleList.length}</Badge>\n </Inline>\n {!addingSchedule && (\n <Button variant=\"primary\" onClick={() => setAddingSchedule(true)} data-testid=\"eval-schedule-add\">\n <Plus size={14} aria-hidden /> Add schedule\n </Button>\n )}\n </Inline>\n\n {addingSchedule && (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }} data-testid=\"eval-schedule-form\">\n <Inline gap={2} align=\"center\">\n <input\n value={scheduleForm.name}\n onChange={(e) => setScheduleForm({ ...scheduleForm, name: e.target.value })}\n placeholder=\"name\"\n data-testid=\"eval-schedule-form-name\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.cron}\n onChange={(e) => setScheduleForm({ ...scheduleForm, cron: e.target.value })}\n placeholder=\"cron (e.g. 0 9 * * *)\"\n data-testid=\"eval-schedule-form-cron\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.suitePath}\n onChange={(e) => setScheduleForm({ ...scheduleForm, suitePath: e.target.value })}\n placeholder=\"suite path\"\n data-testid=\"eval-schedule-form-suite\"\n style={inputStyle}\n />\n </Inline>\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => void addSchedule()} disabled={busySchedule} data-testid=\"eval-schedule-form-submit\">\n {busySchedule ? 'Saving…' : 'Save'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setAddingSchedule(false)} data-testid=\"eval-schedule-form-cancel\">Cancel</Button>\n </Inline>\n </Stack>\n )}\n\n {scheduleList.length === 0 ? (\n <div style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No schedules yet. Add one to run suites on a cron.\n </div>\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }}>\n {scheduleList.map((s) => (\n <Inline key={s.id} align=\"center\" justify=\"between\" gap={2} data-testid={`eval-schedule-row-${s.id}`}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{s.name}</strong>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.cron}</code>\n {s.suitePath && <Badge tone=\"neutral\">{s.suitePath}</Badge>}\n </Inline>\n <Button variant=\"ghost\" onClick={() => void deleteSchedule(s.id)} data-testid={`eval-schedule-delete-${s.id}`} aria-label={`Delete schedule ${s.name}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}\n\nconst inputStyle = {\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n} as const;"],"names":["statusTone","s","fmtDuration","ms","EvalView","runs","useFetch","schedules","launching","setLaunching","useState","suite","setSuite","error","setError","addingSchedule","setAddingSchedule","scheduleForm","setScheduleForm","busySchedule","setBusySchedule","useEffect","_a","r","id","launch","fetchJson","err","FetchError","list","addSchedule","deleteSchedule","scheduleList","_b","jsxs","Stack","jsx","ViewHeader","Inline","e","Button","Loader2","Play","RefreshCw","Skeleton","EmptyState","FlaskConical","Card","CardBody","Badge","Calendar","Plus","inputStyle","Trash2"],"mappings":"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"}
1
+ {"version":3,"file":"EvalView-BeAyMCD1.js","sources":["../../src/web/v8/views/Eval/EvalView.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Calendar, FlaskConical, Play, Plus, RefreshCw, Trash2, Loader2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * EvalView — Sprint S35. Eval runs list + launch new suite.\n */\n\ntype Tone = 'neutral' | 'success' | 'warning' | 'danger' | 'info';\n\ninterface EvalRun {\n id: string;\n suite?: string;\n status?: 'queued' | 'running' | 'done' | 'failed';\n passed?: number;\n failed?: number;\n total?: number;\n startedAt?: string;\n durationMs?: number;\n}\n\ninterface EvalSchedule {\n id: string;\n name: string;\n cron: string;\n suitePath?: string;\n enabled?: boolean;\n}\n\nfunction statusTone(s: EvalRun['status'] | undefined): Tone {\n if (s === 'done') return 'success';\n if (s === 'failed') return 'danger';\n if (s === 'running') return 'info';\n if (s === 'queued') return 'warning';\n return 'neutral';\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n if (!ms || ms <= 0) return '—';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;\n}\n\nexport function EvalView(): JSX.Element {\n const runs = useFetch<{ runs: EvalRun[] }>('/api/eval/runs?limit=20');\n const schedules = useFetch<{ schedules: EvalSchedule[] }>('/api/eval/schedules');\n const [launching, setLaunching] = useState(false);\n const [suite, setSuite] = useState('default');\n const [error, setError] = useState<string | null>(null);\n const [addingSchedule, setAddingSchedule] = useState(false);\n const [scheduleForm, setScheduleForm] = useState({ name: '', cron: '', suitePath: 'default' });\n const [busySchedule, setBusySchedule] = useState(false);\n\n useEffect(() => {\n if (runs.data?.runs) {\n const hasActive = runs.data.runs.some((r) => r.status === 'running' || r.status === 'queued');\n if (hasActive) {\n const id = setTimeout(() => { void runs.refetch(); }, 5_000);\n return () => clearTimeout(id);\n }\n }\n }, [runs]);\n\n const launch = async (): Promise<void> => {\n setLaunching(true);\n setError(null);\n try {\n await fetchJson('/api/eval/run', { method: 'POST', body: { suite } });\n void runs.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setLaunching(false);\n }\n };\n\n const list = runs.data?.runs ?? [];\n\n const addSchedule = async (): Promise<void> => {\n if (!scheduleForm.name.trim() || !scheduleForm.cron.trim()) return;\n setBusySchedule(true);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean }>('/api/eval/schedules', { method: 'POST', body: scheduleForm });\n setAddingSchedule(false);\n setScheduleForm({ name: '', cron: '', suitePath: 'default' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusySchedule(false);\n }\n };\n\n const deleteSchedule = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/eval/schedules/${encodeURIComponent(id)}`, { method: 'DELETE' });\n void schedules.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const scheduleList = schedules.data?.schedules ?? [];\n\n return (\n <Stack gap={5} data-testid=\"eval-view\">\n <ViewHeader\n title=\"Eval framework\"\n description=\"Run evaluation suites against the agent model. Suites live under fixtures/.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>}\n <input\n value={suite}\n onChange={(e) => setSuite(e.target.value)}\n placeholder=\"suite name\"\n disabled={launching}\n data-testid=\"eval-suite-input\"\n style={{\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n }}\n />\n <Button variant=\"primary\" onClick={() => void launch()} disabled={launching || !suite.trim()} data-testid=\"eval-launch\">\n {launching ? <Loader2 size={14} className=\"animate-spin\" aria-hidden /> : <Play size={14} aria-hidden />}\n {launching ? 'Launching…' : 'Run suite'}\n </Button>\n <Button variant=\"ghost\" onClick={() => void runs.refetch()} data-testid=\"eval-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n }\n />\n\n {runs.loading && list.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 80 }} />\n <Skeleton style={{ height: 80 }} />\n </Stack>\n ) : list.length === 0 ? (\n <EmptyState\n icon={<FlaskConical size={32} aria-hidden />}\n title=\"No eval runs yet\"\n description=\"Launch a suite to begin measuring agent quality.\"\n />\n ) : (\n <Stack gap={2}>\n {list.map((r) => (\n <Card key={r.id} variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ flex: 1, minWidth: 0 }}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{r.id}</strong>\n <Badge tone={statusTone(r.status)}>{r.status ?? 'unknown'}</Badge>\n {r.suite && <Badge tone=\"neutral\">{r.suite}</Badge>}\n </Inline>\n <Inline align=\"center\" gap={3} style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n <span>{r.startedAt ? new Date(r.startedAt).toLocaleString() : ''}</span>\n <span>{fmtDuration(r.durationMs)}</span>\n </Inline>\n </Stack>\n <Stack align=\"end\" gap={0}>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-14)' }}>\n <strong style={{ color: 'var(--success)' }}>{r.passed ?? 0}</strong> pass\n {' / '}\n <strong style={{ color: 'var(--danger)' }}>{r.failed ?? 0}</strong> fail\n </span>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{(r.total ?? 0)} total</span>\n </Stack>\n </Inline>\n </CardBody>\n </Card>\n ))}\n </Stack>\n )}\n\n <Card variant=\"elevated\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <Inline align=\"center\" gap={2}>\n <Calendar size={16} aria-hidden />\n <strong style={{ fontSize: 'var(--fs-14)' }}>Schedules</strong>\n <Badge tone=\"neutral\">{scheduleList.length}</Badge>\n </Inline>\n {!addingSchedule && (\n <Button variant=\"primary\" onClick={() => setAddingSchedule(true)} data-testid=\"eval-schedule-add\">\n <Plus size={14} aria-hidden /> Add schedule\n </Button>\n )}\n </Inline>\n\n {addingSchedule && (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }} data-testid=\"eval-schedule-form\">\n <Inline gap={2} align=\"center\">\n <input\n value={scheduleForm.name}\n onChange={(e) => setScheduleForm({ ...scheduleForm, name: e.target.value })}\n placeholder=\"name\"\n data-testid=\"eval-schedule-form-name\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.cron}\n onChange={(e) => setScheduleForm({ ...scheduleForm, cron: e.target.value })}\n placeholder=\"cron (e.g. 0 9 * * *)\"\n data-testid=\"eval-schedule-form-cron\"\n style={inputStyle}\n />\n <input\n value={scheduleForm.suitePath}\n onChange={(e) => setScheduleForm({ ...scheduleForm, suitePath: e.target.value })}\n placeholder=\"suite path\"\n data-testid=\"eval-schedule-form-suite\"\n style={inputStyle}\n />\n </Inline>\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => void addSchedule()} disabled={busySchedule} data-testid=\"eval-schedule-form-submit\">\n {busySchedule ? 'Saving…' : 'Save'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setAddingSchedule(false)} data-testid=\"eval-schedule-form-cancel\">Cancel</Button>\n </Inline>\n </Stack>\n )}\n\n {scheduleList.length === 0 ? (\n <div style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No schedules yet. Add one to run suites on a cron.\n </div>\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-3)' }}>\n {scheduleList.map((s) => (\n <Inline key={s.id} align=\"center\" justify=\"between\" gap={2} data-testid={`eval-schedule-row-${s.id}`}>\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-13)' }}>{s.name}</strong>\n <code style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.cron}</code>\n {s.suitePath && <Badge tone=\"neutral\">{s.suitePath}</Badge>}\n </Inline>\n <Button variant=\"ghost\" onClick={() => void deleteSchedule(s.id)} data-testid={`eval-schedule-delete-${s.id}`} aria-label={`Delete schedule ${s.name}`}>\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}\n\nconst inputStyle = {\n padding: '6px 10px',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontSize: 'var(--fs-13)',\n fontFamily: 'var(--font-mono)',\n} as const;"],"names":["statusTone","s","fmtDuration","ms","EvalView","runs","useFetch","schedules","launching","setLaunching","useState","suite","setSuite","error","setError","addingSchedule","setAddingSchedule","scheduleForm","setScheduleForm","busySchedule","setBusySchedule","useEffect","_a","r","id","launch","fetchJson","err","FetchError","list","addSchedule","deleteSchedule","scheduleList","_b","jsxs","Stack","jsx","ViewHeader","Inline","e","Button","Loader2","Play","RefreshCw","Skeleton","EmptyState","FlaskConical","Card","CardBody","Badge","Calendar","Plus","inputStyle","Trash2"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{j as e,r}from"./cmdk-DVxytz9i.js";import{B as F,g as q,S as f,I as C,d as b,h as K,i as R,u as Q,a as V}from"./main-Cxeu4LhG.js";import{G as X}from"./Grid-BSXhsCPC.js";import{C as Y}from"./Chip-Dc2KmeWl.js";import{C as Z,V as ee}from"./ViewHeader-B6P-C4GD.js";import{P as te}from"./ProgressBar-BahmeJhP.js";import{C as se}from"./calendar-C5oK0_nM.js";import{S as _,a as M}from"./Sheet-BOProMs2.js";import{I as P}from"./Input-CZmRw5QX.js";import{S as ae,a as le,b as re,c as ne}from"./Select-0VcfTDeL.js";import{E as ie}from"./external-link-D5tq2o_I.js";import{T as W}from"./trash-2-Cv7U38jw.js";import{P as H}from"./plus-77h62zZm.js";import{C as oe,b as de}from"./Card-rF59wHiO.js";import{E as ce}from"./ErrorState-DULZnttJ.js";import{L as ue}from"./ListHeader-Dpun-r36.js";import{T as ge}from"./Textarea-QuofpMlq.js";import"./index-C4Vq_2LM.js";import"./index-CASP1n-5.js";import"./Alert-B6DjfRFI.js";import"./circle-alert-HdHe7m8K.js";import"./triangle-alert-tUTXbcEP.js";import"./circle-check-Cs-xoV7R.js";import"./refresh-ccw-DenGBOcq.js";const fe={"on-track":"On track","at-risk":"At risk","off-track":"Off track",done:"Done"},he={"on-track":"success","at-risk":"warning","off-track":"danger",done:"neutral"};function pe(i){const{title:l,description:u,status:p,progress:D,due:g,ownerName:m,ownerAvatarUrl:h,keyResultsDone:w,keyResultsTotal:I,badges:E,onOpen:z,className:j}=i;return e.jsxs("button",{type:"button",onClick:z,className:q("v8-goal-card",`v8-goal-card--${p}`,j),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:l}),u!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:4,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:u})]}),e.jsx(F,{tone:he[p],dot:!0,children:fe[p]})]}),e.jsxs("div",{children:[e.jsx(te,{value:D,tone:p==="on-track"?"success":p==="at-risk"?"warning":p==="off-track"?"danger":"accent"}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:6,fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[e.jsxs("span",{children:[Math.round(D*100),"% complete"]}),w!==void 0&&I!==void 0&&e.jsxs("span",{children:[w," / ",I," key results"]})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[g!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(se,{size:12,"aria-hidden":"true"}),g]}),m!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{"aria-hidden":"true",style:{width:16,height:16,borderRadius:"var(--radius-pill)",background:h!==void 0?`url(${h}) center/cover`:"var(--accent)",display:"inline-block"}}),m]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[E,e.jsx(Z,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]}),e.jsx("style",{children:`
1
+ import{j as e,r}from"./cmdk-C3F6LD6N.js";import{b as F,g as q,S as f,I as C,B as b,h as K,i as R,u as Q,a as V}from"./main-BURAlktW.js";import{G as X}from"./Grid--WKvqu5h.js";import{C as Y}from"./Chip-XPOk0d_E.js";import{C as Z,V as ee}from"./ViewHeader-C-t1U2cQ.js";import{P as te}from"./ProgressBar-BnaBqv-W.js";import{C as se}from"./calendar-B9Wbemh7.js";import{S as _,a as M}from"./Sheet-B-CMP9-_.js";import{I as P}from"./Input-h_nSOtwm.js";import{S as ae,a as le,b as re,c as ne}from"./Select-CiGWEN8I.js";import{E as ie}from"./external-link-DvL89gaZ.js";import{T as W}from"./trash-2-D6qePV_q.js";import{P as H}from"./plus-Cm6-fo14.js";import{C as oe,b as de}from"./Card-BtsmkhJa.js";import{E as ce}from"./ErrorState-CBJbEQ8B.js";import{L as ue}from"./ListHeader-CM8QoIWG.js";import{T as ge}from"./Textarea-xnAybFGd.js";import"./index-CR0TeJmc.js";import"./index-B1OIS316.js";import"./Alert-BZGk39mB.js";import"./circle-alert-Dz8lGfCZ.js";import"./triangle-alert-B2oHbmoh.js";import"./circle-check-DFB50ojt.js";import"./refresh-ccw-DA8_IB9l.js";const fe={"on-track":"On track","at-risk":"At risk","off-track":"Off track",done:"Done"},he={"on-track":"success","at-risk":"warning","off-track":"danger",done:"neutral"};function pe(i){const{title:l,description:u,status:p,progress:D,due:g,ownerName:m,ownerAvatarUrl:h,keyResultsDone:w,keyResultsTotal:I,badges:E,onOpen:z,className:j}=i;return e.jsxs("button",{type:"button",onClick:z,className:q("v8-goal-card",`v8-goal-card--${p}`,j),style:{display:"flex",flexDirection:"column",gap:"var(--space-3)",width:"100%",padding:"var(--space-4)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-lg)",textAlign:"left",cursor:"pointer",font:"inherit",color:"inherit",transition:"border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-2)"},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-14)",fontWeight:600,color:"var(--fg)",lineHeight:"var(--lh-snug)"},children:l}),u!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)",marginTop:4,display:"-webkit-box",WebkitLineClamp:2,WebkitBoxOrient:"vertical",overflow:"hidden"},children:u})]}),e.jsx(F,{tone:he[p],dot:!0,children:fe[p]})]}),e.jsxs("div",{children:[e.jsx(te,{value:D,tone:p==="on-track"?"success":p==="at-risk"?"warning":p==="off-track"?"danger":"accent"}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginTop:6,fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontVariantNumeric:"tabular-nums"},children:[e.jsxs("span",{children:[Math.round(D*100),"% complete"]}),w!==void 0&&I!==void 0&&e.jsxs("span",{children:[w," / ",I," key results"]})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-2)",fontSize:"var(--fs-12)",color:"var(--fg-subtle)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[g!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(se,{size:12,"aria-hidden":"true"}),g]}),m!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{"aria-hidden":"true",style:{width:16,height:16,borderRadius:"var(--radius-pill)",background:h!==void 0?`url(${h}) center/cover`:"var(--accent)",display:"inline-block"}}),m]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[E,e.jsx(Z,{size:14,"aria-hidden":"true",style:{color:"var(--fg-subtle)"}})]})]}),e.jsx("style",{children:`
2
2
  .v8-goal-card:hover {
3
3
  border-color: var(--accent);
4
4
  background: var(--surface-2);
@@ -1 +1 @@
1
- {"version":3,"file":"GoalsView-Br8oPPfb.js","sources":["../../src/web/v8/ui/goals/GoalCard.tsx","../../src/web/v8/ui/goals/GoalDetail.tsx","../../src/web/v8/views/Goals/GoalsView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Calendar, ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * GoalCard — long-horizon goal surface (PLAN.md: \"Goals page\").\n *\n * Goals are NOT kanban cards. They are intentional commitments tracked\n * over weeks/months. Each card shows: title, why (description), status,\n * progress, due, owner, key results count.\n */\n\nexport type GoalStatus = 'on-track' | 'at-risk' | 'off-track' | 'done';\n\nexport interface GoalCardProps {\n id: string;\n title: string;\n /** Why this goal matters (the \"because\"). */\n description?: string;\n status: GoalStatus;\n /** 0..1 fractional progress. */\n progress: number;\n /** Due date label (e.g. \"Q3 2026\", \"Mar 31\"). */\n due?: string;\n /** Owner name (renders as Avatar when paired with avatarUrl). */\n ownerName?: string;\n ownerAvatarUrl?: string;\n /** Key results count + done count (e.g. \"3 / 5 key results\"). */\n keyResultsDone?: number;\n keyResultsTotal?: number;\n /** Optional badges row (priority, tags). */\n badges?: ReactNode;\n /** Click handler — opens the goal detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<GoalStatus, string> = {\n 'on-track': 'On track',\n 'at-risk': 'At risk',\n 'off-track': 'Off track',\n done: 'Done',\n};\n\nconst STATUS_TONE: Record<GoalStatus, 'success' | 'warning' | 'danger' | 'neutral'> = {\n 'on-track': 'success',\n 'at-risk': 'warning',\n 'off-track': 'danger',\n done: 'neutral',\n};\n\nexport function GoalCard(props: GoalCardProps) {\n const {\n title,\n description,\n status,\n progress,\n due,\n ownerName,\n ownerAvatarUrl,\n keyResultsDone,\n keyResultsTotal,\n badges,\n onOpen,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-goal-card', `v8-goal-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {title}\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg-muted)',\n marginTop: 4,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n <div>\n <ProgressBar\n value={progress}\n tone={status === 'on-track' ? 'success' : status === 'at-risk' ? 'warning' : status === 'off-track' ? 'danger' : 'accent'}\n />\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 6, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontVariantNumeric: 'tabular-nums' }}>\n <span>{Math.round(progress * 100)}% complete</span>\n {keyResultsDone !== undefined && keyResultsTotal !== undefined && (\n <span>\n {keyResultsDone} / {keyResultsTotal} key results\n </span>\n )}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n {due !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Calendar size={12} aria-hidden=\"true\" />\n {due}\n </span>\n )}\n {ownerName !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span\n aria-hidden=\"true\"\n style={{\n width: 16,\n height: 16,\n borderRadius: 'var(--radius-pill)',\n background: ownerAvatarUrl !== undefined ? `url(${ownerAvatarUrl}) center/cover` : 'var(--accent)',\n display: 'inline-block',\n }}\n />\n {ownerName}\n </span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n {badges}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n <style>{`\n .v8-goal-card:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { useEffect, useState } from 'react';\nimport { Plus, Trash2, ExternalLink } from 'lucide-react';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\nimport { Input } from '../controls/Input.js';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from '../controls/Select.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Badge } from '../data/Badge.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal } from '../../data/types.js';\n\n/**\n * GoalDetail — Sprint S12. Right-side Drawer with editable\n * title / status / due / owner / key-results.\n *\n * Source-of-truth = `.bizar/PROGRESS.md` (per user direction). Each\n * edit PATCHes `/api/goals/:id` and the server re-broadcasts the\n * canonical state via `goals:change`.\n */\n\nconst STATUS_OPTIONS = [\n { value: 'on-track', label: 'On track' },\n { value: 'at-risk', label: 'At risk' },\n { value: 'off-track', label: 'Off track' },\n { value: 'blocked', label: 'Blocked' },\n { value: 'active', label: 'Active' },\n { value: 'done', label: 'Done' },\n];\n\nexport interface GoalDetailProps {\n goal: Goal;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function GoalDetail(props: GoalDetailProps): JSX.Element {\n const { goal, open, onOpenChange } = props;\n const [deleting, setDeleting] = useState<boolean>(false);\n\n const removeGoal = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete goal \"${goal.title}\"? This removes it from PROGRESS.md.`)\n : true;\n if (!ok) return;\n setDeleting(true);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'DELETE' });\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setDeleting(false);\n }\n };\n const [title, setTitle] = useState<string>(goal.title);\n const [status, setStatus] = useState<string>(goal.status);\n const [owner, setOwner] = useState<string>(goal.owner || '');\n const [due, setDue] = useState<string>(goal.due || '');\n const [newKr, setNewKr] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setTitle(goal.title);\n setStatus(goal.status);\n setOwner(goal.owner || '');\n setDue(goal.due || '');\n setMessage(null);\n setError(null);\n setNewKr('');\n }\n }, [open, goal]);\n\n const patch = async (body: Record<string, unknown>, label: string): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'PATCH', body });\n setMessage(`${label} saved.`);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const saveTitle = (): void => {\n if (title.trim() && title !== goal.title) void patch({ title: title.trim() }, 'Title');\n };\n const saveStatus = (v: string): void => {\n setStatus(v);\n if (v !== goal.status) void patch({ status: v }, 'Status');\n };\n const saveOwner = (): void => {\n const v = owner.trim();\n if (v !== (goal.owner || '')) void patch({ owner: v }, 'Owner');\n };\n const saveDue = (): void => {\n const v = due.trim();\n if (v !== (goal.due || '')) void patch({ due: v }, 'Due');\n };\n\n const toggleKr = async (krId: string, current: boolean): Promise<void> => {\n setBusy(`kr-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'PATCH',\n body: { done: !current },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const addKr = async (): Promise<void> => {\n const v = newKr.trim();\n if (!v) return;\n setNewKr('');\n setBusy('add-kr');\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results`, {\n method: 'POST',\n body: { title: v },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const removeKr = async (krId: string): Promise<void> => {\n setBusy(`remove-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'DELETE',\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title=\"Edit goal\">\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Title\n </label>\n <Inline gap={2}>\n <Input\n id=\"goal-title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={saveTitle}\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"goal-status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Status\n </label>\n <Select value={status} onValueChange={saveStatus}>\n <SelectTrigger id=\"goal-status\" size=\"sm\" placeholder=\"Status\" />\n <SelectContent>\n {STATUS_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Stack>\n\n <Inline gap={2}>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-owner\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Owner\n </label>\n <Input id=\"goal-owner\" value={owner} onChange={(e) => setOwner(e.target.value)} onBlur={saveOwner} disabled={busy !== null} />\n </Stack>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-due\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Due\n </label>\n <Input id=\"goal-due\" value={due} onChange={(e) => setDue(e.target.value)} onBlur={saveDue} placeholder=\"2026-09-30\" disabled={busy !== null} />\n </Stack>\n </Inline>\n\n <Stack gap={2}>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Key results</div>\n <Stack gap={1}>\n {goal.keyResults.length === 0 && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>None yet.</div>\n )}\n {goal.keyResults.map((kr) => (\n <Inline key={kr.id} gap={2} align=\"center\">\n <input\n type=\"checkbox\"\n checked={kr.done}\n onChange={() => { void toggleKr(kr.id, kr.done); }}\n aria-label={`Toggle ${kr.title}`}\n disabled={busy !== null}\n />\n <span style={{ flex: 1, fontSize: 'var(--fs-13)', textDecoration: kr.done ? 'line-through' : 'none' }}>\n {kr.title}\n </span>\n {kr.assignee && <Badge tone=\"neutral\">{kr.assignee}</Badge>}\n {kr.taskId && (\n <Badge tone=\"info\" title={`Decomposed task: ${kr.taskId}`}>\n <ExternalLink size={10} aria-hidden style={{ marginRight: 4, verticalAlign: 'text-bottom' }} />\n task\n </Badge>\n )}\n <Button\n variant=\"ghost\"\n onClick={() => { void removeKr(kr.id); }}\n disabled={busy !== null}\n aria-label={`Remove ${kr.title}`}\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n <Inline gap={2}>\n <Input\n value={newKr}\n onChange={(e) => setNewKr(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); void addKr(); } }}\n placeholder=\"Add key result…\"\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n <Button variant=\"secondary\" onClick={() => { void addKr(); }} disabled={!newKr.trim() || busy !== null}>\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n </Stack>\n\n <div style={{ borderTop: '1px solid var(--border)', paddingTop: 'var(--space-3)' }}>\n <Button\n variant=\"danger\"\n onClick={() => { void removeGoal(); }}\n disabled={deleting || busy !== null}\n >\n <Trash2 size={14} aria-hidden /> {deleting ? 'Deleting…' : 'Delete goal'}\n </Button>\n </div>\n\n {message !== null && (\n <div role=\"status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>{message}</div>\n )}\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n {busy !== null && <Skeleton style={{ height: 12 }} />}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}","import { useCallback, useEffect, useState } from 'react';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { GoalCard, type GoalCardProps, type GoalStatus } from '../../ui/goals/GoalCard.js';\nimport { GoalDetail } from '../../ui/goals/GoalDetail.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal, WsMessage } from '../../data/types.js';\n\n/**\n * GoalsView — Sprint S10/S12. Pulls `/api/goals` (parsed PROGRESS.md).\n * Card click → `GoalDetail` Drawer (editable title / status / due /\n * owner / KR add/toggle/remove). \"+ New goal\" button creates a fresh\n * goal via `POST /api/goals`. Live updates via `goals:change`.\n */\n\nfunction goalToCard(g: Goal): GoalCardProps {\n return {\n id: g.id,\n title: g.title,\n description: g.description || '',\n status: g.status as GoalStatus,\n progress: g.progress,\n due: g.due,\n ownerName: g.owner,\n keyResultsDone: g.keyResults.filter((k) => k.done).length,\n keyResultsTotal: g.keyResults.length,\n };\n}\n\nexport function GoalsView(): JSX.Element {\n const goals = useFetch<{ goals?: Goal[]; count?: number }>('/api/goals');\n const [local, setLocal] = useState<Goal[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openGoalId, setOpenGoalId] = useState<string | null>(null);\n const [creating, setCreating] = useState<boolean>(false);\n const [decomposing, setDecomposing] = useState<string | null>(null);\n const [decomposeError, setDecomposeError] = useState<string | null>(null);\n const [statusFilter, setStatusFilter] = useState<string>('all');\n // v9.1.1 — replace window.prompt/window.confirm with an inline Sheet\n // form for create + a per-card confirm row for delete. Same data\n // contract; better UX, accessible, no popup blockers.\n const [createDraft, setCreateDraft] = useState<{ title: string; description: string } | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n const filteredGoals = statusFilter === 'all' ? local : local.filter((g) => g.status === statusFilter);\n\n const STATUS_FILTERS = ['all', 'active', 'on-track', 'at-risk', 'off-track', 'blocked', 'done'] as const;\n\n useEffect(() => {\n if (goals.data?.goals && !initialized) {\n setInitialized(true);\n setLocal(goals.data.goals);\n }\n }, [goals.data, initialized]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type !== 'goals:change') return;\n const g = (msg as Extract<WsMessage, { type: 'goals:change' }>).goal;\n if (!g) return;\n // Tombstone broadcast from the server after a DELETE — drop the card.\n if ('removed' in g && (g as { removed?: boolean }).removed) {\n setLocal((prev) => prev.filter((x) => x.id !== g.id));\n if (openGoalId === g.id) setOpenGoalId(null);\n return;\n }\n setLocal((prev) => {\n const idx = prev.findIndex((x) => x.id === g.id);\n if (idx === -1) return [...prev, g];\n const copy = prev.slice();\n copy[idx] = g;\n return copy;\n });\n }, [openGoalId]);\n useWsMessage('goals:change', onChange);\n useWsMessage('goals:removed', (msg) => {\n const id = (msg as Extract<WsMessage, { type: 'goals:removed' }>).id;\n setLocal((prev) => prev.filter((x) => x.id !== id));\n if (openGoalId === id) setOpenGoalId(null);\n });\n\n const createGoal = useCallback(async () => {\n // v9.1.1 — open the Sheet form. POST happens when the user clicks\n // Create inside the Sheet (see saveCreate below).\n setCreateDraft({ title: '', description: '' });\n }, []);\n\n const saveCreate = useCallback(async () => {\n if (!createDraft || !createDraft.title.trim()) return;\n setCreating(true);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goal?: Goal; id?: string }>('/api/goals', {\n method: 'POST',\n body: {\n title: createDraft.title.trim(),\n description: createDraft.description.trim() || undefined,\n status: 'active',\n },\n });\n if (res.goal) setLocal((prev) => [...prev, res.goal as Goal]);\n if (res.id) setOpenGoalId(res.id);\n setCreateDraft(null);\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setCreating(false);\n }\n }, [createDraft]);\n\n const openGoal = openGoalId ? local.find((g) => g.id === openGoalId) ?? null : null;\n\n const decompose = useCallback(async (goalId: string) => {\n setDecomposing(goalId);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goalId: string; created: { kr: string; task: string }[] }>(\n `/api/goals/${encodeURIComponent(goalId)}/decompose`,\n { method: 'POST' },\n );\n // Patch local state with the new taskIds so the button reflects\n // \"Decomposed\" without waiting for the WS roundtrip.\n if (Array.isArray(res.created) && res.created.length > 0) {\n setLocal((prev) => prev.map((g) => {\n if (g.id !== goalId) return g;\n const krs = (g.keyResults ?? []).map((kr) => {\n const link = res.created.find((c) => c.kr === kr.id);\n return link ? { ...kr, taskId: link.task } : kr;\n });\n return { ...g, keyResults: krs };\n }));\n }\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setDecomposing(null);\n }\n }, []);\n\n const deleteGoal = useCallback(async (goalId: string) => {\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: 'DELETE' });\n // Server broadcasts goals:removed + goals:change tombstone; the\n // WS handler drops the card. Close the drawer if it was open.\n setLocal((prev) => prev.filter((x) => x.id !== goalId));\n if (openGoalId === goalId) setOpenGoalId(null);\n setConfirmDeleteId(null);\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n }\n }, [openGoalId]);\n\n return (\n <Stack gap={5} data-testid=\"goals-view\">\n <ViewHeader\n title=\"Goals\"\n description=\"Long-horizon commitments parsed from .bizar/PROGRESS.md.\"\n actions={\n <Button variant=\"primary\" onClick={() => { void createGoal(); }} disabled={creating}>\n <Plus size={14} aria-hidden /> New goal\n </Button>\n }\n />\n <ListHeader\n title=\"All goals\"\n count={local.length}\n testid=\"goals-list-header\"\n filters={\n <Inline gap={1} wrap>\n {STATUS_FILTERS.map((s) => (\n <Chip key={s} selected={statusFilter === s} onClick={() => setStatusFilter(s)}>\n {s === 'all' ? 'All' : s.replace(/-/g, ' ')}\n {s !== 'all' && ` · ${local.filter((g) => g.status === s).length}`}\n </Chip>\n ))}\n </Inline>\n }\n />\n {decomposeError !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n Decompose failed: {decomposeError}\n </div>\n )}\n {goals.loading && local.length === 0 ? (\n <Stack gap={3}>\n <Skeleton style={{ height: 160 }} />\n <Skeleton style={{ height: 160 }} />\n </Stack>\n ) : goals.error && local.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load goals\"\n description=\"The goals endpoint failed. Retry to refetch.\"\n error={goals.error}\n onRetry={() => void goals.refetch()}\n testid=\"goals-error\"\n />\n ) : filteredGoals.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={2}>\n <strong>No goals {statusFilter === 'all' ? 'yet' : `with status “${statusFilter}”`}.</strong>\n <span style={{ color: 'var(--fg-muted)' }}>\n Create one with the dashboard or via CC's <code>/goal &lt;text&gt;</code>.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Grid cols={2}>\n {filteredGoals.map((g) => {\n const krCount = g.keyResults?.length ?? 0;\n const decomposed = (g.keyResults ?? []).every((kr) => Boolean(kr.taskId));\n return (\n <div\n key={g.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setOpenGoalId(g.id)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpenGoalId(g.id); } }}\n style={{ cursor: 'pointer', outline: 'none' }}\n data-testid={`goal-card-${g.id}`}\n >\n <Stack gap={2}>\n <GoalCard {...goalToCard(g)} />\n {confirmDeleteId === g.id ? (\n <Inline align=\"center\" justify=\"end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Delete this goal and remove it from PROGRESS.md?\n </span>\n <Button\n variant=\"danger\"\n size=\"sm\"\n onClick={(e) => { e.stopPropagation(); void deleteGoal(g.id); }}\n data-testid={`goal-confirm-delete-${g.id}`}\n >\n Delete\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n >\n Cancel\n </Button>\n </Inline>\n ) : (\n <Inline align=\"center\" justify=\"end\" gap={1}>\n <Button\n variant=\"ghost\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(g.id); }}\n title=\"Delete goal\"\n aria-label={`Delete goal ${g.title}`}\n data-testid={`goal-delete-${g.id}`}\n >\n <Trash2 size={12} aria-hidden /> Delete\n </Button>\n </Inline>\n )}\n {krCount > 0 && (\n <Inline align=\"center\" justify=\"end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {decomposed ? 'Decomposed' : `${krCount} key result${krCount === 1 ? '' : 's'} · not yet linked`}\n </span>\n <Button\n variant=\"secondary\"\n onClick={(e) => { e.stopPropagation(); void decompose(g.id); }}\n disabled={decomposing === g.id}\n title={decomposed ? 'Re-create missing task links' : 'Create one task per key result'}\n >\n <Plus size={12} aria-hidden /> {decomposed ? 'Re-link tasks' : 'Decompose → Tasks'}\n </Button>\n </Inline>\n )}\n </Stack>\n </div>\n );\n })}\n </Grid>\n )}\n\n {openGoal && (\n <GoalDetail\n goal={openGoal}\n open={openGoalId !== null}\n onOpenChange={(o) => { if (!o) setOpenGoalId(null); }}\n />\n )}\n\n {/* v9.1.1 — create-goal Sheet form. Replaces window.prompt which\n blocked the user's \"professional and data-driven\" ask. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New goal\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-create-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</label>\n <Input\n id=\"goal-create-title\"\n value={createDraft.title}\n onChange={(e) => setCreateDraft({ ...createDraft, title: e.target.value })}\n placeholder=\"Ship the orchestration center\"\n disabled={creating}\n data-testid=\"goal-create-title\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"goal-create-desc\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description (optional)</label>\n <Textarea\n id=\"goal-create-desc\"\n value={createDraft.description}\n onChange={(e) => setCreateDraft({ ...createDraft, description: e.target.value })}\n rows={4}\n placeholder=\"Why this goal exists and what 'done' looks like.\"\n disabled={creating}\n data-testid=\"goal-create-desc\"\n />\n </Stack>\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void saveCreate(); }}\n disabled={creating || !createDraft.title.trim()}\n data-testid=\"goal-create-submit\"\n >\n Create goal\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateDraft(null)} disabled={creating}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","GoalCard","props","title","description","status","progress","due","ownerName","ownerAvatarUrl","keyResultsDone","keyResultsTotal","badges","onOpen","className","jsxs","cx","jsx","Badge","ProgressBar","Calendar","ChevronRight","STATUS_OPTIONS","GoalDetail","goal","open","onOpenChange","deleting","setDeleting","useState","removeGoal","fetchJson","err","setError","setTitle","setStatus","owner","setOwner","setDue","newKr","setNewKr","busy","setBusy","message","setMessage","error","useEffect","patch","body","label","saveTitle","saveStatus","v","saveOwner","saveDue","toggleKr","krId","current","addKr","removeKr","Sheet","SheetContent","Stack","Inline","Input","e","Select","SelectTrigger","SelectContent","opt","SelectItem","kr","ExternalLink","Button","Trash2","Plus","Skeleton","goalToCard","g","k","GoalsView","goals","useFetch","local","setLocal","initialized","setInitialized","openGoalId","setOpenGoalId","creating","setCreating","decomposing","setDecomposing","decomposeError","setDecomposeError","statusFilter","setStatusFilter","createDraft","setCreateDraft","confirmDeleteId","setConfirmDeleteId","filteredGoals","STATUS_FILTERS","_a","onChange","useCallback","msg","prev","x","idx","copy","useWsMessage","id","createGoal","saveCreate","res","openGoal","decompose","goalId","krs","link","c","deleteGoal","ViewHeader","ListHeader","Chip","ErrorState","Card","CardBody","Grid","krCount","decomposed","o","Textarea"],"mappings":"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"}
1
+ {"version":3,"file":"GoalsView-BZr8In4c.js","sources":["../../src/web/v8/ui/goals/GoalCard.tsx","../../src/web/v8/ui/goals/GoalDetail.tsx","../../src/web/v8/views/Goals/GoalsView.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Calendar, ChevronRight } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\nimport { Badge } from '../data/Badge.js';\n\n/**\n * GoalCard — long-horizon goal surface (PLAN.md: \"Goals page\").\n *\n * Goals are NOT kanban cards. They are intentional commitments tracked\n * over weeks/months. Each card shows: title, why (description), status,\n * progress, due, owner, key results count.\n */\n\nexport type GoalStatus = 'on-track' | 'at-risk' | 'off-track' | 'done';\n\nexport interface GoalCardProps {\n id: string;\n title: string;\n /** Why this goal matters (the \"because\"). */\n description?: string;\n status: GoalStatus;\n /** 0..1 fractional progress. */\n progress: number;\n /** Due date label (e.g. \"Q3 2026\", \"Mar 31\"). */\n due?: string;\n /** Owner name (renders as Avatar when paired with avatarUrl). */\n ownerName?: string;\n ownerAvatarUrl?: string;\n /** Key results count + done count (e.g. \"3 / 5 key results\"). */\n keyResultsDone?: number;\n keyResultsTotal?: number;\n /** Optional badges row (priority, tags). */\n badges?: ReactNode;\n /** Click handler — opens the goal detail. */\n onOpen?: () => void;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<GoalStatus, string> = {\n 'on-track': 'On track',\n 'at-risk': 'At risk',\n 'off-track': 'Off track',\n done: 'Done',\n};\n\nconst STATUS_TONE: Record<GoalStatus, 'success' | 'warning' | 'danger' | 'neutral'> = {\n 'on-track': 'success',\n 'at-risk': 'warning',\n 'off-track': 'danger',\n done: 'neutral',\n};\n\nexport function GoalCard(props: GoalCardProps) {\n const {\n title,\n description,\n status,\n progress,\n due,\n ownerName,\n ownerAvatarUrl,\n keyResultsDone,\n keyResultsTotal,\n badges,\n onOpen,\n className,\n } = props;\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-goal-card', `v8-goal-card--${status}`, className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--space-3)',\n width: '100%',\n padding: 'var(--space-4)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-lg)',\n textAlign: 'left',\n cursor: 'pointer',\n font: 'inherit',\n color: 'inherit',\n transition: 'border-color var(--motion-fast) var(--ease-out), background var(--motion-fast) var(--ease-out)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 'var(--space-2)' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {title}\n </div>\n {description !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg-muted)',\n marginTop: 4,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {description}\n </div>\n )}\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n <div>\n <ProgressBar\n value={progress}\n tone={status === 'on-track' ? 'success' : status === 'at-risk' ? 'warning' : status === 'off-track' ? 'danger' : 'accent'}\n />\n <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 6, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontVariantNumeric: 'tabular-nums' }}>\n <span>{Math.round(progress * 100)}% complete</span>\n {keyResultsDone !== undefined && keyResultsTotal !== undefined && (\n <span>\n {keyResultsDone} / {keyResultsTotal} key results\n </span>\n )}\n </div>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--space-2)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-subtle)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n {due !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Calendar size={12} aria-hidden=\"true\" />\n {due}\n </span>\n )}\n {ownerName !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span\n aria-hidden=\"true\"\n style={{\n width: 16,\n height: 16,\n borderRadius: 'var(--radius-pill)',\n background: ownerAvatarUrl !== undefined ? `url(${ownerAvatarUrl}) center/cover` : 'var(--accent)',\n display: 'inline-block',\n }}\n />\n {ownerName}\n </span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>\n {badges}\n <ChevronRight size={14} aria-hidden=\"true\" style={{ color: 'var(--fg-subtle)' }} />\n </div>\n </div>\n <style>{`\n .v8-goal-card:hover {\n border-color: var(--accent);\n background: var(--surface-2);\n }\n `}</style>\n </button>\n );\n}","import { useEffect, useState } from 'react';\nimport { Plus, Trash2, ExternalLink } from 'lucide-react';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\nimport { Input } from '../controls/Input.js';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from '../controls/Select.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Badge } from '../data/Badge.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal } from '../../data/types.js';\n\n/**\n * GoalDetail — Sprint S12. Right-side Drawer with editable\n * title / status / due / owner / key-results.\n *\n * Source-of-truth = `.bizar/PROGRESS.md` (per user direction). Each\n * edit PATCHes `/api/goals/:id` and the server re-broadcasts the\n * canonical state via `goals:change`.\n */\n\nconst STATUS_OPTIONS = [\n { value: 'on-track', label: 'On track' },\n { value: 'at-risk', label: 'At risk' },\n { value: 'off-track', label: 'Off track' },\n { value: 'blocked', label: 'Blocked' },\n { value: 'active', label: 'Active' },\n { value: 'done', label: 'Done' },\n];\n\nexport interface GoalDetailProps {\n goal: Goal;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport function GoalDetail(props: GoalDetailProps): JSX.Element {\n const { goal, open, onOpenChange } = props;\n const [deleting, setDeleting] = useState<boolean>(false);\n\n const removeGoal = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete goal \"${goal.title}\"? This removes it from PROGRESS.md.`)\n : true;\n if (!ok) return;\n setDeleting(true);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'DELETE' });\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setDeleting(false);\n }\n };\n const [title, setTitle] = useState<string>(goal.title);\n const [status, setStatus] = useState<string>(goal.status);\n const [owner, setOwner] = useState<string>(goal.owner || '');\n const [due, setDue] = useState<string>(goal.due || '');\n const [newKr, setNewKr] = useState<string>('');\n const [busy, setBusy] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setTitle(goal.title);\n setStatus(goal.status);\n setOwner(goal.owner || '');\n setDue(goal.due || '');\n setMessage(null);\n setError(null);\n setNewKr('');\n }\n }, [open, goal]);\n\n const patch = async (body: Record<string, unknown>, label: string): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}`, { method: 'PATCH', body });\n setMessage(`${label} saved.`);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const saveTitle = (): void => {\n if (title.trim() && title !== goal.title) void patch({ title: title.trim() }, 'Title');\n };\n const saveStatus = (v: string): void => {\n setStatus(v);\n if (v !== goal.status) void patch({ status: v }, 'Status');\n };\n const saveOwner = (): void => {\n const v = owner.trim();\n if (v !== (goal.owner || '')) void patch({ owner: v }, 'Owner');\n };\n const saveDue = (): void => {\n const v = due.trim();\n if (v !== (goal.due || '')) void patch({ due: v }, 'Due');\n };\n\n const toggleKr = async (krId: string, current: boolean): Promise<void> => {\n setBusy(`kr-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'PATCH',\n body: { done: !current },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const addKr = async (): Promise<void> => {\n const v = newKr.trim();\n if (!v) return;\n setNewKr('');\n setBusy('add-kr');\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results`, {\n method: 'POST',\n body: { title: v },\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const removeKr = async (krId: string): Promise<void> => {\n setBusy(`remove-${krId}`);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goal.id)}/key-results/${encodeURIComponent(krId)}`, {\n method: 'DELETE',\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title=\"Edit goal\">\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Title\n </label>\n <Inline gap={2}>\n <Input\n id=\"goal-title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={saveTitle}\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"goal-status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Status\n </label>\n <Select value={status} onValueChange={saveStatus}>\n <SelectTrigger id=\"goal-status\" size=\"sm\" placeholder=\"Status\" />\n <SelectContent>\n {STATUS_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Stack>\n\n <Inline gap={2}>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-owner\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Owner\n </label>\n <Input id=\"goal-owner\" value={owner} onChange={(e) => setOwner(e.target.value)} onBlur={saveOwner} disabled={busy !== null} />\n </Stack>\n <Stack gap={2} style={{ flex: 1 }}>\n <label htmlFor=\"goal-due\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Due\n </label>\n <Input id=\"goal-due\" value={due} onChange={(e) => setDue(e.target.value)} onBlur={saveDue} placeholder=\"2026-09-30\" disabled={busy !== null} />\n </Stack>\n </Inline>\n\n <Stack gap={2}>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Key results</div>\n <Stack gap={1}>\n {goal.keyResults.length === 0 && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>None yet.</div>\n )}\n {goal.keyResults.map((kr) => (\n <Inline key={kr.id} gap={2} align=\"center\">\n <input\n type=\"checkbox\"\n checked={kr.done}\n onChange={() => { void toggleKr(kr.id, kr.done); }}\n aria-label={`Toggle ${kr.title}`}\n disabled={busy !== null}\n />\n <span style={{ flex: 1, fontSize: 'var(--fs-13)', textDecoration: kr.done ? 'line-through' : 'none' }}>\n {kr.title}\n </span>\n {kr.assignee && <Badge tone=\"neutral\">{kr.assignee}</Badge>}\n {kr.taskId && (\n <Badge tone=\"info\" title={`Decomposed task: ${kr.taskId}`}>\n <ExternalLink size={10} aria-hidden style={{ marginRight: 4, verticalAlign: 'text-bottom' }} />\n task\n </Badge>\n )}\n <Button\n variant=\"ghost\"\n onClick={() => { void removeKr(kr.id); }}\n disabled={busy !== null}\n aria-label={`Remove ${kr.title}`}\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n ))}\n </Stack>\n <Inline gap={2}>\n <Input\n value={newKr}\n onChange={(e) => setNewKr(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); void addKr(); } }}\n placeholder=\"Add key result…\"\n disabled={busy !== null}\n style={{ flex: 1 }}\n />\n <Button variant=\"secondary\" onClick={() => { void addKr(); }} disabled={!newKr.trim() || busy !== null}>\n <Plus size={14} aria-hidden /> Add\n </Button>\n </Inline>\n </Stack>\n\n <div style={{ borderTop: '1px solid var(--border)', paddingTop: 'var(--space-3)' }}>\n <Button\n variant=\"danger\"\n onClick={() => { void removeGoal(); }}\n disabled={deleting || busy !== null}\n >\n <Trash2 size={14} aria-hidden /> {deleting ? 'Deleting…' : 'Delete goal'}\n </Button>\n </div>\n\n {message !== null && (\n <div role=\"status\" style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>{message}</div>\n )}\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n {busy !== null && <Skeleton style={{ height: 12 }} />}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}","import { useCallback, useEffect, useState } from 'react';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { GoalCard, type GoalCardProps, type GoalStatus } from '../../ui/goals/GoalCard.js';\nimport { GoalDetail } from '../../ui/goals/GoalDetail.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport type { Goal, WsMessage } from '../../data/types.js';\n\n/**\n * GoalsView — Sprint S10/S12. Pulls `/api/goals` (parsed PROGRESS.md).\n * Card click → `GoalDetail` Drawer (editable title / status / due /\n * owner / KR add/toggle/remove). \"+ New goal\" button creates a fresh\n * goal via `POST /api/goals`. Live updates via `goals:change`.\n */\n\nfunction goalToCard(g: Goal): GoalCardProps {\n return {\n id: g.id,\n title: g.title,\n description: g.description || '',\n status: g.status as GoalStatus,\n progress: g.progress,\n due: g.due,\n ownerName: g.owner,\n keyResultsDone: g.keyResults.filter((k) => k.done).length,\n keyResultsTotal: g.keyResults.length,\n };\n}\n\nexport function GoalsView(): JSX.Element {\n const goals = useFetch<{ goals?: Goal[]; count?: number }>('/api/goals');\n const [local, setLocal] = useState<Goal[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openGoalId, setOpenGoalId] = useState<string | null>(null);\n const [creating, setCreating] = useState<boolean>(false);\n const [decomposing, setDecomposing] = useState<string | null>(null);\n const [decomposeError, setDecomposeError] = useState<string | null>(null);\n const [statusFilter, setStatusFilter] = useState<string>('all');\n // v9.1.1 — replace window.prompt/window.confirm with an inline Sheet\n // form for create + a per-card confirm row for delete. Same data\n // contract; better UX, accessible, no popup blockers.\n const [createDraft, setCreateDraft] = useState<{ title: string; description: string } | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n const filteredGoals = statusFilter === 'all' ? local : local.filter((g) => g.status === statusFilter);\n\n const STATUS_FILTERS = ['all', 'active', 'on-track', 'at-risk', 'off-track', 'blocked', 'done'] as const;\n\n useEffect(() => {\n if (goals.data?.goals && !initialized) {\n setInitialized(true);\n setLocal(goals.data.goals);\n }\n }, [goals.data, initialized]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type !== 'goals:change') return;\n const g = (msg as Extract<WsMessage, { type: 'goals:change' }>).goal;\n if (!g) return;\n // Tombstone broadcast from the server after a DELETE — drop the card.\n if ('removed' in g && (g as { removed?: boolean }).removed) {\n setLocal((prev) => prev.filter((x) => x.id !== g.id));\n if (openGoalId === g.id) setOpenGoalId(null);\n return;\n }\n setLocal((prev) => {\n const idx = prev.findIndex((x) => x.id === g.id);\n if (idx === -1) return [...prev, g];\n const copy = prev.slice();\n copy[idx] = g;\n return copy;\n });\n }, [openGoalId]);\n useWsMessage('goals:change', onChange);\n useWsMessage('goals:removed', (msg) => {\n const id = (msg as Extract<WsMessage, { type: 'goals:removed' }>).id;\n setLocal((prev) => prev.filter((x) => x.id !== id));\n if (openGoalId === id) setOpenGoalId(null);\n });\n\n const createGoal = useCallback(async () => {\n // v9.1.1 — open the Sheet form. POST happens when the user clicks\n // Create inside the Sheet (see saveCreate below).\n setCreateDraft({ title: '', description: '' });\n }, []);\n\n const saveCreate = useCallback(async () => {\n if (!createDraft || !createDraft.title.trim()) return;\n setCreating(true);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goal?: Goal; id?: string }>('/api/goals', {\n method: 'POST',\n body: {\n title: createDraft.title.trim(),\n description: createDraft.description.trim() || undefined,\n status: 'active',\n },\n });\n if (res.goal) setLocal((prev) => [...prev, res.goal as Goal]);\n if (res.id) setOpenGoalId(res.id);\n setCreateDraft(null);\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setCreating(false);\n }\n }, [createDraft]);\n\n const openGoal = openGoalId ? local.find((g) => g.id === openGoalId) ?? null : null;\n\n const decompose = useCallback(async (goalId: string) => {\n setDecomposing(goalId);\n setDecomposeError(null);\n try {\n const res = await fetchJson<{ goalId: string; created: { kr: string; task: string }[] }>(\n `/api/goals/${encodeURIComponent(goalId)}/decompose`,\n { method: 'POST' },\n );\n // Patch local state with the new taskIds so the button reflects\n // \"Decomposed\" without waiting for the WS roundtrip.\n if (Array.isArray(res.created) && res.created.length > 0) {\n setLocal((prev) => prev.map((g) => {\n if (g.id !== goalId) return g;\n const krs = (g.keyResults ?? []).map((kr) => {\n const link = res.created.find((c) => c.kr === kr.id);\n return link ? { ...kr, taskId: link.task } : kr;\n });\n return { ...g, keyResults: krs };\n }));\n }\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n } finally {\n setDecomposing(null);\n }\n }, []);\n\n const deleteGoal = useCallback(async (goalId: string) => {\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: 'DELETE' });\n // Server broadcasts goals:removed + goals:change tombstone; the\n // WS handler drops the card. Close the drawer if it was open.\n setLocal((prev) => prev.filter((x) => x.id !== goalId));\n if (openGoalId === goalId) setOpenGoalId(null);\n setConfirmDeleteId(null);\n } catch (err) {\n setDecomposeError(err instanceof Error ? err.message : String(err));\n }\n }, [openGoalId]);\n\n return (\n <Stack gap={5} data-testid=\"goals-view\">\n <ViewHeader\n title=\"Goals\"\n description=\"Long-horizon commitments parsed from .bizar/PROGRESS.md.\"\n actions={\n <Button variant=\"primary\" onClick={() => { void createGoal(); }} disabled={creating}>\n <Plus size={14} aria-hidden /> New goal\n </Button>\n }\n />\n <ListHeader\n title=\"All goals\"\n count={local.length}\n testid=\"goals-list-header\"\n filters={\n <Inline gap={1} wrap>\n {STATUS_FILTERS.map((s) => (\n <Chip key={s} selected={statusFilter === s} onClick={() => setStatusFilter(s)}>\n {s === 'all' ? 'All' : s.replace(/-/g, ' ')}\n {s !== 'all' && ` · ${local.filter((g) => g.status === s).length}`}\n </Chip>\n ))}\n </Inline>\n }\n />\n {decomposeError !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n Decompose failed: {decomposeError}\n </div>\n )}\n {goals.loading && local.length === 0 ? (\n <Stack gap={3}>\n <Skeleton style={{ height: 160 }} />\n <Skeleton style={{ height: 160 }} />\n </Stack>\n ) : goals.error && local.length === 0 ? (\n <ErrorState\n block\n title=\"Couldn't load goals\"\n description=\"The goals endpoint failed. Retry to refetch.\"\n error={goals.error}\n onRetry={() => void goals.refetch()}\n testid=\"goals-error\"\n />\n ) : filteredGoals.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={2}>\n <strong>No goals {statusFilter === 'all' ? 'yet' : `with status “${statusFilter}”`}.</strong>\n <span style={{ color: 'var(--fg-muted)' }}>\n Create one with the dashboard or via CC's <code>/goal &lt;text&gt;</code>.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Grid cols={2}>\n {filteredGoals.map((g) => {\n const krCount = g.keyResults?.length ?? 0;\n const decomposed = (g.keyResults ?? []).every((kr) => Boolean(kr.taskId));\n return (\n <div\n key={g.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setOpenGoalId(g.id)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setOpenGoalId(g.id); } }}\n style={{ cursor: 'pointer', outline: 'none' }}\n data-testid={`goal-card-${g.id}`}\n >\n <Stack gap={2}>\n <GoalCard {...goalToCard(g)} />\n {confirmDeleteId === g.id ? (\n <Inline align=\"center\" justify=\"end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Delete this goal and remove it from PROGRESS.md?\n </span>\n <Button\n variant=\"danger\"\n size=\"sm\"\n onClick={(e) => { e.stopPropagation(); void deleteGoal(g.id); }}\n data-testid={`goal-confirm-delete-${g.id}`}\n >\n Delete\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n >\n Cancel\n </Button>\n </Inline>\n ) : (\n <Inline align=\"center\" justify=\"end\" gap={1}>\n <Button\n variant=\"ghost\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(g.id); }}\n title=\"Delete goal\"\n aria-label={`Delete goal ${g.title}`}\n data-testid={`goal-delete-${g.id}`}\n >\n <Trash2 size={12} aria-hidden /> Delete\n </Button>\n </Inline>\n )}\n {krCount > 0 && (\n <Inline align=\"center\" justify=\"end\" gap={2}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {decomposed ? 'Decomposed' : `${krCount} key result${krCount === 1 ? '' : 's'} · not yet linked`}\n </span>\n <Button\n variant=\"secondary\"\n onClick={(e) => { e.stopPropagation(); void decompose(g.id); }}\n disabled={decomposing === g.id}\n title={decomposed ? 'Re-create missing task links' : 'Create one task per key result'}\n >\n <Plus size={12} aria-hidden /> {decomposed ? 'Re-link tasks' : 'Decompose → Tasks'}\n </Button>\n </Inline>\n )}\n </Stack>\n </div>\n );\n })}\n </Grid>\n )}\n\n {openGoal && (\n <GoalDetail\n goal={openGoal}\n open={openGoalId !== null}\n onOpenChange={(o) => { if (!o) setOpenGoalId(null); }}\n />\n )}\n\n {/* v9.1.1 — create-goal Sheet form. Replaces window.prompt which\n blocked the user's \"professional and data-driven\" ask. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New goal\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"goal-create-title\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title</label>\n <Input\n id=\"goal-create-title\"\n value={createDraft.title}\n onChange={(e) => setCreateDraft({ ...createDraft, title: e.target.value })}\n placeholder=\"Ship the orchestration center\"\n disabled={creating}\n data-testid=\"goal-create-title\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"goal-create-desc\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Description (optional)</label>\n <Textarea\n id=\"goal-create-desc\"\n value={createDraft.description}\n onChange={(e) => setCreateDraft({ ...createDraft, description: e.target.value })}\n rows={4}\n placeholder=\"Why this goal exists and what 'done' looks like.\"\n disabled={creating}\n data-testid=\"goal-create-desc\"\n />\n </Stack>\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void saveCreate(); }}\n disabled={creating || !createDraft.title.trim()}\n data-testid=\"goal-create-submit\"\n >\n Create goal\n </Button>\n <Button variant=\"ghost\" onClick={() => setCreateDraft(null)} disabled={creating}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}"],"names":["STATUS_LABEL","STATUS_TONE","GoalCard","props","title","description","status","progress","due","ownerName","ownerAvatarUrl","keyResultsDone","keyResultsTotal","badges","onOpen","className","jsxs","cx","jsx","Badge","ProgressBar","Calendar","ChevronRight","STATUS_OPTIONS","GoalDetail","goal","open","onOpenChange","deleting","setDeleting","useState","removeGoal","fetchJson","err","setError","setTitle","setStatus","owner","setOwner","setDue","newKr","setNewKr","busy","setBusy","message","setMessage","error","useEffect","patch","body","label","saveTitle","saveStatus","v","saveOwner","saveDue","toggleKr","krId","current","addKr","removeKr","Sheet","SheetContent","Stack","Inline","Input","e","Select","SelectTrigger","SelectContent","opt","SelectItem","kr","ExternalLink","Button","Trash2","Plus","Skeleton","goalToCard","g","k","GoalsView","goals","useFetch","local","setLocal","initialized","setInitialized","openGoalId","setOpenGoalId","creating","setCreating","decomposing","setDecomposing","decomposeError","setDecomposeError","statusFilter","setStatusFilter","createDraft","setCreateDraft","confirmDeleteId","setConfirmDeleteId","filteredGoals","STATUS_FILTERS","_a","onChange","useCallback","msg","prev","x","idx","copy","useWsMessage","id","createGoal","saveCreate","res","openGoal","decompose","goalId","krs","link","c","deleteGoal","ViewHeader","ListHeader","Chip","ErrorState","Card","CardBody","Grid","krCount","decomposed","o","Textarea"],"mappings":"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"}
@@ -1 +1 @@
1
- import{r as w,j as A}from"./cmdk-DVxytz9i.js";import{g as T}from"./main-Cxeu4LhG.js";const a={0:"0",1:"var(--space-1)",2:"var(--space-2)",3:"var(--space-3)",4:"var(--space-4)",5:"var(--space-5)",6:"var(--space-6)",8:"var(--space-8)",10:"var(--space-10)",12:"var(--space-12)",16:"var(--space-16)"},p={1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))",8:"repeat(8, minmax(0, 1fr))",12:"repeat(12, minmax(0, 1fr))"};function h(e){if(e===void 0)return{};if(typeof e=="number")return{gridTemplateColumns:p[e]};const r=e.base??1;return{gridTemplateColumns:p[r]}}const j={start:"start",center:"center",end:"end",stretch:"stretch"},R={start:"start",center:"center",end:"end",stretch:"stretch"},I=w.forwardRef(function(r,m){const{as:d,gap:f=4,rowGap:t,colGap:s,cols:v,rows:n,autoFlow:o,align:i,justify:c,children:l,className:u,style:x,...g}=r,y=d??"div",G={display:"grid",gap:a[f],...t!==void 0&&{rowGap:a[t]},...s!==void 0&&{columnGap:a[s]},...h(v),...n!==void 0&&{gridTemplateRows:`repeat(${n}, minmax(0, 1fr))`},...o!==void 0&&{gridAutoFlow:o},...i!==void 0&&{alignItems:j[i]},...c!==void 0&&{justifyItems:R[c]},...x};return A.jsx(y,{ref:m,className:T("v8-grid",u),style:G,...g,children:l})});export{I as G};
1
+ import{r as w,j as A}from"./cmdk-C3F6LD6N.js";import{g as T}from"./main-BURAlktW.js";const a={0:"0",1:"var(--space-1)",2:"var(--space-2)",3:"var(--space-3)",4:"var(--space-4)",5:"var(--space-5)",6:"var(--space-6)",8:"var(--space-8)",10:"var(--space-10)",12:"var(--space-12)",16:"var(--space-16)"},p={1:"repeat(1, minmax(0, 1fr))",2:"repeat(2, minmax(0, 1fr))",3:"repeat(3, minmax(0, 1fr))",4:"repeat(4, minmax(0, 1fr))",5:"repeat(5, minmax(0, 1fr))",6:"repeat(6, minmax(0, 1fr))",8:"repeat(8, minmax(0, 1fr))",12:"repeat(12, minmax(0, 1fr))"};function h(e){if(e===void 0)return{};if(typeof e=="number")return{gridTemplateColumns:p[e]};const r=e.base??1;return{gridTemplateColumns:p[r]}}const j={start:"start",center:"center",end:"end",stretch:"stretch"},R={start:"start",center:"center",end:"end",stretch:"stretch"},I=w.forwardRef(function(r,m){const{as:d,gap:f=4,rowGap:t,colGap:s,cols:v,rows:n,autoFlow:o,align:i,justify:c,children:l,className:u,style:x,...g}=r,y=d??"div",G={display:"grid",gap:a[f],...t!==void 0&&{rowGap:a[t]},...s!==void 0&&{columnGap:a[s]},...h(v),...n!==void 0&&{gridTemplateRows:`repeat(${n}, minmax(0, 1fr))`},...o!==void 0&&{gridAutoFlow:o},...i!==void 0&&{alignItems:j[i]},...c!==void 0&&{justifyItems:R[c]},...x};return A.jsx(y,{ref:m,className:T("v8-grid",u),style:G,...g,children:l})});export{I as G};
@@ -1 +1 @@
1
- {"version":3,"file":"Grid-BSXhsCPC.js","sources":["../../src/web/v8/ui/primitives/Grid.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Grid — CSS grid wrapper with token-driven gap and template columns.\n *\n * For responsive grids: pass `cols` as an object { base, sm, md, lg }.\n * Otherwise pass a single number (1..12) for a uniform grid.\n */\nexport type GridCols =\n | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12\n | { base?: number; sm?: number; md?: number; lg?: number; xl?: number };\n\nexport interface GridProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n as?: ElementType;\n gap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n rowGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n colGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n cols?: GridCols;\n rows?: 1 | 2 | 3 | 4;\n autoFlow?: 'row' | 'column' | 'dense';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'stretch';\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst SPACE_VAR: Record<NonNullable<GridProps['gap']>, string> = {\n 0: '0',\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n};\n\nconst COLS_VAR: Record<number, string> = {\n 1: 'repeat(1, minmax(0, 1fr))',\n 2: 'repeat(2, minmax(0, 1fr))',\n 3: 'repeat(3, minmax(0, 1fr))',\n 4: 'repeat(4, minmax(0, 1fr))',\n 5: 'repeat(5, minmax(0, 1fr))',\n 6: 'repeat(6, minmax(0, 1fr))',\n 8: 'repeat(8, minmax(0, 1fr))',\n 12: 'repeat(12, minmax(0, 1fr))',\n};\n\nfunction colsToStyle(cols: GridCols | undefined): CSSProperties {\n if (cols === undefined) return {};\n if (typeof cols === 'number') return { gridTemplateColumns: COLS_VAR[cols] };\n // Responsive object — apply base as the default gridTemplateColumns; the\n // breakpoint variants should be handled by the parent component or a\n // generated class. We export the base here; responsive overrides can\n // compose via additional style overrides at the call site.\n const base = cols.base ?? 1;\n return { gridTemplateColumns: COLS_VAR[base] };\n}\n\nconst ALIGN_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\nconst JUSTIFY_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\n\nexport const Grid = forwardRef<HTMLElement, GridProps>(function Grid(props, ref) {\n const {\n as,\n gap = 4,\n rowGap,\n colGap,\n cols,\n rows,\n autoFlow,\n align,\n justify,\n children,\n className,\n style,\n ...rest\n } = props;\n\n const Tag = (as ?? 'div') as ElementType;\n const computedStyle: CSSProperties = {\n display: 'grid',\n gap: SPACE_VAR[gap],\n ...(rowGap !== undefined && { rowGap: SPACE_VAR[rowGap] }),\n ...(colGap !== undefined && { columnGap: SPACE_VAR[colGap] }),\n ...colsToStyle(cols),\n ...(rows !== undefined && { gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))` }),\n ...(autoFlow !== undefined && { gridAutoFlow: autoFlow }),\n ...(align !== undefined && { alignItems: ALIGN_MAP[align] }),\n ...(justify !== undefined && { justifyItems: JUSTIFY_MAP[justify] }),\n ...style,\n };\n\n return (\n <Tag ref={ref} className={cx('v8-grid', className)} style={computedStyle} {...rest}>\n {children}\n </Tag>\n );\n});"],"names":["SPACE_VAR","COLS_VAR","colsToStyle","cols","base","ALIGN_MAP","JUSTIFY_MAP","Grid","forwardRef","props","ref","as","gap","rowGap","colGap","rows","autoFlow","align","justify","children","className","style","rest","Tag","computedStyle","jsx","cx"],"mappings":"qFA4BA,MAAMA,EAA2D,CAC/D,EAAG,IACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,GAAI,kBACJ,GAAI,kBACJ,GAAI,iBACN,EAEMC,EAAmC,CACvC,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,GAAI,4BACN,EAEA,SAASC,EAAYC,EAA2C,CAC9D,GAAIA,IAAS,OAAW,MAAO,CAAA,EAC/B,GAAI,OAAOA,GAAS,SAAU,MAAO,CAAE,oBAAqBF,EAASE,CAAI,CAAA,EAKzE,MAAMC,EAAOD,EAAK,MAAQ,EAC1B,MAAO,CAAE,oBAAqBF,EAASG,CAAI,CAAA,CAC7C,CAEA,MAAMC,EAAY,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EACrEC,EAAc,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EAEhEC,EAAOC,EAAAA,WAAmC,SAAcC,EAAOC,EAAK,CAC/E,KAAM,CACJ,GAAAC,EACA,IAAAC,EAAM,EACN,OAAAC,EACA,OAAAC,EACA,KAAAX,EACA,KAAAY,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CAAA,EACDb,EAEEc,EAAOZ,GAAM,MACba,EAA+B,CACnC,QAAS,OACT,IAAKxB,EAAUY,CAAG,EAClB,GAAIC,IAAW,QAAa,CAAE,OAAQb,EAAUa,CAAM,CAAA,EACtD,GAAIC,IAAW,QAAa,CAAE,UAAWd,EAAUc,CAAM,CAAA,EACzD,GAAGZ,EAAYC,CAAI,EACnB,GAAIY,IAAS,QAAa,CAAE,iBAAkB,UAAUA,CAAI,mBAAA,EAC5D,GAAIC,IAAa,QAAa,CAAE,aAAcA,CAAA,EAC9C,GAAIC,IAAU,QAAa,CAAE,WAAYZ,EAAUY,CAAK,CAAA,EACxD,GAAIC,IAAY,QAAa,CAAE,aAAcZ,EAAYY,CAAO,CAAA,EAChE,GAAGG,CAAA,EAGL,OACEI,EAAAA,IAACF,EAAA,CAAI,IAAAb,EAAU,UAAWgB,EAAG,UAAWN,CAAS,EAAG,MAAOI,EAAgB,GAAGF,EAC3E,SAAAH,CAAA,CACH,CAEJ,CAAC"}
1
+ {"version":3,"file":"Grid--WKvqu5h.js","sources":["../../src/web/v8/ui/primitives/Grid.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type ElementType, type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * Grid — CSS grid wrapper with token-driven gap and template columns.\n *\n * For responsive grids: pass `cols` as an object { base, sm, md, lg }.\n * Otherwise pass a single number (1..12) for a uniform grid.\n */\nexport type GridCols =\n | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 12\n | { base?: number; sm?: number; md?: number; lg?: number; xl?: number };\n\nexport interface GridProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n as?: ElementType;\n gap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n rowGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n colGap?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n cols?: GridCols;\n rows?: 1 | 2 | 3 | 4;\n autoFlow?: 'row' | 'column' | 'dense';\n align?: 'start' | 'center' | 'end' | 'stretch';\n justify?: 'start' | 'center' | 'end' | 'stretch';\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst SPACE_VAR: Record<NonNullable<GridProps['gap']>, string> = {\n 0: '0',\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n};\n\nconst COLS_VAR: Record<number, string> = {\n 1: 'repeat(1, minmax(0, 1fr))',\n 2: 'repeat(2, minmax(0, 1fr))',\n 3: 'repeat(3, minmax(0, 1fr))',\n 4: 'repeat(4, minmax(0, 1fr))',\n 5: 'repeat(5, minmax(0, 1fr))',\n 6: 'repeat(6, minmax(0, 1fr))',\n 8: 'repeat(8, minmax(0, 1fr))',\n 12: 'repeat(12, minmax(0, 1fr))',\n};\n\nfunction colsToStyle(cols: GridCols | undefined): CSSProperties {\n if (cols === undefined) return {};\n if (typeof cols === 'number') return { gridTemplateColumns: COLS_VAR[cols] };\n // Responsive object — apply base as the default gridTemplateColumns; the\n // breakpoint variants should be handled by the parent component or a\n // generated class. We export the base here; responsive overrides can\n // compose via additional style overrides at the call site.\n const base = cols.base ?? 1;\n return { gridTemplateColumns: COLS_VAR[base] };\n}\n\nconst ALIGN_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\nconst JUSTIFY_MAP = { start: 'start', center: 'center', end: 'end', stretch: 'stretch' } as const;\n\nexport const Grid = forwardRef<HTMLElement, GridProps>(function Grid(props, ref) {\n const {\n as,\n gap = 4,\n rowGap,\n colGap,\n cols,\n rows,\n autoFlow,\n align,\n justify,\n children,\n className,\n style,\n ...rest\n } = props;\n\n const Tag = (as ?? 'div') as ElementType;\n const computedStyle: CSSProperties = {\n display: 'grid',\n gap: SPACE_VAR[gap],\n ...(rowGap !== undefined && { rowGap: SPACE_VAR[rowGap] }),\n ...(colGap !== undefined && { columnGap: SPACE_VAR[colGap] }),\n ...colsToStyle(cols),\n ...(rows !== undefined && { gridTemplateRows: `repeat(${rows}, minmax(0, 1fr))` }),\n ...(autoFlow !== undefined && { gridAutoFlow: autoFlow }),\n ...(align !== undefined && { alignItems: ALIGN_MAP[align] }),\n ...(justify !== undefined && { justifyItems: JUSTIFY_MAP[justify] }),\n ...style,\n };\n\n return (\n <Tag ref={ref} className={cx('v8-grid', className)} style={computedStyle} {...rest}>\n {children}\n </Tag>\n );\n});"],"names":["SPACE_VAR","COLS_VAR","colsToStyle","cols","base","ALIGN_MAP","JUSTIFY_MAP","Grid","forwardRef","props","ref","as","gap","rowGap","colGap","rows","autoFlow","align","justify","children","className","style","rest","Tag","computedStyle","jsx","cx"],"mappings":"qFA4BA,MAAMA,EAA2D,CAC/D,EAAG,IACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,EAAG,iBACH,GAAI,kBACJ,GAAI,kBACJ,GAAI,iBACN,EAEMC,EAAmC,CACvC,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,EAAG,4BACH,GAAI,4BACN,EAEA,SAASC,EAAYC,EAA2C,CAC9D,GAAIA,IAAS,OAAW,MAAO,CAAA,EAC/B,GAAI,OAAOA,GAAS,SAAU,MAAO,CAAE,oBAAqBF,EAASE,CAAI,CAAA,EAKzE,MAAMC,EAAOD,EAAK,MAAQ,EAC1B,MAAO,CAAE,oBAAqBF,EAASG,CAAI,CAAA,CAC7C,CAEA,MAAMC,EAAY,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EACrEC,EAAc,CAAE,MAAO,QAAS,OAAQ,SAAU,IAAK,MAAO,QAAS,SAAA,EAEhEC,EAAOC,EAAAA,WAAmC,SAAcC,EAAOC,EAAK,CAC/E,KAAM,CACJ,GAAAC,EACA,IAAAC,EAAM,EACN,OAAAC,EACA,OAAAC,EACA,KAAAX,EACA,KAAAY,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CAAA,EACDb,EAEEc,EAAOZ,GAAM,MACba,EAA+B,CACnC,QAAS,OACT,IAAKxB,EAAUY,CAAG,EAClB,GAAIC,IAAW,QAAa,CAAE,OAAQb,EAAUa,CAAM,CAAA,EACtD,GAAIC,IAAW,QAAa,CAAE,UAAWd,EAAUc,CAAM,CAAA,EACzD,GAAGZ,EAAYC,CAAI,EACnB,GAAIY,IAAS,QAAa,CAAE,iBAAkB,UAAUA,CAAI,mBAAA,EAC5D,GAAIC,IAAa,QAAa,CAAE,aAAcA,CAAA,EAC9C,GAAIC,IAAU,QAAa,CAAE,WAAYZ,EAAUY,CAAK,CAAA,EACxD,GAAIC,IAAY,QAAa,CAAE,aAAcZ,EAAYY,CAAO,CAAA,EAChE,GAAGG,CAAA,EAGL,OACEI,EAAAA,IAACF,EAAA,CAAI,IAAAb,EAAU,UAAWgB,EAAG,UAAWN,CAAS,EAAG,MAAOI,EAAgB,GAAGF,EAC3E,SAAAH,CAAA,CACH,CAEJ,CAAC"}
@@ -1 +1 @@
1
- import{r as a,j as e}from"./cmdk-DVxytz9i.js";import{u as x,a as y,S as f,d as g,I as v,h,P as b,B as k}from"./main-Cxeu4LhG.js";import{V as w}from"./ViewHeader-B6P-C4GD.js";import{C,b as S}from"./Card-rF59wHiO.js";import{E as F}from"./EmptyState-D65J5FQN.js";import{E as M}from"./ErrorState-DULZnttJ.js";import{R}from"./refresh-ccw-DenGBOcq.js";import"./Alert-B6DjfRFI.js";import"./circle-alert-HdHe7m8K.js";import"./triangle-alert-tUTXbcEP.js";import"./circle-check-Cs-xoV7R.js";function E(i){if(!i)return"";const r=new Date(i).getTime();if(!Number.isFinite(r))return"";const s=Math.max(0,Date.now()-r);return s<6e4?"just now":s<36e5?`${Math.round(s/6e4)}m ago`:s<864e5?`${Math.round(s/36e5)}h ago`:new Date(r).toLocaleString()}function P(){const i=x("/api/history"),[r,s]=a.useState(null),[o,p]=a.useState(null),c=a.useCallback(()=>{i.refetch()},[i]);y("history:new",c);const l=a.useMemo(()=>{var t;return((t=i.data)==null?void 0:t.events)??[]},[i.data]),m=a.useMemo(()=>{var t;return((t=i.data)==null?void 0:t.projects)??[]},[i.data]),u=a.useMemo(()=>{const t=new Set;for(const n of l)n.kind&&t.add(n.kind);return Array.from(t).sort()},[l]);a.useEffect(()=>{r!==null&&!u.includes(r)&&s(null)},[u,r]);const j=a.useMemo(()=>l.filter(t=>!(r!==null&&t.kind!==r||o!==null&&t.project!==o)),[l,r,o]);return e.jsxs(f,{gap:4,"data-testid":"history-view",children:[e.jsx(w,{title:"History",description:"Cross-project activity timeline. Filter by kind or project. Live updates on new events.",actions:e.jsxs(g,{variant:"ghost",onClick:()=>void c(),"data-testid":"history-refresh",children:[e.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]})}),e.jsxs(v,{gap:2,wrap:!0,children:[e.jsx(d,{label:"All kinds",active:r===null,onClick:()=>s(null),testid:"history-filter-kind-all"}),u.map(t=>e.jsx(d,{label:t,active:r===t,onClick:()=>s(n=>n===t?null:t),testid:`history-filter-kind-${t}`},t)),m.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,alignSelf:"stretch",background:"var(--border)"},"aria-hidden":!0}),e.jsx(d,{label:"All projects",active:o===null,onClick:()=>p(null),testid:"history-filter-project-all"}),m.map(t=>e.jsx(d,{label:t.name||t.id,active:o===t.id,onClick:()=>p(n=>n===t.id?null:t.id),testid:`history-filter-project-${t.id}`},t.id))]})]}),e.jsx(C,{variant:"default",children:e.jsx(S,{children:i.loading&&l.length===0?e.jsxs(f,{gap:2,children:[e.jsx(h,{style:{height:36}}),e.jsx(h,{style:{height:36}}),e.jsx(h,{style:{height:36}})]}):i.error&&l.length===0?e.jsx(M,{block:!0,title:"Couldn't load history",description:"The timeline endpoint failed. Retry to refetch.",error:i.error,onRetry:c,testid:"history-error"}):j.length===0?e.jsx(F,{icon:e.jsx(b,{size:28,"aria-hidden":!0}),title:"No events",description:r||o?"No events match the current filter.":"No activity yet."}):e.jsx(f,{gap:1,children:j.map((t,n)=>e.jsxs("div",{"data-testid":`history-row-${n}`,style:{display:"grid",gridTemplateColumns:"120px 1fr",gap:"var(--space-3)",padding:"var(--space-2)",borderBottom:"1px solid var(--border)"},children:[e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:E(t.ts)}),e.jsxs(v,{align:"center",gap:2,wrap:!0,children:[t.kind&&e.jsx(k,{tone:"info",size:"sm",children:t.kind}),e.jsx("span",{children:t.title||t.description||t.id||"event"}),t.project&&e.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["· ",t.project]})]})]},t.id??`${t.ts}-${n}`))})})})]})}function d({label:i,active:r,onClick:s,testid:o}){return e.jsx("button",{type:"button",onClick:s,"data-testid":o,style:{padding:"var(--space-1) var(--space-3)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)",background:r?"color-mix(in oklch, var(--accent) 18%, transparent)":"var(--surface-0)",color:r?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:i})}export{P as HistoryView};
1
+ import{r as a,j as e}from"./cmdk-C3F6LD6N.js";import{u as x,a as y,S as f,B as g,I as v,h,P as b,b as k}from"./main-BURAlktW.js";import{V as w}from"./ViewHeader-C-t1U2cQ.js";import{C,b as S}from"./Card-BtsmkhJa.js";import{E as F}from"./EmptyState-DjKtY1Qi.js";import{E as M}from"./ErrorState-CBJbEQ8B.js";import{R}from"./refresh-ccw-DA8_IB9l.js";import"./Alert-BZGk39mB.js";import"./circle-alert-Dz8lGfCZ.js";import"./triangle-alert-B2oHbmoh.js";import"./circle-check-DFB50ojt.js";function E(i){if(!i)return"";const r=new Date(i).getTime();if(!Number.isFinite(r))return"";const s=Math.max(0,Date.now()-r);return s<6e4?"just now":s<36e5?`${Math.round(s/6e4)}m ago`:s<864e5?`${Math.round(s/36e5)}h ago`:new Date(r).toLocaleString()}function P(){const i=x("/api/history"),[r,s]=a.useState(null),[o,p]=a.useState(null),c=a.useCallback(()=>{i.refetch()},[i]);y("history:new",c);const l=a.useMemo(()=>{var t;return((t=i.data)==null?void 0:t.events)??[]},[i.data]),m=a.useMemo(()=>{var t;return((t=i.data)==null?void 0:t.projects)??[]},[i.data]),u=a.useMemo(()=>{const t=new Set;for(const n of l)n.kind&&t.add(n.kind);return Array.from(t).sort()},[l]);a.useEffect(()=>{r!==null&&!u.includes(r)&&s(null)},[u,r]);const j=a.useMemo(()=>l.filter(t=>!(r!==null&&t.kind!==r||o!==null&&t.project!==o)),[l,r,o]);return e.jsxs(f,{gap:4,"data-testid":"history-view",children:[e.jsx(w,{title:"History",description:"Cross-project activity timeline. Filter by kind or project. Live updates on new events.",actions:e.jsxs(g,{variant:"ghost",onClick:()=>void c(),"data-testid":"history-refresh",children:[e.jsx(R,{size:14,"aria-hidden":!0})," Refresh"]})}),e.jsxs(v,{gap:2,wrap:!0,children:[e.jsx(d,{label:"All kinds",active:r===null,onClick:()=>s(null),testid:"history-filter-kind-all"}),u.map(t=>e.jsx(d,{label:t,active:r===t,onClick:()=>s(n=>n===t?null:t),testid:`history-filter-kind-${t}`},t)),m.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,alignSelf:"stretch",background:"var(--border)"},"aria-hidden":!0}),e.jsx(d,{label:"All projects",active:o===null,onClick:()=>p(null),testid:"history-filter-project-all"}),m.map(t=>e.jsx(d,{label:t.name||t.id,active:o===t.id,onClick:()=>p(n=>n===t.id?null:t.id),testid:`history-filter-project-${t.id}`},t.id))]})]}),e.jsx(C,{variant:"default",children:e.jsx(S,{children:i.loading&&l.length===0?e.jsxs(f,{gap:2,children:[e.jsx(h,{style:{height:36}}),e.jsx(h,{style:{height:36}}),e.jsx(h,{style:{height:36}})]}):i.error&&l.length===0?e.jsx(M,{block:!0,title:"Couldn't load history",description:"The timeline endpoint failed. Retry to refetch.",error:i.error,onRetry:c,testid:"history-error"}):j.length===0?e.jsx(F,{icon:e.jsx(b,{size:28,"aria-hidden":!0}),title:"No events",description:r||o?"No events match the current filter.":"No activity yet."}):e.jsx(f,{gap:1,children:j.map((t,n)=>e.jsxs("div",{"data-testid":`history-row-${n}`,style:{display:"grid",gridTemplateColumns:"120px 1fr",gap:"var(--space-3)",padding:"var(--space-2)",borderBottom:"1px solid var(--border)"},children:[e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:E(t.ts)}),e.jsxs(v,{align:"center",gap:2,wrap:!0,children:[t.kind&&e.jsx(k,{tone:"info",size:"sm",children:t.kind}),e.jsx("span",{children:t.title||t.description||t.id||"event"}),t.project&&e.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["· ",t.project]})]})]},t.id??`${t.ts}-${n}`))})})})]})}function d({label:i,active:r,onClick:s,testid:o}){return e.jsx("button",{type:"button",onClick:s,"data-testid":o,style:{padding:"var(--space-1) var(--space-3)",borderRadius:"var(--radius-pill)",border:"1px solid var(--border)",background:r?"color-mix(in oklch, var(--accent) 18%, transparent)":"var(--surface-0)",color:r?"var(--accent)":"var(--fg-muted)",fontSize:"var(--fs-12)",cursor:"pointer"},children:i})}export{P as HistoryView};