@pheem49/mint 1.14.0 → 1.15.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 (585) hide show
  1. package/CLAUDE.md +1 -1
  2. package/Cargo.lock +291 -11
  3. package/Cargo.toml +1 -1
  4. package/README.md +71 -9
  5. package/ROADMAP.md +30 -0
  6. package/Release_Note.md +579 -465
  7. package/crates/mint-cli/Cargo.toml +3 -1
  8. package/crates/mint-cli/src/agent/approval_prompts.rs +16 -3
  9. package/crates/mint-cli/src/agent/live_status.rs +367 -118
  10. package/crates/mint-cli/src/agent/markdown_render.rs +601 -61
  11. package/crates/mint-cli/src/agent.rs +452 -215
  12. package/crates/mint-cli/src/commands/agent.rs +16 -21
  13. package/crates/mint-cli/src/commands/eval.rs +9 -5
  14. package/crates/mint-cli/src/commands/git.rs +204 -0
  15. package/crates/mint-cli/src/commands/integrations.rs +28 -0
  16. package/crates/mint-cli/src/commands/knowledge.rs +1 -0
  17. package/crates/mint-cli/src/commands/mod.rs +37 -2
  18. package/crates/mint-cli/src/commands/tailnet_web.rs +235 -0
  19. package/crates/mint-cli/src/image.rs +26 -3
  20. package/crates/mint-cli/src/interactive/chat_tui.rs +4742 -0
  21. package/crates/mint-cli/src/interactive/command_ui.rs +477 -0
  22. package/crates/mint-cli/src/interactive/format.rs +8 -0
  23. package/crates/mint-cli/src/interactive/input_box.rs +38 -2
  24. package/crates/mint-cli/src/interactive/picker.rs +180 -37
  25. package/crates/mint-cli/src/interactive/resume_picker.rs +686 -0
  26. package/crates/mint-cli/src/interactive/slash_commands.rs +868 -450
  27. package/crates/mint-cli/src/interactive/thought_viewer.rs +286 -0
  28. package/crates/mint-cli/src/interactive.rs +400 -136
  29. package/crates/mint-cli/src/main.rs +84 -23
  30. package/crates/mint-cli/src/markdown.rs +12 -5
  31. package/crates/mint-cli/src/onboard.rs +32 -30
  32. package/crates/mint-cli/src/plugins_cli.rs +8 -5
  33. package/crates/mint-cli/src/setup.rs +10 -8
  34. package/crates/mint-cli/src/terminal_theme.rs +187 -0
  35. package/crates/mint-cli/src/updater.rs +56 -21
  36. package/crates/mint-core/src/agent/agent_loop.rs +1 -0
  37. package/crates/mint-core/src/agent/chat.rs +843 -177
  38. package/crates/mint-core/src/agent/code_tools.rs +83 -2
  39. package/crates/mint-core/src/agent/memory.rs +658 -20
  40. package/crates/mint-core/src/agent/skills.rs +1 -1
  41. package/crates/mint-core/src/api_server/routes/chat.rs +31 -5
  42. package/crates/mint-core/src/api_server/routes/linked_folders.rs +118 -3
  43. package/crates/mint-core/src/api_server/routes/misc.rs +10 -14
  44. package/crates/mint-core/src/api_server/routes/sessions.rs +44 -0
  45. package/crates/mint-core/src/api_server.rs +22 -3
  46. package/crates/mint-core/src/avatar_bridge.rs +2 -0
  47. package/crates/mint-core/src/browser/cdp.rs +74 -83
  48. package/crates/mint-core/src/browser/evidence.rs +260 -0
  49. package/crates/mint-core/src/browser/input.rs +1 -1
  50. package/crates/mint-core/src/browser/interact.rs +98 -124
  51. package/crates/mint-core/src/browser/lifecycle.rs +75 -4
  52. package/crates/mint-core/src/browser/mod.rs +16 -2
  53. package/crates/mint-core/src/browser/navigate.rs +27 -19
  54. package/crates/mint-core/src/browser/observe.js +40 -0
  55. package/crates/mint-core/src/browser/session.rs +1558 -0
  56. package/crates/mint-core/src/git/branches.rs +348 -0
  57. package/crates/mint-core/src/git/checkpoint.rs +40 -0
  58. package/crates/mint-core/src/git/diff.rs +206 -0
  59. package/crates/mint-core/src/git/mod.rs +10 -2
  60. package/crates/mint-core/src/integrations/channels.rs +1 -0
  61. package/crates/mint-core/src/lib.rs +22 -14
  62. package/crates/mint-core/src/live_sync.rs +28 -9
  63. package/crates/mint-core/src/media/auto_shorts.rs +1 -0
  64. package/crates/mint-core/src/media/gemini_live.rs +12 -1
  65. package/crates/mint-core/src/media/mic_transcribe.rs +1 -0
  66. package/crates/mint-core/src/media/subtitle.rs +1 -0
  67. package/crates/mint-core/src/orchestration/context_render.rs +1 -0
  68. package/crates/mint-core/src/orchestration/memory_skill.rs +6 -1
  69. package/crates/mint-core/src/orchestration/mod.rs +1024 -271
  70. package/crates/mint-core/src/orchestration/tools/browser.rs +16 -139
  71. package/crates/mint-core/src/orchestration/tools/misc.rs +2 -1
  72. package/crates/mint-core/src/orchestration/tools/web.rs +1 -1
  73. package/crates/mint-core/src/prompts/agent.rs +58 -29
  74. package/crates/mint-core/src/prompts/chat.rs +1 -1
  75. package/crates/mint-core/src/prompts/persona.rs +1 -1
  76. package/crates/mint-core/src/prompts/tool_catalog.rs +93 -25
  77. package/crates/mint-core/src/search/linked_folders/index.rs +732 -0
  78. package/crates/mint-core/src/search/linked_folders.rs +391 -130
  79. package/crates/mint-core/src/slash/mod.rs +470 -22
  80. package/crates/mint-core/src/slash/model_fetcher.rs +12 -3
  81. package/crates/mint-core/src/slash/models.rs +66 -10
  82. package/crates/mint-core/src/system/config.rs +230 -0
  83. package/crates/mint-core/src/system/workspace.rs +228 -0
  84. package/crates/mint-core/src/system.rs +1 -0
  85. package/crates/mint-core/tests/memory_persistence.rs +39 -0
  86. package/mint-presentation-demo.mp4 +0 -0
  87. package/out/web/assets/CliSessionsView-BxUVWEEL.js +1 -0
  88. package/out/web/assets/CliSessionsView-CBDTXuQv.css +1 -0
  89. package/out/web/assets/CodeReviewPage-DkMgfcos.css +1 -0
  90. package/out/web/assets/CodeReviewPage-jKlmLJwT.js +3 -0
  91. package/out/web/assets/CommandPalette-DnwPA5hy.js +1 -0
  92. package/out/web/assets/ImageStudioPanel-BR1XFwhR.js +1 -0
  93. package/out/web/assets/ImageStudioPanel-D0lnhQV5.css +1 -0
  94. package/out/web/assets/LinkedFoldersView-bi-CWQ-I.js +1 -0
  95. package/out/web/assets/McpRegistryPicker-D5tEFnyq.js +1 -0
  96. package/out/web/assets/McpServersView-BGG1dhFM.js +1 -0
  97. package/out/web/assets/MintDashboard-BIglDEWX.js +20 -0
  98. package/out/web/assets/MintDashboard-DSMywSgs.css +1 -0
  99. package/out/web/assets/ModelPanel-CbJ1PFoZ.js +1 -0
  100. package/out/web/assets/PicturesLibrary-CQP0fLP1.css +1 -0
  101. package/out/web/assets/PicturesLibrary-DoYN7T1p.js +1 -0
  102. package/out/web/assets/PluginsView-CU1HWXGk.js +1 -0
  103. package/out/web/assets/ScheduledTasksView-Bnl36y2N.js +1 -0
  104. package/out/web/assets/SettingsWindow-DhWLAn9T.css +1 -0
  105. package/out/web/assets/SettingsWindow-Dw8L01pw.js +2 -0
  106. package/out/web/assets/SkillsView-cnl8aY5p.js +2 -0
  107. package/out/web/assets/ToolSurfacePage-CgsQw6l5.css +1 -0
  108. package/out/web/assets/ToolSurfacePage-Cz2VJAPZ.js +37 -0
  109. package/out/web/assets/VeoStudioPanel-D4JnERWR.js +4 -0
  110. package/out/web/assets/VeoStudioPanel-DOj7_WR3.css +1 -0
  111. package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +1 -0
  112. package/out/web/assets/{abnfDiagram-VCTEODGH-DAOBA7ZG.js → abnfDiagram-VCTEODGH-ByMyfanq.js} +1 -1
  113. package/out/web/assets/{architecture-7GRP2DOG-CgSwQOPQ.js → architecture-7GRP2DOG-CLq2kEOB.js} +1 -1
  114. package/out/web/assets/{architectureDiagram-5GKGNRK7-CYp3yupP.js → architectureDiagram-5GKGNRK7-6PoVSmNG.js} +1 -1
  115. package/out/web/assets/{blockDiagram-NRAW4CY4-CyWybDWr.js → blockDiagram-NRAW4CY4-cKw9mAKi.js} +1 -1
  116. package/out/web/assets/{c4Diagram-UCG6FXSJ-BvY3U709.js → c4Diagram-UCG6FXSJ-Cqy8N5Ge.js} +1 -1
  117. package/out/web/assets/{chunk-75Z2AOVW-TLXCoZYv.js → chunk-75Z2AOVW-3qybijF5.js} +1 -1
  118. package/out/web/assets/chunk-CKBBP62Z-cIrXq6jN.js +2 -0
  119. package/out/web/assets/{chunk-CLGD4ZFX-xjsKtNS7.js → chunk-CLGD4ZFX-CndDQkww.js} +1 -1
  120. package/out/web/assets/chunk-DSNCTWBM-Cc4NxvgD.js +2 -0
  121. package/out/web/assets/chunk-DU6HZSFF-drzh6GsU.js +128 -0
  122. package/out/web/assets/{chunk-F27PBJKO-BFpgF55A.js → chunk-F27PBJKO-FiY35l4v.js} +1 -1
  123. package/out/web/assets/{chunk-G27WJ6UU-DfF7qW-C.js → chunk-G27WJ6UU-Bjt9Il4A.js} +1 -1
  124. package/out/web/assets/{chunk-GMAD6QVW-C-558kh_.js → chunk-GMAD6QVW-Bppi3Ctd.js} +1 -1
  125. package/out/web/assets/{chunk-JQ64N6SF-wJmeGKAw.js → chunk-JQ64N6SF-DGg5kcEV.js} +1 -1
  126. package/out/web/assets/{chunk-LCL6LL3I-C1wHD8Ie.js → chunk-LCL6LL3I-CCYcjd7p.js} +1 -1
  127. package/out/web/assets/{chunk-OBVCFTLP-BsRTPBqs.js → chunk-OBVCFTLP-DJeNil5M.js} +1 -1
  128. package/out/web/assets/{chunk-P2QGCYS3-HZIiM7Ni.js → chunk-P2QGCYS3-lRzkRjBB.js} +1 -1
  129. package/out/web/assets/{chunk-POPQ4Y6H-Dk9wvVb0.js → chunk-POPQ4Y6H-DouASMBW.js} +1 -1
  130. package/out/web/assets/{chunk-PWAF6VOD-BmjYLNbq.js → chunk-PWAF6VOD-DMmD1vVf.js} +1 -1
  131. package/out/web/assets/{chunk-R7TYR2AO-CaHIf-lK.js → chunk-R7TYR2AO-CYLA5UC5.js} +1 -1
  132. package/out/web/assets/{chunk-RHFEMEQ7-_T561hOU.js → chunk-RHFEMEQ7-BiXwEcUT.js} +1 -1
  133. package/out/web/assets/{chunk-SVP7TREG-CM-GGYoY.js → chunk-SVP7TREG-BV-zPslF.js} +1 -1
  134. package/out/web/assets/{chunk-TEH6E4GO-K2A8Vg2C.js → chunk-TEH6E4GO-B2RGEohZ.js} +1 -1
  135. package/out/web/assets/classDiagram-DTDB5LWJ-Dq0smRWk.js +1 -0
  136. package/out/web/assets/classDiagram-v2-JRS7N3AN-Dq0smRWk.js +1 -0
  137. package/out/web/assets/config-C-ZFtipU.css +1 -0
  138. package/out/web/assets/config-eEDngJXO.js +1 -0
  139. package/out/web/assets/core-hQ2VA9Ti.js +1 -0
  140. package/out/web/assets/{cynefin-OW5HDTMX-ClzaB6cc.js → cynefin-OW5HDTMX-Cas4csHM.js} +1 -1
  141. package/out/web/assets/{cynefinDiagram-5FMLGOSQ-D_JzZBzf.js → cynefinDiagram-5FMLGOSQ-Bbpj66Y3.js} +1 -1
  142. package/out/web/assets/{dagre-3AP2YEHR-BDuUeMHj.js → dagre-3AP2YEHR-B0-2RDEd.js} +1 -1
  143. package/out/web/assets/{diagram-S7CK7UJ4-DgtcfE8P.js → diagram-S7CK7UJ4-BdzEjUyH.js} +1 -1
  144. package/out/web/assets/{diagram-UQ7AKVKN-DTLoEYti.js → diagram-UQ7AKVKN-CJDwyPxF.js} +1 -1
  145. package/out/web/assets/{diagram-VSXAHHWV-ChGl9pXz.js → diagram-VSXAHHWV-BxaG1r_B.js} +1 -1
  146. package/out/web/assets/{diagram-VX7I27RA-Be8DWz0S.js → diagram-VX7I27RA-BMmUqm8f.js} +1 -1
  147. package/out/web/assets/{diagram-Z3DM3KII-BMXjRTOF.js → diagram-Z3DM3KII-CFtd03eE.js} +1 -1
  148. package/out/web/assets/dist-js-Bf2bhoku.js +1 -0
  149. package/out/web/assets/{ebnfDiagram-PWID7BFC-8Q9pl1CJ.js → ebnfDiagram-PWID7BFC-DwAen1hO.js} +1 -1
  150. package/out/web/assets/{erDiagram-SSCWMZ5O-DjH8Lnkn.js → erDiagram-SSCWMZ5O-BCZSHACj.js} +1 -1
  151. package/out/web/assets/event-ChBVpRy0.js +1 -0
  152. package/out/web/assets/{eventmodeling-NTZA5JFV-BKUH_DOp.js → eventmodeling-NTZA5JFV-XHStE4E_.js} +1 -1
  153. package/out/web/assets/fira-code-latin-600-normal-BmSSHshu.woff +0 -0
  154. package/out/web/assets/fira-code-latin-600-normal-CvYZpPHg.woff2 +0 -0
  155. package/out/web/assets/fira-code-symbols2-600-normal-Dvq6IQE5.woff +0 -0
  156. package/out/web/assets/flowDiagram-A5DVABFB-BLg7nEcd.js +1 -0
  157. package/out/web/assets/{ganttDiagram-EL5Y4UJY-D7fZKJNM.js → ganttDiagram-EL5Y4UJY-BAEu1Cql.js} +1 -1
  158. package/out/web/assets/{gitGraph-4MIJSDKK-BypWaaBU.js → gitGraph-4MIJSDKK-r32Vyper.js} +1 -1
  159. package/out/web/assets/{gitGraphDiagram-WWUBYQGX-DWiw_3bq.js → gitGraphDiagram-WWUBYQGX-z9o9qt6V.js} +1 -1
  160. package/out/web/assets/index-Btsf4L8M.css +1 -0
  161. package/out/web/assets/index-D8D9MeRA.js +11 -0
  162. package/out/web/assets/{info-A6RAGUB7-KkAUxT4j.js → info-A6RAGUB7-BvLaC2cw.js} +1 -1
  163. package/out/web/assets/{infoDiagram-RXCK75RN-BNb6E48y.js → infoDiagram-RXCK75RN-Be6WAXXw.js} +1 -1
  164. package/out/web/assets/{ishikawaDiagram-5VMMS53U-Caa-JoAK.js → ishikawaDiagram-5VMMS53U-DZjoHJHC.js} +1 -1
  165. package/out/web/assets/{journeyDiagram-EYS64GPL-DOrmFGz6.js → journeyDiagram-EYS64GPL-CtVkjkGm.js} +1 -1
  166. package/out/web/assets/{kanban-definition-3QL26DDD-BOWCYcK0.js → kanban-definition-3QL26DDD-CW5FMv1w.js} +1 -1
  167. package/out/web/assets/lucide-react-Ip3L6Jtn.js +1 -0
  168. package/out/web/assets/markdown-BSeeUbJH.js +38 -0
  169. package/out/web/assets/{mermaid-parser.core-BQqjCkS_.js → mermaid-parser.core-aUgCqsZ5.js} +3 -3
  170. package/out/web/assets/mermaid.core-D57sEiSL.js +11 -0
  171. package/out/web/assets/{mindmap-definition-FBJOCRG2-jTceWpr0.js → mindmap-definition-FBJOCRG2-DAmSpM3a.js} +1 -1
  172. package/out/web/assets/modelManager-tMVmJVAW.js +2 -0
  173. package/out/web/assets/oauthManager-9jxicDWJ.js +1 -0
  174. package/out/web/assets/{packet-AYTQ26CC-CJ5RXgol.js → packet-AYTQ26CC-DJ27iIoJ.js} +1 -1
  175. package/out/web/assets/{pegDiagram-XKGWAZYB-y8wMtd0y.js → pegDiagram-XKGWAZYB-Bj3ii-gS.js} +1 -1
  176. package/out/web/assets/{pie-WAS4IAKB-72fTBbl4.js → pie-WAS4IAKB-DG5mCUbc.js} +1 -1
  177. package/out/web/assets/{pieDiagram-E7YTZNPT-e0O02qWq.js → pieDiagram-E7YTZNPT-BrJLPnDA.js} +1 -1
  178. package/out/web/assets/prompt-latin-700-normal-BfbftDSq.woff +0 -0
  179. package/out/web/assets/prompt-latin-700-normal-I2gc831J.woff2 +0 -0
  180. package/out/web/assets/prompt-thai-700-normal-Cb5ilR-c.woff +0 -0
  181. package/out/web/assets/prompt-thai-700-normal-Cg4aQ0Nn.woff2 +0 -0
  182. package/out/web/assets/{quadrantDiagram-AXDQQJYC-C9phYLom.js → quadrantDiagram-AXDQQJYC-3x_TmF3j.js} +1 -1
  183. package/out/web/assets/{radar-RG4KPBEZ-BAU2hzUT.js → radar-RG4KPBEZ-CrXaTTuV.js} +1 -1
  184. package/out/web/assets/{railroad-74A4TZTK-B0bCAVHC.js → railroad-74A4TZTK-BpqMH9BE.js} +1 -1
  185. package/out/web/assets/{railroad-abnf-HS5TGJTU-WhxO7ndE.js → railroad-abnf-HS5TGJTU-DHI0uLlV.js} +1 -1
  186. package/out/web/assets/{railroad-ebnf-LZEXJU2U-BkA0m7-F.js → railroad-ebnf-LZEXJU2U-CQCb316y.js} +1 -1
  187. package/out/web/assets/{railroad-peg-WCYAUIDC-BsVpHIaj.js → railroad-peg-WCYAUIDC-Ph1giKkH.js} +1 -1
  188. package/out/web/assets/{railroadDiagram-O6MQD6OU-CyOLN65Q.js → railroadDiagram-O6MQD6OU-BRq6wIxx.js} +1 -1
  189. package/out/web/assets/{requirementDiagram-EFPCY7ZU-DQXJ7Dud.js → requirementDiagram-EFPCY7ZU-DIJj6G1g.js} +1 -1
  190. package/out/web/assets/{sankeyDiagram-P5KCCOFB-B2XLyIIc.js → sankeyDiagram-P5KCCOFB-DZajSryq.js} +1 -1
  191. package/out/web/assets/{sequenceDiagram-WJ2MYXX4-DGQY4wwm.js → sequenceDiagram-WJ2MYXX4-DxJCWyZS.js} +1 -1
  192. package/out/web/assets/{stateDiagram-HBIQ2CUA-DHZpDwNy.js → stateDiagram-HBIQ2CUA-k6voi8Vf.js} +1 -1
  193. package/out/web/assets/stateDiagram-v2-4QOOHH4V-DeEc0lGZ.js +1 -0
  194. package/out/web/assets/studio-B1mk40wD.js +1 -0
  195. package/out/web/assets/{swimlanes-XN3QIQJK-Bn_jcZz-.js → swimlanes-XN3QIQJK-igYhTjXB.js} +1 -1
  196. package/out/web/assets/swimlanesDiagram-VK2B7HYN-DpVik9v7.js +8 -0
  197. package/out/web/assets/{timeline-definition-24CTP7MA-CdTERuJZ.js → timeline-definition-24CTP7MA-Dke2p93p.js} +1 -1
  198. package/out/web/assets/{treeView-Q6P3EWNA-TKBKQG6R.js → treeView-Q6P3EWNA-hNELnXUs.js} +1 -1
  199. package/out/web/assets/{treemap-WGGIJYW6-BP7gQoiC.js → treemap-WGGIJYW6-D2B6wDsx.js} +1 -1
  200. package/out/web/assets/{vennDiagram-4TSXK5OY-BHUmxDuK.js → vennDiagram-4TSXK5OY-CDkW7rUP.js} +1 -1
  201. package/out/web/assets/{wardley-WFR3VGLG-9bct5AAN.js → wardley-WFR3VGLG-BECdXETi.js} +1 -1
  202. package/out/web/assets/{wardleyDiagram-VM6X3IG4-BfJwDDso.js → wardleyDiagram-VM6X3IG4-B5BycpQ4.js} +1 -1
  203. package/out/web/assets/window-5qYXKoW7.js +1 -0
  204. package/out/web/assets/{xychartDiagram-S5SC5T6Z-Dqd9Mvpo.js → xychartDiagram-S5SC5T6Z-CtJS3b--.js} +1 -1
  205. package/out/web/index-web.html +3 -4
  206. package/out/web/index.html +3 -4
  207. package/package.json +17 -6
  208. package/skills-lock.json +36 -0
  209. package/slash-commands.json +9 -0
  210. package/src/renderer/index-web.html +1 -0
  211. package/src/renderer/index.html +1 -0
  212. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  213. package/src/renderer/shared/agentProgress.ts +168 -3
  214. package/src/renderer/shared/components/AgentActivityDrawer.tsx +6 -6
  215. package/src/renderer/shared/components/AgentActivityTable.tsx +192 -132
  216. package/src/renderer/shared/components/ArtifactPreviewPanel.tsx +4 -4
  217. package/src/renderer/shared/components/AuthGate.tsx +4 -9
  218. package/src/renderer/shared/components/CalculationCard.tsx +41 -15
  219. package/src/renderer/shared/components/ChatMessageItem.tsx +20 -21
  220. package/src/renderer/shared/components/ChatPanel.tsx +432 -193
  221. package/src/renderer/shared/components/ChunkErrorBoundary.tsx +198 -49
  222. package/src/renderer/shared/components/CliSessionsView.tsx +495 -0
  223. package/src/renderer/shared/components/CodeReviewPage.tsx +565 -0
  224. package/src/renderer/shared/components/CommandPalette.tsx +8 -8
  225. package/src/renderer/shared/components/DashboardSidebar.tsx +862 -125
  226. package/src/renderer/shared/components/DesktopTitlebar.tsx +345 -0
  227. package/src/renderer/shared/components/DiffReviewModal.tsx +3 -3
  228. package/src/renderer/shared/components/GitBranchSelector.tsx +442 -0
  229. package/src/renderer/shared/components/ImageGenCard.tsx +31 -12
  230. package/src/renderer/shared/components/ImageSearchCard.tsx +59 -38
  231. package/src/renderer/shared/components/ImageStudioPanel.tsx +40 -41
  232. package/src/renderer/shared/components/InlineThoughtNote.tsx +27 -0
  233. package/src/renderer/shared/components/LinkedFoldersView.tsx +365 -46
  234. package/src/renderer/shared/components/McpRegistryPicker.tsx +1 -1
  235. package/src/renderer/shared/components/McpServersView.tsx +24 -22
  236. package/src/renderer/shared/components/MermaidCard.tsx +14 -8
  237. package/src/renderer/shared/components/MintDashboard.tsx +1141 -508
  238. package/src/renderer/shared/components/ModelSelectorPopover.tsx +535 -214
  239. package/src/renderer/shared/components/PlanChecklistWidget.tsx +1 -1
  240. package/src/renderer/shared/components/PluginsView.tsx +1 -1
  241. package/src/renderer/shared/components/RewindModal.tsx +6 -6
  242. package/src/renderer/shared/components/RunSummaryDashboard.tsx +3 -3
  243. package/src/renderer/shared/components/ScheduledTasksView.tsx +4 -4
  244. package/src/renderer/shared/components/ScreenCaptureDialog.css +221 -0
  245. package/src/renderer/shared/components/ScreenCaptureDialog.tsx +199 -0
  246. package/src/renderer/shared/components/Settings/AgentsTab.tsx +34 -39
  247. package/src/renderer/shared/components/Settings/AudioTab.tsx +8 -8
  248. package/src/renderer/shared/components/Settings/AutomationTab.tsx +8 -58
  249. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +368 -0
  250. package/src/renderer/shared/components/Settings/GeneralTab.tsx +335 -81
  251. package/src/renderer/shared/components/Settings/MemoryTab.tsx +3 -3
  252. package/src/renderer/shared/components/Settings/PluginsTab.tsx +20 -12
  253. package/src/renderer/shared/components/Settings/ProfileTab.tsx +29 -5
  254. package/src/renderer/shared/components/Settings/SearchableModelCombobox.tsx +411 -0
  255. package/src/renderer/shared/components/Settings/ThemeTab.tsx +401 -158
  256. package/src/renderer/shared/components/SkillsView.tsx +41 -16
  257. package/src/renderer/shared/components/SlashSuggestions.tsx +3 -2
  258. package/src/renderer/shared/components/SourcesBlock.tsx +44 -32
  259. package/src/renderer/shared/components/StockCard.tsx +58 -24
  260. package/src/renderer/shared/components/SubagentDagView.tsx +4 -4
  261. package/src/renderer/shared/components/TerminalDock.tsx +241 -0
  262. package/src/renderer/shared/components/ThinkingBlock.tsx +14 -8
  263. package/src/renderer/shared/components/ToolSurfacePage.tsx +520 -0
  264. package/src/renderer/shared/components/UiFeatureCard.tsx +267 -0
  265. package/src/renderer/shared/components/UiGridCard.tsx +188 -0
  266. package/src/renderer/shared/components/UiMockupWidget.tsx +149 -0
  267. package/src/renderer/shared/components/VeoStudioPanel.tsx +13 -29
  268. package/src/renderer/shared/components/WeatherCard.tsx +3 -3
  269. package/src/renderer/shared/components/WorkspaceContextPopover.tsx +133 -0
  270. package/src/renderer/shared/components/WorkspaceSelector.tsx +149 -0
  271. package/src/renderer/shared/constants/config.ts +28 -3
  272. package/src/renderer/shared/constants/models.ts +189 -2
  273. package/src/renderer/shared/conversation/coordinator.test.ts +27 -0
  274. package/src/renderer/shared/conversation/coordinator.ts +82 -0
  275. package/src/renderer/shared/conversation/syncView.test.ts +46 -0
  276. package/src/renderer/shared/conversation/syncView.ts +43 -0
  277. package/src/renderer/shared/conversation/useConversationCoordinator.ts +106 -0
  278. package/src/renderer/shared/css/agent-observability.css +35 -3
  279. package/src/renderer/shared/css/auth-gate.css +2 -2
  280. package/src/renderer/shared/css/chat-ui-cards.css +495 -0
  281. package/src/renderer/shared/css/code-review.css +823 -0
  282. package/src/renderer/shared/css/code-sessions.css +452 -0
  283. package/src/renderer/shared/css/file-changes.css +132 -0
  284. package/src/renderer/shared/css/image-studio.css +16 -16
  285. package/src/renderer/shared/css/management-views.css +277 -27
  286. package/src/renderer/shared/css/model-selector.css +442 -42
  287. package/src/renderer/shared/css/settings/agents.css +1 -1
  288. package/src/renderer/shared/css/settings/automation.css +13 -13
  289. package/src/renderer/shared/css/settings/general.css +526 -5
  290. package/src/renderer/shared/css/settings/plugins.css +5 -5
  291. package/src/renderer/shared/css/settings/profile.css +331 -1
  292. package/src/renderer/shared/css/settings/theme.css +651 -3
  293. package/src/renderer/shared/css/veo-studio.css +16 -15
  294. package/src/renderer/shared/fonts.ts +19 -37
  295. package/src/renderer/shared/platform.test.ts +34 -0
  296. package/src/renderer/shared/platform.ts +173 -6
  297. package/src/renderer/shared/theme/themeManager.ts +144 -0
  298. package/src/renderer/shared/theme/themes.ts +116 -0
  299. package/src/renderer/shared/theme/tokens.css +318 -0
  300. package/src/renderer/shared/types.ts +82 -1
  301. package/src/renderer/shared/utils/agentActivity.ts +126 -5
  302. package/src/renderer/shared/utils/cardJson.test.ts +35 -0
  303. package/src/renderer/shared/utils/cardJson.ts +30 -0
  304. package/src/renderer/shared/utils/fileIcons.ts +1 -1
  305. package/src/renderer/shared/utils/markdown.tsx +329 -80
  306. package/src/renderer/shared/utils/markdown.webImages.test.tsx +40 -0
  307. package/src/renderer/shared/utils/providers.ts +8 -3
  308. package/src/renderer/shared/utils/screenCapture.ts +43 -0
  309. package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
  310. package/src/renderer/shared/utils/ui.ts +4 -64
  311. package/src/renderer/src/App.tsx +7 -0
  312. package/src/renderer/src/components/BrowserShell.tsx +108 -0
  313. package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +91 -0
  314. package/src/renderer/src/components/Live2DStage.tsx +32 -9
  315. package/src/renderer/src/components/MintDashboard.tsx +4 -2
  316. package/src/renderer/src/components/ModelPanel.tsx +2 -1
  317. package/src/renderer/src/components/PicturesLibrary.tsx +3 -2
  318. package/src/renderer/src/components/ScreenPicker.css +190 -0
  319. package/src/renderer/src/components/ScreenPicker.tsx +185 -540
  320. package/src/renderer/src/components/SettingsWindow.tsx +40 -2
  321. package/src/renderer/src/components/SpotlightWindow.tsx +1 -0
  322. package/src/renderer/src/components/WidgetWindow.tsx +27 -3
  323. package/src/renderer/src/components/WorkspacePanel.tsx +61 -43
  324. package/src/renderer/src/components/browser-shell.css +185 -0
  325. package/src/renderer/src/components/browser-suggestions-popup.css +55 -0
  326. package/src/renderer/src/components/liveTranslateFrames.test.ts +23 -0
  327. package/src/renderer/src/components/liveTranslateFrames.ts +34 -0
  328. package/src/renderer/src/css/app-shell.css +394 -113
  329. package/src/renderer/src/css/chat.css +1926 -380
  330. package/src/renderer/src/css/dashboard.css +11 -0
  331. package/src/renderer/src/css/desktop-tools.css +730 -0
  332. package/src/renderer/src/css/misc.css +19 -22
  333. package/src/renderer/src/css/model.css +49 -48
  334. package/src/renderer/src/css/pictures.css +144 -136
  335. package/src/renderer/src/css/settings/base.css +357 -123
  336. package/src/renderer/src/css/sidebar-workspace.css +930 -291
  337. package/src/renderer/src/css/spotlight.css +15 -26
  338. package/src/renderer/src/css/tool-surfaces.css +728 -0
  339. package/src/renderer/src/css/widget.css +35 -7
  340. package/src/renderer/src/env.d.ts +3 -0
  341. package/src/renderer/src/hooks/useProviderModels.ts +2 -9
  342. package/src/renderer/src/index.css +53 -46
  343. package/src/renderer/src/main.tsx +11 -0
  344. package/src/renderer/src/tauri.ts +201 -30
  345. package/src/renderer/src-web/App.tsx +40 -0
  346. package/src/renderer/src-web/components/MintDashboard.tsx +4 -2
  347. package/src/renderer/src-web/components/PicturesLibrary.tsx +3 -2
  348. package/src/renderer/src-web/components/PullToRefresh.tsx +107 -0
  349. package/src/renderer/src-web/components/SettingsWindow.tsx +28 -2
  350. package/src/renderer/src-web/css/app-shell.css +174 -96
  351. package/src/renderer/src-web/css/chat.css +1519 -316
  352. package/src/renderer/src-web/css/dashboard.css +11 -0
  353. package/src/renderer/src-web/css/misc.css +17 -17
  354. package/src/renderer/src-web/css/mobile.css +678 -0
  355. package/src/renderer/src-web/css/model.css +46 -46
  356. package/src/renderer/src-web/css/pictures.css +81 -34
  357. package/src/renderer/src-web/css/pull-to-refresh.css +54 -0
  358. package/src/renderer/src-web/css/settings/base.css +316 -100
  359. package/src/renderer/src-web/css/settings/mobile.css +320 -0
  360. package/src/renderer/src-web/css/sidebar-workspace.css +545 -100
  361. package/src/renderer/src-web/css/spotlight.css +9 -26
  362. package/src/renderer/src-web/css/widget.css +0 -5
  363. package/src/renderer/src-web/env.d.ts +3 -0
  364. package/src/renderer/src-web/hooks/useProviderModels.ts +2 -9
  365. package/src/renderer/src-web/index.css +53 -96
  366. package/src/renderer/src-web/main.tsx +11 -0
  367. package/src/renderer/src-web/tauri.ts +200 -30
  368. package/vite.config.web.ts +1 -0
  369. package/out/web/assets/MintDashboard-DWSqucgb.js +0 -57
  370. package/out/web/assets/SettingsWindow-DFM2aj5B.js +0 -2
  371. package/out/web/assets/chunk-CKBBP62Z-nr1uKPj9.js +0 -2
  372. package/out/web/assets/chunk-DSNCTWBM-Dtj8Rqsd.js +0 -2
  373. package/out/web/assets/chunk-DU6HZSFF-2tv5K1wT.js +0 -128
  374. package/out/web/assets/classDiagram-DTDB5LWJ-BdSFArgw.js +0 -1
  375. package/out/web/assets/classDiagram-v2-JRS7N3AN-BdSFArgw.js +0 -1
  376. package/out/web/assets/core-DImejIUG.js +0 -1
  377. package/out/web/assets/dist-js-BxuKEVWM.js +0 -1
  378. package/out/web/assets/event-BNl8Zahw.js +0 -1
  379. package/out/web/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
  380. package/out/web/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
  381. package/out/web/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
  382. package/out/web/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
  383. package/out/web/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
  384. package/out/web/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
  385. package/out/web/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
  386. package/out/web/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
  387. package/out/web/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
  388. package/out/web/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
  389. package/out/web/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
  390. package/out/web/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
  391. package/out/web/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
  392. package/out/web/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
  393. package/out/web/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
  394. package/out/web/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
  395. package/out/web/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
  396. package/out/web/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
  397. package/out/web/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
  398. package/out/web/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
  399. package/out/web/assets/flowDiagram-A5DVABFB-BpnHUSU7.js +0 -1
  400. package/out/web/assets/index-CVRg270z.css +0 -1
  401. package/out/web/assets/index-DxZQr9yD.js +0 -10
  402. package/out/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  403. package/out/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  404. package/out/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  405. package/out/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  406. package/out/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  407. package/out/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  408. package/out/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  409. package/out/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  410. package/out/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  411. package/out/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  412. package/out/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  413. package/out/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  414. package/out/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  415. package/out/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  416. package/out/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  417. package/out/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  418. package/out/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  419. package/out/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  420. package/out/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  421. package/out/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  422. package/out/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  423. package/out/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  424. package/out/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  425. package/out/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  426. package/out/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  427. package/out/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  428. package/out/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  429. package/out/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  430. package/out/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  431. package/out/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  432. package/out/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  433. package/out/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  434. package/out/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  435. package/out/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  436. package/out/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  437. package/out/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  438. package/out/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  439. package/out/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  440. package/out/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  441. package/out/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  442. package/out/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  443. package/out/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  444. package/out/web/assets/kanit-latin-400-normal-BUlsQXH3.woff2 +0 -0
  445. package/out/web/assets/kanit-latin-400-normal-HVZWrfev.woff +0 -0
  446. package/out/web/assets/kanit-latin-500-normal-CX_4XcKi.woff2 +0 -0
  447. package/out/web/assets/kanit-latin-500-normal-qBha86O4.woff +0 -0
  448. package/out/web/assets/kanit-latin-600-normal-0lS78yAd.woff2 +0 -0
  449. package/out/web/assets/kanit-latin-600-normal-DlacpeTg.woff +0 -0
  450. package/out/web/assets/kanit-latin-ext-400-normal-B2xPf58u.woff2 +0 -0
  451. package/out/web/assets/kanit-latin-ext-400-normal-CHvNKHHD.woff +0 -0
  452. package/out/web/assets/kanit-latin-ext-500-normal-BFdWrG22.woff +0 -0
  453. package/out/web/assets/kanit-latin-ext-500-normal-EHs3suD6.woff2 +0 -0
  454. package/out/web/assets/kanit-latin-ext-600-normal-BBDzoLaj.woff +0 -0
  455. package/out/web/assets/kanit-latin-ext-600-normal-DAX3wtuq.woff2 +0 -0
  456. package/out/web/assets/kanit-thai-400-normal-D2nliXKa.woff +0 -0
  457. package/out/web/assets/kanit-thai-400-normal-D80Pglro.woff2 +0 -0
  458. package/out/web/assets/kanit-thai-500-normal-BB8gri04.woff2 +0 -0
  459. package/out/web/assets/kanit-thai-500-normal-Iy_w0a80.woff +0 -0
  460. package/out/web/assets/kanit-thai-600-normal-Bj6oiaDc.woff2 +0 -0
  461. package/out/web/assets/kanit-thai-600-normal-wbTlPO7I.woff +0 -0
  462. package/out/web/assets/kanit-vietnamese-400-normal-DRI8YWyb.woff2 +0 -0
  463. package/out/web/assets/kanit-vietnamese-400-normal-dow6Bnto.woff +0 -0
  464. package/out/web/assets/kanit-vietnamese-500-normal-BzTrpCM3.woff2 +0 -0
  465. package/out/web/assets/kanit-vietnamese-500-normal-T1ndT7MF.woff +0 -0
  466. package/out/web/assets/kanit-vietnamese-600-normal-Bi7fw3I4.woff2 +0 -0
  467. package/out/web/assets/kanit-vietnamese-600-normal-DXCRAa_8.woff +0 -0
  468. package/out/web/assets/mali-latin-400-normal-ByPcZ8Gx.woff +0 -0
  469. package/out/web/assets/mali-latin-400-normal-Cuc6Ykl8.woff2 +0 -0
  470. package/out/web/assets/mali-latin-500-normal-B01M-LP6.woff2 +0 -0
  471. package/out/web/assets/mali-latin-500-normal-Thgqw_9f.woff +0 -0
  472. package/out/web/assets/mali-latin-600-normal-B9TiUNpT.woff2 +0 -0
  473. package/out/web/assets/mali-latin-600-normal-CycpQCwU.woff +0 -0
  474. package/out/web/assets/mali-latin-ext-400-normal-DUVdJQO4.woff +0 -0
  475. package/out/web/assets/mali-latin-ext-400-normal-iCG1ALuJ.woff2 +0 -0
  476. package/out/web/assets/mali-latin-ext-500-normal-BfJE4UMZ.woff2 +0 -0
  477. package/out/web/assets/mali-latin-ext-500-normal-FoLEyOKS.woff +0 -0
  478. package/out/web/assets/mali-latin-ext-600-normal-BTvIfiCp.woff2 +0 -0
  479. package/out/web/assets/mali-latin-ext-600-normal-DAQcLVmD.woff +0 -0
  480. package/out/web/assets/mali-thai-400-normal-BO7A3bLZ.woff2 +0 -0
  481. package/out/web/assets/mali-thai-400-normal-CX9VrjTn.woff +0 -0
  482. package/out/web/assets/mali-thai-500-normal-Cph2qha9.woff +0 -0
  483. package/out/web/assets/mali-thai-500-normal-D89rMT77.woff2 +0 -0
  484. package/out/web/assets/mali-thai-600-normal-DPgXT6rZ.woff +0 -0
  485. package/out/web/assets/mali-thai-600-normal-DlTx3OsB.woff2 +0 -0
  486. package/out/web/assets/mali-vietnamese-400-normal-DUKxzXaz.woff2 +0 -0
  487. package/out/web/assets/mali-vietnamese-400-normal-gFDLvsOK.woff +0 -0
  488. package/out/web/assets/mali-vietnamese-500-normal--OY07q2c.woff +0 -0
  489. package/out/web/assets/mali-vietnamese-500-normal-KDrNRwfW.woff2 +0 -0
  490. package/out/web/assets/mali-vietnamese-600-normal-CtTMUU7T.woff +0 -0
  491. package/out/web/assets/mali-vietnamese-600-normal-DFlJr66u.woff2 +0 -0
  492. package/out/web/assets/mermaid.core-DYGGlqOf.js +0 -11
  493. package/out/web/assets/mitr-latin-400-normal-Cb18vPmZ.woff +0 -0
  494. package/out/web/assets/mitr-latin-400-normal-CwbkLQ4a.woff2 +0 -0
  495. package/out/web/assets/mitr-latin-500-normal-B4JOhzAi.woff +0 -0
  496. package/out/web/assets/mitr-latin-500-normal-BmClOow2.woff2 +0 -0
  497. package/out/web/assets/mitr-latin-ext-400-normal-B3CPG7Yo.woff2 +0 -0
  498. package/out/web/assets/mitr-latin-ext-400-normal-DTx65hiC.woff +0 -0
  499. package/out/web/assets/mitr-latin-ext-500-normal-B_Diajz1.woff2 +0 -0
  500. package/out/web/assets/mitr-latin-ext-500-normal-DYOsVaVT.woff +0 -0
  501. package/out/web/assets/mitr-thai-400-normal-CS4Do6aM.woff +0 -0
  502. package/out/web/assets/mitr-thai-400-normal-CXWaAdVj.woff2 +0 -0
  503. package/out/web/assets/mitr-thai-500-normal-CVdBrEVH.woff2 +0 -0
  504. package/out/web/assets/mitr-thai-500-normal-CW_B5D-i.woff +0 -0
  505. package/out/web/assets/mitr-vietnamese-400-normal-CPMGWyoC.woff2 +0 -0
  506. package/out/web/assets/mitr-vietnamese-400-normal-Z6XhIpdY.woff +0 -0
  507. package/out/web/assets/mitr-vietnamese-500-normal-CDrv0585.woff2 +0 -0
  508. package/out/web/assets/mitr-vietnamese-500-normal-CMQWyq-Z.woff +0 -0
  509. package/out/web/assets/noto-sans-thai-latin-400-normal-BaWBrqFP.woff2 +0 -0
  510. package/out/web/assets/noto-sans-thai-latin-400-normal-Dh_FJjOB.woff +0 -0
  511. package/out/web/assets/noto-sans-thai-latin-500-normal-BC04jsmm.woff +0 -0
  512. package/out/web/assets/noto-sans-thai-latin-500-normal-fyBKClF1.woff2 +0 -0
  513. package/out/web/assets/noto-sans-thai-latin-600-normal-CemcjnVR.woff2 +0 -0
  514. package/out/web/assets/noto-sans-thai-latin-600-normal-Dbc-dNO6.woff +0 -0
  515. package/out/web/assets/noto-sans-thai-latin-ext-400-normal-B-1H0YkH.woff +0 -0
  516. package/out/web/assets/noto-sans-thai-latin-ext-400-normal-nBP59pVw.woff2 +0 -0
  517. package/out/web/assets/noto-sans-thai-latin-ext-500-normal-B-ZWb8SZ.woff2 +0 -0
  518. package/out/web/assets/noto-sans-thai-latin-ext-500-normal-CrEHO7C8.woff +0 -0
  519. package/out/web/assets/noto-sans-thai-latin-ext-600-normal-PkMZo0xa.woff +0 -0
  520. package/out/web/assets/noto-sans-thai-latin-ext-600-normal-maHHBsez.woff2 +0 -0
  521. package/out/web/assets/noto-sans-thai-thai-400-normal-BEOmKAI1.woff2 +0 -0
  522. package/out/web/assets/noto-sans-thai-thai-400-normal-Dxb_unuU.woff +0 -0
  523. package/out/web/assets/noto-sans-thai-thai-500-normal-BOGXO2tw.woff +0 -0
  524. package/out/web/assets/noto-sans-thai-thai-500-normal-CU_X86GQ.woff2 +0 -0
  525. package/out/web/assets/noto-sans-thai-thai-600-normal-CmgB8_JK.woff +0 -0
  526. package/out/web/assets/noto-sans-thai-thai-600-normal-Cs73sVjl.woff2 +0 -0
  527. package/out/web/assets/oauthManager-DNiwM8Rn.js +0 -2
  528. package/out/web/assets/oauthManager-DuamS1Av.css +0 -1
  529. package/out/web/assets/outfit-latin-300-normal-AWLfuCom.woff +0 -0
  530. package/out/web/assets/outfit-latin-300-normal-CRYTwY6m.woff2 +0 -0
  531. package/out/web/assets/outfit-latin-400-normal-BGsTXAXT.woff2 +0 -0
  532. package/out/web/assets/outfit-latin-400-normal-DMwTpYkH.woff +0 -0
  533. package/out/web/assets/outfit-latin-500-normal-ClnHRwRh.woff +0 -0
  534. package/out/web/assets/outfit-latin-500-normal-DKnIMDSk.woff2 +0 -0
  535. package/out/web/assets/outfit-latin-600-normal-B7SfZ07L.woff2 +0 -0
  536. package/out/web/assets/outfit-latin-600-normal-BEfTtDA7.woff +0 -0
  537. package/out/web/assets/outfit-latin-ext-300-normal-BYS6Dpvq.woff2 +0 -0
  538. package/out/web/assets/outfit-latin-ext-300-normal-CMIMshEd.woff +0 -0
  539. package/out/web/assets/outfit-latin-ext-400-normal-5tcqmc2S.woff2 +0 -0
  540. package/out/web/assets/outfit-latin-ext-400-normal-DHm7mdGe.woff +0 -0
  541. package/out/web/assets/outfit-latin-ext-500-normal-DrCvqoFD.woff +0 -0
  542. package/out/web/assets/outfit-latin-ext-500-normal-zeox_O30.woff2 +0 -0
  543. package/out/web/assets/outfit-latin-ext-600-normal-B85nYjL1.woff2 +0 -0
  544. package/out/web/assets/outfit-latin-ext-600-normal-CWJcPgd7.woff +0 -0
  545. package/out/web/assets/preload-helper-D0uHx7FM.js +0 -1
  546. package/out/web/assets/prompt-latin-ext-400-normal-1pHbN9uy.woff +0 -0
  547. package/out/web/assets/prompt-latin-ext-400-normal-DdSafGZ9.woff2 +0 -0
  548. package/out/web/assets/prompt-latin-ext-500-normal--EZ1um7s.woff2 +0 -0
  549. package/out/web/assets/prompt-latin-ext-500-normal-D-lI1EVT.woff +0 -0
  550. package/out/web/assets/prompt-latin-ext-600-normal-C8b50x67.woff +0 -0
  551. package/out/web/assets/prompt-latin-ext-600-normal-Cg9L7iJU.woff2 +0 -0
  552. package/out/web/assets/prompt-vietnamese-400-normal-BCPzsgPT.woff2 +0 -0
  553. package/out/web/assets/prompt-vietnamese-400-normal-D4pLyeNK.woff +0 -0
  554. package/out/web/assets/prompt-vietnamese-500-normal-DmzxmPwa.woff2 +0 -0
  555. package/out/web/assets/prompt-vietnamese-500-normal-w_sS_j2F.woff +0 -0
  556. package/out/web/assets/prompt-vietnamese-600-normal-1dyohtNh.woff +0 -0
  557. package/out/web/assets/prompt-vietnamese-600-normal-7QWjJBsF.woff2 +0 -0
  558. package/out/web/assets/sarabun-latin-400-normal-DmguIS-7.woff +0 -0
  559. package/out/web/assets/sarabun-latin-400-normal-URPBxl-K.woff2 +0 -0
  560. package/out/web/assets/sarabun-latin-500-normal-BjUTcdxu.woff2 +0 -0
  561. package/out/web/assets/sarabun-latin-500-normal-CJexTAnl.woff +0 -0
  562. package/out/web/assets/sarabun-latin-600-normal-9FonlkKx.woff +0 -0
  563. package/out/web/assets/sarabun-latin-600-normal-DMD3TROr.woff2 +0 -0
  564. package/out/web/assets/sarabun-latin-ext-400-normal-BbP7GpLL.woff2 +0 -0
  565. package/out/web/assets/sarabun-latin-ext-400-normal-BsmTn0SS.woff +0 -0
  566. package/out/web/assets/sarabun-latin-ext-500-normal-Cot16Bd2.woff +0 -0
  567. package/out/web/assets/sarabun-latin-ext-500-normal-DE1LysqI.woff2 +0 -0
  568. package/out/web/assets/sarabun-latin-ext-600-normal-0tXu9x_i.woff +0 -0
  569. package/out/web/assets/sarabun-latin-ext-600-normal-BRxjKUQ6.woff2 +0 -0
  570. package/out/web/assets/sarabun-thai-400-normal-C2DaJlKK.woff2 +0 -0
  571. package/out/web/assets/sarabun-thai-400-normal-CH-UbWgg.woff +0 -0
  572. package/out/web/assets/sarabun-thai-500-normal-BVssjame.woff2 +0 -0
  573. package/out/web/assets/sarabun-thai-500-normal-C3iDLEzi.woff +0 -0
  574. package/out/web/assets/sarabun-thai-600-normal-3dIAQ-_s.woff2 +0 -0
  575. package/out/web/assets/sarabun-thai-600-normal-DWKeTe6a.woff +0 -0
  576. package/out/web/assets/sarabun-vietnamese-400-normal-DPfkSCMy.woff +0 -0
  577. package/out/web/assets/sarabun-vietnamese-400-normal-igdrzAGY.woff2 +0 -0
  578. package/out/web/assets/sarabun-vietnamese-500-normal-CpRVvGRU.woff +0 -0
  579. package/out/web/assets/sarabun-vietnamese-500-normal-Dpe7Br9m.woff2 +0 -0
  580. package/out/web/assets/sarabun-vietnamese-600-normal-BMbOgAW-.woff +0 -0
  581. package/out/web/assets/sarabun-vietnamese-600-normal-DkxrOlLB.woff2 +0 -0
  582. package/out/web/assets/stateDiagram-v2-4QOOHH4V-s6P9g2_b.js +0 -1
  583. package/out/web/assets/swimlanesDiagram-VK2B7HYN-CV9fOLrV.js +0 -8
  584. package/out/web/assets/tauri-CNrHQ2Gb.js +0 -3
  585. package/out/web/assets/window-DkIhgI7B.js +0 -1
