@pheem49/mint 1.14.0 → 1.16.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 (925) hide show
  1. package/Cargo.lock +1258 -35
  2. package/Cargo.toml +5 -2
  3. package/LICENSE +21 -654
  4. package/README.md +93 -756
  5. package/Release_Note.md +53 -446
  6. package/apps/mint-companion/src-tauri/Cargo.toml +20 -0
  7. package/apps/mint-companion/src-tauri/build.rs +3 -0
  8. package/apps/mint-companion/src-tauri/src/main.rs +468 -0
  9. package/apps/mint-companion/tsconfig.json +20 -0
  10. package/apps/mint-companion/vite.config.ts +3 -0
  11. package/components.json +19 -0
  12. package/crates/mint-cli/Cargo.toml +9 -1
  13. package/crates/mint-cli/src/agent/approval_prompts.rs +16 -3
  14. package/crates/mint-cli/src/agent/live_status.rs +545 -148
  15. package/crates/mint-cli/src/agent/markdown_render.rs +601 -61
  16. package/crates/mint-cli/src/agent.rs +723 -258
  17. package/crates/mint-cli/src/commands/agent.rs +83 -74
  18. package/crates/mint-cli/src/commands/eval.rs +9 -5
  19. package/crates/mint-cli/src/commands/git.rs +204 -0
  20. package/crates/mint-cli/src/commands/integrations.rs +35 -0
  21. package/crates/mint-cli/src/commands/knowledge.rs +13 -32
  22. package/crates/mint-cli/src/commands/mod.rs +81 -2
  23. package/crates/mint-cli/src/commands/tailnet_web.rs +235 -0
  24. package/crates/mint-cli/src/image.rs +32 -11
  25. package/crates/mint-cli/src/interactive/chat_tui.rs +7853 -0
  26. package/crates/mint-cli/src/interactive/command_ui.rs +477 -0
  27. package/crates/mint-cli/src/interactive/format.rs +8 -0
  28. package/crates/mint-cli/src/interactive/input_box.rs +94 -8
  29. package/crates/mint-cli/src/interactive/picker.rs +180 -37
  30. package/crates/mint-cli/src/interactive/resume_picker.rs +686 -0
  31. package/crates/mint-cli/src/interactive/slash_commands.rs +1071 -501
  32. package/crates/mint-cli/src/interactive/thought_viewer.rs +286 -0
  33. package/crates/mint-cli/src/interactive/tool_activity.rs +328 -0
  34. package/crates/mint-cli/src/interactive.rs +454 -166
  35. package/crates/mint-cli/src/main.rs +93 -26
  36. package/crates/mint-cli/src/markdown.rs +12 -5
  37. package/crates/mint-cli/src/mcp.rs +5 -0
  38. package/crates/mint-cli/src/mod_host.rs +6 -0
  39. package/crates/mint-cli/src/mods_cli.rs +62 -0
  40. package/crates/mint-cli/src/mods_ui.rs +187 -0
  41. package/crates/mint-cli/src/onboard.rs +37 -61
  42. package/crates/mint-cli/src/plugins_cli.rs +8 -5
  43. package/crates/mint-cli/src/setup.rs +10 -8
  44. package/crates/mint-cli/src/terminal_theme.rs +189 -0
  45. package/crates/mint-cli/src/updater.rs +112 -23
  46. package/crates/mint-cli/tests/library_intake.rs +77 -0
  47. package/crates/mint-cli/tests/mods_testing.rs +133 -0
  48. package/crates/mint-companion-protocol/Cargo.toml +10 -0
  49. package/crates/mint-companion-protocol/src/lib.rs +163 -0
  50. package/crates/mint-core/Cargo.toml +6 -3
  51. package/crates/mint-core/build.rs +26 -0
  52. package/crates/mint-core/src/agent/agent_loop.rs +1 -0
  53. package/crates/mint-core/src/agent/chat.rs +1003 -209
  54. package/crates/mint-core/src/agent/code_tools.rs +98 -2
  55. package/crates/mint-core/src/agent/memory/sources.rs +240 -0
  56. package/crates/mint-core/src/agent/memory.rs +805 -33
  57. package/crates/mint-core/src/agent/skill_inventory.rs +325 -0
  58. package/crates/mint-core/src/agent/skills.rs +437 -90
  59. package/crates/mint-core/src/agent.rs +1 -0
  60. package/crates/mint-core/src/api_server/routes/background_jobs.rs +310 -0
  61. package/crates/mint-core/src/api_server/routes/chat.rs +233 -190
  62. package/crates/mint-core/src/api_server/routes/html_preview.rs +77 -0
  63. package/crates/mint-core/src/api_server/routes/library.rs +97 -0
  64. package/crates/mint-core/src/api_server/routes/linked_folders.rs +118 -3
  65. package/crates/mint-core/src/api_server/routes/media_gen.rs +10 -57
  66. package/crates/mint-core/src/api_server/routes/misc.rs +114 -121
  67. package/crates/mint-core/src/api_server/routes/mod.rs +6 -0
  68. package/crates/mint-core/src/api_server/routes/mods.rs +31 -0
  69. package/crates/mint-core/src/api_server/routes/sessions.rs +85 -0
  70. package/crates/mint-core/src/api_server/routes/skills_subagents.rs +12 -42
  71. package/crates/mint-core/src/api_server/routes/slash.rs +50 -1
  72. package/crates/mint-core/src/api_server/routes/sources.rs +101 -0
  73. package/crates/mint-core/src/api_server.rs +140 -12
  74. package/crates/mint-core/src/avatar_bridge.rs +13 -2
  75. package/crates/mint-core/src/browser/cdp.rs +74 -83
  76. package/crates/mint-core/src/browser/evidence.rs +260 -0
  77. package/crates/mint-core/src/browser/input.rs +1 -1
  78. package/crates/mint-core/src/browser/interact.rs +98 -124
  79. package/crates/mint-core/src/browser/lifecycle.rs +75 -4
  80. package/crates/mint-core/src/browser/mod.rs +16 -2
  81. package/crates/mint-core/src/browser/navigate.rs +27 -19
  82. package/crates/mint-core/src/browser/observe.js +40 -0
  83. package/crates/mint-core/src/browser/session.rs +1610 -0
  84. package/crates/mint-core/src/companion.rs +716 -0
  85. package/crates/mint-core/src/cron/scheduler.rs +34 -2
  86. package/crates/mint-core/src/git/branches.rs +348 -0
  87. package/crates/mint-core/src/git/checkpoint.rs +40 -0
  88. package/crates/mint-core/src/git/diff.rs +206 -0
  89. package/crates/mint-core/src/git/mod.rs +10 -2
  90. package/crates/mint-core/src/integrations/channels.rs +88 -345
  91. package/crates/mint-core/src/integrations/mcp.rs +397 -50
  92. package/crates/mint-core/src/integrations/mcp_calls.rs +823 -0
  93. package/crates/mint-core/src/integrations/mcp_catalog.rs +267 -0
  94. package/crates/mint-core/src/integrations/mcp_device.rs +319 -0
  95. package/crates/mint-core/src/integrations/mcp_result.rs +356 -0
  96. package/crates/mint-core/src/integrations/webhooks.rs +539 -0
  97. package/crates/mint-core/src/integrations.rs +2 -0
  98. package/crates/mint-core/src/lib.rs +107 -40
  99. package/crates/mint-core/src/live_sync.rs +28 -9
  100. package/crates/mint-core/src/media/auto_shorts.rs +1 -0
  101. package/crates/mint-core/src/media/gemini_live.rs +145 -14
  102. package/crates/mint-core/src/media/image_models.rs +3 -27
  103. package/crates/mint-core/src/media/image_workflow.rs +216 -0
  104. package/crates/mint-core/src/media/library/intake.rs +144 -0
  105. package/crates/mint-core/src/media/library/migration.rs +56 -0
  106. package/crates/mint-core/src/media/library/removal.rs +55 -0
  107. package/crates/mint-core/src/media/library/tests.rs +730 -0
  108. package/crates/mint-core/src/media/library/thumbnails.rs +72 -0
  109. package/crates/mint-core/src/media/library.rs +545 -0
  110. package/crates/mint-core/src/media/mic_transcribe.rs +1 -0
  111. package/crates/mint-core/src/media/model_catalog.rs +375 -0
  112. package/crates/mint-core/src/media/pictures.rs +79 -222
  113. package/crates/mint-core/src/media/subtitle.rs +1 -0
  114. package/crates/mint-core/src/media/video_models.rs +3 -22
  115. package/crates/mint-core/src/media.rs +3 -0
  116. package/crates/mint-core/src/mods/manager.rs +1124 -0
  117. package/crates/mint-core/src/mods/mod.rs +569 -0
  118. package/crates/mint-core/src/mods/operations.rs +204 -0
  119. package/crates/mint-core/src/mods/session.rs +146 -0
  120. package/crates/mint-core/src/mods/slash.rs +59 -0
  121. package/crates/mint-core/src/mods/telemetry.rs +306 -0
  122. package/crates/mint-core/src/orchestration/approvals.rs +344 -0
  123. package/crates/mint-core/src/orchestration/context_render.rs +105 -0
  124. package/crates/mint-core/src/orchestration/mcp_review.rs +153 -0
  125. package/crates/mint-core/src/orchestration/memory_skill.rs +110 -33
  126. package/crates/mint-core/src/orchestration/mod.rs +3129 -481
  127. package/crates/mint-core/src/orchestration/mod_authoring_regressions.rs +209 -0
  128. package/crates/mint-core/src/orchestration/progress_clock.rs +80 -0
  129. package/crates/mint-core/src/orchestration/repeated_failures.rs +116 -0
  130. package/crates/mint-core/src/orchestration/review_regressions.rs +449 -0
  131. package/crates/mint-core/src/orchestration/run_control.rs +196 -0
  132. package/crates/mint-core/src/orchestration/tools/browser.rs +16 -139
  133. package/crates/mint-core/src/orchestration/tools/files.rs +161 -14
  134. package/crates/mint-core/src/orchestration/tools/media.rs +37 -41
  135. package/crates/mint-core/src/orchestration/tools/misc.rs +5 -3
  136. package/crates/mint-core/src/orchestration/tools/mod.rs +2 -0
  137. package/crates/mint-core/src/orchestration/tools/mods.rs +161 -0
  138. package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +303 -71
  139. package/crates/mint-core/src/orchestration/tools/shell.rs +95 -2
  140. package/crates/mint-core/src/orchestration/tools/web.rs +1 -1
  141. package/crates/mint-core/src/orchestration/workspace_helpers.rs +4 -1
  142. package/crates/mint-core/src/prompts/agent.rs +75 -31
  143. package/crates/mint-core/src/prompts/chat.rs +1 -1
  144. package/crates/mint-core/src/prompts/persona.rs +1 -1
  145. package/crates/mint-core/src/prompts/tool_catalog.rs +121 -27
  146. package/crates/mint-core/src/search/knowledge.rs +7 -1
  147. package/crates/mint-core/src/search/linked_folders/index.rs +896 -0
  148. package/crates/mint-core/src/search/linked_folders.rs +473 -131
  149. package/crates/mint-core/src/slash/catalog.rs +1 -1
  150. package/crates/mint-core/src/slash/mod.rs +644 -33
  151. package/crates/mint-core/src/slash/model_fetcher.rs +12 -3
  152. package/crates/mint-core/src/slash/models.rs +66 -10
  153. package/crates/mint-core/src/slash/mods.rs +155 -0
  154. package/crates/mint-core/src/system/bg_shell.rs +1129 -95
  155. package/crates/mint-core/src/system/config.rs +235 -10
  156. package/crates/mint-core/src/system/html_preview.rs +398 -0
  157. package/crates/mint-core/src/system/mint_web.rs +164 -0
  158. package/crates/mint-core/src/system/release_notes.rs +18 -0
  159. package/crates/mint-core/src/system/shell.rs +21 -6
  160. package/crates/mint-core/src/system/workspace.rs +292 -0
  161. package/crates/mint-core/src/system/workspace_history.rs +604 -0
  162. package/crates/mint-core/src/system.rs +5 -0
  163. package/crates/mint-core/tests/background_retention.rs +34 -0
  164. package/crates/mint-core/tests/background_shutdown.rs +24 -0
  165. package/crates/mint-core/tests/library_http.rs +209 -0
  166. package/crates/mint-core/tests/mcp_contract.rs +283 -0
  167. package/crates/mint-core/tests/mcp_stdio.rs +11 -10
  168. package/crates/mint-core/tests/media_model_catalog_http.rs +403 -0
  169. package/crates/mint-core/tests/memory_persistence.rs +39 -0
  170. package/crates/mint-core/tests/mods_http.rs +215 -0
  171. package/crates/mint-core/tests/terminal_shutdown.rs +109 -0
  172. package/crates/mint-mod-runtime/Cargo.toml +18 -0
  173. package/crates/mint-mod-runtime/src/lib.rs +507 -0
  174. package/crates/mint-mod-runtime/src/sdk.js +56 -0
  175. package/crates/mint-mod-runtime/src/test_sdk.js +32 -0
  176. package/crates/mint-mod-runtime/src/testing.rs +94 -0
  177. package/crates/mint-mod-runtime/tests/runtime.rs +156 -0
  178. package/docs/mods/AUTHORING.md +61 -0
  179. package/docs/mods/README.md +139 -0
  180. package/docs/mods/TESTING.md +56 -0
  181. package/docs/mods/mint-mods.d.ts +66 -0
  182. package/examples/device-mcp/README.md +22 -0
  183. package/examples/device-mcp/contract.md +49 -0
  184. package/examples/device-mcp/mock-device.mjs +66 -0
  185. package/examples/device-mcp/server.mjs +48 -0
  186. package/examples/device-mcp/server.test.mjs +78 -0
  187. package/examples/mods/task-checklist/README.md +1 -0
  188. package/examples/mods/task-checklist/main.ts +17 -0
  189. package/examples/mods/task-checklist/manifest.json +1 -0
  190. package/examples/mods/task-checklist/tests/checklist.test.ts +15 -0
  191. package/examples/mods/token-meter/README.md +1 -0
  192. package/examples/mods/token-meter/main.ts +8 -0
  193. package/examples/mods/token-meter/manifest.json +1 -0
  194. package/examples/mods/tool-guard/README.md +1 -0
  195. package/examples/mods/tool-guard/main.ts +9 -0
  196. package/examples/mods/tool-guard/manifest.json +1 -0
  197. package/out/web/assets/CliSessionsView-CtzUJpK_.css +1 -0
  198. package/out/web/assets/CliSessionsView-D7hw0Mgj.js +1 -0
  199. package/out/web/assets/CodeReviewPage-C7bEOJfd.js +4 -0
  200. package/out/web/assets/CodeReviewPage-Dte9uLiL.css +1 -0
  201. package/out/web/assets/CommandPalette-0RrF-AOT.js +1 -0
  202. package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +1 -0
  203. package/out/web/assets/ImageStudioPanel-D0lnhQV5.css +1 -0
  204. package/out/web/assets/LibraryPage--Qfisp6D.js +2 -0
  205. package/out/web/assets/LibraryPage-DAxUTAg7.css +1 -0
  206. package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +1 -0
  207. package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +1 -0
  208. package/out/web/assets/McpServersView-slfQJzNB.js +1 -0
  209. package/out/web/assets/MintDashboard-BSR5XpXh.js +25 -0
  210. package/out/web/assets/MintDashboard-CWUcCGhd.css +1 -0
  211. package/out/web/assets/PluginsView-l7LSm503.js +1 -0
  212. package/out/web/assets/ScheduledTasksView-CttmLbq1.js +1 -0
  213. package/out/web/assets/SettingsWindow-BCMLYvEV.js +4 -0
  214. package/out/web/assets/SettingsWindow-DcMVmU9u.css +1 -0
  215. package/out/web/assets/SkillsView-rNs1qr_U.js +2 -0
  216. package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +37 -0
  217. package/out/web/assets/ToolSurfacePage-CTfgggF2.css +1 -0
  218. package/out/web/assets/VeoStudioPanel-DOj7_WR3.css +1 -0
  219. package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +4 -0
  220. package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +1 -0
  221. package/out/web/assets/WorkspaceSelector-B2xIp04D.js +1 -0
  222. package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +1 -0
  223. package/out/web/assets/{abnfDiagram-VCTEODGH-DAOBA7ZG.js → abnfDiagram-VCTEODGH-CD0CjoGl.js} +1 -1
  224. package/out/web/assets/{architecture-7GRP2DOG-CgSwQOPQ.js → architecture-7GRP2DOG-RKV83OeZ.js} +1 -1
  225. package/out/web/assets/{architectureDiagram-5GKGNRK7-CYp3yupP.js → architectureDiagram-5GKGNRK7-nN_HAFct.js} +1 -1
  226. package/out/web/assets/{blockDiagram-NRAW4CY4-CyWybDWr.js → blockDiagram-NRAW4CY4-BrrqzHW5.js} +1 -1
  227. package/out/web/assets/{c4Diagram-UCG6FXSJ-BvY3U709.js → c4Diagram-UCG6FXSJ-DTdV8_zE.js} +1 -1
  228. package/out/web/assets/{chunk-75Z2AOVW-TLXCoZYv.js → chunk-75Z2AOVW-_M0z5olV.js} +1 -1
  229. package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +2 -0
  230. package/out/web/assets/{chunk-CLGD4ZFX-xjsKtNS7.js → chunk-CLGD4ZFX-D54yGvGS.js} +1 -1
  231. package/out/web/assets/chunk-DSNCTWBM-C-gvT2ru.js +2 -0
  232. package/out/web/assets/chunk-DU6HZSFF-CnFngIhW.js +128 -0
  233. package/out/web/assets/{chunk-F27PBJKO-BFpgF55A.js → chunk-F27PBJKO-BqtWrnEO.js} +1 -1
  234. package/out/web/assets/{chunk-G27WJ6UU-DfF7qW-C.js → chunk-G27WJ6UU-Ckoq5mi2.js} +1 -1
  235. package/out/web/assets/{chunk-GMAD6QVW-C-558kh_.js → chunk-GMAD6QVW-BuhEcgHq.js} +1 -1
  236. package/out/web/assets/{chunk-JQ64N6SF-wJmeGKAw.js → chunk-JQ64N6SF-CF8T7GiZ.js} +1 -1
  237. package/out/web/assets/{chunk-LCL6LL3I-C1wHD8Ie.js → chunk-LCL6LL3I-BhXV9zyH.js} +1 -1
  238. package/out/web/assets/{chunk-OBVCFTLP-BsRTPBqs.js → chunk-OBVCFTLP-CRIkunUB.js} +1 -1
  239. package/out/web/assets/{chunk-P2QGCYS3-HZIiM7Ni.js → chunk-P2QGCYS3-UFEU6BxZ.js} +1 -1
  240. package/out/web/assets/{chunk-POPQ4Y6H-Dk9wvVb0.js → chunk-POPQ4Y6H-CQcrNbjr.js} +1 -1
  241. package/out/web/assets/{chunk-PWAF6VOD-BmjYLNbq.js → chunk-PWAF6VOD-Cc2uVDsG.js} +1 -1
  242. package/out/web/assets/{chunk-R7TYR2AO-CaHIf-lK.js → chunk-R7TYR2AO-DiCxzdAY.js} +1 -1
  243. package/out/web/assets/{chunk-RHFEMEQ7-_T561hOU.js → chunk-RHFEMEQ7-b7hnPmrR.js} +1 -1
  244. package/out/web/assets/{chunk-SVP7TREG-CM-GGYoY.js → chunk-SVP7TREG-Bu_yYb-V.js} +1 -1
  245. package/out/web/assets/{chunk-TEH6E4GO-K2A8Vg2C.js → chunk-TEH6E4GO-G4Cdlyrt.js} +1 -1
  246. package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +1 -0
  247. package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +1 -0
  248. package/out/web/assets/config-CnvCChUM.js +2 -0
  249. package/out/web/assets/config-DM6oIVO3.css +1 -0
  250. package/out/web/assets/core-DsKkQ7ig.js +1 -0
  251. package/out/web/assets/{cynefin-OW5HDTMX-ClzaB6cc.js → cynefin-OW5HDTMX-CnzQfOGp.js} +1 -1
  252. package/out/web/assets/{cynefinDiagram-5FMLGOSQ-D_JzZBzf.js → cynefinDiagram-5FMLGOSQ-DVtQnfpm.js} +1 -1
  253. package/out/web/assets/{dagre-3AP2YEHR-BDuUeMHj.js → dagre-3AP2YEHR-DG76_k5_.js} +1 -1
  254. package/out/web/assets/{diagram-S7CK7UJ4-DgtcfE8P.js → diagram-S7CK7UJ4-CaouUoze.js} +1 -1
  255. package/out/web/assets/{diagram-UQ7AKVKN-DTLoEYti.js → diagram-UQ7AKVKN-B4bEc26B.js} +1 -1
  256. package/out/web/assets/{diagram-VSXAHHWV-ChGl9pXz.js → diagram-VSXAHHWV-BJ86Ov2Y.js} +1 -1
  257. package/out/web/assets/{diagram-VX7I27RA-Be8DWz0S.js → diagram-VX7I27RA-7hH5IPYf.js} +1 -1
  258. package/out/web/assets/{diagram-Z3DM3KII-BMXjRTOF.js → diagram-Z3DM3KII-CCM4clo8.js} +1 -1
  259. package/out/web/assets/dist-js-BkYNznHX.js +1 -0
  260. package/out/web/assets/{ebnfDiagram-PWID7BFC-8Q9pl1CJ.js → ebnfDiagram-PWID7BFC-Da7WAM3k.js} +1 -1
  261. package/out/web/assets/{erDiagram-SSCWMZ5O-DjH8Lnkn.js → erDiagram-SSCWMZ5O-CzzmnZWT.js} +1 -1
  262. package/out/web/assets/event-Cdt7Byyj.js +1 -0
  263. package/out/web/assets/{eventmodeling-NTZA5JFV-BKUH_DOp.js → eventmodeling-NTZA5JFV-xcfsA0XD.js} +1 -1
  264. package/out/web/assets/fira-code-latin-600-normal-BmSSHshu.woff +0 -0
  265. package/out/web/assets/fira-code-latin-600-normal-CvYZpPHg.woff2 +0 -0
  266. package/out/web/assets/fira-code-symbols2-600-normal-Dvq6IQE5.woff +0 -0
  267. package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +1 -0
  268. package/out/web/assets/{ganttDiagram-EL5Y4UJY-D7fZKJNM.js → ganttDiagram-EL5Y4UJY-B3ClFGmL.js} +1 -1
  269. package/out/web/assets/{gitGraph-4MIJSDKK-BypWaaBU.js → gitGraph-4MIJSDKK-BZ_y_cDU.js} +1 -1
  270. package/out/web/assets/{gitGraphDiagram-WWUBYQGX-DWiw_3bq.js → gitGraphDiagram-WWUBYQGX-drhRSYm3.js} +1 -1
  271. package/out/web/assets/index-BZ9xgmMP.css +1 -0
  272. package/out/web/assets/index-Ca8cCS4h.js +168 -0
  273. package/out/web/assets/{info-A6RAGUB7-KkAUxT4j.js → info-A6RAGUB7-B7I3K0F1.js} +1 -1
  274. package/out/web/assets/{infoDiagram-RXCK75RN-BNb6E48y.js → infoDiagram-RXCK75RN-deX_1MPh.js} +1 -1
  275. package/out/web/assets/{ishikawaDiagram-5VMMS53U-Caa-JoAK.js → ishikawaDiagram-5VMMS53U-s38yo28y.js} +1 -1
  276. package/out/web/assets/{journeyDiagram-EYS64GPL-DOrmFGz6.js → journeyDiagram-EYS64GPL-CZn2kB8b.js} +1 -1
  277. package/out/web/assets/jsx-runtime-DN4NhQUK.js +1 -0
  278. package/out/web/assets/{kanban-definition-3QL26DDD-BOWCYcK0.js → kanban-definition-3QL26DDD-DodjgySL.js} +1 -1
  279. package/out/web/assets/markdown-CMhYIcWB.js +39 -0
  280. package/out/web/assets/{mermaid-parser.core-BQqjCkS_.js → mermaid-parser.core-Whu2rlJC.js} +3 -3
  281. package/out/web/assets/mermaid.core-CKyPo8VH.js +11 -0
  282. package/out/web/assets/{mindmap-definition-FBJOCRG2-jTceWpr0.js → mindmap-definition-FBJOCRG2-260WBDxZ.js} +1 -1
  283. package/out/web/assets/modelManager-CUaGWMWu.js +2 -0
  284. package/out/web/assets/oauthManager-DlNhXJr6.js +1 -0
  285. package/out/web/assets/{packet-AYTQ26CC-CJ5RXgol.js → packet-AYTQ26CC-CEeIRKRG.js} +1 -1
  286. package/out/web/assets/{pegDiagram-XKGWAZYB-y8wMtd0y.js → pegDiagram-XKGWAZYB-BYadI-KO.js} +1 -1
  287. package/out/web/assets/{pie-WAS4IAKB-72fTBbl4.js → pie-WAS4IAKB-D8uf4dh5.js} +1 -1
  288. package/out/web/assets/{pieDiagram-E7YTZNPT-e0O02qWq.js → pieDiagram-E7YTZNPT-CjSDy4hO.js} +1 -1
  289. package/out/web/assets/{quadrantDiagram-AXDQQJYC-C9phYLom.js → quadrantDiagram-AXDQQJYC-B8D3gU5d.js} +1 -1
  290. package/out/web/assets/{radar-RG4KPBEZ-BAU2hzUT.js → radar-RG4KPBEZ-DZJxnokY.js} +1 -1
  291. package/out/web/assets/{railroad-74A4TZTK-B0bCAVHC.js → railroad-74A4TZTK-DBysUiUi.js} +1 -1
  292. package/out/web/assets/{railroad-abnf-HS5TGJTU-WhxO7ndE.js → railroad-abnf-HS5TGJTU-CHWxoJYg.js} +1 -1
  293. package/out/web/assets/{railroad-ebnf-LZEXJU2U-BkA0m7-F.js → railroad-ebnf-LZEXJU2U-DDv7X6bY.js} +1 -1
  294. package/out/web/assets/{railroad-peg-WCYAUIDC-BsVpHIaj.js → railroad-peg-WCYAUIDC-DpfcYYNJ.js} +1 -1
  295. package/out/web/assets/{railroadDiagram-O6MQD6OU-CyOLN65Q.js → railroadDiagram-O6MQD6OU-CYtyv0t3.js} +1 -1
  296. package/out/web/assets/{requirementDiagram-EFPCY7ZU-DQXJ7Dud.js → requirementDiagram-EFPCY7ZU-D2X-Ewik.js} +1 -1
  297. package/out/web/assets/{sankeyDiagram-P5KCCOFB-B2XLyIIc.js → sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js} +1 -1
  298. package/out/web/assets/{sequenceDiagram-WJ2MYXX4-DGQY4wwm.js → sequenceDiagram-WJ2MYXX4-BvFLKtPd.js} +1 -1
  299. package/out/web/assets/{stateDiagram-HBIQ2CUA-DHZpDwNy.js → stateDiagram-HBIQ2CUA-Bx0GWeaY.js} +1 -1
  300. package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +1 -0
  301. package/out/web/assets/studio-B1mk40wD.js +1 -0
  302. package/out/web/assets/{swimlanes-XN3QIQJK-Bn_jcZz-.js → swimlanes-XN3QIQJK-CCma0T7L.js} +1 -1
  303. package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +8 -0
  304. package/out/web/assets/{timeline-definition-24CTP7MA-CdTERuJZ.js → timeline-definition-24CTP7MA-iCRhhJ7C.js} +1 -1
  305. package/out/web/assets/{treeView-Q6P3EWNA-TKBKQG6R.js → treeView-Q6P3EWNA-DZ-y08qp.js} +1 -1
  306. package/out/web/assets/{treemap-WGGIJYW6-BP7gQoiC.js → treemap-WGGIJYW6-De0CxzMx.js} +1 -1
  307. package/out/web/assets/{vennDiagram-4TSXK5OY-BHUmxDuK.js → vennDiagram-4TSXK5OY-w_7aZ6xe.js} +1 -1
  308. package/out/web/assets/{wardley-WFR3VGLG-9bct5AAN.js → wardley-WFR3VGLG-DT0y0xJ4.js} +1 -1
  309. package/out/web/assets/{wardleyDiagram-VM6X3IG4-BfJwDDso.js → wardleyDiagram-VM6X3IG4-DAdXELbQ.js} +1 -1
  310. package/out/web/assets/window-BJCVtyET.js +1 -0
  311. package/out/web/assets/{xychartDiagram-S5SC5T6Z-Dqd9Mvpo.js → xychartDiagram-S5SC5T6Z-IZIXf3Vo.js} +1 -1
  312. package/out/web/index-web.html +4 -4
  313. package/out/web/index.html +4 -4
  314. package/package.json +80 -20
  315. package/shared-modules/.github/workflows/ci.yml +120 -0
  316. package/shared-modules/.github/workflows/update.yaml +28 -0
  317. package/slash-commands.json +16 -2
  318. package/src/bin/auto-build.js +66 -0
  319. package/src/bin/desktop.js +113 -0
  320. package/src/bin/desktop.test.js +113 -0
  321. package/src/bin/index.js +18 -25
  322. package/src/bin/index.test.js +89 -0
  323. package/src/bin/measure-effects.mjs +53 -0
  324. package/src/bin/package.test.js +28 -0
  325. package/src/bin/release-notes.test.js +84 -0
  326. package/src/bin/styles.test.js +20 -0
  327. package/src/bin/web.js +5 -0
  328. package/src/bin/web.test.js +39 -0
  329. package/src/renderer/index-web.html +1 -0
  330. package/src/renderer/index.html +1 -2
  331. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  332. package/src/renderer/shared/agentProgress.ts +201 -3
  333. package/src/renderer/shared/components/AgentActivityDrawer.tsx +9 -8
  334. package/src/renderer/shared/components/AgentActivityTable.tsx +193 -133
  335. package/src/renderer/shared/components/ApprovalCard.test.tsx +24 -0
  336. package/src/renderer/shared/components/ApprovalCard.tsx +10 -3
  337. package/src/renderer/shared/components/ArtifactPreviewPanel.tsx +91 -40
  338. package/src/renderer/shared/components/AuthGate.tsx +79 -48
  339. package/src/renderer/shared/components/BackgroundTerminals.tsx +181 -0
  340. package/src/renderer/shared/components/CalculationCard.tsx +41 -15
  341. package/src/renderer/shared/components/ChatCodeBlock.tsx +8 -4
  342. package/src/renderer/shared/components/ChatMessageItem.test.tsx +68 -0
  343. package/src/renderer/shared/components/ChatMessageItem.tsx +52 -33
  344. package/src/renderer/shared/components/ChatPanel.test.tsx +21 -0
  345. package/src/renderer/shared/components/ChatPanel.tsx +676 -415
  346. package/src/renderer/shared/components/ChunkErrorBoundary.tsx +115 -64
  347. package/src/renderer/shared/components/CliSessionsView.test.tsx +125 -0
  348. package/src/renderer/shared/components/CliSessionsView.tsx +543 -0
  349. package/src/renderer/shared/components/CodeReviewPage.tsx +668 -0
  350. package/src/renderer/shared/components/CollapsiblePasteInput.tsx +90 -0
  351. package/src/renderer/shared/components/CommandPalette.tsx +8 -8
  352. package/src/renderer/shared/components/ContextCompactionStatus.tsx +17 -0
  353. package/src/renderer/shared/components/DashboardSidebar.tsx +853 -229
  354. package/src/renderer/shared/components/DesktopTitlebar.tsx +371 -0
  355. package/src/renderer/shared/components/DiffReviewModal.tsx +3 -3
  356. package/src/renderer/shared/components/ErrorNotice.tsx +29 -0
  357. package/src/renderer/shared/components/FormattedMessage.tsx +11 -0
  358. package/src/renderer/shared/components/GeminiLiveOverlay.css +86 -0
  359. package/src/renderer/shared/components/GeminiLiveOverlay.test.tsx +24 -0
  360. package/src/renderer/shared/components/GeminiLiveOverlay.tsx +85 -101
  361. package/src/renderer/shared/components/GitBranchSelector.tsx +442 -0
  362. package/src/renderer/shared/components/GlideSelect.css +138 -0
  363. package/src/renderer/shared/components/GlideSelect.d.ts +31 -0
  364. package/src/renderer/shared/components/GlideSelect.jsx +266 -0
  365. package/src/renderer/shared/components/ImageGenCard.tsx +31 -12
  366. package/src/renderer/shared/components/ImageSearchCard.tsx +76 -65
  367. package/src/renderer/shared/components/ImageStudioPanel.tsx +49 -49
  368. package/src/renderer/shared/components/InlineThoughtNote.tsx +27 -0
  369. package/src/renderer/shared/components/LibraryItemCard.tsx +72 -0
  370. package/src/renderer/shared/components/LibraryPage.tsx +165 -0
  371. package/src/renderer/shared/components/LibraryPreview.tsx +59 -0
  372. package/src/renderer/shared/components/LinkedFoldersView.tsx +365 -46
  373. package/src/renderer/shared/components/McpRegistryPicker.tsx +1 -1
  374. package/src/renderer/shared/components/McpServersView.tsx +51 -30
  375. package/src/renderer/shared/components/McpToolAllowlist.tsx +2 -4
  376. package/src/renderer/shared/components/McpToolResults.tsx +99 -0
  377. package/src/renderer/shared/components/MermaidCard.tsx +14 -8
  378. package/src/renderer/shared/components/MintDashboard.tsx +1002 -831
  379. package/src/renderer/shared/components/ModSessionControls.tsx +8 -0
  380. package/src/renderer/shared/components/ModUi.test.tsx +65 -0
  381. package/src/renderer/shared/components/ModUi.tsx +26 -0
  382. package/src/renderer/shared/components/ModelSelectorPopover.tsx +547 -219
  383. package/src/renderer/shared/components/ModsPanel.tsx +156 -0
  384. package/src/renderer/shared/components/PlanChecklistWidget.tsx +1 -1
  385. package/src/renderer/shared/components/PluginsView.tsx +1 -1
  386. package/src/renderer/shared/components/ProgressActivity.tsx +17 -0
  387. package/src/renderer/shared/components/ReviewHistory.tsx +42 -0
  388. package/src/renderer/shared/components/RewindModal.tsx +11 -18
  389. package/src/renderer/shared/components/RunSummaryDashboard.tsx +8 -14
  390. package/src/renderer/shared/components/ScheduledTasksView.tsx +11 -10
  391. package/src/renderer/shared/components/ScreenCaptureDialog.css +221 -0
  392. package/src/renderer/shared/components/ScreenCaptureDialog.tsx +199 -0
  393. package/src/renderer/shared/components/SelectField.test.tsx +27 -0
  394. package/src/renderer/shared/components/SelectField.tsx +38 -0
  395. package/src/renderer/shared/components/SessionSources.tsx +48 -0
  396. package/src/renderer/shared/components/SessionSourcesPopover.tsx +61 -0
  397. package/src/renderer/shared/components/Settings/AgentsTab.tsx +41 -45
  398. package/src/renderer/shared/components/Settings/AudioTab.tsx +16 -15
  399. package/src/renderer/shared/components/Settings/AutomationTab.tsx +10 -60
  400. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +368 -0
  401. package/src/renderer/shared/components/Settings/GeneralTab.tsx +368 -113
  402. package/src/renderer/shared/components/Settings/MemoryTab.test.tsx +37 -0
  403. package/src/renderer/shared/components/Settings/MemoryTab.tsx +71 -31
  404. package/src/renderer/shared/components/Settings/NotificationsTab.test.tsx +15 -0
  405. package/src/renderer/shared/components/Settings/NotificationsTab.tsx +84 -0
  406. package/src/renderer/shared/components/Settings/PluginsTab.tsx +20 -12
  407. package/src/renderer/shared/components/Settings/ProfileTab.tsx +29 -5
  408. package/src/renderer/shared/components/Settings/SearchableModelCombobox.tsx +411 -0
  409. package/src/renderer/shared/components/Settings/ThemeTab.tsx +416 -165
  410. package/src/renderer/shared/components/SkillsView.tsx +41 -16
  411. package/src/renderer/shared/components/SlashChoicePanel.tsx +88 -0
  412. package/src/renderer/shared/components/SlashSuggestions.test.tsx +33 -0
  413. package/src/renderer/shared/components/SlashSuggestions.tsx +41 -12
  414. package/src/renderer/shared/components/SourcesBlock.tsx +55 -51
  415. package/src/renderer/shared/components/StockCard.tsx +58 -24
  416. package/src/renderer/shared/components/SubagentDagView.tsx +4 -4
  417. package/src/renderer/shared/components/TerminalDock.tsx +241 -0
  418. package/src/renderer/shared/components/ThinkingBlock.tsx +14 -8
  419. package/src/renderer/shared/components/ToolSurfacePage.test.tsx +32 -0
  420. package/src/renderer/shared/components/ToolSurfacePage.tsx +568 -0
  421. package/src/renderer/shared/components/ToolsPanelToggle.tsx +13 -0
  422. package/src/renderer/shared/components/UiFeatureCard.tsx +267 -0
  423. package/src/renderer/shared/components/UiGridCard.tsx +188 -0
  424. package/src/renderer/shared/components/UiMockupWidget.tsx +149 -0
  425. package/src/renderer/shared/components/VeoStudioPanel.tsx +22 -37
  426. package/src/renderer/shared/components/ViewedImages.tsx +36 -0
  427. package/src/renderer/shared/components/VirtualChatHistory.tsx +82 -0
  428. package/src/renderer/shared/components/VoicePill.css +85 -0
  429. package/src/renderer/shared/components/VoicePill.d.ts +12 -0
  430. package/src/renderer/shared/components/VoicePill.jsx +190 -0
  431. package/src/renderer/shared/components/VoicePill.test.tsx +22 -0
  432. package/src/renderer/shared/components/WeatherCard.tsx +3 -3
  433. package/src/renderer/shared/components/WorkspaceContextPopover.tsx +138 -0
  434. package/src/renderer/shared/components/WorkspacePaneResizer.tsx +92 -0
  435. package/src/renderer/shared/components/WorkspacePreviewActions.test.tsx +44 -0
  436. package/src/renderer/shared/components/WorkspacePreviewActions.tsx +19 -0
  437. package/src/renderer/shared/components/WorkspaceSelector.tsx +154 -0
  438. package/src/renderer/shared/components/background-terminals.css +292 -0
  439. package/src/renderer/shared/components/ui/README.md +52 -0
  440. package/src/renderer/shared/components/ui/button.tsx +37 -0
  441. package/src/renderer/shared/components/ui/demo.tsx +26 -0
  442. package/src/renderer/shared/components/ui/error-recovery.css +35 -0
  443. package/src/renderer/shared/components/ui/error-recovery.tsx +35 -0
  444. package/src/renderer/shared/components/ui/voice-powered-orb.css +6 -0
  445. package/src/renderer/shared/components/ui/voice-powered-orb.tsx +374 -0
  446. package/src/renderer/shared/components/workspace-selector.css +248 -0
  447. package/src/renderer/shared/constants/config.ts +57 -3
  448. package/src/renderer/shared/constants/models.ts +189 -2
  449. package/src/renderer/shared/constants/slashCommands.ts +1 -1
  450. package/src/renderer/shared/conversation/coordinator.test.ts +27 -0
  451. package/src/renderer/shared/conversation/coordinator.ts +82 -0
  452. package/src/renderer/shared/conversation/lifecycle.test.ts +362 -0
  453. package/src/renderer/shared/conversation/lifecycle.ts +418 -0
  454. package/src/renderer/shared/conversation/projectNavigation.test.ts +105 -0
  455. package/src/renderer/shared/conversation/projectNavigation.ts +39 -0
  456. package/src/renderer/shared/conversation/sourcesTransport.ts +27 -0
  457. package/src/renderer/shared/conversation/syncView.test.ts +13 -0
  458. package/src/renderer/shared/conversation/syncView.ts +6 -0
  459. package/src/renderer/shared/conversation/transport.test.ts +163 -0
  460. package/src/renderer/shared/conversation/transport.ts +159 -0
  461. package/src/renderer/shared/conversation/useConversationCoordinator.ts +64 -0
  462. package/src/renderer/shared/css/agent-observability.css +46 -15
  463. package/src/renderer/shared/css/auth-gate.css +114 -15
  464. package/src/renderer/shared/css/chat-ui-cards.css +495 -0
  465. package/src/renderer/shared/css/code-review.css +856 -0
  466. package/src/renderer/shared/css/code-sessions.css +479 -0
  467. package/src/renderer/shared/css/collapsed-paste.css +35 -0
  468. package/src/renderer/shared/css/effects.css +15 -0
  469. package/src/renderer/shared/css/error-notice.css +60 -0
  470. package/src/renderer/shared/css/file-changes.css +132 -0
  471. package/src/renderer/shared/css/image-studio.css +16 -16
  472. package/src/renderer/shared/css/library.css +476 -0
  473. package/src/renderer/shared/css/management-views.css +415 -27
  474. package/src/renderer/shared/css/mcp-results.css +11 -0
  475. package/src/renderer/shared/css/model-selector.css +543 -85
  476. package/src/renderer/shared/css/mods.css +77 -0
  477. package/src/renderer/shared/css/notification-notice.css +28 -0
  478. package/src/renderer/shared/css/session-sources-popover.css +9 -0
  479. package/src/renderer/shared/css/session-sources.css +23 -0
  480. package/src/renderer/shared/css/settings/agents.css +1 -1
  481. package/src/renderer/shared/css/settings/automation.css +13 -13
  482. package/src/renderer/shared/css/settings/general.css +526 -5
  483. package/src/renderer/shared/css/settings/memory.css +154 -0
  484. package/src/renderer/shared/css/settings/notifications.css +11 -0
  485. package/src/renderer/shared/css/settings/plugins.css +5 -5
  486. package/src/renderer/shared/css/settings/profile.css +331 -1
  487. package/src/renderer/shared/css/settings/theme.css +656 -3
  488. package/src/renderer/shared/css/slash-choice.css +95 -0
  489. package/src/renderer/shared/css/slash-suggestions.css +68 -0
  490. package/src/renderer/shared/css/sources-block.css +91 -0
  491. package/src/renderer/shared/css/thinking-status.css +46 -0
  492. package/src/renderer/shared/css/tools-panel.css +7 -0
  493. package/src/renderer/shared/css/ui-tailwind.css +19 -0
  494. package/src/renderer/shared/css/veo-studio.css +16 -15
  495. package/src/renderer/shared/css/viewed-images.css +15 -0
  496. package/src/renderer/shared/fonts.css +46 -0
  497. package/src/renderer/shared/fonts.ts +10 -37
  498. package/src/renderer/shared/lib/utils.ts +6 -0
  499. package/src/renderer/shared/library/controller.test.ts +61 -0
  500. package/src/renderer/shared/library/controller.ts +57 -0
  501. package/src/renderer/shared/library/transport.test.ts +26 -0
  502. package/src/renderer/shared/library/transport.ts +60 -0
  503. package/src/renderer/shared/library/useLibraryFile.ts +38 -0
  504. package/src/renderer/shared/mods.ts +58 -0
  505. package/src/renderer/shared/platform.test.ts +90 -0
  506. package/src/renderer/shared/platform.ts +219 -7
  507. package/src/renderer/shared/theme/themeManager.test.ts +43 -0
  508. package/src/renderer/shared/theme/themeManager.ts +157 -0
  509. package/src/renderer/shared/theme/themes.ts +116 -0
  510. package/src/renderer/shared/theme/tokens.css +318 -0
  511. package/src/renderer/shared/types.ts +137 -2
  512. package/src/renderer/shared/utils/agentActivity.test.ts +75 -0
  513. package/src/renderer/shared/utils/agentActivity.ts +168 -8
  514. package/src/renderer/shared/utils/approval.tsx +7 -0
  515. package/src/renderer/shared/utils/artifactBrowser.test.ts +80 -0
  516. package/src/renderer/shared/utils/artifactBrowser.ts +41 -0
  517. package/src/renderer/shared/utils/cardJson.test.ts +35 -0
  518. package/src/renderer/shared/utils/cardJson.ts +30 -0
  519. package/src/renderer/shared/utils/contextCompaction.test.tsx +48 -0
  520. package/src/renderer/shared/utils/contextCompaction.ts +21 -0
  521. package/src/renderer/shared/utils/effectVisibility.ts +9 -0
  522. package/src/renderer/shared/utils/fileIcons.ts +1 -1
  523. package/src/renderer/shared/utils/markdown.tsx +330 -81
  524. package/src/renderer/shared/utils/markdown.webImages.test.tsx +40 -0
  525. package/src/renderer/shared/utils/mcpResults.test.tsx +91 -0
  526. package/src/renderer/shared/utils/modViewport.ts +7 -0
  527. package/src/renderer/shared/utils/nativeRecordingSession.test.ts +61 -0
  528. package/src/renderer/shared/utils/nativeRecordingSession.ts +46 -0
  529. package/src/renderer/shared/utils/notificationSettings.test.ts +14 -0
  530. package/src/renderer/shared/utils/notificationSettings.ts +23 -0
  531. package/src/renderer/shared/utils/notifications.test.ts +51 -0
  532. package/src/renderer/shared/utils/notifications.ts +54 -0
  533. package/src/renderer/shared/utils/pastedText.test.ts +20 -0
  534. package/src/renderer/shared/utils/pastedText.ts +13 -0
  535. package/src/renderer/shared/utils/progressCache.test.ts +32 -0
  536. package/src/renderer/shared/utils/providers.ts +8 -3
  537. package/src/renderer/shared/utils/screenCapture.ts +43 -0
  538. package/src/renderer/shared/utils/sessionSources.test.ts +31 -0
  539. package/src/renderer/shared/utils/sessionSources.ts +34 -0
  540. package/src/renderer/shared/utils/slashCommandProcessor.ts +5 -2
  541. package/src/renderer/shared/utils/sourceAttachments.ts +28 -0
  542. package/src/renderer/shared/utils/speech.ts +51 -9
  543. package/src/renderer/shared/utils/syntaxHighlight.test.tsx +22 -0
  544. package/src/renderer/shared/utils/syntaxHighlight.tsx +26 -0
  545. package/src/renderer/shared/utils/ui.ts +4 -64
  546. package/src/renderer/shared/utils/useGeminiLiveVoice.ts +49 -5
  547. package/src/renderer/shared/utils/useLatestCallback.ts +9 -0
  548. package/src/renderer/shared/utils/useNativeVoiceInput.ts +80 -72
  549. package/src/renderer/shared/utils/useSessionSources.ts +33 -0
  550. package/src/renderer/shared/utils/viewedImages.ts +26 -0
  551. package/src/renderer/shared/utils/workspacePane.test.ts +33 -0
  552. package/src/renderer/shared/utils/workspacePane.ts +20 -0
  553. package/src/renderer/shared/utils/workspacePreview.test.ts +24 -0
  554. package/src/renderer/shared/utils/workspacePreview.ts +16 -0
  555. package/src/renderer/shared/utils/workspaceSnapshot.test.ts +49 -0
  556. package/src/renderer/shared/utils/workspaceSnapshot.ts +26 -0
  557. package/src/renderer/shared/utils/workspaces.ts +10 -0
  558. package/src/renderer/shared/workspaceUndo.ts +88 -0
  559. package/src/renderer/src/App.tsx +16 -1
  560. package/src/renderer/src/components/BrowserShell.tsx +108 -0
  561. package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +91 -0
  562. package/src/renderer/src/components/LiveTranslateControls.tsx +65 -0
  563. package/src/renderer/src/components/MintDashboard.tsx +4 -2
  564. package/src/renderer/src/components/PicturesLibrary.tsx +2 -287
  565. package/src/renderer/src/components/ScreenPicker.css +227 -0
  566. package/src/renderer/src/components/ScreenPicker.tsx +312 -526
  567. package/src/renderer/src/components/SettingsWindow.tsx +48 -5
  568. package/src/renderer/src/components/SpotlightWindow.tsx +1 -0
  569. package/src/renderer/src/components/WidgetWindow.tsx +27 -3
  570. package/src/renderer/src/components/WorkspacePanel.tsx +269 -61
  571. package/src/renderer/src/components/browser-shell.css +185 -0
  572. package/src/renderer/src/components/browser-suggestions-popup.css +55 -0
  573. package/src/renderer/src/components/liveTranslateFrames.test.ts +44 -0
  574. package/src/renderer/src/components/liveTranslateFrames.ts +45 -0
  575. package/src/renderer/src/components/liveTranslateLanguage.ts +6 -0
  576. package/src/renderer/src/css/app-shell.css +400 -204
  577. package/src/renderer/src/css/chat.css +1666 -594
  578. package/src/renderer/src/css/dashboard.css +11 -0
  579. package/src/renderer/src/css/desktop-tools.css +928 -0
  580. package/src/renderer/src/css/misc.css +5 -60
  581. package/src/renderer/src/css/pictures.css +2 -407
  582. package/src/renderer/src/css/settings/base.css +394 -157
  583. package/src/renderer/src/css/sidebar-workspace.css +1072 -376
  584. package/src/renderer/src/css/spotlight.css +15 -26
  585. package/src/renderer/src/css/tool-surfaces.css +784 -0
  586. package/src/renderer/src/css/widget.css +36 -8
  587. package/src/renderer/src/env.d.ts +4 -9
  588. package/src/renderer/src/hooks/useProviderModels.ts +2 -9
  589. package/src/renderer/src/index.css +53 -46
  590. package/src/renderer/src/main.tsx +12 -0
  591. package/src/renderer/src/proactiveSuggestions.ts +29 -0
  592. package/src/renderer/src/tauri.ts +302 -339
  593. package/src/renderer/src/voiceInput.ts +2 -1
  594. package/src/renderer/src-web/App.tsx +40 -0
  595. package/src/renderer/src-web/components/MintDashboard.tsx +4 -2
  596. package/src/renderer/src-web/components/PicturesLibrary.tsx +2 -284
  597. package/src/renderer/src-web/components/PullToRefresh.tsx +107 -0
  598. package/src/renderer/src-web/components/SettingsWindow.tsx +36 -5
  599. package/src/renderer/src-web/css/app-shell.css +188 -207
  600. package/src/renderer/src-web/css/chat.css +1236 -507
  601. package/src/renderer/src-web/css/dashboard.css +11 -0
  602. package/src/renderer/src-web/css/misc.css +3 -55
  603. package/src/renderer/src-web/css/mobile.css +679 -0
  604. package/src/renderer/src-web/css/pictures.css +2 -415
  605. package/src/renderer/src-web/css/pull-to-refresh.css +54 -0
  606. package/src/renderer/src-web/css/settings/base.css +353 -134
  607. package/src/renderer/src-web/css/settings/mobile.css +320 -0
  608. package/src/renderer/src-web/css/sidebar-workspace.css +546 -187
  609. package/src/renderer/src-web/css/spotlight.css +9 -26
  610. package/src/renderer/src-web/css/widget.css +1 -6
  611. package/src/renderer/src-web/env.d.ts +4 -12
  612. package/src/renderer/src-web/hooks/useProviderModels.ts +2 -9
  613. package/src/renderer/src-web/index.css +53 -96
  614. package/src/renderer/src-web/main.tsx +12 -0
  615. package/src/renderer/src-web/proactiveSuggestions.ts +3 -0
  616. package/src/renderer/src-web/tauri.ts +309 -364
  617. package/src/renderer/tests/backgroundTerminals.browser.html +81 -0
  618. package/src/renderer/tests/chatPanelFixture.ts +23 -0
  619. package/src/renderer/tests/chatPerformance.browser.html +71 -0
  620. package/src/renderer/tests/cliSessions.browser.html +82 -0
  621. package/src/renderer/tests/collapsedPaste.browser.html +70 -0
  622. package/src/renderer/tests/composerMenus.browser.html +116 -0
  623. package/src/renderer/tests/contextCompaction.browser.html +17 -0
  624. package/src/renderer/tests/conversationLifecycle.browser.html +70 -0
  625. package/src/renderer/tests/effectsPerformance.browser.html +13 -0
  626. package/src/renderer/tests/errorRecovery.browser.html +21 -0
  627. package/src/renderer/tests/glideSelect.browser.html +71 -0
  628. package/src/renderer/tests/glideSelect.preview.html +27 -0
  629. package/src/renderer/tests/library.browser.html +1 -0
  630. package/src/renderer/tests/library.browser.tsx +78 -0
  631. package/src/renderer/tests/liveOrb.browser.html +49 -0
  632. package/src/renderer/tests/liveVoice.browser.html +29 -0
  633. package/src/renderer/tests/modInput.browser.html +22 -0
  634. package/src/renderer/tests/sessionSources.browser.html +1 -0
  635. package/src/renderer/tests/sessionSources.browser.tsx +107 -0
  636. package/src/renderer/tests/skills.browser.html +24 -0
  637. package/src/renderer/tests/toolsPanel.browser.html +1 -0
  638. package/src/renderer/tests/toolsPanel.browser.tsx +113 -0
  639. package/src/renderer/tests/viewedImages.browser.html +1 -0
  640. package/src/renderer/tests/viewedImages.browser.tsx +93 -0
  641. package/src/renderer/tests/voicePill.browser.html +80 -0
  642. package/src/renderer/tests/voicePill.preview.html +34 -0
  643. package/src/renderer/tests/webSources.browser.html +1 -0
  644. package/src/renderer/tests/webSources.browser.tsx +98 -0
  645. package/src/renderer/tests/workspaceUndo.browser.html +92 -0
  646. package/src-tauri/Cargo.toml +40 -0
  647. package/src-tauri/build.rs +3 -0
  648. package/src-tauri/src/app/lifecycle.rs +277 -0
  649. package/src-tauri/src/app/mod.rs +4 -0
  650. package/src-tauri/src/app/shortcuts.rs +40 -0
  651. package/src-tauri/src/app/tray.rs +52 -0
  652. package/src-tauri/src/background/events.rs +70 -0
  653. package/src-tauri/src/background/headless.rs +230 -0
  654. package/src-tauri/src/background/mod.rs +4 -0
  655. package/src-tauri/src/background/proactive.rs +262 -0
  656. package/src-tauri/src/commands/approvals.rs +20 -0
  657. package/src-tauri/src/commands/auth.rs +127 -0
  658. package/src-tauri/src/commands/conversation.rs +642 -0
  659. package/src-tauri/src/commands/integrations.rs +157 -0
  660. package/src-tauri/src/commands/media.rs +179 -0
  661. package/src-tauri/src/commands/mod.rs +11 -0
  662. package/src-tauri/src/commands/mods.rs +6 -0
  663. package/src-tauri/src/commands/settings.rs +141 -0
  664. package/src-tauri/src/commands/voice.rs +153 -0
  665. package/src-tauri/src/commands/workspace.rs +501 -0
  666. package/src-tauri/src/lib.rs +10 -0
  667. package/src-tauri/src/main.rs +3 -0
  668. package/src-tauri/src/native/actions.rs +206 -0
  669. package/src-tauri/src/native/browser.rs +252 -0
  670. package/src-tauri/src/native/capture.rs +695 -0
  671. package/src-tauri/src/native/discord_rpc.rs +99 -0
  672. package/src-tauri/src/native/integrations.rs +126 -0
  673. package/src-tauri/src/native/mod.rs +12 -0
  674. package/src-tauri/src/native/notifications.rs +51 -0
  675. package/src-tauri/src/native/plugins.rs +14 -0
  676. package/src-tauri/src/native/system.rs +250 -0
  677. package/src-tauri/src/native/terminal.rs +201 -0
  678. package/src-tauri/src/native/updater.rs +148 -0
  679. package/src-tauri/src/native/windows.rs +143 -0
  680. package/tsconfig.json +2 -0
  681. package/vite.config.ts +4 -1
  682. package/vite.config.web.ts +5 -0
  683. package/.cargo/config.toml +0 -13
  684. package/.claude/settings.local.json +0 -182
  685. package/.codex +0 -0
  686. package/CLAUDE.md +0 -102
  687. package/out/web/Live2DCubismCore.js +0 -9
  688. package/out/web/assets/MintDashboard-DWSqucgb.js +0 -57
  689. package/out/web/assets/SettingsWindow-DFM2aj5B.js +0 -2
  690. package/out/web/assets/chunk-CKBBP62Z-nr1uKPj9.js +0 -2
  691. package/out/web/assets/chunk-DSNCTWBM-Dtj8Rqsd.js +0 -2
  692. package/out/web/assets/chunk-DU6HZSFF-2tv5K1wT.js +0 -128
  693. package/out/web/assets/classDiagram-DTDB5LWJ-BdSFArgw.js +0 -1
  694. package/out/web/assets/classDiagram-v2-JRS7N3AN-BdSFArgw.js +0 -1
  695. package/out/web/assets/core-DImejIUG.js +0 -1
  696. package/out/web/assets/dist-js-BxuKEVWM.js +0 -1
  697. package/out/web/assets/event-BNl8Zahw.js +0 -1
  698. package/out/web/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
  699. package/out/web/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
  700. package/out/web/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
  701. package/out/web/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
  702. package/out/web/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
  703. package/out/web/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
  704. package/out/web/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
  705. package/out/web/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
  706. package/out/web/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
  707. package/out/web/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
  708. package/out/web/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
  709. package/out/web/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
  710. package/out/web/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
  711. package/out/web/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
  712. package/out/web/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
  713. package/out/web/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
  714. package/out/web/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
  715. package/out/web/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
  716. package/out/web/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
  717. package/out/web/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
  718. package/out/web/assets/flowDiagram-A5DVABFB-BpnHUSU7.js +0 -1
  719. package/out/web/assets/index-CVRg270z.css +0 -1
  720. package/out/web/assets/index-DxZQr9yD.js +0 -10
  721. package/out/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  722. package/out/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  723. package/out/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  724. package/out/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  725. package/out/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  726. package/out/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  727. package/out/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  728. package/out/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  729. package/out/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  730. package/out/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  731. package/out/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  732. package/out/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  733. package/out/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  734. package/out/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  735. package/out/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  736. package/out/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  737. package/out/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  738. package/out/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  739. package/out/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  740. package/out/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  741. package/out/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  742. package/out/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  743. package/out/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  744. package/out/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  745. package/out/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  746. package/out/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  747. package/out/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  748. package/out/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  749. package/out/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  750. package/out/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  751. package/out/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  752. package/out/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  753. package/out/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  754. package/out/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  755. package/out/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  756. package/out/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  757. package/out/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  758. package/out/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  759. package/out/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  760. package/out/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  761. package/out/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  762. package/out/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  763. package/out/web/assets/kanit-latin-400-normal-BUlsQXH3.woff2 +0 -0
  764. package/out/web/assets/kanit-latin-400-normal-HVZWrfev.woff +0 -0
  765. package/out/web/assets/kanit-latin-500-normal-CX_4XcKi.woff2 +0 -0
  766. package/out/web/assets/kanit-latin-500-normal-qBha86O4.woff +0 -0
  767. package/out/web/assets/kanit-latin-600-normal-0lS78yAd.woff2 +0 -0
  768. package/out/web/assets/kanit-latin-600-normal-DlacpeTg.woff +0 -0
  769. package/out/web/assets/kanit-latin-ext-400-normal-B2xPf58u.woff2 +0 -0
  770. package/out/web/assets/kanit-latin-ext-400-normal-CHvNKHHD.woff +0 -0
  771. package/out/web/assets/kanit-latin-ext-500-normal-BFdWrG22.woff +0 -0
  772. package/out/web/assets/kanit-latin-ext-500-normal-EHs3suD6.woff2 +0 -0
  773. package/out/web/assets/kanit-latin-ext-600-normal-BBDzoLaj.woff +0 -0
  774. package/out/web/assets/kanit-latin-ext-600-normal-DAX3wtuq.woff2 +0 -0
  775. package/out/web/assets/kanit-thai-400-normal-D2nliXKa.woff +0 -0
  776. package/out/web/assets/kanit-thai-400-normal-D80Pglro.woff2 +0 -0
  777. package/out/web/assets/kanit-thai-500-normal-BB8gri04.woff2 +0 -0
  778. package/out/web/assets/kanit-thai-500-normal-Iy_w0a80.woff +0 -0
  779. package/out/web/assets/kanit-thai-600-normal-Bj6oiaDc.woff2 +0 -0
  780. package/out/web/assets/kanit-thai-600-normal-wbTlPO7I.woff +0 -0
  781. package/out/web/assets/kanit-vietnamese-400-normal-DRI8YWyb.woff2 +0 -0
  782. package/out/web/assets/kanit-vietnamese-400-normal-dow6Bnto.woff +0 -0
  783. package/out/web/assets/kanit-vietnamese-500-normal-BzTrpCM3.woff2 +0 -0
  784. package/out/web/assets/kanit-vietnamese-500-normal-T1ndT7MF.woff +0 -0
  785. package/out/web/assets/kanit-vietnamese-600-normal-Bi7fw3I4.woff2 +0 -0
  786. package/out/web/assets/kanit-vietnamese-600-normal-DXCRAa_8.woff +0 -0
  787. package/out/web/assets/mali-latin-400-normal-ByPcZ8Gx.woff +0 -0
  788. package/out/web/assets/mali-latin-400-normal-Cuc6Ykl8.woff2 +0 -0
  789. package/out/web/assets/mali-latin-500-normal-B01M-LP6.woff2 +0 -0
  790. package/out/web/assets/mali-latin-500-normal-Thgqw_9f.woff +0 -0
  791. package/out/web/assets/mali-latin-600-normal-B9TiUNpT.woff2 +0 -0
  792. package/out/web/assets/mali-latin-600-normal-CycpQCwU.woff +0 -0
  793. package/out/web/assets/mali-latin-ext-400-normal-DUVdJQO4.woff +0 -0
  794. package/out/web/assets/mali-latin-ext-400-normal-iCG1ALuJ.woff2 +0 -0
  795. package/out/web/assets/mali-latin-ext-500-normal-BfJE4UMZ.woff2 +0 -0
  796. package/out/web/assets/mali-latin-ext-500-normal-FoLEyOKS.woff +0 -0
  797. package/out/web/assets/mali-latin-ext-600-normal-BTvIfiCp.woff2 +0 -0
  798. package/out/web/assets/mali-latin-ext-600-normal-DAQcLVmD.woff +0 -0
  799. package/out/web/assets/mali-thai-400-normal-BO7A3bLZ.woff2 +0 -0
  800. package/out/web/assets/mali-thai-400-normal-CX9VrjTn.woff +0 -0
  801. package/out/web/assets/mali-thai-500-normal-Cph2qha9.woff +0 -0
  802. package/out/web/assets/mali-thai-500-normal-D89rMT77.woff2 +0 -0
  803. package/out/web/assets/mali-thai-600-normal-DPgXT6rZ.woff +0 -0
  804. package/out/web/assets/mali-thai-600-normal-DlTx3OsB.woff2 +0 -0
  805. package/out/web/assets/mali-vietnamese-400-normal-DUKxzXaz.woff2 +0 -0
  806. package/out/web/assets/mali-vietnamese-400-normal-gFDLvsOK.woff +0 -0
  807. package/out/web/assets/mali-vietnamese-500-normal--OY07q2c.woff +0 -0
  808. package/out/web/assets/mali-vietnamese-500-normal-KDrNRwfW.woff2 +0 -0
  809. package/out/web/assets/mali-vietnamese-600-normal-CtTMUU7T.woff +0 -0
  810. package/out/web/assets/mali-vietnamese-600-normal-DFlJr66u.woff2 +0 -0
  811. package/out/web/assets/mermaid.core-DYGGlqOf.js +0 -11
  812. package/out/web/assets/mitr-latin-400-normal-Cb18vPmZ.woff +0 -0
  813. package/out/web/assets/mitr-latin-400-normal-CwbkLQ4a.woff2 +0 -0
  814. package/out/web/assets/mitr-latin-500-normal-B4JOhzAi.woff +0 -0
  815. package/out/web/assets/mitr-latin-500-normal-BmClOow2.woff2 +0 -0
  816. package/out/web/assets/mitr-latin-ext-400-normal-B3CPG7Yo.woff2 +0 -0
  817. package/out/web/assets/mitr-latin-ext-400-normal-DTx65hiC.woff +0 -0
  818. package/out/web/assets/mitr-latin-ext-500-normal-B_Diajz1.woff2 +0 -0
  819. package/out/web/assets/mitr-latin-ext-500-normal-DYOsVaVT.woff +0 -0
  820. package/out/web/assets/mitr-thai-400-normal-CS4Do6aM.woff +0 -0
  821. package/out/web/assets/mitr-thai-400-normal-CXWaAdVj.woff2 +0 -0
  822. package/out/web/assets/mitr-thai-500-normal-CVdBrEVH.woff2 +0 -0
  823. package/out/web/assets/mitr-thai-500-normal-CW_B5D-i.woff +0 -0
  824. package/out/web/assets/mitr-vietnamese-400-normal-CPMGWyoC.woff2 +0 -0
  825. package/out/web/assets/mitr-vietnamese-400-normal-Z6XhIpdY.woff +0 -0
  826. package/out/web/assets/mitr-vietnamese-500-normal-CDrv0585.woff2 +0 -0
  827. package/out/web/assets/mitr-vietnamese-500-normal-CMQWyq-Z.woff +0 -0
  828. package/out/web/assets/noto-sans-thai-latin-400-normal-BaWBrqFP.woff2 +0 -0
  829. package/out/web/assets/noto-sans-thai-latin-400-normal-Dh_FJjOB.woff +0 -0
  830. package/out/web/assets/noto-sans-thai-latin-500-normal-BC04jsmm.woff +0 -0
  831. package/out/web/assets/noto-sans-thai-latin-500-normal-fyBKClF1.woff2 +0 -0
  832. package/out/web/assets/noto-sans-thai-latin-600-normal-CemcjnVR.woff2 +0 -0
  833. package/out/web/assets/noto-sans-thai-latin-600-normal-Dbc-dNO6.woff +0 -0
  834. package/out/web/assets/noto-sans-thai-latin-ext-400-normal-B-1H0YkH.woff +0 -0
  835. package/out/web/assets/noto-sans-thai-latin-ext-400-normal-nBP59pVw.woff2 +0 -0
  836. package/out/web/assets/noto-sans-thai-latin-ext-500-normal-B-ZWb8SZ.woff2 +0 -0
  837. package/out/web/assets/noto-sans-thai-latin-ext-500-normal-CrEHO7C8.woff +0 -0
  838. package/out/web/assets/noto-sans-thai-latin-ext-600-normal-PkMZo0xa.woff +0 -0
  839. package/out/web/assets/noto-sans-thai-latin-ext-600-normal-maHHBsez.woff2 +0 -0
  840. package/out/web/assets/noto-sans-thai-thai-400-normal-BEOmKAI1.woff2 +0 -0
  841. package/out/web/assets/noto-sans-thai-thai-400-normal-Dxb_unuU.woff +0 -0
  842. package/out/web/assets/noto-sans-thai-thai-500-normal-BOGXO2tw.woff +0 -0
  843. package/out/web/assets/noto-sans-thai-thai-500-normal-CU_X86GQ.woff2 +0 -0
  844. package/out/web/assets/noto-sans-thai-thai-600-normal-CmgB8_JK.woff +0 -0
  845. package/out/web/assets/noto-sans-thai-thai-600-normal-Cs73sVjl.woff2 +0 -0
  846. package/out/web/assets/oauthManager-DNiwM8Rn.js +0 -2
  847. package/out/web/assets/oauthManager-DuamS1Av.css +0 -1
  848. package/out/web/assets/outfit-latin-300-normal-AWLfuCom.woff +0 -0
  849. package/out/web/assets/outfit-latin-300-normal-CRYTwY6m.woff2 +0 -0
  850. package/out/web/assets/outfit-latin-400-normal-BGsTXAXT.woff2 +0 -0
  851. package/out/web/assets/outfit-latin-400-normal-DMwTpYkH.woff +0 -0
  852. package/out/web/assets/outfit-latin-500-normal-ClnHRwRh.woff +0 -0
  853. package/out/web/assets/outfit-latin-500-normal-DKnIMDSk.woff2 +0 -0
  854. package/out/web/assets/outfit-latin-600-normal-B7SfZ07L.woff2 +0 -0
  855. package/out/web/assets/outfit-latin-600-normal-BEfTtDA7.woff +0 -0
  856. package/out/web/assets/outfit-latin-ext-300-normal-BYS6Dpvq.woff2 +0 -0
  857. package/out/web/assets/outfit-latin-ext-300-normal-CMIMshEd.woff +0 -0
  858. package/out/web/assets/outfit-latin-ext-400-normal-5tcqmc2S.woff2 +0 -0
  859. package/out/web/assets/outfit-latin-ext-400-normal-DHm7mdGe.woff +0 -0
  860. package/out/web/assets/outfit-latin-ext-500-normal-DrCvqoFD.woff +0 -0
  861. package/out/web/assets/outfit-latin-ext-500-normal-zeox_O30.woff2 +0 -0
  862. package/out/web/assets/outfit-latin-ext-600-normal-B85nYjL1.woff2 +0 -0
  863. package/out/web/assets/outfit-latin-ext-600-normal-CWJcPgd7.woff +0 -0
  864. package/out/web/assets/preload-helper-D0uHx7FM.js +0 -1
  865. package/out/web/assets/prompt-latin-400-normal-BQ9zjSN8.woff2 +0 -0
  866. package/out/web/assets/prompt-latin-400-normal-CxU4ec_r.woff +0 -0
  867. package/out/web/assets/prompt-latin-500-normal-B1edBDQ9.woff +0 -0
  868. package/out/web/assets/prompt-latin-500-normal-CxzxEHZc.woff2 +0 -0
  869. package/out/web/assets/prompt-latin-600-normal-CSDDLorv.woff +0 -0
  870. package/out/web/assets/prompt-latin-600-normal-hKZWXsc1.woff2 +0 -0
  871. package/out/web/assets/prompt-latin-ext-400-normal-1pHbN9uy.woff +0 -0
  872. package/out/web/assets/prompt-latin-ext-400-normal-DdSafGZ9.woff2 +0 -0
  873. package/out/web/assets/prompt-latin-ext-500-normal--EZ1um7s.woff2 +0 -0
  874. package/out/web/assets/prompt-latin-ext-500-normal-D-lI1EVT.woff +0 -0
  875. package/out/web/assets/prompt-latin-ext-600-normal-C8b50x67.woff +0 -0
  876. package/out/web/assets/prompt-latin-ext-600-normal-Cg9L7iJU.woff2 +0 -0
  877. package/out/web/assets/prompt-thai-400-normal-BrkKv8cO.woff2 +0 -0
  878. package/out/web/assets/prompt-thai-400-normal-DJypnfr3.woff +0 -0
  879. package/out/web/assets/prompt-thai-500-normal-C18pDUoL.woff2 +0 -0
  880. package/out/web/assets/prompt-thai-500-normal-D7YNqUJD.woff +0 -0
  881. package/out/web/assets/prompt-thai-600-normal-CYPViXds.woff +0 -0
  882. package/out/web/assets/prompt-thai-600-normal-MrdfU7zR.woff2 +0 -0
  883. package/out/web/assets/prompt-vietnamese-400-normal-BCPzsgPT.woff2 +0 -0
  884. package/out/web/assets/prompt-vietnamese-400-normal-D4pLyeNK.woff +0 -0
  885. package/out/web/assets/prompt-vietnamese-500-normal-DmzxmPwa.woff2 +0 -0
  886. package/out/web/assets/prompt-vietnamese-500-normal-w_sS_j2F.woff +0 -0
  887. package/out/web/assets/prompt-vietnamese-600-normal-1dyohtNh.woff +0 -0
  888. package/out/web/assets/prompt-vietnamese-600-normal-7QWjJBsF.woff2 +0 -0
  889. package/out/web/assets/sarabun-latin-400-normal-DmguIS-7.woff +0 -0
  890. package/out/web/assets/sarabun-latin-400-normal-URPBxl-K.woff2 +0 -0
  891. package/out/web/assets/sarabun-latin-500-normal-BjUTcdxu.woff2 +0 -0
  892. package/out/web/assets/sarabun-latin-500-normal-CJexTAnl.woff +0 -0
  893. package/out/web/assets/sarabun-latin-600-normal-9FonlkKx.woff +0 -0
  894. package/out/web/assets/sarabun-latin-600-normal-DMD3TROr.woff2 +0 -0
  895. package/out/web/assets/sarabun-latin-ext-400-normal-BbP7GpLL.woff2 +0 -0
  896. package/out/web/assets/sarabun-latin-ext-400-normal-BsmTn0SS.woff +0 -0
  897. package/out/web/assets/sarabun-latin-ext-500-normal-Cot16Bd2.woff +0 -0
  898. package/out/web/assets/sarabun-latin-ext-500-normal-DE1LysqI.woff2 +0 -0
  899. package/out/web/assets/sarabun-latin-ext-600-normal-0tXu9x_i.woff +0 -0
  900. package/out/web/assets/sarabun-latin-ext-600-normal-BRxjKUQ6.woff2 +0 -0
  901. package/out/web/assets/sarabun-thai-400-normal-C2DaJlKK.woff2 +0 -0
  902. package/out/web/assets/sarabun-thai-400-normal-CH-UbWgg.woff +0 -0
  903. package/out/web/assets/sarabun-thai-500-normal-BVssjame.woff2 +0 -0
  904. package/out/web/assets/sarabun-thai-500-normal-C3iDLEzi.woff +0 -0
  905. package/out/web/assets/sarabun-thai-600-normal-3dIAQ-_s.woff2 +0 -0
  906. package/out/web/assets/sarabun-thai-600-normal-DWKeTe6a.woff +0 -0
  907. package/out/web/assets/sarabun-vietnamese-400-normal-DPfkSCMy.woff +0 -0
  908. package/out/web/assets/sarabun-vietnamese-400-normal-igdrzAGY.woff2 +0 -0
  909. package/out/web/assets/sarabun-vietnamese-500-normal-CpRVvGRU.woff +0 -0
  910. package/out/web/assets/sarabun-vietnamese-500-normal-Dpe7Br9m.woff2 +0 -0
  911. package/out/web/assets/sarabun-vietnamese-600-normal-BMbOgAW-.woff +0 -0
  912. package/out/web/assets/sarabun-vietnamese-600-normal-DkxrOlLB.woff2 +0 -0
  913. package/out/web/assets/stateDiagram-v2-4QOOHH4V-s6P9g2_b.js +0 -1
  914. package/out/web/assets/swimlanesDiagram-VK2B7HYN-CV9fOLrV.js +0 -8
  915. package/out/web/assets/tauri-CNrHQ2Gb.js +0 -3
  916. package/out/web/assets/window-DkIhgI7B.js +0 -1
  917. package/skills-lock.json +0 -41
  918. package/src/renderer/public/Live2DCubismCore.js +0 -9
  919. package/src/renderer/src/companionWidget.ts +0 -95
  920. package/src/renderer/src/components/Live2DStage.tsx +0 -389
  921. package/src/renderer/src/components/ModelPanel.tsx +0 -154
  922. package/src/renderer/src/css/model.css +0 -627
  923. package/src/renderer/src-web/companionWidget.ts +0 -37
  924. package/src/renderer/src-web/components/ModelPanel.tsx +0 -12
  925. package/src/renderer/src-web/css/model.css +0 -628
