@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
@@ -21,6 +21,7 @@ mod plugins_cli;
21
21
  mod setup;
22
22
  mod skills;
23
23
  mod subagent_wizard;
24
+ pub(crate) mod terminal_theme;
24
25
  mod updater;
25
26
 
26
27
  pub use commands::Command;
@@ -29,12 +30,13 @@ pub use interactive::{
29
30
  run_interactive_chat, run_interactive_chat_with_options,
30
31
  };
31
32
 
32
- pub const RESET: &str = "\x1b[0m";
33
- pub const MINT: &str = "\x1b[32m";
34
- pub const BLUE: &str = "\x1b[38;2;78;201;216m";
35
- pub const DIM: &str = "\x1b[90m";
36
- pub const ERROR: &str = "\x1b[31m";
37
- pub const WARN: &str = "\x1b[33m";
33
+ pub const RESET: &str = terminal_theme::ANSI_RESET;
34
+ pub const BOLD: &str = terminal_theme::ANSI_BOLD;
35
+ pub const MINT: &str = terminal_theme::ANSI_ACCENT;
36
+ pub const BLUE: &str = terminal_theme::ANSI_BLUE;
37
+ pub const DIM: &str = terminal_theme::ANSI_MUTED;
38
+ pub const ERROR: &str = terminal_theme::ANSI_ERROR;
39
+ pub const WARN: &str = terminal_theme::ANSI_WARNING;
38
40
 
