@pheem49/mint 1.17.0 → 1.18.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 (421) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +2 -2
  3. package/README.md +8 -2
  4. package/Release_Note.md +222 -71
  5. package/crates/mint-cli/src/agent/diff_render.rs +66 -44
  6. package/crates/mint-cli/src/agent/live_status.rs +21 -4
  7. package/crates/mint-cli/src/agent/markdown_render.rs +342 -5
  8. package/crates/mint-cli/src/agent.rs +25 -10
  9. package/crates/mint-cli/src/commands/agent.rs +4 -92
  10. package/crates/mint-cli/src/commands/browser.rs +2 -15
  11. package/crates/mint-cli/src/commands/integrations.rs +3 -3
  12. package/crates/mint-cli/src/commands/mod.rs +0 -3
  13. package/crates/mint-cli/src/commands/tailnet_web.rs +1 -0
  14. package/crates/mint-cli/src/interactive/chat_tui/dialog.rs +572 -0
  15. package/crates/mint-cli/src/interactive/chat_tui/mod.rs +1427 -0
  16. package/crates/mint-cli/src/interactive/chat_tui/render.rs +1524 -0
  17. package/crates/mint-cli/src/interactive/chat_tui/selection.rs +401 -0
  18. package/crates/mint-cli/src/interactive/chat_tui/state.rs +1833 -0
  19. package/crates/mint-cli/src/interactive/chat_tui/tests.rs +3414 -0
  20. package/crates/mint-cli/src/interactive/chat_tui/thought.rs +202 -0
  21. package/crates/mint-cli/src/interactive/chat_tui/transcript.rs +728 -0
  22. package/crates/mint-cli/src/interactive/chat_tui/watermark.rs +148 -0
  23. package/crates/mint-cli/src/interactive/command_ui.rs +53 -5
  24. package/crates/mint-cli/src/interactive/composer.rs +186 -0
  25. package/crates/mint-cli/src/interactive/format.rs +78 -3
  26. package/crates/mint-cli/src/interactive/input_box.rs +61 -1
  27. package/crates/mint-cli/src/interactive/resume_picker.rs +367 -25
  28. package/crates/mint-cli/src/interactive/slash_commands.rs +648 -371
  29. package/crates/mint-cli/src/interactive/tool_activity.rs +93 -20
  30. package/crates/mint-cli/src/interactive.rs +37 -0
  31. package/crates/mint-cli/src/main.rs +6 -3
  32. package/crates/mint-cli/src/markdown.rs +2 -37
  33. package/crates/mint-cli/src/onboard.rs +700 -282
  34. package/crates/mint-cli/src/setup.rs +1342 -624
  35. package/crates/mint-cli/src/terminal_theme.rs +159 -35
  36. package/crates/mint-cli/tests/library_intake.rs +1 -0
  37. package/crates/mint-core/src/agent/chat/anthropic.rs +318 -0
  38. package/crates/mint-core/src/agent/chat/custom.rs +149 -0
  39. package/crates/mint-core/src/agent/chat/gemini.rs +518 -0
  40. package/crates/mint-core/src/agent/chat/mod.rs +857 -0
  41. package/crates/mint-core/src/agent/chat/ollama.rs +321 -0
  42. package/crates/mint-core/src/agent/chat/openai.rs +582 -0
  43. package/crates/mint-core/src/agent/chat/streaming.rs +469 -0
  44. package/crates/mint-core/src/agent/chat/tests.rs +1479 -0
  45. package/crates/mint-core/src/agent/memory.rs +56 -2
  46. package/crates/mint-core/src/agent/tasks.rs +2 -2
  47. package/crates/mint-core/src/api_server/routes/chat.rs +24 -2
  48. package/crates/mint-core/src/api_server/routes/gemini_live.rs +14 -1
  49. package/crates/mint-core/src/api_server/routes/html_preview.rs +1 -8
  50. package/crates/mint-core/src/api_server/routes/sessions.rs +21 -0
  51. package/crates/mint-core/src/avatar_bridge.rs +0 -22
  52. package/crates/mint-core/src/browser/cdp.rs +10 -4
  53. package/crates/mint-core/src/browser/headless.rs +582 -0
  54. package/crates/mint-core/src/browser/input.rs +7 -62
  55. package/crates/mint-core/src/browser/interact.rs +0 -14
  56. package/crates/mint-core/src/browser/mod.rs +8 -29
  57. package/crates/mint-core/src/browser/navigate.rs +2 -36
  58. package/crates/mint-core/src/browser/runtime.rs +2 -4
  59. package/crates/mint-core/src/browser/session.rs +50 -466
  60. package/crates/mint-core/src/browser/workflow.rs +142 -32
  61. package/crates/mint-core/src/cron/store.rs +2 -2
  62. package/crates/mint-core/src/integrations/mcp.rs +6 -8
  63. package/crates/mint-core/src/lib.rs +0 -5
  64. package/crates/mint-core/src/media/gemini_live.rs +636 -86
  65. package/crates/mint-core/src/media/library/migration.rs +26 -0
  66. package/crates/mint-core/src/media/library/tests.rs +1 -1
  67. package/crates/mint-core/src/media/library/thumbnails.rs +8 -2
  68. package/crates/mint-core/src/media/pictures.rs +1 -1
  69. package/crates/mint-core/src/media/tool_images.rs +92 -1
  70. package/crates/mint-core/src/mods/manager.rs +101 -35
  71. package/crates/mint-core/src/orchestration/context_render.rs +441 -24
  72. package/crates/mint-core/src/orchestration/decision_parsing.rs +531 -16
  73. package/crates/mint-core/src/orchestration/full_skill_result_tests.rs +12 -0
  74. package/crates/mint-core/src/orchestration/loop_guard.rs +145 -0
  75. package/crates/mint-core/src/orchestration/mcp_outcome_tests.rs +864 -0
  76. package/crates/mint-core/src/orchestration/memory_skill.rs +88 -28
  77. package/crates/mint-core/src/orchestration/mod.rs +320 -4249
  78. package/crates/mint-core/src/orchestration/reliability.rs +67 -27
  79. package/crates/mint-core/src/orchestration/review_regressions.rs +5 -0
  80. package/crates/mint-core/src/orchestration/tests.rs +1665 -0
  81. package/crates/mint-core/src/orchestration/tools/dispatch.rs +967 -0
  82. package/crates/mint-core/src/orchestration/tools/files.rs +1 -0
  83. package/crates/mint-core/src/orchestration/tools/mod.rs +5 -1
  84. package/crates/mint-core/src/orchestration/tools/planning.rs +102 -42
  85. package/crates/mint-core/src/orchestration/tools/shell.rs +129 -58
  86. package/crates/mint-core/src/orchestration/truncation.rs +170 -13
  87. package/crates/mint-core/src/orchestration/types.rs +648 -0
  88. package/crates/mint-core/src/orchestration/verification.rs +0 -3
  89. package/crates/mint-core/src/orchestration/workspace_helpers.rs +24 -6
  90. package/crates/mint-core/src/prompts/agent.rs +52 -76
  91. package/crates/mint-core/src/prompts/tool_catalog.rs +8 -151
  92. package/crates/mint-core/src/search/files.rs +20 -0
  93. package/crates/mint-core/src/slash/mod.rs +228 -265
  94. package/crates/mint-core/src/slash/models.rs +6 -1
  95. package/crates/mint-core/src/system/bg_shell.rs +1 -0
  96. package/crates/mint-core/src/system/config.rs +176 -34
  97. package/crates/mint-mod-runtime/src/lib.rs +37 -23
  98. package/out/web/assets/ArtifactPreviewPanel-Cx6BVOOF.js +2 -0
  99. package/out/web/assets/CalculationCard-D2E74u5q.js +1 -0
  100. package/out/web/assets/CliSessionsView-ZbdtSjvK.css +1 -0
  101. package/out/web/assets/{CliSessionsView-MI8kXMAb.js → CliSessionsView-z5i6qGyb.js} +1 -1
  102. package/out/web/assets/CodeReviewPage-BK2bOScd.css +1 -0
  103. package/out/web/assets/CodeReviewPage-Dp6zHuHu.js +2 -0
  104. package/out/web/assets/{CommandPalette-BD8SlTE5.js → CommandPalette-DaKlzbKs.js} +1 -1
  105. package/out/web/assets/ImageGenCard-BMCJHP9O.js +1 -0
  106. package/out/web/assets/ImageSearchCard-Cld_SOUg.js +1 -0
  107. package/out/web/assets/{ImageStudioPanel-BP7N4rLr.js → ImageStudioPanel-B5N7TjeB.js} +1 -1
  108. package/out/web/assets/LibraryPage-CMB89rJ0.css +1 -0
  109. package/out/web/assets/LibraryPage-DbZEi4W_.js +2 -0
  110. package/out/web/assets/LinkedFoldersView-9B9DIPoZ.js +1 -0
  111. package/out/web/assets/{McpRegistryPicker-CoS83vtc.js → McpRegistryPicker-DnXPlzI7.js} +1 -1
  112. package/out/web/assets/McpServersView-CiNBNUl4.js +1 -0
  113. package/out/web/assets/MermaidCard-BBDNEXbY.js +2 -0
  114. package/out/web/assets/MintDashboard-C_UYPoNV.js +119 -0
  115. package/out/web/assets/MintDashboard-DTd8C_c8.css +1 -0
  116. package/out/web/assets/PlanCard-C2x5pajq.js +1 -0
  117. package/out/web/assets/{PluginsView-jBYmcKh4.js → PluginsView-DoTg9MVa.js} +1 -1
  118. package/out/web/assets/RewindModal-B5oowrR0.js +1 -0
  119. package/out/web/assets/{ScheduledTasksView-5uw9-V9H.js → ScheduledTasksView-BD5DVPkZ.js} +1 -1
  120. package/out/web/assets/{SelectField-DXBQtrUK.js → SelectField-Cy6CghrU.js} +1 -1
  121. package/out/web/assets/SettingsWindow-BYl_oCFh.js +4 -0
  122. package/out/web/assets/SettingsWindow-Ckcgnjt8.css +1 -0
  123. package/out/web/assets/{SkillsView-C-gp9J7m.js → SkillsView-CIeWwq5z.js} +1 -1
  124. package/out/web/assets/StockCard-DxUciKyp.js +1 -0
  125. package/out/web/assets/ToolSurfacePage-qBgs_VHq.css +1 -0
  126. package/out/web/assets/ToolSurfacePage-saVbVrkE.js +38 -0
  127. package/out/web/assets/{UiFeatureCard-6BwxTOCe.js → UiFeatureCard-CdY0hGWy.js} +1 -1
  128. package/out/web/assets/{UiGridCard-DvZcLNxb.js → UiGridCard-BBK3I5hC.js} +1 -1
  129. package/out/web/assets/UiMockupWidget-CpR9EDuc.js +1 -0
  130. package/out/web/assets/{VeoStudioPanel-DOj7_WR3.css → VeoStudioPanel-9kU9YLEN.css} +1 -1
  131. package/out/web/assets/{VeoStudioPanel-DfsOJKv0.js → VeoStudioPanel-Co6-wEWM.js} +2 -2
  132. package/out/web/assets/WeatherCard-Buzi7Vfu.js +1 -0
  133. package/out/web/assets/WorkspacePdfPreview-Bi8Zzyir.js +2 -0
  134. package/out/web/assets/{abnfDiagram-VCTEODGH-BOo3Ckng.js → abnfDiagram-VCTEODGH-CMfR95N2.js} +1 -1
  135. package/out/web/assets/{architecture-7GRP2DOG-ZOwheW3n.js → architecture-7GRP2DOG-DhAM4HyO.js} +1 -1
  136. package/out/web/assets/{architectureDiagram-5GKGNRK7-DC2FDzVd.js → architectureDiagram-5GKGNRK7-Yk3TUJ_F.js} +1 -1
  137. package/out/web/assets/{blockDiagram-I7D4REHJ-BrKFWdAH.js → blockDiagram-I7D4REHJ-X9fBgJik.js} +1 -1
  138. package/out/web/assets/{c4Diagram-7LVT6UL2-BHTHK1Yd.js → c4Diagram-7LVT6UL2-Bk9x7N-8.js} +1 -1
  139. package/out/web/assets/{chunk-4HAMMTFA-BYFkZwNj.js → chunk-4HAMMTFA-Dx5fk1_0.js} +1 -1
  140. package/out/web/assets/{chunk-75Z2AOVW-BSKfSKSA.js → chunk-75Z2AOVW-BszTQoM4.js} +1 -1
  141. package/out/web/assets/{chunk-DU6HZSFF-vIhsiW6n.js → chunk-DU6HZSFF-DK-As3rk.js} +1 -1
  142. package/out/web/assets/{chunk-F27PBJKO-BlYpW9xq.js → chunk-F27PBJKO-LmncZZIS.js} +1 -1
  143. package/out/web/assets/{chunk-GMAD6QVW-BIBz_Ug5.js → chunk-GMAD6QVW-DSQ_sDRJ.js} +1 -1
  144. package/out/web/assets/{chunk-GVQU2GXP-NPSHxeqC.js → chunk-GVQU2GXP-Cno3ulje.js} +1 -1
  145. package/out/web/assets/{chunk-IMKFNOWR-YlJK8_Fp.js → chunk-IMKFNOWR-bIzfY9Jc.js} +1 -1
  146. package/out/web/assets/{chunk-L3NEJ4N5-DMYi4-af.js → chunk-L3NEJ4N5-Dl6eOa0D.js} +1 -1
  147. package/out/web/assets/{chunk-OSK3NFVY-Begd3-jA.js → chunk-OSK3NFVY-BaUGJ-cM.js} +1 -1
  148. package/out/web/assets/{chunk-P2QGCYS3-D1I4xFHN.js → chunk-P2QGCYS3-_066ndhH.js} +1 -1
  149. package/out/web/assets/{chunk-POPQ4Y6H-CafZZzNE.js → chunk-POPQ4Y6H-YT1AKhTv.js} +1 -1
  150. package/out/web/assets/{chunk-PWAF6VOD-Dwh6_Lnt.js → chunk-PWAF6VOD-CrEgDsxh.js} +1 -1
  151. package/out/web/assets/{chunk-SHT3W25Y-B0XrCSEb.js → chunk-SHT3W25Y-_KwaRLOl.js} +1 -1
  152. package/out/web/assets/{chunk-SVP7TREG-CxLsddxC.js → chunk-SVP7TREG-BQ1qb32L.js} +1 -1
  153. package/out/web/assets/{chunk-TICWLB2K-y156QInb.js → chunk-TICWLB2K-BDyehCtg.js} +1 -1
  154. package/out/web/assets/classDiagram-ZZMXUADV-BoSpzRCJ.js +1 -0
  155. package/out/web/assets/classDiagram-v2-VYDZK3BY-BoSpzRCJ.js +1 -0
  156. package/out/web/assets/{config-DqXJXeZM.css → config-2suVFPZg.css} +1 -1
  157. package/out/web/assets/config-CkRCdkxn.js +2 -0
  158. package/out/web/assets/{cynefin-OW5HDTMX-SMVvrLf-.js → cynefin-OW5HDTMX-Dl_31aaN.js} +1 -1
  159. package/out/web/assets/{cynefinDiagram-5FMLGOSQ-rZznN24T.js → cynefinDiagram-5FMLGOSQ-Bpir8jha.js} +1 -1
  160. package/out/web/assets/{dagre-GXQ25YYZ-BOToydFu.js → dagre-GXQ25YYZ-D9xu3nsq.js} +1 -1
  161. package/out/web/assets/{diagram-S7CK7UJ4-TMVaGQEJ.js → diagram-S7CK7UJ4-DeveoEeB.js} +1 -1
  162. package/out/web/assets/{diagram-UQ7AKVKN-C2JK-GP2.js → diagram-UQ7AKVKN-p4xWRESV.js} +1 -1
  163. package/out/web/assets/{diagram-VSXAHHWV-Cw8VSi2K.js → diagram-VSXAHHWV-C7qz9NDF.js} +1 -1
  164. package/out/web/assets/{diagram-VX7I27RA-DXp4fKk9.js → diagram-VX7I27RA-DRiCa3Vd.js} +1 -1
  165. package/out/web/assets/{diagram-Z3DM3KII-CzSicYiW.js → diagram-Z3DM3KII-Bt7zduQX.js} +1 -1
  166. package/out/web/assets/{ebnfDiagram-PWID7BFC-Dqj-zqPu.js → ebnfDiagram-PWID7BFC-DV9WpwdR.js} +1 -1
  167. package/out/web/assets/{erDiagram-RLTQ6QDP-DZwFZAuD.js → erDiagram-RLTQ6QDP-BJ_nwG2m.js} +1 -1
  168. package/out/web/assets/{eventmodeling-NTZA5JFV-C0O-Lvgp.js → eventmodeling-NTZA5JFV-BTBMrfVa.js} +1 -1
  169. package/out/web/assets/flowDiagram-HODETNUW-Cdlq3cJL.js +1 -0
  170. package/out/web/assets/{ganttDiagram-EL5Y4UJY-Da4ULXTl.js → ganttDiagram-EL5Y4UJY-DQLdsXrC.js} +1 -1
  171. package/out/web/assets/{gitGraph-4MIJSDKK-B9wNFZIP.js → gitGraph-4MIJSDKK-CL1OEOQ_.js} +1 -1
  172. package/out/web/assets/{gitGraphDiagram-WWUBYQGX-RjrhB0MP.js → gitGraphDiagram-WWUBYQGX-8cSi42H7.js} +1 -1
  173. package/out/web/assets/index-BocxnrDG.js +168 -0
  174. package/out/web/assets/index-yeh_r55a.css +1 -0
  175. package/out/web/assets/{info-A6RAGUB7-B3dfCpeY.js → info-A6RAGUB7-C1zsX5sc.js} +1 -1
  176. package/out/web/assets/{infoDiagram-27XIBGKW-QVWkLVx7.js → infoDiagram-27XIBGKW-DsRYtIyI.js} +1 -1
  177. package/out/web/assets/{ishikawaDiagram-5VMMS53U-CLFNIRI9.js → ishikawaDiagram-5VMMS53U-B2crwIXj.js} +1 -1
  178. package/out/web/assets/{journeyDiagram-3NMN7TZE-fgOQadYF.js → journeyDiagram-3NMN7TZE-BTH-GyVR.js} +1 -1
  179. package/out/web/assets/{kanban-definition-UXKFOSKX-G3Q_9g9O.js → kanban-definition-UXKFOSKX-BeRfCnuA.js} +1 -1
  180. package/out/web/assets/{mermaid-parser.core-v3Jm7nco.js → mermaid-parser.core-BJwgCBBc.js} +3 -3
  181. package/out/web/assets/{mermaid.core-DTEjLUA1.js → mermaid.core-CsDDodN8.js} +4 -4
  182. package/out/web/assets/{mindmap-definition-YA3MSWOX-C_D42_fF.js → mindmap-definition-YA3MSWOX-B42efOQ1.js} +1 -1
  183. package/out/web/assets/{modelManager-BPLycQrN.js → modelManager-B3ZFMh8v.js} +2 -2
  184. package/out/web/assets/{oauthManager-BUK7ic7q.js → oauthManager-Ch5Du2fF.js} +1 -1
  185. package/out/web/assets/{packet-AYTQ26CC-B-R-SHlF.js → packet-AYTQ26CC-B6xUyE6r.js} +1 -1
  186. package/out/web/assets/{pegDiagram-XKGWAZYB-Da2q_giz.js → pegDiagram-XKGWAZYB-1LabVycL.js} +1 -1
  187. package/out/web/assets/{pie-WAS4IAKB-BC8F0N7-.js → pie-WAS4IAKB-DJwo-nf_.js} +1 -1
  188. package/out/web/assets/{pieDiagram-E7YTZNPT-Iy9REJNC.js → pieDiagram-E7YTZNPT-icmAqzy4.js} +1 -1
  189. package/out/web/assets/{quadrantDiagram-AXDQQJYC-ztsiYw7h.js → quadrantDiagram-AXDQQJYC-CZ-wEx41.js} +1 -1
  190. package/out/web/assets/{radar-RG4KPBEZ-B_1P8Z_z.js → radar-RG4KPBEZ-D7d-Xriw.js} +1 -1
  191. package/out/web/assets/{railroad-74A4TZTK-DuTqczSo.js → railroad-74A4TZTK-viuhdYbs.js} +1 -1
  192. package/out/web/assets/{railroad-abnf-HS5TGJTU-Df29WLmp.js → railroad-abnf-HS5TGJTU-DNXiCNea.js} +1 -1
  193. package/out/web/assets/{railroad-ebnf-LZEXJU2U-ePFMo-qp.js → railroad-ebnf-LZEXJU2U-nkSu1-0C.js} +1 -1
  194. package/out/web/assets/{railroad-peg-WCYAUIDC-DYXLW4_E.js → railroad-peg-WCYAUIDC-BhbMeQzz.js} +1 -1
  195. package/out/web/assets/{railroadDiagram-O6MQD6OU-LStnZf2S.js → railroadDiagram-O6MQD6OU-CLpG1jUX.js} +1 -1
  196. package/out/web/assets/{requirementDiagram-BXWQKSXE-DmzonMH-.js → requirementDiagram-BXWQKSXE-kRDrvWrc.js} +1 -1
  197. package/out/web/assets/{sankeyDiagram-P5KCCOFB-B8vjmUU1.js → sankeyDiagram-P5KCCOFB-DxAwmq4x.js} +1 -1
  198. package/out/web/assets/{sequenceDiagram-WJ2MYXX4-CTnplOAX.js → sequenceDiagram-WJ2MYXX4-aLgY-6Wz.js} +1 -1
  199. package/out/web/assets/{stateDiagram-D77RDMKH-BFrIaLdI.js → stateDiagram-D77RDMKH-D5QWfOhp.js} +1 -1
  200. package/out/web/assets/stateDiagram-v2-MP3YSRHH-D6OiZoAP.js +1 -0
  201. package/out/web/assets/{swimlanes-42K2YHIH-BXGngUNU.js → swimlanes-42K2YHIH-CRs5UyA-.js} +1 -1
  202. package/out/web/assets/swimlanesDiagram-VR7AAH4N-UgEXIsV0.js +8 -0
  203. package/out/web/assets/syntaxHighlight-C-wAGT84.js +3 -0
  204. package/out/web/assets/{timeline-definition-24CTP7MA-CegH7n43.js → timeline-definition-24CTP7MA-Denqd9qb.js} +1 -1
  205. package/out/web/assets/{treeView-Q6P3EWNA-DTpJv2Tw.js → treeView-Q6P3EWNA-0my3Z3s4.js} +1 -1
  206. package/out/web/assets/{treemap-WGGIJYW6-i8M9iJU6.js → treemap-WGGIJYW6-B_EjkLYq.js} +1 -1
  207. package/out/web/assets/{vennDiagram-4TSXK5OY-Dpzo1S8U.js → vennDiagram-4TSXK5OY-DxVg3Ewr.js} +1 -1
  208. package/out/web/assets/{wardley-WFR3VGLG-BrNsgtfw.js → wardley-WFR3VGLG-CGD-Tj4p.js} +1 -1
  209. package/out/web/assets/{wardleyDiagram-VM6X3IG4-lQ92LFE1.js → wardleyDiagram-VM6X3IG4-CmfS39Xm.js} +1 -1
  210. package/out/web/assets/{xychartDiagram-S5SC5T6Z-BaOaEoBd.js → xychartDiagram-S5SC5T6Z-BVM9bKis.js} +1 -1
  211. package/out/web/index-web.html +2 -2
  212. package/out/web/index.html +2 -2
  213. package/package.json +2 -2
  214. package/shared-modules/CODEOWNERS +3 -3
  215. package/shared-modules/SDL2/SDL2_mixer.json +27 -0
  216. package/shared-modules/appstream/README.md +13 -0
  217. package/shared-modules/appstream/appstream-compose.json +111 -0
  218. package/shared-modules/dbus-glib/dbus-glib.json +2 -2
  219. package/shared-modules/libportal/libportal.json +23 -0
  220. package/shared-modules/linux-audio/fluidsynth2-static.json +2 -2
  221. package/shared-modules/linux-audio/fluidsynth2.json +2 -2
  222. package/shared-modules/linux-audio/libinstpatch.json +2 -2
  223. package/shared-modules/linux-audio/liblo-static.json +3 -0
  224. package/shared-modules/luajit/luajit.json +2 -2
  225. package/shared-modules/squashfs-tools/squashfs-tools.json +0 -3
  226. package/slash-commands.json +7 -2
  227. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  228. package/src/renderer/shared/agentProgress.ts +51 -3
  229. package/src/renderer/shared/components/Settings/AutomationTab.tsx +2 -56
  230. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +15 -1
  231. package/src/renderer/shared/components/Settings/GeneralTab.tsx +25 -12
  232. package/src/renderer/shared/components/Settings/ThemeTab.test.tsx +45 -0
  233. package/src/renderer/shared/components/Settings/ThemeTab.tsx +106 -3
  234. package/src/renderer/shared/components/activity/AgentActivityDrawer.tsx +67 -17
  235. package/src/renderer/shared/components/activity/AgentActivityTable.tsx +376 -134
  236. package/src/renderer/shared/components/activity/AskUserActivityCard.test.tsx +122 -0
  237. package/src/renderer/shared/components/activity/AskUserActivityCard.tsx +70 -0
  238. package/src/renderer/shared/components/activity/McpToolResults.tsx +39 -2
  239. package/src/renderer/shared/components/activity/SubagentDagView.tsx +7 -7
  240. package/src/renderer/shared/components/activity/ViewedImages.tsx +41 -2
  241. package/src/renderer/shared/components/app/ChunkErrorBoundary.tsx +3 -3
  242. package/src/renderer/shared/components/app/CommandPalette.tsx +7 -7
  243. package/src/renderer/shared/components/app/DesktopTitlebar.tsx +2 -2
  244. package/src/renderer/shared/components/app/MintDashboard.tsx +27 -17
  245. package/src/renderer/shared/components/app/ModalErrorBoundary.tsx +3 -3
  246. package/src/renderer/shared/components/cards/CalculationCard.tsx +3 -3
  247. package/src/renderer/shared/components/cards/ImageGenCard.tsx +2 -2
  248. package/src/renderer/shared/components/cards/ImageSearchCard.tsx +2 -2
  249. package/src/renderer/shared/components/cards/MermaidCard.tsx +1 -1
  250. package/src/renderer/shared/components/cards/PlanCard.test.tsx +41 -0
  251. package/src/renderer/shared/components/cards/PlanCard.tsx +32 -0
  252. package/src/renderer/shared/components/cards/ReleaseNotesCard.test.tsx +29 -0
  253. package/src/renderer/shared/components/cards/ReleaseNotesCard.tsx +137 -0
  254. package/src/renderer/shared/components/cards/StockCard.tsx +7 -7
  255. package/src/renderer/shared/components/cards/ToolResultCards.tsx +11 -3
  256. package/src/renderer/shared/components/cards/UiMockupWidget.tsx +4 -4
  257. package/src/renderer/shared/components/cards/WeatherCard.tsx +5 -5
  258. package/src/renderer/shared/components/chat/ApprovalCard.test.tsx +11 -0
  259. package/src/renderer/shared/components/chat/ApprovalCard.tsx +21 -2
  260. package/src/renderer/shared/components/chat/ArtifactCards.test.tsx +69 -0
  261. package/src/renderer/shared/components/chat/ArtifactCards.tsx +238 -0
  262. package/src/renderer/shared/components/chat/AttachedDocumentCard.test.tsx +39 -0
  263. package/src/renderer/shared/components/chat/AttachedDocumentCard.tsx +220 -0
  264. package/src/renderer/shared/components/chat/ChatCodeBlock.test.tsx +33 -0
  265. package/src/renderer/shared/components/chat/ChatCodeBlock.tsx +15 -1
  266. package/src/renderer/shared/components/chat/ChatMessageItem.test.tsx +40 -2
  267. package/src/renderer/shared/components/chat/ChatMessageItem.tsx +180 -34
  268. package/src/renderer/shared/components/chat/ChatModeSelector.css +227 -0
  269. package/src/renderer/shared/components/chat/ChatModeSelector.test.tsx +45 -0
  270. package/src/renderer/shared/components/chat/ChatModeSelector.tsx +198 -0
  271. package/src/renderer/shared/components/chat/ChatPanel.test.tsx +22 -0
  272. package/src/renderer/shared/components/chat/ChatPanel.tsx +227 -53
  273. package/src/renderer/shared/components/chat/DiffReviewModal.tsx +6 -6
  274. package/src/renderer/shared/components/chat/GeminiLiveOverlay.test.tsx +142 -1
  275. package/src/renderer/shared/components/chat/GeminiLiveOverlay.tsx +45 -3
  276. package/src/renderer/shared/components/chat/ModelSelectorPopover.tsx +42 -14
  277. package/src/renderer/shared/components/chat/RewindModal.tsx +10 -10
  278. package/src/renderer/shared/components/chat/SlashSuggestions.test.tsx +14 -0
  279. package/src/renderer/shared/components/chat/SourcesBlock.test.tsx +53 -0
  280. package/src/renderer/shared/components/chat/SourcesBlock.tsx +236 -90
  281. package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +45 -1
  282. package/src/renderer/shared/components/chat/TurnFileChanges.tsx +202 -169
  283. package/src/renderer/shared/components/extensions/CliSessionsView.tsx +5 -4
  284. package/src/renderer/shared/components/extensions/McpRegistryPicker.tsx +3 -3
  285. package/src/renderer/shared/components/studio/LibraryPage.tsx +48 -5
  286. package/src/renderer/shared/components/workspace/ArtifactPreviewPanel.tsx +125 -13
  287. package/src/renderer/shared/components/workspace/CodeReviewPage.test.tsx +50 -0
  288. package/src/renderer/shared/components/workspace/CodeReviewPage.tsx +77 -16
  289. package/src/renderer/shared/components/workspace/GitBranchSelector.tsx +78 -22
  290. package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +13 -0
  291. package/src/renderer/shared/components/workspace/ToolSurfacePage.tsx +48 -28
  292. package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +266 -47
  293. package/src/renderer/shared/components/workspace/WorkspacePreviewActions.test.tsx +18 -6
  294. package/src/renderer/shared/components/workspace/background-terminals.css +11 -11
  295. package/src/renderer/shared/constants/config.ts +1 -5
  296. package/src/renderer/shared/constants/models.test.ts +51 -0
  297. package/src/renderer/shared/constants/models.ts +139 -32
  298. package/src/renderer/shared/conversation/lifecycle.test.ts +91 -3
  299. package/src/renderer/shared/conversation/lifecycle.ts +104 -5
  300. package/src/renderer/shared/conversation/progressiveStream.test.ts +83 -0
  301. package/src/renderer/shared/conversation/progressiveStream.ts +219 -0
  302. package/src/renderer/shared/css/agent-observability.css +133 -0
  303. package/src/renderer/shared/css/chat-ui-cards.css +13 -13
  304. package/src/renderer/shared/css/code-review.css +63 -34
  305. package/src/renderer/shared/css/code-sessions.css +47 -18
  306. package/src/renderer/shared/css/collapsed-paste.css +1 -1
  307. package/src/renderer/shared/css/error-notice.css +1 -1
  308. package/src/renderer/shared/css/file-changes.css +165 -80
  309. package/src/renderer/shared/css/library.css +105 -10
  310. package/src/renderer/shared/css/management-views.css +1 -1
  311. package/src/renderer/shared/css/mcp-results.css +5 -5
  312. package/src/renderer/shared/css/model-selector.css +18 -18
  313. package/src/renderer/shared/css/mods.css +7 -7
  314. package/src/renderer/shared/css/notification-notice.css +2 -2
  315. package/src/renderer/shared/css/queued-messages.css +5 -5
  316. package/src/renderer/shared/css/settings/general.css +18 -13
  317. package/src/renderer/shared/css/settings/profile.css +5 -5
  318. package/src/renderer/shared/css/settings/theme.css +5 -5
  319. package/src/renderer/shared/css/slash-choice.css +2 -2
  320. package/src/renderer/shared/css/slash-suggestions.css +3 -3
  321. package/src/renderer/shared/css/sources-block.css +41 -2
  322. package/src/renderer/shared/css/tools-panel.css +2 -2
  323. package/src/renderer/shared/css/ui-tailwind.css +8 -0
  324. package/src/renderer/shared/css/veo-studio.css +2 -2
  325. package/src/renderer/shared/css/viewed-images.css +7 -7
  326. package/src/renderer/shared/platform.ts +2 -1
  327. package/src/renderer/shared/theme/themeManager.test.ts +17 -0
  328. package/src/renderer/shared/theme/themeManager.ts +21 -4
  329. package/src/renderer/shared/theme/themes.ts +54 -0
  330. package/src/renderer/shared/theme/tokens.css +6 -4
  331. package/src/renderer/shared/types.ts +1 -1
  332. package/src/renderer/shared/utils/agentActivity.test.ts +468 -2
  333. package/src/renderer/shared/utils/agentActivity.ts +602 -35
  334. package/src/renderer/shared/utils/artifactBrowser.test.ts +37 -32
  335. package/src/renderer/shared/utils/artifactBrowser.ts +17 -19
  336. package/src/renderer/shared/utils/attachedDocument.test.ts +73 -0
  337. package/src/renderer/shared/utils/attachedDocument.ts +49 -0
  338. package/src/renderer/shared/utils/fileIcons.test.ts +59 -0
  339. package/src/renderer/shared/utils/fileIcons.ts +149 -16
  340. package/src/renderer/shared/utils/markdown.tsx +72 -19
  341. package/src/renderer/shared/utils/markdown.webImages.test.tsx +16 -0
  342. package/src/renderer/shared/utils/mcpResults.test.tsx +29 -0
  343. package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
  344. package/src/renderer/shared/utils/syntaxHighlight.test.tsx +11 -1
  345. package/src/renderer/shared/utils/syntaxHighlight.tsx +51 -3
  346. package/src/renderer/shared/utils/useGeminiLiveVoice.ts +324 -51
  347. package/src/renderer/shared/utils/workspaceDrag.test.ts +153 -0
  348. package/src/renderer/shared/utils/workspaceDrag.ts +142 -0
  349. package/src/renderer/shared/utils/workspaceMedia.ts +10 -2
  350. package/src/renderer/src/App.tsx +14 -8
  351. package/src/renderer/src/agentProgress.ts +1 -0
  352. package/src/renderer/src/components/ScreenPicker.css +1 -1
  353. package/src/renderer/src/components/WorkspacePanel.tsx +6 -5
  354. package/src/renderer/src/css/app-shell.css +4 -4
  355. package/src/renderer/src/css/chat.css +1261 -241
  356. package/src/renderer/src/css/desktop-tools.css +11 -11
  357. package/src/renderer/src/css/sidebar-workspace.css +2 -2
  358. package/src/renderer/src/css/tool-surfaces.css +12 -12
  359. package/src/renderer/src/index.css +38 -20
  360. package/src/renderer/src/tauri.ts +22 -2
  361. package/src/renderer/src-web/App.tsx +14 -0
  362. package/src/renderer/src-web/agentProgress.ts +1 -0
  363. package/src/renderer/src-web/css/app-shell.css +4 -4
  364. package/src/renderer/src-web/css/chat.css +1278 -190
  365. package/src/renderer/src-web/css/mobile.css +29 -13
  366. package/src/renderer/src-web/css/settings/mobile.css +2 -2
  367. package/src/renderer/src-web/css/sidebar-workspace.css +1 -1
  368. package/src/renderer/src-web/index.css +38 -20
  369. package/src/renderer/src-web/tauri.ts +22 -2
  370. package/src/renderer/tests/browserArtifacts.browser.tsx +1 -1
  371. package/src/renderer/tests/library.browser.tsx +3 -0
  372. package/src/renderer/tests/liveVoice.browser.html +1 -0
  373. package/src/renderer/tests/workspaceDrop.browser.tsx +1 -1
  374. package/src-tauri/src/app/lifecycle.rs +1 -14
  375. package/src-tauri/src/background/headless.rs +14 -8
  376. package/src-tauri/src/commands/conversation.rs +38 -0
  377. package/src-tauri/src/native/mod.rs +0 -1
  378. package/src-tauri/src/native/system.rs +4 -47
  379. package/crates/mint-cli/src/interactive/chat_tui.rs +0 -8855
  380. package/crates/mint-core/src/agent/chat.rs +0 -4394
  381. package/crates/mint-core/src/browser/lifecycle.rs +0 -291
  382. package/crates/mint-core/src/browser/logging.rs +0 -20
  383. package/crates/mint-core/src/orchestration/tools/browser.rs +0 -31
  384. package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +0 -2
  385. package/out/web/assets/CalculationCard-CRjP3E1j.js +0 -1
  386. package/out/web/assets/CliSessionsView-C3Br2v5Y.css +0 -1
  387. package/out/web/assets/CodeReviewPage-CUJceQme.css +0 -1
  388. package/out/web/assets/CodeReviewPage-VCUgPla_.js +0 -2
  389. package/out/web/assets/ImageGenCard-BCXxkVJX.js +0 -1
  390. package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +0 -1
  391. package/out/web/assets/LibraryPage-DAxUTAg7.css +0 -1
  392. package/out/web/assets/LibraryPage-WlviRdR8.js +0 -2
  393. package/out/web/assets/LinkedFoldersView-CKRgroWK.js +0 -1
  394. package/out/web/assets/McpServersView-D3wHnuHg.js +0 -1
  395. package/out/web/assets/MermaidCard-NqrHdyJW.js +0 -2
  396. package/out/web/assets/MintDashboard-B2DJsDDO.css +0 -1
  397. package/out/web/assets/MintDashboard-COw_xol7.js +0 -63
  398. package/out/web/assets/RewindModal-DempuDod.js +0 -1
  399. package/out/web/assets/SettingsWindow-2YP3yj7s.js +0 -4
  400. package/out/web/assets/SettingsWindow-Dz8LQVgD.css +0 -1
  401. package/out/web/assets/StockCard-BDMCe7mx.js +0 -1
  402. package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +0 -38
  403. package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +0 -1
  404. package/out/web/assets/UiMockupWidget-DD73QWg1.js +0 -1
  405. package/out/web/assets/WeatherCard-CPucIfq8.js +0 -1
  406. package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +0 -2
  407. package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +0 -1
  408. package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +0 -1
  409. package/out/web/assets/config-CvIO5hkn.js +0 -2
  410. package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +0 -1
  411. package/out/web/assets/index-BmpulIkg.js +0 -168
  412. package/out/web/assets/index-CkvBwhX_.css +0 -1
  413. package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +0 -1
  414. package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +0 -8
  415. package/shared-modules/libsecret/libsecret.json +0 -23
  416. package/shared-modules/libusb/libusb.json +0 -27
  417. package/shared-modules/lzo/lzo.json +0 -27
  418. package/src/renderer/src/components/BrowserShell.tsx +0 -108
  419. package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +0 -91
  420. package/src/renderer/src/components/browser-shell.css +0 -185
  421. package/src-tauri/src/native/browser.rs +0 -252
