@polderlabs/bizar 10.4.4 → 10.6.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 (252) hide show
  1. package/bizar-dash/dist/assets/{ActivityFeed-RQeyFifx.js → ActivityFeed-Bw4Cai7r.js} +1 -1
  2. package/bizar-dash/dist/assets/{ActivityFeed-RQeyFifx.js.map → ActivityFeed-Bw4Cai7r.js.map} +1 -1
  3. package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js → ActivityView-BC0QQ_j9.js} +1 -1
  4. package/bizar-dash/dist/assets/{ActivityView-CibyssPM.js.map → ActivityView-BC0QQ_j9.js.map} +1 -1
  5. package/bizar-dash/dist/assets/{AdminView-BjczABeB.js → AdminView-CLTNKFL4.js} +1 -1
  6. package/bizar-dash/dist/assets/{AdminView-BjczABeB.js.map → AdminView-CLTNKFL4.js.map} +1 -1
  7. package/bizar-dash/dist/assets/{AgentActivity-Bywt1twv.js → AgentActivity-DBWDByjk.js} +1 -1
  8. package/bizar-dash/dist/assets/{AgentActivity-Bywt1twv.js.map → AgentActivity-DBWDByjk.js.map} +1 -1
  9. package/bizar-dash/dist/assets/{AgentsView-BnOjjM74.js → AgentsView-DD6bCIbA.js} +1 -1
  10. package/bizar-dash/dist/assets/{AgentsView-BnOjjM74.js.map → AgentsView-DD6bCIbA.js.map} +1 -1
  11. package/bizar-dash/dist/assets/{Alert-BZGk39mB.js → Alert-pzFISNtS.js} +1 -1
  12. package/bizar-dash/dist/assets/{Alert-BZGk39mB.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-D4frSShw.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-BYg0rkPA.js → Avatar-CRW81ewE.js} +1 -1
  18. package/bizar-dash/dist/assets/{Avatar-BYg0rkPA.js.map → Avatar-CRW81ewE.js.map} +1 -1
  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-B875KQa4.js → BackupView-u_O3j0TG.js} +1 -1
  22. package/bizar-dash/dist/assets/{BackupView-B875KQa4.js.map → BackupView-u_O3j0TG.js.map} +1 -1
  23. package/bizar-dash/dist/assets/{Banner-C8HEcT5l.js → Banner-Du-3l05O.js} +1 -1
  24. package/bizar-dash/dist/assets/{Banner-C8HEcT5l.js.map → Banner-Du-3l05O.js.map} +1 -1
  25. package/bizar-dash/dist/assets/{Card-BtsmkhJa.js → Card-Clkvh43Q.js} +1 -1
  26. package/bizar-dash/dist/assets/{Card-BtsmkhJa.js.map → Card-Clkvh43Q.js.map} +1 -1
  27. package/bizar-dash/dist/assets/{ChatView-CkNS0SD8.js → ChatView-BTjb3mIh.js} +1 -1
  28. package/bizar-dash/dist/assets/{ChatView-CkNS0SD8.js.map → ChatView-BTjb3mIh.js.map} +1 -1
  29. package/bizar-dash/dist/assets/{Chip-XPOk0d_E.js → Chip-B7ovcm01.js} +1 -1
  30. package/bizar-dash/dist/assets/{Chip-XPOk0d_E.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-CPlTU5VG.js.map → ClipboardView-Cb6XgYZI.js.map} +1 -1
  35. package/bizar-dash/dist/assets/{ConfigView-BntUrW7s.js → ConfigView-DfTJk1uL.js} +1 -1
  36. package/bizar-dash/dist/assets/{ConfigView-BntUrW7s.js.map → ConfigView-DfTJk1uL.js.map} +1 -1
  37. package/bizar-dash/dist/assets/{DiagnosticsView-4x0Zu3yP.js → DiagnosticsView-D5Wy9xlJ.js} +1 -1
  38. package/bizar-dash/dist/assets/{DiagnosticsView-4x0Zu3yP.js.map → DiagnosticsView-D5Wy9xlJ.js.map} +1 -1
  39. package/bizar-dash/dist/assets/{DialogsView-Xd02dVAX.js → DialogsView-HVyfrXpq.js} +1 -1
  40. package/bizar-dash/dist/assets/{DialogsView-Xd02dVAX.js.map → DialogsView-HVyfrXpq.js.map} +1 -1
  41. package/bizar-dash/dist/assets/{DoctorView-DepBdQGR.js → DoctorView-Dm94WI2z.js} +2 -2
  42. package/bizar-dash/dist/assets/{DoctorView-DepBdQGR.js.map → DoctorView-Dm94WI2z.js.map} +1 -1
  43. package/bizar-dash/dist/assets/{EmptyState-DjKtY1Qi.js → EmptyState-ccT__JZG.js} +1 -1
  44. package/bizar-dash/dist/assets/{EmptyState-DjKtY1Qi.js.map → EmptyState-ccT__JZG.js.map} +1 -1
  45. package/bizar-dash/dist/assets/{EnvVarsView-S4Pbm128.js → EnvVarsView-BhcIuJ6V.js} +2 -2
  46. package/bizar-dash/dist/assets/{EnvVarsView-S4Pbm128.js.map → EnvVarsView-BhcIuJ6V.js.map} +1 -1
  47. package/bizar-dash/dist/assets/{ErrorState-CBJbEQ8B.js → ErrorState-BSqf65ka.js} +1 -1
  48. package/bizar-dash/dist/assets/{ErrorState-CBJbEQ8B.js.map → ErrorState-BSqf65ka.js.map} +1 -1
  49. package/bizar-dash/dist/assets/{EvalView-BeAyMCD1.js → EvalView-2cbWVBUA.js} +1 -1
  50. package/bizar-dash/dist/assets/{EvalView-BeAyMCD1.js.map → EvalView-2cbWVBUA.js.map} +1 -1
  51. package/bizar-dash/dist/assets/{GoalsView-BZr8In4c.js → GoalsView-C3QG5p7T.js} +1 -1
  52. package/bizar-dash/dist/assets/{GoalsView-BZr8In4c.js.map → GoalsView-C3QG5p7T.js.map} +1 -1
  53. package/bizar-dash/dist/assets/{Grid--WKvqu5h.js → Grid-Bojq8Sg7.js} +1 -1
  54. package/bizar-dash/dist/assets/{Grid--WKvqu5h.js.map → Grid-Bojq8Sg7.js.map} +1 -1
  55. package/bizar-dash/dist/assets/{HistoryView-djEbzqtk.js → HistoryView-Bum2TMMw.js} +1 -1
  56. package/bizar-dash/dist/assets/{HistoryView-djEbzqtk.js.map → HistoryView-Bum2TMMw.js.map} +1 -1
  57. package/bizar-dash/dist/assets/{Input-h_nSOtwm.js → Input-DV-vdaV8.js} +1 -1
  58. package/bizar-dash/dist/assets/{Input-h_nSOtwm.js.map → Input-DV-vdaV8.js.map} +1 -1
  59. package/bizar-dash/dist/assets/{LibrariesView-Vez8CvNq.js → LibrariesView-DH2E2uNb.js} +1 -1
  60. package/bizar-dash/dist/assets/{LibrariesView-Vez8CvNq.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-CM8QoIWG.js → ListHeader-CCD_nIHb.js} +1 -1
  64. package/bizar-dash/dist/assets/{ListHeader-CM8QoIWG.js.map → ListHeader-CCD_nIHb.js.map} +1 -1
  65. package/bizar-dash/dist/assets/{MemoryView-DnL8E2vI.js → MemoryView-Cr-obIQY.js} +1 -1
  66. package/bizar-dash/dist/assets/{MemoryView-DnL8E2vI.js.map → MemoryView-Cr-obIQY.js.map} +1 -1
  67. package/bizar-dash/dist/assets/{MiscView-B2YQXhZ_.js → MiscView-CDUQpYuV.js} +1 -1
  68. package/bizar-dash/dist/assets/{MiscView-B2YQXhZ_.js.map → MiscView-CDUQpYuV.js.map} +1 -1
  69. package/bizar-dash/dist/assets/{ModsView-BVM3X5xc.js → ModsView-B6OR-a4B.js} +2 -2
  70. package/bizar-dash/dist/assets/{ModsView-BVM3X5xc.js.map → ModsView-B6OR-a4B.js.map} +1 -1
  71. package/bizar-dash/dist/assets/{NotificationsView-A-Xs8BL1.js → NotificationsView-CIqtY6D0.js} +1 -1
  72. package/bizar-dash/dist/assets/{NotificationsView-A-Xs8BL1.js.map → NotificationsView-CIqtY6D0.js.map} +1 -1
  73. package/bizar-dash/dist/assets/{ObsidianView-mI3qW9OP.js → ObsidianView-Nahah8QC.js} +1 -1
  74. package/bizar-dash/dist/assets/{ObsidianView-mI3qW9OP.js.map → ObsidianView-Nahah8QC.js.map} +1 -1
  75. package/bizar-dash/dist/assets/{OverviewView-By69Cr5H.js → OverviewView-B6L_wa4M.js} +1 -1
  76. package/bizar-dash/dist/assets/{OverviewView-By69Cr5H.js.map → OverviewView-B6L_wa4M.js.map} +1 -1
  77. package/bizar-dash/dist/assets/{ProgressBar-BnaBqv-W.js → ProgressBar-KC4VXsl_.js} +1 -1
  78. package/bizar-dash/dist/assets/{ProgressBar-BnaBqv-W.js.map → ProgressBar-KC4VXsl_.js.map} +1 -1
  79. package/bizar-dash/dist/assets/{ProjectsView-C81WTFka.js → ProjectsView-DgxWiqHb.js} +1 -1
  80. package/bizar-dash/dist/assets/{ProjectsView-C81WTFka.js.map → ProjectsView-DgxWiqHb.js.map} +1 -1
  81. package/bizar-dash/dist/assets/{ProvidersView-2cn-TALE.js → ProvidersView-BOqN9omv.js} +1 -1
  82. package/bizar-dash/dist/assets/{ProvidersView-2cn-TALE.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-CiGWEN8I.js → Select-Bf_P0S6H.js} +1 -1
  86. package/bizar-dash/dist/assets/{Select-CiGWEN8I.js.map → Select-Bf_P0S6H.js.map} +1 -1
  87. package/bizar-dash/dist/assets/{SettingsRow-CflGJymA.js → SettingsRow-CJb-F94Y.js} +1 -1
  88. package/bizar-dash/dist/assets/{SettingsRow-CflGJymA.js.map → SettingsRow-CJb-F94Y.js.map} +1 -1
  89. package/bizar-dash/dist/assets/{SettingsView-2HSFJPPK.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-B-CMP9-_.js → Sheet-BwMVGN-8.js} +1 -1
  92. package/bizar-dash/dist/assets/{Sheet-B-CMP9-_.js.map → Sheet-BwMVGN-8.js.map} +1 -1
  93. package/bizar-dash/dist/assets/{Slider-Z4TP_CXY.js → Slider-AjjzqI-5.js} +1 -1
  94. package/bizar-dash/dist/assets/{Slider-Z4TP_CXY.js.map → Slider-AjjzqI-5.js.map} +1 -1
  95. package/bizar-dash/dist/assets/{Sparkline-cvkv2HbU.js → Sparkline-Z4y0YUZS.js} +1 -1
  96. package/bizar-dash/dist/assets/{Sparkline-cvkv2HbU.js.map → Sparkline-Z4y0YUZS.js.map} +1 -1
  97. package/bizar-dash/dist/assets/{Switch-jcYo4lmp.js → Switch-B79a2t-G.js} +1 -1
  98. package/bizar-dash/dist/assets/{Switch-jcYo4lmp.js.map → Switch-B79a2t-G.js.map} +1 -1
  99. package/bizar-dash/dist/assets/{TasksView-CQaSFzWY.js → TasksView-G-s_pwwr.js} +1 -1
  100. package/bizar-dash/dist/assets/{TasksView-CQaSFzWY.js.map → TasksView-G-s_pwwr.js.map} +1 -1
  101. package/bizar-dash/dist/assets/{Textarea-xnAybFGd.js → Textarea-BfXGMXQ7.js} +1 -1
  102. package/bizar-dash/dist/assets/{Textarea-xnAybFGd.js.map → Textarea-BfXGMXQ7.js.map} +1 -1
  103. package/bizar-dash/dist/assets/{UpdateView-BUAEcRCX.js → UpdateView-BKx3u9X8.js} +1 -1
  104. package/bizar-dash/dist/assets/{UpdateView-BUAEcRCX.js.map → UpdateView-BKx3u9X8.js.map} +1 -1
  105. package/bizar-dash/dist/assets/{UsageView-DMFbBOfH.js → UsageView-M01G6bZQ.js} +1 -1
  106. package/bizar-dash/dist/assets/{UsageView-DMFbBOfH.js.map → UsageView-M01G6bZQ.js.map} +1 -1
  107. package/bizar-dash/dist/assets/{ViewHeader-C-t1U2cQ.js → ViewHeader-BsnaspKw.js} +1 -1
  108. package/bizar-dash/dist/assets/{ViewHeader-C-t1U2cQ.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-aoPVT6LJ.js.map → VoiceView-rWE8vziD.js.map} +1 -1
  111. package/bizar-dash/dist/assets/{brain-DhAzcHUk.js → brain-D7k5s8vH.js} +1 -1
  112. package/bizar-dash/dist/assets/{brain-DhAzcHUk.js.map → brain-D7k5s8vH.js.map} +1 -1
  113. package/bizar-dash/dist/assets/{calendar-B9Wbemh7.js → calendar-CAZoDd-l.js} +1 -1
  114. package/bizar-dash/dist/assets/{calendar-B9Wbemh7.js.map → calendar-CAZoDd-l.js.map} +1 -1
  115. package/bizar-dash/dist/assets/{circle-6NJF_Xl6.js → circle-D99cZJBr.js} +1 -1
  116. package/bizar-dash/dist/assets/{circle-6NJF_Xl6.js.map → circle-D99cZJBr.js.map} +1 -1
  117. package/bizar-dash/dist/assets/{circle-alert-Dz8lGfCZ.js → circle-alert-QQTU4Quz.js} +1 -1
  118. package/bizar-dash/dist/assets/{circle-alert-Dz8lGfCZ.js.map → circle-alert-QQTU4Quz.js.map} +1 -1
  119. package/bizar-dash/dist/assets/{circle-check-DFB50ojt.js → circle-check-BMbe7Kkr.js} +1 -1
  120. package/bizar-dash/dist/assets/{circle-check-DFB50ojt.js.map → circle-check-BMbe7Kkr.js.map} +1 -1
  121. package/bizar-dash/dist/assets/{clock-ClVA6-hQ.js → clock-OtT5mvF3.js} +1 -1
  122. package/bizar-dash/dist/assets/{clock-ClVA6-hQ.js.map → clock-OtT5mvF3.js.map} +1 -1
  123. package/bizar-dash/dist/assets/{download-BvJddD8D.js → download-B-mPX5P_.js} +1 -1
  124. package/bizar-dash/dist/assets/{download-BvJddD8D.js.map → download-B-mPX5P_.js.map} +1 -1
  125. package/bizar-dash/dist/assets/{external-link-DvL89gaZ.js → external-link-DPDQM1YO.js} +1 -1
  126. package/bizar-dash/dist/assets/{external-link-DvL89gaZ.js.map → external-link-DPDQM1YO.js.map} +1 -1
  127. package/bizar-dash/dist/assets/{file-text-BOroDtZE.js → file-text-BsCrv5aP.js} +1 -1
  128. package/bizar-dash/dist/assets/{file-text-BOroDtZE.js.map → file-text-BsCrv5aP.js.map} +1 -1
  129. package/bizar-dash/dist/assets/{filter-DwPjMRQt.js → filter-Do63x17E.js} +1 -1
  130. package/bizar-dash/dist/assets/{filter-DwPjMRQt.js.map → filter-Do63x17E.js.map} +1 -1
  131. package/bizar-dash/dist/assets/{git-pull-request-TDb1inux.js → git-pull-request-CpRAmERC.js} +1 -1
  132. package/bizar-dash/dist/assets/{git-pull-request-TDb1inux.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-BcCoCzIY.js → network-DJnHwHX3.js} +1 -1
  137. package/bizar-dash/dist/assets/{network-BcCoCzIY.js.map → network-DJnHwHX3.js.map} +1 -1
  138. package/bizar-dash/dist/assets/{pause-BllItT2_.js → pause-HitDUnk_.js} +1 -1
  139. package/bizar-dash/dist/assets/{pause-BllItT2_.js.map → pause-HitDUnk_.js.map} +1 -1
  140. package/bizar-dash/dist/assets/{pencil-DAwM-CC3.js → pencil-Dkks7eIC.js} +1 -1
  141. package/bizar-dash/dist/assets/{pencil-DAwM-CC3.js.map → pencil-Dkks7eIC.js.map} +1 -1
  142. package/bizar-dash/dist/assets/{play-mJh67AXo.js → play-blqh0msT.js} +1 -1
  143. package/bizar-dash/dist/assets/{play-mJh67AXo.js.map → play-blqh0msT.js.map} +1 -1
  144. package/bizar-dash/dist/assets/{plug-BjfntCMC.js → plug-DVvSSe40.js} +1 -1
  145. package/bizar-dash/dist/assets/{plug-BjfntCMC.js.map → plug-DVvSSe40.js.map} +1 -1
  146. package/bizar-dash/dist/assets/{plus-Cm6-fo14.js → plus-Cps-8lcG.js} +1 -1
  147. package/bizar-dash/dist/assets/{plus-Cm6-fo14.js.map → plus-Cps-8lcG.js.map} +1 -1
  148. package/bizar-dash/dist/assets/{power-CXN9y2KV.js → power-DEX4_Xoa.js} +1 -1
  149. package/bizar-dash/dist/assets/{power-CXN9y2KV.js.map → power-DEX4_Xoa.js.map} +1 -1
  150. package/bizar-dash/dist/assets/{power-off-DUZqwMf9.js → power-off-upZ4xjaG.js} +1 -1
  151. package/bizar-dash/dist/assets/{power-off-DUZqwMf9.js.map → power-off-upZ4xjaG.js.map} +1 -1
  152. package/bizar-dash/dist/assets/{refresh-ccw-DA8_IB9l.js → refresh-ccw-DN_zCB1h.js} +1 -1
  153. package/bizar-dash/dist/assets/{refresh-ccw-DA8_IB9l.js.map → refresh-ccw-DN_zCB1h.js.map} +1 -1
  154. package/bizar-dash/dist/assets/{refresh-cw-DwlP59en.js → refresh-cw-KGm5eQgv.js} +1 -1
  155. package/bizar-dash/dist/assets/{refresh-cw-DwlP59en.js.map → refresh-cw-KGm5eQgv.js.map} +1 -1
  156. package/bizar-dash/dist/assets/{rotate-ccw-DMTASfAn.js → rotate-ccw-D5fkDRgk.js} +1 -1
  157. package/bizar-dash/dist/assets/{rotate-ccw-DMTASfAn.js.map → rotate-ccw-D5fkDRgk.js.map} +1 -1
  158. package/bizar-dash/dist/assets/{rotate-cw-BDX5SE2s.js → rotate-cw-CClSVUaX.js} +1 -1
  159. package/bizar-dash/dist/assets/{rotate-cw-BDX5SE2s.js.map → rotate-cw-CClSVUaX.js.map} +1 -1
  160. package/bizar-dash/dist/assets/{save-Y0jPK5D6.js → save-BY4ViPku.js} +1 -1
  161. package/bizar-dash/dist/assets/{save-Y0jPK5D6.js.map → save-BY4ViPku.js.map} +1 -1
  162. package/bizar-dash/dist/assets/{send-C8wwPHhR.js → send-CaOL1yQD.js} +1 -1
  163. package/bizar-dash/dist/assets/{send-C8wwPHhR.js.map → send-CaOL1yQD.js.map} +1 -1
  164. package/bizar-dash/dist/assets/{shield-alert-DEvq9UG0.js → shield-alert-DA9K6uZO.js} +1 -1
  165. package/bizar-dash/dist/assets/{shield-alert-DEvq9UG0.js.map → shield-alert-DA9K6uZO.js.map} +1 -1
  166. package/bizar-dash/dist/assets/{trash-2-D6qePV_q.js → trash-2-B_Y6HrfN.js} +1 -1
  167. package/bizar-dash/dist/assets/{trash-2-D6qePV_q.js.map → trash-2-B_Y6HrfN.js.map} +1 -1
  168. package/bizar-dash/dist/assets/{trending-up-BZzo_1ic.js → trending-up-qKTUQKIT.js} +1 -1
  169. package/bizar-dash/dist/assets/{trending-up-BZzo_1ic.js.map → trending-up-qKTUQKIT.js.map} +1 -1
  170. package/bizar-dash/dist/assets/{triangle-alert-B2oHbmoh.js → triangle-alert-BeY8LAv6.js} +1 -1
  171. package/bizar-dash/dist/assets/{triangle-alert-B2oHbmoh.js.map → triangle-alert-BeY8LAv6.js.map} +1 -1
  172. package/bizar-dash/dist/assets/{upload-Dy59aZn6.js → upload-BZCtmqIh.js} +1 -1
  173. package/bizar-dash/dist/assets/{upload-Dy59aZn6.js.map → upload-BZCtmqIh.js.map} +1 -1
  174. package/bizar-dash/dist/assets/{zap-DENVhJnO.js → zap-Bz1Z8y1Q.js} +1 -1
  175. package/bizar-dash/dist/assets/{zap-DENVhJnO.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/server/agent-bus.mjs +485 -0
  179. package/bizar-dash/src/server/api.mjs +6 -0
  180. package/bizar-dash/src/server/loop-runtime.mjs +429 -0
  181. package/bizar-dash/src/server/routes/agent-bus.mjs +185 -0
  182. package/bizar-dash/src/server/routes/loops.mjs +138 -0
  183. package/bizar-dash/src/server/task-splitter.mjs +241 -0
  184. package/bizar-dash/src/web/v8/shell/Sidebar.tsx +41 -31
  185. package/bizar-dash/src/web/v8/shell/Topbar.tsx +63 -23
  186. package/bizar-dash/src/web/v8/ui/feedback/NotificationsPopover.tsx +3 -0
  187. package/bizar-dash/src/web/v8/ui/feedback/useFocusTrap.ts +58 -0
  188. package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +1 -0
  189. package/bizar-dash/src/web/v8/ui/styles/tokens.css +21 -0
  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/LightRAG/LightRAGView.tsx +23 -2
  195. package/bizar-dash/src/web/v8/views/Schedules/SchedulesView.tsx +48 -13
  196. package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +3 -3
  197. package/bizar-dash/tests/agent-bus.test.mjs +289 -0
  198. package/bizar-dash/tests/auth-inputs-labels.test.mjs +45 -0
  199. package/bizar-dash/tests/background-jobs-action-labels.test.mjs +41 -0
  200. package/bizar-dash/tests/background-jobs-states.test.mjs +80 -0
  201. package/bizar-dash/tests/banner-tones.test.mjs +50 -0
  202. package/bizar-dash/tests/callout-tokens.test.mjs +30 -0
  203. package/bizar-dash/tests/claude-session-detail-states.test.mjs +67 -0
  204. package/bizar-dash/tests/components/BackgroundJobsSkeleton.test.tsx +38 -0
  205. package/bizar-dash/tests/density-tokens.test.mjs +46 -0
  206. package/bizar-dash/tests/doctor-route-shape.test.mjs +67 -0
  207. package/bizar-dash/tests/errorstate-retry.test.mjs +42 -0
  208. package/bizar-dash/tests/lightrag-skeleton.test.mjs +31 -0
  209. package/bizar-dash/tests/lightrag-states.test.mjs +60 -0
  210. package/bizar-dash/tests/loop-runtime.test.mjs +312 -0
  211. package/bizar-dash/tests/loops-agent-bus-routes.test.mjs +293 -0
  212. package/bizar-dash/tests/modal-focus-trap.test.mjs +114 -0
  213. package/bizar-dash/tests/orphan-tests-audit.test.mjs +80 -0
  214. package/bizar-dash/tests/palette-keyboard-nav.test.mjs +123 -0
  215. package/bizar-dash/tests/schedules-skeleton.test.mjs +25 -0
  216. package/bizar-dash/tests/schedules-states.test.mjs +67 -0
  217. package/bizar-dash/tests/sidebar-collapse-animation.test.mjs +37 -0
  218. package/bizar-dash/tests/sidebar-section-styles.test.mjs +55 -0
  219. package/bizar-dash/tests/skeleton-height.test.mjs +47 -0
  220. package/bizar-dash/tests/space-tokens.test.mjs +36 -0
  221. package/bizar-dash/tests/stattile-loading.test.mjs +28 -0
  222. package/bizar-dash/tests/task-splitter.test.mjs +268 -0
  223. package/bizar-dash/tests/topbar-popover-styles.test.mjs +53 -0
  224. package/bizar-dash/tests/update-channels.test.mjs +67 -0
  225. package/package.json +1 -1
  226. package/packages/sdk/${HOME}/.bizar_home/memory/projects/sdk/sessions/2026-07-16-e16c2f59.md +14 -0
  227. package/packages/sdk/.bizar/learning/instincts.jsonl +5 -0
  228. package/packages/sdk/package.json +1 -1
  229. package/scripts/loop-log.txt +29 -0
  230. package/scripts/loop-tasks.md +79 -0
  231. package/scripts/overnight-loop.mjs +60 -0
  232. package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js +0 -21
  233. package/bizar-dash/dist/assets/ArtifactsView-CfYB1le1.js.map +0 -1
  234. package/bizar-dash/dist/assets/AuthView-D4frSShw.js.map +0 -1
  235. package/bizar-dash/dist/assets/BackgroundJobsView-DEStvILz.js +0 -1
  236. package/bizar-dash/dist/assets/BackgroundJobsView-DEStvILz.js.map +0 -1
  237. package/bizar-dash/dist/assets/ClaudeSessionsView-BprGo67K.js +0 -1
  238. package/bizar-dash/dist/assets/ClaudeSessionsView-BprGo67K.js.map +0 -1
  239. package/bizar-dash/dist/assets/ClipboardView-CPlTU5VG.js +0 -1
  240. package/bizar-dash/dist/assets/LightRAGView-DvqzQoBp.js +0 -6
  241. package/bizar-dash/dist/assets/LightRAGView-DvqzQoBp.js.map +0 -1
  242. package/bizar-dash/dist/assets/SchedulesView-o9AtIsH9.js +0 -1
  243. package/bizar-dash/dist/assets/SchedulesView-o9AtIsH9.js.map +0 -1
  244. package/bizar-dash/dist/assets/SettingsView-2HSFJPPK.js.map +0 -1
  245. package/bizar-dash/dist/assets/VoiceView-aoPVT6LJ.js +0 -1
  246. package/bizar-dash/dist/assets/main-B7D_IMTh.css +0 -1
  247. package/bizar-dash/dist/assets/main-BURAlktW.js +0 -277
  248. package/bizar-dash/dist/assets/main-BURAlktW.js.map +0 -1
  249. package/bizar-dash/tests/chat-session-create.test.mjs +0 -391
  250. package/bizar-dash/tests/chat-session-stream.test.mjs +0 -308
  251. package/bizar-dash/tests/cline-runner.test.mjs +0 -172
  252. package/bizar-dash/tests/cline-sessions-detail.test.mjs +0 -434
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClaudeSessionsView-BprGo67K.js","sources":["../../src/web/v8/views/ClaudeSessions/ClaudeSessionDetail.tsx","../../src/web/v8/views/ClaudeSessions/ClaudeSessionsView.tsx"],"sourcesContent":["/**\n * v8/views/ClaudeSessions/ClaudeSessionDetail.tsx — Sprint S39, v9.3.0.\n *\n * Right-pane content for the ClaudeSessionSheet. Pulls messages\n * from /api/claude-sessions/:id/messages, lets the user send a\n * follow-up via /api/claude-sessions/:id/send. No streaming in\n * this initial cut — the server's SSE endpoint\n * (/api/claude-sessions/:id/stream) is read by the SDK in\n * production, but for the dashboard we treat send as fire-and-\n * refresh so the user sees the new turn after the resume exits.\n */\n\nimport { useCallback, useState } from 'react';\nimport { Send, RefreshCcw } 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 { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { ChatMessage } from '../../data/types.js';\nimport { MessageBubble } from '../../ui/chat/MessageBubble.js';\n\ninterface MessagesPayload {\n messages: ChatMessage[];\n}\n\nexport function ClaudeSessionDetail({ sessionId }: { sessionId: string }): JSX.Element {\n const url = `/api/claude-sessions/${sessionId}/messages`;\n const payload = useFetch<MessagesPayload>(url);\n const [draft, setDraft] = useState<string>('');\n const [agent, setAgent] = useState<string>('general');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n const messages = payload.data?.messages ?? [];\n\n const send = async (): Promise<void> => {\n const text = draft.trim();\n if (!text || !agent.trim() || busy) return;\n setBusy(true);\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${sessionId}/send`, {\n method: 'POST',\n body: { message: text, agent: agent.trim() },\n });\n setDraft('');\n // The resume spawn is asynchronous; give it a moment then refresh.\n window.setTimeout(() => { refresh(); }, 750);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }} data-testid={`claude-session-detail-${sessionId}`}>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{sessionId}</strong>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid={`claude-session-detail-refresh-${sessionId}`}>\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n </Inline>\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && messages.length === 0 ? (\n <Skeleton style={{ height: 120 }} />\n ) : messages.length === 0 ? (\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-12)' }}>\n No messages yet — start with a follow-up.\n </span>\n ) : (\n <Stack gap={1}>\n {messages.map((m) => (\n <MessageBubble key={m.id || `${m.ts}-${m.role}`} message={m} />\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n {error !== null && (\n <span role=\"alert\" data-testid={`claude-session-detail-error-${sessionId}`} style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>\n <Input\n value={agent}\n data-testid={`claude-session-detail-agent-${sessionId}`}\n onChange={(e) => setAgent((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Follow-up</span>\n <textarea\n value={draft}\n rows={4}\n data-testid={`claude-session-detail-draft-${sessionId}`}\n onChange={(e) => setDraft((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-13)',\n resize: 'vertical',\n }}\n />\n </label>\n <Inline justify=\"end\" gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => void send()}\n disabled={busy || draft.trim() === '' || agent.trim() === ''}\n data-testid={`claude-session-detail-send-${sessionId}`}\n >\n <Send size={14} aria-hidden /> {busy ? 'Sending…' : 'Send'}\n </Button>\n </Inline>\n </Stack>\n );\n}","/**\n * v8/views/ClaudeSessions/ClaudeSessionsView.tsx — Sprint S39, v9.3.0.\n *\n * Claude Code session explorer. Lists sessions on disk (via\n * /api/claude-sessions), lets the user create a new one via Sheet\n * (POST /api/claude-sessions/new), inline-rename (PATCH\n * /api/claude-sessions/:id), inline-confirm delete (DELETE\n * /api/claude-sessions/:id), and opens a right Drawer with the\n * session detail (ClaudeSessionDetail).\n */\n\nimport { useCallback, useState } from 'react';\nimport { Plus, Trash2, Pencil, RefreshCcw, MessageSquareText } 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 { Input } from '../../ui/controls/Input.js';\nimport { Sheet, SheetClose, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { EmptyState } from '../../ui/feedback/EmptyState.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport type { ClaudeSession } from '../../data/types.js';\nimport { ClaudeSessionDetail } from './ClaudeSessionDetail.js';\n\ninterface SessionsPayload {\n sessions: ClaudeSession[];\n}\n\nexport function ClaudeSessionsView(): JSX.Element {\n const payload = useFetch<SessionsPayload>('/api/claude-sessions');\n const [creating, setCreating] = useState<boolean>(false);\n const [detailId, setDetailId] = useState<string | null>(null);\n\n const sessions = payload.data?.sessions ?? [];\n\n const refresh = useCallback(() => { void payload.refetch(); }, [payload]);\n\n return (\n <Stack gap={4} data-testid=\"claude-sessions-view\">\n <ViewHeader\n title=\"Claude sessions\"\n description=\"Claude Code session explorer. Each row is a session directory under ~/.claude/sessions/.\"\n actions={\n <Inline align=\"center\" gap={2}>\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"claude-sessions-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => setCreating(true)} data-testid=\"claude-sessions-new\">\n <Plus size={14} aria-hidden /> New session\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n {payload.loading && sessions.length === 0 ? (\n <Stack gap={2}>\n <Skeleton style={{ height: 36 }} />\n <Skeleton style={{ height: 36 }} />\n </Stack>\n ) : sessions.length === 0 ? (\n <EmptyState\n icon={<MessageSquareText size={28} aria-hidden />}\n title=\"No Claude sessions\"\n description=\"Create one to start a multi-turn conversation with Claude Code.\"\n />\n ) : (\n <Stack gap={2}>\n {sessions.map((s) => (\n <SessionRow key={s.id} session={s} onRefresh={refresh} onOpen={setDetailId} />\n ))}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Sheet open={creating} onOpenChange={setCreating}>\n <SheetContent side=\"right\" title=\"New Claude session\" description=\"Spawn a Claude Code session via the runner.\">\n <NewSessionForm\n onCreated={(id) => {\n setCreating(false);\n refresh();\n setDetailId(id);\n }}\n onCancel={() => setCreating(false)}\n />\n </SheetContent>\n </Sheet>\n\n <Sheet open={detailId !== null} onOpenChange={(open) => { if (!open) setDetailId(null); }}>\n <SheetContent side=\"right\" title=\"Session detail\" description={detailId ?? ''}>\n {detailId !== null && <ClaudeSessionDetail sessionId={detailId} />}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n\nfunction SessionRow({\n session,\n onRefresh,\n onOpen,\n}: {\n session: ClaudeSession;\n onRefresh: () => void;\n onOpen: (id: string) => void;\n}): JSX.Element {\n const [renaming, setRenaming] = useState<boolean>(false);\n const [title, setTitle] = useState<string>(session.title ?? '');\n const [confirmDelete, setConfirmDelete] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const rename = async (): Promise<void> => {\n if (!title.trim()) return;\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${session.id}`, {\n method: 'PATCH',\n body: { title: title.trim() },\n });\n setRenaming(false);\n onRefresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const resume = async (id: string): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${id}/resume`, { method: 'POST', body: {} });\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const remove = async (): Promise<void> => {\n setError(null);\n try {\n await fetchJson(`/api/claude-sessions/${session.id}`, { method: 'DELETE' });\n setConfirmDelete(false);\n onRefresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n return (\n <div\n data-testid={`claude-session-row-${session.id}`}\n style={{\n padding: 'var(--space-3)',\n borderRadius: 'var(--radius-md)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n }}\n >\n <Inline align=\"center\" justify=\"between\" gap={3}>\n <Stack gap={1} style={{ minWidth: 0, flex: 1 }}>\n {renaming ? (\n <Inline gap={1}>\n <Input\n value={title}\n data-testid={`claude-session-rename-input-${session.id}`}\n onChange={(e) => setTitle((e.target as HTMLInputElement).value)}\n />\n <Button variant=\"primary\" onClick={() => void rename()} data-testid={`claude-session-rename-submit-${session.id}`}>Save</Button>\n <Button variant=\"ghost\" onClick={() => { setRenaming(false); setTitle(session.title ?? ''); }}>Cancel</Button>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>{session.title || session.id}</strong>\n {session.agent && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)', fontFamily: 'var(--font-mono)' }}>\n @{session.agent}\n </span>\n )}\n </Inline>\n )}\n <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {session.id}\n </span>\n {error !== null && (\n <span role=\"alert\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n </Stack>\n <Inline gap={1}>\n <Button variant=\"primary\" onClick={() => void resume(session.id)} data-testid={`claude-session-resume-${session.id}`} aria-label={`Resume ${session.id}`}>\n Resume\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpen(session.id)} data-testid={`claude-session-open-${session.id}`}>\n Open\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => { setRenaming(true); setTitle(session.title ?? ''); }}\n data-testid={`claude-session-rename-${session.id}`}\n aria-label={`Rename session ${session.id}`}\n >\n <Pencil size={14} aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => setConfirmDelete((cur) => !cur)}\n data-testid={`claude-session-delete-${session.id}`}\n aria-label={`Delete session ${session.id}`}\n >\n <Trash2 size={14} aria-hidden />\n </Button>\n </Inline>\n </Inline>\n {confirmDelete && (\n <Inline gap={1} style={{ marginTop: 'var(--space-2)' }}>\n <Button variant=\"danger\" onClick={() => void remove()} data-testid={`claude-session-confirm-delete-${session.id}`}>\n Confirm delete\n </Button>\n <Button variant=\"ghost\" onClick={() => setConfirmDelete(false)} data-testid={`claude-session-cancel-delete-${session.id}`}>\n Cancel\n </Button>\n </Inline>\n )}\n </div>\n );\n}\n\nfunction NewSessionForm({\n onCreated,\n onCancel,\n}: {\n onCreated: (id: string) => void;\n onCancel: () => void;\n}): JSX.Element {\n const [title, setTitle] = useState<string>('');\n const [agent, setAgent] = useState<string>('general');\n const [prompt, setPrompt] = useState<string>('');\n const [directory, setDirectory] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = async (): Promise<void> => {\n if (!agent.trim() || !prompt.trim() || busy) return;\n setBusy(true);\n setError(null);\n try {\n const res = await fetchJson<{ id: string }>('/api/claude-sessions/new', {\n method: 'POST',\n body: {\n title: title.trim() || null,\n agent: agent.trim(),\n prompt: prompt.trim(),\n directory: directory.trim() || undefined,\n },\n });\n onCreated(res.id);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={3} style={{ padding: 'var(--space-4)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Title (optional)</span>\n <Input\n value={title}\n data-testid=\"claude-sessions-new-title\"\n onChange={(e) => setTitle((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Agent</span>\n <Input\n value={agent}\n data-testid=\"claude-sessions-new-agent\"\n onChange={(e) => setAgent((e.target as HTMLInputElement).value)}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Seed prompt</span>\n <textarea\n value={prompt}\n rows={4}\n data-testid=\"claude-sessions-new-prompt\"\n onChange={(e) => setPrompt((e.target as HTMLTextAreaElement).value)}\n style={{\n background: 'var(--surface-0)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-md)',\n padding: 'var(--space-2)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-13)',\n resize: 'vertical',\n }}\n />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Working directory (optional)</span>\n <Input\n value={directory}\n data-testid=\"claude-sessions-new-directory\"\n onChange={(e) => setDirectory((e.target as HTMLInputElement).value)}\n />\n </label>\n {error !== null && (\n <span role=\"alert\" data-testid=\"claude-sessions-new-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>\n {error}\n </span>\n )}\n <Inline justify=\"end\" gap={2}>\n <SheetClose asChild>\n <Button variant=\"ghost\" onClick={onCancel} data-testid=\"claude-sessions-new-cancel\">Cancel</Button>\n </SheetClose>\n <Button\n variant=\"primary\"\n onClick={() => void submit()}\n disabled={busy || !agent.trim() || !prompt.trim()}\n data-testid=\"claude-sessions-new-submit\"\n >\n Create\n </Button>\n </Inline>\n </Stack>\n );\n}"],"names":["ClaudeSessionDetail","sessionId","url","payload","useFetch","draft","setDraft","useState","agent","setAgent","busy","setBusy","error","setError","refresh","useCallback","messages","_a","send","text","fetchJson","err","FetchError","jsxs","Stack","Inline","jsx","Button","RefreshCcw","Card","CardBody","Skeleton","m","MessageBubble","Input","e","Send","ClaudeSessionsView","creating","setCreating","detailId","setDetailId","sessions","ViewHeader","Plus","EmptyState","MessageSquareText","s","SessionRow","Sheet","SheetContent","NewSessionForm","id","open","session","onRefresh","onOpen","renaming","setRenaming","title","setTitle","confirmDelete","setConfirmDelete","rename","resume","remove","Pencil","cur","Trash2","onCreated","onCancel","prompt","setPrompt","directory","setDirectory","submit","res","SheetClose"],"mappings":"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"}
@@ -1 +0,0 @@
1
- import{r,j as e}from"./cmdk-C3F6LD6N.js";import{u as z,S as h,I as f,B as n,h as y,$ as w,i as b,F as k}from"./main-BURAlktW.js";import{V as E}from"./ViewHeader-C-t1U2cQ.js";import{C as T,b as D}from"./Card-BtsmkhJa.js";import{I as S}from"./Input-h_nSOtwm.js";import{T as C}from"./Textarea-xnAybFGd.js";import{S as R,a as $}from"./Sheet-B-CMP9-_.js";import{E as L}from"./EmptyState-DjKtY1Qi.js";import{R as B}from"./refresh-ccw-DA8_IB9l.js";import{P as F}from"./plus-Cm6-fo14.js";import{E as I}from"./external-link-DvL89gaZ.js";import{T as P}from"./trash-2-D6qePV_q.js";function Q(){const l=z("/api/clipboard/list"),[v,s]=r.useState(!1),[x,o]=r.useState(null),[u,d]=r.useState(null),p=r.useMemo(()=>{var t;return((t=l.data)==null?void 0:t.clips)??[]},[l.data]),c=r.useCallback(()=>{l.refetch()},[l]),g=async t=>{d(null);try{await b(`/api/clipboard/${t}`,{method:"DELETE"}),o(null),c()}catch(i){d((i instanceof k,i.message))}};return e.jsxs(h,{gap:4,"data-testid":"clipboard-view",children:[e.jsx(E,{title:"Clipboard",description:"Saved clips. Each becomes a markdown note under clips/.",actions:e.jsxs(f,{align:"center",gap:2,children:[u!==null&&e.jsx("span",{role:"alert","data-testid":"clipboard-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:u}),e.jsxs(n,{variant:"ghost",onClick:()=>void c(),"data-testid":"clipboard-refresh",children:[e.jsx(B,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(n,{variant:"primary",onClick:()=>s(!0),"data-testid":"clipboard-add",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Save clip"]})]})}),e.jsx(T,{variant:"default",children:e.jsx(D,{children:l.loading&&p.length===0?e.jsxs(h,{gap:1,children:[e.jsx(y,{style:{height:60}}),e.jsx(y,{style:{height:60}})]}):p.length===0?e.jsx(L,{icon:e.jsx(w,{size:28,"aria-hidden":!0}),title:"No saved clips",description:"Clips are saved URL + text pairs captured from the clipboard during agent work. Each becomes a markdown note under clips/. Save one to get started."}):e.jsx(h,{gap:1,children:p.map(t=>{const i=x===t.id;return e.jsxs("div",{"data-testid":`clipboard-row-${t.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(f,{align:"center",justify:"between",gap:2,children:[e.jsxs(h,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(f,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:t.title||t.id}),t.url&&e.jsxs("a",{href:t.url,target:"_blank",rel:"noreferrer",style:{fontSize:"var(--fs-11)",color:"var(--accent)"},children:[e.jsx(I,{size:10,"aria-hidden":!0,style:{verticalAlign:"middle"}})," ",t.url]}),t.savedAt&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:t.savedAt})]}),(t.selection||t.content)&&e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:(t.selection||t.content||"").length>200?`${(t.selection||t.content||"").slice(0,200)}…`:t.selection||t.content})]}),e.jsx(n,{variant:"ghost",onClick:()=>o(m=>m===t.id?null:t.id),"data-testid":`clipboard-delete-${t.id}`,"aria-label":`Delete ${t.id}`,children:e.jsx(P,{size:14,"aria-hidden":!0})})]}),i&&e.jsxs(f,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(n,{variant:"danger",onClick:()=>void g(t.id),"data-testid":`clipboard-confirm-delete-${t.id}`,children:"Confirm delete"}),e.jsx(n,{variant:"ghost",onClick:()=>o(null),children:"Cancel"})]})]},t.id)})})})}),e.jsx(R,{open:v,onOpenChange:s,children:e.jsx($,{side:"right",title:"Save clip",description:"URL or content required.",children:e.jsx(U,{onSubmit:async t=>{await b("/api/clipboard/save",{method:"POST",body:t}),s(!1),c()},onCancel:()=>s(!1)})})})]})}function U({onSubmit:l,onCancel:v}){const[s,x]=r.useState(""),[o,u]=r.useState(""),[d,p]=r.useState(""),[c,g]=r.useState(""),[t,i]=r.useState(!1),[m,j]=r.useState(null);return e.jsxs(h,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"URL (optional)"}),e.jsx(S,{value:s,onChange:a=>x(a.target.value),"data-testid":"clipboard-form-url"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Title (optional)"}),e.jsx(S,{value:o,onChange:a=>u(a.target.value),"data-testid":"clipboard-form-title"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Content"}),e.jsx(C,{value:d,rows:6,onChange:a=>p(a.target.value),"data-testid":"clipboard-form-content"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Selection (optional)"}),e.jsx(C,{value:c,rows:3,onChange:a=>g(a.target.value),"data-testid":"clipboard-form-selection"})]}),m!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:m}),e.jsxs(f,{justify:"end",gap:2,children:[e.jsx(n,{variant:"ghost",onClick:v,children:"Cancel"}),e.jsx(n,{variant:"primary",disabled:t||!s.trim()&&!d.trim(),"data-testid":"clipboard-form-submit",onClick:async()=>{i(!0),j(null);try{await l({url:s.trim()||void 0,title:o.trim()||void 0,content:d.trim()||void 0,selection:c.trim()||void 0})}catch(a){j((a instanceof k,a.message)),i(!1)}},children:t?"Saving…":"Save"})]})]})}export{Q as ClipboardView};
@@ -1,6 +0,0 @@
1
- import{r as i,j as e}from"./cmdk-C3F6LD6N.js";import{d as D,u as b,S as o,I as r,B as c,h as z,D as I,i as C,F as k}from"./main-BURAlktW.js";import{V as F}from"./ViewHeader-C-t1U2cQ.js";import{C as w,b as B}from"./Card-BtsmkhJa.js";import{I as R}from"./Input-h_nSOtwm.js";import{R as G}from"./refresh-ccw-DA8_IB9l.js";import{S as V}from"./save-Y0jPK5D6.js";import{C as T}from"./circle-6NJF_Xl6.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 H=D("CirclePlay",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polygon",{points:"10 8 16 12 10 16 10 8",key:"1cimsy"}]]);function W(){var S;const t=b("/api/lightrag/defaults"),n=b("/api/lightrag/status"),[g,h]=i.useState(""),[u,f]=i.useState(""),[m,v]=i.useState(!1),[E,p]=i.useState(!1),[x,j]=i.useState(!1),[y,l]=i.useState(null);i.useEffect(()=>{t.data&&(h(t.data.llm??""),f(t.data.embedding??""))},[t.data]);const d=i.useCallback(()=>{t.refetch(),n.refetch()},[t,n]),L=async()=>{v(!0),l(null),p(!1);try{await C("/api/lightrag/defaults",{method:"PUT",body:{llm:g,embedding:u}}),p(!0),d()}catch(s){l((s instanceof k,s.message))}finally{v(!1)}},P=async()=>{j(!0),l(null);try{await C("/api/lightrag/autostart",{method:"POST"}),d()}catch(s){l((s instanceof k,s.message))}finally{j(!1)}},a=n.data;return e.jsxs(o,{gap:4,"data-testid":"lightrag-view",children:[e.jsx(F,{title:"LightRAG",description:"LightRAG defaults + runtime status + autostart.",actions:e.jsxs(r,{align:"center",gap:2,children:[y!==null&&e.jsx("span",{role:"alert","data-testid":"lightrag-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:y}),e.jsxs(c,{variant:"ghost",onClick:()=>void d(),"data-testid":"lightrag-refresh",children:[e.jsx(G,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(c,{variant:"primary",onClick:()=>void L(),disabled:m,"data-testid":"lightrag-save",children:[e.jsx(V,{size:14,"aria-hidden":!0})," ",m?"Saving…":"Save"]})]})}),e.jsx(w,{variant:"default",children:e.jsxs(B,{children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Defaults"}),t.loading&&t.data===null?e.jsx(z,{style:{height:100,marginTop:"var(--space-2)"}}):e.jsxs(o,{gap:2,style:{marginTop:"var(--space-2)"},children:[e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"LLM binding"}),e.jsx(R,{value:g,onChange:s=>h(s.target.value),"data-testid":"lightrag-llm"})]}),e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:"var(--space-1)"},children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Embedding binding"}),e.jsx(R,{value:u,onChange:s=>f(s.target.value),"data-testid":"lightrag-embedding"})]}),((S=t.data)==null?void 0:S.builtin)&&e.jsxs(r,{gap:2,style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:[e.jsx("span",{children:"built-in:"}),e.jsx("code",{children:t.data.builtin.llm})," /",e.jsx("code",{children:t.data.builtin.embedding})]}),E&&e.jsx("span",{"data-testid":"lightrag-saved",style:{color:"var(--success)",fontSize:"var(--fs-12)"},children:"Saved"})]})]})}),e.jsx(w,{variant:"default",children:e.jsxs(B,{children:[e.jsxs(r,{align:"center",justify:"between",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:"Status"}),e.jsxs(r,{align:"center",gap:2,children:[a==null?e.jsx(z,{style:{width:80,height:14}}):a.running?e.jsxs(r,{align:"center",gap:1,"data-testid":"lightrag-running",children:[e.jsx(T,{size:10,"aria-hidden":!0,style:{color:"var(--success)",fill:"var(--success)"}}),e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--success)"},children:["running · pid ",a.pid]})]}):e.jsxs(r,{align:"center",gap:1,"data-testid":"lightrag-stopped",children:[e.jsx(T,{size:10,"aria-hidden":!0,style:{color:"var(--fg-muted)",fill:"var(--fg-muted)"}}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"stopped"})]}),e.jsxs(c,{variant:"ghost",onClick:()=>void P(),disabled:x,"data-testid":"lightrag-autostart",children:[e.jsx(H,{size:14,"aria-hidden":!0})," ",x?"Starting…":"Autostart"]})]})]}),a&&e.jsxs(o,{gap:1,style:{marginTop:"var(--space-2)",fontSize:"var(--fs-12)"},children:[e.jsxs(r,{gap:2,children:[e.jsx(I,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsxs("code",{children:[a.host,":",a.port]}),a.llmBinding&&e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["· llm: ",e.jsx("code",{children:a.llmBinding})]}),a.embeddingBinding&&e.jsxs("span",{style:{color:"var(--fg-muted)"},children:["· embedding: ",e.jsx("code",{children:a.embeddingBinding})]})]}),a.logTail&&a.logTail.length>0&&e.jsx("div",{"data-testid":"lightrag-log",style:{background:"var(--surface-1)",borderRadius:"var(--radius-sm)",padding:"var(--space-2)",fontFamily:"var(--font-mono)",fontSize:"var(--fs-11)",maxHeight:160,overflow:"auto"},children:a.logTail.filter(Boolean).slice(-10).map((s,A)=>e.jsx("div",{children:s},A))})]})]})})]})}export{W as LightRAGView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"LightRAGView-DvqzQoBp.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/circle-play.js","../../src/web/v8/views/LightRAG/LightRAGView.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 CirclePlay = createLucideIcon(\"CirclePlay\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polygon\", { points: \"10 8 16 12 10 16 10 8\", key: \"1cimsy\" }]\n]);\n\nexport { CirclePlay as default };\n//# sourceMappingURL=circle-play.js.map\n","/**\n * v8/views/LightRAG/LightRAGView.tsx — Sprint S43, v9.3.0.\n *\n * Defaults override form (GET/PUT /api/lightrag/defaults), runtime\n * status (GET /api/lightrag/status: running, pid, host:port, log\n * tail), and an Autostart trigger (POST /api/lightrag/autostart).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Database, RefreshCcw, Save, PlayCircle, Circle } 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 { Input } from '../../ui/controls/Input.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\ninterface Defaults {\n llm: string;\n embedding: string;\n source?: string;\n llmSource?: string;\n embeddingSource?: string;\n builtin?: { llm: string; embedding: string };\n envVars?: { BIZAR_LIGHTRAG_LLM: string | null; BIZAR_LIGHTRAG_EMBEDDING: string | null };\n}\n\ninterface Status {\n running: boolean;\n pid: number | null;\n host?: string;\n port?: number;\n llmBinding?: string;\n embeddingBinding?: string;\n llmModel?: string;\n embeddingModel?: string;\n logSize?: number;\n logTail?: string[];\n}\n\nexport function LightRAGView(): JSX.Element {\n const defaultsPayload = useFetch<Defaults>('/api/lightrag/defaults');\n const statusPayload = useFetch<Status>('/api/lightrag/status');\n const [llm, setLlm] = useState<string>('');\n const [embedding, setEmbedding] = useState<string>('');\n const [busy, setBusy] = useState<boolean>(false);\n const [saved, setSaved] = useState<boolean>(false);\n const [autostarting, setAutostarting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (defaultsPayload.data) {\n setLlm(defaultsPayload.data.llm ?? '');\n setEmbedding(defaultsPayload.data.embedding ?? '');\n }\n }, [defaultsPayload.data]);\n\n const refresh = useCallback(() => { void defaultsPayload.refetch(); void statusPayload.refetch(); }, [defaultsPayload, statusPayload]);\n\n const save = async (): Promise<void> => {\n setBusy(true);\n setError(null);\n setSaved(false);\n try {\n await fetchJson('/api/lightrag/defaults', { method: 'PUT', body: { llm, embedding } });\n setSaved(true);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n const autostart = async (): Promise<void> => {\n setAutostarting(true);\n setError(null);\n try {\n await fetchJson('/api/lightrag/autostart', { method: 'POST' });\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setAutostarting(false);\n }\n };\n\n const status = statusPayload.data;\n\n return (\n <Stack gap={4} data-testid=\"lightrag-view\">\n <ViewHeader\n title=\"LightRAG\"\n description=\"LightRAG defaults + runtime status + autostart.\"\n actions={\n <Inline align=\"center\" gap={2}>\n {error !== null && (\n <span role=\"alert\" data-testid=\"lightrag-error\" style={{ color: 'var(--danger)', fontSize: 'var(--fs-12)' }}>{error}</span>\n )}\n <Button variant=\"ghost\" onClick={() => void refresh()} data-testid=\"lightrag-refresh\">\n <RefreshCcw size={14} aria-hidden /> Refresh\n </Button>\n <Button variant=\"primary\" onClick={() => void save()} disabled={busy} data-testid=\"lightrag-save\">\n <Save size={14} aria-hidden /> {busy ? 'Saving…' : 'Save'}\n </Button>\n </Inline>\n }\n />\n\n <Card variant=\"default\">\n <CardBody>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Defaults</strong>\n {defaultsPayload.loading && defaultsPayload.data === null ? (\n <Skeleton style={{ height: 100, marginTop: 'var(--space-2)' }} />\n ) : (\n <Stack gap={2} style={{ marginTop: 'var(--space-2)' }}>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>LLM binding</span>\n <Input value={llm} onChange={(e) => setLlm((e.target as HTMLInputElement).value)} data-testid=\"lightrag-llm\" />\n </label>\n <label style={{ display: 'flex', flexDirection: 'column', gap: 'var(--space-1)' }}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Embedding binding</span>\n <Input value={embedding} onChange={(e) => setEmbedding((e.target as HTMLInputElement).value)} data-testid=\"lightrag-embedding\" />\n </label>\n {defaultsPayload.data?.builtin && (\n <Inline gap={2} style={{ fontSize: 'var(--fs-11)', color: 'var(--fg-subtle)' }}>\n <span>built-in:</span>\n <code>{defaultsPayload.data.builtin.llm}</code> /\n <code>{defaultsPayload.data.builtin.embedding}</code>\n </Inline>\n )}\n {saved && <span data-testid=\"lightrag-saved\" style={{ color: 'var(--success)', fontSize: 'var(--fs-12)' }}>Saved</span>}\n </Stack>\n )}\n </CardBody>\n </Card>\n\n <Card variant=\"default\">\n <CardBody>\n <Inline align=\"center\" justify=\"between\" gap={2}>\n <strong style={{ fontSize: 'var(--fs-13)' }}>Status</strong>\n <Inline align=\"center\" gap={2}>\n {status === null || status === undefined ? (\n <Skeleton style={{ width: 80, height: 14 }} />\n ) : status.running ? (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-running\">\n <Circle size={10} aria-hidden style={{ color: 'var(--success)', fill: 'var(--success)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>running · pid {status.pid}</span>\n </Inline>\n ) : (\n <Inline align=\"center\" gap={1} data-testid=\"lightrag-stopped\">\n <Circle size={10} aria-hidden style={{ color: 'var(--fg-muted)', fill: 'var(--fg-muted)' }} />\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>stopped</span>\n </Inline>\n )}\n <Button variant=\"ghost\" onClick={() => void autostart()} disabled={autostarting} data-testid=\"lightrag-autostart\">\n <PlayCircle size={14} aria-hidden /> {autostarting ? 'Starting…' : 'Autostart'}\n </Button>\n </Inline>\n </Inline>\n {status && (\n <Stack gap={1} style={{ marginTop: 'var(--space-2)', fontSize: 'var(--fs-12)' }}>\n <Inline gap={2}>\n <Database size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <code>{status.host}:{status.port}</code>\n {status.llmBinding && <span style={{ color: 'var(--fg-muted)' }}>· llm: <code>{status.llmBinding}</code></span>}\n {status.embeddingBinding && <span style={{ color: 'var(--fg-muted)' }}>· embedding: <code>{status.embeddingBinding}</code></span>}\n </Inline>\n {status.logTail && status.logTail.length > 0 && (\n <div data-testid=\"lightrag-log\" style={{ background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)', padding: 'var(--space-2)', fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-11)', maxHeight: 160, overflow: 'auto' }}>\n {status.logTail.filter(Boolean).slice(-10).map((l, i) => (<div key={i}>{l}</div>))}\n </div>\n )}\n </Stack>\n )}\n </CardBody>\n </Card>\n </Stack>\n );\n}"],"names":["CirclePlay","createLucideIcon","LightRAGView","defaultsPayload","useFetch","statusPayload","llm","setLlm","useState","embedding","setEmbedding","busy","setBusy","saved","setSaved","autostarting","setAutostarting","error","setError","useEffect","refresh","useCallback","save","fetchJson","err","FetchError","autostart","status","jsxs","Stack","jsx","ViewHeader","Inline","Button","RefreshCcw","Save","Card","CardBody","Skeleton","Input","e","_a","Circle","PlayCircle","Database","l","i"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- import{r as d,j as e}from"./cmdk-C3F6LD6N.js";import{u as P,a as U,S as r,B as l,h as $,I as m,b as u,i as p,F as f}from"./main-BURAlktW.js";import{G as A}from"./Grid--WKvqu5h.js";import{V as B}from"./ViewHeader-C-t1U2cQ.js";import{C as b,b as T}from"./Card-BtsmkhJa.js";import{S as D}from"./Switch-jcYo4lmp.js";import{T as L}from"./Textarea-xnAybFGd.js";import{S as N,a as O}from"./Sheet-B-CMP9-_.js";import{I as x}from"./Input-h_nSOtwm.js";import{P as H}from"./plus-Cm6-fo14.js";import{C as y}from"./clock-ClVA6-hQ.js";import{P as k}from"./play-mJh67AXo.js";import{R as V}from"./refresh-cw-DwlP59en.js";import{T as G}from"./trash-2-D6qePV_q.js";import"./index-B1OIS316.js";const w={interval:"Interval",cron:"Cron",once:"One-time"},M={interval:V,cron:y,once:k};function Y({sched:i}){return i.enabled?i.lastError?e.jsx(u,{tone:"danger",children:"error"}):i.lastRun===null?e.jsx(u,{tone:"info",children:"never run"}):e.jsx(u,{tone:"success",children:"active"}):e.jsx(u,{tone:"neutral",children:"disabled"})}function oe(){const i=P("/api/schedules"),[j,_]=d.useState([]),[a,s]=d.useState(null),[o,c]=d.useState(!1),[S,z]=d.useState(null),[C,h]=d.useState(null);U("schedules:change",d.useCallback(()=>{i.refetch()},[i]));const v=d.useMemo(()=>[...j,...i.data||[]],[j,i.data]),g=()=>{i.refetch()},E=async t=>{h(null);try{await p(`/api/schedules/${encodeURIComponent(t.id)}`,{method:"PATCH",body:{enabled:!t.enabled}}),g()}catch(n){h(n instanceof f?n.message:String(n))}},R=async t=>{h(null),c(!0);try{await p(`/api/schedules/${encodeURIComponent(t.id)}/run`,{method:"POST"}),g()}catch(n){h(n instanceof f?n.message:String(n))}finally{c(!1)}},I=async t=>{h(null),c(!0);try{await p(`/api/schedules/${encodeURIComponent(t)}`,{method:"DELETE"}),g()}catch(n){h(n instanceof f?n.message:String(n))}finally{c(!1)}},F=async()=>{if(!(!a||!a.name.trim()||!a.schedule.trim())){c(!0),z(null);try{const t={type:a.actionType};a.actionType==="agent"&&(t.prompt=a.prompt),a.actionType==="command"&&(t.command=a.prompt),a.id?await p(`/api/schedules/${encodeURIComponent(a.id)}`,{method:"PATCH",body:{name:a.name,type:a.type,schedule:a.schedule,timezone:a.timezone||"UTC",action:t}}):await p("/api/schedules",{method:"POST",body:{name:a.name,type:a.type,schedule:a.schedule,timezone:a.timezone||"UTC",action:t,enabled:!0}}),s(null),g()}catch(t){z(t instanceof f?t.message:String(t))}finally{c(!1)}}};return e.jsxs(r,{gap:5,"data-testid":"schedules-view",children:[e.jsx(B,{title:"Schedules",description:"Recurring and one-time jobs. Toggle enabled, run on demand, or create new.",actions:e.jsxs(l,{variant:"primary",size:"sm",onClick:()=>s({name:"",type:"interval",schedule:"1h",timezone:"UTC",actionType:"agent",prompt:""}),"data-testid":"schedules-new",children:[e.jsx(H,{size:14,"aria-hidden":!0})," New schedule"]})}),C!==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 var(--danger)",borderRadius:"var(--radius-md)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:C}),i.loading&&v.length===0?e.jsx($,{style:{height:240}}):v.length===0?e.jsx(b,{children:e.jsx(T,{children:e.jsxs(r,{gap:1,align:"center",children:[e.jsx(y,{size:32,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{children:"No schedules yet"}),e.jsx("span",{style:{color:"var(--fg-muted)",fontSize:"var(--fs-13)"},children:"Create one with the button above."})]})})}):e.jsx(r,{gap:3,children:v.map(t=>{const n=M[t.type]??y;return e.jsx(b,{"data-testid":`schedule-${t.id}`,children:e.jsx(T,{children:e.jsxs(A,{cols:4,gap:3,style:{alignItems:"center"},children:[e.jsxs(r,{gap:1,children:[e.jsxs(m,{align:"center",gap:2,children:[e.jsx(n,{size:12,"aria-hidden":!0,style:{color:"var(--fg-muted)"}}),e.jsx("strong",{style:{fontSize:"var(--fs-14)"},children:t.name})]}),e.jsxs(m,{gap:2,children:[e.jsx(u,{tone:"neutral",children:w[t.type]}),e.jsx(Y,{sched:t})]})]}),e.jsxs(r,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Schedule"}),e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:t.schedule}),e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:t.timezone})]}),e.jsxs(r,{gap:1,children:[e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Next run"}),t.nextRun?e.jsx("code",{style:{fontFamily:"var(--font-mono)",fontSize:"var(--fs-12)"},children:new Date(t.nextRun).toLocaleString()}):e.jsx("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"—"}),t.lastRun&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:["Last: ",new Date(t.lastRun).toLocaleDateString()]})]}),e.jsxs(m,{align:"center",gap:2,justify:"end",children:[e.jsx(l,{variant:"ghost",size:"sm",onClick:()=>s({id:t.id,name:t.name,type:t.type,schedule:t.schedule,timezone:t.timezone||"UTC",actionType:"agent",prompt:t.action&&t.action.prompt||""}),"data-testid":`schedule-edit-${t.id}`,title:"Edit",children:"Edit"}),e.jsx(l,{variant:"secondary",size:"sm",onClick:()=>{R(t)},disabled:o,"data-testid":`schedule-run-${t.id}`,title:"Run now",children:e.jsx(k,{size:12,"aria-hidden":!0})}),e.jsx(D,{checked:t.enabled,onCheckedChange:()=>{E(t)},"aria-label":`Toggle ${t.name} enabled`}),e.jsx(l,{variant:"danger",size:"sm",onClick:()=>{I(t.id)},disabled:o,"data-testid":`schedule-delete-${t.id}`,title:"Delete",children:e.jsx(G,{size:12,"aria-hidden":!0})})]})]})})},t.id)})}),e.jsx(N,{open:a!==null,onOpenChange:t=>{t||s(null)},children:e.jsx(O,{side:"right",title:a!=null&&a.id?"Edit schedule":"New schedule",children:a!==null&&e.jsxs(r,{gap:4,style:{padding:"var(--space-4)"},children:[e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-name",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Name"}),e.jsx(x,{id:"sched-name",value:a.name,onChange:t=>s({...a,name:t.target.value}),placeholder:"Daily digest",disabled:o})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-type",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Type"}),e.jsx(m,{gap:2,children:["interval","cron","once"].map(t=>e.jsx(l,{variant:a.type===t?"primary":"ghost",size:"sm",onClick:()=>s({...a,type:t}),children:w[t]},t))})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-expr",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.type==="interval"?"Interval (e.g. 1h, 30m)":a.type==="cron"?"Cron expr":"ISO timestamp"}),e.jsx(x,{id:"sched-expr",value:a.schedule,onChange:t=>s({...a,schedule:t.target.value}),placeholder:a.type==="interval"?"1h":a.type==="cron"?"0 9 * * *":"2026-07-14T09:00:00Z",disabled:o,"data-testid":"sched-expr"})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-tz",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Timezone"}),e.jsx(x,{id:"sched-tz",value:a.timezone,onChange:t=>s({...a,timezone:t.target.value}),placeholder:"UTC",disabled:o})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:"Action type"}),e.jsxs(m,{gap:2,children:[e.jsx(l,{variant:a.actionType==="agent"?"primary":"ghost",size:"sm",onClick:()=>s({...a,actionType:"agent"}),children:"Agent prompt"}),e.jsx(l,{variant:a.actionType==="command"?"primary":"ghost",size:"sm",onClick:()=>s({...a,actionType:"command"}),children:"Shell command"})]})]}),e.jsxs(r,{gap:2,children:[e.jsx("label",{htmlFor:"sched-prompt",style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:a.actionType==="agent"?"Agent prompt":"Command"}),e.jsx(L,{id:"sched-prompt",value:a.prompt,onChange:t=>s({...a,prompt:t.target.value}),placeholder:a.actionType==="agent"?"Run the daily digest report…":'echo "hello from cron"',rows:4,disabled:o})]}),S!==null&&e.jsx("div",{role:"alert",style:{padding:"var(--space-2)",background:"color-mix(in oklch, var(--danger) 12%, var(--surface-0))",border:"1px solid var(--danger)",borderRadius:"var(--radius-sm)",fontSize:"var(--fs-12)",color:"var(--danger)"},children:S}),e.jsxs(m,{gap:2,children:[e.jsx(l,{variant:"primary",onClick:()=>{F()},disabled:o||!a.name.trim()||!a.schedule.trim(),children:a!=null&&a.id?"Save":"Create"}),e.jsx(l,{variant:"ghost",onClick:()=>s(null),disabled:o,children:"Cancel"})]})]})})})]})}export{oe as SchedulesView};
@@ -1 +0,0 @@
1
- {"version":3,"file":"SchedulesView-o9AtIsH9.js","sources":["../../src/web/v8/views/Schedules/SchedulesView.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { Plus, Play, Power, Trash2, RefreshCw, Clock, type LucideIcon } from 'lucide-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 { Badge } from '../../ui/data/Badge.js';\nimport { Card, CardBody } from '../../ui/data/Card.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Switch } from '../../ui/controls/Switch.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Sheet, SheetContent } from '../../ui/feedback/Sheet.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\nimport { useWsMessage } from '../../data/useWebSocket.js';\n\n/**\n * SchedulesView — recurring / one-time job management.\n *\n * Renders `/api/schedules` (list), lets users toggle enabled, run on\n * demand, create new schedules (interval / cron / once), and delete.\n */\n\ntype ScheduleType = 'interval' | 'cron' | 'once';\n\ninterface ScheduleAction {\n type: string;\n prompt?: string;\n agent?: string;\n command?: string;\n [key: string]: unknown;\n}\n\ninterface Schedule {\n id: string;\n name: string;\n type: ScheduleType;\n schedule: string;\n timezone: string;\n enabled: boolean;\n createdAt: string;\n updatedAt: string;\n lastRun: string | null;\n lastResult: unknown;\n lastError: unknown;\n nextRun: string | null;\n action: ScheduleAction;\n budgetCheck?: { maxConcurrent: number; skipIfBudgetLow: boolean };\n}\n\ninterface SchedulesResponse extends Array<Schedule> {}\n\ninterface CreateDraft {\n id?: string;\n name: string;\n type: ScheduleType;\n schedule: string;\n timezone: string;\n actionType: string;\n prompt: string;\n}\n\nconst TYPE_LABEL: Record<ScheduleType, string> = {\n interval: 'Interval',\n cron: 'Cron',\n once: 'One-time',\n};\n\nconst TYPE_ICON: Record<ScheduleType, LucideIcon> = {\n interval: RefreshCw,\n cron: Clock,\n once: Play,\n};\n\nfunction StatusBadge({ sched }: { sched: Schedule }): JSX.Element {\n if (!sched.enabled) return <Badge tone=\"neutral\">disabled</Badge>;\n if (sched.lastError) return <Badge tone=\"danger\">error</Badge>;\n if (sched.lastRun === null) return <Badge tone=\"info\">never run</Badge>;\n return <Badge tone=\"success\">active</Badge>;\n}\n\nfunction Box(props: { children?: React.ReactNode; style?: React.CSSProperties }): JSX.Element {\n return <div style={props.style}>{props.children}</div>;\n}\n\nexport function SchedulesView(): JSX.Element {\n const res = useFetch<SchedulesResponse>('/api/schedules');\n const [live, setLive] = useState<Schedule[]>([]);\n const [draft, setDraft] = useState<CreateDraft | null>(null);\n const [busy, setBusy] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n useWsMessage('schedules:change', useCallback(() => { void res.refetch(); }, [res]));\n\n const schedules = useMemo<Schedule[]>(() => [...live, ...(res.data || [])], [live, res.data]);\n\n const refresh = (): void => { void res.refetch(); };\n\n const toggleEnabled = async (s: Schedule): Promise<void> => {\n setActionError(null);\n try {\n await fetchJson(`/api/schedules/${encodeURIComponent(s.id)}`, {\n method: 'PATCH',\n body: { enabled: !s.enabled },\n });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n }\n };\n\n const runNow = async (s: Schedule): Promise<void> => {\n setActionError(null);\n setBusy(true);\n try {\n await fetchJson(`/api/schedules/${encodeURIComponent(s.id)}/run`, { method: 'POST' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const deleteSchedule = async (id: string): Promise<void> => {\n setActionError(null);\n setBusy(true);\n try {\n await fetchJson(`/api/schedules/${encodeURIComponent(id)}`, { method: 'DELETE' });\n refresh();\n } catch (err) {\n setActionError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n const createSchedule = async (): Promise<void> => {\n if (!draft || !draft.name.trim() || !draft.schedule.trim()) return;\n setBusy(true);\n setError(null);\n try {\n const action: ScheduleAction = { type: draft.actionType };\n if (draft.actionType === 'agent') action.prompt = draft.prompt;\n if (draft.actionType === 'command') action.command = draft.prompt;\n if (draft.id) {\n // Edit path — PATCH the existing schedule.\n await fetchJson(`/api/schedules/${encodeURIComponent(draft.id)}`, {\n method: 'PATCH',\n body: {\n name: draft.name,\n type: draft.type,\n schedule: draft.schedule,\n timezone: draft.timezone || 'UTC',\n action,\n },\n });\n } else {\n await fetchJson('/api/schedules', {\n method: 'POST',\n body: {\n name: draft.name,\n type: draft.type,\n schedule: draft.schedule,\n timezone: draft.timezone || 'UTC',\n action,\n enabled: true,\n },\n });\n }\n setDraft(null);\n refresh();\n } catch (err) {\n setError(err instanceof FetchError ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={5} data-testid=\"schedules-view\">\n <ViewHeader\n title=\"Schedules\"\n description=\"Recurring and one-time jobs. Toggle enabled, run on demand, or create new.\"\n actions={\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={() => setDraft({ name: '', type: 'interval', schedule: '1h', timezone: 'UTC', actionType: 'agent', prompt: '' })}\n data-testid=\"schedules-new\"\n >\n <Plus size={14} aria-hidden /> New schedule\n </Button>\n }\n />\n\n {actionError !== null && (\n <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 var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {actionError}\n </div>\n )}\n\n {res.loading && schedules.length === 0 ? (\n <Skeleton style={{ height: 240 }} />\n ) : schedules.length === 0 ? (\n <Card>\n <CardBody>\n <Stack gap={1} align=\"center\">\n <Clock size={32} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong>No schedules yet</strong>\n <span style={{ color: 'var(--fg-muted)', fontSize: 'var(--fs-13)' }}>\n Create one with the button above.\n </span>\n </Stack>\n </CardBody>\n </Card>\n ) : (\n <Stack gap={3}>\n {schedules.map((s) => {\n const TypeIcon = TYPE_ICON[s.type] ?? Clock;\n return (\n <Card key={s.id} data-testid={`schedule-${s.id}`}>\n <CardBody>\n <Grid cols={4} gap={3} style={{ alignItems: 'center' }}>\n <Stack gap={1}>\n <Inline align=\"center\" gap={2}>\n <TypeIcon size={12} aria-hidden style={{ color: 'var(--fg-muted)' }} />\n <strong style={{ fontSize: 'var(--fs-14)' }}>{s.name}</strong>\n </Inline>\n <Inline gap={2}>\n <Badge tone=\"neutral\">{TYPE_LABEL[s.type]}</Badge>\n <StatusBadge sched={s} />\n </Inline>\n </Stack>\n\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Schedule</span>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{s.schedule}</code>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>{s.timezone}</span>\n </Stack>\n\n <Stack gap={1}>\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Next run</span>\n {s.nextRun ? (\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>\n {new Date(s.nextRun).toLocaleString()}\n </code>\n ) : (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>—</span>\n )}\n {s.lastRun && (\n <span style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n Last: {new Date(s.lastRun).toLocaleDateString()}\n </span>\n )}\n </Stack>\n\n <Inline align=\"center\" gap={2} justify=\"end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setDraft({\n id: s.id,\n name: s.name,\n type: s.type,\n schedule: s.schedule,\n timezone: s.timezone || 'UTC',\n actionType: 'agent',\n prompt: (s.action && (s.action as { prompt?: string }).prompt) || '',\n })}\n data-testid={`schedule-edit-${s.id}`}\n title=\"Edit\"\n >\n Edit\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => { void runNow(s); }}\n disabled={busy}\n data-testid={`schedule-run-${s.id}`}\n title=\"Run now\"\n >\n <Play size={12} aria-hidden />\n </Button>\n <Switch\n checked={s.enabled}\n onCheckedChange={() => { void toggleEnabled(s); }}\n aria-label={`Toggle ${s.name} enabled`}\n />\n <Button\n variant=\"danger\"\n size=\"sm\"\n onClick={() => { void deleteSchedule(s.id); }}\n disabled={busy}\n data-testid={`schedule-delete-${s.id}`}\n title=\"Delete\"\n >\n <Trash2 size={12} aria-hidden />\n </Button>\n </Inline>\n </Grid>\n </CardBody>\n </Card>\n );\n })}\n </Stack>\n )}\n\n <Sheet open={draft !== null} onOpenChange={(o) => { if (!o) setDraft(null); }}>\n <SheetContent side=\"right\" title={draft?.id ? 'Edit schedule' : 'New schedule'}>\n {draft !== null && (\n <Stack gap={4} style={{ padding: 'var(--space-4)' }}>\n <Stack gap={2}>\n <label htmlFor=\"sched-name\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Name</label>\n <Input\n id=\"sched-name\"\n value={draft.name}\n onChange={(e) => setDraft({ ...draft, name: e.target.value })}\n placeholder=\"Daily digest\"\n disabled={busy}\n />\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"sched-type\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Type</label>\n <Inline gap={2}>\n {(['interval', 'cron', 'once'] as const).map((t) => (\n <Button\n key={t}\n variant={draft.type === t ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setDraft({ ...draft, type: t })}\n >\n {TYPE_LABEL[t]}\n </Button>\n ))}\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"sched-expr\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {draft.type === 'interval' ? 'Interval (e.g. 1h, 30m)' : draft.type === 'cron' ? 'Cron expr' : 'ISO timestamp'}\n </label>\n <Input\n id=\"sched-expr\"\n value={draft.schedule}\n onChange={(e) => setDraft({ ...draft, schedule: e.target.value })}\n placeholder={draft.type === 'interval' ? '1h' : draft.type === 'cron' ? '0 9 * * *' : '2026-07-14T09:00:00Z'}\n disabled={busy}\n data-testid=\"sched-expr\"\n />\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"sched-tz\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Timezone</label>\n <Input\n id=\"sched-tz\"\n value={draft.timezone}\n onChange={(e) => setDraft({ ...draft, timezone: e.target.value })}\n placeholder=\"UTC\"\n disabled={busy}\n />\n </Stack>\n\n <Stack gap={2}>\n <label style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>Action type</label>\n <Inline gap={2}>\n <Button\n variant={draft.actionType === 'agent' ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setDraft({ ...draft, actionType: 'agent' })}\n >\n Agent prompt\n </Button>\n <Button\n variant={draft.actionType === 'command' ? 'primary' : 'ghost'}\n size=\"sm\"\n onClick={() => setDraft({ ...draft, actionType: 'command' })}\n >\n Shell command\n </Button>\n </Inline>\n </Stack>\n\n <Stack gap={2}>\n <label htmlFor=\"sched-prompt\" style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n {draft.actionType === 'agent' ? 'Agent prompt' : 'Command'}\n </label>\n <Textarea\n id=\"sched-prompt\"\n value={draft.prompt}\n onChange={(e) => setDraft({ ...draft, prompt: e.target.value })}\n placeholder={draft.actionType === 'agent' ? 'Run the daily digest report…' : 'echo \"hello from cron\"'}\n rows={4}\n disabled={busy}\n />\n </Stack>\n\n {error !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-2)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-sm)', fontSize: 'var(--fs-12)', color: 'var(--danger)' }}>\n {error}\n </div>\n )}\n\n <Inline gap={2}>\n <Button\n variant=\"primary\"\n onClick={() => { void createSchedule(); }}\n disabled={busy || !draft.name.trim() || !draft.schedule.trim()}\n >\n {draft?.id ? 'Save' : 'Create'}\n </Button>\n <Button variant=\"ghost\" onClick={() => setDraft(null)} disabled={busy}>\n Cancel\n </Button>\n </Inline>\n </Stack>\n )}\n </SheetContent>\n </Sheet>\n </Stack>\n );\n}\n"],"names":["TYPE_LABEL","TYPE_ICON","RefreshCw","Clock","Play","StatusBadge","sched","Badge","jsx","SchedulesView","res","useFetch","live","setLive","useState","draft","setDraft","busy","setBusy","error","setError","actionError","setActionError","useWsMessage","useCallback","schedules","useMemo","refresh","toggleEnabled","s","fetchJson","err","FetchError","runNow","deleteSchedule","id","createSchedule","action","jsxs","Stack","ViewHeader","Button","Plus","Skeleton","Card","CardBody","TypeIcon","Grid","Inline","Switch","Trash2","Sheet","o","SheetContent","Input","e","Textarea"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SettingsView-2HSFJPPK.js","sources":["../../../node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../node_modules/lucide-react/dist/esm/icons/palette.js","../../../node_modules/lucide-react/dist/esm/icons/sliders-vertical.js","../../src/web/v8/ui/settings/SettingsNav.tsx","../../src/web/v8/views/Settings/SettingsView.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 Keyboard = createLucideIcon(\"Keyboard\", [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n]);\n\nexport { Keyboard as default };\n//# sourceMappingURL=keyboard.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 Palette = createLucideIcon(\"Palette\", [\n [\"circle\", { cx: \"13.5\", cy: \"6.5\", r: \".5\", fill: \"currentColor\", key: \"1okk4w\" }],\n [\"circle\", { cx: \"17.5\", cy: \"10.5\", r: \".5\", fill: \"currentColor\", key: \"f64h9f\" }],\n [\"circle\", { cx: \"8.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"fotxhn\" }],\n [\"circle\", { cx: \"6.5\", cy: \"12.5\", r: \".5\", fill: \"currentColor\", key: \"qy21gx\" }],\n [\n \"path\",\n {\n d: \"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z\",\n key: \"12rzf8\"\n }\n ]\n]);\n\nexport { Palette as default };\n//# sourceMappingURL=palette.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 SlidersVertical = createLucideIcon(\"SlidersVertical\", [\n [\"line\", { x1: \"4\", x2: \"4\", y1: \"21\", y2: \"14\", key: \"1p332r\" }],\n [\"line\", { x1: \"4\", x2: \"4\", y1: \"10\", y2: \"3\", key: \"gb41h5\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"21\", y2: \"12\", key: \"hf2csr\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"3\", key: \"1kfi7u\" }],\n [\"line\", { x1: \"20\", x2: \"20\", y1: \"21\", y2: \"16\", key: \"1lhrwl\" }],\n [\"line\", { x1: \"20\", x2: \"20\", y1: \"12\", y2: \"3\", key: \"16vvfq\" }],\n [\"line\", { x1: \"2\", x2: \"6\", y1: \"14\", y2: \"14\", key: \"1uebub\" }],\n [\"line\", { x1: \"10\", x2: \"14\", y1: \"8\", y2: \"8\", key: \"1yglbp\" }],\n [\"line\", { x1: \"18\", x2: \"22\", y1: \"16\", y2: \"16\", key: \"1jxqpz\" }]\n]);\n\nexport { SlidersVertical as default };\n//# sourceMappingURL=sliders-vertical.js.map\n","import { type ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\n/**\n * SettingsNav — left rail inside the Settings page.\n *\n * Lists each section so the user can jump (or scroll) to it. The active\n * section is highlighted. The nav is a vertical list with section ids\n * as the anchor target; no JS router needed.\n */\n\nexport interface SettingsNavItem {\n id: string;\n title: string;\n icon?: ReactNode;\n}\n\nexport interface SettingsNavProps {\n items: readonly SettingsNavItem[];\n /** The id of the currently-visible section. */\n activeId?: string;\n /** Click handler — usually `() => document.getElementById(id)?.scrollIntoView()`. */\n onSelect?: (id: string) => void;\n className?: string;\n}\n\nexport function SettingsNav(props: SettingsNavProps) {\n const { items, activeId, onSelect, className } = props;\n return (\n <nav aria-label=\"Settings sections\" className={cx('v8-settings-nav', className)}>\n <ul\n style={{\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n }}\n >\n {items.map((item) => {\n const isActive = activeId === item.id;\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n onClick={() => onSelect?.(item.id)}\n aria-current={isActive ? 'true' : undefined}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--space-2)',\n width: '100%',\n padding: 'var(--space-2) var(--space-3)',\n background: isActive ? 'var(--surface-2)' : 'transparent',\n border: 0,\n borderRadius: 'var(--radius-sm)',\n color: isActive ? 'var(--fg)' : 'var(--fg-muted)',\n font: 'inherit',\n fontSize: 'var(--fs-13)',\n fontWeight: isActive ? 500 : 400,\n cursor: 'pointer',\n textAlign: 'left',\n }}\n >\n {item.icon !== undefined && (\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n color: isActive ? 'var(--accent)' : 'var(--fg-subtle)',\n flexShrink: 0,\n }}\n >\n {item.icon}\n </span>\n )}\n <span style={{ minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {item.title}\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n <style>{`\n .v8-settings-nav button:hover { background: var(--surface-2); color: var(--fg); }\n `}</style>\n </nav>\n );\n}","import { useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react';\nimport {\n Palette,\n Keyboard,\n Bell,\n Database,\n Plug,\n Library as LibraryIcon,\n Wrench,\n Activity,\n Brain,\n ShieldCheck,\n Sliders,\n Sparkles,\n Terminal,\n Settings as SettingsIcon,\n Cpu,\n Bot,\n CheckSquare,\n Plus,\n Trash2,\n RotateCw,\n type LucideIcon,\n} from 'lucide-react';\nimport { Stack } from '../../ui/primitives/Stack.js';\nimport { Inline } from '../../ui/primitives/Inline.js';\nimport { Grid } from '../../ui/primitives/Grid.js';\nimport { Switch } from '../../ui/controls/Switch.js';\nimport { Slider } from '../../ui/controls/Slider.js';\nimport { Button } from '../../ui/controls/Button.js';\nimport { Input } from '../../ui/controls/Input.js';\nimport { Textarea } from '../../ui/controls/Textarea.js';\nimport { Badge } from '../../ui/data/Badge.js';\nimport { SettingsSection } from '../../ui/settings/SettingsSection.js';\nimport { SettingsRow } from '../../ui/settings/SettingsRow.js';\nimport { SettingsNav, type SettingsNavItem } from '../../ui/settings/SettingsNav.js';\nimport { Skeleton } from '../../ui/feedback/Skeleton.js';\nimport { useTheme } from '../../ui/theme/useTheme.js';\nimport { useDensity } from '../../ui/theme/useDensity.js';\nimport { useFetch } from '../../data/useFetch.js';\nimport { fetchJson, FetchError } from '../../data/fetcher.js';\n\n/**\n * SettingsView — Sprint S15 expansion. 19 sections (up from 16) with\n * real controls throughout. Every Switch / Select / Slider / Input is\n * either:\n * - live-bound to a Provider (Theme / Density),\n * - persisted via PATCH /api/settings (everything else), or\n * - backed by a small per-section sub-endpoint when present.\n *\n * Sections:\n * 1. General workspace identity + default view\n * 2. Theme color mode + accent + font + radius\n * 3. Density comfortable/compact + base font\n * 4. Density rules per-surface overrides\n * 5. Command palette behaviour + history + fuzzy match + nav\n * 6. Keyboard hotkeys (read-only display + rebinds via /kb)\n * 7. Notifications agent / task / CI / budget / daily digest\n * 8. Storage paths + cache sizes + GC button\n * 9. Plugins mods list with enable toggles\n * 10. MCP servers list + status + click for detail\n * 11. Skills list with enable toggles\n * 12. Hooks list with enable toggles\n * 13. Activity retention + hide list + export\n * 14. Memory scope + auto-commit + search defaults\n * 15. Task defaults default priority / column / assignee\n * 16. Agent defaults default model + spawn flags + max mistakes\n * 17. Privacy telemetry + PII + crash reports\n * 18. Advanced debug overlay + restart server + max mistakes\n */\n\ntype Section = { id: string; title: string; icon: LucideIcon };\n\nconst COMMON_TIMEZONES: readonly string[] = [\n 'UTC',\n 'America/Los_Angeles',\n 'America/Denver',\n 'America/Chicago',\n 'America/New_York',\n 'America/Sao_Paulo',\n 'Europe/London',\n 'Europe/Berlin',\n 'Europe/Amsterdam',\n 'Europe/Paris',\n 'Europe/Madrid',\n 'Europe/Stockholm',\n 'Europe/Istanbul',\n 'Asia/Dubai',\n 'Asia/Kolkata',\n 'Asia/Singapore',\n 'Asia/Tokyo',\n 'Asia/Seoul',\n 'Asia/Shanghai',\n 'Australia/Sydney',\n 'Pacific/Auckland',\n];\n\nconst SECTIONS: Section[] = [\n { id: 'general', title: 'General', icon: SettingsIcon },\n { id: 'theme', title: 'Theme', icon: Palette },\n { id: 'density', title: 'Density', icon: Sliders },\n { id: 'density-rules', title: 'Density rules', icon: Sparkles },\n { id: 'palette', title: 'Command palette', icon: Terminal },\n { id: 'keyboard', title: 'Keyboard', icon: Keyboard },\n { id: 'notifications', title: 'Notifications', icon: Bell },\n { id: 'storage', title: 'Storage', icon: Database },\n { id: 'plugins', title: 'Plugins', icon: Plug },\n { id: 'mcps', title: 'MCP servers', icon: Cpu },\n { id: 'skills', title: 'Skills', icon: LibraryIcon },\n { id: 'hooks', title: 'Hooks', icon: Wrench },\n { id: 'activity', title: 'Activity', icon: Activity },\n { id: 'memory', title: 'Memory', icon: Brain },\n { id: 'task-defaults', title: 'Task defaults', icon: CheckSquare },\n { id: 'agent-defaults', title: 'Agent defaults', icon: Bot },\n { id: 'privacy', title: 'Privacy', icon: ShieldCheck },\n { id: 'advanced', title: 'Advanced', icon: SettingsIcon },\n];\n\ninterface SettingsState {\n workspaceName: string;\n workspaceTimezone: string;\n defaultView: 'overview' | 'tasks' | 'goals' | 'agents' | 'activity' | 'settings';\n themeAccent: string;\n densityBaseFont: number;\n tasksCompact: boolean;\n memoryCompact: boolean;\n activityCompact: boolean;\n paletteHistory: boolean;\n paletteFuzzy: boolean;\n notifyAgentFinished: boolean;\n notifyCiFailed: boolean;\n notifyTokenBudget: boolean;\n notifyDailyDigest: boolean;\n notifyChannel: 'toast' | 'system' | 'both' | 'silent';\n storagePath: string;\n cachePath: string;\n sessionsPath: string;\n cacheSizeMb: number;\n hookPreToolUse: boolean;\n hookPostToolUse: boolean;\n hookTaskStart: boolean;\n hookTaskResume: boolean;\n hookUserPromptSubmit: boolean;\n activityRetentionDays: number;\n memoryAutoCommit: boolean;\n memoryScopeDefault: 'project' | 'global' | 'all';\n defaultTaskPriority: 'low' | 'medium' | 'high' | 'urgent';\n defaultTaskColumn: 'queued' | 'doing' | 'blocked' | 'done';\n defaultAgentModel: string;\n defaultAgentMaxMistakes: number;\n analytics: boolean;\n crashReports: boolean;\n piiMode: 'off' | 'redact' | 'pseudonymize' | 'block';\n reducedMotion: boolean;\n debugOverlay: boolean;\n}\n\nconst DEFAULTS: SettingsState = {\n workspaceName: 'Bizar Harness',\n workspaceTimezone: typeof Intl !== 'undefined' ? Intl.DateTimeFormat().resolvedOptions().timeZone : 'UTC',\n defaultView: 'overview',\n themeAccent: '#5b8def',\n densityBaseFont: 13,\n tasksCompact: false,\n memoryCompact: true,\n activityCompact: false,\n paletteHistory: true,\n paletteFuzzy: true,\n notifyAgentFinished: true,\n notifyCiFailed: true,\n notifyTokenBudget: true,\n notifyDailyDigest: false,\n notifyChannel: 'toast',\n storagePath: '~/.bizar/store.db',\n cachePath: '~/.cache/bizar',\n sessionsPath: '~/.claude/sessions',\n cacheSizeMb: 256,\n hookPreToolUse: true,\n hookPostToolUse: true,\n hookTaskStart: true,\n hookTaskResume: true,\n hookUserPromptSubmit: true,\n activityRetentionDays: 30,\n memoryAutoCommit: true,\n memoryScopeDefault: 'all',\n defaultTaskPriority: 'medium',\n defaultTaskColumn: 'queued',\n defaultAgentModel: 'claude-sonnet-4-5',\n defaultAgentMaxMistakes: 10,\n analytics: true,\n crashReports: true,\n piiMode: 'redact',\n reducedMotion: false,\n debugOverlay: false,\n};\n\nconst SELECT_STYLE: CSSProperties = {\n height: 28,\n padding: '0 var(--space-2)',\n borderRadius: 'var(--radius-sm)',\n border: '1px solid var(--border)',\n background: 'var(--surface-0)',\n color: 'var(--fg)',\n fontFamily: 'var(--font-sans)',\n fontSize: 'var(--fs-12)',\n cursor: 'pointer',\n outline: 'none',\n};\n\nfunction NativeSelect({\n value,\n defaultValue,\n onChange,\n children,\n id_attr,\n}: {\n value?: string;\n defaultValue?: string;\n onChange?: (v: string) => void;\n children: ReactNode;\n id_attr?: string;\n}): JSX.Element {\n return (\n <select\n id={id_attr}\n value={value}\n defaultValue={defaultValue}\n onChange={(e) => onChange?.(e.target.value)}\n style={SELECT_STYLE}\n >\n {children}\n </select>\n );\n}\n\nfunction Count({ loading, value }: { loading: boolean; value: number | undefined }): JSX.Element {\n if (loading) return <Skeleton style={{ width: 32, height: 16 }} />;\n return <code style={{ fontFamily: 'var(--font-mono)' }}>{value ?? 0}</code>;\n}\n\nexport function SettingsView(): JSX.Element {\n const [activeId, setActiveId] = useState<string>('general');\n const theme = useTheme();\n const density = useDensity();\n const [settings, setSettings] = useState<SettingsState>(DEFAULTS);\n const [savedAt, setSavedAt] = useState<number | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const [lastAction, setLastAction] = useState<string | null>(null);\n\n // Run an admin endpoint with confirm + busy state + error surface.\n const runAdmin = async (label: string, method: 'POST' | 'DELETE', path: string, confirmMsg: string): Promise<void> => {\n if (typeof window !== 'undefined' && typeof window.confirm === 'function' && !window.confirm(confirmMsg)) return;\n setBusy(label);\n setError(null);\n try {\n await fetchJson(path, { method });\n setLastAction(`${label} @ ${new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}`);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n };\n\n // GET that triggers a browser download (NDJSON for the activity log).\n const downloadFile = (path: string, filename: string): void => {\n if (typeof window === 'undefined') return;\n const a = document.createElement('a');\n a.href = path;\n a.download = filename;\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n };\n\n const skillsRes = useFetch<{ skills?: { name: string; source: string }[] }>('/api/skills?kind=skills');\n const mcpsRes = useFetch<{ skills?: { name: string }[] }>('/api/skills?kind=mcps');\n const hooksRes = useFetch<{ skills?: { name: string }[] }>('/api/skills?kind=hooks');\n const agentsRes = useFetch<{ agents?: { name: string }[] }>('/api/agents');\n\n // Hydrate from the server. The server returns the merged\n // (defaults + persisted overrides) shape, so we can spread it\n // directly over our DEFAULTS to pick up any keys we don't model.\n const settingsRes = useFetch<Partial<SettingsState>>('/api/settings');\n useEffect(() => {\n if (settingsRes.data) {\n setSettings((prev) => ({ ...prev, ...settingsRes.data }));\n }\n }, [settingsRes.data]);\n\n const update = <K extends keyof SettingsState>(key: K, value: SettingsState[K]): void => {\n setSettings((s) => ({ ...s, [key]: value }));\n void patch(key, value);\n };\n\n const patch = async (key: string, value: unknown): Promise<void> => {\n try {\n // The settings endpoint accepts a partial body and merges with\n // existing values on the server side — so PUT /api/settings\n // with { [key]: value } is the canonical \"update one row\" path.\n // We re-PUT the full merged shape so the server has the latest\n // copy of every key we know about.\n const merged = { ...settings, [key]: value };\n await fetchJson('/api/settings', { method: 'PUT', body: merged });\n setSavedAt(Date.now());\n setError(null);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n };\n\n const navItems: SettingsNavItem[] = SECTIONS.map((s) => ({\n id: s.id,\n title: s.title,\n icon: <s.icon size={14} aria-hidden=\"true\" />,\n }));\n\n const handleSelect = (id: string): void => {\n setActiveId(id);\n requestAnimationFrame(() => {\n document.getElementById(id)?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n });\n };\n\n const rootRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (typeof IntersectionObserver === 'undefined') return;\n const targets = SECTIONS\n .map((s) => document.getElementById(s.id))\n .filter((el): el is HTMLElement => el !== null);\n if (targets.length === 0) return;\n const visible = new Map<string, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const id = entry.target.id;\n if (entry.isIntersecting) visible.set(id, entry.intersectionRatio);\n else visible.delete(id);\n }\n if (visible.size === 0) return;\n let bestId: string | undefined;\n let bestRatio = -1;\n for (const [id, ratio] of visible) {\n if (ratio > bestRatio) { bestRatio = ratio; bestId = id; }\n }\n if (bestId) setActiveId(bestId);\n },\n { rootMargin: '-30% 0px -50% 0px', threshold: [0, 0.25, 0.5, 0.75, 1] },\n );\n for (const t of targets) observer.observe(t);\n return () => observer.disconnect();\n }, []);\n\n return (\n <div ref={rootRef} data-testid=\"settings-view\">\n <Grid cols={3} gap={5}>\n <aside style={{ position: 'sticky', top: 0, alignSelf: 'start' }}>\n <SettingsNav items={navItems} activeId={activeId} onSelect={handleSelect} />\n </aside>\n <Stack gap={5} style={{ gridColumn: 'span 2' }}>\n {error !== null && (\n <div role=\"alert\" style={{ padding: 'var(--space-3)', background: 'color-mix(in oklch, var(--danger) 12%, var(--surface-0))', border: '1px solid var(--danger)', borderRadius: 'var(--radius-md)', fontSize: 'var(--fs-12)' }}>\n {error}\n </div>\n )}\n {savedAt !== null && (\n <Inline align=\"center\" justify=\"end\" gap={2} style={{ fontSize: 'var(--fs-12)', color: 'var(--fg-muted)' }}>\n <span>Settings saved</span>\n <span style={{ fontFamily: 'var(--font-mono)' }}>\n {new Date(savedAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n </Inline>\n )}\n {lastAction !== null && (\n <Inline align=\"center\" justify=\"end\" gap={2} style={{ fontSize: 'var(--fs-12)', color: 'var(--success)' }}>\n <span>Last action:</span> <code style={{ fontFamily: 'var(--font-mono)' }}>{lastAction}</code>\n </Inline>\n )}\n\n {/* 1. General */}\n <SettingsSection id=\"general\" title=\"General\" description=\"Workspace identity + default landing page.\" icon={<SettingsIcon size={14} aria-hidden />}>\n <SettingsRow\n id=\"workspace-name\"\n label=\"Workspace name\"\n description=\"Shown in the topbar and command palette.\"\n control={\n <Input\n value={settings.workspaceName}\n onChange={(e) => update('workspaceName', e.target.value)}\n style={{ width: 240 }}\n />\n }\n />\n <SettingsRow\n id=\"workspace-timezone\"\n label=\"Timezone\"\n description=\"Used for activity timestamps + digests.\"\n control={\n <NativeSelect value={settings.workspaceTimezone} onChange={(v) => update('workspaceTimezone', v)} id_attr=\"workspace-timezone-select\">\n {COMMON_TIMEZONES.map((tz) => (\n <option key={tz} value={tz}>{tz}</option>\n ))}\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"default-view\"\n label=\"Default view on launch\"\n control={\n <NativeSelect value={settings.defaultView} onChange={(v) => update('defaultView', v as SettingsState['defaultView'])}>\n <option value=\"overview\">Overview</option>\n <option value=\"tasks\">Tasks</option>\n <option value=\"goals\">Goals</option>\n <option value=\"agents\">Agents</option>\n <option value=\"activity\">Activity</option>\n <option value=\"settings\">Settings</option>\n </NativeSelect>\n }\n />\n </SettingsSection>\n\n {/* 2. Theme */}\n <SettingsSection id=\"theme\" title=\"Theme\" description=\"Color mode + accent + typography.\" icon={<Palette size={14} aria-hidden />}>\n <SettingsRow\n id=\"theme-mode\"\n label=\"Color mode\"\n control={\n <NativeSelect value={theme.mode} onChange={(v) => theme.setMode(v as 'light' | 'dark' | 'system')}>\n <option value=\"system\">System</option>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"theme-accent\"\n label=\"Accent color\"\n description=\"Personalize the leading-edge accent stripe.\"\n control={\n <Inline align=\"center\" gap={2}>\n <input\n type=\"color\"\n value={settings.themeAccent}\n onChange={(e) => update('themeAccent', e.target.value)}\n style={{ width: 40, height: 28, border: '1px solid var(--border)', borderRadius: 'var(--radius-sm)', background: 'transparent', cursor: 'pointer' }}\n />\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{settings.themeAccent}</code>\n </Inline>\n }\n />\n <SettingsRow\n id=\"theme-font\"\n label=\"Font family\"\n description=\"Body type. System fonts reduce render time.\"\n control={\n <NativeSelect defaultValue=\"inter\" onChange={(v) => void patch('themeFont', v)}>\n <option value=\"inter\">Inter</option>\n <option value=\"system\">System UI</option>\n <option value=\"jetbrains\">JetBrains Mono</option>\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"theme-radius\"\n label=\"Border radius\"\n description=\"0 = sharp; 16 = rounded.\"\n control={\n <Inline align=\"center\" gap={2}>\n <Slider\n defaultValue={[8]}\n min={0}\n max={16}\n step={1}\n onValueChange={(v) => void patch('themeRadius', v[0] ?? 8)}\n />\n <code style={{ fontFamily: 'var(--font-mono)' }}>{(settings as unknown as Record<string, unknown>).themeRadius as number ?? 8}px</code>\n </Inline>\n }\n />\n </SettingsSection>\n\n {/* 3. Density */}\n <SettingsSection id=\"density\" title=\"Density\" description=\"Comfortable by default. Compact fits more on screen.\" icon={<Sliders size={14} aria-hidden />}>\n <SettingsRow\n id=\"density-mode\"\n label=\"Density\"\n control={\n <NativeSelect value={density.density} onChange={(v) => density.setDensity(v as 'comfortable' | 'compact')}>\n <option value=\"comfortable\">Comfortable</option>\n <option value=\"compact\">Compact</option>\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"density-base-font\"\n label=\"Base font size\"\n description=\"Adjusts the `--fs-13` token globally.\"\n control={\n <Inline align=\"center\" gap={2}>\n <Slider\n value={[settings.densityBaseFont]}\n onValueChange={(v) => update('densityBaseFont', v[0] ?? 13)}\n min={11} max={16} step={1}\n />\n <code style={{ fontFamily: 'var(--font-mono)' }}>{settings.densityBaseFont}px</code>\n </Inline>\n }\n />\n </SettingsSection>\n\n {/* 4. Density rules */}\n <SettingsSection id=\"density-rules\" title=\"Density rules\" description=\"Override density per surface.\" icon={<Sparkles size={14} aria-hidden />}>\n <SettingsRow id=\"tasks-compact\" label=\"Tasks page — compact by default\" control={<Switch checked={settings.tasksCompact} onCheckedChange={(v) => update('tasksCompact', v)} />} />\n <SettingsRow id=\"memory-compact\" label=\"Memory page — compact by default\" control={<Switch checked={settings.memoryCompact} onCheckedChange={(v) => update('memoryCompact', v)} />} />\n <SettingsRow id=\"activity-compact\" label=\"Activity page — compact by default\" control={<Switch checked={settings.activityCompact} onCheckedChange={(v) => update('activityCompact', v)} />} />\n </SettingsSection>\n\n {/* 5. Command palette */}\n <SettingsSection id=\"palette\" title=\"Command palette\" description=\"How the ⌘K palette behaves.\" icon={<Terminal size={14} aria-hidden />}>\n <SettingsRow id=\"palette-history\" label=\"Show recent commands\" control={<Switch checked={settings.paletteHistory} onCheckedChange={(v) => update('paletteHistory', v)} />} />\n <SettingsRow id=\"palette-fuzzy\" label=\"Fuzzy match\" control={<Switch checked={settings.paletteFuzzy} onCheckedChange={(v) => update('paletteFuzzy', v)} />} />\n <SettingsRow id=\"palette-navigate\" label=\"Show navigation group\" control={<Switch defaultChecked onCheckedChange={(v) => patch('paletteNavigate', v)} />} />\n <SettingsRow id=\"palette-spawn\" label=\"Show agent-spawn group\" control={<Switch defaultChecked onCheckedChange={(v) => patch('paletteSpawn', v)} />} />\n <SettingsRow\n id=\"palette-scope\"\n label=\"Default scope\"\n description=\"Where palette actions apply when no context.\"\n control={\n <NativeSelect defaultValue=\"project\" onChange={(v) => void patch('paletteScope', v)}>\n <option value=\"project\">Active project</option>\n <option value=\"global\">Global</option>\n </NativeSelect>\n }\n />\n </SettingsSection>\n\n {/* 6. Keyboard */}\n <SettingsSection id=\"keyboard\" title=\"Keyboard\" description=\"Hotkey bindings (read-only here; rebind in ~/.claude/keybindings.json).\" icon={<Keyboard size={14} aria-hidden />}>\n <SettingsRow id=\"kb-palette\" label=\"Open command palette\" control={<code style={{ fontFamily: 'var(--font-mono)' }}>⌘K</code>} />\n <SettingsRow id=\"kb-search\" label=\"Search tasks\" control={<code style={{ fontFamily: 'var(--font-mono)' }}>⌘/</code>} />\n <SettingsRow id=\"kb-newtask\" label=\"New task\" control={<code style={{ fontFamily: 'var(--font-mono)' }}>⌘N</code>} />\n <SettingsRow id=\"kb-toggle-theme\" label=\"Toggle theme\" control={<code style={{ fontFamily: 'var(--font-mono)' }}>⌘⇧L</code>} />\n <SettingsRow id=\"kb-toggle-density\" label=\"Toggle density\" control={<code style={{ fontFamily: 'var(--font-mono)' }}>⌘⇧D</code>} />\n <SettingsRow id=\"kb-reload\" label=\"Reload window\" control={<code style={{ fontFamily: 'var(--font-mono)' }}>⌘R</code>} />\n </SettingsSection>\n\n {/* 7. Notifications */}\n <SettingsSection id=\"notifications\" title=\"Notifications\" description=\"When the harness should ping you.\" icon={<Bell size={14} aria-hidden />}>\n <SettingsRow id=\"n-agent-finished\" label=\"Agent run finished\" control={<Switch checked={settings.notifyAgentFinished} onCheckedChange={(v) => update('notifyAgentFinished', v)} />} />\n <SettingsRow id=\"n-task-moved\" label=\"Task moved between columns\" control={<Switch defaultChecked onCheckedChange={(v) => void patch('notifyTaskMoved', v)} />} />\n <SettingsRow id=\"n-ci-failed\" label=\"CI failed\" control={<Switch checked={settings.notifyCiFailed} onCheckedChange={(v) => update('notifyCiFailed', v)} />} />\n <SettingsRow id=\"n-token-budget\" label=\"Token budget 80%\" control={<Switch checked={settings.notifyTokenBudget} onCheckedChange={(v) => update('notifyTokenBudget', v)} />} />\n <SettingsRow id=\"n-daily-digest\" label=\"Daily digest at 09:00\" control={<Switch checked={settings.notifyDailyDigest} onCheckedChange={(v) => update('notifyDailyDigest', v)} />} />\n <SettingsRow\n id=\"n-channel\"\n label=\"Channel\"\n description=\"Where notifications render.\"\n control={\n <NativeSelect value={settings.notifyChannel} onChange={(v) => update('notifyChannel', v as SettingsState['notifyChannel'])}>\n <option value=\"toast\">In-app toast</option>\n <option value=\"system\">OS notification</option>\n <option value=\"both\">Both</option>\n <option value=\"silent\">Silent</option>\n </NativeSelect>\n }\n />\n </SettingsSection>\n\n {/* 8. Storage */}\n <SettingsSection id=\"storage\" title=\"Storage\" description=\"Where local data lives.\" icon={<Database size={14} aria-hidden />}>\n <SettingsRow\n id=\"store-path\"\n label=\"Local store path\"\n control={\n <Input\n value={settings.storagePath}\n onChange={(e) => update('storagePath', e.target.value)}\n style={{ width: 280, fontFamily: 'var(--font-mono)' }}\n />\n }\n />\n <SettingsRow\n id=\"cache-path\"\n label=\"Cache directory\"\n control={\n <Input\n value={settings.cachePath}\n onChange={(e) => update('cachePath', e.target.value)}\n style={{ width: 280, fontFamily: 'var(--font-mono)' }}\n />\n }\n />\n <SettingsRow\n id=\"sessions-path\"\n label=\"Claude Code sessions\"\n control={\n <Input\n value={settings.sessionsPath}\n onChange={(e) => update('sessionsPath', e.target.value)}\n style={{ width: 280, fontFamily: 'var(--font-mono)' }}\n />\n }\n />\n <SettingsRow\n id=\"cache-size\"\n label=\"Cache budget\"\n description=\"Soft cap (MB) before LRU eviction.\"\n control={\n <Inline align=\"center\" gap={2}>\n <Slider\n value={[settings.cacheSizeMb]}\n onValueChange={(v) => update('cacheSizeMb', v[0] ?? 256)}\n min={64}\n max={4096}\n step={32}\n />\n <code style={{ fontFamily: 'var(--font-mono)' }}>{settings.cacheSizeMb} MB</code>\n </Inline>\n }\n />\n <SettingsRow\n id=\"store-gc\"\n label=\"Garbage collect\"\n description=\"Prune empty sessions and orphaned tasks.\"\n control={<Button variant=\"secondary\" disabled={busy === 'gc'} onClick={() => void runAdmin('gc', 'POST', '/api/admin/gc', 'Run garbage collect?')}>{busy === 'gc' ? 'Running…' : 'Run GC'}</Button>}\n />\n <SettingsRow\n id=\"store-clear\"\n label=\"Clear local cache\"\n description=\"Destructive. Wipes the activity log and snapshots.\"\n control={<Button variant=\"danger\" disabled={busy === 'clear'} onClick={() => void runAdmin('cache/clear', 'POST', '/api/admin/cache/clear', 'Clear dashboard cache? This is reversible but will log you out briefly.')}>{busy === 'clear' ? 'Clearing…' : 'Clear…'}</Button>}\n />\n </SettingsSection>\n\n {/* 9. Plugins */}\n <SettingsSection id=\"plugins\" title=\"Plugins\" description=\"Plugin registrations under `.claude/`.\" icon={<Plug size={14} aria-hidden />}>\n <SettingsRow\n id=\"plugins-count\"\n label=\"Loaded plugins\"\n control={<Count loading={agentsRes.loading} value={agentsRes.data?.agents?.length ?? 0} />}\n />\n <SettingsRow\n id=\"plugins-bizar\"\n label=\"Bizar\"\n description=\"Core plugin. Required — disable with care.\"\n control={<Switch defaultChecked disabled />}\n />\n {Array.isArray(agentsRes.data?.agents) && agentsRes.data.agents.length > 0 && (\n <SettingsRow\n id=\"plugins-list\"\n label=\"Active agents\"\n control={\n <Stack gap={1} style={{ maxHeight: 200, overflowY: 'auto', width: 360 }}>\n {agentsRes.data.agents.map((a) => (\n <Inline key={a.name} align=\"center\" justify=\"between\" style={{ padding: '4px 8px', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{a.name}</code>\n <Badge tone=\"success\">active</Badge>\n </Inline>\n ))}\n </Stack>\n }\n />\n )}\n </SettingsSection>\n\n {/* 10. MCPs */}\n <SettingsSection id=\"mcps\" title=\"MCP servers\" description=\"Model Context Protocol servers.\" icon={<Cpu size={14} aria-hidden />}>\n <SettingsRow id=\"mcps-count\" label=\"Registered MCPs\" control={<Count loading={mcpsRes.loading} value={mcpsRes.data?.skills?.length ?? 0} />} />\n {Array.isArray(mcpsRes.data?.skills) && mcpsRes.data.skills.length > 0 && (\n <SettingsRow\n id=\"mcps-list\"\n label=\"Servers\"\n control={\n <Stack gap={1} style={{ maxHeight: 220, overflowY: 'auto', width: 360 }}>\n {mcpsRes.data.skills.map((m) => (\n <Inline key={m.name} align=\"center\" justify=\"between\" style={{ padding: '4px 8px', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{m.name}</code>\n <Switch defaultChecked onCheckedChange={(v) => void patch(`mcp:${m.name}`, v)} />\n </Inline>\n ))}\n </Stack>\n }\n />\n )}\n </SettingsSection>\n\n {/* 11. Skills */}\n <SettingsSection id=\"skills\" title=\"Skills\" description=\"Bizar skill packs.\" icon={<LibraryIcon size={14} aria-hidden />}>\n <SettingsRow id=\"skills-count\" label=\"Loaded skills\" control={<Count loading={skillsRes.loading} value={skillsRes.data?.skills?.length ?? 0} />} />\n {Array.isArray(skillsRes.data?.skills) && skillsRes.data.skills.length > 0 && (\n <SettingsRow\n id=\"skills-list\"\n label=\"Skill packs\"\n control={\n <Stack gap={1} style={{ maxHeight: 260, overflowY: 'auto', width: 360 }}>\n {skillsRes.data.skills.map((s) => (\n <Inline key={s.name} align=\"center\" justify=\"between\" style={{ padding: '4px 8px', background: 'var(--surface-1)', borderRadius: 'var(--radius-sm)' }}>\n <Inline align=\"center\" gap={2}>\n <code style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-12)' }}>{s.name}</code>\n <Badge tone=\"neutral\">{s.source}</Badge>\n </Inline>\n <Switch defaultChecked onCheckedChange={(v) => void patch(`skill:${s.name}`, v)} />\n </Inline>\n ))}\n </Stack>\n }\n />\n )}\n </SettingsSection>\n\n {/* 12. Hooks */}\n <SettingsSection id=\"hooks\" title=\"Hooks\" description=\"Executable hook scripts.\" icon={<Wrench size={14} aria-hidden />}>\n <SettingsRow id=\"hooks-count\" label=\"Registered hooks\" control={<Count loading={hooksRes.loading} value={hooksRes.data?.skills?.length ?? 0} />} />\n <SettingsRow id=\"hooks-pretool\" label=\"PreToolUse\" description=\"Block writes to .env / secrets / node_modules.\" control={<Switch checked={settings.hookPreToolUse} onCheckedChange={(v) => update('hookPreToolUse', v)} />} />\n <SettingsRow id=\"hooks-posttool\" label=\"PostToolUse\" description=\"Log tool latency to ~/.config/bizar/hook-logs/.\" control={<Switch checked={settings.hookPostToolUse} onCheckedChange={(v) => update('hookPostToolUse', v)} />} />\n <SettingsRow id=\"hooks-taskstart\" label=\"TaskStart\" description=\"Prime AI with project context.\" control={<Switch checked={settings.hookTaskStart} onCheckedChange={(v) => update('hookTaskStart', v)} />} />\n <SettingsRow id=\"hooks-taskresume\" label=\"TaskResume\" description=\"Re-read state + check git log.\" control={<Switch checked={settings.hookTaskResume} onCheckedChange={(v) => update('hookTaskResume', v)} />} />\n <SettingsRow id=\"hooks-prompt\" label=\"UserPromptSubmit\" description=\"Tag prompts for routing.\" control={<Switch checked={settings.hookUserPromptSubmit} onCheckedChange={(v) => update('hookUserPromptSubmit', v)} />} />\n </SettingsSection>\n\n {/* 13. Activity */}\n <SettingsSection id=\"activity\" title=\"Activity\" description=\"Stream retention + export.\" icon={<Activity size={14} aria-hidden />}>\n <SettingsRow\n id=\"activity-retention\"\n label=\"Retain last\"\n control={\n <Inline align=\"center\" gap={2}>\n <Slider value={[settings.activityRetentionDays]} onValueChange={(v) => update('activityRetentionDays', v[0] ?? 30)} min={7} max={365} step={1} />\n <code style={{ fontFamily: 'var(--font-mono)' }}>{settings.activityRetentionDays} days</code>\n </Inline>\n }\n />\n <SettingsRow\n id=\"activity-hide\"\n label=\"Hide noisy event types\"\n description=\"Comma-separated kinds. E.g. 'heartbeat,ping'.\"\n control={<Input\n placeholder=\"heartbeat, ping, system\"\n defaultValue={String((settings as unknown as Record<string, unknown>).activityHide ?? '')}\n onBlur={(e) => void patch('activityHide', e.target.value)}\n style={{ width: 280 }}\n />}\n />\n <SettingsRow\n id=\"activity-export\"\n label=\"Export\"\n description=\"Download the full activity log as NDJSON.\"\n control={<Button variant=\"secondary\" onClick={() => downloadFile('/api/admin/activity/export', 'activity.ndjson')}>Export…</Button>}\n />\n </SettingsSection>\n\n {/* 14. Memory */}\n <SettingsSection id=\"memory\" title=\"Memory\" description=\"Cross-session memo behavior.\" icon={<Brain size={14} aria-hidden />}>\n <SettingsRow id=\"memory-auto-commit\" label=\"Auto-commit project memos\" control={<Switch checked={settings.memoryAutoCommit} onCheckedChange={(v) => update('memoryAutoCommit', v)} />} />\n <SettingsRow\n id=\"memory-scope\"\n label=\"Default scope filter\"\n control={\n <NativeSelect value={settings.memoryScopeDefault} onChange={(v) => update('memoryScopeDefault', v as SettingsState['memoryScopeDefault'])}>\n <option value=\"project\">Project</option>\n <option value=\"global\">Global</option>\n <option value=\"all\">All</option>\n </NativeSelect>\n }\n />\n <SettingsRow id=\"memory-index\" label=\"Re-index vault\" description=\"Rebuild search index. May take a moment.\" control={<Button variant=\"secondary\" disabled={busy === 'reindex'} onClick={() => void runAdmin('memory/reindex', 'POST', '/api/admin/memory/reindex', 'Rebuild the memory vault search index?')}>{busy === 'reindex' ? 'Re-indexing…' : 'Re-index'}</Button>} />\n </SettingsSection>\n\n {/* 15. Task defaults */}\n <SettingsSection id=\"task-defaults\" title=\"Task defaults\" description=\"Defaults applied to new tasks.\" icon={<CheckSquare size={14} aria-hidden />}>\n <SettingsRow\n id=\"task-priority\"\n label=\"Default priority\"\n control={\n <NativeSelect value={settings.defaultTaskPriority} onChange={(v) => update('defaultTaskPriority', v as SettingsState['defaultTaskPriority'])}>\n <option value=\"low\">Low</option>\n <option value=\"medium\">Medium</option>\n <option value=\"high\">High</option>\n <option value=\"urgent\">Urgent</option>\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"task-column\"\n label=\"Default column\"\n control={\n <NativeSelect value={settings.defaultTaskColumn} onChange={(v) => update('defaultTaskColumn', v as SettingsState['defaultTaskColumn'])}>\n <option value=\"queued\">Backlog</option>\n <option value=\"doing\">In progress</option>\n <option value=\"blocked\">In review</option>\n <option value=\"done\">Done</option>\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"task-assignee\"\n label=\"Default assignee\"\n description=\"Auto-assigns new tasks to this agent (empty = unassigned).\"\n control={<Input placeholder=\"odin\" defaultValue={String((settings as unknown as Record<string, unknown>).defaultTaskAssignee ?? '')} onBlur={(e) => void patch('defaultTaskAssignee', e.target.value)} style={{ width: 240 }} />}\n />\n </SettingsSection>\n\n {/* 16. Agent defaults */}\n <SettingsSection id=\"agent-defaults\" title=\"Agent defaults\" description=\"Defaults applied when spawning agents.\" icon={<Bot size={14} aria-hidden />}>\n <SettingsRow\n id=\"agent-model\"\n label=\"Default model\"\n control={\n <Input value={settings.defaultAgentModel} onChange={(e) => update('defaultAgentModel', e.target.value)} style={{ width: 240 }} />\n }\n />\n <SettingsRow\n id=\"agent-mistakes\"\n label=\"Max consecutive mistakes\"\n description=\"Higher = more forgiving. Default 10.\"\n control={\n <Inline align=\"center\" gap={2}>\n <Slider\n value={[settings.defaultAgentMaxMistakes]}\n onValueChange={(v) => update('defaultAgentMaxMistakes', v[0] ?? 10)}\n min={3} max={20} step={1}\n />\n <code style={{ fontFamily: 'var(--font-mono)' }}>{settings.defaultAgentMaxMistakes}</code>\n </Inline>\n }\n />\n <SettingsRow id=\"agent-bg\" label=\"Spawn as background by default\" control={<Switch defaultChecked={Boolean((settings as unknown as Record<string, unknown>).agentBackgroundDefault)} onCheckedChange={(v) => void patch('agentBackgroundDefault', v)} />} />\n <SettingsRow id=\"agent-worktree\" label=\"Always create a worktree\" control={<Switch defaultChecked={Boolean((settings as unknown as Record<string, unknown>).agentWorktree ?? true)} onCheckedChange={(v) => void patch('agentWorktree', v)} />} />\n <SettingsRow\n id=\"agent-system-prompt\"\n label=\"Extra system prompt\"\n description=\"Appended to every agent's system prompt.\"\n control={<Textarea\n rows={3}\n placeholder=\"You are a careful, methodical engineer…\"\n defaultValue={String((settings as unknown as Record<string, unknown>).agentSystemPrompt ?? '')}\n onBlur={(e) => void patch('agentSystemPrompt', e.target.value)}\n />}\n />\n </SettingsSection>\n\n {/* 17. Privacy */}\n <SettingsSection id=\"privacy\" title=\"Privacy\" description=\"What the harness sends and stores.\" icon={<ShieldCheck size={14} aria-hidden />}>\n <SettingsRow\n id=\"privacy-analytics\"\n label=\"Anonymous analytics\"\n control={<Switch checked={settings.analytics} onCheckedChange={(v) => update('analytics', v)} />}\n />\n <SettingsRow\n id=\"privacy-crash\"\n label=\"Crash reports\"\n control={<Switch checked={settings.crashReports} onCheckedChange={(v) => update('crashReports', v)} />}\n />\n <SettingsRow\n id=\"privacy-pii\"\n label=\"PII handling\"\n description=\"How personal data is treated before persistence.\"\n control={\n <NativeSelect value={settings.piiMode} onChange={(v) => update('piiMode', v as SettingsState['piiMode'])}>\n <option value=\"off\">Off</option>\n <option value=\"redact\">Redact</option>\n <option value=\"pseudonymize\">Pseudonymize</option>\n <option value=\"block\">Block</option>\n </NativeSelect>\n }\n />\n <SettingsRow\n id=\"privacy-telemetry\"\n label=\"Send token usage telemetry\"\n control={<Switch defaultChecked={Boolean((settings as unknown as Record<string, unknown>).telemetryTokens)} onCheckedChange={(v) => void patch('telemetryTokens', v)} />}\n />\n </SettingsSection>\n\n {/* 18. Advanced */}\n <SettingsSection id=\"advanced\" title=\"Advanced\" description=\"Power-user toggles. Touch with care.\" icon={<SettingsIcon size={14} aria-hidden />}>\n <SettingsRow\n id=\"advanced-reduced-motion\"\n label=\"Reduce motion\"\n control={<Switch checked={settings.reducedMotion} onCheckedChange={(v) => update('reducedMotion', v)} />}\n />\n <SettingsRow\n id=\"advanced-debug\"\n label=\"Debug overlay\"\n description=\"Show agent + tool call traces in the topbar.\"\n control={<Switch checked={settings.debugOverlay} onCheckedChange={(v) => update('debugOverlay', v)} />}\n />\n <SettingsRow\n id=\"advanced-restart\"\n label=\"Restart dashboard backend\"\n description=\"Stop and relaunch the local server. Unsaved tasks are safe on disk.\"\n control={\n <Inline align=\"center\" gap={2}>\n <Button variant=\"danger\" disabled={busy === 'restart'} onClick={() => void runAdmin('restart', 'POST', '/api/admin/restart', 'Restart the dashboard backend? You may need to relaunch the CLI if it does not come back.')}><RotateCw size={12} aria-hidden /> {busy === 'restart' ? 'Restarting…' : 'Restart…'}</Button>\n <Button variant=\"ghost\" disabled={busy === 'rebuild'} onClick={() => void runAdmin('rebuild', 'POST', '/api/admin/rebuild', 'Rebuild the dashboard package? This runs `npm run build`.')}><Plus size={12} aria-hidden /> {busy === 'rebuild' ? 'Rebuilding…' : 'Rebuild'}</Button>\n </Inline>\n }\n />\n <SettingsRow\n id=\"advanced-logs\"\n label=\"Open logs folder\"\n control={<Button variant=\"secondary\" disabled={busy === 'purge-logs'} onClick={() => void runAdmin('logs/purge', 'POST', '/api/admin/logs/purge', 'Delete log files older than 14 days?') }><Trash2 size={12} aria-hidden /> {busy === 'purge-logs' ? 'Purging…' : 'Purge logs'}</Button>}\n />\n </SettingsSection>\n\n {/* 19. Configuration — Reset + Plugin options (v10.0.4) */}\n <SettingsSection\n id=\"configuration\"\n title=\"Configuration\"\n description=\"Reset to defaults, and edit the plugin-options sidecar.\"\n icon={<SettingsIcon size={14} aria-hidden />}\n >\n <SettingsRow\n id=\"config-reset\"\n label=\"Reset settings to defaults\"\n description=\"Calls POST /api/settings/reset. Restores every key to its DEFAULT_SETTINGS value.\"\n control={\n <Inline align=\"center\" gap={2}>\n <Button\n variant=\"danger\"\n disabled={busy === 'settings-reset'}\n data-testid=\"settings-reset\"\n onClick={() => {\n if (typeof window !== 'undefined' && typeof window.confirm === 'function'\n && !window.confirm('Reset every settings key to its default?')) return;\n setBusy('settings-reset');\n setError(null);\n (async () => {\n try {\n const next = await fetchJson<{ data?: Partial<SettingsState> }>('/api/settings/reset', { method: 'POST' });\n if (next?.data) setSettings({ ...DEFAULTS, ...next.data });\n setLastAction(`reset @ ${new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}`);\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(null);\n }\n })();\n }}\n >\n <RotateCw size={12} aria-hidden /> {busy === 'settings-reset' ? 'Resetting…' : 'Reset to defaults'}\n </Button>\n </Inline>\n }\n />\n <SettingsRow\n id=\"config-plugin-options\"\n label=\"Plugin options\"\n description=\"JSON sidecar at ~/.config/bizar/plugin-options.json. Persisted via PUT /api/settings/plugin-options.\"\n control={\n <PluginOptionsEditor />\n }\n />\n </SettingsSection>\n </Stack>\n </Grid>\n </div>\n );\n}\n\n/**\n * PluginOptionsEditor — small JSON textarea bound to the\n * `~/.config/bizar/plugin-options.json` sidecar. Separate component\n * because the rest of SettingsView is one-shot-on-mount and we want\n * the editor to survive parent re-renders without clobbering the\n * in-flight edit buffer. v10.0.4 — adds UI wiring for the previously\n * unwired PUT /api/settings/plugin-options endpoint.\n */\nfunction PluginOptionsEditor(): JSX.Element {\n const [text, setText] = useState<string>('{}');\n const [busy, setBusy] = useState<boolean>(false);\n const [savedAt, setSavedAt] = useState<number | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const opts = await fetchJson<Record<string, unknown>>('/api/settings/plugin-options');\n if (!cancelled) setText(JSON.stringify(opts ?? {}, null, 2));\n } catch (err) {\n if (!cancelled) setError(err instanceof FetchError ? err.message : (err as Error).message);\n }\n })();\n return () => { cancelled = true; };\n }, []);\n\n const save = async (): Promise<void> => {\n let parsed: unknown;\n try { parsed = JSON.parse(text); } catch (err) {\n setError(`Invalid JSON: ${(err as Error).message}`);\n return;\n }\n setBusy(true);\n setError(null);\n try {\n await fetchJson('/api/settings/plugin-options', { method: 'PUT', body: parsed as Record<string, unknown> });\n setSavedAt(Date.now());\n } catch (err) {\n setError(err instanceof FetchError ? err.message : (err as Error).message);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Stack gap={2} style={{ width: '100%' }}>\n <textarea\n data-testid=\"plugin-options-form\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n rows={6}\n spellCheck={false}\n style={{\n width: '100%',\n fontFamily: 'var(--font-mono)',\n fontSize: 12,\n padding: '8px',\n background: 'var(--surface-1)',\n color: 'var(--text-1)',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius-1)',\n }}\n />\n <Inline align=\"center\" gap={2}>\n <Button variant=\"primary\" disabled={busy} onClick={() => void save()}>\n {busy ? 'Saving…' : 'Save plugin options'}\n </Button>\n {savedAt !== null && (\n <span style={{ fontSize: 11, color: 'var(--text-2)' }}>\n saved {new Date(savedAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n )}\n {error && <span style={{ fontSize: 11, color: 'var(--danger)' }}>{error}</span>}\n </Inline>\n </Stack>\n );\n}"],"names":["Keyboard","createLucideIcon","Palette","SlidersVertical","SettingsNav","props","items","activeId","onSelect","className","jsxs","cx","jsx","item","isActive","COMMON_TIMEZONES","SECTIONS","SettingsIcon","Sliders","Sparkles","Terminal","Bell","Database","Plug","Cpu","LibraryIcon","Wrench","Activity","Brain","CheckSquare","Bot","ShieldCheck","DEFAULTS","SELECT_STYLE","NativeSelect","value","defaultValue","onChange","children","id_attr","e","Count","loading","Skeleton","SettingsView","setActiveId","useState","theme","useTheme","density","useDensity","settings","setSettings","savedAt","setSavedAt","error","setError","busy","setBusy","lastAction","setLastAction","runAdmin","label","method","path","confirmMsg","fetchJson","err","FetchError","downloadFile","filename","a","skillsRes","useFetch","mcpsRes","hooksRes","agentsRes","settingsRes","useEffect","prev","update","key","s","patch","merged","navItems","handleSelect","id","_a","rootRef","useRef","targets","el","visible","observer","entries","entry","bestId","bestRatio","ratio","t","Grid","Stack","Inline","SettingsSection","SettingsRow","Input","v","tz","Slider","Switch","Button","_b","_c","Badge","_e","_d","_f","m","_h","_g","_i","_k","_j","Textarea","RotateCw","Plus","Trash2","next","PluginOptionsEditor","text","setText","cancelled","opts","save","parsed"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1 +0,0 @@
1
- import{r as i,j as e}from"./cmdk-C3F6LD6N.js";import{u as j,S as u,I as h,B as d,h as m,_ as y,i as C,F as S}from"./main-BURAlktW.js";import{V as w}from"./ViewHeader-C-t1U2cQ.js";import{C as b,b as k}from"./Card-BtsmkhJa.js";import{S as E,a as U}from"./Sheet-B-CMP9-_.js";import{E as z}from"./EmptyState-DjKtY1Qi.js";import{R as $}from"./refresh-ccw-DA8_IB9l.js";import{U as F}from"./upload-Dy59aZn6.js";import{T as V}from"./trash-2-D6qePV_q.js";function H(){const s=j("/api/voice/list"),[g,r]=i.useState(null),[x,o]=i.useState(!1),[c,p]=i.useState(null),l=i.useMemo(()=>{var a;return((a=s.data)==null?void 0:a.memos)??[]},[s.data]),n=i.useCallback(()=>{s.refetch()},[s]),f=async a=>{p(null);try{await C(`/api/voice/${a}`,{method:"DELETE"}),r(null),n()}catch(t){p((t instanceof S,t.message))}};return e.jsxs(u,{gap:4,"data-testid":"voice-view",children:[e.jsx(w,{title:"Voice",description:"Voice memos. Upload a recording; play it inline.",actions:e.jsxs(h,{align:"center",gap:2,children:[c!==null&&e.jsx("span",{role:"alert","data-testid":"voice-error",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:c}),e.jsxs(d,{variant:"ghost",onClick:()=>void n(),"data-testid":"voice-refresh",children:[e.jsx($,{size:14,"aria-hidden":!0})," Refresh"]}),e.jsxs(d,{variant:"primary",onClick:()=>o(!0),"data-testid":"voice-upload",children:[e.jsx(F,{size:14,"aria-hidden":!0})," Upload"]})]})}),e.jsx(b,{variant:"default",children:e.jsx(k,{children:s.loading&&l.length===0?e.jsxs(u,{gap:1,children:[e.jsx(m,{style:{height:48}}),e.jsx(m,{style:{height:48}})]}):l.length===0?e.jsx(z,{icon:e.jsx(y,{size:28,"aria-hidden":!0}),title:"No voice memos",description:"Voice memos are audio recordings captured during sessions — useful for verbal scratch notes and hands-free capture. Upload a .wav, .mp3, or .m4a file to get started."}):e.jsx(u,{gap:1,children:l.map(a=>{const t=g===a.id;return e.jsxs("div",{"data-testid":`voice-row-${a.id}`,style:{padding:"var(--space-2)",border:"1px solid var(--border)",borderRadius:"var(--radius-sm)"},children:[e.jsxs(h,{align:"center",justify:"between",gap:2,children:[e.jsxs(u,{gap:0,style:{minWidth:0,flex:1},children:[e.jsxs(h,{align:"center",gap:2,children:[e.jsx("strong",{style:{fontSize:"var(--fs-13)"},children:a.filename||a.id}),a.durationMs!==void 0&&e.jsxs("span",{style:{fontSize:"var(--fs-12)",color:"var(--fg-muted)"},children:[(a.durationMs/1e3).toFixed(1),"s"]}),a.createdAt&&e.jsx("span",{style:{fontSize:"var(--fs-11)",color:"var(--fg-subtle)"},children:a.createdAt})]}),e.jsx("audio",{controls:!0,preload:"none","data-testid":`voice-audio-${a.id}`,src:`/api/voice/${a.id}/audio`,style:{width:"100%",maxWidth:480}})]}),e.jsx(d,{variant:"ghost",onClick:()=>r(v=>v===a.id?null:a.id),"data-testid":`voice-delete-${a.id}`,"aria-label":`Delete ${a.id}`,children:e.jsx(V,{size:14,"aria-hidden":!0})})]}),t&&e.jsxs(h,{gap:1,style:{marginTop:"var(--space-1)"},children:[e.jsx(d,{variant:"danger",onClick:()=>void f(a.id),"data-testid":`voice-confirm-delete-${a.id}`,children:"Confirm delete"}),e.jsx(d,{variant:"ghost",onClick:()=>r(null),children:"Cancel"})]})]},a.id)})})})}),e.jsx(E,{open:x,onOpenChange:o,children:e.jsx(U,{side:"right",title:"Upload voice memo",description:"Pick a .wav / .mp3 / .m4a file.",children:e.jsx(D,{onSubmit:async a=>{const t=new FormData;t.append("file",a);const v=await fetch("/api/voice/upload",{method:"POST",body:t});if(!v.ok)throw new Error(`upload failed: ${v.status}`);o(!1),n()},onCancel:()=>o(!1)})})})]})}function D({onSubmit:s,onCancel:g}){const[r,x]=i.useState(null),[o,c]=i.useState(!1),[p,l]=i.useState(null);return e.jsxs(u,{gap:3,style:{padding:"var(--space-4)"},children:[e.jsx("input",{type:"file",accept:"audio/*","data-testid":"voice-upload-input",onChange:n=>{var f;return x(((f=n.target.files)==null?void 0:f[0])??null)}}),p!==null&&e.jsx("span",{role:"alert",style:{color:"var(--danger)",fontSize:"var(--fs-12)"},children:p}),e.jsxs(h,{justify:"end",gap:2,children:[e.jsx(d,{variant:"ghost",onClick:g,children:"Cancel"}),e.jsx(d,{variant:"primary",disabled:o||!r,"data-testid":"voice-upload-submit",onClick:async()=>{if(r){c(!0),l(null);try{await s(r)}catch(n){l(n.message),c(!1)}}},children:o?"Uploading…":"Upload"})]})]})}export{H as VoiceView};
@@ -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}.v8-btn:focus-visible,.v8-button:focus-visible,button[data-section-toggle]:focus-visible,button[data-nav-item]:focus-visible,.v8-theme-toggle:focus-visible,.v8-density-toggle:focus-visible,.v8-icon-button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}