@polderlabs/bizar 10.4.3 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/bizar-dash/dist/assets/{ActivityFeed-DC0JiK49.js → ActivityFeed-Bw4Cai7r.js} +1 -1
  2. package/bizar-dash/dist/assets/{ActivityFeed-DC0JiK49.js.map → ActivityFeed-Bw4Cai7r.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js → ActivityView-BC0QQ_j9.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-ubEDAWMY.js.map → ActivityView-BC0QQ_j9.js.map} +1 -1
  5. package/bizar-dash/dist/assets/AdminView-CLTNKFL4.js +11 -0
  6. package/bizar-dash/dist/assets/AdminView-CLTNKFL4.js.map +1 -0
  7. package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js → AgentActivity-DBWDByjk.js} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-BLcqqkt2.js.map → AgentActivity-DBWDByjk.js.map} +1 -1
  9. package/bizar-dash/dist/assets/{AgentsView-CIQkZH8_.js → AgentsView-DD6bCIbA.js} +4 -4
  10. package/bizar-dash/dist/assets/AgentsView-DD6bCIbA.js.map +1 -0
  11. package/bizar-dash/dist/assets/{Alert-MwVEymjy.js → Alert-pzFISNtS.js} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-MwVEymjy.js.map → Alert-pzFISNtS.js.map} +1 -1
  13. package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js +21 -0
  14. package/bizar-dash/dist/assets/ArtifactsView-BVU5lfo7.js.map +1 -0
  15. package/bizar-dash/dist/assets/{AuthView-LaQuGo4u.js → AuthView-BZ-bPIOM.js} +2 -2
  16. package/bizar-dash/dist/assets/AuthView-BZ-bPIOM.js.map +1 -0
  17. package/bizar-dash/dist/assets/Avatar-CRW81ewE.js +6 -0
  18. package/bizar-dash/dist/assets/Avatar-CRW81ewE.js.map +1 -0
  19. package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js +1 -0
  20. package/bizar-dash/dist/assets/BackgroundJobsView-w8OZtXyI.js.map +1 -0
  21. package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js → BackupView-u_O3j0TG.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-Cjf23ZWc.js.map → BackupView-u_O3j0TG.js.map} +1 -1
  23. package/bizar-dash/dist/assets/Banner-Du-3l05O.js +1 -0
  24. package/bizar-dash/dist/assets/Banner-Du-3l05O.js.map +1 -0
  25. package/bizar-dash/dist/assets/{Card-BmXiT4c6.js → Card-Clkvh43Q.js} +1 -1
  26. package/bizar-dash/dist/assets/{Card-BmXiT4c6.js.map → Card-Clkvh43Q.js.map} +1 -1
  27. package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js → ChatView-BTjb3mIh.js} +3 -3
  28. package/bizar-dash/dist/assets/{ChatView-DXKFwvgp.js.map → ChatView-BTjb3mIh.js.map} +1 -1
  29. package/bizar-dash/dist/assets/{Chip-Dei66BLx.js → Chip-B7ovcm01.js} +1 -1
  30. package/bizar-dash/dist/assets/{Chip-Dei66BLx.js.map → Chip-B7ovcm01.js.map} +1 -1
  31. package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js +1 -0
  32. package/bizar-dash/dist/assets/ClaudeSessionsView-BoZS5ldi.js.map +1 -0
  33. package/bizar-dash/dist/assets/ClipboardView-Cb6XgYZI.js +1 -0
  34. package/bizar-dash/dist/assets/ClipboardView-Cb6XgYZI.js.map +1 -0
  35. package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js → ConfigView-DfTJk1uL.js} +1 -1
  36. package/bizar-dash/dist/assets/{ConfigView-BMBgifw5.js.map → ConfigView-DfTJk1uL.js.map} +1 -1
  37. package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js → DiagnosticsView-D5Wy9xlJ.js} +1 -1
  38. package/bizar-dash/dist/assets/{DiagnosticsView-C0sdqhEl.js.map → DiagnosticsView-D5Wy9xlJ.js.map} +1 -1
  39. package/bizar-dash/dist/assets/DialogsView-HVyfrXpq.js +6 -0
  40. package/bizar-dash/dist/assets/DialogsView-HVyfrXpq.js.map +1 -0
  41. package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js → DoctorView-Dm94WI2z.js} +2 -2
  42. package/bizar-dash/dist/assets/{DoctorView-CiFwRMW0.js.map → DoctorView-Dm94WI2z.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js → EmptyState-ccT__JZG.js} +1 -1
  44. package/bizar-dash/dist/assets/{EmptyState-CdDQmfEL.js.map → EmptyState-ccT__JZG.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js → EnvVarsView-BhcIuJ6V.js} +3 -3
  46. package/bizar-dash/dist/assets/{EnvVarsView-CNO03NDJ.js.map → EnvVarsView-BhcIuJ6V.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js → ErrorState-BSqf65ka.js} +1 -1
  48. package/bizar-dash/dist/assets/{ErrorState-BRvj8qZZ.js.map → ErrorState-BSqf65ka.js.map} +1 -1
  49. package/bizar-dash/dist/assets/EvalView-2cbWVBUA.js +1 -0
  50. package/bizar-dash/dist/assets/{EvalView-lgUhlGJh.js.map → EvalView-2cbWVBUA.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js → GoalsView-C3QG5p7T.js} +1 -1
  52. package/bizar-dash/dist/assets/{GoalsView-DmkCCs9i.js.map → GoalsView-C3QG5p7T.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{Grid-BThCPJaV.js → Grid-Bojq8Sg7.js} +1 -1
  54. package/bizar-dash/dist/assets/{Grid-BThCPJaV.js.map → Grid-Bojq8Sg7.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js → HistoryView-Bum2TMMw.js} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-Cn2cPiHZ.js.map → HistoryView-Bum2TMMw.js.map} +1 -1
  57. package/bizar-dash/dist/assets/{Input-cAQOvR8U.js → Input-DV-vdaV8.js} +1 -1
  58. package/bizar-dash/dist/assets/{Input-cAQOvR8U.js.map → Input-DV-vdaV8.js.map} +1 -1
  59. package/bizar-dash/dist/assets/LibrariesView-DH2E2uNb.js +6 -0
  60. package/bizar-dash/dist/assets/{LibrariesView-Ca_PRjUm.js.map → LibrariesView-DH2E2uNb.js.map} +1 -1
  61. package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js +6 -0
  62. package/bizar-dash/dist/assets/LightRAGView-BFCcj7Tl.js.map +1 -0
  63. package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js → ListHeader-CCD_nIHb.js} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-BLAeshe0.js.map → ListHeader-CCD_nIHb.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js → MemoryView-Cr-obIQY.js} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-wo2Pu7xQ.js.map → MemoryView-Cr-obIQY.js.map} +1 -1
  67. package/bizar-dash/dist/assets/MiscView-CDUQpYuV.js +1 -0
  68. package/bizar-dash/dist/assets/MiscView-CDUQpYuV.js.map +1 -0
  69. package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js → ModsView-B6OR-a4B.js} +2 -2
  70. package/bizar-dash/dist/assets/{ModsView-CV_RxdzJ.js.map → ModsView-B6OR-a4B.js.map} +1 -1
  71. package/bizar-dash/dist/assets/NotificationsView-CIqtY6D0.js +6 -0
  72. package/bizar-dash/dist/assets/NotificationsView-CIqtY6D0.js.map +1 -0
  73. package/bizar-dash/dist/assets/ObsidianView-Nahah8QC.js +1 -0
  74. package/bizar-dash/dist/assets/{ObsidianView-C-AvHfpT.js.map → ObsidianView-Nahah8QC.js.map} +1 -1
  75. package/bizar-dash/dist/assets/OverviewView-B6L_wa4M.js +1 -0
  76. package/bizar-dash/dist/assets/OverviewView-B6L_wa4M.js.map +1 -0
  77. package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js → ProgressBar-KC4VXsl_.js} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-ya2PCj8L.js.map → ProgressBar-KC4VXsl_.js.map} +1 -1
  79. package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js → ProjectsView-DgxWiqHb.js} +1 -1
  80. package/bizar-dash/dist/assets/{ProjectsView-N9zqFZ_O.js.map → ProjectsView-DgxWiqHb.js.map} +1 -1
  81. package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js → ProvidersView-BOqN9omv.js} +2 -2
  82. package/bizar-dash/dist/assets/{ProvidersView-BcL8jjwK.js.map → ProvidersView-BOqN9omv.js.map} +1 -1
  83. package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js +1 -0
  84. package/bizar-dash/dist/assets/SchedulesView-yMaG3Dtd.js.map +1 -0
  85. package/bizar-dash/dist/assets/{Select-D5AuVxxV.js → Select-Bf_P0S6H.js} +1 -1
  86. package/bizar-dash/dist/assets/{Select-D5AuVxxV.js.map → Select-Bf_P0S6H.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js → SettingsRow-CJb-F94Y.js} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-BBALf9dA.js.map → SettingsRow-CJb-F94Y.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsView-UD403neY.js → SettingsView-BvOGcgMS.js} +2 -2
  90. package/bizar-dash/dist/assets/SettingsView-BvOGcgMS.js.map +1 -0
  91. package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js → Sheet-BwMVGN-8.js} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-CxXf6gvC.js.map → Sheet-BwMVGN-8.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js → Slider-AjjzqI-5.js} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-hvaVD_SW.js.map → Slider-AjjzqI-5.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js → Sparkline-Z4y0YUZS.js} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-DqmQzdJH.js.map → Sparkline-Z4y0YUZS.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js → Switch-B79a2t-G.js} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-C-_zcNdl.js.map → Switch-B79a2t-G.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{TasksView-DseftDlx.js → TasksView-G-s_pwwr.js} +2 -2
  100. package/bizar-dash/dist/assets/{TasksView-DseftDlx.js.map → TasksView-G-s_pwwr.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js → Textarea-BfXGMXQ7.js} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-CcQGSgSH.js.map → Textarea-BfXGMXQ7.js.map} +1 -1
  103. package/bizar-dash/dist/assets/UpdateView-BKx3u9X8.js +1 -0
  104. package/bizar-dash/dist/assets/UpdateView-BKx3u9X8.js.map +1 -0
  105. package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js → UsageView-M01G6bZQ.js} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-P5_pQ68d.js.map → UsageView-M01G6bZQ.js.map} +1 -1
  107. package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js → ViewHeader-BsnaspKw.js} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-BaCWNuVX.js.map → ViewHeader-BsnaspKw.js.map} +1 -1
  109. package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js +1 -0
  110. package/bizar-dash/dist/assets/VoiceView-rWE8vziD.js.map +1 -0
  111. package/bizar-dash/dist/assets/{brain-D6tAeUDE.js → brain-D7k5s8vH.js} +1 -1
  112. package/bizar-dash/dist/assets/{brain-D6tAeUDE.js.map → brain-D7k5s8vH.js.map} +1 -1
  113. package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js → calendar-CAZoDd-l.js} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-BrMJf3vl.js.map → calendar-CAZoDd-l.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{circle-fPTATiOs.js → circle-D99cZJBr.js} +1 -1
  116. package/bizar-dash/dist/assets/{circle-fPTATiOs.js.map → circle-D99cZJBr.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js → circle-alert-QQTU4Quz.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-alert-D7jn06kH.js.map → circle-alert-QQTU4Quz.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js → circle-check-BMbe7Kkr.js} +1 -1
  120. package/bizar-dash/dist/assets/{circle-check-DHs37Sot.js.map → circle-check-BMbe7Kkr.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{clock-E-G5aGua.js → clock-OtT5mvF3.js} +1 -1
  122. package/bizar-dash/dist/assets/{clock-E-G5aGua.js.map → clock-OtT5mvF3.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{download-DBkNb6oI.js → download-B-mPX5P_.js} +1 -1
  124. package/bizar-dash/dist/assets/{download-DBkNb6oI.js.map → download-B-mPX5P_.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js → external-link-DPDQM1YO.js} +1 -1
  126. package/bizar-dash/dist/assets/{external-link-C4pHGbz2.js.map → external-link-DPDQM1YO.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js → file-text-BsCrv5aP.js} +1 -1
  128. package/bizar-dash/dist/assets/{file-text-CEhDgLq2.js.map → file-text-BsCrv5aP.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{filter-CEYjeWFX.js → filter-Do63x17E.js} +1 -1
  130. package/bizar-dash/dist/assets/{filter-CEYjeWFX.js.map → filter-Do63x17E.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js → git-pull-request-CpRAmERC.js} +1 -1
  132. package/bizar-dash/dist/assets/{git-pull-request-Bo_wBZZw.js.map → git-pull-request-CpRAmERC.js.map} +1 -1
  133. package/bizar-dash/dist/assets/main-BRmJZcHt.js +277 -0
  134. package/bizar-dash/dist/assets/main-BRmJZcHt.js.map +1 -0
  135. package/bizar-dash/dist/assets/main-D0TY0myE.css +1 -0
  136. package/bizar-dash/dist/assets/{network-BsfwrUA-.js → network-DJnHwHX3.js} +1 -1
  137. package/bizar-dash/dist/assets/{network-BsfwrUA-.js.map → network-DJnHwHX3.js.map} +1 -1
  138. package/bizar-dash/dist/assets/{pause-C8PN1_yO.js → pause-HitDUnk_.js} +1 -1
  139. package/bizar-dash/dist/assets/{pause-C8PN1_yO.js.map → pause-HitDUnk_.js.map} +1 -1
  140. package/bizar-dash/dist/assets/{pencil---XuvKlz.js → pencil-Dkks7eIC.js} +1 -1
  141. package/bizar-dash/dist/assets/{pencil---XuvKlz.js.map → pencil-Dkks7eIC.js.map} +1 -1
  142. package/bizar-dash/dist/assets/{play-fMLPTihK.js → play-blqh0msT.js} +2 -2
  143. package/bizar-dash/dist/assets/{play-fMLPTihK.js.map → play-blqh0msT.js.map} +1 -1
  144. package/bizar-dash/dist/assets/{plug-CG8al2Kq.js → plug-DVvSSe40.js} +1 -1
  145. package/bizar-dash/dist/assets/{plug-CG8al2Kq.js.map → plug-DVvSSe40.js.map} +1 -1
  146. package/bizar-dash/dist/assets/{plus-uA5Ecuch.js → plus-Cps-8lcG.js} +1 -1
  147. package/bizar-dash/dist/assets/{plus-uA5Ecuch.js.map → plus-Cps-8lcG.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{power-DSUlNIuR.js → power-DEX4_Xoa.js} +1 -1
  149. package/bizar-dash/dist/assets/{power-DSUlNIuR.js.map → power-DEX4_Xoa.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js → power-off-upZ4xjaG.js} +1 -1
  151. package/bizar-dash/dist/assets/{power-off-1CAQsHHy.js.map → power-off-upZ4xjaG.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js → refresh-ccw-DN_zCB1h.js} +1 -1
  153. package/bizar-dash/dist/assets/{refresh-ccw-BL7B0NO1.js.map → refresh-ccw-DN_zCB1h.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js → refresh-cw-KGm5eQgv.js} +1 -1
  155. package/bizar-dash/dist/assets/{refresh-cw-CR9BzJik.js.map → refresh-cw-KGm5eQgv.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js → rotate-ccw-D5fkDRgk.js} +1 -1
  157. package/bizar-dash/dist/assets/{rotate-ccw-BtnitLfb.js.map → rotate-ccw-D5fkDRgk.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js → rotate-cw-CClSVUaX.js} +1 -1
  159. package/bizar-dash/dist/assets/{rotate-cw-CHgXCO7O.js.map → rotate-cw-CClSVUaX.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{save-RcZOXR0U.js → save-BY4ViPku.js} +1 -1
  161. package/bizar-dash/dist/assets/{save-RcZOXR0U.js.map → save-BY4ViPku.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{send-Bg2X_ibk.js → send-CaOL1yQD.js} +2 -2
  163. package/bizar-dash/dist/assets/{send-Bg2X_ibk.js.map → send-CaOL1yQD.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js → shield-alert-DA9K6uZO.js} +1 -1
  165. package/bizar-dash/dist/assets/{shield-alert-Dm48D034.js.map → shield-alert-DA9K6uZO.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{trash-2-B885GY46.js → trash-2-B_Y6HrfN.js} +2 -2
  167. package/bizar-dash/dist/assets/{trash-2-B885GY46.js.map → trash-2-B_Y6HrfN.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js → trending-up-qKTUQKIT.js} +1 -1
  169. package/bizar-dash/dist/assets/{trending-up-CqUBvVxw.js.map → trending-up-qKTUQKIT.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js → triangle-alert-BeY8LAv6.js} +1 -1
  171. package/bizar-dash/dist/assets/{triangle-alert-DLmUhymD.js.map → triangle-alert-BeY8LAv6.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{upload-C-oafpyE.js → upload-BZCtmqIh.js} +1 -1
  173. package/bizar-dash/dist/assets/{upload-C-oafpyE.js.map → upload-BZCtmqIh.js.map} +1 -1
  174. package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js → zap-Bz1Z8y1Q.js} +2 -2
  175. package/bizar-dash/dist/assets/{zap-O_4Ys_hh.js.map → zap-Bz1Z8y1Q.js.map} +1 -1
  176. package/bizar-dash/dist/index.html +2 -2
  177. package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  178. package/bizar-dash/src/web/v8/App.tsx +25 -4
  179. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +49 -36
  180. package/bizar-dash/src/web/v8/shell/Topbar.tsx +120 -24
  181. package/bizar-dash/src/web/v8/ui/feedback/NotificationsPopover.tsx +3 -0
  182. package/bizar-dash/src/web/v8/ui/feedback/useFocusTrap.ts +58 -0
  183. package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +1 -0
  184. package/bizar-dash/src/web/v8/ui/styles/globals.css +14 -0
  185. package/bizar-dash/src/web/v8/ui/styles/tokens.css +21 -0
  186. package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +11 -6
  187. package/bizar-dash/src/web/v8/views/Admin/AdminView.tsx +32 -5
  188. package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +11 -4
  189. package/bizar-dash/src/web/v8/views/Artifacts/ArtifactsView.tsx +1 -1
  190. package/bizar-dash/src/web/v8/views/Artifacts/ClaudeArtifactView.tsx +1 -1
  191. package/bizar-dash/src/web/v8/views/Auth/AuthView.tsx +10 -6
  192. package/bizar-dash/src/web/v8/views/BackgroundJobs/BackgroundJobsView.tsx +38 -13
  193. package/bizar-dash/src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx +16 -5
  194. package/bizar-dash/src/web/v8/views/Clipboard/ClipboardView.tsx +1 -1
  195. package/bizar-dash/src/web/v8/views/Dialogs/DialogsView.tsx +1 -1
  196. package/bizar-dash/src/web/v8/views/LightRAG/LightRAGView.tsx +23 -2
  197. package/bizar-dash/src/web/v8/views/Misc/MiscView.tsx +1 -1
  198. package/bizar-dash/src/web/v8/views/Notifications/NotificationsView.tsx +82 -13
  199. package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +19 -0
  200. package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +48 -13
  201. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +3 -3
  202. package/bizar-dash/src/web/v8/views/Voice/VoiceView.tsx +1 -1
  203. package/bizar-dash/tests/admin-run-grouping.test.mjs +42 -0
  204. package/bizar-dash/tests/agents-preview-truncate.test.mjs +35 -0
  205. package/bizar-dash/tests/auth-inputs-labels.test.mjs +45 -0
  206. package/bizar-dash/tests/background-jobs-action-labels.test.mjs +41 -0
  207. package/bizar-dash/tests/background-jobs-states.test.mjs +80 -0
  208. package/bizar-dash/tests/banner-tones.test.mjs +50 -0
  209. package/bizar-dash/tests/callout-tokens.test.mjs +30 -0
  210. package/bizar-dash/tests/claude-session-detail-states.test.mjs +67 -0
  211. package/bizar-dash/tests/components/BackgroundJobsSkeleton.test.tsx +38 -0
  212. package/bizar-dash/tests/density-tokens.test.mjs +46 -0
  213. package/bizar-dash/tests/doctor-route-shape.test.mjs +67 -0
  214. package/bizar-dash/tests/empty-state-docs.test.mjs +55 -0
  215. package/bizar-dash/tests/errorstate-retry.test.mjs +42 -0
  216. package/bizar-dash/tests/focus-visible.test.mjs +30 -0
  217. package/bizar-dash/tests/lightrag-skeleton.test.mjs +31 -0
  218. package/bizar-dash/tests/lightrag-states.test.mjs +60 -0
  219. package/bizar-dash/tests/modal-focus-trap.test.mjs +114 -0
  220. package/bizar-dash/tests/notifications-dismiss-restore.test.mjs +85 -0
  221. package/bizar-dash/tests/orphan-tests-audit.test.mjs +80 -0
  222. package/bizar-dash/tests/palette-keyboard-nav.test.mjs +123 -0
  223. package/bizar-dash/tests/palette-shortcut-hint.test.mjs +58 -0
  224. package/bizar-dash/tests/schedules-skeleton.test.mjs +25 -0
  225. package/bizar-dash/tests/schedules-states.test.mjs +67 -0
  226. package/bizar-dash/tests/sidebar-collapse-animation.test.mjs +37 -0
  227. package/bizar-dash/tests/sidebar-distinct-icons.test.mjs +28 -0
  228. package/bizar-dash/tests/sidebar-section-styles.test.mjs +55 -0
  229. package/bizar-dash/tests/skeleton-height.test.mjs +47 -0
  230. package/bizar-dash/tests/space-tokens.test.mjs +36 -0
  231. package/bizar-dash/tests/stattile-loading.test.mjs +28 -0
  232. package/bizar-dash/tests/theme-toggle-icon.test.mjs +28 -0
  233. package/bizar-dash/tests/topbar-design-system.test.mjs +56 -0
  234. package/bizar-dash/tests/topbar-popover-styles.test.mjs +53 -0
  235. package/bizar-dash/tests/update-channels.test.mjs +67 -0
  236. package/bizar-dash/vite.config.ts +8 -0
  237. package/package.json +1 -1
  238. package/packages/sdk/${HOME}/.bizar_home/memory/projects/sdk/sessions/2026-07-16-e16c2f59.md +14 -0
  239. package/packages/sdk/.bizar/learning/instincts.jsonl +5 -0
  240. package/packages/sdk/package.json +1 -1
  241. package/scripts/loop-log.txt +29 -0
  242. package/scripts/loop-tasks.md +79 -0
  243. package/scripts/overnight-loop.mjs +60 -0
  244. package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js +0 -11
  245. package/bizar-dash/dist/assets/AdminView-CI4zM2Qg.js.map +0 -1
  246. package/bizar-dash/dist/assets/AgentsView-CIQkZH8_.js.map +0 -1
  247. package/bizar-dash/dist/assets/ArtifactsView-B-YUwZyb.js +0 -21
  248. package/bizar-dash/dist/assets/ArtifactsView-B-YUwZyb.js.map +0 -1
  249. package/bizar-dash/dist/assets/AuthView-LaQuGo4u.js.map +0 -1
  250. package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js +0 -6
  251. package/bizar-dash/dist/assets/Avatar-Dg4OF4RD.js.map +0 -1
  252. package/bizar-dash/dist/assets/BackgroundJobsView-CO3DEG8R.js +0 -1
  253. package/bizar-dash/dist/assets/BackgroundJobsView-CO3DEG8R.js.map +0 -1
  254. package/bizar-dash/dist/assets/ClaudeSessionsView-D-YNmzKi.js +0 -1
  255. package/bizar-dash/dist/assets/ClaudeSessionsView-D-YNmzKi.js.map +0 -1
  256. package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js +0 -1
  257. package/bizar-dash/dist/assets/ClipboardView-BA323V2J.js.map +0 -1
  258. package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js +0 -6
  259. package/bizar-dash/dist/assets/DialogsView-DzTnyX8K.js.map +0 -1
  260. package/bizar-dash/dist/assets/EvalView-lgUhlGJh.js +0 -1
  261. package/bizar-dash/dist/assets/LibrariesView-Ca_PRjUm.js +0 -6
  262. package/bizar-dash/dist/assets/LightRAGView-CMk9wOae.js +0 -6
  263. package/bizar-dash/dist/assets/LightRAGView-CMk9wOae.js.map +0 -1
  264. package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js +0 -1
  265. package/bizar-dash/dist/assets/MiscView-fBT1TOXC.js.map +0 -1
  266. package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js +0 -6
  267. package/bizar-dash/dist/assets/NotificationsView-BKAZLxM2.js.map +0 -1
  268. package/bizar-dash/dist/assets/ObsidianView-C-AvHfpT.js +0 -1
  269. package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js +0 -1
  270. package/bizar-dash/dist/assets/OverviewView-CKYzZJe3.js.map +0 -1
  271. package/bizar-dash/dist/assets/SchedulesView-8qxH3bg7.js +0 -1
  272. package/bizar-dash/dist/assets/SchedulesView-8qxH3bg7.js.map +0 -1
  273. package/bizar-dash/dist/assets/SettingsView-UD403neY.js.map +0 -1
  274. package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js +0 -6
  275. package/bizar-dash/dist/assets/UpdateView-B9Lh4svM.js.map +0 -1
  276. package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js +0 -1
  277. package/bizar-dash/dist/assets/VoiceView-BwR9gm5e.js.map +0 -1
  278. package/bizar-dash/dist/assets/main-BZMmD6a8.js +0 -249
  279. package/bizar-dash/dist/assets/main-BZMmD6a8.js.map +0 -1
  280. package/bizar-dash/dist/assets/main-DDAMz_H5.css +0 -1
  281. package/bizar-dash/tests/chat-session-create.test.mjs +0 -391
  282. package/bizar-dash/tests/chat-session-stream.test.mjs +0 -308
  283. package/bizar-dash/tests/cline-runner.test.mjs +0 -172
  284. package/bizar-dash/tests/cline-sessions-detail.test.mjs +0 -434
@@ -1 +0,0 @@
1
- :root{--bg: oklch(.99 0 0);--surface-1: oklch(.97 0 0);--surface-2: oklch(.95 0 0);--surface-3: oklch(.93 0 0);--surface-popover: oklch(.99 0 0);--fg: oklch(.2 0 0);--fg-muted: oklch(.45 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.99 0 0);--fg-link: oklch(.527 .154 150.069);--accent: oklch(.527 .154 150.069);--accent-hover: oklch(.475 .154 150.069);--accent-soft: oklch(.93 .04 150);--accent-ring: oklch(.527 .154 150.069 / .4);--success: oklch(.55 .13 150);--warning: oklch(.72 .15 80);--danger: oklch(.55 .2 25);--info: oklch(.55 .13 240);--border: oklch(.9 0 0);--border-strong: oklch(.85 0 0);--input-bg: oklch(.99 0 0);--focus-ring: oklch(.527 .154 150.069);--chart-1: oklch(.55 0 0);--chart-2: oklch(.4 0 0);--chart-3: oklch(.7 0 0);--chart-4: oklch(.25 0 0);--chart-5: oklch(.85 0 0);--chart-accent: oklch(.527 .154 150.069);--sidebar-bg: oklch(.97 0 0);--sidebar-fg: oklch(.2 0 0);--sidebar-accent: oklch(.527 .154 150.069);--sidebar-accent-fg: oklch(.99 0 0);--sidebar-hover: oklch(.93 0 0);--sidebar-border: oklch(.9 0 0);--radius: 10px;--radius-sm: 6px;--radius-lg: 14px;--radius-pill: 9999px;--shadow-1: 0 1px 2px oklch(0 0 0 / .04), 0 1px 1px oklch(0 0 0 / .02);--shadow-2: 0 2px 4px oklch(0 0 0 / .06), 0 1px 2px oklch(0 0 0 / .04);--shadow-3: 0 8px 16px oklch(0 0 0 / .08), 0 2px 4px oklch(0 0 0 / .04);--shadow-4: 0 16px 32px oklch(0 0 0 / .1), 0 4px 8px oklch(0 0 0 / .06);--motion-instant: 50ms;--motion-fast: .12s;--motion-base: .2s;--motion-slow: .32s;--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--z-base: 0;--z-sticky: 10;--z-dropdown: 1000;--z-sticky-nav: 1100;--z-overlay: 1300;--z-modal: 1400;--z-popover: 1500;--z-toast: 1600;--z-tooltip: 1700;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--space-16: 64px;--topbar-h: 56px;--sidebar-w: 260px;--sidebar-w-collapsed: 60px;--statusbar-h: 32px}@media (prefers-color-scheme: dark){:root{--bg: oklch(.18 0 0);--surface-1: oklch(.22 0 0);--surface-2: oklch(.25 0 0);--surface-3: oklch(.28 0 0);--surface-popover: oklch(.25 0 0);--fg: oklch(.97 0 0);--fg-muted: oklch(.75 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.15 0 0);--fg-link: oklch(.448 .119 151.328);--accent: oklch(.448 .119 151.328);--accent-hover: oklch(.5 .119 151.328);--accent-soft: oklch(.3 .04 150);--accent-ring: oklch(.448 .119 151.328 / .4);--success: oklch(.65 .13 150);--warning: oklch(.75 .15 80);--danger: oklch(.65 .2 25);--info: oklch(.65 .13 240);--border: oklch(.3 0 0);--border-strong: oklch(.35 0 0);--input-bg: oklch(.22 0 0);--focus-ring: oklch(.448 .119 151.328);--chart-1: oklch(.75 0 0);--chart-2: oklch(.6 0 0);--chart-3: oklch(.85 0 0);--chart-4: oklch(.5 0 0);--chart-5: oklch(.3 0 0);--chart-accent: oklch(.448 .119 151.328);--sidebar-bg: oklch(.2 0 0);--sidebar-fg: oklch(.95 0 0);--sidebar-accent: oklch(.448 .119 151.328);--sidebar-accent-fg: oklch(.15 0 0);--sidebar-hover: oklch(.25 0 0);--sidebar-border: oklch(.3 0 0);--shadow-1: 0 1px 2px oklch(0 0 0 / .2), 0 1px 1px oklch(0 0 0 / .1);--shadow-2: 0 2px 4px oklch(0 0 0 / .3), 0 1px 2px oklch(0 0 0 / .2);--shadow-3: 0 8px 16px oklch(0 0 0 / .4), 0 2px 4px oklch(0 0 0 / .2);--shadow-4: 0 16px 32px oklch(0 0 0 / .5), 0 4px 8px oklch(0 0 0 / .3)}}:root[data-theme=light]{--bg: oklch(.99 0 0);--surface-1: oklch(.97 0 0);--surface-2: oklch(.95 0 0);--surface-3: oklch(.93 0 0);--surface-popover: oklch(.99 0 0);--fg: oklch(.2 0 0);--fg-muted: oklch(.45 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.99 0 0);--accent: oklch(.527 .154 150.069);--accent-hover: oklch(.475 .154 150.069);--accent-soft: oklch(.93 .04 150);--accent-ring: oklch(.527 .154 150.069 / .4);--border: oklch(.9 0 0);--border-strong: oklch(.85 0 0);--input-bg: oklch(.99 0 0);--focus-ring: oklch(.527 .154 150.069);--sidebar-bg: oklch(.97 0 0);--sidebar-fg: oklch(.2 0 0);--sidebar-accent: oklch(.527 .154 150.069);--sidebar-accent-fg: oklch(.99 0 0);--sidebar-hover: oklch(.93 0 0);--sidebar-border: oklch(.9 0 0)}:root[data-theme=dark]{--bg: oklch(.18 0 0);--surface-1: oklch(.22 0 0);--surface-2: oklch(.25 0 0);--surface-3: oklch(.28 0 0);--surface-popover: oklch(.25 0 0);--fg: oklch(.97 0 0);--fg-muted: oklch(.75 0 0);--fg-subtle: oklch(.6 0 0);--fg-on-accent: oklch(.15 0 0);--accent: oklch(.448 .119 151.328);--accent-hover: oklch(.5 .119 151.328);--accent-soft: oklch(.3 .04 150);--accent-ring: oklch(.448 .119 151.328 / .4);--border: oklch(.3 0 0);--border-strong: oklch(.35 0 0);--input-bg: oklch(.22 0 0);--focus-ring: oklch(.448 .119 151.328);--sidebar-bg: oklch(.2 0 0);--sidebar-fg: oklch(.95 0 0);--sidebar-accent: oklch(.448 .119 151.328);--sidebar-accent-fg: oklch(.15 0 0);--sidebar-hover: oklch(.25 0 0);--sidebar-border: oklch(.3 0 0);--shadow-1: 0 1px 2px oklch(0 0 0 / .2), 0 1px 1px oklch(0 0 0 / .1);--shadow-2: 0 2px 4px oklch(0 0 0 / .3), 0 1px 2px oklch(0 0 0 / .2);--shadow-3: 0 8px 16px oklch(0 0 0 / .4), 0 2px 4px oklch(0 0 0 / .2);--shadow-4: 0 16px 32px oklch(0 0 0 / .5), 0 4px 8px oklch(0 0 0 / .3)}@media (prefers-reduced-motion: reduce){:root{--motion-instant: 0ms;--motion-fast: 0ms;--motion-base: 0ms;--motion-slow: 0ms}}*,*:before,*:after{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{list-style:none;padding:0;margin:0}a{color:inherit;text-decoration:none}img,picture,video,canvas,svg{display:block;max-width:100%}input,button,textarea,select{font:inherit;color:inherit}button{background:none;border:0;padding:0;cursor:pointer}table{border-collapse:collapse;border-spacing:0}[hidden]{display:none!important}:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}::selection{background:var(--accent-soft);color:var(--fg)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--radius-pill);border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:var(--fg-subtle)}:root{--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Inter", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--fs-12: .75rem;--fs-13: .8125rem;--fs-14: .875rem;--fs-16: 1rem;--fs-18: 1.125rem;--fs-20: 1.25rem;--fs-24: 1.5rem;--fs-32: 2rem;--lh-tight: 1.2;--lh-snug: 1.35;--lh-base: 1.5;--lh-relaxed: 1.65;--fw-regular: 400;--fw-medium: 500;--fw-semibold: 600;--fw-bold: 700;--tracking-tight: -.01em;--tracking-base: 0;--tracking-wide: .04em}body{font-family:var(--font-sans);font-size:var(--fs-14);line-height:var(--lh-base);color:var(--fg);background:var(--bg);font-feature-settings:"cv02","cv03","cv04","cv11"}code,kbd,pre,samp{font-family:var(--font-mono);font-size:.9em}kbd{display:inline-flex;align-items:center;justify-content:center;min-width:1.5em;height:1.5em;padding:0 var(--space-1);font-family:var(--font-mono);font-size:var(--fs-12);color:var(--fg-muted);background:var(--surface-1);border:1px solid var(--border);border-bottom-width:2px;border-radius:var(--radius-sm)}:root[data-density=comfortable]{--density-row-h: 36px;--density-control-h: 36px;--density-card-pad: var(--space-5)}:root[data-density=compact]{--density-row-h: 28px;--density-control-h: 28px;--density-card-pad: var(--space-3)}h1{font-size:var(--fs-24);line-height:var(--lh-tight);font-weight:var(--fw-semibold);letter-spacing:var(--tracking-tight)}h2{font-size:var(--fs-20);line-height:var(--lh-snug);font-weight:var(--fw-semibold)}h3{font-size:var(--fs-18);line-height:var(--lh-snug);font-weight:var(--fw-medium)}h4{font-size:var(--fs-16);line-height:var(--lh-base);font-weight:var(--fw-medium)}@media (max-width: 767px){.v8-desktop-sidebar{display:none}.mobile-menu-toggle{display:inline-flex!important}}@media (min-width: 768px){.v8-mobile-sidebar,.v8-mobile-sidebar-overlay,.mobile-menu-toggle{display:none!important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}#root{display:flex;flex-direction:column;min-height:100%;isolation:isolate}@keyframes v8-skeleton-pulse{0%,to{opacity:1}50%{opacity:.55}}@keyframes v8-spin{to{transform:rotate(360deg)}}@keyframes v8-pulse{0%{box-shadow:0 0 color-mix(in oklch,currentColor 60%,transparent)}to{box-shadow:0 0 0 8px color-mix(in oklch,currentColor 0%,transparent)}}@keyframes v8-dialog-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes v8-dialog-content-in{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes v8-sheet-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes v8-sheet-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes v8-sheet-in-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes v8-sheet-in-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes v8-menu-in{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes v8-tooltip-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}.v8-skeleton{animation:v8-skeleton-pulse 1.4s var(--easing-standard, cubic-bezier(.4, 0, .2, 1)) infinite}.v8-spinner{animation:v8-spin .8s linear infinite}.v8-dialog-overlay{animation:v8-dialog-overlay-in .16s var(--easing-standard, cubic-bezier(.4, 0, .2, 1))}.v8-dialog-content{animation:v8-dialog-content-in .2s var(--easing-standard, cubic-bezier(.4, 0, .2, 1))}.v8-sheet[data-side=right]{animation:v8-sheet-in-right .24s cubic-bezier(.32,.72,0,1)}.v8-sheet[data-side=left]{animation:v8-sheet-in-left .24s cubic-bezier(.32,.72,0,1)}.v8-sheet[data-side=top]{animation:v8-sheet-in-top .24s cubic-bezier(.32,.72,0,1)}.v8-sheet[data-side=bottom]{animation:v8-sheet-in-bottom .24s cubic-bezier(.32,.72,0,1)}.v8-dropdown-menu,.v8-context-menu,.v8-popover{animation:v8-menu-in .14s var(--easing-standard, cubic-bezier(.4, 0, .2, 1));transform-origin:var(--radix-dropdown-menu-content-transform-origin, var(--radix-context-menu-content-transform-origin, var(--radix-popover-content-transform-origin, top)))}.v8-tooltip{animation:v8-tooltip-in .12s var(--easing-standard, cubic-bezier(.4, 0, .2, 1))}.v8-dropdown-menu__item[data-highlighted],.v8-context-menu__item[data-highlighted]{background:var(--surface-2)}.v8-dropdown-menu__item.is-danger[data-highlighted],.v8-context-menu__item.is-danger[data-highlighted]{background:color-mix(in oklch,var(--danger) 12%,transparent)}.v8-dropdown-menu__checkbox[data-state=checked] .v8-dropdown-menu__checkbox-indicator,.v8-dropdown-menu__radio[data-state=checked] .v8-dropdown-menu__radio-indicator{display:inline-flex}
@@ -1,391 +0,0 @@
1
- /**
2
- * tests/chat-session-create.test.mjs — v4.2.5
3
- *
4
- * Tests the session-mutation endpoints on the cline-sessions router:
5
- *
6
- * POST /api/cline-sessions/new
7
- * PATCH /api/cline-sessions/:id
8
- * DELETE /api/cline-sessions/:id
9
- *
10
- * Strategy: stand up a fake cline serve child on a random port,
11
- * point readServeInfo() at it by writing a tmp serve.json to
12
- * ~/.cache/bizar/serve.json. The fake serves:
13
- *
14
- * POST /api/session?directory=... → returns { data: { id, ... } }
15
- * PATCH /api/session/:id?directory=. → echoes the body as { id }
16
- * DELETE /api/session/:id?directory=. → returns 200 or 404
17
- *
18
- * For "plugin offline" tests we move serve.json aside, then restore.
19
- */
20
-
21
- import { test, before, after, beforeEach } from 'node:test';
22
- import assert from 'node:assert/strict';
23
- import {
24
- mkdtempSync,
25
- writeFileSync,
26
- rmSync,
27
- existsSync,
28
- copyFileSync,
29
- unlinkSync,
30
- readFileSync,
31
- } from 'node:fs';
32
- import { join } from 'node:path';
33
- import { tmpdir } from 'node:os';
34
- import { createServer } from 'node:http';
35
- import express from 'express';
36
-
37
- import { createClineSessionsRouter } from '../src/server/routes/cline-sessions.mjs';
38
-
39
- // ── fake upstream (cline serve child) ──────────────────────────────────
40
-
41
- let upstreamServer, upstreamPort;
42
- const upstream = {
43
- createHits: [],
44
- patchHits: [],
45
- deleteHits: [],
46
- nextCreateStatus: 200,
47
- nextCreateId: null,
48
- // Behavior knobs tests can flip:
49
- failNextCreate: false,
50
- };
51
-
52
- function startUpstream() {
53
- return new Promise((resolve) => {
54
- upstreamServer = createServer((req, res) => {
55
- const url = new URL(req.url, 'http://127.0.0.1');
56
-
57
- // CREATE: POST /api/session?directory=...
58
- if (
59
- url.pathname === '/api/session' &&
60
- req.method === 'POST'
61
- ) {
62
- let body = '';
63
- req.on('data', (c) => {
64
- body += c;
65
- });
66
- req.on('end', () => {
67
- let parsed;
68
- try { parsed = JSON.parse(body); } catch { parsed = {}; }
69
- upstream.createHits.push({ url: req.url, body: parsed });
70
- if (upstream.failNextCreate) {
71
- upstream.failNextCreate = false;
72
- res.writeHead(500, { 'Content-Type': 'application/json' });
73
- res.end(JSON.stringify({ error: 'fake-upstream-failure' }));
74
- return;
75
- }
76
- res.writeHead(upstream.nextCreateStatus, {
77
- 'Content-Type': 'application/json',
78
- });
79
- const id =
80
- upstream.nextCreateId ||
81
- `sess-new-${upstream.createHits.length}`;
82
- upstream.nextCreateId = null;
83
- res.end(JSON.stringify({ data: { id, title: parsed.title, agent: parsed.agent } }));
84
- });
85
- return;
86
- }
87
-
88
- // RENAME: PATCH /api/session/:id?directory=...
89
- const patchM = url.pathname.match(/^\/api\/session\/([^/]+)$/);
90
- if (patchM && req.method === 'PATCH') {
91
- let body = '';
92
- req.on('data', (c) => {
93
- body += c;
94
- });
95
- req.on('end', () => {
96
- let parsed;
97
- try { parsed = JSON.parse(body); } catch { parsed = {}; }
98
- upstream.patchHits.push({ id: patchM[1], url: req.url, body: parsed });
99
- if (patchM[1] === 'sess-missing') {
100
- res.writeHead(404, { 'Content-Type': 'application/json' });
101
- res.end(JSON.stringify({ error: 'not found' }));
102
- return;
103
- }
104
- res.writeHead(200, { 'Content-Type': 'application/json' });
105
- res.end(JSON.stringify({ id: patchM[1], title: parsed.title }));
106
- });
107
- return;
108
- }
109
-
110
- // DELETE: DELETE /api/session/:id?directory=...
111
- const deleteM = url.pathname.match(/^\/api\/session\/([^/]+)$/);
112
- if (deleteM && req.method === 'DELETE') {
113
- upstream.deleteHits.push({ id: deleteM[1], url: req.url });
114
- if (deleteM[1] === 'sess-gone') {
115
- res.writeHead(404, { 'Content-Type': 'application/json' });
116
- res.end(JSON.stringify({ error: 'gone' }));
117
- return;
118
- }
119
- res.writeHead(200, { 'Content-Type': 'application/json' });
120
- res.end(JSON.stringify({ id: deleteM[1] }));
121
- return;
122
- }
123
-
124
- res.writeHead(404);
125
- res.end('not found');
126
- });
127
- upstreamServer.listen(0, '127.0.0.1', () => {
128
- upstreamPort = upstreamServer.address().port;
129
- resolve();
130
- });
131
- });
132
- }
133
-
134
- async function startDashboard() {
135
- const app = express();
136
- app.use(express.json({ limit: '2mb' }));
137
- app.use('/api', createClineSessionsRouter());
138
- dashboardServer = createServer(app);
139
- await new Promise((r) => dashboardServer.listen(0, '127.0.0.1', r));
140
- dashboardBaseUrl = `http://127.0.0.1:${dashboardServer.address().port}`;
141
- }
142
-
143
- let dashboardServer, dashboardBaseUrl, tmpDir;
144
- let SERVE_JSON_PATH;
145
- let originalServeJson;
146
-
147
- before(async () => {
148
- SERVE_JSON_PATH = `${tmpdir()}/bizar-test-serve-create-${process.pid}-${Date.now()}.json`;
149
- process.env.BIZAR_SERVE_JSON_PATH = SERVE_JSON_PATH;
150
- await startUpstream();
151
- await startDashboard();
152
- tmpDir = mkdtempSync(join(tmpdir(), 'cline-sessions-create-'));
153
- if (existsSync(SERVE_JSON_PATH)) {
154
- originalServeJson = readFileSync(SERVE_JSON_PATH, 'utf8');
155
- }
156
- });
157
-
158
- after(async () => {
159
- if (originalServeJson !== undefined) {
160
- writeFileSync(SERVE_JSON_PATH, originalServeJson, 'utf8');
161
- } else if (existsSync(SERVE_JSON_PATH)) {
162
- rmSync(SERVE_JSON_PATH);
163
- }
164
- if (dashboardServer) await new Promise((r) => dashboardServer.close(r));
165
- if (upstreamServer) await new Promise((r) => upstreamServer.close(r));
166
- if (tmpDir) rmSync(tmpDir, { recursive: true, force: true });
167
- delete process.env.BIZAR_SERVE_JSON_PATH;
168
- });
169
-
170
- beforeEach(() => {
171
- upstream.createHits = [];
172
- upstream.patchHits = [];
173
- upstream.deleteHits = [];
174
- upstream.nextCreateStatus = 200;
175
- upstream.nextCreateId = null;
176
- upstream.failNextCreate = false;
177
- });
178
-
179
- function writeServeJson(worktree = '/tmp/new-session-worktree') {
180
- writeFileSync(
181
- SERVE_JSON_PATH,
182
- JSON.stringify({
183
- port: upstreamPort,
184
- password: 'test-pw',
185
- worktree,
186
- pid: 99999,
187
- startedAt: Date.now(),
188
- }),
189
- 'utf8',
190
- );
191
- }
192
-
193
- /** Move serve.json aside so readServeInfo() returns null.
194
- * Uses copy + unlink because rename across filesystems (e.g.
195
- * /home/* → /tmp/*) throws EXDEV on Linux. */
196
- function moveServeJsonAside() {
197
- if (!existsSync(SERVE_JSON_PATH)) return;
198
- const tmp = join(tmpDir, `serve-aside-${Date.now()}-${process.pid}.json`);
199
- copyFileSync(SERVE_JSON_PATH, tmp);
200
- unlinkSync(SERVE_JSON_PATH);
201
- }
202
-
203
- // ── tests ─────────────────────────────────────────────────────────────────
204
-
205
- test('POST /api/cline-sessions/new returns 201 with id+title+agent on happy path', async () => {
206
- writeServeJson();
207
- upstream.nextCreateId = 'sess-fresh-1';
208
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
209
- method: 'POST',
210
- headers: { 'Content-Type': 'application/json' },
211
- body: JSON.stringify({ title: 'Hello world', agent: 'odin' }),
212
- });
213
- assert.equal(r.status, 201);
214
- const body = await r.json();
215
- assert.equal(body.id, 'sess-fresh-1');
216
- assert.equal(body.title, 'Hello world');
217
- assert.equal(body.agent, 'odin');
218
- assert.ok(typeof body.directory === 'string' && body.directory.length > 0);
219
- assert.ok(typeof body.createdAt === 'number' && body.createdAt > 0);
220
- assert.equal(upstream.createHits.length, 1);
221
- assert.equal(upstream.createHits[0].body.title, 'Hello world');
222
- assert.equal(upstream.createHits[0].body.agent, 'odin');
223
- });
224
-
225
- test('POST /api/cline-sessions/new returns 400 when body is missing', async () => {
226
- writeServeJson();
227
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
228
- method: 'POST',
229
- headers: { 'Content-Type': 'application/json' },
230
- });
231
- assert.equal(r.status, 400);
232
- const body = await r.json();
233
- assert.match(body.message, /agent.*required/i);
234
- });
235
-
236
- test('POST /api/cline-sessions/new returns 400 when agent missing', async () => {
237
- writeServeJson();
238
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
239
- method: 'POST',
240
- headers: { 'Content-Type': 'application/json' },
241
- body: JSON.stringify({ title: 'no-agent' }),
242
- });
243
- assert.equal(r.status, 400);
244
- });
245
-
246
- test('POST /api/cline-sessions/new returns 400 when agent is invalid', async () => {
247
- writeServeJson();
248
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
249
- method: 'POST',
250
- headers: { 'Content-Type': 'application/json' },
251
- body: JSON.stringify({ agent: 'has space and !' }),
252
- });
253
- assert.equal(r.status, 400);
254
- });
255
-
256
- test('POST /api/cline-sessions/new returns 502 when upstream 500s', async () => {
257
- writeServeJson();
258
- upstream.failNextCreate = true;
259
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
260
- method: 'POST',
261
- headers: { 'Content-Type': 'application/json' },
262
- body: JSON.stringify({ agent: 'odin' }),
263
- });
264
- assert.equal(r.status, 502);
265
- const body = await r.json();
266
- assert.equal(body.error, 'cline_error');
267
- assert.ok(body.message.length > 0);
268
- });
269
-
270
- test('POST /api/cline-sessions/new returns 503 plugin_offline when no serve.json', async () => {
271
- moveServeJsonAside();
272
- try {
273
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
274
- method: 'POST',
275
- headers: { 'Content-Type': 'application/json' },
276
- body: JSON.stringify({ agent: 'odin' }),
277
- });
278
- assert.equal(r.status, 503);
279
- assert.equal((await r.json()).error, 'plugin_offline');
280
- } finally {
281
- if (originalServeJson !== undefined)
282
- writeFileSync(SERVE_JSON_PATH, originalServeJson, 'utf8');
283
- else writeServeJson('/tmp/session-worktree');
284
- }
285
- });
286
-
287
- test('POST /api/cline-sessions/new defaults title to "Chat: <agent>"', async () => {
288
- writeServeJson();
289
- upstream.nextCreateId = 'sess-defaulted-1';
290
- const r = await fetch(`${dashboardBaseUrl}/api/cline-sessions/new`, {
291
- method: 'POST',
292
- headers: { 'Content-Type': 'application/json' },
293
- body: JSON.stringify({ agent: 'tyr' }),
294
- });
295
- assert.equal(r.status, 201);
296
- const body = await r.json();
297
- assert.equal(body.title, 'Chat: tyr');
298
- assert.equal(upstream.createHits[0].body.title, 'Chat: tyr');
299
- });
300
-
301
- test('PATCH /api/cline-sessions/:id renames the session (200)', async () => {
302
- writeServeJson();
303
- const r = await fetch(
304
- `${dashboardBaseUrl}/api/cline-sessions/sess-1`,
305
- {
306
- method: 'PATCH',
307
- headers: { 'Content-Type': 'application/json' },
308
- body: JSON.stringify({ title: 'New title' }),
309
- },
310
- );
311
- assert.equal(r.status, 200);
312
- const body = await r.json();
313
- assert.equal(body.id, 'sess-1');
314
- assert.equal(body.title, 'New title');
315
- assert.equal(upstream.patchHits.length, 1);
316
- assert.equal(upstream.patchHits[0].body.title, 'New title');
317
- });
318
-
319
- test('PATCH /api/cline-sessions/:id returns 400 when title missing', async () => {
320
- writeServeJson();
321
- const r = await fetch(
322
- `${dashboardBaseUrl}/api/cline-sessions/sess-1`,
323
- {
324
- method: 'PATCH',
325
- headers: { 'Content-Type': 'application/json' },
326
- body: JSON.stringify({}),
327
- },
328
- );
329
- assert.equal(r.status, 400);
330
- });
331
-
332
- test('PATCH /api/cline-sessions/:id returns 400 when title is empty', async () => {
333
- writeServeJson();
334
- const r = await fetch(
335
- `${dashboardBaseUrl}/api/cline-sessions/sess-1`,
336
- {
337
- method: 'PATCH',
338
- headers: { 'Content-Type': 'application/json' },
339
- body: JSON.stringify({ title: ' ' }),
340
- },
341
- );
342
- assert.equal(r.status, 400);
343
- });
344
-
345
- test('PATCH /api/cline-sessions/:id returns 404 when upstream 404s', async () => {
346
- writeServeJson();
347
- const r = await fetch(
348
- `${dashboardBaseUrl}/api/cline-sessions/sess-missing`,
349
- {
350
- method: 'PATCH',
351
- headers: { 'Content-Type': 'application/json' },
352
- body: JSON.stringify({ title: 'whatever' }),
353
- },
354
- );
355
- assert.equal(r.status, 404);
356
- });
357
-
358
- test('DELETE /api/cline-sessions/:id returns 200 with { deleted: true }', async () => {
359
- writeServeJson();
360
- const r = await fetch(
361
- `${dashboardBaseUrl}/api/cline-sessions/sess-1`,
362
- { method: 'DELETE' },
363
- );
364
- assert.equal(r.status, 200);
365
- const body = await r.json();
366
- assert.deepEqual(body, { id: 'sess-1', deleted: true });
367
- assert.equal(upstream.deleteHits.length, 1);
368
- });
369
-
370
- test('DELETE /api/cline-sessions/:id is idempotent (returns 200 even when upstream 404s)', async () => {
371
- // Idempotent semantics: a "session already gone" response is the
372
- // desired terminal state — we don't surface that to the client as
373
- // an error.
374
- writeServeJson();
375
- const r = await fetch(
376
- `${dashboardBaseUrl}/api/cline-sessions/sess-gone`,
377
- { method: 'DELETE' },
378
- );
379
- assert.equal(r.status, 200);
380
- const body = await r.json();
381
- assert.deepEqual(body, { id: 'sess-gone', deleted: true });
382
- });
383
-
384
- test('DELETE /api/cline-sessions/:id returns 400 when id is invalid', async () => {
385
- writeServeJson();
386
- const r = await fetch(
387
- `${dashboardBaseUrl}/api/cline-sessions/has space`,
388
- { method: 'DELETE' },
389
- );
390
- assert.equal(r.status, 400);
391
- });