@@ -447,7 +447,7 @@ impl Default for MintConfig {
447
447
  local_openai_num_ctx: 32_768,
448
448
  ollama_host: String::new(),
449
449
  ollama_model: "llama3:latest".into(),
450
- ollama_num_ctx: 8192,
450
+ ollama_num_ctx: 32_768,
451
451
  nanobanana_model: "gemini-3.1-flash-image".into(),
452
452
  image_gen_provider: "nanobanana".into(),
453
453
  dalle_model: "gpt-image-1".into(),
@@ -773,53 +773,131 @@ impl MintConfig {
773
773
  }
774
774
  }
775
775
 
776
- /// Returns whether thinking/reasoning is supported by a given provider & model.
777
- pub fn is_thinking_supported_for_model(provider: &str, model: &str) -> bool {
778
- let p = provider.to_ascii_lowercase();
779
- let m = model.to_ascii_lowercase();
776
+ /// Returns true if the model ID refers to a non-text media or embedding model
777
+ /// (e.g. image generation/editing, TTS, STT, embeddings, moderation, or live-only audio).
778
+ pub fn is_non_text_model(model: &str) -> bool {
779
+ let m = model.trim().to_ascii_lowercase();
780
+ if m.is_empty() {
781
+ return true;
782
+ }
783
+ m.contains("banana")
784
+ || m.contains("imagen")
785
+ || m.contains("image")
786
+ || m.contains("dall-e")
787
+ || m.contains("flux")
788
+ || m.contains("sdxl")
789
+ || m.contains("sd3")
790
+ || m.contains("ideogram")
791
+ || m.contains("veo-")
792
+ || m.contains("whisper")
793
+ || m.contains("tts")
794
+ || m.contains("embed")
795
+ || m.contains("aqa")
796
+ || m.contains("moderation")
797
+ || m.contains("native-audio")
798
+ || m.contains("-live-")
799
+ || m.ends_with("-live")
800
+ }
801
+
802
+ /// Returns whether the provider's HTTP endpoint natively accepts a dedicated thinking/reasoning
803
+ /// payload parameter for this model (as opposed to using the prompt-based `<think>` CoT fallback).
804
+ pub fn has_native_thinking_api(provider: &str, model: &str) -> bool {
805
+ if Self::is_non_text_model(model) {
806
+ return false;
807
+ }
808
+ let p = provider.trim().to_ascii_lowercase();
809
+ let m = model.trim().to_ascii_lowercase();
780
810
  if p == "gemini" {
781
811
  return m.contains("2.5")
782
- || m.contains("2.0")
812
+ || m.contains("2.0-flash-thinking")
783
813
  || m.contains("3.")
814
+ || m.contains("gemini-3-")
815
+ || m.ends_with("gemini-3")
816
+ || m.contains("4.")
817
+ || m.contains("gemini-4-")
818
+ || m.contains("argon")
784
819
  || m.contains("thinking");
785
820
  }
786
821
  if p == "anthropic" {
787
822
  return m.contains("3-7")
788
823
  || m.contains("3.7")
789
- || m.contains("sonnet-5")
790
- || m.contains("opus-5")
791
824
  || m.contains("sonnet-4")
792
- || m.contains("opus-4");
825
+ || m.contains("opus-4")
826
+ || m.contains("haiku-4")
827
+ || m.contains("claude-4")
828
+ || m.contains("sonnet-5")
829
+ || m.contains("opus-5");
793
830
  }
794
831
  if p == "openai" || p == "local_openai" {
795
- return m.starts_with("o1")
796
- || m.starts_with("o3")
832
+ let slug = m.rsplit('/').next().unwrap_or(&m);
833
+ return slug.starts_with("o1")
834
+ || slug.starts_with("o3")
835
+ || slug.starts_with("o4")
797
836
  || m.contains("thinking")
798
837
  || m.contains("reason")
799
- || m.contains("gpt-5");
838
+ || m.contains("gpt-5")
839
+ || m.contains("r1")
840
+ || m.contains("qwq");
800
841
  }
801
842
  if p == "deepseek" {
802
- return m.contains("reasoner") || m.contains("r1") || m.contains("deepseek");
843
+ return m.contains("flash")
844
+ || m.contains("v4")
845
+ || m.contains("reasoner")
846
+ || m.contains("r1")
847
+ || m.contains("thinking");
803
848
  }
804
849
  if p == "openrouter" {
805
850
  return m.contains("o1")
806
851
  || m.contains("o3")
852
+ || m.contains("o4")
853
+ || m.contains("gpt-5")
807
854
  || m.contains("thinking")
808
855
  || m.contains("reason")
809
856
  || m.contains("r1")
810
857
  || m.contains("qwq")
811
- || m.contains("glm")
812
- || m.contains("deepseek");
858
+ || m.contains("deepseek-flash")
859
+ || m.contains("deepseek-v4")
860
+ || m.contains("gemini-2.5")
861
+ || m.contains("gemini-3")
862
+ || m.contains("claude-3-7")
863
+ || m.contains("claude-3.7")
864
+ || m.contains("claude-4")
865
+ || m.contains("sonnet-4")
866
+ || m.contains("opus-4")
867
+ || m.contains("sonnet-5")
868
+ || m.contains("opus-5");
813
869
  }
814
870
  if p == "ollama" {
815
871
  return m.contains("r1")
816
872
  || m.contains("qwq")
873
+ || m.contains("qwen3")
817
874
  || m.contains("thinking")
818
875
  || m.contains("deepseek");
819
876
  }
820
877
  false
821
878
  }
822
879
 
880
+ /// Returns whether thinking/reasoning is supported by a given provider & model
881
+ /// (either via native provider API parameters or prompt-based `<think>` CoT fallback).
882
+ /// Only non-text models (image generation, TTS/STT, embeddings) return `false`.
883
+ pub fn is_thinking_supported_for_model(provider: &str, model: &str) -> bool {
884
+ if Self::is_non_text_model(model) {
885
+ return false;
886
+ }
887
+ let p = provider.trim().to_ascii_lowercase();
888
+ matches!(
889
+ p.as_str(),
890
+ "gemini"
891
+ | "anthropic"
892
+ | "openai"
893
+ | "local_openai"
894
+ | "deepseek"
895
+ | "openrouter"
896
+ | "ollama"
897
+ | "huggingface"
898
+ ) || p.starts_with("custom:")
899
+ }
900
+
823
901
  /// Returns whether the active model supports thinking/reasoning.
824
902
  pub fn is_thinking_supported(&self) -> bool {
825
903
  Self::is_thinking_supported_for_model(&self.ai_provider, self.active_model())
@@ -828,6 +906,9 @@ impl MintConfig {
828
906
  /// Resolves thinking enabled state for a model.
829
907
  pub fn resolved_thinking_enabled_for_model(&self, provider: &str, model: &str) -> bool {
830
908
  let model_clean = model.trim();
909
+ if !Self::is_thinking_supported_for_model(provider, model_clean) {
910
+ return false;
911
+ }
831
912
  if let Some(cfg) = self.model_thinking_configs.get(model_clean) {
832
913
  return cfg.enabled;
833
914
  }
@@ -837,8 +918,8 @@ impl MintConfig {
837
918
  return v.enabled;
838
919
  }
839
920
  }
840
- // If not explicitly configured, enable by default only if model supports it
841
- if Self::is_thinking_supported_for_model(provider, model) {
921
+ // If not explicitly overridden per-model, enable by default for models with native thinking API
922
+ if Self::has_native_thinking_api(provider, model_clean) {
842
923
  self.thinking_enabled
843
924
  } else {
844
925
  false
@@ -1064,6 +1145,17 @@ fn is_test_environment() -> bool {
1064
1145
 
1065
1146
  /// Returns the root configuration directory for Mint (`~/.config/mint`).
1066
1147
  pub fn mint_config_dir() -> Option<PathBuf> {
1148
+ if let Ok(override_dir) = std::env::var("MINT_CONFIG_DIR") {
1149
+ return Some(PathBuf::from(override_dir));
1150
+ }
1151
+ if let Ok(override_path) = std::env::var("MINT_CONFIG_PATH") {
1152
+ if let Some(parent) = Path::new(&override_path).parent() {
1153
+ return Some(parent.to_path_buf());
1154
+ }
1155
+ }
1156
+ if is_test_environment() {
1157
+ return Some(std::env::temp_dir().join("mint-test"));
1158
+ }
1067
1159
  dirs::config_dir().map(|dir| dir.join("mint"))
1068
1160
  }
1069
1161
 
@@ -1071,12 +1163,6 @@ pub fn config_path() -> Result<PathBuf, ConfigError> {
1071
1163
  if let Ok(override_path) = std::env::var("MINT_CONFIG_PATH") {
1072
1164
  return Ok(PathBuf::from(override_path));
1073
1165
  }
1074
- if is_test_environment() {
1075
- let tmp = std::env::temp_dir()
1076
- .join("mint-test")
1077
- .join("mint-config.json");
1078
- return Ok(tmp);
1079
- }
1080
1166
  mint_config_dir()
1081
1167
  .map(|directory| directory.join("mint-config.json"))
1082
1168
  .ok_or(ConfigError::ConfigDirectoryUnavailable)
@@ -1226,14 +1312,9 @@ fn default_sandbox_command() -> &'static str {
1226
1312
 
1227
1313
  fn runtime_extra_defaults() -> BTreeMap<String, Value> {
1228
1314
  serde_json::from_value(serde_json::json!({
1229
- "automationBrowser": "chromium",
1230
- "browserAutomationEnabled": true,
1231
- "browserAgentMode": "headless",
1232
1315
  "browserExecutable": "",
1233
1316
  "browserViewportWidth": 1440,
1234
1317
  "browserViewportHeight": 900,
1235
- "browserDebugUrl": "http://127.0.0.1:9222/json/list",
1236
- "browserExtensionContextUrl": "http://127.0.0.1:3212/context",
1237
1318
  "proactiveInterval": 60,
1238
1319
  "proactiveCooldown": 120,
1239
1320
  "enableHeadlessTaskQueue": false,
@@ -1417,7 +1498,7 @@ mod tests {
1417
1498
  // Default openai_model is a GPT-5 family model.
1418
1499
  assert_eq!(window_for("openai"), 400_000);
1419
1500
  assert_eq!(window_for("deepseek"), 128_000);
1420
- assert_eq!(window_for("ollama"), 8_192); // default ollama_num_ctx
1501
+ assert_eq!(window_for("ollama"), 32_768); // default ollama_num_ctx
1421
1502
  assert_eq!(window_for("local_openai"), 32_768); // default local_openai_num_ctx
1422
1503
  assert_eq!(window_for("huggingface"), 128_000);
1423
1504
  assert_eq!(window_for("openrouter"), 128_000); // default openrouter_num_ctx
@@ -1820,7 +1901,7 @@ mod tests {
1820
1901
  fn test_thinking_configuration_and_resolution() {
1821
1902
  let mut config = MintConfig::default();
1822
1903
 
1823
- // Support checks
1904
+ // All text/chat models support thinking (via native API or prompt fallback)
1824
1905
  assert!(MintConfig::is_thinking_supported_for_model(
1825
1906
  "anthropic",
1826
1907
  "claude-3-7-sonnet"
@@ -1829,6 +1910,10 @@ mod tests {
1829
1910
  "gemini",
1830
1911
  "gemini-2.5-pro"
1831
1912
  ));
1913
+ assert!(MintConfig::is_thinking_supported_for_model(
1914
+ "gemini",
1915
+ "gemini-3-flash-preview"
1916
+ ));
1832
1917
  assert!(MintConfig::is_thinking_supported_for_model(
1833
1918
  "openai", "o3-mini"
1834
1919
  ));
@@ -1836,15 +1921,60 @@ mod tests {
1836
1921
  "deepseek",
1837
1922
  "deepseek-reasoner"
1838
1923
  ));
1839
- assert!(!MintConfig::is_thinking_supported_for_model(
1924
+ assert!(MintConfig::is_thinking_supported_for_model(
1925
+ "deepseek",
1926
+ "deepseek-flash"
1927
+ ));
1928
+ assert!(MintConfig::is_thinking_supported_for_model(
1929
+ "deepseek",
1930
+ "deepseek-v4-pro"
1931
+ ));
1932
+ assert!(MintConfig::is_thinking_supported_for_model(
1840
1933
  "openai", "gpt-4o"
1841
1934
  ));
1842
- assert!(!MintConfig::is_thinking_supported_for_model(
1935
+ assert!(MintConfig::is_thinking_supported_for_model(
1843
1936
  "anthropic",
1844
1937
  "claude-3-5-haiku"
1845
1938
  ));
1846
1939
 
1847
- // Global default resolution
1940
+ // Non-text models (image / audio / embedding) do NOT support thinking
1941
+ assert!(!MintConfig::is_thinking_supported_for_model(
1942
+ "gemini",
1943
+ "nano-banana-pro-preview"
1944
+ ));
1945
+ assert!(!MintConfig::is_thinking_supported_for_model(
1946
+ "gemini",
1947
+ "gemini-nano-banana-2.1"
1948
+ ));
1949
+ assert!(!MintConfig::is_thinking_supported_for_model(
1950
+ "gemini",
1951
+ "imagen-3.0-generate-002"
1952
+ ));
1953
+ assert!(!MintConfig::is_thinking_supported_for_model(
1954
+ "openai",
1955
+ "text-embedding-3-small"
1956
+ ));
1957
+
1958
+ // Native thinking API detection
1959
+ assert!(MintConfig::has_native_thinking_api(
1960
+ "deepseek",
1961
+ "deepseek-flash"
1962
+ ));
1963
+ assert!(MintConfig::has_native_thinking_api(
1964
+ "deepseek",
1965
+ "deepseek-v4-pro"
1966
+ ));
1967
+ assert!(!MintConfig::has_native_thinking_api(
1968
+ "deepseek",
1969
+ "deepseek-chat"
1970
+ ));
1971
+ assert!(MintConfig::has_native_thinking_api(
1972
+ "gemini",
1973
+ "gemini-3-flash-preview"
1974
+ ));
1975
+ assert!(!MintConfig::has_native_thinking_api("openai", "gpt-4o"));
1976
+
1977
+ // Global default resolution for native thinking model
1848
1978
  config.ai_provider = "anthropic".into();
1849
1979
  config.anthropic_model = "claude-3-7-sonnet".into();
1850
1980
  let (enabled, effort) = config.resolved_thinking();
@@ -1862,11 +1992,23 @@ mod tests {
1862
1992
  let (enabled, _) = config.resolved_thinking();
1863
1993
  assert!(!enabled);
1864
1994
 
1865
- // Unsupported model always resolves enabled to false
1995
+ // Standard chat model without native thinking API defaults to false until toggled on
1866
1996
  config.ai_provider = "openai".into();
1867
1997
  config.openai_model = "gpt-4o".into();
1868
1998
  let (enabled, _) = config.resolved_thinking();
1869
1999
  assert!(!enabled);
2000
+ // Once user toggles it on, it enables thinking (via prompt fallback)
2001
+ config.set_model_thinking("gpt-4o", true, "high");
2002
+ let (enabled, effort) = config.resolved_thinking();
2003
+ assert!(enabled);
2004
+ assert_eq!(effort, "high");
2005
+
2006
+ // Non-text model always resolves enabled to false even if overridden
2007
+ config.ai_provider = "gemini".into();
2008
+ config.gemini_model = "nano-banana-pro-preview".into();
2009
+ config.set_model_thinking("nano-banana-pro-preview", true, "high");
2010
+ let (enabled, _) = config.resolved_thinking();
2011
+ assert!(!enabled);
1870
2012
  }
1871
2013
 
1872
2014
  #[test]
@@ -384,39 +384,33 @@ pub fn preview(manifest: &Value, source: &str) -> Result<Value, String> {
384
384
  .snapshot()
385
385
  }
386
386
 
387
- /// Newline-delimited IPC. The parent grants capabilities; this process has no OS SDK.
388
- pub fn worker_main() -> Result<(), String> {
389
- fn read() -> Result<Value, String> {
390
- let mut line = String::new();
391
- io::stdin()
392
- .read_line(&mut line)
393
- .map_err(|e| e.to_string())?;
394
- if line.len() > 1024 * 1024 {
395
- return Err("IPC request too large".into());
396
- }
397
- serde_json::from_str(&line).map_err(|e| e.to_string())
398
- }
399
- fn send(value: &Value) {
400
- println!("{}", value);
401
- let _ = io::stdout().flush();
402
- }
387
+ /// Runs the worker exchange loop using custom reader and sender functions.
388
+ pub fn run_worker_loop<R, W>(read: R, send: W) -> Result<(), String>
389
+ where
390
+ R: Fn() -> Result<Value, String> + Clone + Send + Sync + 'static,
391
+ W: Fn(Value) + Clone + Send + Sync + 'static,
392
+ {
403
393
  let init = read()?;
394
+ let host_send = send.clone();
395
+ let host_read = read.clone();
404
396
  let engine = Engine::new(
405
397
  init["compiled"].as_str().ok_or("Missing compiled source")?,
406
398
  &init["state"],
407
- |request| {
399
+ move |request| {
408
400
  let request = serde_json::from_str::<Value>(&request).unwrap_or(Value::Null);
409
- send(&json!({"host":request}));
410
- read().unwrap_or_else(|e| json!({"error":e})).to_string()
401
+ host_send(json!({"host":request}));
402
+ host_read()
403
+ .unwrap_or_else(|e| json!({"error":e}))
404
+ .to_string()
411
405
  },
412
406
  );
413
407
  let engine = match engine {
414
408
  Ok(e) => {
415
- send(&json!({"ok":e.snapshot()?}));
409
+ send(json!({"ok":e.snapshot()?}));
416
410
  e
417
411
  }
418
412
  Err(e) => {
419
- send(&json!({"error":e}));
413
+ send(json!({"error":e}));
420
414
  return Ok(());
421
415
  }
422
416
  };
@@ -430,9 +424,9 @@ pub fn worker_main() -> Result<(), String> {
430
424
  break;
431
425
  }
432
426
  match engine.dispatch(kind, &request["payload"]) {
433
- Ok(v) => send(&json!({"ok":v})),
427
+ Ok(v) => send(json!({"ok":v})),
434
428
  Err(e) => {
435
- send(&json!({"error":e}));
429
+ send(json!({"error":e}));
436
430
  break;
437
431
  }
438
432
  }
@@ -440,6 +434,26 @@ pub fn worker_main() -> Result<(), String> {
440
434
  Ok(())
441
435
  }
442
436
 
437
+ /// Newline-delimited IPC. The parent grants capabilities; this process has no OS SDK.
438
+ pub fn worker_main() -> Result<(), String> {
439
+ run_worker_loop(
440
+ || {
441
+ let mut line = String::new();
442
+ io::stdin()
443
+ .read_line(&mut line)
444
+ .map_err(|e| e.to_string())?;
445
+ if line.len() > 1024 * 1024 {
446
+ return Err("IPC request too large".into());
447
+ }
448
+ serde_json::from_str(&line).map_err(|e| e.to_string())
449
+ },
450
+ |value| {
451
+ println!("{}", value);
452
+ let _ = io::stdout().flush();
453
+ },
454
+ )
455
+ }
456
+
443
457
  pub fn pack(manifest: &Value, source: &str, readme: &str) -> Result<Vec<u8>, String> {
444
458
  let m: Manifest = serde_json::from_value(manifest.clone()).map_err(|e| e.to_string())?;
445
459
  compile(&m, source)?;
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/core-Mi3s5D4_.js","assets/rolldown-runtime-CNOWq4Kh.js","assets/WorkspacePdfPreview-Bi8Zzyir.js","assets/jsx-runtime-DmUwWVTj.js","assets/index-BocxnrDG.js","assets/index-yeh_r55a.css"])))=>i.map(i=>d[i]);
2
+ import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{En as i,F as a,I as o,In as s,J as c,Jn as l,L as u,Qt as d,Wn as f,Xn as p,er as ee,g as m,h,j as g,nr as _}from"./index-BocxnrDG.js";import{N as v,P as y,b,c as x,d as S,l as C,m as w,p as T,s as E,x as D}from"./MintDashboard-C_UYPoNV.js";async function O(e,t,n={}){let r=n.openBrowser??(async e=>{await a.openExternal(e)}),i=n.startPreview??((e,t)=>o.startHtmlPreview(e,t));if(e.url){await r(e.url);return}let s=(e.workspacePath??t)?.trim();if(!s)throw Error(`Select a project before opening its preview in browser`);let c=e.path.replace(/\\/g,`/`);if(/^(\/|[a-z]:\/)/i.test(c)){let e=s.replace(/\\/g,`/`).replace(/\/+$/,``),t=`${e}/`;if(!(/^[a-z]:\//i.test(e)||e.startsWith(`//`)?c.toLowerCase().startsWith(t.toLowerCase()):c.startsWith(t)))throw Error(`This file is outside its source project`);c=c.slice(t.length)}await r((await i(s,c)).url)}var k=t((()=>{g()})),A=t((()=>{}));function j({path:e,root:t}){let[n,r]=(0,M.useState)(!1),[i,a]=(0,M.useState)(``),o=e.replace(/\\/g,`/`).split(`/`).pop()||e,s=async()=>{if(t&&!n){r(!0),a(``);try{let n=w(t,e),{invoke:r}=await h(async()=>{let{invoke:e}=await import(`./core-Mi3s5D4_.js`).then(e=>(e.a(),e.i));return{invoke:e}},__vite__mapDeps([0,1]));await r(`run_desktop_action`,{action:{type:`open_url`,target:n}})}catch(e){a(e instanceof Error?e.message:String(e))}finally{r(!1)}}};return(0,N.jsxs)(`section`,{className:`workspace-file-info`,"aria-label":`File information`,children:[(0,N.jsx)(f,{size:32,"aria-hidden":`true`}),(0,N.jsx)(`h2`,{children:o}),(0,N.jsx)(`p`,{children:`Preview is not available for this file type.`}),(0,N.jsxs)(`dl`,{children:[(0,N.jsx)(`dt`,{children:`File type`}),(0,N.jsx)(`dd`,{children:o.includes(`.`)?o.split(`.`).pop().toUpperCase():`File`}),(0,N.jsx)(`dt`,{children:`Path`}),(0,N.jsx)(`dd`,{children:e}),(0,N.jsx)(`dt`,{children:`Workspace`}),(0,N.jsx)(`dd`,{children:t||`Unavailable`})]}),(0,N.jsxs)(`button`,{type:`button`,disabled:!t||n,"aria-busy":n,onClick:()=>{s()},children:[(0,N.jsx)(_,{size:15,"aria-hidden":`true`}),n?`Opening…`:`Open with external app`]}),i&&(0,N.jsxs)(`p`,{className:`workspace-file-info-error`,role:`alert`,children:[`Could not open file: `,i]})]})}var M,N,P=t((()=>{M=e(n()),u(),S(),A(),N=r(),m()})),F=t((()=>{}));function I({kind:e,url:t,path:n,root:r,mimeType:i}){let a=(0,L.useRef)(null),[o,s]=(0,L.useState)(!1);return(0,L.useEffect)(()=>{let e=a.current;return()=>{e&&(e.pause(),e.removeAttribute(`src`),e.querySelector(`source`)?.removeAttribute(`src`),e.load())}},[t]),(0,R.jsx)(`section`,{className:`workspace-media-preview is-${e}`,"aria-label":`${e===`audio`?`Audio`:`Video`} preview`,children:o?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{role:`alert`,className:`workspace-media-error`,children:`This file could not be played in Mint. Open it with an external app instead.`}),(0,R.jsx)(j,{path:n,root:r})]}):e===`audio`?(0,R.jsx)(`audio`,{ref:a,controls:!0,preload:`metadata`,"aria-label":n,onError:()=>s(!0),children:(0,R.jsx)(`source`,{src:t,type:i})}):(0,R.jsx)(`video`,{ref:a,controls:!0,preload:`metadata`,playsInline:!0,"aria-label":n,onError:()=>s(!0),children:(0,R.jsx)(`source`,{src:t,type:i})})})}var L,R,z=t((()=>{L=e(n()),P(),F(),R=r()}));function te(e){switch(e){case`image`:return(0,H.jsx)(i,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`html`:return(0,H.jsx)(s,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`svg`:case`code`:return(0,H.jsx)(p,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`markdown`:case`pdf`:return(0,H.jsx)(l,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`audio`:return(0,H.jsx)(d,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`video`:return(0,H.jsx)(c,{size:13,strokeWidth:2.2,"aria-hidden":`true`});default:return(0,H.jsx)(f,{size:13,strokeWidth:2.2,"aria-hidden":`true`})}}function B({artifact:e,onClose:t,workspacePath:n}){let r=e?.path||``,o=(0,V.useMemo)(()=>{if(!r)return``;let e=r.replace(/\\/g,`/`).split(`/`);return e[e.length-1]||r},[r]),s=(0,V.useMemo)(()=>e?.type?e.type:E(r),[e,r]),c=s===`html`||s===`svg`||s===`markdown`,[l,u]=(0,V.useState)(s===`code`?`code`:`preview`),[d,f]=(0,V.useState)(`desktop`),[m,h]=(0,V.useState)(e?.content||``),[g,_]=(0,V.useState)(e?.url||``),[y,b]=(0,V.useState)(e?.url||``),[S,C]=(0,V.useState)(e?.byteLength),[w,k]=(0,V.useState)(!1),[A,M]=(0,V.useState)(null),[N,P]=(0,V.useState)(!1),[F,L]=(0,V.useState)(null),R=(0,V.useRef)(!1),z=(0,V.useRef)(e);z.current=e;let[B,W]=(0,V.useState)(!1),[G,K]=(0,V.useState)(null),[q,J]=(0,V.useState)(0),Y=(0,V.useRef)(0),X=e?.workspacePath??n,Z=(0,V.useMemo)(()=>x(r),[r]),Q=s===`pdf`||s===`audio`||s===`video`,ne=(0,V.useMemo)(()=>{if(s!==`image`)return`Image`;let e=r.split(`.`).pop()?.toUpperCase()||``;return e===`JPG`?`JPEG`:[`PNG`,`JPEG`,`WEBP`,`GIF`,`SVG`,`ICO`,`AVIF`,`BMP`,`TIFF`].includes(e)?e:`IMAGE`},[s,r]),re=(0,V.useMemo)(()=>!Z||Z===`plaintext`?`Code`:{javascript:`JavaScript`,typescript:`TypeScript`,python:`Python`,rust:`Rust`,json:`JSON`,html:`HTML`,css:`CSS`,cpp:`C++`,csharp:`C#`,php:`PHP`,ruby:`Ruby`,shell:`Shell`,bash:`Bash`,sql:`SQL`,yaml:`YAML`,xml:`XML`,toml:`TOML`,markdown:`Markdown`}[Z.toLowerCase()]||Z.charAt(0).toUpperCase()+Z.slice(1),[Z]),$=(0,V.useCallback)(async(t=!1)=>{let n=++Y.current;if(M(null),K(null),J(e=>e+1),r){if(t&&l===`preview`&&(s===`image`||s===`svg`)&&e?.url?.startsWith(`data:image/`)&&X){k(!0);try{let e=await a.readWorkspaceImage(r,X);Y.current===n&&_(e)}catch(e){Y.current===n&&M(e instanceof Error?e.message:String(e))}finally{Y.current===n&&k(!1)}}else if(Q){if(e?.url){b(e.url),k(!1);return}k(!0);try{let e=await a.readWorkspaceMedia(r,X);Y.current===n&&(b(e.url),C(e.byteLength))}catch(e){Y.current===n&&M(e instanceof Error?e.message:String(e))}finally{Y.current===n&&k(!1)}}else if(s===`file`||s===`image`||e?.url&&l===`preview`)k(!1),s===`image`&&!e?.url&&M(`No image preview URL is available`);else{k(!0);try{let e=await a.readWorkspaceFile(r,X);Y.current===n&&h(e)}catch(t){if(Y.current!==n)return;e?.content===void 0?M(t instanceof Error?t.message:`Unable to read file content`):h(e.content)}finally{Y.current===n&&k(!1)}}}},[r,X,e,s,l,Q]);(0,V.useEffect)(()=>{u(s===`code`?`code`:`preview`),L(null),h(e?.content??``),_(e?.url??``),b(e?.url??``),C(e?.byteLength),K(null),M(null)},[e,s]),(0,V.useEffect)(()=>(e?.content!==void 0&&(l===`preview`||!r)?(k(!1),M(null)):$(),()=>{Y.current+=1}),[e,l,r,$]);let ie=async()=>{if(r)try{await navigator.clipboard.writeText(r),W(!0),setTimeout(()=>W(!1),1800)}catch{}},ae=async()=>{if(e&&!R.current){R.current=!0,P(!0),L(null);try{await O(e,X)}catch(t){z.current===e&&L(t instanceof Error?t.message:String(t))}finally{R.current=!1,P(!1)}}};return e?(0,H.jsxs)(`aside`,{className:`artifact-preview-panel`,style:{display:`flex`,flexDirection:`column`,width:`var(--preview-width, 50%)`,minWidth:`280px`,maxWidth:`none`,height:`100%`,background:`var(--panel-bg, #1e1e20)`,color:`var(--text-main, #e8e8ea)`,position:`relative`,zIndex:10,overflow:`hidden`},children:[(0,H.jsxs)(`header`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid var(--border)`,background:`var(--surface-bg, #252527)`,gap:`8px`,flexShrink:0},children:[(0,H.jsxs)(`div`,{className:`artifact-preview-header-drag`,draggable:!!r,onDragStart:r?t=>{T(t.dataTransfer,{path:r,root:X,url:g||e?.url})}:void 0,style:{display:`flex`,alignItems:`center`,gap:`8px`,minWidth:0,cursor:r?`grab`:void 0},title:r?`${r} (Drag to chat)`:void 0,children:[(0,H.jsx)(`span`,{style:{display:`inline-flex`,alignItems:`center`,justifyContent:`center`,width:`24px`,height:`24px`,borderRadius:`var(--radius-xs, 4px)`,background:`color-mix(in srgb, var(--accent) 15%, transparent)`,color:`var(--interactive-fg)`,flexShrink:0},title:s.toUpperCase(),"aria-label":`${s} artifact`,children:te(s)}),(0,H.jsxs)(`div`,{style:{minWidth:0,display:`flex`,flexDirection:`column`},children:[(0,H.jsx)(`span`,{style:{fontWeight:600,fontSize:`0.86rem`,color:`var(--text-main)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:r,children:o}),(0,H.jsx)(`button`,{type:`button`,onClick:ie,style:{background:`none`,border:`none`,color:B?`var(--accent)`:`var(--text-muted)`,fontSize:`0.7rem`,padding:0,cursor:`pointer`,textAlign:`left`,display:`inline-flex`,alignItems:`center`,gap:`4px`},children:B?`Path Copied`:`Copy path`})]})]}),(0,H.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[c?(0,H.jsxs)(`div`,{style:{display:`inline-flex`,padding:`2px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`var(--radius-sm, 6px)`,border:`1px solid var(--border)`},children:[(0,H.jsx)(`button`,{type:`button`,onClick:()=>u(`preview`),style:{background:l===`preview`?`var(--accent)`:`transparent`,color:l===`preview`?`var(--text-on-accent)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 9px`,fontSize:`0.75rem`,fontWeight:500,cursor:`pointer`,transition:`all 0.15s ease`},children:`Preview`}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>u(`code`),style:{background:l===`code`?`var(--accent)`:`transparent`,color:l===`code`?`var(--text-on-accent)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 9px`,fontSize:`0.75rem`,fontWeight:500,cursor:`pointer`,transition:`all 0.15s ease`},children:`Code`})]}):(0,H.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,H.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`5px`,padding:`3px 10px`,background:s===`image`||s===`code`?`color-mix(in srgb, var(--accent) 10%, transparent)`:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`9999px`,border:s===`image`||s===`code`?`1px solid color-mix(in srgb, var(--accent) 25%, transparent)`:`1px solid var(--border)`,color:s===`image`||s===`code`?`var(--accent)`:`var(--text-muted)`,fontSize:`0.72rem`,fontWeight:500,letterSpacing:`0.01em`},children:[s===`code`?(0,H.jsx)(p,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):s===`image`?(0,H.jsx)(i,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):(0,H.jsx)(ee,{size:12,strokeWidth:2.2,"aria-hidden":`true`}),(0,H.jsx)(`span`,{children:s===`code`?re:s===`image`?ne:s===`file`?`Details`:`Preview`})]}),s===`image`&&G&&(0,H.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,padding:`3px 9px`,borderRadius:`9999px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,border:`1px solid var(--border)`,fontSize:`0.7rem`,color:`var(--text-muted)`,fontFamily:`var(--font-mono, monospace)`,letterSpacing:`0.01em`,whiteSpace:`nowrap`},title:`Image dimensions (width × height)`,children:[G.width,` × `,G.height,` px`]})]}),l===`preview`&&s===`html`&&(0,H.jsxs)(`div`,{style:{display:`inline-flex`,padding:`2px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`var(--radius-sm, 6px)`,border:`1px solid var(--border)`},children:[(0,H.jsx)(`button`,{type:`button`,onClick:()=>f(`desktop`),title:`Desktop 100%`,style:{background:d===`desktop`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:d===`desktop`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Desktop`}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>f(`tablet`),title:`Tablet (768px)`,style:{background:d===`tablet`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:d===`tablet`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Tablet`}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>f(`mobile`),title:`Mobile (375px)`,style:{background:d===`mobile`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:d===`mobile`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Mobile`})]})]}),(0,H.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`4px`},children:[!Q&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{$(!0)},disabled:w,title:`Reload content from file`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{animation:w?`spin 1s linear infinite`:`none`},children:[(0,H.jsx)(`polyline`,{points:`23 4 23 10 17 10`}),(0,H.jsx)(`polyline`,{points:`1 20 1 14 7 14`}),(0,H.jsx)(`path`,{d:`M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15`})]})}),s===`html`&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{ae()},disabled:N,"aria-label":`Open preview`,"aria-busy":N,title:N?`Opening preview…`:`Open preview`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}),(0,H.jsx)(`polyline`,{points:`15 3 21 3 21 9`}),(0,H.jsx)(`line`,{x1:`10`,y1:`14`,x2:`21`,y2:`3`})]})}),(e?.url||y||m)&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{let t=e?.url||y||(m?`data:text/plain;charset=utf-8,${encodeURIComponent(m)}`:``);if(!t)return;let n=document.createElement(`a`);n.href=t,n.download=o||`download`,document.body.appendChild(n),n.click(),document.body.removeChild(n)},title:`Download ${o}`,"aria-label":`Download ${o}`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),(0,H.jsx)(`polyline`,{points:`7 10 12 15 17 10`}),(0,H.jsx)(`line`,{x1:`12`,y1:`15`,x2:`12`,y2:`3`})]})}),(e?.url||y)&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>{let t=e?.url||y;t&&window.open(t,`_blank`,`noopener,noreferrer`)},title:`Open in new window`,"aria-label":`Open in new window`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}),(0,H.jsx)(`polyline`,{points:`15 3 21 3 21 9`}),(0,H.jsx)(`line`,{x1:`10`,y1:`14`,x2:`21`,y2:`3`})]})}),(0,H.jsx)(`button`,{type:`button`,onClick:t,title:`Close preview Panel`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,H.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,H.jsx)(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),(0,H.jsx)(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})]})})]})]}),F&&(0,H.jsxs)(`div`,{role:`alert`,style:{padding:`8px 14px`,fontSize:`0.8rem`,color:`var(--status-error, #f87171)`,flexShrink:0},children:[`Could not open preview: `,F]}),(0,H.jsx)(`div`,{style:{flex:1,overflow:`auto`,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`flex-start`,background:l===`preview`&&s===`html`?`var(--input-bg, #0a0a0b)`:`transparent`,padding:l===`preview`&&s===`html`?`16px`:`0`},children:A?(0,H.jsxs)(`div`,{style:{padding:`24px`,textAlign:`center`,color:`var(--status-error, #f87171)`},children:[(0,H.jsx)(`p`,{style:{fontWeight:600,marginBottom:`8px`},children:`Error loading preview`}),(0,H.jsx)(`p`,{style:{fontSize:`0.8rem`,opacity:.8},children:A}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>{$(!0)},style:{marginTop:`12px`,padding:`4px 12px`,borderRadius:`var(--radius-xs, 4px)`,background:`var(--hover-delete-bg, rgba(239, 68, 68, 0.15))`,color:`var(--status-error, #f87171)`,border:`1px solid color-mix(in srgb, var(--status-error, #ef4444) 30%, transparent)`,cursor:`pointer`,fontSize:`0.78rem`},children:`Retry`})]}):s===`file`?(0,H.jsx)(j,{path:r,root:X},`${X}:${r}`):s===`pdf`&&(e.url||y)?(0,H.jsx)(V.Suspense,{fallback:(0,H.jsx)(`p`,{role:`status`,children:`Loading PDF viewer…`}),children:(0,H.jsx)(U,{url:e.url||y,path:r,root:X,byteLength:e.byteLength||S,range:e.range},e.url||y)}):(s===`audio`||s===`video`)&&(e.url||y)?(0,H.jsx)(I,{kind:s,url:e.url||y,path:r,root:X,mimeType:e.mimeType},e.url||y):l===`code`?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,H.jsx)(v,{code:m,language:Z})}):s===`html`?(0,H.jsx)(`div`,{style:{width:d===`mobile`?`375px`:d===`tablet`?`768px`:`100%`,maxWidth:`100%`,height:`100%`,background:`#ffffff`,borderRadius:d===`desktop`?`0px`:`var(--radius-md, 8px)`,overflow:`hidden`,boxShadow:d===`desktop`?`none`:`var(--shadow-md, 0 10px 25px rgba(0,0,0,0.5))`,border:d===`desktop`?`none`:`1px solid var(--border)`,transition:`width 0.25s cubic-bezier(0.4, 0, 0.2, 1)`},children:(0,H.jsx)(`iframe`,{title:o,src:e.url,srcDoc:e.url?void 0:m,sandbox:e.url?`allow-scripts allow-forms allow-modals allow-same-origin`:`allow-scripts allow-forms allow-modals`,style:{width:`100%`,height:`100%`,border:`none`,background:`#ffffff`}},q)}):s===`image`||s===`svg`&&e.url?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,padding:`24px`,display:`flex`,alignItems:`center`,justifyContent:`center`,overflow:`hidden`},children:(0,H.jsx)(`img`,{ref:e=>{e&&e.complete&&e.naturalWidth&&e.naturalHeight&&K(t=>t?.width===e.naturalWidth&&t?.height===e.naturalHeight?t:{width:e.naturalWidth,height:e.naturalHeight})},draggable:!0,onDragStart:t=>{T(t.dataTransfer,{path:r,root:X,url:g||e?.url})},src:g||e.url,alt:o,style:{width:`100%`,height:`100%`,objectFit:`contain`,cursor:`grab`},onLoad:e=>{let t=e.currentTarget;t.naturalWidth&&t.naturalHeight&&K({width:t.naturalWidth,height:t.naturalHeight})},onError:()=>M(`Unable to load image. Reload the preview or check that the file is still available.`)},q)}):s===`svg`?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`24px`,backgroundImage:`linear-gradient(45deg, color-mix(in srgb, var(--text-main) 4%, transparent) 25%, transparent 25%), linear-gradient(-45deg, color-mix(in srgb, var(--text-main) 4%, transparent) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, color-mix(in srgb, var(--text-main) 4%, transparent) 75%), linear-gradient(-45deg, transparent 75%, color-mix(in srgb, var(--text-main) 4%, transparent) 75%)`,backgroundSize:`20px 20px`,backgroundPosition:`0 0, 0 10px, 10px -10px, -10px 0px`,overflow:`auto`},children:(0,H.jsx)(`div`,{style:{maxWidth:`90%`,maxHeight:`90%`,display:`flex`,alignItems:`center`,justifyContent:`center`},dangerouslySetInnerHTML:{__html:m}})}):s===`markdown`?(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`20px 24px`,lineHeight:1.6,color:`var(--text-chat, var(--text-main))`},children:D(m)}):(0,H.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,H.jsx)(v,{code:m,language:Z})})})]}):null}var V,H,U,W=t((()=>{V=e(n()),u(),k(),g(),b(),y(),P(),z(),H=r(),C(),S(),m(),U=(0,V.lazy)(()=>h(()=>import(`./WorkspacePdfPreview-Bi8Zzyir.js`),__vite__mapDeps([2,1,3,4,5])))}));C(),W();export{B as ArtifactPreviewPanel,j as n,P as r,F as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-CNOWq4Kh.js";import{n as t,t as n}from"./jsx-runtime-DmUwWVTj.js";import{Hr as r,L as i}from"./index-BocxnrDG.js";function a({data:e}){let t=typeof e.result==`number`?Number.isInteger(e.result)?e.result.toLocaleString():e.result.toLocaleString(void 0,{maximumFractionDigits:6}):String(e.result),n={cardBg:`var(--bg-surface-soft)`,cardText:`var(--text-primary)`,cardBorder:`var(--border-subtle)`,cardShadow:`var(--shadow-md)`,labelColor:`var(--text-muted)`,exprBg:`var(--bg-surface-raised)`,exprBorder:`var(--border-subtle)`,exprText:`var(--text-secondary)`,dividerColor:`var(--text-muted)`,resultBg:`var(--bg-surface-raised)`,resultBorder:`var(--border-default)`,resultText:`var(--text-primary)`};return(0,o.jsxs)(`div`,{style:{background:n.cardBg,color:n.cardText,borderRadius:`var(--radius-xl, 18px)`,padding:`16px 20px`,margin:`12px 0`,boxShadow:n.cardShadow,border:`1px solid ${n.cardBorder}`,fontFamily:`system-ui, -apple-system, sans-serif`},children:[(0,o.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,marginBottom:`12px`},children:[(0,o.jsx)(r,{size:16,strokeWidth:2,style:{opacity:.9,color:n.labelColor}}),(0,o.jsx)(`span`,{style:{fontSize:`11px`,fontWeight:700,letterSpacing:`0.8px`,color:n.labelColor},children:`CALCULATION`})]}),(0,o.jsx)(`div`,{style:{background:n.exprBg,border:`1px solid ${n.exprBorder}`,borderRadius:`var(--radius-sm, 8px)`,padding:`10px 14px`,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,fontSize:`14px`,color:n.exprText,letterSpacing:`0.3px`},children:e.expression}),(0,o.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,margin:`6px 0`,color:n.dividerColor,fontSize:`16px`,fontWeight:`bold`},children:`=`}),(0,o.jsx)(`div`,{style:{background:n.resultBg,border:`1px solid ${n.resultBorder}`,borderRadius:`var(--radius-md, 10px)`,padding:`12px 18px`},children:(0,o.jsx)(`div`,{style:{fontSize:`30px`,fontWeight:800,color:n.resultText,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,letterSpacing:`-0.5px`},children:t})})]})}var o;e((()=>{t(),i(),o=n()}))();export{a as default};
@@ -0,0 +1 @@
1
+ .code-sessions-container{max-width:960px;color:var(--text-main,#ececec);margin:0 auto;padding:32px 24px 64px;font-family:inherit;animation:.2s ease-out codeFadeIn}@keyframes codeFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.code-sessions-header{border-bottom:1px solid var(--border,#ffffff14);flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:24px;padding-bottom:16px;display:flex}.code-header-main{flex-direction:column;gap:4px;display:flex}.code-header-title-row{align-items:center;gap:10px;display:flex}.code-header-title{letter-spacing:-.02em;color:var(--text-main,#fff);align-items:center;gap:8px;margin:0;font-size:1.35rem;font-weight:600;display:flex}.code-header-count{border-radius:var(--radius-xs,6px);background:var(--surface-bg,#ffffff0f);color:var(--text-muted,#8e8e8e);border:1px solid var(--border,#ffffff0f);padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.76rem;font-weight:500}.code-header-subtitle{color:var(--text-muted,#8e8e8e);margin:0;font-size:.86rem}.code-controls-bar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px;display:flex}.code-search-box{flex:280px;position:relative}.code-search-input{background:var(--panel-soft,#121214);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);width:100%;color:var(--text-main,#ececec);outline:none;padding:8px 12px 8px 34px;font-size:.86rem;transition:border-color .15s}.code-search-input:focus{border-color:var(--border-light,#fff3);background:var(--surface-bg,#1a1a1c)}.code-search-input::placeholder{color:var(--placeholder,#71717a)}.code-search-icon{color:var(--placeholder,#71717a);pointer-events:none;position:absolute;top:50%;left:11px;transform:translateY(-50%)}.code-segmented-toggle{background:var(--panel-soft,#121214);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);gap:2px;padding:3px;display:inline-flex}.code-segmented-btn{border-radius:calc(var(--radius-sm,8px) - 2px);color:var(--text-muted,#8e8e8e);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:5px 12px;font-size:.8rem;font-weight:500;transition:all .15s}.code-segmented-btn:hover{color:var(--text-main,#ececec)}.code-segmented-btn.active{background:var(--surface-strong,#2c2c2e);color:var(--text-main,#fff);box-shadow:0 1px 3px #0000004d}.code-sort-select{background:var(--panel-soft,#121214);color:var(--text-muted,#8e8e8e);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);cursor:pointer;outline:none;padding:6px 10px;font-size:.8rem}.code-sort-select:hover,.code-sort-select:focus{color:var(--text-main,#ececec);border-color:var(--border-light,#ffffff29)}.code-header-controls{flex-wrap:wrap;flex:100%;align-items:center;gap:8px;min-width:0;display:flex}.code-header-controls .workspace-selector{max-width:100%}.code-header-controls .workspace-select-btn{min-height:36px}.code-show-all-btn{min-height:36px;margin-bottom:16px}.code-show-all-btn:focus-visible{outline:2px solid var(--interactive-fg,#a1a1aa);outline-offset:2px}.code-sessions-list{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-md,12px);background:var(--panel-soft,#121214);flex-direction:column;display:flex;overflow:hidden}.code-session-row{border-bottom:1px solid var(--border,#ffffff0f);cursor:pointer;border-left:2px solid #0000;grid-template-columns:minmax(140px,200px) 1fr auto;align-items:center;gap:16px;padding:13px 18px;text-decoration:none;transition:background .15s,border-left-color .15s;display:grid}.code-session-row:last-child{border-bottom:none}.code-session-row:hover{background:var(--surface-bg,#ffffff09)}.code-session-row.is-active{background:var(--bg-surface-raised,var(--surface-strong));border-left-color:var(--accent)}.code-session-row.is-active:hover{background:var(--bg-surface-hover,var(--surface-strong))}.code-row-meta{flex-direction:column;gap:4px;min-width:0;display:flex}.code-row-meta-top{align-items:center;gap:7px;display:flex}.code-active-badge{text-transform:none;letter-spacing:.02em;color:var(--text-secondary,#cbd5e1);background:var(--bg-surface-soft,#ffffff0f);border:1px solid var(--border-default,#ffffff1f);border-radius:var(--radius-xs,4px);align-items:center;gap:5px;padding:2px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.65rem;font-weight:500;line-height:1;display:inline-flex}.code-active-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 6px var(--accent-glow,#10b98166);border-radius:50%;flex-shrink:0;display:inline-block}.code-session-id{color:var(--text-muted,#a1a1aa);letter-spacing:-.01em;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:500}.code-row-meta-sub{color:var(--text-muted,#71717a);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:.74rem;display:flex;overflow:hidden}.code-branch-tag{color:var(--status-success-fg);align-items:center;gap:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;font-weight:500;display:inline-flex}.code-folder-name{color:var(--text-muted,#a1a1aa);text-overflow:ellipsis;overflow:hidden}.code-row-content{flex-direction:column;gap:3px;min-width:0;display:flex}.code-session-title{color:var(--text-main,#fff);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:.92rem;font-weight:500;overflow:hidden}.code-session-snippet{color:var(--text-muted,#71717a);white-space:nowrap;text-overflow:ellipsis;font-family:inherit;font-size:.78rem;overflow:hidden}.code-session-prompt-symbol{color:var(--text-muted,#71717a);opacity:.75;margin-right:5px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-weight:600}.code-row-actions{flex-shrink:0;align-items:center;gap:12px;display:flex}.code-metric-turns{color:var(--text-muted,#71717a);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem}.code-metric-time{color:var(--text-muted,#71717a);white-space:nowrap;text-align:right;min-width:65px;font-size:.76rem}.code-resume-chip{background:color-mix(in srgb, var(--bg-surface,#202632) 80%, transparent);border:1px solid var(--border-default,#ffffff1f);border-radius:var(--radius-xs,6px);color:var(--text-secondary,#cbd5e1);cursor:pointer;align-items:center;gap:5px;padding:3px 9px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;font-weight:500;transition:all .15s;display:inline-flex}.code-resume-chip:hover{background:var(--bg-surface-hover);border-color:var(--border-strong);color:var(--text-primary);transform:translateY(-.5px)}.code-icon-btn{color:var(--text-muted,#94a3b8);border-radius:var(--radius-xs,6px);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;transition:all .15s;display:inline-flex}.code-icon-btn:hover{color:var(--text-primary);background:var(--bg-surface-hover)}.code-icon-btn.destructive:hover{color:var(--hover-delete);background:var(--hover-delete-bg)}.code-open-arrow{color:var(--text-muted,#94a3b8);align-items:center;transition:transform .15s,color .15s;display:inline-flex}.code-session-row:hover .code-open-arrow{color:var(--text-primary);transform:translate(2px)}.code-empty-terminal{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-md,12px);background:var(--panel-soft,#121214);max-width:520px;margin:32px auto;overflow:hidden}.code-terminal-header{background:var(--bg-surface-subtle);border-bottom:1px solid var(--border,#ffffff0f);align-items:center;gap:6px;padding:10px 14px;display:flex}.code-terminal-dot{background:var(--border-strong);border-radius:50%;width:10px;height:10px}.code-terminal-title{color:var(--text-muted,#71717a);margin-left:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.74rem}.code-terminal-body{text-align:left;padding:24px}.code-terminal-text{color:var(--text-muted,#a1a1aa);margin-bottom:16px;font-size:.86rem;line-height:1.5}.code-terminal-codeblock{background:var(--bg-input);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);color:var(--interactive-fg);justify-content:space-between;align-items:center;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.84rem;display:flex}@media (width<=720px){.code-session-row{grid-template-columns:1fr;gap:10px;padding:14px}.code-row-actions{border-top:1px solid var(--border,#ffffff0a);justify-content:space-between;width:100%;padding-top:6px}}
@@ -1 +1 @@
1
- import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{dt as i,ft as a}from"./config-CvIO5hkn.js";import{n as o,t as s}from"./SelectField-DXBQtrUK.js";import{n as c,r as l,t as u}from"./workspaces-SYPrmbgC.js";import{D as d,E as f,T as p,w as m}from"./MintDashboard-COw_xol7.js";var h=t((()=>{}));function g(e){let t=a(e),n=Math.floor((new Date().getTime()-t.getTime())/1e3);return n<60?`Just now`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<604800?`${Math.floor(n/86400)}d ago`:t.toLocaleDateString([],{month:`short`,day:`numeric`})}function _(e){return!e||e<=0?`0 B`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function v(e){if(!e)return`Global`;let t=e.replace(/[/\\]+$/,``).split(/[/\\]/);return t[t.length-1]||e}var y,b,x;t((()=>{o(),y=e(n()),i(),u(),p(),f(),h(),b=r(),x=y.memo(function({chatSessions:e,activeConversationId:t,workspacePath:n,recentWorkspacePaths:r,onSelectSession:i,onDeleteSession:o,onRenameSession:u,onSelectFolder:f,onRefreshSessions:p,onShowToast:h}){let[x,S]=(0,y.useState)(``),[C,w]=(0,y.useState)(`workspace`),[T,E]=(0,y.useState)(`recent`),[D,O]=(0,y.useState)(null),[k,A]=(0,y.useState)(``),[j,M]=(0,y.useState)(()=>c(n));(0,y.useEffect)(()=>{M(c(n))},[n]);let N=j,P=v(N),F=(0,y.useMemo)(()=>l(r||[],j),[r,j]),I=(0,y.useRef)(p);(0,y.useEffect)(()=>{I.current=p},[p]),(0,y.useEffect)(()=>{I.current?.();let e=()=>{I.current?.()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let L=(0,y.useMemo)(()=>e.filter(e=>e.kind===`cli`||e.id.startsWith(`cli`)),[e]),R=L.filter(e=>N&&c(e.workspacePath)===N).length,z=L.length-R,B=C===`workspace`&&!x.trim()&&R===0&&z>0,V=(0,y.useMemo)(()=>L.filter(e=>{if(C===`workspace`&&(!N||c(e.workspacePath)!==N))return!1;if(!x.trim())return!0;let t=x.toLowerCase();return e.title.toLowerCase().includes(t)||e.id.toLowerCase().includes(t)||e.workspacePath&&e.workspacePath.toLowerCase().includes(t)||e.gitBranch&&e.gitBranch.toLowerCase().includes(t)||e.mainLanguage&&e.mainLanguage.toLowerCase().includes(t)}).sort((e,t)=>{if(T===`messages`)return(t.messageCount||0)-(e.messageCount||0);let n=a(e.updatedAt||e.createdAt).getTime(),r=a(t.updatedAt||t.createdAt).getTime();return T===`oldest`?n-r:r-n}),[L,C,N,x,T]),H=(e,t)=>{e.stopPropagation();let n=`mint --resume ${t}`;navigator?.clipboard?.writeText?(navigator.clipboard.writeText(n),h?.(`Copied: ${n}`)):h?.(`Resume command: ${n}`)},U=(e,t)=>{e.stopPropagation(),O(t.id),A(t.title)},W=e=>{if(e&&e.preventDefault(),!D)return;let t=k.trim();t&&(u(D,t),h?.(`Session renamed`)),O(null)},G=(e,t)=>{e.stopPropagation(),o(t.id)};return(0,b.jsxs)(`div`,{className:`code-sessions-container`,children:[(0,b.jsxs)(`div`,{className:`code-sessions-header`,children:[(0,b.jsxs)(`div`,{className:`code-header-main`,children:[(0,b.jsxs)(`div`,{className:`code-header-title-row`,children:[(0,b.jsxs)(`h1`,{className:`code-header-title`,children:[(0,b.jsxs)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{color:`var(--interactive-fg)`},children:[(0,b.jsx)(`polyline`,{points:`4 17 10 11 4 5`}),(0,b.jsx)(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})]}),(0,b.jsx)(`span`,{children:`Code sessions`})]}),(0,b.jsxs)(`span`,{className:`code-header-count`,children:[V.length,` `,V.length===1?`session`:`sessions`]})]}),(0,b.jsx)(`p`,{className:`code-header-subtitle`,children:C===`workspace`?N?(0,b.jsxs)(b.Fragment,{children:[`CLI sessions in `,(0,b.jsx)(`strong`,{title:N,children:P}),`.`]}):`Select a project above to view its CLI sessions.`:`CLI sessions across all repositories.`})]}),(0,b.jsxs)(`div`,{className:`code-header-controls`,children:[(0,b.jsx)(m,{currentPath:N,recentPaths:F,placement:`below`,onSelectWorkspace:async e=>{try{let t=e||await f?.();t&&(d.restore(t),M(c(t)),w(`workspace`))}catch(e){h?.(`Could not open folder: ${e instanceof Error?e.message:String(e)}`)}}}),(0,b.jsxs)(`div`,{className:`code-segmented-toggle`,children:[(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`workspace`?`active`:``}`,onClick:()=>w(`workspace`),title:`Show sessions from the selected project`,children:`Current Project`}),(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`all`?`active`:``}`,onClick:()=>w(`all`),title:`Show all sessions across all repositories`,children:`All Repositories`})]}),(0,b.jsxs)(s,{fullWidth:!1,"aria-label":`Sort sessions`,className:`code-sort-select`,value:T,onValueChange:e=>E(e),title:`Sort sessions`,children:[(0,b.jsx)(`option`,{value:`recent`,children:`Recently active`}),(0,b.jsx)(`option`,{value:`messages`,children:`Most turns`}),(0,b.jsx)(`option`,{value:`oldest`,children:`Oldest first`})]}),p&&(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:p,title:`Refresh sessions list`,style:{width:`32px`,height:`32px`},children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]}),(0,b.jsx)(`div`,{className:`code-controls-bar`,children:(0,b.jsxs)(`div`,{className:`code-search-box`,children:[(0,b.jsxs)(`svg`,{className:`code-search-icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,b.jsx)(`input`,{type:`text`,className:`code-search-input`,placeholder:`Filter sessions by branch, prompt, repository...`,value:x,onChange:e=>S(e.target.value)})]})}),V.length===0?(0,b.jsxs)(`div`,{className:`code-empty-terminal`,children:[(0,b.jsxs)(`div`,{className:`code-terminal-header`,children:[(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-title`,children:`mint-cli ~ interactive sessions`})]}),(0,b.jsxs)(`div`,{className:`code-terminal-body`,children:[(0,b.jsx)(`p`,{className:`code-terminal-text`,children:x.trim()?`No terminal sessions match your query.`:C===`workspace`?N?`No CLI sessions found in ${P}.${z>0?` ${z} CLI ${z===1?`session`:`sessions`} outside this project.`:` Run Mint in this project directory to begin:`}`:`Select a project above, or switch to "All Repositories" to view your CLI sessions.`:`No terminal sessions recorded yet. Launch Mint in any repository to begin:`}),B&&(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn active code-show-all-btn`,onClick:()=>{S(``),w(`all`)},children:`Show all sessions`}),(0,b.jsxs)(`div`,{className:`code-terminal-codeblock`,children:[(0,b.jsx)(`span`,{children:`$ mint`}),(0,b.jsx)(`button`,{type:`button`,className:`code-resume-chip`,onClick:()=>{navigator?.clipboard?.writeText(`mint`),h?.(`Copied: mint`)},children:`Copy`})]})]})]}):(0,b.jsx)(`div`,{className:`code-sessions-list`,children:V.map(e=>{let n=e.id===t,r=v(e.workspacePath),a=D===e.id,o=e.id.replace(/^cli::/,``),s=o===`cli`?`cli`:`cli::${o.slice(0,7)}`;return(0,b.jsxs)(`div`,{className:`code-session-row ${n?`is-active`:``}`,onClick:()=>i(e.id),children:[(0,b.jsxs)(`div`,{className:`code-row-meta`,children:[(0,b.jsxs)(`div`,{className:`code-row-meta-top`,children:[(0,b.jsx)(`span`,{className:`code-session-id`,title:e.id,children:s}),n&&(0,b.jsx)(`span`,{className:`code-active-badge`,children:`active`})]}),(0,b.jsxs)(`div`,{className:`code-row-meta-sub`,children:[e.gitBranch&&(0,b.jsxs)(`span`,{className:`code-branch-tag`,title:`Branch: ${e.gitBranch}`,children:[(0,b.jsxs)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`6`,y1:`3`,x2:`6`,y2:`15`}),(0,b.jsx)(`circle`,{cx:`18`,cy:`6`,r:`3`}),(0,b.jsx)(`circle`,{cx:`6`,cy:`18`,r:`3`}),(0,b.jsx)(`path`,{d:`M18 9a9 9 0 0 1-9 9`})]}),(0,b.jsx)(`span`,{children:e.gitBranch})]}),(0,b.jsx)(`span`,{className:`code-folder-name`,title:e.workspacePath||`Global`,children:r}),e.mainLanguage&&(0,b.jsxs)(`span`,{style:{opacity:.6,fontSize:`0.7rem`},children:[`· `,e.mainLanguage]})]})]}),(0,b.jsx)(`div`,{className:`code-row-content`,children:a?(0,b.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{display:`flex`,gap:`6px`},children:[(0,b.jsx)(`input`,{type:`text`,autoFocus:!0,value:k,onChange:e=>A(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W(),e.key===`Escape`&&O(null)},style:{flex:1,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,color:`var(--text-primary)`,padding:`4px 8px`,fontSize:`0.88rem`,outline:`none`}}),(0,b.jsx)(`button`,{type:`button`,onClick:W,style:{background:`var(--bg-surface-hover)`,color:`var(--text-primary)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,padding:`4px 10px`,fontSize:`0.78rem`,cursor:`pointer`},children:`Save`})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{className:`code-session-title`,title:e.title,children:e.title||`Untitled Session`}),(0,b.jsxs)(`div`,{className:`code-session-snippet`,children:[(0,b.jsx)(`span`,{style:{color:`var(--interactive-fg)`,opacity:.8,marginRight:`4px`},children:`>`}),(0,b.jsx)(`span`,{children:e.title||`Interactive shell`})]})]})}),(0,b.jsxs)(`div`,{className:`code-row-actions`,children:[(0,b.jsxs)(`span`,{className:`code-metric-turns`,children:[e.messageCount??0,`t · `,_(e.totalBytes)]}),(0,b.jsx)(`span`,{className:`code-metric-time`,children:g(e.updatedAt||e.createdAt)}),(0,b.jsxs)(`button`,{type:`button`,className:`code-resume-chip`,onClick:t=>H(t,e.id),title:`Copy command: mint --resume ${e.id}`,children:[(0,b.jsx)(`span`,{children:`$`}),(0,b.jsx)(`span`,{children:`resume`})]}),(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:t=>U(t,e),title:`Rename session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`}),(0,b.jsx)(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`})]})}),(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn destructive`,onClick:t=>G(t,e),title:`Delete session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,b.jsx)(`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`})]})}),(0,b.jsx)(`span`,{className:`code-open-arrow`,children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})})]})]},e.id)})})]})})}))();export{x as CliSessionsView,x as default};
1
+ import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{ft as i,pt as a}from"./config-CkRCdkxn.js";import{n as o,t as s}from"./SelectField-Cy6CghrU.js";import{n as c,r as l,t as u}from"./workspaces-SYPrmbgC.js";import{_ as d,g as f,h as p,v as m}from"./MintDashboard-C_UYPoNV.js";var h=t((()=>{}));function g(e){let t=a(e),n=Math.floor((new Date().getTime()-t.getTime())/1e3);return n<60?`Just now`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<604800?`${Math.floor(n/86400)}d ago`:t.toLocaleDateString([],{month:`short`,day:`numeric`})}function _(e){return!e||e<=0?`0 B`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}function v(e){if(!e)return`Global`;let t=e.replace(/[/\\]+$/,``).split(/[/\\]/);return t[t.length-1]||e}var y,b,x;t((()=>{o(),y=e(n()),i(),u(),f(),d(),h(),b=r(),x=y.memo(function({chatSessions:e,activeConversationId:t,workspacePath:n,recentWorkspacePaths:r,onSelectSession:i,onDeleteSession:o,onRenameSession:u,onSelectFolder:d,onRefreshSessions:f,onShowToast:h}){let[x,S]=(0,y.useState)(``),[C,w]=(0,y.useState)(`workspace`),[T,E]=(0,y.useState)(`recent`),[D,O]=(0,y.useState)(null),[k,A]=(0,y.useState)(``),[j,M]=(0,y.useState)(()=>c(n));(0,y.useEffect)(()=>{M(c(n))},[n]);let N=j,P=v(N),F=(0,y.useMemo)(()=>l(r||[],j),[r,j]),I=(0,y.useRef)(f);(0,y.useEffect)(()=>{I.current=f},[f]),(0,y.useEffect)(()=>{I.current?.();let e=()=>{I.current?.()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let L=(0,y.useMemo)(()=>e.filter(e=>e.kind===`cli`||e.id.startsWith(`cli`)),[e]),R=L.filter(e=>N&&c(e.workspacePath)===N).length,z=L.length-R,B=C===`workspace`&&!x.trim()&&R===0&&z>0,V=(0,y.useMemo)(()=>L.filter(e=>{if(C===`workspace`&&(!N||c(e.workspacePath)!==N))return!1;if(!x.trim())return!0;let t=x.toLowerCase();return e.title.toLowerCase().includes(t)||e.id.toLowerCase().includes(t)||e.workspacePath&&e.workspacePath.toLowerCase().includes(t)||e.gitBranch&&e.gitBranch.toLowerCase().includes(t)||e.mainLanguage&&e.mainLanguage.toLowerCase().includes(t)}).sort((e,t)=>{if(T===`messages`)return(t.messageCount||0)-(e.messageCount||0);let n=a(e.updatedAt||e.createdAt).getTime(),r=a(t.updatedAt||t.createdAt).getTime();return T===`oldest`?n-r:r-n}),[L,C,N,x,T]),H=(e,t)=>{e.stopPropagation();let n=`mint --resume ${t}`;navigator?.clipboard?.writeText?(navigator.clipboard.writeText(n),h?.(`Copied: ${n}`)):h?.(`Resume command: ${n}`)},U=(e,t)=>{e.stopPropagation(),O(t.id),A(t.title)},W=e=>{if(e&&e.preventDefault(),!D)return;let t=k.trim();t&&(u(D,t),h?.(`Session renamed`)),O(null)},G=(e,t)=>{e.stopPropagation(),o(t.id)};return(0,b.jsxs)(`div`,{className:`code-sessions-container`,children:[(0,b.jsxs)(`div`,{className:`code-sessions-header`,children:[(0,b.jsxs)(`div`,{className:`code-header-main`,children:[(0,b.jsxs)(`div`,{className:`code-header-title-row`,children:[(0,b.jsxs)(`h1`,{className:`code-header-title`,children:[(0,b.jsxs)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{color:`var(--interactive-fg)`},children:[(0,b.jsx)(`polyline`,{points:`4 17 10 11 4 5`}),(0,b.jsx)(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})]}),(0,b.jsx)(`span`,{children:`Code sessions`})]}),(0,b.jsxs)(`span`,{className:`code-header-count`,children:[V.length,` `,V.length===1?`session`:`sessions`]})]}),(0,b.jsx)(`p`,{className:`code-header-subtitle`,children:C===`workspace`?N?(0,b.jsxs)(b.Fragment,{children:[`CLI sessions in `,(0,b.jsx)(`strong`,{title:N,children:P}),`.`]}):`Select a project above to view its CLI sessions.`:`CLI sessions across all repositories.`})]}),(0,b.jsxs)(`div`,{className:`code-header-controls`,children:[(0,b.jsx)(p,{currentPath:N,recentPaths:F,placement:`below`,onSelectWorkspace:async e=>{try{let t=e||await d?.();t&&(m.restore(t),M(c(t)),w(`workspace`))}catch(e){h?.(`Could not open folder: ${e instanceof Error?e.message:String(e)}`)}}}),(0,b.jsxs)(`div`,{className:`code-segmented-toggle`,children:[(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`workspace`?`active`:``}`,onClick:()=>w(`workspace`),title:`Show sessions from the selected project`,children:`Current Project`}),(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${C===`all`?`active`:``}`,onClick:()=>w(`all`),title:`Show all sessions across all repositories`,children:`All Repositories`})]}),(0,b.jsxs)(s,{fullWidth:!1,"aria-label":`Sort sessions`,className:`code-sort-select`,value:T,onValueChange:e=>E(e),title:`Sort sessions`,children:[(0,b.jsx)(`option`,{value:`recent`,children:`Recently active`}),(0,b.jsx)(`option`,{value:`messages`,children:`Most turns`}),(0,b.jsx)(`option`,{value:`oldest`,children:`Oldest first`})]}),f&&(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:f,title:`Refresh sessions list`,style:{width:`32px`,height:`32px`},children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]}),(0,b.jsx)(`div`,{className:`code-controls-bar`,children:(0,b.jsxs)(`div`,{className:`code-search-box`,children:[(0,b.jsxs)(`svg`,{className:`code-search-icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,b.jsx)(`input`,{type:`text`,className:`code-search-input`,placeholder:`Filter sessions by branch, prompt, repository...`,value:x,onChange:e=>S(e.target.value)})]})}),V.length===0?(0,b.jsxs)(`div`,{className:`code-empty-terminal`,children:[(0,b.jsxs)(`div`,{className:`code-terminal-header`,children:[(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-dot`}),(0,b.jsx)(`span`,{className:`code-terminal-title`,children:`mint-cli ~ interactive sessions`})]}),(0,b.jsxs)(`div`,{className:`code-terminal-body`,children:[(0,b.jsx)(`p`,{className:`code-terminal-text`,children:x.trim()?`No terminal sessions match your query.`:C===`workspace`?N?`No CLI sessions found in ${P}.${z>0?` ${z} CLI ${z===1?`session`:`sessions`} outside this project.`:` Run Mint in this project directory to begin:`}`:`Select a project above, or switch to "All Repositories" to view your CLI sessions.`:`No terminal sessions recorded yet. Launch Mint in any repository to begin:`}),B&&(0,b.jsx)(`button`,{type:`button`,className:`code-segmented-btn active code-show-all-btn`,onClick:()=>{S(``),w(`all`)},children:`Show all sessions`}),(0,b.jsxs)(`div`,{className:`code-terminal-codeblock`,children:[(0,b.jsx)(`span`,{children:`$ mint`}),(0,b.jsx)(`button`,{type:`button`,className:`code-resume-chip`,onClick:()=>{navigator?.clipboard?.writeText(`mint`),h?.(`Copied: mint`)},children:`Copy`})]})]})]}):(0,b.jsx)(`div`,{className:`code-sessions-list`,children:V.map(e=>{let n=e.id===t,r=v(e.workspacePath),a=D===e.id,o=e.id.replace(/^cli::/,``),s=o===`cli`?`cli`:`cli::${o.slice(0,7)}`;return(0,b.jsxs)(`div`,{className:`code-session-row ${n?`is-active`:``}`,onClick:()=>i(e.id),children:[(0,b.jsxs)(`div`,{className:`code-row-meta`,children:[(0,b.jsxs)(`div`,{className:`code-row-meta-top`,children:[(0,b.jsx)(`span`,{className:`code-session-id`,title:e.id,children:s}),n&&(0,b.jsxs)(`span`,{className:`code-active-badge`,children:[(0,b.jsx)(`span`,{className:`code-active-dot`,"aria-hidden":`true`}),(0,b.jsx)(`span`,{children:`active`})]})]}),(0,b.jsxs)(`div`,{className:`code-row-meta-sub`,children:[e.gitBranch&&(0,b.jsxs)(`span`,{className:`code-branch-tag`,title:`Branch: ${e.gitBranch}`,children:[(0,b.jsxs)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`6`,y1:`3`,x2:`6`,y2:`15`}),(0,b.jsx)(`circle`,{cx:`18`,cy:`6`,r:`3`}),(0,b.jsx)(`circle`,{cx:`6`,cy:`18`,r:`3`}),(0,b.jsx)(`path`,{d:`M18 9a9 9 0 0 1-9 9`})]}),(0,b.jsx)(`span`,{children:e.gitBranch})]}),(0,b.jsx)(`span`,{className:`code-folder-name`,title:e.workspacePath||`Global`,children:r}),e.mainLanguage&&(0,b.jsxs)(`span`,{style:{opacity:.6,fontSize:`0.7rem`},children:[`· `,e.mainLanguage]})]})]}),(0,b.jsx)(`div`,{className:`code-row-content`,children:a?(0,b.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{display:`flex`,gap:`6px`},children:[(0,b.jsx)(`input`,{type:`text`,autoFocus:!0,value:k,onChange:e=>A(e.target.value),onKeyDown:e=>{e.key===`Enter`&&W(),e.key===`Escape`&&O(null)},style:{flex:1,background:`var(--bg-input)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,color:`var(--text-primary)`,padding:`4px 8px`,fontSize:`0.88rem`,outline:`none`}}),(0,b.jsx)(`button`,{type:`button`,onClick:W,style:{background:`var(--bg-surface-hover)`,color:`var(--text-primary)`,border:`1px solid var(--border-default)`,borderRadius:`var(--radius-xs, 6px)`,padding:`4px 10px`,fontSize:`0.78rem`,cursor:`pointer`},children:`Save`})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{className:`code-session-title`,title:e.title,children:e.title||`Untitled Session`}),(0,b.jsxs)(`div`,{className:`code-session-snippet`,children:[(0,b.jsx)(`span`,{className:`code-session-prompt-symbol`,children:`>`}),(0,b.jsx)(`span`,{children:e.title||`Interactive shell`})]})]})}),(0,b.jsxs)(`div`,{className:`code-row-actions`,children:[(0,b.jsxs)(`span`,{className:`code-metric-turns`,children:[e.messageCount??0,`t · `,_(e.totalBytes)]}),(0,b.jsx)(`span`,{className:`code-metric-time`,children:g(e.updatedAt||e.createdAt)}),(0,b.jsxs)(`button`,{type:`button`,className:`code-resume-chip`,onClick:t=>H(t,e.id),title:`Copy command: mint --resume ${e.id}`,children:[(0,b.jsx)(`span`,{children:`$`}),(0,b.jsx)(`span`,{children:`resume`})]}),(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:t=>U(t,e),title:`Rename session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`}),(0,b.jsx)(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`})]})}),(0,b.jsx)(`button`,{type:`button`,className:`code-icon-btn destructive`,onClick:t=>G(t,e),title:`Delete session`,children:(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,b.jsx)(`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`})]})}),(0,b.jsx)(`span`,{className:`code-open-arrow`,children:(0,b.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})})]})]},e.id)})})]})})}))();export{x as CliSessionsView,x as default};
@@ -0,0 +1 @@
1
+ .review-tabs{flex-wrap:wrap;gap:6px;padding:8px 16px;display:flex}.review-tabs button,.review-undo-button,.review-undo-actions button{border:1px solid var(--border,#34343a);border-radius:var(--radius-sm,8px);background:var(--bg-surface,#141518);color:var(--text-main,#f1f5f9);cursor:pointer;font:inherit;padding:6px 10px;font-size:.78rem}.review-tabs button[aria-selected=true]{color:var(--accent,#818cf8);border-color:var(--accent,#818cf8)}.review-tabs button:focus-visible,.review-undo-button:focus-visible,.review-undo-actions button:focus-visible{outline:2px solid var(--accent,#818cf8);outline-offset:2px}.review-undo-button:disabled,.review-undo-actions button:disabled{opacity:.5;cursor:not-allowed}.review-changes-panel{flex-direction:column;flex:1;min-height:0;display:flex}.review-history-panel{color:var(--text-main,#f1f5f9);padding:16px;font-size:.82rem;overflow:auto}.review-history-picker{flex-direction:column;gap:8px;display:flex}.review-history-picker select{border:1px solid var(--border,#34343a);border-radius:var(--radius-sm,8px);width:100%;min-width:0;color:var(--text-main,#f1f5f9);background:var(--bg-surface,#141518);padding:8px}.review-history-details{grid-template-columns:auto minmax(0,1fr);gap:10px 14px;display:grid}.review-history-details dt{color:var(--text-muted,#94a3b8)}.review-history-details dd{overflow-wrap:anywhere;margin:0}.review-feedback{overflow-wrap:anywhere;color:var(--text-main,#f1f5f9);margin:4px 16px;font-size:.8rem}.review-undo-dialog{border:1px solid var(--border,#34343a);border-radius:var(--radius-2xl,22px);background:var(--bg-surface,#141518);width:min(480px,100vw - 40px);max-height:calc(100vh - 40px);color:var(--text-main,#f1f5f9);padding:20px;font-size:.85rem;overflow:auto}.review-undo-dialog::backdrop{background:#00000080}.review-undo-dialog h3{margin-top:0}.review-undo-actions{justify-content:flex-end;gap:8px;display:flex}.code-review-file-bar{flex-wrap:wrap}.code-review-page{background:var(--bg-surface,#141518);will-change:transform, opacity;flex-direction:column;flex:auto;min-height:0;animation:.28s cubic-bezier(.16,1,.3,1) forwards codeReviewEntrance;display:flex;overflow:hidden}@keyframes codeReviewEntrance{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.code-review-top-bar{flex:none;justify-content:space-between;align-items:center;padding:10px 16px 4px;display:flex}.code-review-branch-group{align-items:center;gap:8px;display:flex}.code-review-branch-btn{color:var(--text-main,#f1f5f9);cursor:pointer;border-radius:var(--radius-2xs,4px);background:0 0;border:0;align-items:center;gap:4px;padding:2px 4px;font-size:.88rem;font-weight:600;transition:background .15s;display:inline-flex}.code-review-branch-btn:hover{background:var(--bg-surface-hover)}.code-review-chevron-small{color:var(--text-muted,#94a3b8);font-size:.8rem}.code-review-branch-stat-add{color:var(--status-success,#22c55e);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-branch-stat-del{color:var(--status-error,#ef4444);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-top-actions{align-items:center;gap:4px;display:flex}.code-review-icon-btn,.code-review-close-btn{border-radius:var(--radius-xs,6px);width:28px;height:28px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;transition:all .15s;display:inline-flex}.code-review-icon-btn:hover,.code-review-close-btn:hover{color:var(--text-main,#f1f5f9);background:var(--bg-surface-hover)}.code-review-close-btn{margin-left:2px;font-size:1.15rem;line-height:1}.code-review-target-branch{align-items:center;padding:0 16px 8px;display:flex}.code-review-target-branch-btn{color:var(--text-muted,#94a3b8);cursor:pointer;border-radius:var(--radius-2xs,4px);background:0 0;border:0;align-items:center;gap:4px;padding:2px 4px;font-size:.78rem;transition:color .15s,background .15s;display:inline-flex}.code-review-target-branch-btn:hover{color:var(--text-main,#f1f5f9);background:var(--bg-surface-soft)}.code-review-banner{border-radius:var(--radius-md,10px);background:var(--bg-surface-soft);border:1px solid var(--border-subtle);justify-content:space-between;align-items:center;gap:12px;margin:4px 16px 10px;padding:8px 14px;animation:.25s cubic-bezier(.16,1,.3,1) forwards codeReviewBannerIn;display:flex}@keyframes codeReviewBannerIn{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.code-review-banner-left{color:var(--text-secondary,#cbd5e1);align-items:center;gap:8px;font-size:.78rem;font-weight:500;display:flex}.code-review-banner-info-icon{color:var(--interactive-fg);flex-shrink:0}.code-review-pagination{align-items:center;gap:6px;display:flex}.code-review-page-arrow{background:var(--bg-surface-soft);border:1px solid var(--border-subtle);border-radius:var(--radius-xs,6px);width:24px;height:24px;color:var(--text-muted,#94a3b8);cursor:pointer;justify-content:center;align-items:center;font-size:.95rem;line-height:1;transition:all .15s;display:inline-flex}.code-review-page-arrow:hover:not(:disabled){background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-page-arrow:disabled{opacity:.3;cursor:not-allowed}.code-review-split{border-top:1px solid var(--border-subtle);flex-direction:row;flex:auto;min-height:0;display:flex;position:relative;overflow:hidden}.code-review-split.is-resizing{-webkit-user-select:none;user-select:none;cursor:col-resize}.code-review-split.is-resizing *{pointer-events:none;-webkit-user-select:none!important;user-select:none!important}.code-review-split.is-resizing .code-review-resizer{pointer-events:auto}.code-review-diff-pane{flex-direction:column;flex:1 1 0;min-width:0;display:flex;overflow:auto}.code-review-resizer{z-index:10;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;outline:none;flex:0 0 10px;justify-content:center;align-items:center;margin:0 -5px;transition:background-color .15s;display:flex;position:relative}.code-review-resizer-line{background:var(--border-subtle);width:1px;transition:background-color .15s,box-shadow .15s,width .15s;position:absolute;top:0;bottom:0;left:4px}.code-review-resizer:hover .code-review-resizer-line,.code-review-resizer.is-dragging .code-review-resizer-line{background:var(--accent);box-shadow:0 0 8px var(--accent-glow);width:2px}.code-review-resizer-handle{border-radius:var(--radius-2xs,4px);background:var(--border-strong);z-index:2;width:4px;height:26px;transition:all .15s}.code-review-resizer:hover .code-review-resizer-handle,.code-review-resizer.is-dragging .code-review-resizer-handle{background:var(--accent-hover);height:38px;box-shadow:0 0 6px var(--accent-glow)}.code-review-resizer.is-collapsed{cursor:pointer;flex:0 0 8px;margin:0}.code-review-resizer.is-collapsed .code-review-resizer-line{background:var(--border-default);left:3px}.code-review-file-view{flex-direction:column;flex:1;animation:.2s cubic-bezier(.16,1,.3,1) forwards codeReviewDiffSwap;display:flex}@keyframes codeReviewDiffSwap{0%{opacity:.4;transform:translate(-4px)}to{opacity:1;transform:translate(0)}}.code-review-file-bar{background:var(--bg-surface-soft);border-bottom:1px solid var(--border-subtle);z-index:2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);align-items:center;gap:8px;padding:8px 16px;font-size:.78rem;display:flex;position:sticky;top:0}[data-surface=opaque] .code-review-file-bar{background:var(--bg-surface,#141518);-webkit-backdrop-filter:none}.code-review-file-bar-status{border-radius:var(--radius-2xs,4px);padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:700;line-height:1.2}.code-review-file-bar-status.is-modified{color:var(--status-info-fg);background:var(--status-info-bg)}.code-review-file-bar-status.is-created{color:var(--status-success-fg);background:var(--status-success-bg)}.code-review-file-bar-path{color:var(--text-main,#f1f5f9);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.code-review-file-bar-path[draggable=true]{cursor:grab;-webkit-user-select:none;user-select:none;transition:color .15s}.code-review-file-bar-path[draggable=true]:hover{color:var(--accent,#38bdf8)}.code-review-file-bar-path[draggable=true]:active{cursor:grabbing}.code-review-file-bar-stat-add{color:var(--status-success,#22c55e);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-file-bar-stat-del{color:var(--status-error,#ef4444);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-code-container{min-width:0;padding:6px 0 20px;font-family:Fira Code,Cascadia Code,Consolas,monospace;font-size:.78rem;line-height:1.55;overflow:auto visible}.code-review-hunk-block{margin-bottom:8px}.code-review-line{align-items:stretch;width:max-content;min-width:100%;min-height:22px;padding:0 4px;transition:background-color .12s;display:flex}.code-review-line.is-add{background:color-mix(in srgb, var(--status-success,#2ea043) 20%, #0d1117);border-left:2px solid var(--diff-add-border,#10b981)}.code-review-line.is-del{background:color-mix(in srgb, var(--status-error,#f85149) 20%, #0d1117);border-left:2px solid var(--diff-del-border,#ef4444)}:root[data-theme=light] .code-review-line.is-add,.theme-light .code-review-line.is-add{background:color-mix(in srgb, var(--status-success,#22c55e) 14%, #fff)}:root[data-theme=light] .code-review-line.is-del,.theme-light .code-review-line.is-del{background:color-mix(in srgb, var(--status-error,#ef4444) 14%, #fff)}.code-review-gutter{text-align:right;width:38px;color:var(--text-muted,#64748b);-webkit-user-select:none;user-select:none;opacity:.7;flex-shrink:0;padding-right:12px}.code-review-line.is-add .code-review-gutter{color:var(--diff-add-gutter,#34d399)}.code-review-line.is-del .code-review-gutter{color:var(--diff-del-gutter,#f87171)}.code-review-sign{text-align:center;width:14px;color:var(--text-muted,#64748b);-webkit-user-select:none;user-select:none;flex-shrink:0;font-weight:600}.code-review-line.is-add .code-review-sign{color:var(--diff-add-border,#10b981)}.code-review-line.is-del .code-review-sign{color:var(--diff-del-border,#ef4444)}.code-review-code-text{color:var(--text-main,#e2e8f0);font:inherit;white-space:pre;word-break:normal;padding-left:4px;padding-right:16px}.code-review-empty-diff,.code-review-empty-state{color:var(--text-muted,#94a3b8);padding:24px;font-size:.8rem}.code-review-tree-pane{border-left:1px solid var(--border-subtle);background:var(--bg-surface-soft);flex-direction:column;flex:none;min-width:0;display:flex;overflow:hidden}[data-surface=opaque] .code-review-tree-pane{background:var(--bg-surface-raised,var(--bg-surface,#141518))}.code-review-tree-collapse-btn{border-radius:var(--radius-2xs,4px);width:22px;height:22px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;flex-shrink:0;justify-content:center;align-items:center;font-size:1rem;line-height:1;transition:all .15s;display:inline-flex}.code-review-tree-collapse-btn:hover{background:var(--bg-surface-hover);color:var(--text-main,#f1f5f9)}.code-review-icon-btn.is-active{color:var(--interactive-fg);background:var(--accent-subtle)}.code-review-search-wrap{border-bottom:1px solid var(--border-subtle);align-items:center;gap:8px;padding:10px 12px;display:flex}.code-review-search-icon{color:var(--text-muted,#94a3b8);flex-shrink:0}.code-review-search-input{background:var(--bg-input);border:1px solid var(--border-default);border-radius:var(--radius-sm,8px);width:100%;color:var(--text-main,#f1f5f9);outline:none;padding:5px 10px;font-size:.76rem;transition:border-color .15s,background .15s}.code-review-search-input:focus{border-color:var(--accent-border);background:var(--bg-surface-hover)}.code-review-tree-list{flex-direction:column;flex:1;gap:2px;padding:8px 6px;display:flex;overflow-y:auto}.code-review-tree-folder{flex-direction:column;display:flex}.code-review-tree-folder-btn{border-radius:var(--radius-xs,6px);width:100%;color:var(--text-secondary,#cbd5e1);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:6px;padding-top:5px;padding-bottom:5px;padding-right:8px;font-size:.78rem;font-weight:500;transition:background-color .12s;display:flex}.code-review-tree-folder-btn:hover{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-tree-folder-btn[draggable=true],.code-review-tree-file[draggable=true]{cursor:grab;-webkit-user-select:none;user-select:none}.code-review-tree-folder-btn[draggable=true]:active,.code-review-tree-file[draggable=true]:active{cursor:grabbing}.code-review-chevron{width:12px;color:var(--text-muted,#94a3b8);flex-shrink:0;font-size:.85rem}.code-review-folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.code-review-mod-dot{color:var(--status-warning);flex-shrink:0;margin-left:auto;font-size:1rem;line-height:1}.code-review-tree-sub{flex-direction:column;gap:2px;display:flex}.code-review-tree-file{border-radius:var(--radius-sm,8px);width:100%;color:var(--text-secondary,#cbd5e1);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;align-items:center;gap:6px;padding-top:6px;padding-bottom:6px;padding-right:8px;font-size:.76rem;transition:all .15s cubic-bezier(.16,1,.3,1);display:flex}.code-review-tree-file:hover{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-tree-file.is-selected{background:var(--accent-subtle);border-color:var(--accent-border);color:var(--text-primary);box-shadow:var(--shadow-sm)}.code-review-tree-icon{flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex;position:relative}.code-review-tree-icon.material-icon img{object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none;flex:none;width:16px;height:16px;display:block}.code-review-file-status-icon{border-radius:var(--radius-2xs,4px);flex-shrink:0;margin-left:auto;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.7rem;font-weight:700;line-height:1.2}.code-review-file-status-icon.is-modified{color:var(--status-info-fg);background:var(--status-info-bg)}.code-review-file-status-icon.is-created{color:var(--status-success-fg);background:var(--status-success-bg)}.code-review-tree-file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.code-review-branch-group .git-branch-selector{flex:none;min-width:0;max-width:none}.code-review-branch-group .git-branch-trigger{background:var(--bg-surface-soft);border:1px solid var(--border-default);border-radius:var(--radius-xs,6px);color:var(--text-main,#f1f5f9);cursor:pointer;align-items:center;gap:7px;max-width:260px;height:28px;min-height:28px;padding:4px 10px;font-size:.84rem;font-weight:500;transition:all .15s;display:inline-flex}.code-review-branch-group .git-branch-trigger:hover{background:var(--bg-surface-hover);border-color:var(--border-strong)}.code-review-branch-group .git-branch-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:180px;color:var(--text-main,#f1f5f9);font-size:.82rem;font-weight:600;line-height:1.2;overflow:hidden}.code-review-branch-group .git-branch-icon{color:var(--interactive-fg);flex-shrink:0}.code-review-branch-group .git-branch-dirty{background:var(--accent,#10b981);border-radius:50%;flex:0 0 6px;width:6px;height:6px}.code-review-branch-group .git-branch-chevron{color:var(--text-muted,#94a3b8);flex-shrink:0}.code-review-branch-group .git-branch-menu{z-index:200}.code-review-branch-static{color:var(--text-main,#f1f5f9);font-size:.85rem;font-weight:600}.code-review-spin{animation:1s linear infinite codeReviewSpin}@keyframes codeReviewSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.code-review-clean-state{text-align:center;color:var(--text-muted,#94a3b8);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:60px 24px;display:flex}.code-review-clean-state h3{color:var(--text-main,#f1f5f9);margin:14px 0 6px;font-size:1.05rem;font-weight:600}.code-review-clean-state p{margin:0 0 16px;font-size:.82rem}.code-review-clean-refresh-btn{background:var(--bg-surface-soft);border:1px solid var(--border-default);border-radius:var(--radius-sm,8px);color:var(--text-secondary,#cbd5e1);cursor:pointer;align-items:center;gap:6px;padding:6px 14px;font-size:.78rem;font-weight:500;transition:all .15s;display:inline-flex}.code-review-clean-refresh-btn:hover{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-scope-group{align-items:center;gap:4px;display:flex}.code-review-scope-btn{border-radius:var(--radius-xs,6px);background:var(--bg-surface-soft);border:1px solid var(--border-subtle);color:var(--text-muted,#94a3b8);cursor:pointer;padding:3px 8px;font-size:.74rem;transition:all .15s}.code-review-scope-btn:hover{color:var(--text-primary);background:var(--bg-surface-hover)}.code-review-scope-btn.is-active{background:var(--accent-subtle);border-color:var(--accent-border);color:var(--interactive-fg);font-weight:600}