@@ -1,5 +1,8 @@
1
+ import { createLibraryTransport } from '../shared/library/transport'
2
+ import { createSourcesTransport } from '../shared/conversation/sourcesTransport'
1
3
  export * from '../shared/types'
2
4
  import type { MintPlatformApi } from '../shared/platform'
5
+ import { createConversationTransport } from '../shared/conversation/transport'
3
6
  import type {
4
7
 
5
8
  RuntimeStatus,
@@ -8,12 +11,13 @@ import type {
8
11
  DocumentAttachment,
9
12
  AgentProgress,
10
13
  InteractionMemory,
14
+ ConversationSnapshot,
15
+ ConversationChanges,
11
16
  ChatSession,
12
17
  PictureEntry,
13
18
  ImageGenRequest,
14
19
  ImageGenProviders,
15
20
  ImageGenResponse,
16
- WorkspaceTreeEntry,
17
21
  CodeEdit,
18
22
  CodeEditProposal,
19
23
  LearnedSkill,
@@ -22,14 +26,14 @@ import type {
22
26
  CronJobDraft,
23
27
  LinkedFolder,
24
28
  LinkedFolderDraft,
29
+ LinkedFolderNote,
30
+ LinkedFolderStatus,
25
31
  GitCheckpoint,
32
+ GitBranchInfo,
33
+ GitBranchChangeOutcome,
26
34
  } from '../shared/types'
27
35
 
28
36
 
29
- type DesktopStreamEvent =
30
- | { type: 'chunk'; chunk: string }
31
- | { type: 'progress'; progress: AgentProgress }
32
-
33
37
  export type { GeminiLiveEvent } from '../shared/utils/useGeminiLiveVoice'
34
38
  import type { GeminiLiveEvent } from '../shared/utils/useGeminiLiveVoice'
35
39
 
@@ -38,9 +42,13 @@ export const isTauriRuntime = () => (
38
42
  typeof window !== 'undefined' && Boolean((window as any).__TAURI_INTERNALS__)
39
43
  )
40
44
 
41
- /** The last browser Notification shown by notifyAiResponse's fallback
42
- * (non-Tauri) branch, so clearAiNotifications can dismiss it. */
43
- let lastAiNotification: Notification | null = null
45
+ const WEB_SETTINGS_CHANGED_EVENT = 'mint:web-settings-changed'
46
+
47
+ function dispatchWebSettingsChanged(config: any) {
48
+ window.dispatchEvent(new CustomEvent(WEB_SETTINGS_CHANGED_EVENT, { detail: config }))
49
+ }
50
+
51
+ import { sendBrowserNotification, clearBrowserNotifications, openNotificationChat } from '../shared/utils/notifications'
44
52
 
45
53
  /**
46
54
  * Root-relative: the web build's SPA fallback serves index-web.html at deep
@@ -398,9 +406,9 @@ export async function fetchProviderModels(
398
406
  return invoke<string[]>('fetch_provider_models', { provider, apiKey, baseUrl })
399
407
  }
400
408
 
401
- /** Fetch the live model list for image `provider` from its API.
402
- * Returns a dynamic list on success, falling back to static presets on any
403
- * network or auth error. Results are cached for 1 hour on the Rust side. */
409
+ /** Fetch image model choices from the shared Rust catalog.
410
+ * Discovered models precede missing presets; blank overrides use the saved key.
411
+ * Provider discovery is cached for 1 hour on the Rust side. */
404
412
  export async function fetchImageProviderModels(
405
413
  provider: string,
406
414
  apiKey: string = '',
@@ -417,9 +425,9 @@ export async function fetchImageProviderModels(
417
425
  return invoke<string[]>('fetch_image_provider_models', { provider, apiKey: apiKey || '' })
418
426
  }
419
427
 
420
- /** Fetch the live model list for video `provider` from its API.
421
- * Returns a dynamic list on success, falling back to static presets on any
422
- * network or auth error. Results are cached for 1 hour on the Rust side. */
428
+ /** Fetch video model choices from the shared Rust catalog.
429
+ * Discovered models precede missing presets; blank overrides use the saved key.
430
+ * Provider discovery is cached for 1 hour on the Rust side. */
423
431
  export async function fetchVideoProviderModels(
424
432
  provider: string,
425
433
  apiKey: string = '',
@@ -436,10 +444,9 @@ export async function fetchVideoProviderModels(
436
444
  return invoke<string[]>('fetch_video_provider_models', { provider, apiKey: apiKey || '' })
437
445
  }
438
446
 
439
- /** Fetch the list of Gemini Live–capable models (BidiGenerateContent / native-audio)
440
- * from the Gemini API. Returns a dynamic list on success; falls back to an empty
441
- * array so the hook can use its static GEMINI_LIVE_MODELS preset instead.
442
- * Results are cached for 1 hour on the Rust side. */
447
+ /** Fetch Gemini Live model choices from the shared Rust catalog.
448
+ * Discovered models precede missing presets; blank overrides use the saved key.
449
+ * Provider discovery is cached for 1 hour on the Rust side. */
443
450
  export async function fetchGeminiLiveModels(apiKey: string): Promise<string[]> {
444
451
  if (typeof window === 'undefined' || !isTauriRuntime()) {
445
452
  const params = new URLSearchParams({ apiKey: apiKey || '' })
@@ -453,178 +460,12 @@ export async function fetchGeminiLiveModels(apiKey: string): Promise<string[]> {
453
460
  return invoke<string[]>('fetch_gemini_live_models', { apiKey: apiKey || '' })
454
461
  }
455
462
 
456
- export async function sendChatMessage(
457
- message: string,
458
- imageDataUri?: string | null,
459
- audioDataUri?: string | null,
460
- videoDataUri?: string | null,
461
- documentAttachment?: DocumentAttachment | null,
462
- workspacePath?: string | null,
463
- chatId?: string | null,
464
- agentId?: string | null,
465
- ): Promise<ChatResponse> {
466
- const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri)
467
- if (typeof window === 'undefined' || !isTauriRuntime()) {
468
- const API_BASE = getApiBase();
469
- try {
470
- const res = await authFetch(`${API_BASE}/chat`, {
471
- method: 'POST',
472
- headers: { 'Content-Type': 'application/json' },
473
- body: JSON.stringify({ message: outgoingMessage, systemInstruction: '', chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId })
474
- });
475
- const data = await res.json().catch(() => null);
476
- if (!res.ok) {
477
- return {
478
- provider: 'error',
479
- model: 'error',
480
- text: data?.text || data?.message || data?.status || `Local API returned HTTP ${res.status}`,
481
- };
482
- }
483
- if (!data || typeof data.text !== 'string') {
484
- return {
485
- provider: 'error',
486
- model: 'error',
487
- text: 'Local API returned an invalid chat response.',
488
- };
489
- }
490
- return data;
491
- } catch (e) {
492
- console.error("Failed to send chat message to local server:", e);
493
- return { provider: 'error', model: 'error', text: `Failed to connect to Local API Server: ${e}` };
494
- }
495
- }
496
- const { invoke } = await import('@tauri-apps/api/core')
497
- const response = await invoke<ChatResponse>('send_chat_message', {
498
- request: { message: outgoingMessage, systemInstruction: '', chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId },
499
- })
500
- if (imageDataUri) {
501
- await invoke('save_pictures', {
502
- images: imageDataUri.split(' '),
503
- source: 'chat',
504
- message: outgoingMessage,
505
- })
506
- }
507
- if (videoDataUri) {
508
- await invoke('save_pictures', {
509
- images: videoDataUri.split(' '),
510
- source: 'chat',
511
- message: outgoingMessage,
512
- })
513
- }
514
- return response
515
- }
516
-
517
- export async function streamChatMessage(
518
- message: string,
519
- onChunk: (chunk: string) => void,
520
- imageDataUri?: string | null,
521
- audioDataUri?: string | null,
522
- videoDataUri?: string | null,
523
- systemInstruction = '',
524
- onProgress?: (progress: AgentProgress) => void,
525
- documentAttachment?: DocumentAttachment | null,
526
- workspacePath?: string | null,
527
- chatId?: string | null,
528
- agentId?: string | null,
529
- // Unused on web (no plan-mode-approval UI here) — kept only so this positional
530
- // arg list stays aligned with the desktop `tauri.ts`, since the shared
531
- // `MintDashboard.tsx` call site passes the same argument list to both builds.
532
- _planMode?: boolean,
533
- pinnedMcpServer?: string | null,
534
- // Web has no separate Tauri event bus for approvals (unlike desktop's
535
- // global `listen('tool-approval-requested', ...)`), so the server sends
536
- // an `approval-requested` event down this same ndjson stream instead —
537
- // this callback is how the caller learns about it.
538
- onApprovalRequested?: (payload: { token: string; approval: any }) => void,
539
- ): Promise<ChatResponse> {
540
- if (typeof window === 'undefined' || !isTauriRuntime()) {
541
- const API_BASE = getApiBase();
542
- const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri);
543
- const res = await authFetch(`${API_BASE}/chat-stream`, {
544
- method: 'POST',
545
- headers: { 'Content-Type': 'application/json' },
546
- body: JSON.stringify({ message: outgoingMessage, systemInstruction, chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId, pinnedMcpServer })
547
- });
548
- if (!res.ok) {
549
- const data = await res.json().catch(() => null);
550
- throw new Error(data?.text || data?.message || `HTTP ${res.status}`);
551
- }
552
- const reader = res.body?.getReader();
553
- if (!reader) {
554
- throw new Error("No response body reader");
555
- }
556
- const decoder = new TextDecoder();
557
- let buffer = '';
558
- let finalResponse: ChatResponse | null = null;
559
- while (true) {
560
- const { value, done } = await reader.read();
561
- if (done) break;
562
- buffer += decoder.decode(value, { stream: true });
563
- const lines = buffer.split('\n');
564
- buffer = lines.pop() || '';
565
- for (const line of lines) {
566
- if (!line.trim()) continue;
567
- try {
568
- const event = JSON.parse(line);
569
- if (event.type === 'chunk') {
570
- onChunk(event.chunk);
571
- } else if (event.type === 'progress') {
572
- onProgress?.(event.progress);
573
- } else if (event.type === 'done') {
574
- finalResponse = event.response;
575
- } else if (event.type === 'approval-requested') {
576
- onApprovalRequested?.({ token: event.token, approval: event.approval });
577
- }
578
- } catch (e) {
579
- console.error("Failed to parse stream line:", line, e);
580
- }
581
- }
582
- }
583
- if (finalResponse) return finalResponse;
584
- throw new Error("Stream closed without a final response");
585
- }
586
- const { invoke, Channel } = await import('@tauri-apps/api/core')
587
- const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri)
588
- const onEvent = new Channel<DesktopStreamEvent>()
589
- onEvent.onmessage = (event) => {
590
- if (event.type === 'chunk') onChunk(event.chunk)
591
- else onProgress?.(event.progress)
592
- }
593
- const response = await invoke<ChatResponse>('stream_chat_message', {
594
- request: { message: outgoingMessage, systemInstruction, chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId, pinnedMcpServer },
595
- onEvent,
596
- })
597
- if (imageDataUri) {
598
- await invoke('save_pictures', {
599
- images: imageDataUri.split(' '),
600
- source: 'chat',
601
- message: outgoingMessage,
602
- })
603
- }
604
- if (videoDataUri) {
605
- await invoke('save_pictures', {
606
- images: videoDataUri.split(' '),
607
- source: 'chat',
608
- message: outgoingMessage,
609
- })
610
- }
611
- return response
612
- }
613
-
614
- function withImagePlaceholder(message: string, imageDataUri?: string | null, videoDataUri?: string | null) {
615
- let finalMessage = message
616
- if (imageDataUri && !finalMessage.includes('[Image #1]')) {
617
- const imageCount = imageDataUri.split(/\s+/).filter(Boolean).length
618
- const markers = Array.from({ length: imageCount }, (_, index) => `[Image #${index + 1}]`).join(' ')
619
- if (markers) finalMessage = `${finalMessage} ${markers}`
620
- }
621
- if (videoDataUri && !finalMessage.includes('[Video #1]')) {
622
- const videoCount = videoDataUri.split(/\s+/).filter(Boolean).length
623
- const markers = Array.from({ length: videoCount }, (_, index) => `[Video #${index + 1}]`).join(' ')
624
- if (markers) finalMessage = `${finalMessage} ${markers}`
625
- }
626
- return finalMessage
627
- }
463
+ export const { sendChatMessage, streamChatMessage } = createConversationTransport({
464
+ isNative: isTauriRuntime,
465
+ apiBase: getLocalApiBase,
466
+ fetch: authFetch,
467
+ ownerToken: getStoredAuthToken,
468
+ })
628
469
 
629
470
  export async function getTtsUrls(text: string): Promise<TtsUrl[]> {
630
471
  if (typeof window === 'undefined') return []
@@ -739,6 +580,29 @@ export async function getRecentInteractions(limit = 50, chatId?: string | null,
739
580
  return invoke<InteractionMemory[]>('get_recent_interactions', { limit, chatId, workspacePath })
740
581
  }
741
582
 
583
+ export async function getConversationSnapshot(chatId: string, beforeId?: number | null, limit = 50): Promise<ConversationSnapshot> {
584
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
585
+ const params = new URLSearchParams({ chatId, limit: String(limit) })
586
+ if (beforeId != null) params.set('beforeId', String(beforeId))
587
+ const response = await authFetch(`${getApiBase()}/conversation-snapshot?${params}`)
588
+ if (!response.ok) throw new Error(`Conversation snapshot failed: ${response.status}`)
589
+ return response.json()
590
+ }
591
+ const { invoke } = await import('@tauri-apps/api/core')
592
+ return invoke<ConversationSnapshot>('get_conversation_snapshot', { chatId, beforeId, limit })
593
+ }
594
+
595
+ export async function getConversationChanges(chatId: string, after: number, limit = 100): Promise<ConversationChanges> {
596
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
597
+ const params = new URLSearchParams({ chatId, after: String(after), limit: String(limit) })
598
+ const response = await authFetch(`${getApiBase()}/conversation-changes?${params}`)
599
+ if (!response.ok) throw new Error(`Conversation changes failed: ${response.status}`)
600
+ return response.json()
601
+ }
602
+ const { invoke } = await import('@tauri-apps/api/core')
603
+ return invoke<ConversationChanges>('get_conversation_changes', { chatId, after, limit })
604
+ }
605
+
742
606
  export async function saveSystemInteraction(
743
607
  chatId: string,
744
608
  userText: string,
@@ -804,6 +668,23 @@ export async function listChatSessions(): Promise<ChatSession[]> {
804
668
  return invoke<ChatSession[]>('list_chat_sessions')
805
669
  }
806
670
 
671
+ export async function updateChatSessionWorkspace(chatId: string, workspacePath: string | null): Promise<void> {
672
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
673
+ const res = await authFetch(`${getApiBase()}/chat-sessions/workspace`, {
674
+ method: 'POST',
675
+ headers: { 'Content-Type': 'application/json' },
676
+ body: JSON.stringify({ chatId, workspacePath })
677
+ })
678
+ if (!res.ok) {
679
+ const data = await res.json().catch(() => null)
680
+ throw new Error(data?.error || `Could not save conversation workspace (HTTP ${res.status})`)
681
+ }
682
+ return
683
+ }
684
+ const { invoke } = await import('@tauri-apps/api/core')
685
+ await invoke('update_chat_session_workspace', { chatId, workspacePath })
686
+ }
687
+
807
688
  export async function deleteChatSession(chatId: string): Promise<number> {
808
689
  if (typeof window === 'undefined' || !isTauriRuntime()) {
809
690
  const API_BASE = getApiBase();
@@ -1148,7 +1029,9 @@ export function installTauriAdapters() {
1148
1029
  headers: { 'Content-Type': 'application/json' },
1149
1030
  body: JSON.stringify(config)
1150
1031
  });
1151
- return await res.json();
1032
+ const data = await res.json();
1033
+ if (res.ok) dispatchWebSettingsChanged(config)
1034
+ return data;
1152
1035
  } catch (e) {
1153
1036
  console.error("Failed to save settings to local server:", e);
1154
1037
  return {};
@@ -1194,16 +1077,9 @@ export function installTauriAdapters() {
1194
1077
 
1195
1078
  (window as any).widgetAPI = {
1196
1079
  onStateChange: () => {},
1197
- };
1198
-
1199
- (window as any).screenPickerApi = {
1200
- onScreenshot: () => {},
1201
- sendSelection: () => {},
1202
- startContinuousTranslation: () => {},
1203
- stopContinuousTranslation: () => {},
1204
- onTranslationResult: () => {},
1205
- closePicker: () => {},
1206
- setOverlayInteractable: () => {},
1080
+ openChat: async () => {},
1081
+ setVisible: async () => {},
1082
+ startDragging: async () => {},
1207
1083
  };
1208
1084
 
1209
1085
  (window as any).api = {
@@ -1291,7 +1167,9 @@ export function installTauriAdapters() {
1291
1167
  headers: { 'Content-Type': 'application/json' },
1292
1168
  body: JSON.stringify(config)
1293
1169
  });
1294
- return await res.json();
1170
+ const data = await res.json();
1171
+ if (res.ok) dispatchWebSettingsChanged(config)
1172
+ return data;
1295
1173
  } catch (e) {
1296
1174
  return {};
1297
1175
  }
@@ -1301,10 +1179,12 @@ export function installTauriAdapters() {
1301
1179
  window.history.replaceState(null, '', window.location.pathname + window.location.search)
1302
1180
  }
1303
1181
  },
1304
- onSettingsChanged: () => {},
1182
+ onSettingsChanged: (callback: (config: any) => void) => {
1183
+ window.addEventListener(WEB_SETTINGS_CHANGED_EVENT, (event) => {
1184
+ callback((event as CustomEvent).detail)
1185
+ })
1186
+ },
1305
1187
  startVision: () => {},
1306
- onVisionReady: async () => () => {},
1307
- captureSilentScreen: async () => '',
1308
1188
  getSmartContext: async () => {
1309
1189
  try {
1310
1190
  const res = await authFetch(`${API_BASE}/smart-context`);
@@ -1342,20 +1222,8 @@ export function installTauriAdapters() {
1342
1222
  }
1343
1223
  },
1344
1224
  onSpotlightToChat: async () => () => {},
1345
- notifyAiResponse: async (preview: string) => {
1346
- if (typeof Notification === 'undefined') return
1347
- let permission = Notification.permission
1348
- if (permission === 'default') {
1349
- permission = await Notification.requestPermission()
1350
- }
1351
- if (permission === 'granted') {
1352
- lastAiNotification = new Notification('Mint Agent', { body: preview })
1353
- }
1354
- },
1355
- clearAiNotifications: () => {
1356
- lastAiNotification?.close()
1357
- lastAiNotification = null
1358
- },
1225
+ notifyAiResponse: (preview: string, chatId?: string) => sendBrowserNotification(preview, chatId, openNotificationChat),
1226
+ clearAiNotifications: clearBrowserNotifications,
1359
1227
  getTtsUrls: async () => [],
1360
1228
  setAiState: () => {},
1361
1229
  };
@@ -1457,58 +1325,9 @@ export function installTauriAdapters() {
1457
1325
  const { listen } = await import('@tauri-apps/api/event')
1458
1326
  void listen<string>('widget-state', (event) => callback(event.payload))
1459
1327
  },
1460
- }
1461
-
1462
- window.screenPickerApi = {
1463
- onScreenshot: async (callback) => {
1464
- const { invoke } = await import('@tauri-apps/api/core')
1465
- try {
1466
- const image = await captureSharedScreen()
1467
- callback(image)
1468
- } catch (reason) {
1469
- console.warn('Screen share capture failed, falling back to native capture:', reason)
1470
- void invoke<string>('capture_silent_screen').then(callback)
1471
- }
1472
- },
1473
- sendSelection: async (image) => {
1474
- const { invoke } = await import('@tauri-apps/api/core')
1475
- return void invoke('submit_screen_selection', { image })
1476
- },
1477
- startContinuousTranslation: (rect) => {
1478
- let translationTimer: ReturnType<typeof setInterval> | null = null
1479
- const translate = async () => {
1480
- const { invoke } = await import('@tauri-apps/api/core')
1481
- void invoke<string>('translate_capture_region', { rect })
1482
- .then((text) => window.dispatchEvent(new CustomEvent('mint-translation', { detail: text })))
1483
- .catch((reason) => {
1484
- window.dispatchEvent(new CustomEvent('mint-translation', { detail: String(reason) }))
1485
- })
1486
- }
1487
- translate()
1488
- translationTimer = setInterval(translate, 3000)
1489
-
1490
- // Clean up helper attached to window if needed
1491
- if ((window as any)._stopTranslate) (window as any)._stopTranslate()
1492
- ;(window as any)._stopTranslate = () => {
1493
- if (translationTimer) clearInterval(translationTimer)
1494
- }
1495
- },
1496
- stopContinuousTranslation: () => {
1497
- if ((window as any)._stopTranslate) {
1498
- (window as any)._stopTranslate()
1499
- }
1500
- },
1501
- onTranslationResult: (callback) => {
1502
- window.addEventListener('mint-translation', ((event: CustomEvent<string>) => {
1503
- callback(event.detail)
1504
- }) as EventListener)
1505
- },
1506
- closePicker: async () => {
1507
- const { invoke } = await import('@tauri-apps/api/core')
1508
- const { getCurrentWindow } = await import('@tauri-apps/api/window')
1509
- return invoke('close_desktop_window', { label: getCurrentWindow().label })
1510
- },
1511
- setOverlayInteractable: () => {},
1328
+ openChat: async () => {},
1329
+ setVisible: async () => {},
1330
+ startDragging: async () => {},
1512
1331
  }
1513
1332
 
1514
1333
  window.api = {
@@ -1556,23 +1375,7 @@ export function installTauriAdapters() {
1556
1375
  onSettingsChanged: settingsChanged,
1557
1376
  startVision: async () => {
1558
1377
  const { invoke } = await import('@tauri-apps/api/core')
1559
- try {
1560
- const image = await captureSharedScreen()
1561
- window.localStorage.setItem('mint:pending-screen-capture', image)
1562
- } catch (reason) {
1563
- console.warn('Screen share capture failed before opening picker:', reason)
1564
- const image = await invoke<string>('capture_silent_screen')
1565
- window.localStorage.setItem('mint:pending-screen-capture', image)
1566
- }
1567
- return invoke('start_screen_capture')
1568
- },
1569
- onVisionReady: async (callback) => {
1570
- const { listen } = await import('@tauri-apps/api/event')
1571
- return listen<string>('vision-ready', (event) => callback(event.payload))
1572
- },
1573
- captureSilentScreen: async () => {
1574
- const { invoke } = await import('@tauri-apps/api/core')
1575
- return invoke('capture_silent_screen')
1378
+ return invoke('start_live_translate')
1576
1379
  },
1577
1380
  getSmartContext: async () => {
1578
1381
  const { invoke } = await import('@tauri-apps/api/core')
@@ -1600,19 +1403,10 @@ export function installTauriAdapters() {
1600
1403
  const { listen } = await import('@tauri-apps/api/event')
1601
1404
  return listen<string>('spotlight-to-chat', (event) => callback(event.payload))
1602
1405
  },
1603
- notifyAiResponse: async (preview) => {
1604
- const { isPermissionGranted, requestPermission, sendNotification } = await import('@tauri-apps/plugin-notification')
1605
- let granted = await isPermissionGranted()
1606
- if (!granted) {
1607
- granted = (await requestPermission()) === 'granted'
1608
- }
1609
- if (granted) {
1610
- sendNotification({ title: 'Mint Agent', body: preview })
1611
- }
1406
+ notifyAiResponse: async (preview, chatId) => {
1407
+ const { invoke } = await import('@tauri-apps/api/core')
1408
+ await invoke('send_mint_notification', { body: preview, chatId: chatId ?? null })
1612
1409
  },
1613
- // The plugin has no reliable cross-platform way to dismiss an
1614
- // already-shown OS notification from JS — best-effort no-op; there's
1615
- // simply nothing stale left for the next unfocused reply to build on.
1616
1410
  clearAiNotifications: () => {},
1617
1411
  getTtsUrls: async (text) => {
1618
1412
  const { invoke } = await import('@tauri-apps/api/core')
@@ -1625,51 +1419,14 @@ export function installTauriAdapters() {
1625
1419
  }
1626
1420
  }
1627
1421
 
1628
- async function captureSharedScreen(): Promise<string> {
1629
- // On Linux (especially under Wayland/WebKitGTK), getDisplayMedia often returns a black screen
1630
- // or fails silently. Bypass it to force fallback to native screenshot commands.
1631
- if (navigator.userAgent.toLowerCase().includes('linux')) {
1632
- throw new Error('Linux detected, bypassing getDisplayMedia to use native screenshot tools')
1633
- }
1634
-
1635
- if (!navigator.mediaDevices?.getDisplayMedia) {
1636
- throw new Error('getDisplayMedia is not available')
1637
- }
1638
-
1639
- const stream = await navigator.mediaDevices.getDisplayMedia({
1640
- video: true,
1641
- audio: false,
1642
- })
1643
- try {
1644
- const video = document.createElement('video')
1645
- video.srcObject = stream
1646
- video.muted = true
1647
- await video.play()
1648
- await new Promise<void>((resolve) => {
1649
- if (video.videoWidth > 0 && video.videoHeight > 0) {
1650
- resolve()
1651
- } else {
1652
- video.onloadedmetadata = () => resolve()
1653
- }
1654
- })
1655
-
1656
- const canvas = document.createElement('canvas')
1657
- canvas.width = video.videoWidth || window.screen.width
1658
- canvas.height = video.videoHeight || window.screen.height
1659
- const context = canvas.getContext('2d')
1660
- if (!context) throw new Error('Unable to create screen capture canvas')
1661
- context.drawImage(video, 0, 0, canvas.width, canvas.height)
1662
- return canvas.toDataURL('image/png')
1663
- } finally {
1664
- stream.getTracks().forEach((track) => track.stop())
1665
- }
1666
- }
1667
-
1668
1422
  export async function listLearnedSkills(workspacePath?: string): Promise<LearnedSkill[]> {
1669
1423
  if (typeof window === 'undefined' || !isTauriRuntime()) {
1670
1424
  try {
1671
1425
  const API_BASE = getLocalApiBase()
1672
- const res = await authFetch(`${API_BASE}/learned-skills`)
1426
+ const params = new URLSearchParams()
1427
+ if (workspacePath?.trim()) params.set('workspacePath', workspacePath)
1428
+ const suffix = params.size ? `?${params.toString()}` : ''
1429
+ const res = await authFetch(`${API_BASE}/learned-skills${suffix}`)
1673
1430
  if (res.ok) {
1674
1431
  return await res.json()
1675
1432
  }
@@ -1789,19 +1546,20 @@ export async function deleteSubagent(sourcePath: string): Promise<void> {
1789
1546
 
1790
1547
  export async function runSlashCommand(
1791
1548
  input: string,
1792
- cwd?: string | null
1549
+ cwd?: string | null,
1550
+ chatId?: string | null
1793
1551
  ): Promise<import('../shared/platform').SlashResponse> {
1794
1552
  if (typeof window === 'undefined' || !isTauriRuntime()) {
1795
1553
  const res = await authFetch(`${getLocalApiBase()}/slash`, {
1796
1554
  method: 'POST',
1797
1555
  headers: { 'Content-Type': 'application/json' },
1798
- body: JSON.stringify({ input, cwd: cwd ?? null })
1556
+ body: JSON.stringify({ input, cwd: cwd ?? null, chat_id: chatId ?? null })
1799
1557
  })
1800
1558
  if (!res.ok) return { kind: 'not_handled' }
1801
1559
  return res.json()
1802
1560
  }
1803
1561
  const { invoke } = await import('@tauri-apps/api/core')
1804
- return invoke('run_slash_command', { input, cwd: cwd ?? null })
1562
+ return invoke('run_slash_command', { input, cwd: cwd ?? null, chatId: chatId ?? null })
1805
1563
  }
1806
1564
 
1807
1565
  export async function listCronJobs(): Promise<CronJob[]> {
@@ -1858,7 +1616,7 @@ export async function setCronJobEnabled(id: string, enabled: boolean): Promise<C
1858
1616
  export async function listLinkedFolders(): Promise<Record<string, LinkedFolder>> {
1859
1617
  if (typeof window === 'undefined' || !isTauriRuntime()) {
1860
1618
  const res = await authFetch(`${getLocalApiBase()}/linked-folders`)
1861
- if (!res.ok) return {}
1619
+ if (!res.ok) throw new Error('Failed to load linked folders')
1862
1620
  return res.json()
1863
1621
  }
1864
1622
  const { invoke } = await import('@tauri-apps/api/core')
@@ -1894,38 +1652,160 @@ export async function removeLinkedFolder(name: string): Promise<void> {
1894
1652
  await invoke('remove_linked_folder', { name })
1895
1653
  }
1896
1654
 
1897
- export async function getWorkspaceTree(path?: string | null): Promise<WorkspaceTreeEntry> {
1655
+ export async function linkedFolderStatus(name: string): Promise<LinkedFolderStatus> {
1656
+ const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/status`)
1657
+ if (!res.ok) throw new Error('Failed to load folder status')
1658
+ return res.json()
1659
+ }
1660
+
1661
+ export async function refreshLinkedFolder(name: string): Promise<LinkedFolderStatus> {
1662
+ const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/refresh`, { method: 'POST' })
1663
+ if (!res.ok) throw new Error('Failed to refresh folder')
1664
+ return res.json()
1665
+ }
1666
+
1667
+ export async function listLinkedFolderNotes(name: string): Promise<LinkedFolderNote[]> {
1668
+ const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/notes`)
1669
+ if (!res.ok) throw new Error('Failed to load notes')
1670
+ return res.json()
1671
+ }
1672
+
1673
+ export async function readLinkedFolderNote(name: string, id: string): Promise<string> {
1674
+ const res = await authFetch(`${getLocalApiBase()}/linked-folders/${encodeURIComponent(name)}/notes/${encodeURIComponent(id)}`)
1675
+ if (!res.ok) throw new Error('Failed to read note')
1676
+ return (await res.json()).content
1677
+ }
1678
+
1679
+ export async function openLinkedFolderNote(name: string, id: string): Promise<void> {
1680
+ if (!isTauriRuntime()) return
1681
+ const { invoke } = await import('@tauri-apps/api/core')
1682
+ await invoke('open_linked_folder_note', { name, id })
1683
+ }
1684
+
1685
+ export async function getWorkspaceSnapshot(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
1898
1686
  if (typeof window === 'undefined' || !isTauriRuntime()) {
1899
1687
  return {
1900
- name: 'Workspace',
1901
- path: '.',
1902
- kind: 'directory',
1903
- children: [
1904
- { name: 'src', path: 'src', kind: 'directory', children: [] },
1905
- { name: 'package.json', path: 'package.json', kind: 'file', children: [] },
1906
- ],
1688
+ path: operation.root, revision: operation.revision,
1689
+ git: { isRepository: false, currentBranch: null, detachedHead: null, branches: [], remoteBranches: [], isDirty: false },
1690
+ tree: { name: 'Workspace', path: '.', kind: 'directory', children: [] },
1907
1691
  }
1908
1692
  }
1909
1693
  const { invoke } = await import('@tauri-apps/api/core')
1910
- return invoke<WorkspaceTreeEntry>('get_workspace_tree', { path })
1694
+ return invoke('get_workspace_snapshot', { operation })
1695
+ }
1696
+
1697
+ export async function getWorkspaceGitDiff(workspacePath: string): Promise<import('../shared/types').FileChange[]> {
1698
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
1699
+ try {
1700
+ const res = await fetch(`/api/git/diff?workspace=${encodeURIComponent(workspacePath)}`)
1701
+ if (res.ok) {
1702
+ return (await res.json()) || []
1703
+ }
1704
+ } catch {
1705
+ // fallback
1706
+ }
1707
+ return []
1708
+ }
1709
+ const { invoke } = await import('@tauri-apps/api/core')
1710
+ return invoke<import('../shared/types').FileChange[]>('get_workspace_git_diff', { workspacePath })
1711
+ }
1712
+
1713
+ export async function getGitBranchInfo(workspacePath: string): Promise<GitBranchInfo> {
1714
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
1715
+ return { isRepository: false, currentBranch: null, detachedHead: null, branches: [], remoteBranches: [], isDirty: false }
1716
+ }
1717
+ const { invoke } = await import('@tauri-apps/api/core')
1718
+ return invoke<GitBranchInfo>('get_git_branch_info', { workspacePath })
1719
+ }
1720
+
1721
+ export async function switchGitBranch(
1722
+ workspacePath: string,
1723
+ branch: string,
1724
+ confirmedDirtyWorkspace = false,
1725
+ ): Promise<GitBranchChangeOutcome> {
1726
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
1727
+ throw new Error('Branch switching is only available in the desktop app.')
1728
+ }
1729
+ const { invoke } = await import('@tauri-apps/api/core')
1730
+ return invoke<GitBranchChangeOutcome>('switch_git_branch', { workspacePath, branch, confirmedDirtyWorkspace })
1731
+ }
1732
+
1733
+ export async function createGitBranch(
1734
+ workspacePath: string,
1735
+ branch: string,
1736
+ confirmedDirtyWorkspace = false,
1737
+ ): Promise<GitBranchChangeOutcome> {
1738
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
1739
+ throw new Error('Branch creation is only available in the desktop app.')
1740
+ }
1741
+ const { invoke } = await import('@tauri-apps/api/core')
1742
+ return invoke<GitBranchChangeOutcome>('create_git_branch', { workspacePath, branch, confirmedDirtyWorkspace })
1743
+ }
1744
+
1745
+ export async function checkoutRemoteGitBranch(
1746
+ workspacePath: string,
1747
+ remoteBranch: string,
1748
+ confirmedDirtyWorkspace = false,
1749
+ ): Promise<GitBranchChangeOutcome> {
1750
+ if (typeof window === 'undefined' || !isTauriRuntime()) {
1751
+ throw new Error('Remote branch checkout is only available in the desktop app.')
1752
+ }
1753
+ const { invoke } = await import('@tauri-apps/api/core')
1754
+ return invoke<GitBranchChangeOutcome>('checkout_remote_git_branch', { workspacePath, remoteBranch, confirmedDirtyWorkspace })
1755
+ }
1756
+
1757
+ export async function getGitGraph(workspacePath: string): Promise<string[]> {
1758
+ if (typeof window === 'undefined' || !isTauriRuntime()) return []
1759
+ const { invoke } = await import('@tauri-apps/api/core')
1760
+ return invoke<string[]>('get_git_graph', { workspacePath })
1761
+ }
1762
+
1763
+ export async function createWorkspaceFile(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
1764
+ if (typeof window === 'undefined' || !isTauriRuntime()) throw new Error('Workspace files are only available in the desktop app.')
1765
+ const { invoke } = await import('@tauri-apps/api/core')
1766
+ return invoke('create_workspace_file', { operation })
1767
+ }
1768
+
1769
+ export async function createWorkspaceFolder(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
1770
+ if (typeof window === 'undefined' || !isTauriRuntime()) throw new Error('Workspace folders are only available in the desktop app.')
1771
+ const { invoke } = await import('@tauri-apps/api/core')
1772
+ return invoke('create_workspace_folder', { operation })
1911
1773
  }
1912
1774
 
1913
- export async function createWorkspaceFile(path: string): Promise<void> {
1914
- if (typeof window === 'undefined' || !isTauriRuntime()) return
1775
+ export async function deleteWorkspaceItem(operation: import('../shared/types').WorkspaceOperation): Promise<import('../shared/types').WorkspaceSnapshot> {
1776
+ if (typeof window === 'undefined' || !isTauriRuntime()) throw new Error('Workspace files are only available in the desktop app.')
1915
1777
  const { invoke } = await import('@tauri-apps/api/core')
1916
- return invoke('create_workspace_file', { path })
1778
+ return invoke('delete_workspace_item', { operation })
1917
1779
  }
1918
1780
 
1919
- export async function createWorkspaceFolder(path: string): Promise<void> {
1920
- if (typeof window === 'undefined' || !isTauriRuntime()) return
1781
+ export async function moveWorkspaceItem(operation: import('../shared/types').WorkspaceOperation, destination: string): Promise<import('../shared/types').WorkspaceSnapshot> {
1782
+ if (!isTauriRuntime()) throw new Error('Workspace file management is only available in the desktop app.')
1921
1783
  const { invoke } = await import('@tauri-apps/api/core')
1922
- return invoke('create_workspace_folder', { path })
1784
+ return invoke('move_workspace_item', { operation, destination })
1923
1785
  }
1924
1786
 
1925
- export async function deleteWorkspaceItem(path: string): Promise<void> {
1926
- if (typeof window === 'undefined' || !isTauriRuntime()) return
1787
+ export async function listWorkspaceHistory(root: string): Promise<import('../shared/types').WorkspaceHistoryEntry[]> {
1788
+ if (!isTauriRuntime()) {
1789
+ const response = await authFetch(`${getApiBase()}/workspace-history?root=${encodeURIComponent(root)}`)
1790
+ const data = await response.json()
1791
+ if (!response.ok) throw new Error(data.message || 'Failed to read workspace history.')
1792
+ return data
1793
+ }
1927
1794
  const { invoke } = await import('@tauri-apps/api/core')
1928
- return invoke('delete_workspace_item', { path })
1795
+ return invoke('list_workspace_history', { root })
1796
+ }
1797
+
1798
+ export async function undoWorkspaceAction(root: string, revision: number, expectedId?: string): Promise<import('../shared/types').WorkspaceSnapshot> {
1799
+ if (!isTauriRuntime()) {
1800
+ const response = await authFetch(`${getApiBase()}/workspace-history/undo`, {
1801
+ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ root, revision, expectedId }),
1802
+ })
1803
+ const data = await response.json()
1804
+ if (!response.ok) throw new Error(data.message || 'Failed to undo workspace action.')
1805
+ return data
1806
+ }
1807
+ const { invoke } = await import('@tauri-apps/api/core')
1808
+ return invoke('undo_workspace_action', { root, revision, expectedId })
1929
1809
  }
1930
1810
 
1931
1811
  export async function selectWorkspaceDirectory(): Promise<string | null> {
@@ -2412,8 +2292,28 @@ export const readWorkspaceFile = async (path: string, workspacePath?: string): P
2412
2292
  return invoke('read_workspace_file', { path, workspacePath })
2413
2293
  }
2414
2294
 
2295
+ export async function modsOperation(operation: import('../shared/mods').ModOperation): Promise<import('../shared/mods').ModResponse> {
2296
+ if (isTauriRuntime()) {
2297
+ const { invoke } = await import('@tauri-apps/api/core')
2298
+ return invoke('mods_operation', { operation })
2299
+ }
2300
+ const res = await authFetch(`${getApiBase()}/mods`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(operation) })
2301
+ const value = await res.json()
2302
+ if (!res.ok) throw new Error(value.error || 'Mod operation failed')
2303
+ return value
2304
+ }
2305
+
2306
+ export const { listLibrary, getLibraryItem, setLibraryTrashed, removeLibraryItem, readLibraryFile } = createLibraryTransport({ isNative: isTauriRuntime, apiBase: getApiBase, fetch: authFetch })
2307
+
2308
+ export const { getConversationSources, saveSourceAttachments } = createSourcesTransport({ isNative: isTauriRuntime, apiBase: getApiBase, fetch: authFetch })
2309
+
2415
2310
  // Enforce compile-time check against the shared platform interface
2416
2311
  const _apiCheck: MintPlatformApi = {
2312
+ listLibrary, getLibraryItem, setLibraryTrashed, removeLibraryItem, readLibraryFile,
2313
+ getConversationSources, saveSourceAttachments,
2314
+ modsOperation,
2315
+ readMcpArtifact,
2316
+ listBackgroundJobs, getBackgroundJob, stopBackgroundJob, deleteBackgroundJob,
2417
2317
  runSlashCommand,
2418
2318
  authRegister,
2419
2319
  authLogin,
@@ -2428,9 +2328,12 @@ const _apiCheck: MintPlatformApi = {
2428
2328
  getTtsUrls,
2429
2329
  cancelChatMessage,
2430
2330
  getRecentInteractions,
2331
+ getConversationSnapshot,
2332
+ getConversationChanges,
2431
2333
  saveSystemInteraction,
2432
2334
  saveInteractionAgentActivity,
2433
2335
  listChatSessions,
2336
+ updateChatSessionWorkspace,
2434
2337
  deleteChatSession,
2435
2338
  renameChatSession,
2436
2339
  getProfileValue,
@@ -2447,10 +2350,20 @@ const _apiCheck: MintPlatformApi = {
2447
2350
  generateImages,
2448
2351
  getImageGenProviders,
2449
2352
  setDefaultImageProvider,
2450
- getWorkspaceTree,
2353
+ getWorkspaceSnapshot,
2354
+ getWorkspaceGitDiff,
2355
+ getGitBranchInfo,
2356
+ switchGitBranch,
2357
+ createGitBranch,
2358
+ checkoutRemoteGitBranch,
2359
+ getGitGraph,
2451
2360
  createWorkspaceFile,
2452
2361
  createWorkspaceFolder,
2453
2362
  deleteWorkspaceItem,
2363
+ moveWorkspaceItem,
2364
+ listWorkspaceHistory,
2365
+ startHtmlPreview,
2366
+ undoWorkspaceAction,
2454
2367
  selectWorkspaceDirectory,
2455
2368
  selectLinkedFolderPath,
2456
2369
  submitToolApproval,
@@ -2465,3 +2378,35 @@ const _apiCheck: MintPlatformApi = {
2465
2378
  testMcpConnection,
2466
2379
  }
2467
2380
 
2381
+
2382
+ async function backgroundRequest<T>(path: string, method = 'GET'): Promise<T> {
2383
+ const response = await authFetch(`${getLocalApiBase()}/background-jobs${path}`, { method })
2384
+ const value = await response.json()
2385
+ if (!response.ok) throw new Error(`${response.status}: ${value.message || 'Background terminal request failed'}`)
2386
+ return value as T
2387
+ }
2388
+ export async function listBackgroundJobs(workspace?: string): Promise<import('../shared/types').BackgroundJob[]> {
2389
+ const value = await backgroundRequest<{jobs: import('../shared/types').BackgroundJob[]}>(workspace ? `?workspace=${encodeURIComponent(workspace)}` : '')
2390
+ return value.jobs
2391
+ }
2392
+ export function getBackgroundJob(id: string) { return backgroundRequest<import('../shared/types').BackgroundJobOutput>(`/${encodeURIComponent(id)}`) }
2393
+ export function stopBackgroundJob(id: string) { return backgroundRequest<import('../shared/types').BackgroundJob>(`/${encodeURIComponent(id)}/stop`, 'POST') }
2394
+ export function deleteBackgroundJob(id: string) { return backgroundRequest<{deleted: boolean}>(`/${encodeURIComponent(id)}`, 'DELETE').then(() => undefined) }
2395
+
2396
+ export async function startHtmlPreview(root: string, relativePath: string, mintBrowser = false): Promise<{url: string; jobId: string}> {
2397
+ const response = await authFetch(`${getLocalApiBase()}/html-preview`, { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify({root, relativePath, mintBrowser}) })
2398
+ const value = await response.json()
2399
+ if (!response.ok) throw new Error(value.message || 'Could not start HTML preview')
2400
+ return value
2401
+ }
2402
+
2403
+ /** Loads artifacts by ID; no server-provided filesystem path is accepted. */
2404
+ export async function readMcpArtifact(id: string): Promise<string> {
2405
+ if (isTauriRuntime()) {
2406
+ const { invoke } = await import('@tauri-apps/api/core')
2407
+ return invoke<string>('read_mcp_artifact', { id })
2408
+ }
2409
+ const response = await authFetch(`${getApiBase()}/mcp-artifacts/${encodeURIComponent(id)}`)
2410
+ if (!response.ok) throw new Error('Artifact unavailable')
2411
+ return URL.createObjectURL(await response.blob())
2412
+ }