@@ -37,10 +37,16 @@ pub enum ConfigError {
37
37
  },
38
38
  }
39
39
 
40
+ fn missing_tui_theme() -> String {
41
+ String::new()
42
+ }
43
+
40
44
  #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
41
45
  #[serde(default, rename_all = "camelCase")]
42
46
  pub struct MintConfig {
43
47
  pub theme: String,
48
+ #[serde(default = "missing_tui_theme")]
49
+ pub tui_theme: String,
44
50
  pub accent_color: String,
45
51
  pub language: String,
46
52
  pub assistant_mode: String,
@@ -88,6 +94,15 @@ pub struct MintConfig {
88
94
  /// Optional per-model temperature overrides, keyed by model id (e.g. "deepseek-chat" => 0.65).
89
95
  #[serde(default)]
90
96
  pub model_temperatures: std::collections::HashMap<String, f64>,
97
+ /// Whether thinking / reasoning is globally enabled by default.
98
+ #[serde(default = "default_true")]
99
+ pub thinking_enabled: bool,
100
+ /// Default thinking effort: "low" | "medium" | "high" | "extra_high".
101
+ #[serde(default = "default_thinking_effort")]
102
+ pub thinking_effort: String,
103
+ /// Per-model thinking configuration overrides, keyed by model id.
104
+ #[serde(default)]
105
+ pub model_thinking_configs: std::collections::HashMap<String, ModelThinkingConfig>,
91
106
  /// Active image-generation provider: "nanobanana" | "dalle" | "stability" | "ideogram" | "replicate"
92
107
  pub image_gen_provider: String,
93
108
  pub dalle_model: String,
@@ -173,6 +188,22 @@ pub struct MintConfig {
173
188
  pub extra: BTreeMap<String, Value>,
174
189
  }
175
190
 
191
+ fn default_true() -> bool {
192
+ true
193
+ }
194
+
195
+ fn default_thinking_effort() -> String {
196
+ "medium".into()
197
+ }
198
+
199
+ /// Thinking/reasoning configuration for a specific model.
200
+ #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
201
+ #[serde(rename_all = "camelCase")]
202
+ pub struct ModelThinkingConfig {
203
+ pub enabled: bool,
204
+ pub effort: String,
205
+ }
206
+
176
207
  #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
177
208
  #[serde(rename_all = "camelCase")]
178
209
  pub struct AgentConfig {
@@ -321,6 +352,9 @@ pub struct CustomProvider {
321
352
  pub id: String,
322
353
  /// Human-readable name shown in the UI.
323
354
  pub display_name: String,
355
+ /// Optional custom provider logo stored as a small image data URL.
356
+ #[serde(default, skip_serializing_if = "Option::is_none")]
357
+ pub logo_data_url: Option<String>,
324
358
  /// Base URL of the OpenAI-compatible endpoint, e.g. `"http://localhost:20128/v1"`.
325
359
  pub base_url: String,
326
360
  /// API key sent as `Authorization: Bearer <key>`. Empty = no auth header.
@@ -347,6 +381,7 @@ impl Default for MintConfig {
347
381
  ];
348
382
  Self {
349
383
  theme: "dark".into(),
384
+ tui_theme: "dark".into(),
350
385
  accent_color: "#10b981".into(),
351
386
  language: "th-TH".into(),
352
387
  assistant_mode: "chat".into(),
@@ -383,6 +418,9 @@ impl Default for MintConfig {
383
418
  bfl_model: "flux-pro-1.1".into(),
384
419
  temperature: None,
385
420
  model_temperatures: std::collections::HashMap::new(),
421
+ thinking_enabled: true,
422
+ thinking_effort: "medium".into(),
423
+ model_thinking_configs: std::collections::HashMap::new(),
386
424
  show_desktop_widget: true,
387
425
  safety_enabled: true,
388
426
  sandbox_mode: "prefer".into(),
@@ -690,6 +728,118 @@ impl MintConfig {
690
728
  }
691
729
  }
692
730
 
731
+ /// Returns whether thinking/reasoning is supported by a given provider & model.
732
+ pub fn is_thinking_supported_for_model(provider: &str, model: &str) -> bool {
733
+ let p = provider.to_ascii_lowercase();
734
+ let m = model.to_ascii_lowercase();
735
+ if p == "gemini" {
736
+ return m.contains("2.5")
737
+ || m.contains("2.0")
738
+ || m.contains("3.")
739
+ || m.contains("thinking");
740
+ }
741
+ if p == "anthropic" {
742
+ return m.contains("3-7")
743
+ || m.contains("3.7")
744
+ || m.contains("sonnet-5")
745
+ || m.contains("opus-5")
746
+ || m.contains("sonnet-4")
747
+ || m.contains("opus-4");
748
+ }
749
+ if p == "openai" || p == "local_openai" {
750
+ return m.starts_with("o1")
751
+ || m.starts_with("o3")
752
+ || m.contains("thinking")
753
+ || m.contains("reason")
754
+ || m.contains("gpt-5");
755
+ }
756
+ if p == "deepseek" {
757
+ return m.contains("reasoner") || m.contains("r1") || m.contains("deepseek");
758
+ }
759
+ if p == "openrouter" {
760
+ return m.contains("o1")
761
+ || m.contains("o3")
762
+ || m.contains("thinking")
763
+ || m.contains("reason")
764
+ || m.contains("r1")
765
+ || m.contains("qwq")
766
+ || m.contains("glm")
767
+ || m.contains("deepseek");
768
+ }
769
+ if p == "ollama" {
770
+ return m.contains("r1")
771
+ || m.contains("qwq")
772
+ || m.contains("thinking")
773
+ || m.contains("deepseek");
774
+ }
775
+ false
776
+ }
777
+
778
+ /// Returns whether the active model supports thinking/reasoning.
779
+ pub fn is_thinking_supported(&self) -> bool {
780
+ Self::is_thinking_supported_for_model(&self.ai_provider, self.active_model())
781
+ }
782
+
783
+ /// Resolves thinking enabled state for a model.
784
+ pub fn resolved_thinking_enabled_for_model(&self, provider: &str, model: &str) -> bool {
785
+ let model_clean = model.trim();
786
+ if let Some(cfg) = self.model_thinking_configs.get(model_clean) {
787
+ return cfg.enabled;
788
+ }
789
+ let lower = model_clean.to_ascii_lowercase();
790
+ for (k, v) in &self.model_thinking_configs {
791
+ if k.to_ascii_lowercase() == lower {
792
+ return v.enabled;
793
+ }
794
+ }
795
+ // If not explicitly configured, enable by default only if model supports it
796
+ if Self::is_thinking_supported_for_model(provider, model) {
797
+ self.thinking_enabled
798
+ } else {
799
+ false
800
+ }
801
+ }
802
+
803
+ /// Resolves thinking effort for a model ("low", "medium", "high", "extra_high").
804
+ pub fn resolved_thinking_effort_for_model(&self, model: &str) -> &str {
805
+ let model_clean = model.trim();
806
+ if let Some(cfg) = self.model_thinking_configs.get(model_clean) {
807
+ return &cfg.effort;
808
+ }
809
+ let lower = model_clean.to_ascii_lowercase();
810
+ for (k, v) in &self.model_thinking_configs {
811
+ if k.to_ascii_lowercase() == lower {
812
+ return &v.effort;
813
+ }
814
+ }
815
+ if self.thinking_effort.is_empty() {
816
+ "medium"
817
+ } else {
818
+ &self.thinking_effort
819
+ }
820
+ }
821
+
822
+ /// Returns (enabled, effort) for the currently active model.
823
+ pub fn resolved_thinking(&self) -> (bool, &str) {
824
+ let model = self.active_model();
825
+ (
826
+ self.resolved_thinking_enabled_for_model(&self.ai_provider, model),
827
+ self.resolved_thinking_effort_for_model(model),
828
+ )
829
+ }
830
+
831
+ /// Sets thinking enabled and effort for a specific model id.
832
+ pub fn set_model_thinking(&mut self, model: &str, enabled: bool, effort: &str) {
833
+ let model_key = model.trim().to_string();
834
+ self.model_thinking_configs.insert(
835
+ model_key,
836
+ ModelThinkingConfig {
837
+ enabled,
838
+ effort: effort.trim().to_ascii_lowercase(),
839
+ },
840
+ );
841
+ }
842
+
693
843
  /// Sets the active provider and model, saves the configuration to disk, and logs a system event interaction.
694
844
  pub fn set_active_model(
695
845
  &mut self,
@@ -935,6 +1085,12 @@ fn load_config_from(path: &Path) -> Result<MintConfig, ConfigError> {
935
1085
  path: path.to_path_buf(),
936
1086
  source,
937
1087
  })?;
1088
+ if config.tui_theme.is_empty() {
1089
+ config.tui_theme = match config.theme.as_str() {
1090
+ "system" | "light" => config.theme.clone(),
1091
+ _ => "dark".to_owned(),
1092
+ };
1093
+ }
938
1094
  for (key, value) in runtime_extra_defaults() {
939
1095
  config.extra.entry(key).or_insert(value);
940
1096
  }
@@ -1359,6 +1515,26 @@ mod tests {
1359
1515
  assert_eq!(actual, expected);
1360
1516
  }
1361
1517
 
1518
+ #[test]
1519
+ fn custom_provider_logo_survives_config_round_trip() {
1520
+ let logo = "data:image/png;base64,aGVsbG8=";
1521
+ let mut value = serde_json::to_value(MintConfig::default()).unwrap();
1522
+ value["customProviders"] = serde_json::json!([{
1523
+ "id": "test-provider",
1524
+ "displayName": "Test Provider",
1525
+ "baseUrl": "https://example.test/v1",
1526
+ "apiKey": "",
1527
+ "models": [],
1528
+ "headers": [],
1529
+ "logoDataUrl": logo,
1530
+ }]);
1531
+
1532
+ let parsed: MintConfig = serde_json::from_value(value).unwrap();
1533
+ let round_tripped = serde_json::to_value(parsed).unwrap();
1534
+
1535
+ assert_eq!(round_tripped["customProviders"][0]["logoDataUrl"], logo);
1536
+ }
1537
+
1362
1538
  #[test]
1363
1539
  fn config_preserves_fields_that_have_not_migrated_yet() {
1364
1540
  let config: MintConfig =
@@ -1404,6 +1580,7 @@ mod tests {
1404
1580
  custom_providers: vec![CustomProvider {
1405
1581
  id: "myprovider".into(),
1406
1582
  display_name: "My Provider".into(),
1583
+ logo_data_url: None,
1407
1584
  base_url: "http://localhost:20128/v1".into(),
1408
1585
  api_key: "sk-abc".into(),
1409
1586
  models: vec![CustomProviderModel {
@@ -1583,4 +1760,57 @@ mod tests {
1583
1760
  config.deepseek_model = "deepseek-chat".into();
1584
1761
  assert_eq!(config.resolved_temperature(), 0.6);
1585
1762
  }
1763
+
1764
+ #[test]
1765
+ fn test_thinking_configuration_and_resolution() {
1766
+ let mut config = MintConfig::default();
1767
+
1768
+ // Support checks
1769
+ assert!(MintConfig::is_thinking_supported_for_model(
1770
+ "anthropic",
1771
+ "claude-3-7-sonnet"
1772
+ ));
1773
+ assert!(MintConfig::is_thinking_supported_for_model(
1774
+ "gemini",
1775
+ "gemini-2.5-pro"
1776
+ ));
1777
+ assert!(MintConfig::is_thinking_supported_for_model(
1778
+ "openai", "o3-mini"
1779
+ ));
1780
+ assert!(MintConfig::is_thinking_supported_for_model(
1781
+ "deepseek",
1782
+ "deepseek-reasoner"
1783
+ ));
1784
+ assert!(!MintConfig::is_thinking_supported_for_model(
1785
+ "openai", "gpt-4o"
1786
+ ));
1787
+ assert!(!MintConfig::is_thinking_supported_for_model(
1788
+ "anthropic",
1789
+ "claude-3-5-haiku"
1790
+ ));
1791
+
1792
+ // Global default resolution
1793
+ config.ai_provider = "anthropic".into();
1794
+ config.anthropic_model = "claude-3-7-sonnet".into();
1795
+ let (enabled, effort) = config.resolved_thinking();
1796
+ assert!(enabled);
1797
+ assert_eq!(effort, "medium");
1798
+
1799
+ // Per-model override
1800
+ config.set_model_thinking("claude-3-7-sonnet", true, "high");
1801
+ let (enabled, effort) = config.resolved_thinking();
1802
+ assert!(enabled);
1803
+ assert_eq!(effort, "high");
1804
+
1805
+ // Turning thinking off for model
1806
+ config.set_model_thinking("claude-3-7-sonnet", false, "high");
1807
+ let (enabled, _) = config.resolved_thinking();
1808
+ assert!(!enabled);
1809
+
1810
+ // Unsupported model always resolves enabled to false
1811
+ config.ai_provider = "openai".into();
1812
+ config.openai_model = "gpt-4o".into();
1813
+ let (enabled, _) = config.resolved_thinking();
1814
+ assert!(!enabled);
1815
+ }
1586
1816
  }
@@ -0,0 +1,228 @@
1
+ use serde::{Deserialize, Serialize};
2
+ use std::{
3
+ fs,
4
+ path::{Component, Path, PathBuf},
5
+ };
6
+
7
+ const MAX_DEPTH: usize = 9;
8
+ const MAX_CHILDREN: usize = 400;
9
+ const COLLAPSED: &[&str] = &[
10
+ ".git",
11
+ "node_modules",
12
+ "target",
13
+ "dist",
14
+ "out",
15
+ "build",
16
+ "coverage",
17
+ ];
18
+
19
+ #[derive(Debug, Clone, Serialize, Deserialize)]
20
+ #[serde(rename_all = "camelCase")]
21
+ pub struct WorkspaceTreeEntry {
22
+ pub name: String,
23
+ pub path: String,
24
+ pub kind: String,
25
+ pub children: Vec<WorkspaceTreeEntry>,
26
+ }
27
+ #[derive(Debug, Clone, Serialize, Deserialize)]
28
+ #[serde(rename_all = "camelCase")]
29
+ pub struct WorkspaceSnapshot {
30
+ pub path: String,
31
+ pub tree: WorkspaceTreeEntry,
32
+ pub git: crate::git::BranchInfo,
33
+ pub revision: u64,
34
+ }
35
+
36
+ #[derive(Debug, Clone, Serialize, Deserialize)]
37
+ #[serde(rename_all = "camelCase")]
38
+ pub struct WorkspaceOperation {
39
+ pub root: PathBuf,
40
+ pub relative_path: String,
41
+ pub revision: u64,
42
+ }
43
+
44
+ pub fn snapshot(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
45
+ let root = canonical_root(&operation.root)?;
46
+ let name = root
47
+ .file_name()
48
+ .map(|n| n.to_string_lossy().to_string())
49
+ .unwrap_or_else(|| root.display().to_string());
50
+ Ok(WorkspaceSnapshot {
51
+ path: root.display().to_string(),
52
+ tree: WorkspaceTreeEntry {
53
+ name,
54
+ path: ".".into(),
55
+ kind: "directory".into(),
56
+ children: children(&root, &root, 0)?,
57
+ },
58
+ git: crate::git::read_branch_info(&root)?,
59
+ revision: operation.revision,
60
+ })
61
+ }
62
+ pub fn resolve(root: &Path, relative: &str) -> Result<PathBuf, String> {
63
+ let root = canonical_root(root)?;
64
+ let relative = Path::new(relative);
65
+ if relative.as_os_str().is_empty() || relative.is_absolute() {
66
+ return Err("workspace path must be relative".into());
67
+ }
68
+ if relative
69
+ .components()
70
+ .any(|component| !matches!(component, Component::Normal(_)))
71
+ {
72
+ return Err("workspace path escapes root".into());
73
+ }
74
+
75
+ let candidate = root.join(relative);
76
+ let mut existing = candidate.as_path();
77
+ while !existing.exists() {
78
+ existing = existing
79
+ .parent()
80
+ .ok_or_else(|| "workspace path escapes root".to_string())?;
81
+ }
82
+ let existing = existing.canonicalize().map_err(|e| e.to_string())?;
83
+ if !existing.starts_with(&root) {
84
+ return Err("workspace path escapes root".into());
85
+ }
86
+ Ok(candidate)
87
+ }
88
+ pub fn create_file(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
89
+ let path = resolve(&operation.root, &operation.relative_path)?;
90
+ fs::write(path, "").map_err(|e| e.to_string())?;
91
+ snapshot(&WorkspaceOperation {
92
+ revision: operation.revision + 1,
93
+ ..operation.clone()
94
+ })
95
+ }
96
+ pub fn create_folder(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
97
+ let path = resolve(&operation.root, &operation.relative_path)?;
98
+ fs::create_dir_all(path).map_err(|e| e.to_string())?;
99
+ snapshot(&WorkspaceOperation {
100
+ revision: operation.revision + 1,
101
+ ..operation.clone()
102
+ })
103
+ }
104
+ pub fn delete(operation: &WorkspaceOperation) -> Result<WorkspaceSnapshot, String> {
105
+ let path = resolve(&operation.root, &operation.relative_path)?;
106
+ if path.is_dir() {
107
+ fs::remove_dir_all(path)
108
+ } else {
109
+ fs::remove_file(path)
110
+ }
111
+ .map_err(|e| e.to_string())?;
112
+ snapshot(&WorkspaceOperation {
113
+ revision: operation.revision + 1,
114
+ ..operation.clone()
115
+ })
116
+ }
117
+ fn canonical_root(root: &Path) -> Result<PathBuf, String> {
118
+ let root = root.canonicalize().map_err(|e| e.to_string())?;
119
+ if root.is_dir() {
120
+ Ok(root)
121
+ } else {
122
+ Err("workspace is not a directory".into())
123
+ }
124
+ }
125
+ fn children(root: &Path, dir: &Path, depth: usize) -> Result<Vec<WorkspaceTreeEntry>, String> {
126
+ if depth >= MAX_DEPTH {
127
+ return Ok(vec![]);
128
+ }
129
+ let mut entries = fs::read_dir(dir)
130
+ .map_err(|e| e.to_string())?
131
+ .flatten()
132
+ .filter_map(|e| {
133
+ let t = e.file_type().ok()?;
134
+ if t.is_symlink() {
135
+ return None;
136
+ }
137
+ Some((
138
+ e.file_name().to_string_lossy().to_string(),
139
+ e.path(),
140
+ t.is_dir(),
141
+ ))
142
+ })
143
+ .collect::<Vec<_>>();
144
+ entries.sort_by(|a, b| b.2.cmp(&a.2).then_with(|| a.0.cmp(&b.0)));
145
+ entries.truncate(MAX_CHILDREN);
146
+ entries
147
+ .into_iter()
148
+ .map(|(name, path, is_dir)| {
149
+ let children = if is_dir && !COLLAPSED.contains(&name.as_str()) {
150
+ children(root, &path, depth + 1)?
151
+ } else {
152
+ vec![]
153
+ };
154
+ Ok(WorkspaceTreeEntry {
155
+ name,
156
+ path: path
157
+ .strip_prefix(root)
158
+ .unwrap_or(&path)
159
+ .to_string_lossy()
160
+ .to_string(),
161
+ kind: if is_dir { "directory" } else { "file" }.into(),
162
+ children,
163
+ })
164
+ })
165
+ .collect()
166
+ }
167
+
168
+ #[cfg(test)]
169
+ mod tests {
170
+ use super::*;
171
+ use std::time::{SystemTime, UNIX_EPOCH};
172
+
173
+ fn root() -> PathBuf {
174
+ let suffix = SystemTime::now()
175
+ .duration_since(UNIX_EPOCH)
176
+ .unwrap()
177
+ .as_nanos();
178
+ let root = std::env::temp_dir().join(format!(
179
+ "mint-workspace-interface-{}-{suffix}",
180
+ std::process::id()
181
+ ));
182
+ fs::create_dir_all(&root).unwrap();
183
+ root
184
+ }
185
+
186
+ #[test]
187
+ fn interface_workspace_operations_return_snapshots_and_advance_revision() {
188
+ let root = root();
189
+ let create = WorkspaceOperation {
190
+ root: root.clone(),
191
+ relative_path: "notes/todo.md".into(),
192
+ revision: 4,
193
+ };
194
+ let folder = WorkspaceOperation {
195
+ relative_path: "notes".into(),
196
+ ..create.clone()
197
+ };
198
+ let snapshot = create_folder(&folder).unwrap();
199
+ assert_eq!(snapshot.revision, 5);
200
+ let file = WorkspaceOperation {
201
+ revision: snapshot.revision,
202
+ ..create
203
+ };
204
+ let snapshot = create_file(&file).unwrap();
205
+ assert_eq!(snapshot.revision, 6);
206
+ assert!(root.join("notes/todo.md").is_file());
207
+ assert_eq!(
208
+ snapshot.path,
209
+ root.canonicalize().unwrap().display().to_string()
210
+ );
211
+ fs::remove_dir_all(root).unwrap();
212
+ }
213
+
214
+ #[test]
215
+ fn interface_workspace_rejects_parent_traversal() {
216
+ let root = root();
217
+ let operation = WorkspaceOperation {
218
+ root: root.clone(),
219
+ relative_path: "../escape.txt".into(),
220
+ revision: 0,
221
+ };
222
+ assert_eq!(
223
+ create_file(&operation).unwrap_err(),
224
+ "workspace path escapes root"
225
+ );
226
+ fs::remove_dir_all(root).unwrap();
227
+ }
228
+ }
@@ -13,3 +13,4 @@ pub mod project_detector;
13
13
  pub mod shell;
14
14
  pub mod stock;
15
15
  pub mod weather;
16
+ pub mod workspace;
@@ -480,3 +480,42 @@ fn does_not_create_empty_chat_session_until_first_message() {
480
480
  );
481
481
  assert_eq!(created.unwrap().title, "Hello Mint!");
482
482
  }
483
+
484
+ #[test]
485
+ fn test_cli_sessions_separate_and_metadata() {
486
+ let store = store("cli-sessions-separate");
487
+ let session_id = store
488
+ .create_cli_session(Some("/path/to/project"), Some("main"), Some("Rust"))
489
+ .unwrap();
490
+
491
+ assert!(session_id.starts_with("cli::"));
492
+
493
+ // Add an interaction to auto-title it
494
+ store
495
+ .add_interaction_for_chat(
496
+ &session_id,
497
+ "Fix background job bug",
498
+ "Bug fixed",
499
+ "openai",
500
+ "gpt-4",
501
+ )
502
+ .unwrap();
503
+
504
+ let sessions = store.list_chat_sessions().unwrap();
505
+ let session = sessions
506
+ .iter()
507
+ .find(|s| s.id == session_id)
508
+ .expect("Session must exist");
509
+
510
+ assert_eq!(session.title, "Fix background job bug");
511
+ assert_eq!(session.kind, "cli");
512
+ assert_eq!(session.workspace_path.as_deref(), Some("/path/to/project"));
513
+ assert_eq!(session.git_branch.as_deref(), Some("main"));
514
+ assert_eq!(session.main_language.as_deref(), Some("Rust"));
515
+ assert_eq!(session.message_count, 1);
516
+ assert!(session.total_bytes > 0);
517
+
518
+ let preview = store.get_session_preview(&session_id, 5).unwrap();
519
+ assert_eq!(preview.len(), 1);
520
+ assert_eq!(preview[0].user_text, "Fix background job bug");
521
+ }
Binary file
@@ -0,0 +1 @@
1
+ import{i as e,n as t}from"./chunk-CacB07dV.js";import{k as n,y as r}from"./index-D8D9MeRA.js";import{ct as i,ot as a}from"./config-eEDngJXO.js";var o=t((()=>{}));function s(e){let t=i(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<86400*7?`${Math.floor(n/86400)}d ago`:t.toLocaleDateString([],{month:`short`,day:`numeric`})}function c(e){return!e||e<=0?`0 B`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function l(e){if(!e)return`Global`;let t=e.replace(/[/\\]+$/,``).split(/[/\\]/);return t[t.length-1]||e}var u,d,f;t((()=>{u=e(n()),a(),o(),d=r(),f=u.memo(function({chatSessions:e,activeConversationId:t,workspacePath:n,onSelectSession:r,onDeleteSession:a,onRenameSession:o,onRefreshSessions:f,onShowToast:p}){let[m,h]=(0,u.useState)(``),[g,_]=(0,u.useState)(`workspace`),[v,y]=(0,u.useState)(`recent`),[b,x]=(0,u.useState)(null),[S,C]=(0,u.useState)(``),w=(0,u.useRef)(f);(0,u.useEffect)(()=>{w.current=f},[f]),(0,u.useEffect)(()=>{w.current?.();let e=()=>{w.current?.()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let T=(0,u.useMemo)(()=>e.filter(e=>e.kind===`cli`||e.id.startsWith(`cli`)),[e]),E=(0,u.useMemo)(()=>T.filter(e=>{if(g===`workspace`&&n&&e.workspacePath&&e.workspacePath!==n)return!1;if(!m.trim())return!0;let t=m.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(v===`messages`)return(t.messageCount||0)-(e.messageCount||0);let n=i(e.updatedAt||e.createdAt).getTime(),r=i(t.updatedAt||t.createdAt).getTime();return v===`oldest`?n-r:r-n}),[T,g,n,m,v]),D=(e,t)=>{e.stopPropagation();let n=`mint --resume ${t}`;navigator?.clipboard?.writeText?(navigator.clipboard.writeText(n),p?.(`Copied: ${n}`)):p?.(`Resume command: ${n}`)},O=(e,t)=>{e.stopPropagation(),x(t.id),C(t.title)},k=e=>{if(e&&e.preventDefault(),!b)return;let t=S.trim();t&&(o(b,t),p?.(`Session renamed`)),x(null)},A=(e,t)=>{e.stopPropagation(),a(t.id)};return(0,d.jsxs)(`div`,{className:`code-sessions-container`,children:[(0,d.jsxs)(`div`,{className:`code-sessions-header`,children:[(0,d.jsxs)(`div`,{className:`code-header-main`,children:[(0,d.jsxs)(`div`,{className:`code-header-title-row`,children:[(0,d.jsxs)(`h1`,{className:`code-header-title`,children:[(0,d.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,d.jsx)(`polyline`,{points:`4 17 10 11 4 5`}),(0,d.jsx)(`line`,{x1:`12`,y1:`19`,x2:`20`,y2:`19`})]}),(0,d.jsx)(`span`,{children:`Code sessions`})]}),(0,d.jsxs)(`span`,{className:`code-header-count`,children:[T.length,` `,T.length===1?`session`:`sessions`]})]}),(0,d.jsx)(`p`,{className:`code-header-subtitle`,children:`Terminal conversations and agent runs from your active repositories.`})]}),(0,d.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,flexWrap:`wrap`},children:[(0,d.jsxs)(`div`,{className:`code-segmented-toggle`,children:[(0,d.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${g===`workspace`?`active`:``}`,onClick:()=>_(`workspace`),title:`Show sessions from current workspace`,children:`Current Project`}),(0,d.jsx)(`button`,{type:`button`,className:`code-segmented-btn ${g===`all`?`active`:``}`,onClick:()=>_(`all`),title:`Show all sessions across all repositories`,children:`All Repositories`})]}),(0,d.jsxs)(`select`,{className:`code-sort-select`,value:v,onChange:e=>y(e.target.value),title:`Sort sessions`,children:[(0,d.jsx)(`option`,{value:`recent`,children:`Recently active`}),(0,d.jsx)(`option`,{value:`messages`,children:`Most turns`}),(0,d.jsx)(`option`,{value:`oldest`,children:`Oldest first`})]}),f&&(0,d.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:f,title:`Refresh sessions list`,style:{width:`32px`,height:`32px`},children:(0,d.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,d.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]}),(0,d.jsx)(`div`,{className:`code-controls-bar`,children:(0,d.jsxs)(`div`,{className:`code-search-box`,children:[(0,d.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,d.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,d.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,d.jsx)(`input`,{type:`text`,className:`code-search-input`,placeholder:`Filter sessions by branch, prompt, repository...`,value:m,onChange:e=>h(e.target.value)})]})}),E.length===0?(0,d.jsxs)(`div`,{className:`code-empty-terminal`,children:[(0,d.jsxs)(`div`,{className:`code-terminal-header`,children:[(0,d.jsx)(`span`,{className:`code-terminal-dot`}),(0,d.jsx)(`span`,{className:`code-terminal-dot`}),(0,d.jsx)(`span`,{className:`code-terminal-dot`}),(0,d.jsx)(`span`,{className:`code-terminal-title`,children:`mint-cli ~ interactive sessions`})]}),(0,d.jsxs)(`div`,{className:`code-terminal-body`,children:[(0,d.jsx)(`p`,{className:`code-terminal-text`,children:m?`No terminal sessions match your query.`:g===`workspace`&&T.length>0?`No sessions found in this project. Switch to "All Repositories" or start one in this directory:`:`No terminal sessions recorded yet. Launch Mint in any repository to begin:`}),(0,d.jsxs)(`div`,{className:`code-terminal-codeblock`,children:[(0,d.jsx)(`span`,{children:`$ mint`}),(0,d.jsx)(`button`,{type:`button`,className:`code-resume-chip`,onClick:()=>{navigator?.clipboard?.writeText(`mint`),p?.(`Copied: mint`)},children:`Copy`})]})]})]}):(0,d.jsx)(`div`,{className:`code-sessions-list`,children:E.map(e=>{let n=e.id===t,i=l(e.workspacePath),a=b===e.id,o=e.id.replace(/^cli::/,``),u=o===`cli`?`cli`:`cli::${o.slice(0,7)}`;return(0,d.jsxs)(`div`,{className:`code-session-row ${n?`is-active`:``}`,onClick:()=>r(e.id),children:[(0,d.jsxs)(`div`,{className:`code-row-meta`,children:[(0,d.jsxs)(`div`,{className:`code-row-meta-top`,children:[(0,d.jsx)(`span`,{className:`code-session-id`,title:e.id,children:u}),n&&(0,d.jsx)(`span`,{className:`code-active-badge`,children:`active`})]}),(0,d.jsxs)(`div`,{className:`code-row-meta-sub`,children:[e.gitBranch&&(0,d.jsxs)(`span`,{className:`code-branch-tag`,title:`Branch: ${e.gitBranch}`,children:[(0,d.jsxs)(`svg`,{width:`11`,height:`11`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.4`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.jsx)(`line`,{x1:`6`,y1:`3`,x2:`6`,y2:`15`}),(0,d.jsx)(`circle`,{cx:`18`,cy:`6`,r:`3`}),(0,d.jsx)(`circle`,{cx:`6`,cy:`18`,r:`3`}),(0,d.jsx)(`path`,{d:`M18 9a9 9 0 0 1-9 9`})]}),(0,d.jsx)(`span`,{children:e.gitBranch})]}),(0,d.jsx)(`span`,{className:`code-folder-name`,title:e.workspacePath||`Global`,children:i}),e.mainLanguage&&(0,d.jsxs)(`span`,{style:{opacity:.6,fontSize:`0.7rem`},children:[`· `,e.mainLanguage]})]})]}),(0,d.jsx)(`div`,{className:`code-row-content`,children:a?(0,d.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{display:`flex`,gap:`6px`},children:[(0,d.jsx)(`input`,{type:`text`,autoFocus:!0,value:S,onChange:e=>C(e.target.value),onKeyDown:e=>{e.key===`Enter`&&k(),e.key===`Escape`&&x(null)},style:{flex:1,background:`rgba(0, 0, 0, 0.4)`,border:`1px solid var(--border-light, rgba(255, 255, 255, 0.2))`,borderRadius:`var(--radius-xs, 6px)`,color:`#fff`,padding:`4px 8px`,fontSize:`0.88rem`,outline:`none`}}),(0,d.jsx)(`button`,{type:`button`,onClick:k,style:{background:`var(--surface-strong, #3f3f46)`,color:`#fff`,border:`none`,borderRadius:`var(--radius-xs, 6px)`,padding:`4px 10px`,fontSize:`0.78rem`,cursor:`pointer`},children:`Save`})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`div`,{className:`code-session-title`,title:e.title,children:e.title||`Untitled Session`}),(0,d.jsxs)(`div`,{className:`code-session-snippet`,children:[(0,d.jsx)(`span`,{style:{color:`var(--interactive-fg)`,opacity:.8,marginRight:`4px`},children:`>`}),(0,d.jsx)(`span`,{children:e.title||`Interactive shell`})]})]})}),(0,d.jsxs)(`div`,{className:`code-row-actions`,children:[(0,d.jsxs)(`span`,{className:`code-metric-turns`,children:[e.messageCount??0,`t · `,c(e.totalBytes)]}),(0,d.jsx)(`span`,{className:`code-metric-time`,children:s(e.updatedAt||e.createdAt)}),(0,d.jsxs)(`button`,{type:`button`,className:`code-resume-chip`,onClick:t=>D(t,e.id),title:`Copy command: mint --resume ${e.id}`,children:[(0,d.jsx)(`span`,{children:`$`}),(0,d.jsx)(`span`,{children:`resume`})]}),(0,d.jsx)(`button`,{type:`button`,className:`code-icon-btn`,onClick:t=>O(t,e),title:`Rename session`,children:(0,d.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.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,d.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,d.jsx)(`button`,{type:`button`,className:`code-icon-btn destructive`,onClick:t=>A(t,e),title:`Delete session`,children:(0,d.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,d.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,d.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,d.jsx)(`span`,{className:`code-open-arrow`,children:(0,d.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,d.jsx)(`polyline`,{points:`9 18 15 12 9 6`})})})]})]},e.id)})})]})})}))();export{f as CliSessionsView,f 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-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;grid-template-columns:minmax(140px,200px) 1fr auto;align-items:center;gap:16px;padding:13px 18px;text-decoration:none;transition:background .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:color-mix(in srgb, var(--accent,#10b981) 6%, transparent)}.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:.04em;color:var(--interactive-fg);background:color-mix(in srgb, var(--accent,#10b981) 12%, transparent);border:1px solid color-mix(in srgb, var(--accent,#10b981) 25%, transparent);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.65rem;font-weight:600;line-height:1}.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:#34d399;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-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{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-xs,6px);color:var(--text-muted,#a1a1aa);cursor:pointer;background:#ffffff0a;align-items:center;gap:5px;padding:3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;transition:all .15s;display:inline-flex}.code-resume-chip:hover{border-color:var(--border-light,#ffffff2e);color:var(--text-main,#fff);background:#ffffff14}.code-icon-btn{color:var(--text-muted,#71717a);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-main,#fff);background:#ffffff0f}.code-icon-btn.destructive:hover{color:#f87171;background:#ef44441a}.code-open-arrow{color:var(--text-muted,#52525b);align-items:center;transition:transform .15s,color .15s;display:inline-flex}.code-session-row:hover .code-open-arrow{color:var(--text-main,#fff);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{border-bottom:1px solid var(--border,#ffffff0f);background:#0000004d;align-items:center;gap:6px;padding:10px 14px;display:flex}.code-terminal-dot{background:#ffffff26;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{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);color:var(--interactive-fg);background:#00000073;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}}
@@ -0,0 +1 @@
1
+ .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;background:0 0;border:0;border-radius:4px;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:#ffffff0f}.code-review-chevron-small{color:var(--text-muted,#94a3b8);font-size:.8rem}.code-review-branch-stat-add{color:#22c55e;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-branch-stat-del{color:#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{width:28px;height:28px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;transition:all .15s;display:inline-flex}.code-review-icon-btn:hover,.code-review-close-btn:hover{color:#f1f5f9;background:#ffffff14}.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;background:0 0;border:0;border-radius:4px;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:#ffffff0a}.code-review-banner{background:#ffffff09;border:1px solid #ffffff12;border-radius:10px;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:#cbd5e1;align-items:center;gap:8px;font-size:.78rem;font-weight:500;display:flex}.code-review-banner-info-icon{color:#818cf8;flex-shrink:0}.code-review-pagination{align-items:center;gap:6px;display:flex}.code-review-page-arrow{width:24px;height:24px;color:var(--text-muted,#94a3b8);cursor:pointer;background:#ffffff0d;border:1px solid #ffffff14;border-radius:5px;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){color:#fff;background:#ffffff1f}.code-review-page-arrow:disabled{opacity:.3;cursor:not-allowed}.code-review-split{border-top:1px solid #ffffff0f;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:#ffffff14;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:#818cf8;width:2px;box-shadow:0 0 8px #818cf899}.code-review-resizer-handle{z-index:2;background:#ffffff2e;border-radius:2px;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:#a5b4fc;height:38px;box-shadow:0 0 6px #a5b4fc80}.code-review-resizer.is-collapsed{cursor:pointer;flex:0 0 8px;margin:0}.code-review-resizer.is-collapsed .code-review-resizer-line{background:#ffffff24;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{z-index:2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#ffffff05;border-bottom:1px solid #ffffff0f;align-items:center;gap:8px;padding:8px 16px;font-size:.78rem;display:flex;position:sticky;top:0}.code-review-file-bar-status{border-radius: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:#38bdf8;background:#38bdf81f}.code-review-file-bar-status.is-created{color:#22c55e;background:#22c55e1f}.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-stat-add{color:#22c55e;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-file-bar-stat-del{color:#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:#10b9811f;border-left:2px solid #10b981}.code-review-line.is-del{background:#ef44441f;border-left:2px solid #ef4444}.code-review-gutter{text-align:right;color:#64748b;-webkit-user-select:none;user-select:none;flex-shrink:0;width:38px;padding-right:12px}.code-review-line.is-add .code-review-gutter{color:#34d399}.code-review-line.is-del .code-review-gutter{color:#f87171}.code-review-sign{text-align:center;color:#64748b;-webkit-user-select:none;user-select:none;flex-shrink:0;width:14px}.code-review-line.is-add .code-review-sign{color:#10b981}.code-review-line.is-del .code-review-sign{color:#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-line.is-add .code-review-code-text{color:#d1fae5}.code-review-line.is-del .code-review-code-text{color:#fee2e2}.code-review-empty-diff,.code-review-empty-state{color:var(--text-muted,#94a3b8);padding:24px;font-size:.8rem}.code-review-tree-pane{background:#00000038;border-left:1px solid #ffffff12;flex-direction:column;flex:none;min-width:0;display:flex;overflow:hidden}.code-review-tree-collapse-btn{width:22px;height:22px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:4px;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{color:#f1f5f9;background:#ffffff14}.code-review-icon-btn.is-active{color:#818cf8;background:#818cf81f}.code-review-search-wrap{border-bottom:1px solid #ffffff0f;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{width:100%;color:var(--text-main,#f1f5f9);background:#ffffff0a;border:1px solid #ffffff14;border-radius:8px;outline:none;padding:5px 10px;font-size:.76rem;transition:border-color .15s,background .15s}.code-review-search-input:focus{background:#ffffff0f;border-color:#ffffff2e}.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{color:#cbd5e1;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;width:100%;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{color:#fff;background:#ffffff0a}.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:#ea580c;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{color:#cbd5e1;cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;width:100%;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{color:#f8fafc;background:#ffffff0a}.code-review-tree-file.is-selected{color:#fff;background:#ffffff14;border-color:#ffffff21;box-shadow:0 1px 4px #0000004d}.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: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:#38bdf8;background:#38bdf81a}.code-review-file-status-icon.is-created{color:#22c55e;background:#22c55e1a}.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{color:var(--text-main,#f1f5f9);cursor:pointer;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:6px;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:#ffffff1a;border-color:#fff3}.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(--accent,#6366f1);flex-shrink:0}.code-review-branch-group .git-branch-dirty{background:#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{color:#cbd5e1;cursor:pointer;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:8px;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{color:#fff;background:#ffffff1f}.code-review-scope-group{align-items:center;gap:4px;display:flex}.code-review-scope-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:#ffffff0a;border:1px solid #ffffff14;border-radius:5px;padding:3px 8px;font-size:.74rem;transition:all .15s}.code-review-scope-btn:hover{color:#fff;background:#ffffff14}.code-review-scope-btn.is-active{color:#818cf8;background:#818cf829;border-color:#818cf859;font-weight:600}