39
41
  pub(crate) async fn run_code_agent_with_saved_image(
40
42
  task: &str,
@@ -46,16 +48,29 @@ pub(crate) async fn run_code_agent_with_saved_image(
46
48
  ) -> Result<(Vec<String>, Option<String>)> {
47
49
  let sent_image = image_data_uri.clone();
48
50
  let sent_video = video_data_uri.clone();
51
+ let tui_handle = options.tui.clone();
49
52
  // Follow-up messages the user typed into the queueing box while this
50
53
  // turn was still running (see `agent::run_code_agent_with_options`)
51
54
  // land here; the caller is responsible for dispatching them. On error
52
55
  // the queue is dropped along with the interrupted turn.
53
56
  let queue = std::sync::Arc::new(std::sync::Mutex::new(Vec::new()));
54
- // The box's leftover, not-yet-submitted text (typed but no Enter yet) at
55
- // the moment the turn ended — same idea as `queue` above, but for the one
56
- // partial entry that was never confirmed, so the caller can hand it back
57
- // as the next prompt's starting text instead of dropping it silently.
58
57
  let draft = std::sync::Arc::new(std::sync::Mutex::new(None));
58
+ let target_chat_id = options
59
+ .chat_id
60
+ .clone()
61
+ .unwrap_or_else(|| mint_core::CHAT_CLI_ID.to_string());
62
+ if mint_core::is_cli_chat_id(&target_chat_id)
63
+ && let Ok(memory) = mint_core::MemoryStore::open_default()
64
+ {
65
+ let branch = mint_core::git::get_current_branch(current_dir);
66
+ let lang = mint_core::git::detect_project_language(current_dir);
67
+ let _ = memory.register_cli_session(
68
+ &target_chat_id,
69
+ Some(&current_dir.to_string_lossy()),
70
+ branch.as_deref(),
71
+ lang.as_deref(),
72
+ );
73
+ }
59
74
  let result = agent::run_code_agent_with_options(
60
75
  task,
61
76
  current_dir,
@@ -68,16 +83,12 @@ pub(crate) async fn run_code_agent_with_saved_image(
68
83
  )
69
84
  .await;
70
85
  result?;
71
- // This turn just committed a row to the workspace-scoped "cli" chat_id
72
- // (see `scoped_chat_id`) — raise live_sync's watermark past it so the
73
- // next poll tick doesn't mistake the user's own just-sent message for
74
- // one that arrived from another surface (web/desktop).
86
+ // This turn just committed a row to the session's chat_id
87
+ // — raise live_sync's watermark past it so the next poll tick doesn't mistake
88
+ // the user's own just-sent message for one that arrived from another surface.
75
89
  if let Ok(memory) = mint_core::MemoryStore::open_default()
76
90
  && let Ok(rows) = memory.recent_interactions_for_chat(
77
- &mint_core::scoped_chat_id(
78
- mint_core::CHAT_CLI_ID,
79
- Some(&current_dir.to_string_lossy()),
80
- ),
91
+ &mint_core::scoped_chat_id(&target_chat_id, Some(&current_dir.to_string_lossy())),
81
92
  1,
82
93
  )
83
94
  && let Some(row) = rows.first()
@@ -85,8 +96,8 @@ pub(crate) async fn run_code_agent_with_saved_image(
85
96
  mint_core::live_sync::note_own_interaction(row.id);
86
97
  }
87
98
  // Save any attached images and videos that were sent with the task
88
- image::save_sent_image_after_send(sent_image.as_deref(), task);
89
- image::save_sent_image_after_send(sent_video.as_deref(), task);
99
+ image::save_sent_image_after_send(sent_image.as_deref(), task, tui_handle.as_ref());
100
+ image::save_sent_image_after_send(sent_video.as_deref(), task, tui_handle.as_ref());
90
101
  let queued = queue
91
102
  .lock()
92
103
  .map(|mut q| std::mem::take(&mut *q))
@@ -160,6 +171,8 @@ pub(crate) async fn run_oneshot_agent_task(
160
171
  plan_mode,
161
172
  queueing: false,
162
173
  pinned_mcp_server,
174
+ chat_id: None,
175
+ tui: None,
163
176
  };
164
177
 
165
178
  let queue = std::sync::Arc::new(std::sync::Mutex::new(Vec::new()));
@@ -199,7 +212,7 @@ pub(crate) async fn run_oneshot_agent_task(
199
212
  mint_core::live_sync::note_own_interaction(row.id);
200
213
  }
201
214
 
202
- image::save_sent_image_after_send(image_data_uri.as_deref(), task);
215
+ image::save_sent_image_after_send(image_data_uri.as_deref(), task, None);
203
216
  Ok(())
204
217
  }
205
218
 
@@ -250,10 +263,22 @@ pub struct Cli {
250
263
  #[arg(long, global = true)]
251
264
  pub plan: bool,
252
265
 
266
+ /// Explicitly use the full-screen interactive chat interface
267
+ #[arg(long, global = true, conflicts_with = "classic")]
268
+ pub tui: bool,
269
+
270
+ /// Use the classic scrolling interactive interface
271
+ #[arg(long, global = true, conflicts_with = "tui")]
272
+ pub classic: bool,
273
+
253
274
  /// Attach an image file to the prompt
254
275
  #[arg(long, global = true)]
255
276
  pub image: Option<PathBuf>,
256
277
 
278
+ /// Resume a previous conversation session, or open the interactive session picker
279
+ #[arg(short = 'r', long, global = true)]
280
+ pub resume: Option<Option<String>>,
281
+
257
282
  #[command(subcommand)]
258
283
  pub command: Option<Command>,
259
284
 
@@ -266,7 +291,7 @@ pub struct Cli {
266
291
  fn install_panic_hook() {
267
292
  let default_hook = std::panic::take_hook();
268
293
  std::panic::set_hook(Box::new(move |info| {
269
- let _ = crossterm::terminal::disable_raw_mode();
294
+ interactive::restore_terminal();
270
295
  log_panic_to_file(&info.to_string());
271
296
  default_hook(info);
272
297
  }));
@@ -327,7 +352,22 @@ async fn main() -> Result<()> {
327
352
  } else {
328
353
  mint_core::channels::start_channels();
329
354
  mint_core::start_cron_scheduler();
330
- run_interactive_chat_with_options(cli.model, cli.fast, cli.plan).await?;
355
+ let resume_id = if let Some(ref r_opt) = cli.resume {
356
+ match r_opt {
357
+ Some(id) => Some(id.clone()),
358
+ None => Some("__prompt__".to_string()),
359
+ }
360
+ } else {
361
+ None
362
+ };
363
+ interactive::run_interactive_chat_with_session(
364
+ cli.model,
365
+ cli.fast,
366
+ cli.plan,
367
+ resume_id,
368
+ !cli.classic,
369
+ )
370
+ .await?;
331
371
  }
332
372
  }
333
373
  Some(cmd) => {
@@ -361,6 +401,27 @@ mod cli_tests {
361
401
  assert_eq!(cli.prompt, vec!["explain this function"]);
362
402
  }
363
403
 
404
+ #[test]
405
+ fn parse_tui_flag() {
406
+ let cli = Cli::try_parse_from(["mint", "--tui"]).unwrap();
407
+ assert!(cli.tui);
408
+ assert!(!cli.classic);
409
+ assert!(cli.command.is_none());
410
+ assert!(cli.prompt.is_empty());
411
+ }
412
+
413
+ #[test]
414
+ fn parse_classic_flag() {
415
+ let cli = Cli::try_parse_from(["mint", "--classic"]).unwrap();
416
+ assert!(cli.classic);
417
+ assert!(!cli.tui);
418
+ }
419
+
420
+ #[test]
421
+ fn tui_and_classic_conflict() {
422
+ assert!(Cli::try_parse_from(["mint", "--tui", "--classic"]).is_err());
423
+ }
424
+
364
425
  #[test]
365
426
  fn parse_oneshot_unquoted_prompt_words() {
366
427
  let cli = Cli::try_parse_from(["mint", "fix", "all", "tests"]).unwrap();
@@ -146,6 +146,11 @@ pub(crate) fn hard_wrap(text: &str, max_width: usize) -> Vec<String> {
146
146
  }
147
147
 
148
148
  pub fn render_markdown_table(table_lines: &[String]) -> String {
149
+ let (term_width, _) = terminal_size_or_default();
150
+ render_markdown_table_with_width(table_lines, term_width)
151
+ }
152
+
153
+ fn render_markdown_table_with_width(table_lines: &[String], term_width: u16) -> String {
149
154
  let mut rows: Vec<Vec<String>> = Vec::new();
150
155
  for line in table_lines {
151
156
  let trimmed = line.trim();
@@ -229,7 +234,6 @@ pub fn render_markdown_table(table_lines: &[String]) -> String {
229
234
  // that no longer fits gets word-wrapped below rather than left to overflow
230
235
  // and break the border characters (see `wrap_cell_text`).
231
236
  if num_cols > 0 {
232
- let (term_width, _) = terminal_size_or_default();
233
237
  // Each column contributes `width + 2` (one space of padding either
234
238
  // side) plus one border character; there's one extra border character
235
239
  // closing the row.
@@ -310,7 +314,10 @@ pub fn render_markdown_table(table_lines: &[String]) -> String {
310
314
  rendered.push_str(&render_wrapped_row(
311
315
  header,
312
316
  &col_widths,
313
- Some(("\x1b[1;36m", "\x1b[0m")),
317
+ Some((
318
+ crate::terminal_theme::ANSI_BLUE_BOLD,
319
+ crate::terminal_theme::ANSI_RESET,
320
+ )),
314
321
  ));
315
322
  rendered.push_str(&draw_border("├", "┼", "┤", "─", &col_widths));
316
323
  }
@@ -368,10 +375,10 @@ mod table_tests {
368
375
  "| --- | --- |",
369
376
  &format!("| x | {long_cell} |"),
370
377
  ]);
371
- let rendered = render_markdown_table(&table);
378
+ let rendered = render_markdown_table_with_width(&table, 80);
372
379
  assert_borders_aligned(&rendered);
373
- // Falls back to 80 columns when no real terminal is attached (test
374
- // harness has no TTY), so every physical line must fit within that.
380
+ // The test pins the renderer to 80 columns so its result does not
381
+ // depend on whether the test process inherited a real TTY.
375
382
  for line in rendered.lines() {
376
383
  assert!(
377
384
  unicode_width(line) <= 80,
@@ -1,3 +1,5 @@
1
+ const ANSI_BLUE: &str = crate::terminal_theme::ANSI_BLUE;
2
+
1
3
  use anyhow::{Result, bail};
2
4
  use crossterm::event::{self, Event, KeyCode};
3
5
  use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
@@ -92,9 +94,9 @@ async fn fetch_live_models_with_notice(api_key: &str) -> Vec<String> {
92
94
  pub async fn run() -> Result<()> {
93
95
  let mut config = load_config()?;
94
96
 
95
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
97
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
96
98
  println!("\x1b[32m Mint CLI Onboarding Wizard\x1b[0m");
97
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
99
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
98
100
  println!("Welcome to Mint! Let's get your workspace configured.");
99
101
  println!();
100
102
 
@@ -419,7 +421,7 @@ pub async fn run() -> Result<()> {
419
421
 
420
422
  // Anthropic
421
423
  if is_selected("anthropic", &services) {
422
- println!("\n\x1b[36m--- Anthropic (Claude) API ---\x1b[0m");
424
+ println!("\n{ANSI_BLUE}--- Anthropic (Claude) API ---\x1b[0m");
423
425
  config.anthropic_api_key =
424
426
  prompt_sensitive("Anthropic API Key", &config.anthropic_api_key)?;
425
427
  let anthropic_models = fetch_models_with_notice(&config, "anthropic").await;
@@ -435,7 +437,7 @@ pub async fn run() -> Result<()> {
435
437
 
436
438
  // OpenAI
437
439
  if is_selected("openai", &services) {
438
- println!("\n\x1b[36m--- OpenAI API ---\x1b[0m");
440
+ println!("\n{ANSI_BLUE}--- OpenAI API ---\x1b[0m");
439
441
  config.openai_api_key = prompt_sensitive("OpenAI API Key", &config.openai_api_key)?;
440
442
  let openai_models = fetch_models_with_notice(&config, "openai").await;
441
443
  config.openai_model = prompt_select_or_custom(
@@ -450,7 +452,7 @@ pub async fn run() -> Result<()> {
450
452
 
451
453
  // OpenRouter
452
454
  if is_selected("openrouter", &services) {
453
- println!("\n\x1b[36m--- OpenRouter API ---\x1b[0m");
455
+ println!("\n{ANSI_BLUE}--- OpenRouter API ---\x1b[0m");
454
456
  println!(
455
457
  "\x1b[90mOpenRouter model uses a provider/model slug, for example: openai/gpt-4o-mini, anthropic/claude-3.5-sonnet, google/gemini-2.5-flash, meta-llama/llama-3.3-70b-instruct, mistralai/mistral-large\x1b[0m"
456
458
  );
@@ -469,7 +471,7 @@ pub async fn run() -> Result<()> {
469
471
 
470
472
  // DeepSeek
471
473
  if is_selected("deepseek", &services) {
472
- println!("\n\x1b[36m--- DeepSeek API ---\x1b[0m");
474
+ println!("\n{ANSI_BLUE}--- DeepSeek API ---\x1b[0m");
473
475
  println!(
474
476
  "\x1b[90mDeepSeek uses OpenAI-compatible model names. Prefer deepseek-v4-flash or deepseek-v4-pro; deepseek-chat and deepseek-reasoner are compatibility aliases scheduled for deprecation on 2026-07-24.\x1b[0m"
475
477
  );
@@ -487,7 +489,7 @@ pub async fn run() -> Result<()> {
487
489
 
488
490
  // Hugging Face
489
491
  if is_selected("huggingface", &services) {
490
- println!("\n\x1b[36m--- Hugging Face API ---\x1b[0m");
492
+ println!("\n{ANSI_BLUE}--- Hugging Face API ---\x1b[0m");
491
493
  config.hf_api_key = prompt_sensitive("Hugging Face API Key", &config.hf_api_key)?;
492
494
  config.hf_model = prompt_select_or_custom(
493
495
  "Hugging Face Model",
@@ -501,7 +503,7 @@ pub async fn run() -> Result<()> {
501
503
 
502
504
  // Local OpenAI
503
505
  if is_selected("local_openai", &services) {
504
- println!("\n\x1b[36m--- Local OpenAI (e.g. LM Studio) ---\x1b[0m");
506
+ println!("\n{ANSI_BLUE}--- Local OpenAI (e.g. LM Studio) ---\x1b[0m");
505
507
  config.local_api_base_url =
506
508
  prompt_input("Local OpenAI Base URL", Some(&config.local_api_base_url))?;
507
509
  config.local_model_name = prompt_input("Local Model Name", Some(&config.local_model_name))?;
@@ -511,7 +513,7 @@ pub async fn run() -> Result<()> {
511
513
 
512
514
  // Ollama
513
515
  if is_selected("ollama", &services) {
514
- println!("\n\x1b[36m--- Ollama ---\x1b[0m");
516
+ println!("\n{ANSI_BLUE}--- Ollama ---\x1b[0m");
515
517
  config.ollama_host = prompt_input("Ollama Host", Some(&config.ollama_host))?;
516
518
  // Get the server up first, so the model list below can actually see it.
517
519
  ensure_ollama_serving(&config.ollama_host);
@@ -540,7 +542,7 @@ pub async fn run() -> Result<()> {
540
542
 
541
543
  // Google Search
542
544
  if is_selected("google_search", &services) {
543
- println!("\n\x1b[36m--- Google Search API ---\x1b[0m");
545
+ println!("\n{ANSI_BLUE}--- Google Search API ---\x1b[0m");
544
546
  let current_key = config
545
547
  .extra
546
548
  .get("googleSearchApiKey")
@@ -573,7 +575,7 @@ pub async fn run() -> Result<()> {
573
575
 
574
576
  // Brave Search
575
577
  if is_selected("brave_search", &services) {
576
- println!("\n\x1b[36m--- Brave Search API ---\x1b[0m");
578
+ println!("\n{ANSI_BLUE}--- Brave Search API ---\x1b[0m");
577
579
  let current_key = config
578
580
  .extra
579
581
  .get("braveSearchApiKey")
@@ -593,7 +595,7 @@ pub async fn run() -> Result<()> {
593
595
 
594
596
  // SearXNG
595
597
  if is_selected("searxng", &services) {
596
- println!("\n\x1b[36m--- SearXNG (self-hosted) ---\x1b[0m");
598
+ println!("\n{ANSI_BLUE}--- SearXNG (self-hosted) ---\x1b[0m");
597
599
  let current_url = config
598
600
  .extra
599
601
  .get("searxngBaseUrl")
@@ -645,7 +647,7 @@ pub async fn run() -> Result<()> {
645
647
  .collect();
646
648
 
647
649
  let provider = if configured.len() > 1 {
648
- println!("\n\x1b[36m--- Preferred Search Provider ---\x1b[0m");
650
+ println!("\n{ANSI_BLUE}--- Preferred Search Provider ---\x1b[0m");
649
651
  let current = config
650
652
  .extra
651
653
  .get("searchProvider")
@@ -681,7 +683,7 @@ pub async fn run() -> Result<()> {
681
683
 
682
684
  // Telegram Bot
683
685
  if is_selected("telegram", &services) {
684
- println!("\n\x1b[36m--- Telegram Bot Bridge ---\x1b[0m");
686
+ println!("\n{ANSI_BLUE}--- Telegram Bot Bridge ---\x1b[0m");
685
687
  let current_token = config
686
688
  .extra
687
689
  .get("telegramBotToken")
@@ -705,7 +707,7 @@ pub async fn run() -> Result<()> {
705
707
 
706
708
  // Discord Bot
707
709
  if is_selected("discord", &services) {
708
- println!("\n\x1b[36m--- Discord Bot Bridge ---\x1b[0m");
710
+ println!("\n{ANSI_BLUE}--- Discord Bot Bridge ---\x1b[0m");
709
711
  let current_token = config
710
712
  .extra
711
713
  .get("discordBotToken")
@@ -739,7 +741,7 @@ pub async fn run() -> Result<()> {
739
741
 
740
742
  // Slack Bot
741
743
  if is_selected("slack", &services) {
742
- println!("\n\x1b[36m--- Slack Bot Bridge ---\x1b[0m");
744
+ println!("\n{ANSI_BLUE}--- Slack Bot Bridge ---\x1b[0m");
743
745
  let current_token = config
744
746
  .extra
745
747
  .get("slackBotToken")
@@ -773,7 +775,7 @@ pub async fn run() -> Result<()> {
773
775
 
774
776
  // LINE Bot
775
777
  if is_selected("line", &services) {
776
- println!("\n\x1b[36m--- LINE Bot Bridge ---\x1b[0m");
778
+ println!("\n{ANSI_BLUE}--- LINE Bot Bridge ---\x1b[0m");
777
779
  let current_token = config
778
780
  .extra
779
781
  .get("lineChannelAccessToken")
@@ -807,7 +809,7 @@ pub async fn run() -> Result<()> {
807
809
 
808
810
  // WhatsApp Cloud
809
811
  if is_selected("whatsapp", &services) {
810
- println!("\n\x1b[36m--- WhatsApp Cloud Bridge ---\x1b[0m");
812
+ println!("\n{ANSI_BLUE}--- WhatsApp Cloud Bridge ---\x1b[0m");
811
813
  let current_token = config
812
814
  .extra
813
815
  .get("whatsappCloudAccessToken")
@@ -863,7 +865,7 @@ pub async fn run() -> Result<()> {
863
865
  // has no official bot API, so unlike the other bridges here Mint is the
864
866
  // one polling a REST endpoint rather than receiving a webhook/socket push)
865
867
  if is_selected("signal", &services) {
866
- println!("\n\x1b[36m--- Signal Bridge ---\x1b[0m");
868
+ println!("\n{ANSI_BLUE}--- Signal Bridge ---\x1b[0m");
867
869
  println!(
868
870
  "Needs a self-hosted signal-cli-rest-api instance with a number already \
869
871
  linked/registered: https://github.com/bbernhard/signal-cli-rest-api"
@@ -906,7 +908,7 @@ pub async fn run() -> Result<()> {
906
908
  // plugin — see `mint gmail auth` — rather than asking for separate
907
909
  // IMAP/SMTP credentials)
908
910
  if is_selected("email", &services) {
909
- println!("\n\x1b[36m--- Email Bridge (via Gmail) ---\x1b[0m");
911
+ println!("\n{ANSI_BLUE}--- Email Bridge (via Gmail) ---\x1b[0m");
910
912
  println!(
911
913
  "Reuses the same Gmail OAuth connection as the `gmail` plugin. Needs a \
912
914
  Google Cloud OAuth client (Client ID/Secret) — see \
@@ -960,7 +962,7 @@ pub async fn run() -> Result<()> {
960
962
 
961
963
  // NanoBanana (Gemini Images)
962
964
  if is_selected("img_nanobanana", &services) {
963
- println!("\n\x1b[36m--- Google NanoBanana (Gemini Images) ---\x1b[0m");
965
+ println!("\n{ANSI_BLUE}--- Google NanoBanana (Gemini Images) ---\x1b[0m");
964
966
  println!(
965
967
  "\x1b[90mUses the same Gemini API key as Step 1. Select the image generation model.\x1b[0m"
966
968
  );
@@ -975,7 +977,7 @@ pub async fn run() -> Result<()> {
975
977
 
976
978
  // DALL·E
977
979
  if is_selected("img_dalle", &services) {
978
- println!("\n\x1b[36m--- OpenAI DALL·E ---\x1b[0m");
980
+ println!("\n{ANSI_BLUE}--- OpenAI DALL·E ---\x1b[0m");
979
981
  println!(
980
982
  "\x1b[90mUses the same OpenAI API key. DALL·E 3 supports only 1 image per request; DALL·E 2 supports up to 10.\x1b[0m"
981
983
  );
@@ -990,7 +992,7 @@ pub async fn run() -> Result<()> {
990
992
 
991
993
  // Stability AI
992
994
  if is_selected("img_stability", &services) {
993
- println!("\n\x1b[36m--- Stability AI ---\x1b[0m");
995
+ println!("\n{ANSI_BLUE}--- Stability AI ---\x1b[0m");
994
996
  println!(
995
997
  "\x1b[90mGet your API key at https://platform.stability.ai/. Supports SD3.5 Large, SD3 Medium, and Stable Image Core.\x1b[0m"
996
998
  );
@@ -1009,7 +1011,7 @@ pub async fn run() -> Result<()> {
1009
1011
 
1010
1012
  // Ideogram
1011
1013
  if is_selected("img_ideogram", &services) {
1012
- println!("\n\x1b[36m--- Ideogram ---\x1b[0m");
1014
+ println!("\n{ANSI_BLUE}--- Ideogram ---\x1b[0m");
1013
1015
  println!(
1014
1016
  "\x1b[90mGet your API key at https://ideogram.ai/api. Supports V_3, V_2, and V_2_TURBO.\x1b[0m"
1015
1017
  );
@@ -1027,7 +1029,7 @@ pub async fn run() -> Result<()> {
1027
1029
 
1028
1030
  // Replicate
1029
1031
  if is_selected("img_replicate", &services) {
1030
- println!("\n\x1b[36m--- Replicate ---\x1b[0m");
1032
+ println!("\n{ANSI_BLUE}--- Replicate ---\x1b[0m");
1031
1033
  println!(
1032
1034
  "\x1b[90mGet your API token at https://replicate.com/account/api-tokens. Works with FLUX, SDXL, and any public image model.\x1b[0m"
1033
1035
  );
@@ -1046,7 +1048,7 @@ pub async fn run() -> Result<()> {
1046
1048
 
1047
1049
  // Black Forest Labs (FLUX API)
1048
1050
  if is_selected("img_bfl", &services) {
1049
- println!("\n\x1b[36m--- Black Forest Labs (FLUX API) ---\x1b[0m");
1051
+ println!("\n{ANSI_BLUE}--- Black Forest Labs (FLUX API) ---\x1b[0m");
1050
1052
  println!(
1051
1053
  "\x1b[90mGet your API key at https://api.bfl.ml. Supports flux-pro-1.1, flux-pro-1.1-ultra, flux-dev, and flux-pro-1.0-fill.\x1b[0m"
1052
1054
  );
@@ -1064,7 +1066,7 @@ pub async fn run() -> Result<()> {
1064
1066
 
1065
1067
  // Google Veo (Gemini Videos)
1066
1068
  if is_selected("vid_veo", &services) {
1067
- println!("\n\x1b[36m--- Google Veo (Gemini Videos) ---\x1b[0m");
1069
+ println!("\n{ANSI_BLUE}--- Google Veo (Gemini Videos) ---\x1b[0m");
1068
1070
  println!(
1069
1071
  "\x1b[90mUses the same Gemini API key as Step 1. Select the video generation model.\x1b[0m"
1070
1072
  );
@@ -1099,7 +1101,7 @@ pub async fn run() -> Result<()> {
1099
1101
  }
1100
1102
 
1101
1103
  if is_selected("gemini_live", &services) {
1102
- println!("\n\x1b[36m--- Realtime Live Model (Gemini Live) ---\x1b[0m");
1104
+ println!("\n{ANSI_BLUE}--- Realtime Live Model (Gemini Live) ---\x1b[0m");
1103
1105
  println!(
1104
1106
  "\x1b[90mUses the same Gemini API key as Step 1. Select the model used for realtime voice conversations.\x1b[0m"
1105
1107
  );
@@ -1152,7 +1154,7 @@ fn print_services(services: &[OnboardService], cursor: usize) {
1152
1154
  };
1153
1155
  if i == cursor {
1154
1156
  println!(
1155
- " \x1b[36m❯\x1b[0m {} \x1b[36m{}\x1b[0m",
1157
+ " {ANSI_BLUE}❯\x1b[0m {} {ANSI_BLUE}{}\x1b[0m",
1156
1158
  checkbox, svc.name
1157
1159
  );
1158
1160
  } else {
@@ -1503,7 +1505,7 @@ fn ensure_ollama_serving(host: &str) {
1503
1505
  pub(crate) fn print_select_options(options: &[String], cursor: usize) {
1504
1506
  for (i, option) in options.iter().enumerate() {
1505
1507
  if i == cursor {
1506
- println!(" \x1b[36m❯\x1b[0m \x1b[36m{}\x1b[0m", option);
1508
+ println!(" {ANSI_BLUE}❯\x1b[0m {ANSI_BLUE}{}\x1b[0m", option);
1507
1509
  } else {
1508
1510
  println!(" {}", option);
1509
1511
  }
@@ -2,6 +2,9 @@
2
2
  //! Provides commands for listing, enabling/disabling, configuring API credentials,
3
3
  //! and managing OAuth sign-in for all Built-in Plugins.
4
4
 
5
+ const ANSI_BLUE: &str = crate::terminal_theme::ANSI_BLUE;
6
+ const ANSI_BLUE_BOLD: &str = crate::terminal_theme::ANSI_BLUE_BOLD;
7
+
5
8
  use anyhow::{Result, anyhow};
6
9
  use clap::Subcommand;
7
10
  use crossterm::event::{self, Event, KeyCode};
@@ -222,7 +225,7 @@ pub fn list_plugins(config: &MintConfig) -> Result<()> {
222
225
  if let Some(st) = matched {
223
226
  if st.connected {
224
227
  format!(
225
- "\x1b[36mConnected ({})\x1b[0m",
228
+ "{ANSI_BLUE}Connected ({})\x1b[0m",
226
229
  st.account_email.as_deref().unwrap_or("Yes")
227
230
  )
228
231
  } else {
@@ -342,7 +345,7 @@ async fn login_plugin_oauth(provider: &str) -> Result<()> {
342
345
  let (auth_url, _state) = build_auth_url(provider, redirect_uri, client_id.as_deref())
343
346
  .ok_or_else(|| anyhow!("Invalid OAuth provider: {provider}"))?;
344
347
 
345
- println!("\x1b[1;36m🔑 Mint OAuth Sign-In Authorization\x1b[0m");
348
+ println!("{ANSI_BLUE_BOLD}🔑 Mint OAuth Sign-In Authorization\x1b[0m");
346
349
  println!(
347
350
  " Opening browser for provider: \x1b[32m{}\x1b[0m",
348
351
  provider
@@ -532,7 +535,7 @@ pub async fn run_interactive_plugins_wizard(config: &mut MintConfig) -> Result<(
532
535
  for (plugin, enabled) in &items {
533
536
  if *enabled {
534
537
  let title = format!(
535
- "\x1b[1;36m⚙️ Authentication Setup for {}\x1b[0m",
538
+ "{ANSI_BLUE_BOLD}⚙️ Authentication Setup for {}\x1b[0m",
536
539
  plugin.name
537
540
  );
538
541
  if plugin.is_oauth {
@@ -627,7 +630,7 @@ fn prompt_select_option_menu(title: &str, options: &[&str]) -> Result<usize> {
627
630
  fn print_select_options_list(options: &[&str], cursor: usize) {
628
631
  for (i, option) in options.iter().enumerate() {
629
632
  if i == cursor {
630
- println!(" \x1b[36m❯\x1b[0m \x1b[36m{}\x1b[0m", option);
633
+ println!(" {ANSI_BLUE}❯\x1b[0m {ANSI_BLUE}{}\x1b[0m", option);
631
634
  } else {
632
635
  println!(" {}", option);
633
636
  }
@@ -734,7 +737,7 @@ fn print_plugin_checkbox_items(items: &[(&BuiltinPluginInfo, bool)], cursor: usi
734
737
  };
735
738
  if i == cursor {
736
739
  println!(
737
- " \x1b[36m❯\x1b[0m {} \x1b[36m{:<18}\x1b[0m \x1b[90m({})\x1b[0m",
740
+ " {ANSI_BLUE}❯\x1b[0m {} {ANSI_BLUE}{:<18}\x1b[0m \x1b[90m({})\x1b[0m",
738
741
  checkbox, plugin.name, plugin.description
739
742
  );
740
743
  } else {
@@ -1,3 +1,5 @@
1
+ const ANSI_BLUE: &str = crate::terminal_theme::ANSI_BLUE;
2
+
1
3
  use anyhow::Result;
2
4
  use crossterm::event::{self, Event, KeyCode};
3
5
  use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
@@ -599,7 +601,7 @@ fn print_options(options: &[ToolOption], cursor: usize) {
599
601
  };
600
602
  if i == cursor {
601
603
  println!(
602
- " \x1b[36m❯\x1b[0m {} \x1b[36m{}\x1b[0m",
604
+ " {ANSI_BLUE}❯\x1b[0m {} {ANSI_BLUE}{}\x1b[0m",
603
605
  checkbox, opt.name
604
606
  );
605
607
  } else {
@@ -612,7 +614,7 @@ fn print_options(options: &[ToolOption], cursor: usize) {
612
614
  fn print_run_options(options: &[ToolOption], cursor: usize) {
613
615
  for (i, opt) in options.iter().enumerate() {
614
616
  if i == cursor {
615
- println!(" \x1b[36m❯\x1b[0m \x1b[36m{}\x1b[0m", opt.name);
617
+ println!(" {ANSI_BLUE}❯\x1b[0m {ANSI_BLUE}{}\x1b[0m", opt.name);
616
618
  } else {
617
619
  println!(" {}", opt.name);
618
620
  }
@@ -622,9 +624,9 @@ fn print_run_options(options: &[ToolOption], cursor: usize) {
622
624
 
623
625
  fn redraw_phase_1(options: &[ToolOption], cursor: usize) {
624
626
  print!("\x1b[2J\x1b[1;1H");
625
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
627
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
626
628
  println!("\x1b[32m Mint CLI Tool Manager Wizard\x1b[0m");
627
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
629
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
628
630
  println!("Configure which agent tools are enabled or disabled:");
629
631
  println!(
630
632
  " \x1b[90m[Keyboard Controls: ↑/↓: Navigate | Space: Toggle | a: All | i: Invert | Enter: Confirm]\x1b[0m"
@@ -635,9 +637,9 @@ fn redraw_phase_1(options: &[ToolOption], cursor: usize) {
635
637
 
636
638
  fn redraw_phase_2(options: &[ToolOption], cursor: usize) {
637
639
  print!("\x1b[2J\x1b[1;1H");
638
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
640
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
639
641
  println!("\x1b[32m Configure Native Plugins Access\x1b[0m");
640
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
642
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
641
643
  println!("Select which native plugins are allowed to run:");
642
644
  println!(
643
645
  " \x1b[90m[Keyboard Controls: ↑/↓: Navigate | Space: Toggle | a: All | i: Invert | Enter: Confirm]\x1b[0m"
@@ -648,9 +650,9 @@ fn redraw_phase_2(options: &[ToolOption], cursor: usize) {
648
650
 
649
651
  fn redraw_phase_3(options: &[ToolOption], cursor: usize) {
650
652
  print!("\x1b[2J\x1b[1;1H");
651
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
653
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
652
654
  println!("\x1b[32m Choose where to run Mint AI Agent\x1b[0m");
653
- println!("\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
655
+ println!("{ANSI_BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m");
654
656
  println!("Select the environment you want to launch:");
655
657
  println!(" \x1b[90m[Keyboard Controls: ↑/↓: Navigate | Enter: Confirm]\x1b[0m");
656
658
  println!();