@polderlabs/bizar 10.4.2 → 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 (220) 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/web/v8/App.tsx +62 -2
  187. package/bizar-dash/src/web/v8/__tests__/chat-view.test.tsx +4 -4
  188. package/bizar-dash/src/web/v8/shell/AppShell.tsx +38 -2
  189. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +44 -33
  190. package/bizar-dash/src/web/v8/shell/Topbar.tsx +5 -2
  191. package/bizar-dash/src/web/v8/ui/styles/globals.css +26 -0
  192. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +26 -1
  193. package/bizar-dash/src/web/v8/views/Chat/ChatView.tsx +13 -1
  194. package/bizar-dash/src/web/v8/views/ClaudeSessions/NewSessionModal.tsx +136 -0
  195. package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +14 -4
  196. package/bizar-dash/src/web/v8/views/Diagnostics/DiagnosticsView.tsx +50 -7
  197. package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +6 -1
  198. package/bizar-dash/src/web/v8/views/Projects/ProjectsView.tsx +21 -1
  199. package/bizar-dash/tests/admin-labels.test.mjs +42 -0
  200. package/bizar-dash/tests/agents-summary-sanitize.test.ts +51 -0
  201. package/bizar-dash/tests/chat-new-session.test.mjs +63 -0
  202. package/bizar-dash/tests/kanban-empty-column.test.mjs +56 -0
  203. package/bizar-dash/tests/library-dedupe.test.mjs +62 -0
  204. package/bizar-dash/tests/projects-filter.test.mjs +48 -0
  205. package/bizar-dash/tests/settings-labels.test.mjs +80 -0
  206. package/bizar-dash/tests/sidebar-responsive.test.tsx +48 -0
  207. package/bizar-dash/tests/sidebar-section-toggle.test.tsx +63 -0
  208. package/package.json +1 -1
  209. package/packages/sdk/package.json +1 -1
  210. package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js +0 -13
  211. package/bizar-dash/dist/assets/AgentsView-Du-G_skK.js.map +0 -1
  212. package/bizar-dash/dist/assets/ChatView-CUriVEgU.js +0 -9
  213. package/bizar-dash/dist/assets/ChatView-CUriVEgU.js.map +0 -1
  214. package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js +0 -2
  215. package/bizar-dash/dist/assets/DiagnosticsView-88OZ5k0f.js.map +0 -1
  216. package/bizar-dash/dist/assets/LibrariesView-B1YX9wzp.js +0 -6
  217. package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js +0 -11
  218. package/bizar-dash/dist/assets/ProjectsView-ChzM12bs.js.map +0 -1
  219. package/bizar-dash/dist/assets/main-Cxeu4LhG.js +0 -244
  220. package/bizar-dash/dist/assets/main-Cxeu4LhG.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { Suspense, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { Menu } from 'lucide-react';
2
3
  import { AppShell } from './shell/AppShell.js';
3
4
  import { Topbar } from './shell/Topbar.js';
4
5
  import { Sidebar, type SidebarSection } from './shell/Sidebar.js';
@@ -139,6 +140,7 @@ function iconFor(id: string): LucideIcon {
139
140
 
140
141
  export function App(): JSX.Element {
141
142
  const [activeId, setActiveId] = useState<string>('overview');
143
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
142
144
  const theme = useTheme();
143
145
  const density = useDensity();
144
146
 
@@ -154,6 +156,36 @@ export function App(): JSX.Element {
154
156
  mainRef.current?.focus({ preventScroll: true });
155
157
  }, [activeId]);
156
158
 
159
+ // H6 — URL routing: sync activeId to/from window.location.hash.
160
+ // On mount, parse the hash (e.g. "#/tasks") and set activeId.
161
+ // On popstate (browser back/forward), re-parse and update.
162
+ // On every activeId change, push the new hash so deep links work.
163
+ useEffect(() => {
164
+ const hash = window.location.hash;
165
+ if (hash.startsWith('#/')) {
166
+ const id = hash.slice(2);
167
+ if (id) setActiveId(id);
168
+ }
169
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps -- mount-only
170
+
171
+ useEffect(() => {
172
+ const onPop = (): void => {
173
+ const hash = window.location.hash;
174
+ if (hash.startsWith('#/')) {
175
+ const id = hash.slice(2);
176
+ if (id) setActiveId(id);
177
+ } else {
178
+ setActiveId('overview');
179
+ }
180
+ };
181
+ window.addEventListener('popstate', onPop);
182
+ return () => window.removeEventListener('popstate', onPop);
183
+ }, []);
184
+
185
+ useEffect(() => {
186
+ window.history.pushState(null, '', '#/' + activeId);
187
+ }, [activeId]);
188
+
157
189
  // Live counts for the sidebar. Polled on mount + WS refresh.
158
190
  const tasksRes = useFetch<{ tasks?: { id: string; status: string }[]; count?: number }>('/api/tasks');
159
191
  const goalsRes = useFetch<{ goals?: { id: string }[]; count?: number }>('/api/goals');
@@ -288,6 +320,29 @@ export function App(): JSX.Element {
288
320
  ref={mainRef}
289
321
  topbar={
290
322
  <Topbar
323
+ leading={
324
+ <button
325
+ type="button"
326
+ aria-label="Open navigation menu"
327
+ data-testid="mobile-menu-toggle"
328
+ onClick={() => setMobileMenuOpen(true)}
329
+ style={{
330
+ display: 'none',
331
+ alignItems: 'center',
332
+ justifyContent: 'center',
333
+ width: 32,
334
+ height: 32,
335
+ background: 'transparent',
336
+ border: '1px solid var(--border)',
337
+ borderRadius: 'var(--radius-sm)',
338
+ color: 'var(--fg-muted)',
339
+ cursor: 'pointer',
340
+ }}
341
+ className="mobile-menu-toggle"
342
+ >
343
+ <Menu size={16} aria-hidden="true" />
344
+ </button>
345
+ }
291
346
  center={
292
347
  <Inline align="center" gap={2}>
293
348
  <button
@@ -330,9 +385,14 @@ export function App(): JSX.Element {
330
385
  sections={sections}
331
386
  defaultSections={false}
332
387
  activeId={activeId}
333
- onItemSelect={handleNavigate}
388
+ onItemSelect={(id) => {
389
+ handleNavigate(id);
390
+ setMobileMenuOpen(false);
391
+ }}
334
392
  />
335
393
  }
394
+ mobileMenuOpen={mobileMenuOpen}
395
+ onMobileMenuClose={() => setMobileMenuOpen(false)}
336
396
  >
337
397
  <Suspense fallback={<PageSkeleton />}>{view}</Suspense>
338
398
  <AppCommandPalette
@@ -342,4 +402,4 @@ export function App(): JSX.Element {
342
402
  />
343
403
  </AppShell>
344
404
  );
345
- }
405
+ }
@@ -92,17 +92,17 @@ describe('S38 ChatView', () => {
92
92
  expect(await screen.findByTestId('chat-bubble-assistant')).toBeTruthy();
93
93
  });
94
94
 
95
- it('POSTs to /api/chat/sessions on `+ New session`', async () => {
96
- const state = installFetchMock([
95
+ it('opens the New session modal on `+ New session` click', async () => {
96
+ installFetchMock([
97
97
  [/^\/api\/chat(\?|$)/, () => jsonResponse(200, { messages: [], sessions: [] })],
98
98
  [/^\/api\/chat\/sessions/, () => jsonResponse(200, { sessions: [] })],
99
99
  ]);
100
100
  render(<ChatView />);
101
101
  const create = await screen.findByTestId('chat-create-session');
102
102
  fireEvent.click(create);
103
+ // Modal should open with title "New Claude session"
103
104
  await waitFor(() => {
104
- const hit = state.posts.find((p) => p.url.endsWith('/api/chat/sessions') && p.method === 'POST');
105
- expect(hit).toBeTruthy();
105
+ expect(screen.getByText('New Claude session')).toBeTruthy();
106
106
  });
107
107
  });
108
108
 
@@ -1,4 +1,5 @@
1
1
  import { forwardRef, type ReactNode } from 'react';
2
+ import * as RxDialog from '@radix-ui/react-dialog';
2
3
  import { Box } from '../ui/primitives/Box.js';
3
4
  import { Topbar } from './Topbar.js';
4
5
  import { Sidebar } from './Sidebar.js';
@@ -27,11 +28,14 @@ import { Sidebar } from './Sidebar.js';
27
28
  export interface AppShellProps {
28
29
  topbar?: ReactNode;
29
30
  sidebar?: ReactNode;
31
+ /** Controls the mobile sidebar drawer (open/close). */
32
+ mobileMenuOpen?: boolean;
33
+ onMobileMenuClose?: () => void;
30
34
  children?: ReactNode;
31
35
  }
32
36
 
33
37
  export const AppShell = forwardRef<HTMLElement, AppShellProps>(function AppShell(
34
- { topbar, sidebar, children },
38
+ { topbar, sidebar, mobileMenuOpen, onMobileMenuClose, children },
35
39
  ref,
36
40
  ) {
37
41
  return (
@@ -55,7 +59,39 @@ export const AppShell = forwardRef<HTMLElement, AppShellProps>(function AppShell
55
59
  minHeight: 0, // critical: lets the body actually scroll instead of expanding
56
60
  }}
57
61
  >
58
- {sidebar ?? <Sidebar />}
62
+ {/* Desktop sidebar always present at >=768px */}
63
+ <Box className="v8-desktop-sidebar" style={{ flexShrink: 0 }}>
64
+ {sidebar ?? <Sidebar />}
65
+ </Box>
66
+
67
+ {/* Mobile sidebar drawer — shown via Dialog overlay on <768px */}
68
+ <RxDialog.Root open={mobileMenuOpen} onOpenChange={(open) => { if (!open) onMobileMenuClose?.(); }}>
69
+ <RxDialog.Portal>
70
+ <RxDialog.Overlay
71
+ className="v8-mobile-sidebar-overlay"
72
+ style={{
73
+ position: 'fixed',
74
+ inset: 0,
75
+ background: 'oklch(0 0 0 / 0.4)',
76
+ zIndex: 'var(--z-modal)',
77
+ }}
78
+ />
79
+ <RxDialog.Content
80
+ className="v8-mobile-sidebar"
81
+ aria-label="Navigation"
82
+ style={{
83
+ position: 'fixed',
84
+ top: 0,
85
+ left: 0,
86
+ bottom: 0,
87
+ width: 'var(--sidebar-w)',
88
+ zIndex: 'calc(var(--z-modal) + 1)',
89
+ }}
90
+ >
91
+ {sidebar ?? <Sidebar />}
92
+ </RxDialog.Content>
93
+ </RxDialog.Portal>
94
+ </RxDialog.Root>
59
95
 
60
96
  <Box
61
97
  as="main"
@@ -359,44 +359,54 @@ function SidebarSectionView({
359
359
  return (
360
360
  <Stack gap={1} data-sidebar-section={section.id}>
361
361
  {!collapsed && (
362
- <button
363
- type="button"
364
- onClick={toggle}
365
- aria-expanded={sectionOpen}
366
- aria-controls={`sidebar-section-${section.id}`}
367
- data-testid={`sidebar-section-toggle-${section.id}`}
368
- style={{
369
- display: 'flex',
370
- alignItems: 'center',
371
- justifyContent: 'space-between',
372
- gap: 'var(--space-2)',
373
- padding: 'var(--space-1) var(--space-3)',
374
- background: 'transparent',
375
- border: 0,
376
- fontSize: 'var(--fs-12)',
377
- fontWeight: 600,
378
- color: 'var(--fg-subtle)',
379
- letterSpacing: 'var(--tracking-wide)',
380
- textTransform: 'uppercase',
381
- cursor: 'pointer',
382
- width: '100%',
383
- textAlign: 'left',
384
- }}
385
- >
386
- <span>{section.label}</span>
362
+ <div role="presentation" style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-2)' }}>
387
363
  <span
388
- aria-hidden="true"
389
- data-testid={`sidebar-section-chevron-${section.id}`}
390
364
  style={{
391
- display: 'inline-block',
392
- transition: 'transform var(--motion-fast) var(--ease-out)',
393
- transform: sectionOpen ? 'rotate(90deg)' : 'rotate(0deg)',
394
- fontSize: 10,
365
+ fontSize: 'var(--fs-12)',
366
+ fontWeight: 600,
367
+ color: 'var(--fg-subtle)',
368
+ letterSpacing: 'var(--tracking-wide)',
369
+ textTransform: 'uppercase',
370
+ flex: 1,
371
+ padding: 'var(--space-1) var(--space-3)',
395
372
  }}
396
373
  >
397
-
374
+ {section.label}
398
375
  </span>
399
- </button>
376
+ <button
377
+ type="button"
378
+ onClick={toggle}
379
+ aria-expanded={sectionOpen}
380
+ aria-controls={`sidebar-section-${section.id}`}
381
+ data-section-toggle={section.id}
382
+ data-testid={`sidebar-section-toggle-${section.id}`}
383
+ style={{
384
+ display: 'inline-flex',
385
+ alignItems: 'center',
386
+ justifyContent: 'center',
387
+ width: 20,
388
+ height: 20,
389
+ background: 'transparent',
390
+ border: 0,
391
+ color: 'var(--fg-subtle)',
392
+ cursor: 'pointer',
393
+ padding: 0,
394
+ }}
395
+ >
396
+ <span
397
+ aria-hidden="true"
398
+ data-testid={`sidebar-section-chevron-${section.id}`}
399
+ style={{
400
+ display: 'inline-block',
401
+ transition: 'transform var(--motion-fast) var(--ease-out)',
402
+ transform: sectionOpen ? 'rotate(90deg)' : 'rotate(0deg)',
403
+ fontSize: 10,
404
+ }}
405
+ >
406
+
407
+ </span>
408
+ </button>
409
+ </div>
400
410
  )}
401
411
  {sectionOpen && (
402
412
  <div id={`sidebar-section-${section.id}`} role="group" aria-label={section.label}>
@@ -435,6 +445,7 @@ function SidebarItemView({
435
445
  aria-label={item.label}
436
446
  title={collapsed ? item.label : undefined}
437
447
  data-sidebar-item={item.id}
448
+ data-nav-item={item.id}
438
449
  className={cx('v8-sidebar-item', active && 'is-active')}
439
450
  style={{
440
451
  display: 'flex',
@@ -28,6 +28,8 @@ import { fetchJson, FetchError } from '../data/fetcher.js';
28
28
 
29
29
  export interface TopbarProps {
30
30
  brand?: ReactNode;
31
+ /** Leading slot — renders before brand (hamburger on mobile). */
32
+ leading?: ReactNode;
31
33
  center?: ReactNode;
32
34
  /** Right-aligned action cluster. */
33
35
  actions?: ReactNode;
@@ -35,7 +37,7 @@ export interface TopbarProps {
35
37
  status?: ReactNode;
36
38
  }
37
39
 
38
- export function Topbar({ brand, center, actions, status }: TopbarProps): JSX.Element {
40
+ export function Topbar({ leading, brand, center, actions, status }: TopbarProps): JSX.Element {
39
41
  return (
40
42
  <Box
41
43
  as="header"
@@ -51,8 +53,9 @@ export function Topbar({ brand, center, actions, status }: TopbarProps): JSX.Ele
51
53
  }}
52
54
  >
53
55
  <Inline align="center" justify="between" gap={4} style={{ height: '100%' }}>
54
- {/* left: brand */}
56
+ {/* left: leading (hamburger) + brand */}
55
57
  <Cluster align="center" gap={3}>
58
+ {leading}
56
59
  {brand ?? <BrandPlaceholder />}
57
60
  </Cluster>
58
61
 
@@ -103,6 +103,32 @@ h4 {
103
103
  font-weight: var(--fw-medium);
104
104
  }
105
105
 
106
+ /* ── mobile sidebar (C2 — < 768px) ─────────────────────────────────── */
107
+ @media (max-width: 767px) {
108
+ /* Desktop sidebar hidden on mobile */
109
+ .v8-desktop-sidebar {
110
+ display: none;
111
+ }
112
+
113
+ /* Show hamburger button on mobile */
114
+ .mobile-menu-toggle {
115
+ display: inline-flex !important;
116
+ }
117
+ }
118
+
119
+ @media (min-width: 768px) {
120
+ /* Mobile sidebar hidden on desktop */
121
+ .v8-mobile-sidebar,
122
+ .v8-mobile-sidebar-overlay {
123
+ display: none !important;
124
+ }
125
+
126
+ /* Hide hamburger on desktop */
127
+ .mobile-menu-toggle {
128
+ display: none !important;
129
+ }
130
+ }
131
+
106
132
  /* ── a11y helpers (see VisuallyHidden primitive) ────────────────────── */
107
133
  .sr-only {
108
134
  position: absolute;
@@ -21,6 +21,31 @@ import type { BizarAgent, CCAgent, WsMessage } from '../../data/types.js';
21
21
  import { AlertTriangle, Bot, Cpu, Pause, Play, Plus, RotateCw } from 'lucide-react';
22
22
  import { AgentHierarchy } from './AgentHierarchy.js';
23
23
 
24
+ /**
25
+ * Strip leaked LLM interior monologue from agent card snippets.
26
+ * Clips to the first sentence, caps at 140 chars.
27
+ */
28
+ export function sanitizeSummary(raw: string | undefined): string {
29
+ if (!raw) return '';
30
+ let s = raw.replace(/<thinking>[\s\S]*?<\/thinking>/gi, '');
31
+ s = s.split('\n').filter((l) => !l.includes('```')).join('\n');
32
+ s = s.replace(/\bworktree:\s*/g, '');
33
+ s = s.replace(/\/tmp\//g, '');
34
+ s = s.replace(/\bReason:\s*/g, '');
35
+ s = s.replace(/^\s*→\s*/gm, '');
36
+ s = s.trim();
37
+ if (!s) return '';
38
+ // Strip leading bracketed prefix — [Premise — …] or [Analysis] etc.
39
+ s = s.replace(/^\[[\w\s]+[-—]\s*/, '');
40
+ s = s.replace(/^\[[\w\s]+\]\s*/gi, '');
41
+ s = s.trim();
42
+ if (!s) return '';
43
+ const m = s.match(/^[^.!?\n]+[.!?]/);
44
+ const first = m ? m[0] : s;
45
+ if (first.length <= 140) return first;
46
+ return first.slice(0, 137) + '…';
47
+ }
48
+
24
49
  const SOURCE_STORAGE_KEY = 'bizar.agents.sourceFilter';
25
50
  const SOURCE_LABELS = {
26
51
  all: 'All',
@@ -94,7 +119,7 @@ function mapCC(a: CCAgent): AgentCardProps {
94
119
  name: a.name || a.sessionId?.slice(0, 8) || 'unknown',
95
120
  role: a.kind === 'background' ? 'CC background' : 'CC interactive',
96
121
  status,
97
- currentTask: a.lastMessageSnippet || undefined,
122
+ currentTask: sanitizeSummary(a.lastMessageSnippet),
98
123
  lastActivity: a.lastMessageAt ? new Date(a.lastMessageAt).toLocaleTimeString() : (a.startedAt ? new Date(a.startedAt).toLocaleTimeString() : undefined),
99
124
  tasksToday: a.messageCount || 0,
100
125
  // CC agents don't expose successRate/tasksSucceeded — only messageCount.
@@ -26,6 +26,7 @@ import { fetchJson, FetchError } from '../../data/fetcher.js';
26
26
  import { MessageBubble, EmptyTranscript } from '../../ui/chat/MessageBubble.js';
27
27
  import { readEventStream } from '../../ui/chat/EventStream.js';
28
28
  import type { ChatMessage, ChatSession, WsMessage } from '../../data/types.js';
29
+ import { NewSessionModal } from '../ClaudeSessions/NewSessionModal.js';
29
30
 
30
31
  interface ChatPayload {
31
32
  messages: ChatMessage[];
@@ -55,6 +56,7 @@ export function ChatView(): JSX.Element {
55
56
  const [busy, setBusy] = useState<boolean>(false);
56
57
  const [error, setError] = useState<string | null>(null);
57
58
  const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);
59
+ const [newSessionOpen, setNewSessionOpen] = useState<boolean>(false);
58
60
 
59
61
  // Seed active session from the first row in the response.
60
62
  useEffect(() => {
@@ -198,7 +200,7 @@ export function ChatView(): JSX.Element {
198
200
  <Button variant="ghost" onClick={() => void audit()} data-testid="chat-audit">
199
201
  <ShieldCheck size={14} aria-hidden /> Audit
200
202
  </Button>
201
- <Button variant="primary" onClick={() => void createSession()} data-testid="chat-create-session">
203
+ <Button variant="primary" onClick={() => setNewSessionOpen(true)} data-testid="chat-create-session">
202
204
  <MessageSquarePlus size={14} aria-hidden /> New session
203
205
  </Button>
204
206
  </Inline>
@@ -351,6 +353,16 @@ export function ChatView(): JSX.Element {
351
353
  </CardBody>
352
354
  </Card>
353
355
  </Inline>
356
+
357
+ <NewSessionModal
358
+ open={newSessionOpen}
359
+ onOpenChange={setNewSessionOpen}
360
+ onCreated={(id) => {
361
+ setActiveId(id);
362
+ void payload.refetch();
363
+ void sessionsPayload.refetch();
364
+ }}
365
+ />
354
366
  </Stack>
355
367
  );
356
368
  }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * NewSessionModal — shared new-session Sheet, extracted from
3
+ * ClaudeSessionsView so ChatView can reuse the same form.
4
+ */
5
+
6
+ import { useState } from 'react';
7
+ import { Stack } from '../../ui/primitives/Stack.js';
8
+ import { Inline } from '../../ui/primitives/Inline.js';
9
+ import { Button } from '../../ui/controls/Button.js';
10
+ import { Input } from '../../ui/controls/Input.js';
11
+ import { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';
12
+ import { fetchJson, FetchError } from '../../data/fetcher.js';
13
+
14
+ interface NewSessionModalProps {
15
+ open: boolean;
16
+ onOpenChange: (open: boolean) => void;
17
+ onCreated: (id: string) => void;
18
+ }
19
+
20
+ export function NewSessionModal({ open, onOpenChange, onCreated }: NewSessionModalProps): JSX.Element {
21
+ return (
22
+ <Sheet open={open} onOpenChange={onOpenChange}>
23
+ <SheetContent side="right" title="New Claude session" description="Spawn a Claude Code session via the runner.">
24
+ <NewSessionForm
25
+ onCreated={(id) => {
26
+ onOpenChange(false);
27
+ onCreated(id);
28
+ }}
29
+ onCancel={() => onOpenChange(false)}
30
+ />
31
+ </SheetContent>
32
+ </Sheet>
33
+ );
34
+ }
35
+
36
+ interface NewSessionFormProps {
37
+ onCreated: (id: string) => void;
38
+ onCancel: () => void;
39
+ }
40
+
41
+ export function NewSessionForm({ onCreated, onCancel }: NewSessionFormProps): JSX.Element {
42
+ const [title, setTitle] = useState<string>('');
43
+ const [agent, setAgent] = useState<string>('general');
44
+ const [prompt, setPrompt] = useState<string>('');
45
+ const [directory, setDirectory] = useState<string>('');
46
+ const [busy, setBusy] = useState<boolean>(false);
47
+ const [error, setError] = useState<string | null>(null);
48
+
49
+ const submit = async (): Promise<void> => {
50
+ if (!agent.trim() || !prompt.trim() || busy) return;
51
+ setBusy(true);
52
+ setError(null);
53
+ try {
54
+ const res = await fetchJson<{ id: string }>('/api/claude-sessions/new', {
55
+ method: 'POST',
56
+ body: {
57
+ title: title.trim() || null,
58
+ agent: agent.trim(),
59
+ prompt: prompt.trim(),
60
+ directory: directory.trim() || undefined,
61
+ },
62
+ });
63
+ onCreated(res.id);
64
+ } catch (err) {
65
+ setError(err instanceof FetchError ? err.message : (err as Error).message);
66
+ } finally {
67
+ setBusy(false);
68
+ }
69
+ };
70
+
71
+ return (
72
+ <Stack gap={3} style={{ padding: 'var(--space-4)' }}>
73
+ <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
74
+ <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>
75
+ <Input
76
+ value={title}
77
+ data-testid="claude-sessions-new-title"
78
+ onChange={(e) => setTitle((e.target as HTMLInputElement).value)}
79
+ />
80
+ </label>
81
+ <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
82
+ <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>
83
+ <Input
84
+ value={agent}
85
+ data-testid="claude-sessions-new-agent"
86
+ onChange={(e) => setAgent((e.target as HTMLInputElement).value)}
87
+ />
88
+ </label>
89
+ <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
90
+ <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Seed prompt</span>
91
+ <textarea
92
+ value={prompt}
93
+ rows={4}
94
+ data-testid="claude-sessions-new-prompt"
95
+ onChange={(e) => setPrompt(e.target.value)}
96
+ style={{
97
+ background: 'var(--surface-0)',
98
+ border: '1px solid var(--border)',
99
+ borderRadius: 'var(--radius-md)',
100
+ padding: 'var(--space-2)',
101
+ color: 'var(--fg)',
102
+ fontFamily: 'var(--font-sans)',
103
+ fontSize: 'var(--fs-13)',
104
+ resize: 'vertical',
105
+ }}
106
+ />
107
+ </label>
108
+ <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>
109
+ <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Working directory (optional)</span>
110
+ <Input
111
+ value={directory}
112
+ data-testid="claude-sessions-new-directory"
113
+ onChange={(e) => setDirectory((e.target as HTMLInputElement).value)}
114
+ />
115
+ </label>
116
+ {error !== null && (
117
+ <span role="alert" data-testid="claude-sessions-new-error" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>
118
+ {error}
119
+ </span>
120
+ )}
121
+ <Inline justify="end" gap={2}>
122
+ <SheetClose asChild>
123
+ <Button variant="ghost" onClick={onCancel} data-testid="claude-sessions-new-cancel">Cancel</Button>
124
+ </SheetClose>
125
+ <Button
126
+ variant="primary"
127
+ onClick={() => void submit()}
128
+ disabled={busy || !agent.trim() || !prompt.trim()}
129
+ data-testid="claude-sessions-new-submit"
130
+ >
131
+ Create
132
+ </Button>
133
+ </Inline>
134
+ </Stack>
135
+ );
136
+ }
@@ -110,6 +110,14 @@ interface Project {
110
110
  cwd?: string;
111
111
  }
112
112
 
113
+ /** Mirror of ProjectsView.isTestProject — keeps test projects out of the palette. */
114
+ function isTestProject(p: Project): boolean {
115
+ return (
116
+ /^(bizar-(e2e|real-env|admin)|bh-(cold-boot|walk-proj))/.test(p.id) ||
117
+ (p.name != null && p.name === p.id)
118
+ );
119
+ }
120
+
113
121
  async function spawnAgent(
114
122
  kind: string,
115
123
  onToast?: AppCommandPaletteProps['onToast'],
@@ -197,10 +205,12 @@ export function AppCommandPalette(props: AppCommandPaletteProps): JSX.Element {
197
205
  void newTask(title, onToast);
198
206
  };
199
207
 
200
- const projectItems: NavItem[] = projects.map((p) => ({
201
- id: `project:${p.id}`,
202
- label: `Switch to ${p.name || p.id}`,
203
- }));
208
+ const projectItems: NavItem[] = projects
209
+ .filter((p) => !isTestProject(p))
210
+ .map((p) => ({
211
+ id: `project:${p.id}`,
212
+ label: `Switch to ${p.name || p.id}`,
213
+ }));
204
214
 
205
215
  return (
206
216
  <Dialog open={open} onOpenChange={onOpenChange}>