@polderlabs/bizar 10.4.1 → 10.4.3

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 (222) hide show
  1. package/bizar-dash/dist/assets/{ActivityFeed-DtRtg-JN.js → ActivityFeed-DC0JiK49.js} +1 -1
  2. package/bizar-dash/dist/assets/{ActivityFeed-DtRtg-JN.js.map → ActivityFeed-DC0JiK49.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityView-CoTXDyU_.js → ActivityView-ubEDAWMY.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-CoTXDyU_.js.map → ActivityView-ubEDAWMY.js.map} +1 -1
  5. package/bizar-dash/dist/assets/{AdminView-DNc5Ll7L.js → AdminView-CI4zM2Qg.js} +1 -1
  6. package/bizar-dash/dist/assets/{AdminView-DNc5Ll7L.js.map → AdminView-CI4zM2Qg.js.map} +1 -1
  7. package/bizar-dash/dist/assets/{AgentActivity-CrX7LmQ6.js → AgentActivity-BLcqqkt2.js} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-CrX7LmQ6.js.map → AgentActivity-BLcqqkt2.js.map} +1 -1
  9. package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js +15 -0
  10. package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js.map +1 -0
  11. package/bizar-dash/dist/assets/{Alert-B6DjfRFI.js → Alert-MwVEymjy.js} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-B6DjfRFI.js.map → Alert-MwVEymjy.js.map} +1 -1
  13. package/bizar-dash/dist/assets/{ArtifactsView-znhN8GTR.js → ArtifactsView-B-YUwZyb.js} +1 -1
  14. package/bizar-dash/dist/assets/{ArtifactsView-znhN8GTR.js.map → ArtifactsView-B-YUwZyb.js.map} +1 -1
  15. package/bizar-dash/dist/assets/{AuthView-Rk8eKUPr.js → AuthView-LaQuGo4u.js} +1 -1
  16. package/bizar-dash/dist/assets/{AuthView-Rk8eKUPr.js.map → AuthView-LaQuGo4u.js.map} +1 -1
  17. package/bizar-dash/dist/assets/{Avatar-B41upSD1.js → Avatar-Dg4OF4RD.js} +1 -1
  18. package/bizar-dash/dist/assets/{Avatar-B41upSD1.js.map → Avatar-Dg4OF4RD.js.map} +1 -1
  19. package/bizar-dash/dist/assets/{BackgroundJobsView-BLWuN9qz.js → BackgroundJobsView-CO3DEG8R.js} +1 -1
  20. package/bizar-dash/dist/assets/{BackgroundJobsView-BLWuN9qz.js.map → BackgroundJobsView-CO3DEG8R.js.map} +1 -1
  21. package/bizar-dash/dist/assets/{BackupView-CqbtcnuQ.js → BackupView-Cjf23ZWc.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-CqbtcnuQ.js.map → BackupView-Cjf23ZWc.js.map} +1 -1
  23. package/bizar-dash/dist/assets/{Card-rF59wHiO.js → Card-BmXiT4c6.js} +1 -1
  24. package/bizar-dash/dist/assets/{Card-rF59wHiO.js.map → Card-BmXiT4c6.js.map} +1 -1
  25. package/bizar-dash/dist/assets/ChatView-DXKFwvgp.js +9 -0
  26. package/bizar-dash/dist/assets/ChatView-DXKFwvgp.js.map +1 -0
  27. package/bizar-dash/dist/assets/{Chip-Dc2KmeWl.js → Chip-Dei66BLx.js} +1 -1
  28. package/bizar-dash/dist/assets/{Chip-Dc2KmeWl.js.map → Chip-Dei66BLx.js.map} +1 -1
  29. package/bizar-dash/dist/assets/{ClaudeSessionsView-CiaHQdDZ.js → ClaudeSessionsView-D-YNmzKi.js} +1 -1
  30. package/bizar-dash/dist/assets/{ClaudeSessionsView-CiaHQdDZ.js.map → ClaudeSessionsView-D-YNmzKi.js.map} +1 -1
  31. package/bizar-dash/dist/assets/{ClipboardView-DdP6aVso.js → ClipboardView-BA323V2J.js} +1 -1
  32. package/bizar-dash/dist/assets/{ClipboardView-DdP6aVso.js.map → ClipboardView-BA323V2J.js.map} +1 -1
  33. package/bizar-dash/dist/assets/{ConfigView-B2ysnTZU.js → ConfigView-BMBgifw5.js} +1 -1
  34. package/bizar-dash/dist/assets/{ConfigView-B2ysnTZU.js.map → ConfigView-BMBgifw5.js.map} +1 -1
  35. package/bizar-dash/dist/assets/DiagnosticsView-C0sdqhEl.js +2 -0
  36. package/bizar-dash/dist/assets/DiagnosticsView-C0sdqhEl.js.map +1 -0
  37. package/bizar-dash/dist/assets/{DialogsView-BcqDDCZQ.js → DialogsView-DzTnyX8K.js} +1 -1
  38. package/bizar-dash/dist/assets/{DialogsView-BcqDDCZQ.js.map → DialogsView-DzTnyX8K.js.map} +1 -1
  39. package/bizar-dash/dist/assets/{DoctorView-BQwqvMAh.js → DoctorView-CiFwRMW0.js} +1 -1
  40. package/bizar-dash/dist/assets/{DoctorView-BQwqvMAh.js.map → DoctorView-CiFwRMW0.js.map} +1 -1
  41. package/bizar-dash/dist/assets/{EmptyState-D65J5FQN.js → EmptyState-CdDQmfEL.js} +1 -1
  42. package/bizar-dash/dist/assets/{EmptyState-D65J5FQN.js.map → EmptyState-CdDQmfEL.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EnvVarsView-DX-3oGH-.js → EnvVarsView-CNO03NDJ.js} +1 -1
  44. package/bizar-dash/dist/assets/{EnvVarsView-DX-3oGH-.js.map → EnvVarsView-CNO03NDJ.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{ErrorState-DULZnttJ.js → ErrorState-BRvj8qZZ.js} +1 -1
  46. package/bizar-dash/dist/assets/{ErrorState-DULZnttJ.js.map → ErrorState-BRvj8qZZ.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{EvalView-CpdFu_ID.js → EvalView-lgUhlGJh.js} +1 -1
  48. package/bizar-dash/dist/assets/{EvalView-CpdFu_ID.js.map → EvalView-lgUhlGJh.js.map} +1 -1
  49. package/bizar-dash/dist/assets/{GoalsView-Br8oPPfb.js → GoalsView-DmkCCs9i.js} +1 -1
  50. package/bizar-dash/dist/assets/{GoalsView-Br8oPPfb.js.map → GoalsView-DmkCCs9i.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{Grid-BSXhsCPC.js → Grid-BThCPJaV.js} +1 -1
  52. package/bizar-dash/dist/assets/{Grid-BSXhsCPC.js.map → Grid-BThCPJaV.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{HistoryView-D0J3aoZF.js → HistoryView-Cn2cPiHZ.js} +1 -1
  54. package/bizar-dash/dist/assets/{HistoryView-D0J3aoZF.js.map → HistoryView-Cn2cPiHZ.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{Input-CZmRw5QX.js → Input-cAQOvR8U.js} +1 -1
  56. package/bizar-dash/dist/assets/{Input-CZmRw5QX.js.map → Input-cAQOvR8U.js.map} +1 -1
  57. package/bizar-dash/dist/assets/LibrariesView-Ca_PRjUm.js +6 -0
  58. package/bizar-dash/dist/assets/{LibrariesView-B1YX9wzp.js.map → LibrariesView-Ca_PRjUm.js.map} +1 -1
  59. package/bizar-dash/dist/assets/{LightRAGView-CykR0t9y.js → LightRAGView-CMk9wOae.js} +1 -1
  60. package/bizar-dash/dist/assets/{LightRAGView-CykR0t9y.js.map → LightRAGView-CMk9wOae.js.map} +1 -1
  61. package/bizar-dash/dist/assets/{ListHeader-Dpun-r36.js → ListHeader-BLAeshe0.js} +1 -1
  62. package/bizar-dash/dist/assets/{ListHeader-Dpun-r36.js.map → ListHeader-BLAeshe0.js.map} +1 -1
  63. package/bizar-dash/dist/assets/{MemoryView-BbER5ZKt.js → MemoryView-wo2Pu7xQ.js} +1 -1
  64. package/bizar-dash/dist/assets/{MemoryView-BbER5ZKt.js.map → MemoryView-wo2Pu7xQ.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MessageBubble-5vUAquDx.js → MessageBubble-CrCJ0SYG.js} +1 -1
  66. package/bizar-dash/dist/assets/{MessageBubble-5vUAquDx.js.map → MessageBubble-CrCJ0SYG.js.map} +1 -1
  67. package/bizar-dash/dist/assets/{MiscView-DLNEGdML.js → MiscView-fBT1TOXC.js} +1 -1
  68. package/bizar-dash/dist/assets/{MiscView-DLNEGdML.js.map → MiscView-fBT1TOXC.js.map} +1 -1
  69. package/bizar-dash/dist/assets/{ModsView-P7gDeNHM.js → ModsView-CV_RxdzJ.js} +1 -1
  70. package/bizar-dash/dist/assets/{ModsView-P7gDeNHM.js.map → ModsView-CV_RxdzJ.js.map} +1 -1
  71. package/bizar-dash/dist/assets/{NotificationsView-DAm2O0yf.js → NotificationsView-BKAZLxM2.js} +1 -1
  72. package/bizar-dash/dist/assets/{NotificationsView-DAm2O0yf.js.map → NotificationsView-BKAZLxM2.js.map} +1 -1
  73. package/bizar-dash/dist/assets/{ObsidianView-Ci80gnwS.js → ObsidianView-C-AvHfpT.js} +1 -1
  74. package/bizar-dash/dist/assets/{ObsidianView-Ci80gnwS.js.map → ObsidianView-C-AvHfpT.js.map} +1 -1
  75. package/bizar-dash/dist/assets/{OverviewView-rriw1GjA.js → OverviewView-CKYzZJe3.js} +1 -1
  76. package/bizar-dash/dist/assets/{OverviewView-rriw1GjA.js.map → OverviewView-CKYzZJe3.js.map} +1 -1
  77. package/bizar-dash/dist/assets/{ProgressBar-BahmeJhP.js → ProgressBar-ya2PCj8L.js} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-BahmeJhP.js.map → ProgressBar-ya2PCj8L.js.map} +1 -1
  79. package/bizar-dash/dist/assets/ProjectsView-N9zqFZ_O.js +11 -0
  80. package/bizar-dash/dist/assets/ProjectsView-N9zqFZ_O.js.map +1 -0
  81. package/bizar-dash/dist/assets/{ProvidersView-BftGn8Cr.js → ProvidersView-BcL8jjwK.js} +1 -1
  82. package/bizar-dash/dist/assets/{ProvidersView-BftGn8Cr.js.map → ProvidersView-BcL8jjwK.js.map} +1 -1
  83. package/bizar-dash/dist/assets/{SchedulesView-CtNxtzN6.js → SchedulesView-8qxH3bg7.js} +1 -1
  84. package/bizar-dash/dist/assets/{SchedulesView-CtNxtzN6.js.map → SchedulesView-8qxH3bg7.js.map} +1 -1
  85. package/bizar-dash/dist/assets/{Select-0VcfTDeL.js → Select-D5AuVxxV.js} +1 -1
  86. package/bizar-dash/dist/assets/{Select-0VcfTDeL.js.map → Select-D5AuVxxV.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{SettingsRow-BLic3DQl.js → SettingsRow-BBALf9dA.js} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-BLic3DQl.js.map → SettingsRow-BBALf9dA.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsView-BjS3i4nr.js → SettingsView-UD403neY.js} +1 -1
  90. package/bizar-dash/dist/assets/{SettingsView-BjS3i4nr.js.map → SettingsView-UD403neY.js.map} +1 -1
  91. package/bizar-dash/dist/assets/{Sheet-BOProMs2.js → Sheet-CxXf6gvC.js} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-BOProMs2.js.map → Sheet-CxXf6gvC.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Slider-B0eLEEUt.js → Slider-hvaVD_SW.js} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-B0eLEEUt.js.map → Slider-hvaVD_SW.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Sparkline-SSrdgyW0.js → Sparkline-DqmQzdJH.js} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-SSrdgyW0.js.map → Sparkline-DqmQzdJH.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{Switch-B3EQzb_q.js → Switch-C-_zcNdl.js} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-B3EQzb_q.js.map → Switch-C-_zcNdl.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{TasksView-SWjF_ZUQ.js → TasksView-DseftDlx.js} +1 -1
  100. package/bizar-dash/dist/assets/{TasksView-SWjF_ZUQ.js.map → TasksView-DseftDlx.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{Textarea-QuofpMlq.js → Textarea-CcQGSgSH.js} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-QuofpMlq.js.map → Textarea-CcQGSgSH.js.map} +1 -1
  103. package/bizar-dash/dist/assets/{UpdateView-CEHW2nd6.js → UpdateView-B9Lh4svM.js} +1 -1
  104. package/bizar-dash/dist/assets/{UpdateView-CEHW2nd6.js.map → UpdateView-B9Lh4svM.js.map} +1 -1
  105. package/bizar-dash/dist/assets/{UsageView-BqOw6FBg.js → UsageView-P5_pQ68d.js} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-BqOw6FBg.js.map → UsageView-P5_pQ68d.js.map} +1 -1
  107. package/bizar-dash/dist/assets/{ViewHeader-B6P-C4GD.js → ViewHeader-BaCWNuVX.js} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-B6P-C4GD.js.map → ViewHeader-BaCWNuVX.js.map} +1 -1
  109. package/bizar-dash/dist/assets/{VoiceView-CwrPwWgi.js → VoiceView-BwR9gm5e.js} +1 -1
  110. package/bizar-dash/dist/assets/{VoiceView-CwrPwWgi.js.map → VoiceView-BwR9gm5e.js.map} +1 -1
  111. package/bizar-dash/dist/assets/{brain-CwZt9Kta.js → brain-D6tAeUDE.js} +1 -1
  112. package/bizar-dash/dist/assets/{brain-CwZt9Kta.js.map → brain-D6tAeUDE.js.map} +1 -1
  113. package/bizar-dash/dist/assets/{calendar-C5oK0_nM.js → calendar-BrMJf3vl.js} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-C5oK0_nM.js.map → calendar-BrMJf3vl.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{circle-alert-HdHe7m8K.js → circle-alert-D7jn06kH.js} +1 -1
  116. package/bizar-dash/dist/assets/{circle-alert-HdHe7m8K.js.map → circle-alert-D7jn06kH.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-check-Cs-xoV7R.js → circle-check-DHs37Sot.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-check-Cs-xoV7R.js.map → circle-check-DHs37Sot.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{circle-D1Lc_P2a.js → circle-fPTATiOs.js} +1 -1
  120. package/bizar-dash/dist/assets/{circle-D1Lc_P2a.js.map → circle-fPTATiOs.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{clock-DEIuPV60.js → clock-E-G5aGua.js} +1 -1
  122. package/bizar-dash/dist/assets/{clock-DEIuPV60.js.map → clock-E-G5aGua.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{cmdk-DVxytz9i.js → cmdk-C3F6LD6N.js} +5 -5
  124. package/bizar-dash/dist/assets/{cmdk-DVxytz9i.js.map → cmdk-C3F6LD6N.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{dnd-kit-DrHErSkw.js → dnd-kit-BAOLODOI.js} +1 -1
  126. package/bizar-dash/dist/assets/{dnd-kit-DrHErSkw.js.map → dnd-kit-BAOLODOI.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{download-Clkq90Ct.js → download-DBkNb6oI.js} +1 -1
  128. package/bizar-dash/dist/assets/{download-Clkq90Ct.js.map → download-DBkNb6oI.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{external-link-D5tq2o_I.js → external-link-C4pHGbz2.js} +1 -1
  130. package/bizar-dash/dist/assets/{external-link-D5tq2o_I.js.map → external-link-C4pHGbz2.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{file-text-CQ12t7Oc.js → file-text-CEhDgLq2.js} +1 -1
  132. package/bizar-dash/dist/assets/{file-text-CQ12t7Oc.js.map → file-text-CEhDgLq2.js.map} +1 -1
  133. package/bizar-dash/dist/assets/{filter-BcbE37wP.js → filter-CEYjeWFX.js} +1 -1
  134. package/bizar-dash/dist/assets/{filter-BcbE37wP.js.map → filter-CEYjeWFX.js.map} +1 -1
  135. package/bizar-dash/dist/assets/{git-pull-request-D1qNDRia.js → git-pull-request-Bo_wBZZw.js} +1 -1
  136. package/bizar-dash/dist/assets/{git-pull-request-D1qNDRia.js.map → git-pull-request-Bo_wBZZw.js.map} +1 -1
  137. package/bizar-dash/dist/assets/{index-CASP1n-5.js → index-B1OIS316.js} +1 -1
  138. package/bizar-dash/dist/assets/{index-CASP1n-5.js.map → index-B1OIS316.js.map} +1 -1
  139. package/bizar-dash/dist/assets/{index-C4Vq_2LM.js → index-CR0TeJmc.js} +1 -1
  140. package/bizar-dash/dist/assets/{index-C4Vq_2LM.js.map → index-CR0TeJmc.js.map} +1 -1
  141. package/bizar-dash/dist/assets/main-BZMmD6a8.js +249 -0
  142. package/bizar-dash/dist/assets/main-BZMmD6a8.js.map +1 -0
  143. package/bizar-dash/dist/assets/{main-CcQfRfIJ.css → main-DDAMz_H5.css} +1 -1
  144. package/bizar-dash/dist/assets/{network-DJdvVaHx.js → network-BsfwrUA-.js} +1 -1
  145. package/bizar-dash/dist/assets/{network-DJdvVaHx.js.map → network-BsfwrUA-.js.map} +1 -1
  146. package/bizar-dash/dist/assets/{pause-DUn9L5PB.js → pause-C8PN1_yO.js} +1 -1
  147. package/bizar-dash/dist/assets/{pause-DUn9L5PB.js.map → pause-C8PN1_yO.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{pencil-DVrBlYV3.js → pencil---XuvKlz.js} +1 -1
  149. package/bizar-dash/dist/assets/{pencil-DVrBlYV3.js.map → pencil---XuvKlz.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{play-CZjsr3XM.js → play-fMLPTihK.js} +1 -1
  151. package/bizar-dash/dist/assets/{play-CZjsr3XM.js.map → play-fMLPTihK.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{plug-BKuyIe5W.js → plug-CG8al2Kq.js} +1 -1
  153. package/bizar-dash/dist/assets/{plug-BKuyIe5W.js.map → plug-CG8al2Kq.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{plus-77h62zZm.js → plus-uA5Ecuch.js} +1 -1
  155. package/bizar-dash/dist/assets/{plus-77h62zZm.js.map → plus-uA5Ecuch.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{power-DLmx-gCP.js → power-DSUlNIuR.js} +1 -1
  157. package/bizar-dash/dist/assets/{power-DLmx-gCP.js.map → power-DSUlNIuR.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{power-off-BFKzHXic.js → power-off-1CAQsHHy.js} +1 -1
  159. package/bizar-dash/dist/assets/{power-off-BFKzHXic.js.map → power-off-1CAQsHHy.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{refresh-ccw-DenGBOcq.js → refresh-ccw-BL7B0NO1.js} +1 -1
  161. package/bizar-dash/dist/assets/{refresh-ccw-DenGBOcq.js.map → refresh-ccw-BL7B0NO1.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{refresh-cw-ENBVR8hW.js → refresh-cw-CR9BzJik.js} +1 -1
  163. package/bizar-dash/dist/assets/{refresh-cw-ENBVR8hW.js.map → refresh-cw-CR9BzJik.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{rotate-ccw-MxryaY7q.js → rotate-ccw-BtnitLfb.js} +1 -1
  165. package/bizar-dash/dist/assets/{rotate-ccw-MxryaY7q.js.map → rotate-ccw-BtnitLfb.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{rotate-cw-CDOlRtUR.js → rotate-cw-CHgXCO7O.js} +1 -1
  167. package/bizar-dash/dist/assets/{rotate-cw-CDOlRtUR.js.map → rotate-cw-CHgXCO7O.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{save-Db1b-1Uq.js → save-RcZOXR0U.js} +1 -1
  169. package/bizar-dash/dist/assets/{save-Db1b-1Uq.js.map → save-RcZOXR0U.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{send-yz6HFZM5.js → send-Bg2X_ibk.js} +1 -1
  171. package/bizar-dash/dist/assets/{send-yz6HFZM5.js.map → send-Bg2X_ibk.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{shield-alert-DY6RAaC8.js → shield-alert-Dm48D034.js} +1 -1
  173. package/bizar-dash/dist/assets/{shield-alert-DY6RAaC8.js.map → shield-alert-Dm48D034.js.map} +1 -1
  174. package/bizar-dash/dist/assets/{trash-2-Cv7U38jw.js → trash-2-B885GY46.js} +1 -1
  175. package/bizar-dash/dist/assets/{trash-2-Cv7U38jw.js.map → trash-2-B885GY46.js.map} +1 -1
  176. package/bizar-dash/dist/assets/{trending-up-CRPNagyX.js → trending-up-CqUBvVxw.js} +1 -1
  177. package/bizar-dash/dist/assets/{trending-up-CRPNagyX.js.map → trending-up-CqUBvVxw.js.map} +1 -1
  178. package/bizar-dash/dist/assets/{triangle-alert-tUTXbcEP.js → triangle-alert-DLmUhymD.js} +1 -1
  179. package/bizar-dash/dist/assets/{triangle-alert-tUTXbcEP.js.map → triangle-alert-DLmUhymD.js.map} +1 -1
  180. package/bizar-dash/dist/assets/{upload-Cq7uTsrT.js → upload-C-oafpyE.js} +1 -1
  181. package/bizar-dash/dist/assets/{upload-Cq7uTsrT.js.map → upload-C-oafpyE.js.map} +1 -1
  182. package/bizar-dash/dist/assets/{zap-5lAQBAPX.js → zap-O_4Ys_hh.js} +1 -1
  183. package/bizar-dash/dist/assets/{zap-5lAQBAPX.js.map → zap-O_4Ys_hh.js.map} +1 -1
  184. package/bizar-dash/dist/index.html +3 -3
  185. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  186. package/bizar-dash/src/server/api.mjs +0 -4
  187. package/bizar-dash/src/server/routes/audit.mjs +2 -1
  188. package/bizar-dash/src/web/v8/App.tsx +62 -2
  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 +44 -33
  192. package/bizar-dash/src/web/v8/shell/Topbar.tsx +5 -2
  193. package/bizar-dash/src/web/v8/ui/styles/globals.css +26 -0
  194. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +26 -1
  195. package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +13 -1
  196. package/bizar-dash/src/web/v8/views/ClaudeSessions/NewSessionModal.tsx +136 -0
  197. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +14 -4
  198. package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +50 -7
  199. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +6 -1
  200. package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +21 -1
  201. package/bizar-dash/tests/admin-labels.test.mjs +42 -0
  202. package/bizar-dash/tests/agents-summary-sanitize.test.ts +51 -0
  203. package/bizar-dash/tests/chat-new-session.test.mjs +63 -0
  204. package/bizar-dash/tests/kanban-empty-column.test.mjs +56 -0
  205. package/bizar-dash/tests/library-dedupe.test.mjs +62 -0
  206. package/bizar-dash/tests/projects-filter.test.mjs +48 -0
  207. package/bizar-dash/tests/settings-labels.test.mjs +80 -0
  208. package/bizar-dash/tests/sidebar-responsive.test.tsx +48 -0
  209. package/bizar-dash/tests/sidebar-section-toggle.test.tsx +63 -0
  210. package/package.json +1 -1
  211. package/packages/sdk/package.json +1 -1
  212. package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js +0 -13
  213. package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js.map +0 -1
  214. package/bizar-dash/dist/assets/ChatView-CUriVEgU.js +0 -9
  215. package/bizar-dash/dist/assets/ChatView-CUriVEgU.js.map +0 -1
  216. package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js +0 -2
  217. package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js.map +0 -1
  218. package/bizar-dash/dist/assets/LibrariesView-B1YX9wzp.js +0 -6
  219. package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js +0 -11
  220. package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js.map +0 -1
  221. package/bizar-dash/dist/assets/main-Cxeu4LhG.js +0 -244
  222. package/bizar-dash/dist/assets/main-Cxeu4LhG.js.map +0 -1
@@ -0,0 +1,63 @@
1
+ /**
2
+ * sidebar-section-toggle.test.ts — Bug C4
3
+ * Verifies that section-toggle buttons have aria-expanded, nav buttons don't,
4
+ * and the active nav button has aria-current="page".
5
+ */
6
+ import { test, expect, vi } from 'vitest';
7
+ import { render } from '@testing-library/react';
8
+ import { Sidebar } from '../src/web/v8/shell/Sidebar.js';
9
+
10
+ // Mock localStorage
11
+ Object.assign(globalThis, {
12
+ localStorage: {
13
+ getItem: vi.fn(() => null),
14
+ setItem: vi.fn(),
15
+ },
16
+ });
17
+
18
+ test('C4: section-toggle buttons have aria-expanded, nav items do not', () => {
19
+ render(
20
+ <Sidebar
21
+ defaultSections={true}
22
+ onItemSelect={vi.fn()}
23
+ activeId="overview"
24
+ />,
25
+ );
26
+
27
+ // Find all section-toggle buttons (they have data-section-toggle)
28
+ const sectionToggles = document.querySelectorAll('[data-section-toggle]');
29
+ expect(sectionToggles.length).toBeGreaterThan(0);
30
+
31
+ for (const toggle of sectionToggles) {
32
+ expect(toggle).toHaveAttribute('aria-expanded');
33
+ }
34
+
35
+ // Find all nav-item buttons (they have data-nav-item)
36
+ const navItems = document.querySelectorAll('[data-nav-item]');
37
+ expect(navItems.length).toBeGreaterThan(0);
38
+
39
+ // Nav items should NOT have aria-expanded
40
+ for (const nav of navItems) {
41
+ expect(nav).not.toHaveAttribute('aria-expanded');
42
+ }
43
+ });
44
+
45
+ test('C4: active nav button has aria-current="page"', () => {
46
+ render(
47
+ <Sidebar
48
+ defaultSections={true}
49
+ onItemSelect={vi.fn()}
50
+ activeId="tasks"
51
+ />,
52
+ );
53
+
54
+ // Find the active nav item (data-nav-item="tasks")
55
+ const activeNav = document.querySelector('[data-nav-item="tasks"]');
56
+ expect(activeNav).toBeTruthy();
57
+ expect(activeNav).toHaveAttribute('aria-current', 'page');
58
+
59
+ // Inactive nav item should NOT have aria-current="page"
60
+ const inactiveNav = document.querySelector('[data-nav-item="overview"]');
61
+ expect(inactiveNav).toBeTruthy();
62
+ expect(inactiveNav).not.toHaveAttribute('aria-current', 'page');
63
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polderlabs/bizar",
3
- "version": "10.4.1",
3
+ "version": "10.4.3",
4
4
  "description": "Norse-pantheon multi-agent system for Claude Code — 14 agents across 4 cost tiers with cost-aware routing, plans, and a configurable agent harness. Ships as a single npm package with the dashboard server, Claude Code MCP server, and typed SDK.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polderlabs/bizar-sdk",
3
- "version": "10.4.1",
3
+ "version": "10.4.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1,13 +0,0 @@
1
- import{j as e,r as d}from"./cmdk-DVxytz9i.js";import{c as oe,B as L,A as te,g as ye,S as A,I as $,d as E,u as _,h as U,i as J,a as se,C as xe,b as je,j as be,F as q}from"./main-Cxeu4LhG.js";import{G as re}from"./Grid-BSXhsCPC.js";import{C as Se,V as ke}from"./ViewHeader-B6P-C4GD.js";import{L as we}from"./ListHeader-Dpun-r36.js";import{A as ie,G as Ce,B as ze}from"./Avatar-B41upSD1.js";import{P as Re}from"./ProgressBar-BahmeJhP.js";import{Z as Te}from"./zap-5lAQBAPX.js";import{S as le,a as de}from"./Sheet-BOProMs2.js";import{T as $e}from"./Textarea-QuofpMlq.js";import{C as ce,b as ue}from"./Card-rF59wHiO.js";import{P as ge}from"./play-CZjsr3XM.js";import{P as ae}from"./pause-DUn9L5PB.js";import{R as Ie}from"./refresh-cw-ENBVR8hW.js";import{S as Ee}from"./send-yz6HFZM5.js";import{R as fe}from"./rotate-cw-CDOlRtUR.js";import{C as X}from"./Chip-Dc2KmeWl.js";import{E as Ae}from"./ErrorState-DULZnttJ.js";import{I as ne}from"./Input-CZmRw5QX.js";import{E as Me}from"./EmptyState-D65J5FQN.js";import{N as Le}from"./network-DJdvVaHx.js";import{P as Oe}from"./plus-77h62zZm.js";import{T as Pe}from"./triangle-alert-tUTXbcEP.js";import"./Alert-B6DjfRFI.js";import"./circle-alert-HdHe7m8K.js";import"./circle-check-Cs-xoV7R.js";import"./refresh-ccw-DenGBOcq.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const Be=oe("ClipboardCopy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]);/**
7
- * @license lucide-react v0.460.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const Ne=oe("Octagon",[["path",{d:"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z",key:"2d38gg"}]]),De={idle:"Idle",busy:"Busy",error:"Error",paused:"Paused"},Fe={idle:"neutral",busy:"info",error:"danger",paused:"neutral"},Ue={idle:"var(--fg-subtle)",busy:"var(--info)",error:"var(--danger)",paused:"var(--warning)"};function He(t){if(typeof t!="number"||!Number.isFinite(t)||t<=0)return"—";const a=Math.max(0,Date.now()-t),r=Math.floor(a/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const c=Math.floor(n/60);return c<24?`${c}h ago`:`${Math.floor(c/24)}d ago`}function We(t){return t>=.8?"success":t>=.5?"warning":"danger"}function Je(t){return typeof t!="number"||!Number.isFinite(t)||t<=0?"neutral":(Date.now()-t)/864e5>1?"danger":"neutral"}function _e(t){const{name:a,role:r,status:n,lastActivity:c,currentTask:f,tasksToday:o,tasksSucceeded:w,tasksTotal:h,successRate:v,lastSeenMs:S,onOpen:R,badges:b,className:m}=t,u=typeof w=="number"&&typeof h=="number"||typeof v=="number"||typeof S=="number";return e.jsxs("button",{type:"button",onClick:R,className:ye("v8-agent-card",`v8-agent-card--${n}`,m),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)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[e.jsx(ie,{name:a,status:n==="busy"||n==="error"?"busy":n==="idle"?"online":"away"}),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:a}),e.jsx("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginTop:2},children:r})]}),e.jsx(L,{tone:Fe[n],dot:!0,children:De[n]})]}),f!==void 0&&e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",padding:"var(--space-2) var(--space-3)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},title:f,children:f}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[c!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(te,{size:12,"aria-hidden":"true",style:{color:Ue[n]}}),c]}),o!==void 0&&e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(Te,{size:12,"aria-hidden":"true"}),o," today"]})]}),u&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-2)"},children:[typeof w=="number"&&typeof h=="number"&&h>0&&e.jsxs("div",{"data-testid":"agent-card-tasks",style:{display:"flex",flexDirection:"column",gap:2},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[e.jsx("span",{style:{textTransform:"uppercase",letterSpacing:"0.04em"},children:"tasks"}),e.jsxs("code",{style:{fontFamily:"var(--font-mono)",color:"var(--fg)"},children:[w," / ",h]})]}),e.jsx(Re,{value:w,max:h,tone:"accent",height:4})]}),typeof v=="number"&&e.jsxs("div",{"data-testid":"agent-card-success",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:"success"}),e.jsxs(L,{"data-testid":"agent-card-success-badge",tone:We(v),children:[Math.round(v*100),"% success"]})]}),typeof S=="number"&&e.jsxs("div",{"data-testid":"agent-card-lastseen",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:"last seen"}),e.jsx(L,{"data-testid":"agent-card-lastseen-badge",tone:Je(S),children:He(S)})]})]}),b!==void 0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:b}),e.jsx("style",{children:`
12
- .v8-agent-card:hover { border-color: var(--accent); }
13
- `})]})}const ee=500;function Ke(t){const{sessionId:a,paused:r}=t,[n,c]=d.useState([]),[f,o]=d.useState("connecting"),[w,h]=d.useState(null),[v,S]=d.useState(!1),[R,b]=d.useState(!0),m=d.useRef(null),u=d.useRef(null);d.useEffect(()=>{if(r||v){u.current&&(u.current.close(),u.current=null),o("paused");return}if(typeof window>"u"||typeof EventSource>"u"){o("error"),h("EventSource not available in this environment.");return}o("connecting"),h(null);const i=`/api/agent-stream/live?sessionId=${encodeURIComponent(a)}`,p=new EventSource(i);u.current=p;const I=x=>{try{const C=JSON.parse(x.data);Array.isArray(C.events)&&c(C.events.slice(-ee)),o("live")}catch{}},O=x=>{try{const C=JSON.parse(x.data);c(B=>{const N=B.length>=ee?B.slice(B.length-ee+1):B.slice();return N.push(C),N}),o("live")}catch{}},T=x=>{try{const C=JSON.parse(x.data);o("closed"),h(C.reason?`Stream ended: ${C.reason}`:null)}catch{}},P=x=>{try{const C=JSON.parse(x.data);o("error"),h(C.error||"stream error")}catch{}};return p.addEventListener("snapshot",I),p.addEventListener("event",O),p.addEventListener("agent:event",O),p.addEventListener("end",T),p.addEventListener("error",P),p.onerror=()=>{o("error"),h("Connection dropped. Click Retry to reconnect.")},()=>{p.close(),u.current=null}},[a,r,v]),d.useEffect(()=>{if(!R||!m.current)return;const i=m.current;i.scrollTop=i.scrollHeight},[n,R]);const k=(i,p)=>{var P,x,C;const I=i.role==="user"?"user":i.role==="assistant"?"assistant":(P=i.tool)!=null&&P.name?"tool":"system",O=(x=i.tool)!=null&&x.name?`${i.tool.name}`:i.role?i.role:i.type||"event",T=typeof i.content=="string"?i.content:(C=i.tool)!=null&&C.input?JSON.stringify(i.tool.input).slice(0,240):typeof i.message=="string"?i.message:i.result?JSON.stringify(i.result).slice(0,240):JSON.stringify(i).slice(0,240);return e.jsxs("div",{style:{padding:"4px 8px",borderRadius:"var(--radius-sm)",background:I==="user"?"color-mix(in oklch, var(--accent) 8%, var(--surface-0))":I==="tool"?"color-mix(in oklch, var(--warning) 8%, var(--surface-0))":I==="system"?"var(--surface-1)":"var(--surface-0)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[e.jsxs("span",{style:{color:"var(--fg-muted)"},children:[O,": "]}),e.jsx("span",{style:{color:"var(--fg)"},children:T})]},p)};return e.jsxs(A,{gap:2,children:[e.jsxs($,{align:"center",justify:"between",children:[e.jsxs($,{align:"center",gap:2,children:[e.jsx("span",{"aria-hidden":!0,style:{width:8,height:8,borderRadius:"50%",background:f==="live"?"var(--success)":f==="connecting"?"var(--warning)":f==="paused"||f==="closed"?"var(--fg-muted)":"var(--danger)"}}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[f==="live"?"Live":f==="connecting"?"Connecting…":f==="paused"?"Paused":f==="closed"?"Closed":"Error"," · ",n.length," events"]})]}),e.jsxs($,{align:"center",gap:1,children:[e.jsx(E,{variant:"ghost",onClick:()=>S(i=>!i),title:v?"Resume stream":"Pause stream","aria-label":v?"Resume stream":"Pause stream",children:v?e.jsx(ge,{size:12,"aria-hidden":!0}):e.jsx(ae,{size:12,"aria-hidden":!0})}),e.jsx(E,{variant:"ghost",onClick:()=>c([]),title:"Clear buffer","aria-label":"Clear output",children:"Clear"}),e.jsxs(E,{variant:"ghost",onClick:()=>{c([]),S(!1)},title:"Reconnect","aria-label":"Reconnect stream",children:[e.jsx(Ie,{size:12,"aria-hidden":!0})," Retry"]}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--fs-12)",color:"var(--fg-muted)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:R,onChange:i=>b(i.target.checked)}),"follow"]})]})]}),w!==null&&e.jsx("div",{role:"alert",style:{fontSize:"var(--fs-12)",color:"var(--danger)"},children:w}),e.jsx("div",{ref:m,onScroll:i=>{const p=i.currentTarget,I=p.scrollHeight-p.scrollTop-p.clientHeight<20;b(I)},style:{maxHeight:280,minHeight:120,overflowY:"auto",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",padding:"var(--space-2)",display:"flex",flexDirection:"column",gap:4,background:"var(--surface-1)"},role:"log","aria-live":"polite","aria-label":"Agent live output",children:n.length===0?e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:f==="connecting"?"Connecting to agent stream…":"No events yet."}):n.map(k)})]})}function Ve(t){return t.startsWith("bizar:")?{source:"bizar",key:t.slice(6)}:t.startsWith("cc:")?{source:"claude-code",key:t.slice(3)}:{source:"bizar",key:t}}function Ge(t){const{agentId:a,name:r,role:n,status:c,currentTask:f,open:o,onOpenChange:w,startedAt:h,messageCount:v,lastMessageSnippet:S,successRate:R,tasksTotal:b}=t,{source:m,key:u}=Ve(a),[k,i]=d.useState(""),[p,I]=d.useState(null),[O,T]=d.useState(null),[P,x]=d.useState(null),[C,B]=d.useState(null),N=_(o?"/api/tasks":null),H=d.useMemo(()=>{var z;return o?(((z=N.data)==null?void 0:z.tasks)??[]).filter(F=>{const W=F.metadata??{};return typeof F.workedBy=="string"&&F.workedBy===u||W.agent===u}):[]},[o,N.data,u]);d.useEffect(()=>{o&&(i(""),T(null),x(null),B(null))},[o,a]);const D=async(j,z,F,W)=>{I(j),T(null),x(null);try{const M=await J(F,{method:z,body:W});if(M.ok){const G=M.sessionId?` (session ${M.sessionId.slice(0,8)})`:"";M.processId&&B(M.processId),T(`${j} succeeded${G}`)}else x(M.error||`${j} failed`)}catch(M){x(M instanceof Error?M.message:String(M))}finally{I(null)}},K=async()=>{if(!k.trim())return;const j=k.trim();i(""),m==="claude-code"?await D("Send prompt","POST",`/api/cc-agents/${encodeURIComponent(u)}/send`,{prompt:j}):await D("Invoke agent","POST",`/api/agents/${encodeURIComponent(u)}/invoke`,{prompt:j})},V=async()=>{if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Restart ${r}? The current session will be killed and a fresh one spawned.`)){if(m==="claude-code"){const z=k.trim()||"continue from the last checkpoint";await D("Restart","POST",`/api/cc-agents/${encodeURIComponent(u)}/restart`,{prompt:z});return}await D("Restart","POST",`/api/agents/${encodeURIComponent(u)}/restart`)}},Y=async()=>{if(m==="claude-code"){await D("Kill","POST",`/api/cc-agents/${encodeURIComponent(u)}/kill`);return}if(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Delete Bizar agent "${u}"? This is irreversible.`)){I("Kill"),T(null),x(null);try{await J(`/api/agents/${encodeURIComponent(u)}`,{method:"DELETE"}),T(`Killed ${r}`),w(!1)}catch(z){x(z instanceof Error?z.message:String(z))}finally{I(null)}}},Z=async()=>{try{await navigator.clipboard.writeText(u),T(`Copied "${u}"`)}catch{x("Clipboard unavailable")}};return e.jsx(le,{open:o,onOpenChange:w,children:e.jsx(de,{side:"right",title:r,children:e.jsxs(A,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs($,{gap:3,align:"center",children:[e.jsx(ie,{name:r,status:c==="busy"||c==="error"?"busy":"online"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",color:"var(--fg-muted)"},children:n}),e.jsxs($,{gap:2,style:{marginTop:4},wrap:!0,children:[e.jsx(L,{tone:c==="busy"?"info":c==="error"?"danger":"neutral",dot:!0,children:c}),e.jsx(L,{tone:"accent",children:m==="bizar"?"Bizar agent":"Claude Code"}),h!==void 0&&e.jsxs(L,{tone:"neutral",title:new Date(h).toLocaleString(),children:["up ",qe(Date.now()-h)]}),typeof v=="number"&&e.jsxs(L,{tone:"neutral",children:[v," msg"]}),typeof b=="number"&&e.jsxs(L,{tone:"neutral",children:[b," tasks"]}),typeof R=="number"&&e.jsxs(L,{tone:R>=.8?"success":R>=.5?"warning":"danger",children:[Math.round(R*100),"% success"]})]})]})]}),typeof S=="string"&&S.length>0&&e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",background:"var(--surface-1)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontStyle:"italic"},title:S,children:["“",S.length>240?`${S.slice(0,240)}…`:S,"”"]}),f!==void 0&&e.jsxs("div",{style:{padding:"var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-13)"},children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",marginBottom:4},children:[e.jsx(te,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Current task"]}),f]}),e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:`agent-prompt-${a}`,style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Send a prompt"}),e.jsx($e,{id:`agent-prompt-${a}`,value:k,onChange:j=>i(j.target.value),placeholder:m==="claude-code"?"Type a follow-up for this background agent…":"Invoke this Bizar agent with…",rows:3,disabled:p!==null}),e.jsxs($,{gap:2,children:[e.jsxs(E,{variant:"primary",onClick:()=>{K()},disabled:!k.trim()||p!==null,children:[e.jsx(Ee,{size:14,"aria-hidden":!0})," ",p==="Send prompt"||p==="Invoke agent"?e.jsx(U,{style:{width:60,height:14}}):"Send"]}),e.jsxs(E,{variant:"secondary",onClick:()=>{V()},disabled:p!==null||m==="claude-code",title:m==="claude-code"?"Use command palette to spawn a fresh agent":void 0,children:[e.jsx(fe,{size:14,"aria-hidden":!0})," Restart"]}),e.jsxs(E,{variant:"danger",onClick:()=>{Y()},disabled:p!==null,title:m==="claude-code"?"Kill the CC background session":`Delete Bizar agent "${u}"`,children:[e.jsx(Ne,{size:14,"aria-hidden":!0})," Kill"]}),e.jsxs(E,{variant:"ghost",onClick:()=>{Z()},children:[e.jsx(Be,{size:14,"aria-hidden":!0})," Copy id"]})]})]}),O!==null&&e.jsx("div",{role:"status",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--success) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--success) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--success)"},children:O}),C!==null&&e.jsxs("div",{style:{padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--fg-muted)",display:"flex",alignItems:"center",gap:"var(--space-2)"},children:[e.jsx("span",{style:{textTransform:"uppercase",letterSpacing:"0.04em"},children:"PID"}),e.jsx("code",{"data-testid":"agent-process-id",style:{fontFamily:"var(--font-mono)",color:"var(--fg)",background:"var(--surface-1)",padding:"2px 6px",borderRadius:"var(--radius-sm)"},children:C})]}),P!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2) var(--space-3)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid color-mix(in oklch, var(--danger) 40%, var(--border))",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:P}),e.jsxs(A,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:["Assigned tasks (",H.length,")"]}),N.loading&&H.length===0?e.jsx(U,{style:{height:48}}):H.length===0?e.jsx(ce,{variant:"outlined",children:e.jsx(ue,{children:e.jsx("span",{"data-testid":"agent-tasks-empty",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"No tasks assigned to this agent."})})}):e.jsx(A,{gap:1,children:H.map(j=>e.jsxs("div",{"data-testid":`agent-tasks-${j.id}`,style:{display:"flex",alignItems:"center",gap:"var(--space-2)",padding:"var(--space-2) var(--space-3)",background:"var(--surface-0)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-13)"},children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:j.id}),e.jsx("span",{style:{flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:j.title}),e.jsx(L,{tone:j.status==="doing"?"info":j.status==="blocked"?"danger":"neutral",children:j.status??"queued"})]},j.id))})]}),m==="claude-code"&&e.jsxs(A,{gap:2,children:[e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",textTransform:"uppercase",letterSpacing:"0.04em"},children:[e.jsx(te,{size:12,"aria-hidden":!0,style:{verticalAlign:"middle",marginRight:4}}),"Live output"]}),e.jsx(Ke,{sessionId:u,paused:p==="Kill"})]})]})})})}function qe(t){if(!Number.isFinite(t)||t<0)return"—";const a=Math.floor(t/1e3);if(a<60)return`${a}s`;const r=Math.floor(a/60);if(r<60)return`${r}m ${a%60}s`;const n=Math.floor(r/60);return n<24?`${n}h ${r%60}m`:`${Math.floor(n/24)}d ${n%24}h`}function Ye(t){const a=(t||"").toLowerCase();return a==="busy"||a==="working"?"info":a==="idle"?"neutral":a==="error"||a==="stuck"?"danger":a==="paused"?"warning":"neutral"}function Ze(t){const a=(t||"").toLowerCase();return a==="working"?"working":a||"idle"}function Qe(t){if(typeof t!="number"||!Number.isFinite(t)||t<=0)return"—";const a=Math.max(0,Date.now()-t),r=Math.floor(a/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const c=Math.floor(n/60);return c<24?`${c}h ago`:`${Math.floor(c/24)}d ago`}function pe({node:t,depth:a,expanded:r,onToggle:n}){const c=t.children.length>0,f=r.has(t.name),o=t.agent,w=Ye(o==null?void 0:o.status),h=Ze(o==null?void 0:o.status);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{"data-testid":`agent-hierarchy-node-${t.name}`,style:{display:"grid",gridTemplateColumns:"auto 1fr auto auto",alignItems:"center",gap:"var(--space-3)",padding:"var(--space-2) var(--space-3)",paddingLeft:`calc(var(--space-3) + ${a*24}px)`,border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-1)"},children:[c?e.jsx("button",{type:"button","data-testid":`agent-hierarchy-toggle-${t.name}`,"aria-label":f?"Collapse":"Expand",onClick:()=>n(t.name),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:22,height:22,borderRadius:"var(--radius-sm)",border:"1px solid var(--border)",background:"var(--surface-0)",color:"var(--fg-muted)",cursor:"pointer",padding:0},children:f?e.jsx(xe,{size:12,"aria-hidden":!0}):e.jsx(Se,{size:12,"aria-hidden":!0})}):e.jsx("span",{"aria-hidden":!0,style:{width:22,height:22,display:"inline-flex",alignItems:"center",justifyContent:"center",color:"var(--fg-subtle)"},children:e.jsx(Ce,{size:12})}),e.jsxs("div",{style:{minWidth:0},children:[e.jsx("div",{style:{fontSize:"var(--fs-13)",fontWeight:600,color:"var(--fg)"},children:t.name}),o&&e.jsxs("div",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[o.role||o.category||o.mode||"agent",o.parent&&o.parent!==t.name&&e.jsxs(e.Fragment,{children:[" · parent ",e.jsx("code",{style:{fontFamily:"var(--font-mono)"},children:o.parent})]})]})]}),typeof(o==null?void 0:o.lastSeen)=="number"&&o.lastSeen>0&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:Qe(o.lastSeen)}),e.jsx(L,{tone:w,dot:!0,children:h})]}),c&&f&&t.children.map(v=>e.jsx(pe,{node:v,depth:a+1,expanded:r,onToggle:n},v.name))]})}function Xe(){var v,S,R;const t=_("/api/agents/hierarchy"),[a,r]=d.useState(()=>new Set),[n,c]=d.useState(()=>new Set),f=d.useMemo(()=>{var b,m;return((m=(b=t.data)==null?void 0:b.roots)==null?void 0:m.map(u=>u.name))??[]},[t.data]);n.size===0&&f.length>0&&(c(new Set(f)),r(new Set(f)));const o=d.useCallback(()=>t.refetch(),[t]);se("agents:change",o);const w=d.useCallback(b=>{r(m=>{const u=new Set(m);return u.has(b)?u.delete(b):u.add(b),u})},[]);if(t.loading&&!t.data)return e.jsxs(A,{gap:3,children:[e.jsx(U,{style:{height:48}}),e.jsx(U,{style:{height:48}}),e.jsx(U,{style:{height:48}})]});const h=((v=t.data)==null?void 0:v.roots)??[];return h.length===0?e.jsx(ce,{children:e.jsx(ue,{children:e.jsx(Me,{icon:e.jsx(Le,{size:32,"aria-hidden":!0}),title:"No hierarchy yet",description:"Agents have no parent links in their frontmatter. Add `parent:` to an agent's .md frontmatter to nest it beneath another agent.","data-testid":"agent-hierarchy-empty"})})}):e.jsxs(A,{gap:2,children:[e.jsx($,{align:"center",justify:"between",children:e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[h.length," root agent",h.length===1?"":"s"," · ",((R=(S=t.data)==null?void 0:S.all)==null?void 0:R.length)??0," total"]})}),e.jsx(A,{gap:2,children:h.map(b=>e.jsx(pe,{node:b,depth:0,expanded:a,onToggle:w},b.name))})]})}const he="bizar.agents.sourceFilter",me={all:"All",bizar:"Bizar","claude-code":"Claude Code"},et=Object.keys(me);function tt(){if(typeof localStorage>"u")return"all";const t=localStorage.getItem(he);return et.includes(t)?t:"all"}function st(t){if(!Number.isFinite(t)||t<=0)return"—";const a=Math.max(0,Date.now()-t),r=Math.floor(a/1e3);if(r<60)return`${r}s ago`;const n=Math.floor(r/60);if(n<60)return`${n}m ago`;const c=Math.floor(n/60);return c<24?`${c}h ago`:`${Math.floor(c/24)}d ago`}function at(t){const a=(t.status||"idle").toLowerCase(),r=a==="busy"||a==="working"?"busy":a==="error"||a==="stuck"?"error":a==="paused"?"paused":"idle";return{id:`bizar:${t.name}`,name:t.name,role:t.role||t.category||t.mode||"agent",status:r,currentTask:t.currentTaskId?`Task ${t.currentTaskId}`:void 0,lastActivity:t.lastSeen?new Date(t.lastSeen).toLocaleTimeString():void 0,tasksToday:t.tasksTotal||0,tasksSucceeded:typeof t.tasksSucceeded=="number"?t.tasksSucceeded:void 0,tasksTotal:typeof t.tasksTotal=="number"?t.tasksTotal:void 0,successRate:typeof t.successRate=="number"?t.successRate:void 0,lastSeenMs:typeof t.lastSeen=="number"&&t.lastSeen>0?t.lastSeen:void 0,badges:t.tags||[]}}function rt(t){var n,c;const a=(t.status||t.state||"idle").toLowerCase(),r=a==="busy"||a==="working"?"busy":a==="error"?"error":a==="paused"?"paused":"idle";return{id:`cc:${t.sessionId||t.id}`,name:t.name||((n=t.sessionId)==null?void 0:n.slice(0,8))||"unknown",role:t.kind==="background"?"CC background":"CC interactive",status:r,currentTask:t.lastMessageSnippet||void 0,lastActivity:t.lastMessageAt?new Date(t.lastMessageAt).toLocaleTimeString():t.startedAt?new Date(t.startedAt).toLocaleTimeString():void 0,tasksToday:t.messageCount||0,badges:[((c=t.cwd)==null?void 0:c.split("/").slice(-2).join("/"))||""].filter(Boolean)}}function At(){var F,W,M,G;const t=_("/api/agents"),a=_("/api/cc-agents"),r=_("/api/agents/stuck"),[n,c]=d.useState(tt),[f,o]=d.useState("roster");d.useEffect(()=>{typeof localStorage<"u"&&localStorage.setItem(he,n)},[n]);const[w,h]=d.useState([]),[v,S]=d.useState([]),[R,b]=d.useState(!1),[m,u]=d.useState(null),[k,i]=d.useState(null),[p,I]=d.useState(!1),[O,T]=d.useState(null),[P,x]=d.useState(()=>new Set),C=async()=>{if(!(k===null||!k.name.trim())){I(!0),T(null);try{await J("/api/agents",{method:"POST",body:{name:k.name.trim(),role:k.role.trim()||"agent"}}),i(null),t.refetch()}catch(s){T((s instanceof q,s.message))}finally{I(!1)}}},B=async s=>{x(l=>new Set(l).add(s));try{await J(`/api/agents/${encodeURIComponent(s)}/restart`,{method:"POST"}),r.refetch(),t.refetch()}catch(l){T((l instanceof q,l.message))}finally{x(l=>{const g=new Set(l);return g.delete(s),g})}},[N,H]=d.useState(()=>new Set),D=async(s,l)=>{H(g=>new Set(g).add(s));try{await J(`/api/agents/${encodeURIComponent(s)}/status`,{method:"POST",body:{status:l}}),r.refetch(),t.refetch()}catch(g){T((g instanceof q,g.message))}finally{H(g=>{const y=new Set(g);return y.delete(s),y})}},[K,V]=d.useState(!1),Y=async()=>{var l;const s=((l=r.data)==null?void 0:l.stuck)??[];if(s.length!==0){V(!0);try{await Promise.all(s.map(g=>J(`/api/agents/${encodeURIComponent(g.name)}/status`,{method:"POST",body:{status:"paused"}}).catch(y=>(T((y instanceof q,y.message)),null)))),r.refetch(),t.refetch()}finally{V(!1)}}};d.useEffect(()=>{var s,l;!R&&((s=t.data)==null?void 0:s.agents)!==void 0&&((l=a.data)==null?void 0:l.agents)!==void 0&&(b(!0),h(t.data.agents),S(a.data.agents))},[t.data,a.data,R]);const Z=d.useCallback(()=>{t.refetch(),a.refetch()},[t,a]);se("agents:change",Z);const j=d.useCallback(s=>{if(s.type!=="agent:status")return;const l=s.agent;!l||!l.name||h(g=>{const y=g.findIndex(ve=>ve.name===l.name);if(y===-1)return[...g,l];const Q=g.slice();return Q[y]={...Q[y],...l},Q})},[]);se("agent:status",j);const z=d.useMemo(()=>{const s=[];if(n!=="claude-code")for(const l of w)s.push({...at(l),source:"bizar"});if(n!=="bizar")for(const l of v)s.push({...rt(l),source:"claude-code"});return s},[w,v,n]);return e.jsxs(A,{gap:5,"data-testid":"agents-view",children:[e.jsx(ke,{title:"Agents",description:"Bizar agents (frontmatter-driven) and Claude Code background agents.",actions:e.jsxs(E,{variant:"primary",onClick:()=>i({name:"",role:""}),"data-testid":"agent-create-open",children:[e.jsx(Oe,{size:14,"aria-hidden":!0})," New agent"]})}),e.jsx(we,{title:"Roster",count:z.length,description:(F=r.data)!=null&&F.stuck&&r.data.stuck.length>0?`${r.data.stuck.length} stuck`:void 0,testid:"agents-list-header"}),(((W=r.data)==null?void 0:W.stuck)??[]).length>0&&e.jsx(ze,{tone:"warning","data-testid":"agents-stuck-banner",action:e.jsxs($,{gap:2,children:[e.jsxs(E,{variant:"secondary",size:"sm",onClick:()=>{Y()},disabled:K,"data-testid":"agents-stuck-bulk-pause",title:"Pause every stuck agent at once",children:[e.jsx(ae,{size:12,"aria-hidden":!0})," ",K?"Pausing…":"Pause all"]}),e.jsx(E,{variant:"secondary",size:"sm",onClick:()=>o("hierarchy"),children:"View details"})]}),children:e.jsxs(A,{gap:2,children:[e.jsxs($,{align:"center",gap:2,children:[e.jsx(Pe,{size:14,"aria-hidden":!0,style:{color:"var(--warning)"}}),e.jsxs("span",{children:[(((M=r.data)==null?void 0:M.stuck)??[]).length," agent",r.data&&r.data.stuck&&r.data.stuck.length===1?"":"s"," stuck (no heartbeat >5m)"]})]}),e.jsx(A,{gap:1,children:(((G=r.data)==null?void 0:G.stuck)??[]).map(s=>{const l=P.has(s.name),g=s.status==="paused",y=l||N.has(s.name);return e.jsxs($,{align:"center",justify:"between",gap:2,"data-testid":`agents-stuck-row-${s.name}`,children:[e.jsxs($,{gap:2,align:"center",children:[e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:s.name}),e.jsx(L,{tone:g?"warning":"danger",children:g?"paused":s.status||"stuck"}),typeof s.lastSeen=="number"&&s.lastSeen>0&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["last seen ",st(s.lastSeen)]})]}),e.jsxs($,{gap:1,children:[g?e.jsxs(E,{variant:"ghost",size:"sm",disabled:y,onClick:()=>{D(s.name,"idle")},"data-testid":`agents-stuck-resume-${s.name}`,children:[e.jsx(ge,{size:12,"aria-hidden":!0})," Resume"]}):e.jsxs(E,{variant:"secondary",size:"sm",disabled:y,onClick:()=>{D(s.name,"paused")},"data-testid":`agents-stuck-pause-${s.name}`,children:[e.jsx(ae,{size:12,"aria-hidden":!0})," Pause"]}),e.jsxs(E,{variant:"primary",size:"sm",disabled:y,onClick:()=>{B(s.name)},"data-testid":`agents-stuck-restart-${s.name}`,children:[e.jsx(fe,{size:12,"aria-hidden":!0})," ",l?"Restarting…":"Restart"]})]})]},s.name)})})]})}),e.jsxs($,{align:"center",justify:"between",wrap:!0,gap:2,children:[e.jsx($,{gap:2,children:["all","bizar","claude-code"].map(s=>e.jsxs(X,{selected:n===s,onClick:()=>c(s),children:[s==="bizar"?e.jsx(je,{size:12,"aria-hidden":!0}):s==="claude-code"?e.jsx(be,{size:12,"aria-hidden":!0}):null," ",me[s]]},s))}),e.jsxs($,{gap:2,children:[e.jsx(X,{"data-testid":"agents-mode-roster",selected:f==="roster",onClick:()=>o("roster"),children:"Roster"}),e.jsx(X,{"data-testid":"agents-mode-hierarchy",selected:f==="hierarchy",onClick:()=>o("hierarchy"),children:"Hierarchy"})]})]}),f==="hierarchy"?e.jsx(Xe,{}):z.length===0&&(t.loading||a.loading)?e.jsxs(re,{cols:3,children:[e.jsx(U,{style:{height:140}}),e.jsx(U,{style:{height:140}}),e.jsx(U,{style:{height:140}})]}):z.length===0&&(t.error||a.error)?e.jsx(Ae,{block:!0,title:"Couldn't load agents",description:"Both bizar and CC roster endpoints failed. Retry to refetch.",error:t.error??a.error,onRetry:()=>{t.refetch(),a.refetch()},testid:"agents-error"}):z.length===0?e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["No agents yet. Run ",e.jsx("code",{children:"/loop"})," or spawn one via the command palette."]}):e.jsx(re,{cols:3,children:z.map(s=>e.jsx(_e,{...s,onOpen:()=>u(s.id)},s.id))}),m!==null&&(()=>{const s=z.find(y=>y.id===m);if(!s)return null;const l=s.source==="claude-code"?v.find(y=>s.id===`cc:${y.sessionId||y.id}`):void 0,g=s.source==="bizar"?w.find(y=>s.id===`bizar:${y.name}`):void 0;return e.jsx(Ge,{agentId:s.id,name:s.name,role:s.role,status:s.status,currentTask:s.currentTask,startedAt:(l==null?void 0:l.startedAt)??(g==null?void 0:g.lastSeen),messageCount:l==null?void 0:l.messageCount,lastMessageSnippet:l==null?void 0:l.lastMessageSnippet,successRate:g==null?void 0:g.successRate,tasksTotal:g==null?void 0:g.tasksTotal,open:m!==null,onOpenChange:y=>{y||u(null)}})})(),e.jsx(le,{open:k!==null,onOpenChange:s=>{s||i(null)},children:e.jsx(de,{side:"right",title:"New agent",children:k!==null&&e.jsxs(A,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:"agent-create-name",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Name"}),e.jsx(ne,{id:"agent-create-name",value:k.name,onChange:s=>i({...k,name:s.target.value}),placeholder:"e.g. frigg",disabled:p,"data-testid":"agent-create-name"})]}),e.jsxs(A,{gap:2,children:[e.jsx("label",{htmlFor:"agent-create-role",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Role (optional)"}),e.jsx(ne,{id:"agent-create-role",value:k.role,onChange:s=>i({...k,role:s.target.value}),placeholder:"e.g. code-review",disabled:p,"data-testid":"agent-create-role"})]}),O!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:O}),e.jsxs($,{gap:2,children:[e.jsx(E,{variant:"primary",onClick:()=>{C()},disabled:p||!k.name.trim(),"data-testid":"agent-create-submit",children:"Create agent"}),e.jsx(E,{variant:"ghost",onClick:()=>i(null),disabled:p,children:"Cancel"})]})]})})})]})}export{At as AgentsView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentsView-Du-G_skK.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/clipboard-copy.js","../../../node_modules/lucide-react/dist/esm/icons/octagon.js","../../src/web/v8/ui/agents/AgentCard.tsx","../../src/web/v8/ui/agents/AgentLiveOutput.tsx","../../src/web/v8/ui/agents/AgentDetail.tsx","../../src/web/v8/views/Agents/AgentHierarchy.tsx","../../src/web/v8/views/Agents/AgentsView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ClipboardCopy = createLucideIcon(\"ClipboardCopy\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\"path\", { d: \"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\", key: \"4jdomd\" }],\n [\"path\", { d: \"M16 4h2a2 2 0 0 1 2 2v4\", key: \"3hqy98\" }],\n [\"path\", { d: \"M21 14H11\", key: \"1bme5i\" }],\n [\"path\", { d: \"m15 10-4 4 4 4\", key: \"5dvupr\" }]\n]);\n\nexport { ClipboardCopy as default };\n//# sourceMappingURL=clipboard-copy.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Octagon = createLucideIcon(\"Octagon\", [\n [\n \"path\",\n {\n d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\",\n key: \"2d38gg\"\n }\n ]\n]);\n\nexport { Octagon as default };\n//# sourceMappingURL=octagon.js.map\n","import { type ReactNode } from 'react';\nimport { Activity, Zap } from 'lucide-react';\nimport { cx } from '../utils/cx.js';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { ProgressBar } from '../data/ProgressBar.js';\n\n/**\n * AgentCard — agent tile for the Agents roster.\n *\n * Per PLAN.md, agents are the orchestrator's running entities. Each card\n * shows: name, status (idle/busy/error), role, last activity, and a\n * three-row metrics strip (tasks succeeded/total, success rate, lastSeen).\n *\n * v9.4.0 S45 — replaced the dead single-point sparkline (line 140\n * guarded `tpmHistory.length > 1`, never true) with a data-driven\n * metric strip that always renders when the fields are supplied.\n */\n\nexport type AgentStatus = 'idle' | 'busy' | 'error' | 'paused';\n\nexport interface AgentCardProps {\n id: string;\n name: string;\n role: string;\n status: AgentStatus;\n /** Last activity label (\"2m ago\", \"Just now\"). */\n lastActivity?: string;\n /** Current task the agent is working on. */\n currentTask?: string;\n /** Number of tasks completed in the last 24h. */\n tasksToday?: number;\n /** Tasks succeeded (numerator of the ProgressBar). */\n tasksSucceeded?: number;\n /** Tasks total (denominator of the ProgressBar). */\n tasksTotal?: number;\n /** Success rate as 0..1. Tones the badge: >=0.8 success, >=0.5 warning, else danger. */\n successRate?: number;\n /** Last-seen timestamp in ms-since-epoch. Rendered as relative duration. */\n lastSeenMs?: number;\n /** Click handler — opens agent detail. */\n onOpen?: () => void;\n /** Custom badges row (model, owner). */\n badges?: ReactNode;\n className?: string;\n}\n\nconst STATUS_LABEL: Record<AgentStatus, string> = {\n idle: 'Idle',\n busy: 'Busy',\n error: 'Error',\n paused: 'Paused',\n};\n\nconst STATUS_TONE: Record<AgentStatus, 'success' | 'info' | 'danger' | 'neutral'> = {\n idle: 'neutral',\n busy: 'info',\n error: 'danger',\n paused: 'neutral',\n};\n\nconst STATUS_FG: Record<AgentStatus, string> = {\n idle: 'var(--fg-subtle)',\n busy: 'var(--info)',\n error: 'var(--danger)',\n paused: 'var(--warning)',\n};\n\n/** relativeTime — \"12s\", \"3m\", \"2h\", \"5d\". Returns \"—\" for missing / future timestamps. */\nfunction relativeTime(ms: number | undefined): string {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.floor(hr / 24);\n return `${day}d ago`;\n}\n\nfunction successTone(rate: number): 'success' | 'warning' | 'danger' {\n if (rate >= 0.8) return 'success';\n if (rate >= 0.5) return 'warning';\n return 'danger';\n}\n\nfunction lastSeenTone(ms: number | undefined): 'neutral' | 'danger' {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return 'neutral';\n const days = (Date.now() - ms) / 86_400_000;\n return days > 1 ? 'danger' : 'neutral';\n}\n\nexport function AgentCard(props: AgentCardProps): JSX.Element {\n const {\n name,\n role,\n status,\n lastActivity,\n currentTask,\n tasksToday,\n tasksSucceeded,\n tasksTotal,\n successRate,\n lastSeenMs,\n onOpen,\n badges,\n className,\n } = props;\n\n const showMetrics =\n (typeof tasksSucceeded === 'number' && typeof tasksTotal === 'number') ||\n typeof successRate === 'number' ||\n typeof lastSeenMs === 'number';\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cx('v8-agent-card', `v8-agent-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)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)' }}>\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : status === 'idle' ? 'online' : 'away'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-14)', fontWeight: 600, color: 'var(--fg)', lineHeight: 'var(--lh-snug)' }}>\n {name}\n </div>\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginTop: 2 }}>\n {role}\n </div>\n </div>\n <Badge tone={STATUS_TONE[status]} dot>\n {STATUS_LABEL[status]}\n </Badge>\n </div>\n {currentTask !== undefined && (\n <div\n style={{\n fontSize: 'var(--fs-13)',\n color: 'var(--fg)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n padding: 'var(--space-2) var(--space-3)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={currentTask}\n >\n {currentTask}\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {lastActivity !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Activity size={12} aria-hidden=\"true\" style={{ color: STATUS_FG[status] }} />\n {lastActivity}\n </span>\n )}\n {tasksToday !== undefined && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <Zap size={12} aria-hidden=\"true\" />\n {tasksToday} today\n </span>\n )}\n </div>\n {showMetrics && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-2)' }}>\n {typeof tasksSucceeded === 'number' && typeof tasksTotal === 'number' && tasksTotal > 0 && (\n <div data-testid=\"agent-card-tasks\" style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n }}\n >\n <span style={{ textTransform: 'uppercase', letterSpacing: '0.04em' }}>tasks</span>\n <code style={{ fontFamily: 'var(--font-mono)', color: 'var(--fg)' }}>\n {tasksSucceeded} / {tasksTotal}\n </code>\n </div>\n <ProgressBar value={tasksSucceeded} max={tasksTotal} tone=\"accent\" height={4} />\n </div>\n )}\n {typeof successRate === 'number' && (\n <div\n data-testid=\"agent-card-success\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}\n >\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n success\n </span>\n <Badge data-testid=\"agent-card-success-badge\" tone={successTone(successRate)}>\n {Math.round(successRate * 100)}% success\n </Badge>\n </div>\n )}\n {typeof lastSeenMs === 'number' && (\n <div\n data-testid=\"agent-card-lastseen\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}\n >\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n last seen\n </span>\n <Badge data-testid=\"agent-card-lastseen-badge\" tone={lastSeenTone(lastSeenMs)}>{relativeTime(lastSeenMs)}</Badge>\n </div>\n )}\n </div>\n )}\n {badges !== undefined && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>{badges}</div>\n )}\n <style>{`\n .v8-agent-card:hover { border-color: var(--accent); }\n `}</style>\n </button>\n );\n}","import { useEffect, useRef, useState } from 'react';\nimport { Pause, Play, RefreshCw } from 'lucide-react';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Button } from '../controls/Button.js';\n\n/**\n * AgentLiveOutput — Sprint S17. Live SSE tail of a CC agent's session\n * JSONL. Subscribes to `/api/agent-stream/live?sessionId=...` and\n * appends events as they arrive. Pause freezes the buffer (connection\n * stays open). Clear wipes the buffer.\n */\n\ninterface StreamEvent {\n type?: string;\n role?: string;\n content?: string;\n name?: string;\n input?: unknown;\n tool?: { name?: string; input?: unknown };\n result?: unknown;\n ts?: number;\n message?: string;\n}\n\nexport interface AgentLiveOutputProps {\n sessionId: string;\n /** When true the parent wants us to stop connecting (e.g. agent was killed). */\n paused?: boolean;\n}\n\nconst MAX_EVENTS = 500;\n\nexport function AgentLiveOutput(props: AgentLiveOutputProps): JSX.Element {\n const { sessionId, paused } = props;\n const [events, setEvents] = useState<StreamEvent[]>([]);\n const [status, setStatus] = useState<'connecting' | 'live' | 'paused' | 'error' | 'closed'>('connecting');\n const [error, setError] = useState<string | null>(null);\n const [pausedLocal, setPausedLocal] = useState<boolean>(false);\n const [autoScroll, setAutoScroll] = useState<boolean>(true);\n const containerRef = useRef<HTMLDivElement>(null);\n const sourceRef = useRef<EventSource | null>(null);\n\n useEffect(() => {\n if (paused || pausedLocal) {\n if (sourceRef.current) {\n sourceRef.current.close();\n sourceRef.current = null;\n }\n setStatus('paused');\n return;\n }\n if (typeof window === 'undefined' || typeof EventSource === 'undefined') {\n setStatus('error');\n setError('EventSource not available in this environment.');\n return;\n }\n setStatus('connecting');\n setError(null);\n const url = `/api/agent-stream/live?sessionId=${encodeURIComponent(sessionId)}`;\n const src = new EventSource(url);\n sourceRef.current = src;\n\n const onSnapshot = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { events?: StreamEvent[] };\n if (Array.isArray(data.events)) setEvents(data.events.slice(-MAX_EVENTS));\n setStatus('live');\n } catch { /* malformed */ }\n };\n const onEvent = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as StreamEvent;\n setEvents((prev) => {\n const next = prev.length >= MAX_EVENTS ? prev.slice(prev.length - MAX_EVENTS + 1) : prev.slice();\n next.push(data);\n return next;\n });\n setStatus('live');\n } catch { /* malformed */ }\n };\n const onEnd = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { reason?: string };\n setStatus('closed');\n setError(data.reason ? `Stream ended: ${data.reason}` : null);\n } catch { /* */ }\n };\n const onErrEv = (ev: MessageEvent): void => {\n try {\n const data = JSON.parse(ev.data) as { error?: string };\n setStatus('error');\n setError(data.error || 'stream error');\n } catch { /* */ }\n };\n src.addEventListener('snapshot', onSnapshot);\n src.addEventListener('event', onEvent);\n src.addEventListener('agent:event', onEvent);\n src.addEventListener('end', onEnd);\n src.addEventListener('error', onErrEv);\n src.onerror = () => {\n setStatus('error');\n setError('Connection dropped. Click Retry to reconnect.');\n };\n return () => {\n src.close();\n sourceRef.current = null;\n };\n }, [sessionId, paused, pausedLocal]);\n\n useEffect(() => {\n if (!autoScroll || !containerRef.current) return;\n const el = containerRef.current;\n el.scrollTop = el.scrollHeight;\n }, [events, autoScroll]);\n\n const renderEvent = (ev: StreamEvent, idx: number): JSX.Element => {\n const tone =\n ev.role === 'user' ? 'user' :\n ev.role === 'assistant' ? 'assistant' :\n ev.tool?.name ? 'tool' :\n 'system';\n const label =\n ev.tool?.name ? `${ev.tool.name}` :\n ev.role ? ev.role : (ev.type || 'event');\n const text =\n typeof ev.content === 'string' ? ev.content :\n ev.tool?.input ? JSON.stringify(ev.tool.input).slice(0, 240) :\n typeof ev.message === 'string' ? ev.message :\n ev.result ? JSON.stringify(ev.result).slice(0, 240) :\n JSON.stringify(ev).slice(0, 240);\n return (\n <div\n key={idx}\n style={{\n padding: '4px 8px',\n borderRadius: 'var(--radius-sm)',\n background:\n tone === 'user' ? 'color-mix(in oklch, var(--accent) 8%, var(--surface-0))' :\n tone === 'tool' ? 'color-mix(in oklch, var(--warning) 8%, var(--surface-0))' :\n tone === 'system' ? 'var(--surface-1)' :\n 'var(--surface-0)',\n fontFamily: 'var(--font-mono)',\n fontSize: 'var(--fs-12)',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n <span style={{ color: 'var(--fg-muted)' }}>{label}: </span>\n <span style={{ color: 'var(--fg)' }}>{text}</span>\n </div>\n );\n };\n\n return (\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <Inline align=\"center\" gap={2}>\n <span\n aria-hidden\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background:\n status === 'live' ? 'var(--success)' :\n status === 'connecting' ? 'var(--warning)' :\n status === 'paused' ? 'var(--fg-muted)' :\n status === 'closed' ? 'var(--fg-muted)' :\n 'var(--danger)',\n }}\n />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status === 'live' ? 'Live' :\n status === 'connecting' ? 'Connecting…' :\n status === 'paused' ? 'Paused' :\n status === 'closed' ? 'Closed' :\n 'Error'}\n {' · '}{events.length} events\n </span>\n </Inline>\n <Inline align=\"center\" gap={1}>\n <Button\n variant=\"ghost\"\n onClick={() => setPausedLocal((p) => !p)}\n title={pausedLocal ? 'Resume stream' : 'Pause stream'}\n aria-label={pausedLocal ? 'Resume stream' : 'Pause stream'}\n >\n {pausedLocal ? <Play size={12} aria-hidden /> : <Pause size={12} aria-hidden />}\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setEvents([])}\n title=\"Clear buffer\"\n aria-label=\"Clear output\"\n >\n Clear\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => {\n setEvents([]);\n setPausedLocal(false);\n }}\n title=\"Reconnect\"\n aria-label=\"Reconnect stream\"\n >\n <RefreshCw size={12} aria-hidden /> Retry\n </Button>\n <label style={{ display: 'flex', alignItems: 'center', gap: 4, fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', cursor: 'pointer' }}>\n <input type=\"checkbox\" checked={autoScroll} onChange={(e) => setAutoScroll(e.target.checked)} />\n follow\n </label>\n </Inline>\n </Inline>\n {error !== null && (\n <div role=\"alert\" style={{ fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>{error}</div>\n )}\n <div\n ref={containerRef}\n onScroll={(e) => {\n const el = e.currentTarget;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 20;\n setAutoScroll(atBottom);\n }}\n style={{\n maxHeight: 280,\n minHeight: 120,\n overflowY: 'auto',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n background: 'var(--surface-1)',\n }}\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Agent live output\"\n >\n {events.length === 0 ? (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {status === 'connecting' ? 'Connecting to agent stream…' : 'No events yet.'}\n </span>\n ) : (\n events.map(renderEvent)\n )}\n </div>\n </Stack>\n );\n}","import { useEffect, useMemo, useState } from 'react';\nimport { Send, RotateCw, Octagon, ClipboardCopy, Activity as ActivityIcon } from 'lucide-react';\nimport { Avatar } from '../data/Avatar.js';\nimport { Badge } from '../data/Badge.js';\nimport { Button } from '../controls/Button.js';\nimport { Sheet, SheetContent } from '../feedback/Sheet.js';\nimport { Stack } from '../primitives/Stack.js';\nimport { Inline } from '../primitives/Inline.js';\nimport { Textarea } from '../controls/Textarea.js';\nimport { Skeleton } from '../feedback/Skeleton.js';\nimport { Card, CardBody } from '../data/Card.js';\nimport { AgentStreamPanel } from './AgentStreamPanel.js';\nimport { AgentLiveOutput } from './AgentLiveOutput.js';\nimport { fetchJson } from '../../data/fetcher.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport type { Task } from '../../data/types.js';\n\n/**\n * AgentDetail — Sprint S11. Right-side Drawer with live agent\n * detail and the control plane (Send prompt / Restart / Kill).\n *\n * Two flavors per `source`:\n * - `bizar:<name>` — hits `/api/agents/:name/invoke` and `/restart`.\n * - `cc:<sessionId>` — hits `/api/cc-agents/:id/send` and `/kill`.\n */\n\nexport type AgentSource = 'bizar' | 'claude-code';\n\nexport interface AgentDetailProps {\n /** Composite id from AgentsView (`bizar:<name>` or `cc:<sessionId>`). */\n agentId: string;\n name: string;\n role: string;\n status: 'idle' | 'busy' | 'error' | 'paused';\n currentTask?: string;\n startedAt?: number;\n messageCount?: number;\n lastMessageSnippet?: string;\n successRate?: number;\n tasksTotal?: number;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nfunction parseId(agentId: string): { source: AgentSource; key: string } {\n if (agentId.startsWith('bizar:')) return { source: 'bizar', key: agentId.slice('bizar:'.length) };\n if (agentId.startsWith('cc:')) return { source: 'claude-code', key: agentId.slice('cc:'.length) };\n return { source: 'bizar', key: agentId };\n}\n\nexport function AgentDetail(props: AgentDetailProps): JSX.Element {\n const {\n agentId, name, role, status, currentTask, open, onOpenChange,\n startedAt, messageCount, lastMessageSnippet, successRate, tasksTotal,\n } = props;\n const { source, key } = parseId(agentId);\n const [prompt, setPrompt] = 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 const [lastProcessId, setLastProcessId] = useState<string | null>(null);\n\n // v9.5.0 S49 — agent↔task drilldown. `useFetch` is gated on `open` so\n // we don't burn a request every time the Sheet is mounted-hidden. We\n // client-filter for the current agent's name across both `workedBy`\n // (Bizar task-store) and `metadata.agent` (task-store progress events).\n const tasksQuery = useFetch<{ tasks?: Task[] }>(open ? '/api/tasks' : null);\n const myTasks = useMemo<Task[]>(() => {\n if (!open) return [];\n const all = tasksQuery.data?.tasks ?? [];\n return all.filter((t) => {\n const md = (t.metadata ?? {}) as { agent?: unknown };\n return (\n (typeof (t as unknown as { workedBy?: unknown }).workedBy === 'string'\n && (t as unknown as { workedBy: string }).workedBy === key)\n || md.agent === key\n );\n });\n }, [open, tasksQuery.data, key]);\n\n useEffect(() => {\n if (open) { setPrompt(''); setMessage(null); setError(null); setLastProcessId(null); }\n }, [open, agentId]);\n\n const runAction = async (\n label: string,\n method: 'POST',\n endpoint: string,\n body?: Record<string, unknown>,\n ): Promise<void> => {\n setBusy(label);\n setMessage(null);\n setError(null);\n try {\n const res = await fetchJson<{ ok?: boolean; sessionId?: string; processId?: string; error?: string }>(\n endpoint,\n { method, body },\n );\n if (res.ok) {\n const sessionExtra = res.sessionId ? ` (session ${res.sessionId.slice(0, 8)})` : '';\n if (res.processId) setLastProcessId(res.processId);\n setMessage(`${label} succeeded${sessionExtra}`);\n } else {\n setError(res.error || `${label} failed`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const sendPrompt = async (): Promise<void> => {\n if (!prompt.trim()) return;\n const trimmed = prompt.trim();\n setPrompt('');\n if (source === 'claude-code') {\n await runAction('Send prompt', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/send`, { prompt: trimmed });\n } else {\n await runAction('Invoke agent', 'POST', `/api/agents/${encodeURIComponent(key)}/invoke`, { prompt: trimmed });\n }\n };\n\n const restart = async (): Promise<void> => {\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Restart ${name}? The current session will be killed and a fresh one spawned.`)\n : true;\n if (!ok) return;\n if (source === 'claude-code') {\n // v9.0.5 — server now does kill+spawn in one shot, using the current\n // prompt as the new session's seed (fallback to \"continue\").\n const seed = prompt.trim() || 'continue from the last checkpoint';\n await runAction('Restart', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/restart`, { prompt: seed });\n return;\n }\n await runAction('Restart', 'POST', `/api/agents/${encodeURIComponent(key)}/restart`);\n };\n\n const kill = async (): Promise<void> => {\n if (source === 'claude-code') {\n await runAction('Kill', 'POST', `/api/cc-agents/${encodeURIComponent(key)}/kill`);\n return;\n }\n // Confirm before destroying — DELETE is irreversible.\n const ok = typeof window !== 'undefined' && typeof window.confirm === 'function'\n ? window.confirm(`Delete Bizar agent \"${key}\"? This is irreversible.`)\n : true;\n if (!ok) return;\n setBusy('Kill');\n setMessage(null);\n setError(null);\n try {\n await fetchJson<{ ok?: boolean; error?: string }>(\n `/api/agents/${encodeURIComponent(key)}`,\n { method: 'DELETE' },\n );\n setMessage(`Killed ${name}`);\n // Server broadcasts agents:change; close the drawer so the user\n // sees the agent disappear from the grid.\n onOpenChange(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(null);\n }\n };\n\n const copyId = async (): Promise<void> => {\n try {\n await navigator.clipboard.writeText(key);\n setMessage(`Copied \"${key}\"`);\n } catch {\n setError('Clipboard unavailable');\n }\n };\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" title={name}>\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Inline gap={3} align=\"center\">\n <Avatar name={name} status={status === 'busy' ? 'busy' : status === 'error' ? 'busy' : 'online'} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', color: 'var(--fg-muted)' }}>{role}</div>\n <Inline gap={2} style={{ marginTop: 4 }} wrap>\n <Badge tone={status === 'busy' ? 'info' : status === 'error' ? 'danger' : 'neutral'} dot>\n {status}\n </Badge>\n <Badge tone=\"accent\">{source === 'bizar' ? 'Bizar agent' : 'Claude Code'}</Badge>\n {startedAt !== undefined && (\n <Badge tone=\"neutral\" title={new Date(startedAt).toLocaleString()}>\n up {formatDuration(Date.now() - startedAt)}\n </Badge>\n )}\n {typeof messageCount === 'number' && (\n <Badge tone=\"neutral\">{messageCount} msg</Badge>\n )}\n {typeof tasksTotal === 'number' && (\n <Badge tone=\"neutral\">{tasksTotal} tasks</Badge>\n )}\n {typeof successRate === 'number' && (\n <Badge tone={successRate >= 0.8 ? 'success' : successRate >= 0.5 ? 'warning' : 'danger'}>\n {Math.round(successRate * 100)}% success\n </Badge>\n )}\n </Inline>\n </div>\n </Inline>\n\n {typeof lastMessageSnippet === 'string' && lastMessageSnippet.length > 0 && (\n <div\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n fontStyle: 'italic',\n }}\n title={lastMessageSnippet}\n >\n “{lastMessageSnippet.length > 240 ? `${lastMessageSnippet.slice(0, 240)}…` : lastMessageSnippet}”\n </div>\n )}\n\n {currentTask !== undefined && (\n <div\n style={{\n padding: 'var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', marginBottom: 4 }}>\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Current task\n </div>\n {currentTask}\n </div>\n )}\n\n <Stack gap={2}>\n <label\n htmlFor={`agent-prompt-${agentId}`}\n style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}\n >\n Send a prompt\n </label>\n <Textarea\n id={`agent-prompt-${agentId}`}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n placeholder={source === 'claude-code' ? 'Type a follow-up for this background agent…' : 'Invoke this Bizar agent with…'}\n rows={3}\n disabled={busy !== null}\n />\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void sendPrompt(); }}\n disabled={!prompt.trim() || busy !== null}\n >\n <Send size={14} aria-hidden /> {busy === 'Send prompt' || busy === 'Invoke agent' ? <Skeleton style={{ width: 60, height: 14 }} /> : 'Send'}\n </Button>\n <Button\n variant=\"secondary\"\n onClick={() => { void restart(); }}\n disabled={busy !== null || source === 'claude-code'}\n title={source === 'claude-code' ? 'Use command palette to spawn a fresh agent' : undefined}\n >\n <RotateCw size={14} aria-hidden /> Restart\n </Button>\n <Button\n variant=\"danger\"\n onClick={() => { void kill(); }}\n disabled={busy !== null}\n title={source === 'claude-code' ? 'Kill the CC background session' : `Delete Bizar agent \"${key}\"`}\n >\n <Octagon size={14} aria-hidden /> Kill\n </Button>\n <Button variant=\"ghost\" onClick={() => { void copyId(); }}>\n <ClipboardCopy size={14} aria-hidden /> Copy id\n </Button>\n </Inline>\n </Stack>\n\n {message !== null && (\n <div\n role=\"status\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--success) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--success) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--success)',\n }}\n >\n {message}\n </div>\n )}\n {lastProcessId !== null && (\n <div\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n }}\n >\n <span style={{ textTransform: 'uppercase', letterSpacing: '0.04em' }}>PID</span>\n <code\n data-testid=\"agent-process-id\"\n style={{\n fontFamily: 'var(--font-mono)',\n color: 'var(--fg)',\n background: 'var(--surface-1)',\n padding: '2px 6px',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n {lastProcessId}\n </code>\n </div>\n )}\n {error !== null && (\n <div\n role=\"alert\"\n style={{\n padding: 'var(--space-2) var(--space-3)',\n background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))',\n border: '1px solid color-mix(in oklch, var(--danger) 40%, var(--border))',\n borderRadius: 'var(--radius-md)',\n fontSize: 'var(--fs-12)',\n color: 'var(--danger)',\n }}\n >\n {error}\n </div>\n )}\n\n {/* Live stream — only meaningful for Claude Code sessions (they have\n a backing JSONL log). Bizar agents have no equivalent surface. */}\n {/* v9.5.0 S49 — agent↔task drilldown. Renders the tasks this agent\n is currently working on (filtered by workedBy / metadata.agent),\n so the user can see \"what is my orchestrator doing right now\"\n without bouncing between this Sheet and the Tasks board. */}\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n Assigned tasks ({myTasks.length})\n </div>\n {tasksQuery.loading && myTasks.length === 0 ? (\n <Skeleton style={{ height: 48 }} />\n ) : myTasks.length === 0 ? (\n <Card variant=\"outlined\">\n <CardBody>\n <span data-testid=\"agent-tasks-empty\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n No tasks assigned to this agent.\n </span>\n </CardBody>\n </Card>\n ) : (\n <Stack gap={1}>\n {myTasks.map((t) => (\n <div\n key={t.id}\n data-testid={`agent-tasks-${t.id}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n padding: 'var(--space-2) var(--space-3)',\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-sm)',\n fontSize: 'var(--fs-13)',\n }}\n >\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{t.id}</code>\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.title}\n </span>\n <Badge tone={t.status === 'doing' ? 'info' : t.status === 'blocked' ? 'danger' : 'neutral'}>\n {t.status ?? 'queued'}\n </Badge>\n </div>\n ))}\n </Stack>\n )}\n </Stack>\n {source === 'claude-code' && (\n <Stack gap={2}>\n <div\n style={{\n fontSize: 'var(--fs-12)',\n color: 'var(--fg-muted)',\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n }}\n >\n <ActivityIcon size={12} aria-hidden style={{ verticalAlign: 'middle', marginRight: 4 }} />\n Live output\n </div>\n <AgentLiveOutput sessionId={key} paused={busy === 'Kill'} />\n </Stack>\n )}\n </Stack>\n </SheetContent>\n </Sheet>\n );\n}\n\n/** formatDuration — human-readable \"3m 12s\" / \"1h 4m\" / \"2d 5h\". */\nfunction formatDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n const sec = Math.floor(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ${sec % 60}s`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ${min % 60}m`;\n const day = Math.floor(hr / 24);\n return `${day}d ${hr % 24}h`;\n}","import { useCallback, useMemo, useState } from 'react';\nimport { ChevronDown, ChevronRight, GitBranch, Network } from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport type { BizarAgent } from '../../data/types.js';\n\n/**\n * AgentHierarchy — v9.4.0 S45.\n *\n * Reads `/api/agents/hierarchy` (returns `{ roots: Array<{ name, agent,\n * children }>, all: BizarAgent[] }` from `agents-store.mjs:230-251`).\n * Renders a collapsible tree where each node is a Bizar agent. Children\n * render indented beneath their parent. Live updates via `agents:change`\n * WS event triggers refetch.\n */\n\nexport interface HierarchyNode {\n name: string;\n agent: BizarAgent | null;\n children: HierarchyNode[];\n}\n\ninterface HierarchyResponse {\n roots?: HierarchyNode[];\n all?: BizarAgent[];\n}\n\nfunction statusToTone(status: string | undefined): 'neutral' | 'info' | 'success' | 'warning' | 'danger' {\n const s = (status || '').toLowerCase();\n if (s === 'busy' || s === 'working') return 'info';\n if (s === 'idle') return 'neutral';\n if (s === 'error' || s === 'stuck') return 'danger';\n if (s === 'paused') return 'warning';\n return 'neutral';\n}\n\nfunction statusLabel(status: string | undefined): string {\n const s = (status || '').toLowerCase();\n if (s === 'working') return 'working';\n if (!s) return 'idle';\n return s;\n}\n\nfunction relativeMs(ms: number | undefined | null): string {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n\ninterface NodeRowProps {\n node: HierarchyNode;\n depth: number;\n expanded: Set<string>;\n onToggle: (name: string) => void;\n}\n\nfunction NodeRow({ node, depth, expanded, onToggle }: NodeRowProps): JSX.Element {\n const hasChildren = node.children.length > 0;\n const isOpen = expanded.has(node.name);\n const agent = node.agent;\n const tone = statusToTone(agent?.status);\n const status = statusLabel(agent?.status);\n return (\n <>\n <div\n data-testid={`agent-hierarchy-node-${node.name}`}\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr auto auto',\n alignItems: 'center',\n gap: 'var(--space-3)',\n padding: 'var(--space-2) var(--space-3)',\n paddingLeft: `calc(var(--space-3) + ${depth * 24}px)`,\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-1)',\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n data-testid={`agent-hierarchy-toggle-${node.name}`}\n aria-label={isOpen ? 'Collapse' : 'Expand'}\n onClick={() => onToggle(node.name)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n height: 22,\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n {isOpen ? <ChevronDown size={12} aria-hidden /> : <ChevronRight size={12} aria-hidden />}\n </button>\n ) : (\n <span aria-hidden style={{ width: 22, height: 22, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color: 'var(--fg-subtle)' }}>\n <GitBranch size={12} />\n </span>\n )}\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 'var(--fs-13)', fontWeight: 600, color: 'var(--fg)' }}>{node.name}</div>\n {agent && (\n <div style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {agent.role || agent.category || agent.mode || 'agent'}\n {agent.parent && agent.parent !== node.name && (\n <> · parent <code style={{ fontFamily: 'var(--font-mono)' }}>{agent.parent}</code></>\n )}\n </div>\n )}\n </div>\n {typeof agent?.lastSeen === 'number' && agent.lastSeen > 0 && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>\n {relativeMs(agent.lastSeen)}\n </span>\n )}\n <Badge tone={tone} dot>{status}</Badge>\n </div>\n {hasChildren && isOpen && node.children.map((child) => (\n <NodeRow key={child.name} node={child} depth={depth + 1} expanded={expanded} onToggle={onToggle} />\n ))}\n </>\n );\n}\n\nexport function AgentHierarchy(): JSX.Element {\n const data = useFetch<HierarchyResponse>('/api/agents/hierarchy');\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n // Track which root names we auto-expanded on first load so subsequent\n // user toggles of those roots are honored.\n const [autoRoots, setAutoRoots] = useState<Set<string>>(() => new Set());\n\n const seenRoots = useMemo(() => data.data?.roots?.map((n) => n.name) ?? [], [data.data]);\n\n // On first successful load, auto-expand every root and remember the set so\n // a future toggle of a root is a real state change (no longer masked by\n // the auto-expand).\n if (autoRoots.size === 0 && seenRoots.length > 0) {\n setAutoRoots(new Set(seenRoots));\n setExpanded(new Set(seenRoots));\n }\n\n const onAgentsChange = useCallback(() => data.refetch(), [data]);\n useWsMessage('agents:change', onAgentsChange);\n\n const toggle = useCallback((name: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n }, []);\n\n if (data.loading && !data.data) {\n return (\n <Stack gap={3}>\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n <Skeleton style={{ height: 48 }} />\n </Stack>\n );\n }\n\n const roots = data.data?.roots ?? [];\n if (roots.length === 0) {\n return (\n <Card>\n <CardBody>\n <EmptyState\n icon={<Network size={32} aria-hidden />}\n title=\"No hierarchy yet\"\n description=\"Agents have no parent links in their frontmatter. Add `parent:` to an agent's .md frontmatter to nest it beneath another agent.\"\n data-testid=\"agent-hierarchy-empty\"\n />\n </CardBody>\n </Card>\n );\n }\n\n return (\n <Stack gap={2}>\n <Inline align=\"center\" justify=\"between\">\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {roots.length} root agent{roots.length === 1 ? '' : 's'} · {data.data?.all?.length ?? 0} total\n </span>\n </Inline>\n <Stack gap={2}>\n {roots.map((root) => (\n <NodeRow key={root.name} node={root} depth={0} expanded={expanded} onToggle={toggle} />\n ))}\n </Stack>\n </Stack>\n );\n}","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { ViewHeader } from '../../ui/data/ViewHeader.js';\nimport { ListHeader } from '../../ui/data/ListHeader.js';\nimport { AgentCard, type AgentCardProps, type AgentStatus } from '../../ui/agents/AgentCard.js';\nimport { AgentDetail } from '../../ui/agents/AgentDetail.js';\nimport { Chip } from '../../ui/data/Chip.js';\nimport { Banner } from '../../ui/feedback/Banner.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { ErrorState } from '../../ui/feedback/ErrorState.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { BizarAgent, CCAgent, WsMessage } from '../../data/types.js';\nimport { AlertTriangle, Bot, Cpu, Pause, Play, Plus, RotateCw } from 'lucide-react';\nimport { AgentHierarchy } from './AgentHierarchy.js';\n\nconst SOURCE_STORAGE_KEY = 'bizar.agents.sourceFilter';\nconst SOURCE_LABELS = {\n all: 'All',\n bizar: 'Bizar',\n 'claude-code': 'Claude Code',\n} as const;\ntype SourceFilter = keyof typeof SOURCE_LABELS;\nconst VALID_SOURCES = Object.keys(SOURCE_LABELS) as SourceFilter[];\n\nfunction readPersistedSource(): SourceFilter {\n if (typeof localStorage === 'undefined') return 'all';\n const v = localStorage.getItem(SOURCE_STORAGE_KEY);\n return VALID_SOURCES.includes(v as SourceFilter) ? (v as SourceFilter) : 'all';\n}\n\n/** relativeTimeMs — \"12s\", \"3m\", \"2h\", \"5d\". Returns \"—\" for missing/future timestamps. */\nfunction relativeTimeMs(ms: number): string {\n if (!Number.isFinite(ms) || ms <= 0) return '—';\n const delta = Math.max(0, Date.now() - ms);\n const sec = Math.floor(delta / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n return `${Math.floor(hr / 24)}d ago`;\n}\n\n/**\n * AgentsView — Sprint S10. Unified Bizar + Claude Code agents.\n *\n * Two REST calls (Bizar agents from `/api/agents`, CC from\n * `/api/cc-agents`) merged into a single grid. A `source` filter\n * chip switches between `bizar | claude-code | all`. Live updates\n * via `agents:change` and `agent:status` WS events.\n */\n\nfunction mapBizar(a: BizarAgent): AgentCardProps {\n const raw = (a.status || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' || raw === 'stuck' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `bizar:${a.name}`,\n name: a.name,\n role: a.role || a.category || a.mode || 'agent',\n status,\n currentTask: a.currentTaskId ? `Task ${a.currentTaskId}` : undefined,\n lastActivity: a.lastSeen ? new Date(a.lastSeen).toLocaleTimeString() : undefined,\n tasksToday: a.tasksTotal || 0,\n // v9.4.0 — pass real metrics for the new AgentCard strip. The old\n // `tpmHistory` field was dead because AgentCard only renders the\n // sparkline when `length > 1` and we always passed a single point.\n tasksSucceeded: typeof a.tasksSucceeded === 'number' ? a.tasksSucceeded : undefined,\n tasksTotal: typeof a.tasksTotal === 'number' ? a.tasksTotal : undefined,\n successRate: typeof a.successRate === 'number' ? a.successRate : undefined,\n lastSeenMs: typeof a.lastSeen === 'number' && a.lastSeen > 0 ? a.lastSeen : undefined,\n badges: a.tags || [],\n };\n}\n\nfunction mapCC(a: CCAgent): AgentCardProps {\n const raw = (a.status || a.state || 'idle').toLowerCase();\n const status: AgentStatus =\n raw === 'busy' || raw === 'working' ? 'busy' :\n raw === 'error' ? 'error' :\n raw === 'paused' ? 'paused' : 'idle';\n return {\n id: `cc:${a.sessionId || a.id}`,\n name: a.name || a.sessionId?.slice(0, 8) || 'unknown',\n role: a.kind === 'background' ? 'CC background' : 'CC interactive',\n status,\n currentTask: a.lastMessageSnippet || undefined,\n lastActivity: a.lastMessageAt ? new Date(a.lastMessageAt).toLocaleTimeString() : (a.startedAt ? new Date(a.startedAt).toLocaleTimeString() : undefined),\n tasksToday: a.messageCount || 0,\n // CC agents don't expose successRate/tasksSucceeded — only messageCount.\n // Skip the metric strip for them; the badge + lastActivity carry the\n // signal.\n badges: [a.cwd?.split('/').slice(-2).join('/') || ''].filter(Boolean),\n };\n}\n\nexport function AgentsView(): JSX.Element {\n const bizar = useFetch<{ agents?: BizarAgent[] }>('/api/agents');\n const cc = useFetch<{ agents?: CCAgent[]; error?: string }>('/api/cc-agents');\n const stuck = useFetch<{ stuck?: BizarAgent[] }>('/api/agents/stuck');\n const [source, setSource] = useState<SourceFilter>(readPersistedSource);\n const [mode, setMode] = useState<'roster' | 'hierarchy'>('roster');\n useEffect(() => {\n if (typeof localStorage !== 'undefined') localStorage.setItem(SOURCE_STORAGE_KEY, source);\n }, [source]);\n const [bizarList, setBizarList] = useState<BizarAgent[]>([]);\n const [ccList, setCCList] = useState<CCAgent[]>([]);\n const [initialized, setInitialized] = useState(false);\n const [openId, setOpenId] = useState<string | null>(null);\n const [createDraft, setCreateDraft] = useState<{ name: string; role: string } | null>(null);\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [restartingNames, setRestartingNames] = useState<Set<string>>(() => new Set());\n\n const saveCreate = async (): Promise<void> => {\n if (createDraft === null || !createDraft.name.trim()) return;\n setCreating(true);\n setCreateError(null);\n try {\n await fetchJson('/api/agents', { method: 'POST', body: { name: createDraft.name.trim(), role: createDraft.role.trim() || 'agent' } });\n setCreateDraft(null);\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n // v9.5.0 S48 — inline Restart from the stuck banner. One-click recovery\n // without forcing the user to drill into the per-agent Sheet. The\n // server broadcasts agents:change on success so the banner refreshes.\n const restartStuck = async (name: string): Promise<void> => {\n setRestartingNames((prev) => new Set(prev).add(name));\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(name)}/restart`, { method: 'POST' });\n stuck.refetch();\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setRestartingNames((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n }\n };\n\n // v10-S1 — inline Pause/Resume on the stuck banner. Pause stops\n // heartbeat drain (status='paused'); Resume re-enables\n // (status='idle' so Odin picks the agent up again on the next\n // spawn). Uses the same in-flight Set pattern as restartStuck so\n // all three actions disable each other per-row while pending.\n const [busyStuckNames, setBusyStuckNames] = useState<Set<string>>(() => new Set());\n const setStuckActionStatus = async (name: string, status: 'paused' | 'idle'): Promise<void> => {\n setBusyStuckNames((prev) => new Set(prev).add(name));\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(name)}/status`, {\n method: 'POST',\n body: { status },\n });\n stuck.refetch();\n bizar.refetch();\n } catch (err) {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusyStuckNames((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n }\n };\n\n // v10-S1 — bulk Pause-all-stuck. Fires status='paused' for every\n // agent currently in /api/agents/stuck. Used when a wedged cluster\n // needs to be drained before restart. Per-row actions are still\n // available for selective triage.\n const [bulkBusy, setBulkBusy] = useState<boolean>(false);\n const bulkPauseStuck = async (): Promise<void> => {\n const list = stuck.data?.stuck ?? [];\n if (list.length === 0) return;\n setBulkBusy(true);\n try {\n await Promise.all(list.map((a) =>\n fetchJson(`/api/agents/${encodeURIComponent(a.name)}/status`, {\n method: 'POST',\n body: { status: 'paused' },\n }).catch((err) => {\n setCreateError(err instanceof FetchError ? err.message : (err as Error).message);\n return null;\n }),\n ));\n stuck.refetch();\n bizar.refetch();\n } finally {\n setBulkBusy(false);\n }\n };\n\n useEffect(() => {\n if (!initialized && bizar.data?.agents !== undefined && cc.data?.agents !== undefined) {\n setInitialized(true);\n setBizarList(bizar.data.agents);\n setCCList(cc.data.agents);\n }\n }, [bizar.data, cc.data, initialized]);\n\n const onAgentsChange = useCallback(() => {\n // Bust both caches; the next mount will re-fetch (cheap because\n // the dashboard views are lazy-mounted).\n bizar.refetch();\n cc.refetch();\n }, [bizar, cc]);\n useWsMessage('agents:change', onAgentsChange);\n\n const onAgentStatus = useCallback((msg: WsMessage) => {\n if (msg.type !== 'agent:status') return;\n const a = (msg as Extract<WsMessage, { type: 'agent:status' }>).agent;\n if (!a || !a.name) return;\n setBizarList((prev) => {\n const idx = prev.findIndex((x) => x.name === a.name);\n if (idx === -1) return [...prev, a];\n const copy = prev.slice();\n copy[idx] = { ...copy[idx], ...a };\n return copy;\n });\n }, []);\n useWsMessage('agent:status', onAgentStatus);\n\n const cards = useMemo(() => {\n const out: Array<AgentCardProps & { source: 'bizar' | 'claude-code' }> = [];\n if (source !== 'claude-code') {\n for (const a of bizarList) out.push({ ...mapBizar(a), source: 'bizar' });\n }\n if (source !== 'bizar') {\n for (const a of ccList) out.push({ ...mapCC(a), source: 'claude-code' });\n }\n return out;\n }, [bizarList, ccList, source]);\n\n return (\n <Stack gap={5} data-testid=\"agents-view\">\n <ViewHeader\n title=\"Agents\"\n description=\"Bizar agents (frontmatter-driven) and Claude Code background agents.\"\n actions={\n <Button variant=\"primary\" onClick={() => setCreateDraft({ name: '', role: '' })} data-testid=\"agent-create-open\">\n <Plus size={14} aria-hidden /> New agent\n </Button>\n }\n />\n <ListHeader\n title=\"Roster\"\n count={cards.length}\n description={stuck.data?.stuck && stuck.data.stuck.length > 0 ? `${stuck.data.stuck.length} stuck` : undefined}\n testid=\"agents-list-header\"\n />\n {(stuck.data?.stuck ?? []).length > 0 && (\n <Banner\n tone=\"warning\"\n data-testid=\"agents-stuck-banner\"\n action={\n <Inline gap={2}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void bulkPauseStuck(); }}\n disabled={bulkBusy}\n data-testid=\"agents-stuck-bulk-pause\"\n title=\"Pause every stuck agent at once\"\n >\n <Pause size={12} aria-hidden /> {bulkBusy ? 'Pausing…' : 'Pause all'}\n </Button>\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setMode('hierarchy')}>\n View details\n </Button>\n </Inline>\n }\n >\n <Stack gap={2}>\n <Inline align=\"center\" gap={2}>\n <AlertTriangle size={14} aria-hidden style={{ color: 'var(--warning)' }} />\n <span>\n {(stuck.data?.stuck ?? []).length} agent{stuck.data && stuck.data.stuck && stuck.data.stuck.length === 1 ? '' : 's'} stuck (no heartbeat &gt;5m)\n </span>\n </Inline>\n <Stack gap={1}>\n {(stuck.data?.stuck ?? []).map((s) => {\n const restarting = restartingNames.has(s.name);\n const paused = s.status === 'paused';\n const busy = restarting || busyStuckNames.has(s.name);\n return (\n <Inline key={s.name} align=\"center\" justify=\"between\" gap={2} data-testid={`agents-stuck-row-${s.name}`}>\n <Inline gap={2} align=\"center\">\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{s.name}</code>\n <Badge tone={paused ? 'warning' : 'danger'}>{paused ? 'paused' : (s.status || 'stuck')}</Badge>\n {typeof s.lastSeen === 'number' && s.lastSeen > 0 && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n last seen {relativeTimeMs(s.lastSeen)}\n </span>\n )}\n </Inline>\n <Inline gap={1}>\n {paused ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void setStuckActionStatus(s.name, 'idle'); }}\n data-testid={`agents-stuck-resume-${s.name}`}\n >\n <Play size={12} aria-hidden /> Resume\n </Button>\n ) : (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void setStuckActionStatus(s.name, 'paused'); }}\n data-testid={`agents-stuck-pause-${s.name}`}\n >\n <Pause size={12} aria-hidden /> Pause\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={busy}\n onClick={() => { void restartStuck(s.name); }}\n data-testid={`agents-stuck-restart-${s.name}`}\n >\n <RotateCw size={12} aria-hidden /> {restarting ? 'Restarting…' : 'Restart'}\n </Button>\n </Inline>\n </Inline>\n );\n })}\n </Stack>\n </Stack>\n </Banner>\n )}\n <Inline align=\"center\" justify=\"between\" wrap gap={2}>\n <Inline gap={2}>\n {(['all', 'bizar', 'claude-code'] as SourceFilter[]).map((id) => (\n <Chip\n key={id}\n selected={source === id}\n onClick={() => setSource(id)}\n >\n {id === 'bizar' ? <Bot size={12} aria-hidden /> : id === 'claude-code' ? <Cpu size={12} aria-hidden /> : null}{' '}\n {SOURCE_LABELS[id]}\n </Chip>\n ))}\n </Inline>\n <Inline gap={2}>\n <Chip\n data-testid=\"agents-mode-roster\"\n selected={mode === 'roster'}\n onClick={() => setMode('roster')}\n >\n Roster\n </Chip>\n <Chip\n data-testid=\"agents-mode-hierarchy\"\n selected={mode === 'hierarchy'}\n onClick={() => setMode('hierarchy')}\n >\n Hierarchy\n </Chip>\n </Inline>\n </Inline>\n {mode === 'hierarchy' ? (\n <AgentHierarchy />\n ) : cards.length === 0 && (bizar.loading || cc.loading) ? (\n <Grid cols={3}>\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n <Skeleton style={{ height: 140 }} />\n </Grid>\n ) : cards.length === 0 && (bizar.error || cc.error) ? (\n <ErrorState\n block\n title=\"Couldn't load agents\"\n description=\"Both bizar and CC roster endpoints failed. Retry to refetch.\"\n error={bizar.error ?? cc.error}\n onRetry={() => { void bizar.refetch(); void cc.refetch(); }}\n testid=\"agents-error\"\n />\n ) : cards.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)' }}>\n No agents yet. Run <code>/loop</code> or spawn one via the command palette.\n </span>\n ) : (\n <Grid cols={3}>\n {cards.map((c) => (\n <AgentCard key={c.id} {...c} onOpen={() => setOpenId(c.id)} />\n ))}\n </Grid>\n )}\n\n {openId !== null && (() => {\n const sel = cards.find((c) => c.id === openId);\n if (!sel) return null;\n const ccSource = sel.source === 'claude-code' ? ccList.find((a) => sel.id === `cc:${a.sessionId || a.id}`) : undefined;\n const bzSource = sel.source === 'bizar' ? bizarList.find((a) => sel.id === `bizar:${a.name}`) : undefined;\n return (\n <AgentDetail\n agentId={sel.id}\n name={sel.name}\n role={sel.role}\n status={sel.status}\n currentTask={sel.currentTask}\n startedAt={ccSource?.startedAt ?? bzSource?.lastSeen}\n messageCount={ccSource?.messageCount}\n lastMessageSnippet={ccSource?.lastMessageSnippet}\n successRate={bzSource?.successRate}\n tasksTotal={bzSource?.tasksTotal}\n open={openId !== null}\n onOpenChange={(o) => { if (!o) setOpenId(null); }}\n />\n );\n })()}\n\n {/* v9.2.0 — create-agent Sheet. Closes the audit-flagged \"no way\n to add a new agent\" HIGH gap. */}\n <Sheet open={createDraft !== null} onOpenChange={(o) => { if (!o) setCreateDraft(null); }}>\n <SheetContent side=\"right\" title=\"New agent\">\n {createDraft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"agent-create-name\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</label>\n <Input\n id=\"agent-create-name\"\n value={createDraft.name}\n onChange={(e) => setCreateDraft({ ...createDraft, name: e.target.value })}\n placeholder=\"e.g. frigg\"\n disabled={creating}\n data-testid=\"agent-create-name\"\n />\n </Stack>\n <Stack gap={2}>\n <label htmlFor=\"agent-create-role\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Role (optional)</label>\n <Input\n id=\"agent-create-role\"\n value={createDraft.role}\n onChange={(e) => setCreateDraft({ ...createDraft, role: e.target.value })}\n placeholder=\"e.g. code-review\"\n disabled={creating}\n data-testid=\"agent-create-role\"\n />\n </Stack>\n {createError !== null && <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{createError}</span>}\n <Inline gap={2}>\n <Button variant=\"primary\" onClick={() => { void saveCreate(); }} disabled={creating || !createDraft.name.trim()} data-testid=\"agent-create-submit\">\n Create agent\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":["ClipboardCopy","createLucideIcon","Octagon","STATUS_LABEL","STATUS_TONE","STATUS_FG","relativeTime","ms","delta","sec","min","hr","successTone","rate","lastSeenTone","AgentCard","props","name","role","status","lastActivity","currentTask","tasksToday","tasksSucceeded","tasksTotal","successRate","lastSeenMs","onOpen","badges","className","showMetrics","jsxs","cx","jsx","Avatar","Badge","Activity","Zap","ProgressBar","MAX_EVENTS","AgentLiveOutput","sessionId","paused","events","setEvents","useState","setStatus","error","setError","pausedLocal","setPausedLocal","autoScroll","setAutoScroll","containerRef","useRef","sourceRef","useEffect","url","src","onSnapshot","ev","data","onEvent","prev","next","onEnd","onErrEv","el","renderEvent","idx","tone","_a","label","_b","text","_c","Stack","Inline","Button","p","Play","Pause","RefreshCw","e","atBottom","parseId","agentId","AgentDetail","open","onOpenChange","startedAt","messageCount","lastMessageSnippet","source","key","prompt","setPrompt","busy","setBusy","message","setMessage","lastProcessId","setLastProcessId","tasksQuery","useFetch","myTasks","useMemo","t","md","runAction","method","endpoint","body","res","fetchJson","sessionExtra","err","sendPrompt","trimmed","restart","seed","kill","copyId","Sheet","SheetContent","formatDuration","ActivityIcon","Textarea","Send","Skeleton","RotateCw","Card","CardBody","statusToTone","s","statusLabel","relativeMs","NodeRow","node","depth","expanded","onToggle","hasChildren","isOpen","agent","Fragment","ChevronDown","ChevronRight","GitBranch","child","AgentHierarchy","setExpanded","autoRoots","setAutoRoots","seenRoots","n","onAgentsChange","useCallback","useWsMessage","toggle","roots","EmptyState","Network","root","SOURCE_STORAGE_KEY","SOURCE_LABELS","VALID_SOURCES","readPersistedSource","v","relativeTimeMs","mapBizar","a","raw","mapCC","AgentsView","bizar","cc","stuck","setSource","mode","setMode","bizarList","setBizarList","ccList","setCCList","initialized","setInitialized","openId","setOpenId","createDraft","setCreateDraft","creating","setCreating","createError","setCreateError","restartingNames","setRestartingNames","saveCreate","FetchError","restartStuck","busyStuckNames","setBusyStuckNames","setStuckActionStatus","bulkBusy","setBulkBusy","bulkPauseStuck","list","onAgentStatus","msg","x","copy","cards","out","ViewHeader","Plus","ListHeader","Banner","AlertTriangle","_d","restarting","id","Chip","Bot","Cpu","Grid","ErrorState","c","sel","ccSource","bzSource","o","Input"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,9 +0,0 @@
1
- import{r as c,j as t}from"./cmdk-DVxytz9i.js";import{c as V,u as R,a as J,S as T,I as w,d as S,G as q,h as $,i as D,F as I}from"./main-Cxeu4LhG.js";import{V as K}from"./ViewHeader-B6P-C4GD.js";import{C as A,b as H}from"./Card-rF59wHiO.js";import{T as G}from"./Textarea-QuofpMlq.js";import{E as L}from"./EmptyState-D65J5FQN.js";import{E as Y,M as W}from"./MessageBubble-5vUAquDx.js";import{R as _}from"./refresh-cw-ENBVR8hW.js";import{S as Q}from"./send-yz6HFZM5.js";/**
2
- * @license lucide-react v0.460.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const B=V("MessageSquarePlus",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}],["path",{d:"M12 7v6",key:"lw1j43"}],["path",{d:"M9 10h6",key:"9gxzsh"}]]);async function U(a,k,d){const{signal:i,onChunk:u,onEvent:g,onDone:l,onError:h}=d;try{const n=await fetch(a,{...k,signal:i});if(!n.ok||n.body===null)throw new Error(`HTTP ${n.status} reading ${a}`);const E=n.body.getReader(),b=new TextDecoder;let m="",C=!1;for(;!C&&!(i!=null&&i.aborted);){const{value:o,done:M}=await E.read();if(M)break;m+=b.decode(o,{stream:!0});const v=m.split(`
7
-
8
- `);m=v.pop()??"";for(const x of v){const P=x.split(`
9
- `).filter(f=>f.length>0);let p="",y="message";for(const f of P)f.startsWith("data:")?p+=f.slice(5).trim():f.startsWith("event:")&&(y=f.slice(6).trim());if(p.length!==0){if(y==="done"){C=!0,l==null||l();break}y!=="message"?g==null||g(y,p):u==null||u(p)}}}l==null||l()}catch(n){if(i!=null&&i.aborted)return;h==null||h(n instanceof Error?n:new Error(String(n)))}}function oe(){const a=R("/api/chat"),k=R("/api/chat/sessions"),[d,i]=c.useState(null),[u,g]=c.useState([]),[l,h]=c.useState(""),[n,E]=c.useState(""),[b,m]=c.useState(!1),[C,o]=c.useState(null),[M,v]=c.useState(null);c.useEffect(()=>{var e;d===null&&((e=a.data)!=null&&e.sessions.length)&&i(a.data.sessions[0].id)},[a.data,d]),c.useEffect(()=>{if(!a.data||d===null){g([]);return}g(a.data.messages.filter(e=>{var s;return((s=a.data)==null?void 0:s.sessions.find(j=>j.id===d))!==void 0}))},[a.data,d]);const x=c.useMemo(()=>{var e;return(((e=a.data)==null?void 0:e.sessions)??[]).map(s=>({id:s.id,messageCount:s.size>0?Math.floor(s.size/200):0}))},[a.data]),P=c.useCallback(e=>{e.type==="chat:message"&&e.message&&a.refetch()},[a]);J("chat:message",P);const p=async()=>{const e=n.trim();if(!e||b)return;o(null),m(!0),E("");const s={id:`local_${Date.now().toString(36)}`,ts:new Date().toISOString(),role:"user",content:e};g(r=>[...r,s]),h("");const j=new AbortController;try{await U("/api/chat",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({message:e,session:d??void 0})},{signal:j.signal,onChunk:r=>h(z=>z+r),onEvent:(r,z)=>{if(r==="session")try{const O=JSON.parse(z);O.session&&i(O.session)}catch{}else r==="error"&&o(z)},onDone:()=>h(""),onError:r=>o(r.message)}),a.refetch(),k.refetch()}catch(r){o(r instanceof Error?r.message:String(r))}finally{m(!1),h("")}},y=async()=>{var e;o(null);try{const s=await D("/api/chat/sessions",{method:"POST",body:{}});(e=s.session)!=null&&e.id&&(i(s.session.id),a.refetch(),k.refetch())}catch(s){o((s instanceof I,s.message))}},f=async e=>{o(null);try{await D("/api/chat/regenerate",{method:"POST",body:{messageId:e.id,session:d}}),a.refetch()}catch(s){o((s instanceof I,s.message))}},F=async()=>{o(null);try{await D("/api/chat/audit",{method:"POST",body:{session:d}})}catch(e){o((e instanceof I,e.message))}},N=e=>{v(s=>s===e?null:e)};return t.jsxs(T,{gap:4,"data-testid":"chat-view",children:[t.jsx(K,{title:"Chat",description:"Multi-turn Claude Code sessions for the active project. Streams over WebSocket.",actions:t.jsxs(w,{gap:2,align:"center",children:[C!==null&&t.jsx("span",{role:"alert","data-testid":"chat-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:C}),t.jsxs(S,{variant:"ghost",onClick:()=>void a.refetch(),"data-testid":"chat-refresh",children:[t.jsx(_,{size:14,"aria-hidden":!0})," Refresh"]}),t.jsxs(S,{variant:"ghost",onClick:()=>void F(),"data-testid":"chat-audit",children:[t.jsx(q,{size:14,"aria-hidden":!0})," Audit"]}),t.jsxs(S,{variant:"primary",onClick:()=>void y(),"data-testid":"chat-create-session",children:[t.jsx(B,{size:14,"aria-hidden":!0})," New session"]})]})}),t.jsxs(w,{align:"stretch",gap:3,wrap:!1,style:{minHeight:480},children:[t.jsx(A,{variant:"default",style:{width:260,flexShrink:0},children:t.jsx(H,{children:t.jsxs(T,{gap:2,children:[t.jsxs("strong",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Sessions (",x.length,")"]}),a.loading&&x.length===0?t.jsx($,{style:{height:32}}):x.length===0?t.jsx(L,{icon:t.jsx(B,{size:28,"aria-hidden":!0}),title:"No sessions",description:"Create one to start chatting."}):x.map(e=>{const s=e.id===d,j=M===e.id;return t.jsxs("div",{"data-testid":`chat-session-${e.id}`,style:{padding:"var(--space-2)",borderRadius:"var(--radius-sm)",border:s?"1px solid var(--accent)":"1px solid var(--border)",background:s?"color-mix(in oklch, var(--accent) 12%, transparent)":"var(--surface-0)",cursor:"pointer"},onClick:()=>{j||i(e.id)},children:[t.jsxs(w,{align:"center",justify:"between",gap:2,children:[t.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:e.id}),t.jsx("button",{type:"button",onClick:r=>{r.stopPropagation(),N(e.id)},"data-testid":`chat-session-delete-${e.id}`,"aria-label":`Delete session ${e.id}`,style:{background:"transparent",border:0,color:"var(--fg-muted)",cursor:"pointer",fontSize:"var(--fs-11)"},children:"×"})]}),e.messageCount!==void 0&&t.jsxs("div",{style:{fontSize:"var(--fs-11)",color:"var(--fg-muted)"},children:[e.messageCount," messages"]}),j&&t.jsxs(w,{gap:1,style:{marginTop:"var(--space-1)"},children:[t.jsx(S,{variant:"danger",onClick:r=>{r.stopPropagation(),v(null)},"data-testid":`chat-session-confirm-delete-${e.id}`,children:"Confirm delete"}),t.jsx(S,{variant:"ghost",onClick:r=>{r.stopPropagation(),v(null)},"data-testid":`chat-session-cancel-delete-${e.id}`,children:"Cancel"})]})]},e.id)})]})})}),t.jsx(A,{variant:"default",style:{flex:1,minWidth:0},children:t.jsx(H,{children:t.jsxs(T,{gap:2,style:{height:"100%"},children:[t.jsx("div",{"data-testid":"chat-transcript",style:{flex:1,minHeight:320,overflowY:"auto",padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--surface-0)"},children:a.loading&&u.length===0?t.jsx($,{style:{height:200}}):u.length===0&&l===""?t.jsx(Y,{}):t.jsxs(T,{gap:1,children:[u.map(e=>t.jsx(W,{message:e,onRegenerate:s=>void f(s)},e.id)),l!==""&&t.jsx(W,{message:{id:"streaming",ts:new Date().toISOString(),role:"assistant",content:l}})]})}),t.jsxs(w,{align:"end",gap:2,children:[t.jsx("span",{style:{flex:1,color:"var(--fg-muted)",fontSize:"var(--fs-11)"},children:"Enter to send · Shift+Enter newline"}),t.jsxs(S,{variant:"primary",onClick:()=>void p(),disabled:b||n.trim()==="","data-testid":"chat-send",children:[t.jsx(Q,{size:14,"aria-hidden":!0})," ",b?"Sending…":"Send"]})]}),t.jsx(G,{value:n,placeholder:"Ask Claude anything…",rows:4,"data-testid":"chat-input",onChange:e=>E(e.target.value),onKeyDown:e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),p())}})]})})})]})]})}export{oe as ChatView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatView-CUriVEgU.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/message-square-plus.js","../../src/web/v8/ui/chat/EventStream.tsx","../../src/web/v8/views/Chat/ChatView.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MessageSquarePlus = createLucideIcon(\"MessageSquarePlus\", [\n [\"path\", { d: \"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\", key: \"1lielz\" }],\n [\"path\", { d: \"M12 7v6\", key: \"lw1j43\" }],\n [\"path\", { d: \"M9 10h6\", key: \"9gxzsh\" }]\n]);\n\nexport { MessageSquarePlus as default };\n//# sourceMappingURL=message-square-plus.js.map\n","/**\n * v8/ui/chat/EventStream.tsx — text/event-stream reader.\n *\n * Thin helper over `fetch()` that parses `data:` lines from a server\n * response and yields each event to a callback. Used by the chat\n * composer (POST /api/chat sends, response is a stream) and by the\n * Claude session detail (GET /api/claude-sessions/:id/stream).\n *\n * The server emits either:\n * - JSON envelopes per line (`fetchJson`-compatible), used when\n * handlers prefer that shape;\n * - SSE-formatted `data:` lines for streaming tokens.\n *\n * This reader handles both. JSON-only payloads (no `data:` prefix)\n * are forwarded verbatim. `event:` lines are split into separate\n * callbacks when present.\n */\n\nexport interface EventStreamHandlers {\n onChunk?: (text: string) => void;\n onEvent?: (event: string, data: string) => void;\n onDone?: () => void;\n onError?: (err: Error) => void;\n}\n\nexport interface EventStreamOptions extends EventStreamHandlers {\n signal?: AbortSignal;\n}\n\nexport async function readEventStream(\n url: string,\n init: RequestInit,\n handlers: EventStreamOptions,\n): Promise<void> {\n const { signal, onChunk, onEvent, onDone, onError } = handlers;\n try {\n const response = await fetch(url, { ...init, signal });\n if (!response.ok || response.body === null) {\n throw new Error(`HTTP ${response.status} reading ${url}`);\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let sawDone = false;\n // pump until the stream is fully drained or the caller aborts\n while (!sawDone) {\n if (signal?.aborted) break;\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // SSE frames are separated by a blank line. Split and process.\n const frames = buffer.split('\\n\\n');\n buffer = frames.pop() ?? '';\n for (const frame of frames) {\n const lines = frame.split('\\n').filter((l) => l.length > 0);\n let data = '';\n let event = 'message';\n for (const line of lines) {\n if (line.startsWith('data:')) {\n data += line.slice(5).trim();\n } else if (line.startsWith('event:')) {\n event = line.slice(6).trim();\n }\n }\n if (data.length === 0) continue;\n if (event === 'done') {\n sawDone = true;\n onDone?.();\n break;\n }\n if (event !== 'message') {\n onEvent?.(event, data);\n } else {\n onChunk?.(data);\n }\n }\n }\n onDone?.();\n } catch (err) {\n if (signal?.aborted) return;\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n}\n","/**\n * v8/views/Chat/ChatView.tsx — Sprint S38, v9.3.0.\n *\n * Three-pane chat surface: session list (left) · transcript (center) ·\n * composer (bottom). Backed by `/api/chat` + `/api/chat/sessions` +\n * `/api/chat/regenerate` + `/api/chat/audit`. Live deltas arrive via\n * the `chat:delta` / `chat:message` WS events added in S37.\n *\n * No window.confirm / window.prompt. Session creation uses an inline\n * `+` button that POSTs and selects the new session on success.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { MessageSquarePlus, RefreshCw, Send, ShieldCheck } 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 { Button } from '../../ui/controls/Button.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { MessageBubble, EmptyTranscript } from '../../ui/chat/MessageBubble.js';\nimport { readEventStream } from '../../ui/chat/EventStream.js';\nimport type { ChatMessage, ChatSession, WsMessage } from '../../data/types.js';\n\ninterface ChatPayload {\n messages: ChatMessage[];\n sessions: Array<{ id: string; file: string; mtime: number; size: number }>;\n}\n\ninterface SessionsPayload {\n sessions: Array<{ id: string; title?: string; updatedAt?: number; messageCount?: number; agent?: string | null }>;\n}\n\nfunction fmtRel(ts: number | undefined): string {\n if (!ts) return '';\n const delta = Math.max(0, Date.now() - ts);\n if (delta < 60_000) return 'just now';\n if (delta < 3_600_000) return `${Math.round(delta / 60_000)}m ago`;\n if (delta < 86_400_000) return `${Math.round(delta / 3_600_000)}h ago`;\n return new Date(ts).toLocaleString();\n}\n\nexport function ChatView(): JSX.Element {\n const payload = useFetch<ChatPayload>('/api/chat');\n const sessionsPayload = useFetch<SessionsPayload>('/api/chat/sessions');\n const [activeId, setActiveId] = useState<string | null>(null);\n const [transcript, setTranscript] = useState<ChatMessage[]>([]);\n const [streaming, setStreaming] = useState<string>('');\n const [draft, setDraft] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n\n // Seed active session from the first row in the response.\n useEffect(() => {\n if (activeId === null && payload.data?.sessions.length) {\n setActiveId(payload.data.sessions[0].id);\n }\n }, [payload.data, activeId]);\n\n // Seed transcript from payload when active session changes.\n useEffect(() => {\n if (!payload.data || activeId === null) {\n setTranscript([]);\n return;\n }\n setTranscript(payload.data.messages.filter((m) => payload.data?.sessions.find((s) => s.id === activeId) !== undefined));\n }, [payload.data, activeId]);\n\n const sessions = useMemo<ChatSession[]>(() => {\n return (payload.data?.sessions ?? []).map((s) => ({\n id: s.id,\n messageCount: s.size > 0 ? Math.floor(s.size / 200) : 0,\n }));\n }, [payload.data]);\n\n const onChange = useCallback((msg: WsMessage) => {\n if (msg.type === 'chat:message' && msg.message) {\n // A new persisted turn arrived for the active session; refresh the transcript.\n void payload.refetch();\n }\n }, [payload]);\n useWsMessage('chat:message', onChange);\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (!text || busy) return;\n setError(null);\n setBusy(true);\n setDraft('');\n const optimistic: ChatMessage = {\n id: `local_${Date.now().toString(36)}`,\n ts: new Date().toISOString(),\n role: 'user',\n content: text,\n };\n setTranscript((prev) => [...prev, optimistic]);\n setStreaming('');\n const ctrl = new AbortController();\n try {\n await readEventStream(\n '/api/chat',\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message: text, session: activeId ?? undefined }),\n },\n {\n signal: ctrl.signal,\n onChunk: (chunk) => setStreaming((cur) => cur + chunk),\n onEvent: (event, data) => {\n if (event === 'session') {\n try {\n const parsed = JSON.parse(data) as { session?: string };\n if (parsed.session) setActiveId(parsed.session);\n } catch { /* swallow */ }\n } else if (event === 'error') {\n setError(data);\n }\n },\n onDone: () => setStreaming(''),\n onError: (err) => setError(err.message),\n },\n );\n // After stream completes the persisted turn is in the JSONL log;\n // pull a fresh transcript.\n void payload.refetch();\n void sessionsPayload.refetch();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n setStreaming('');\n }\n };\n\n const createSession = async (): Promise<void> => {\n setError(null);\n try {\n const res = await fetchJson<{ session?: ChatSession }>(\n '/api/chat/sessions',\n { method: 'POST', body: {} },\n );\n if (res.session?.id) {\n setActiveId(res.session.id);\n void payload.refetch();\n void sessionsPayload.refetch();\n }\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const regenerate = async (msg: ChatMessage): Promise<void> => {\n setError(null);\n try {\n await fetchJson('/api/chat/regenerate', { method: 'POST', body: { messageId: msg.id, session: activeId } });\n void payload.refetch();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const audit = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson('/api/chat/audit', { method: 'POST', body: { session: activeId } });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const dropSession = (id: string): void => {\n // Inline confirm row pattern from F-061. No window.confirm.\n setConfirmDeleteId((cur) => (cur === id ? null : id));\n };\n\n return (\n <Stack gap={4} data-testid=\"chat-view\">\n <ViewHeader\n title=\"Chat\"\n description=\"Multi-turn Claude Code sessions for the active project. Streams over WebSocket.\"\n actions={\n <Inline gap={2} align=\"center\">\n {error !== null && (\n <span role=\"alert\" data-testid=\"chat-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Button variant=\"ghost\" onClick={() => void payload.refetch()} data-testid=\"chat-refresh\">\n <RefreshCw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"ghost\" onClick={() => void audit()} data-testid=\"chat-audit\">\n <ShieldCheck size={14} aria-hidden /> Audit\n </Button>\n <Button variant=\"primary\" onClick={() => void createSession()} data-testid=\"chat-create-session\">\n <MessageSquarePlus size={14} aria-hidden /> New session\n </Button>\n </Inline>\n }\n />\n <Inline align=\"stretch\" gap={3} wrap={false} style={{ minHeight: 480 }}>\n {/* Session list */}\n <Card variant=\"default\" style={{ width: 260, flexShrink: 0 }}>\n <CardBody>\n <Stack gap={2}>\n <strong style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Sessions ({sessions.length})\n </strong>\n {payload.loading && sessions.length === 0 ? (\n <Skeleton style={{ height: 32 }} />\n ) : sessions.length === 0 ? (\n <EmptyState\n icon={<MessageSquarePlus size={28} aria-hidden />}\n title=\"No sessions\"\n description=\"Create one to start chatting.\"\n />\n ) : (\n sessions.map((s) => {\n const isActive = s.id === activeId;\n const isConfirmingDelete = confirmDeleteId === s.id;\n return (\n <div\n key={s.id}\n data-testid={`chat-session-${s.id}`}\n style={{\n padding: 'var(--space-2)',\n borderRadius: 'var(--radius-sm)',\n border: isActive ? '1px solid var(--accent)' : '1px solid var(--border)',\n background: isActive ? 'color-mix(in oklch, var(--accent) 12%, transparent)' : 'var(--surface-0)',\n cursor: 'pointer',\n }}\n onClick={() => { if (!isConfirmingDelete) setActiveId(s.id); }}\n >\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>\n {s.id}\n </span>\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); dropSession(s.id); }}\n data-testid={`chat-session-delete-${s.id}`}\n aria-label={`Delete session ${s.id}`}\n style={{\n background: 'transparent',\n border: 0,\n color: 'var(--fg-muted)',\n cursor: 'pointer',\n fontSize: 'var(--fs-11)',\n }}\n >\n ×\n </button>\n </Inline>\n {s.messageCount !== undefined && (\n <div style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-muted)' }}>\n {s.messageCount} messages\n </div>\n )}\n {isConfirmingDelete && (\n <Inline gap={1} style={{ marginTop: 'var(--space-1)' }}>\n <Button\n variant=\"danger\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n data-testid={`chat-session-confirm-delete-${s.id}`}\n >\n Confirm delete\n </Button>\n <Button\n variant=\"ghost\"\n onClick={(e) => { e.stopPropagation(); setConfirmDeleteId(null); }}\n data-testid={`chat-session-cancel-delete-${s.id}`}\n >\n Cancel\n </Button>\n </Inline>\n )}\n </div>\n );\n })\n )}\n </Stack>\n </CardBody>\n </Card>\n\n {/* Transcript + composer */}\n <Card variant=\"default\" style={{ flex: 1, minWidth: 0 }}>\n <CardBody>\n <Stack gap={2} style={{ height: '100%' }}>\n <div\n data-testid=\"chat-transcript\"\n style={{\n flex: 1,\n minHeight: 320,\n overflowY: 'auto',\n padding: 'var(--space-2)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n background: 'var(--surface-0)',\n }}\n >\n {payload.loading && transcript.length === 0 ? (\n <Skeleton style={{ height: 200 }} />\n ) : transcript.length === 0 && streaming === '' ? (\n <EmptyTranscript />\n ) : (\n <Stack gap={1}>\n {transcript.map((m) => (\n <MessageBubble key={m.id} message={m} onRegenerate={(msg) => void regenerate(msg)} />\n ))}\n {streaming !== '' && (\n <MessageBubble\n message={{\n id: 'streaming',\n ts: new Date().toISOString(),\n role: 'assistant',\n content: streaming,\n }}\n />\n )}\n </Stack>\n )}\n </div>\n <Inline align=\"end\" gap={2}>\n <span style={{ flex: 1, color: 'var(--fg-muted)', fontSize: 'var(--fs-11)' }}>\n Enter to send · Shift+Enter newline\n </span>\n <Button variant=\"primary\" onClick={() => void send()} disabled={busy || draft.trim() === ''} data-testid=\"chat-send\">\n <Send size={14} aria-hidden /> {busy ? 'Sending…' : 'Send'}\n </Button>\n </Inline>\n <Textarea\n value={draft}\n placeholder=\"Ask Claude anything…\"\n rows={4}\n data-testid=\"chat-input\"\n onChange={(e) => setDraft((e.target as HTMLTextAreaElement).value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n void send();\n }\n }}\n />\n </Stack>\n </CardBody>\n </Card>\n </Inline>\n </Stack>\n );\n}"],"names":["MessageSquarePlus","createLucideIcon","readEventStream","url","init","handlers","signal","onChunk","onEvent","onDone","onError","response","reader","decoder","buffer","sawDone","value","done","frames","frame","lines","l","data","event","line","err","ChatView","payload","useFetch","sessionsPayload","activeId","setActiveId","useState","transcript","setTranscript","streaming","setStreaming","draft","setDraft","busy","setBusy","error","setError","confirmDeleteId","setConfirmDeleteId","useEffect","_a","m","s","sessions","useMemo","onChange","useCallback","msg","useWsMessage","send","text","optimistic","prev","ctrl","chunk","cur","parsed","createSession","res","fetchJson","FetchError","regenerate","audit","dropSession","id","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCw","ShieldCheck","Card","CardBody","Skeleton","EmptyState","isActive","isConfirmingDelete","e","EmptyTranscript","MessageBubble","Send","Textarea"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +0,0 @@
1
- import{r as w,j as e}from"./cmdk-DVxytz9i.js";import{u as y,S as n,d as S,I as c,A as k,B as z,h as F}from"./main-Cxeu4LhG.js";import{G as C}from"./Grid-BSXhsCPC.js";import{V as b}from"./ViewHeader-B6P-C4GD.js";import{C as i,b as o}from"./Card-rF59wHiO.js";import{R as B}from"./refresh-cw-ENBVR8hW.js";import{F as R}from"./file-text-CQ12t7Oc.js";function $(t){if(!t||t<=0)return"—";const s=Math.floor(t/86400),a=Math.floor(t%86400/3600),l=Math.floor(t%3600/60);return s>0?`${s}d ${a}h`:a>0?`${a}h ${l}m`:`${l}m`}function H(){var g,m,x,u,j,p,v;const t=y("/api/diagnostics"),s=y("/api/diagnostics/logs?tail=200");w.useEffect(()=>{const r=setInterval(()=>{s.refetch()},1e4);return()=>clearInterval(r)},[s]);const a=(g=t.data)==null?void 0:g.health,l=(m=t.data)==null?void 0:m.uptime,h=((x=t.data)==null?void 0:x.checks)??[],d=((u=s.data)==null?void 0:u.lines)??[],f=((j=s.data)==null?void 0:j.file)??null;return e.jsxs(n,{gap:5,"data-testid":"diagnostics-view",children:[e.jsx(b,{title:"Diagnostics",description:"Live system snapshot + active log tail. Auto-refresh every 10s.",actions:e.jsxs(S,{variant:"ghost",onClick:()=>{t.refetch(),s.refetch()},"data-testid":"diagnostics-refresh",children:[e.jsx(B,{size:14,"aria-hidden":!0})," Refresh"]})}),e.jsxs(C,{cols:3,children:[e.jsx(i,{variant:"default",children:e.jsx(o,{children:e.jsxs(n,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Status"}),e.jsxs(c,{align:"center",gap:2,children:[e.jsx(k,{size:14,"aria-hidden":!0}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)"},children:t.loading?"…":(a==null?void 0:a.status)??"unknown"})]})]})})}),e.jsx(i,{variant:"default",children:e.jsx(o,{children:e.jsxs(n,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Uptime"}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)"},children:$(l)})]})})}),e.jsx(i,{variant:"default",children:e.jsx(o,{children:e.jsxs(n,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Version"}),e.jsx("strong",{style:{fontFamily:"var(--font-mono)"},children:((p=t.data)==null?void 0:p.version)??"—"})]})})})]}),h.length>0&&e.jsx(i,{variant:"default",children:e.jsx(o,{children:e.jsxs(n,{gap:2,children:[e.jsxs("strong",{children:["Checks (",h.length,")"]}),e.jsx(c,{gap:1,wrap:!0,children:h.map(r=>e.jsx(z,{tone:r.status==="ok"?"success":r.status==="warn"?"warning":"danger",children:r.name},r.name))})]})})}),e.jsx(i,{variant:"default",children:e.jsx(o,{children:e.jsxs(n,{gap:2,children:[e.jsxs(c,{align:"center",justify:"between",children:[e.jsxs(c,{align:"center",gap:2,children:[e.jsx(R,{size:14,"aria-hidden":!0}),e.jsx("strong",{children:"Log tail"}),f&&e.jsx("code",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)",fontFamily:"var(--font-mono)"},children:f})]}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[d.length," / ",((v=s.data)==null?void 0:v.total)??0," lines"]})]}),s.loading&&d.length===0?e.jsx(F,{style:{height:240}}):d.length===0?e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-12)"},children:"No log lines yet."}):e.jsx("pre",{"data-testid":"diagnostics-log-tail",style:{maxHeight:320,overflowY:"auto",padding:"var(--space-3)",background:"var(--surface-1)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-12)",fontFamily:"var(--font-mono)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:d.join(`
2
- `)})]})})})]})}export{H as DiagnosticsView};