@pheem49/mint 1.15.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 (644) hide show
  1. package/Cargo.lock +1012 -69
  2. package/Cargo.toml +5 -2
  3. package/LICENSE +21 -654
  4. package/README.md +92 -817
  5. package/Release_Note.md +53 -560
  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 +6 -0
  13. package/crates/mint-cli/src/agent/live_status.rs +187 -39
  14. package/crates/mint-cli/src/agent.rs +323 -95
  15. package/crates/mint-cli/src/commands/agent.rs +69 -55
  16. package/crates/mint-cli/src/commands/integrations.rs +7 -0
  17. package/crates/mint-cli/src/commands/knowledge.rs +12 -32
  18. package/crates/mint-cli/src/commands/mod.rs +44 -0
  19. package/crates/mint-cli/src/image.rs +31 -33
  20. package/crates/mint-cli/src/interactive/chat_tui.rs +3594 -483
  21. package/crates/mint-cli/src/interactive/input_box.rs +56 -6
  22. package/crates/mint-cli/src/interactive/slash_commands.rs +208 -56
  23. package/crates/mint-cli/src/interactive/tool_activity.rs +328 -0
  24. package/crates/mint-cli/src/interactive.rs +64 -40
  25. package/crates/mint-cli/src/main.rs +13 -7
  26. package/crates/mint-cli/src/mcp.rs +5 -0
  27. package/crates/mint-cli/src/mod_host.rs +6 -0
  28. package/crates/mint-cli/src/mods_cli.rs +62 -0
  29. package/crates/mint-cli/src/mods_ui.rs +187 -0
  30. package/crates/mint-cli/src/onboard.rs +5 -31
  31. package/crates/mint-cli/src/terminal_theme.rs +3 -1
  32. package/crates/mint-cli/src/updater.rs +56 -2
  33. package/crates/mint-cli/tests/library_intake.rs +77 -0
  34. package/crates/mint-cli/tests/mods_testing.rs +133 -0
  35. package/crates/mint-companion-protocol/Cargo.toml +10 -0
  36. package/crates/mint-companion-protocol/src/lib.rs +163 -0
  37. package/crates/mint-core/Cargo.toml +6 -3
  38. package/crates/mint-core/build.rs +26 -0
  39. package/crates/mint-core/src/agent/chat.rs +167 -39
  40. package/crates/mint-core/src/agent/code_tools.rs +15 -0
  41. package/crates/mint-core/src/agent/memory/sources.rs +240 -0
  42. package/crates/mint-core/src/agent/memory.rs +147 -13
  43. package/crates/mint-core/src/agent/skill_inventory.rs +325 -0
  44. package/crates/mint-core/src/agent/skills.rs +437 -90
  45. package/crates/mint-core/src/agent.rs +1 -0
  46. package/crates/mint-core/src/api_server/routes/background_jobs.rs +310 -0
  47. package/crates/mint-core/src/api_server/routes/chat.rs +216 -199
  48. package/crates/mint-core/src/api_server/routes/html_preview.rs +77 -0
  49. package/crates/mint-core/src/api_server/routes/library.rs +97 -0
  50. package/crates/mint-core/src/api_server/routes/media_gen.rs +10 -57
  51. package/crates/mint-core/src/api_server/routes/misc.rs +104 -107
  52. package/crates/mint-core/src/api_server/routes/mod.rs +6 -0
  53. package/crates/mint-core/src/api_server/routes/mods.rs +31 -0
  54. package/crates/mint-core/src/api_server/routes/sessions.rs +41 -0
  55. package/crates/mint-core/src/api_server/routes/skills_subagents.rs +12 -42
  56. package/crates/mint-core/src/api_server/routes/slash.rs +50 -1
  57. package/crates/mint-core/src/api_server/routes/sources.rs +101 -0
  58. package/crates/mint-core/src/api_server.rs +118 -9
  59. package/crates/mint-core/src/avatar_bridge.rs +11 -2
  60. package/crates/mint-core/src/browser/session.rs +52 -0
  61. package/crates/mint-core/src/companion.rs +716 -0
  62. package/crates/mint-core/src/cron/scheduler.rs +34 -2
  63. package/crates/mint-core/src/integrations/channels.rs +87 -345
  64. package/crates/mint-core/src/integrations/mcp.rs +397 -50
  65. package/crates/mint-core/src/integrations/mcp_calls.rs +823 -0
  66. package/crates/mint-core/src/integrations/mcp_catalog.rs +267 -0
  67. package/crates/mint-core/src/integrations/mcp_device.rs +319 -0
  68. package/crates/mint-core/src/integrations/mcp_result.rs +356 -0
  69. package/crates/mint-core/src/integrations/webhooks.rs +539 -0
  70. package/crates/mint-core/src/integrations.rs +2 -0
  71. package/crates/mint-core/src/lib.rs +85 -26
  72. package/crates/mint-core/src/media/gemini_live.rs +134 -14
  73. package/crates/mint-core/src/media/image_models.rs +3 -27
  74. package/crates/mint-core/src/media/image_workflow.rs +216 -0
  75. package/crates/mint-core/src/media/library/intake.rs +144 -0
  76. package/crates/mint-core/src/media/library/migration.rs +56 -0
  77. package/crates/mint-core/src/media/library/removal.rs +55 -0
  78. package/crates/mint-core/src/media/library/tests.rs +730 -0
  79. package/crates/mint-core/src/media/library/thumbnails.rs +72 -0
  80. package/crates/mint-core/src/media/library.rs +545 -0
  81. package/crates/mint-core/src/media/model_catalog.rs +375 -0
  82. package/crates/mint-core/src/media/pictures.rs +79 -222
  83. package/crates/mint-core/src/media/video_models.rs +3 -22
  84. package/crates/mint-core/src/media.rs +3 -0
  85. package/crates/mint-core/src/mods/manager.rs +1124 -0
  86. package/crates/mint-core/src/mods/mod.rs +569 -0
  87. package/crates/mint-core/src/mods/operations.rs +204 -0
  88. package/crates/mint-core/src/mods/session.rs +146 -0
  89. package/crates/mint-core/src/mods/slash.rs +59 -0
  90. package/crates/mint-core/src/mods/telemetry.rs +306 -0
  91. package/crates/mint-core/src/orchestration/approvals.rs +344 -0
  92. package/crates/mint-core/src/orchestration/context_render.rs +104 -0
  93. package/crates/mint-core/src/orchestration/mcp_review.rs +153 -0
  94. package/crates/mint-core/src/orchestration/memory_skill.rs +104 -32
  95. package/crates/mint-core/src/orchestration/mod.rs +2139 -244
  96. package/crates/mint-core/src/orchestration/mod_authoring_regressions.rs +209 -0
  97. package/crates/mint-core/src/orchestration/progress_clock.rs +80 -0
  98. package/crates/mint-core/src/orchestration/repeated_failures.rs +116 -0
  99. package/crates/mint-core/src/orchestration/review_regressions.rs +449 -0
  100. package/crates/mint-core/src/orchestration/run_control.rs +196 -0
  101. package/crates/mint-core/src/orchestration/tools/files.rs +161 -14
  102. package/crates/mint-core/src/orchestration/tools/media.rs +37 -41
  103. package/crates/mint-core/src/orchestration/tools/misc.rs +3 -2
  104. package/crates/mint-core/src/orchestration/tools/mod.rs +2 -0
  105. package/crates/mint-core/src/orchestration/tools/mods.rs +161 -0
  106. package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +303 -71
  107. package/crates/mint-core/src/orchestration/tools/shell.rs +95 -2
  108. package/crates/mint-core/src/orchestration/workspace_helpers.rs +4 -1
  109. package/crates/mint-core/src/prompts/agent.rs +17 -2
  110. package/crates/mint-core/src/prompts/tool_catalog.rs +28 -2
  111. package/crates/mint-core/src/search/knowledge.rs +7 -1
  112. package/crates/mint-core/src/search/linked_folders/index.rs +177 -13
  113. package/crates/mint-core/src/search/linked_folders.rs +83 -2
  114. package/crates/mint-core/src/slash/catalog.rs +1 -1
  115. package/crates/mint-core/src/slash/mod.rs +174 -11
  116. package/crates/mint-core/src/slash/mods.rs +155 -0
  117. package/crates/mint-core/src/system/bg_shell.rs +1129 -95
  118. package/crates/mint-core/src/system/config.rs +5 -10
  119. package/crates/mint-core/src/system/html_preview.rs +398 -0
  120. package/crates/mint-core/src/system/mint_web.rs +164 -0
  121. package/crates/mint-core/src/system/release_notes.rs +18 -0
  122. package/crates/mint-core/src/system/shell.rs +21 -6
  123. package/crates/mint-core/src/system/workspace.rs +72 -8
  124. package/crates/mint-core/src/system/workspace_history.rs +604 -0
  125. package/crates/mint-core/src/system.rs +4 -0
  126. package/crates/mint-core/tests/background_retention.rs +34 -0
  127. package/crates/mint-core/tests/background_shutdown.rs +24 -0
  128. package/crates/mint-core/tests/library_http.rs +209 -0
  129. package/crates/mint-core/tests/mcp_contract.rs +283 -0
  130. package/crates/mint-core/tests/mcp_stdio.rs +11 -10
  131. package/crates/mint-core/tests/media_model_catalog_http.rs +403 -0
  132. package/crates/mint-core/tests/mods_http.rs +215 -0
  133. package/crates/mint-core/tests/terminal_shutdown.rs +109 -0
  134. package/crates/mint-mod-runtime/Cargo.toml +18 -0
  135. package/crates/mint-mod-runtime/src/lib.rs +507 -0
  136. package/crates/mint-mod-runtime/src/sdk.js +56 -0
  137. package/crates/mint-mod-runtime/src/test_sdk.js +32 -0
  138. package/crates/mint-mod-runtime/src/testing.rs +94 -0
  139. package/crates/mint-mod-runtime/tests/runtime.rs +156 -0
  140. package/docs/mods/AUTHORING.md +61 -0
  141. package/docs/mods/README.md +139 -0
  142. package/docs/mods/TESTING.md +56 -0
  143. package/docs/mods/mint-mods.d.ts +66 -0
  144. package/examples/device-mcp/README.md +22 -0
  145. package/examples/device-mcp/contract.md +49 -0
  146. package/examples/device-mcp/mock-device.mjs +66 -0
  147. package/examples/device-mcp/server.mjs +48 -0
  148. package/examples/device-mcp/server.test.mjs +78 -0
  149. package/examples/mods/task-checklist/README.md +1 -0
  150. package/examples/mods/task-checklist/main.ts +17 -0
  151. package/examples/mods/task-checklist/manifest.json +1 -0
  152. package/examples/mods/task-checklist/tests/checklist.test.ts +15 -0
  153. package/examples/mods/token-meter/README.md +1 -0
  154. package/examples/mods/token-meter/main.ts +8 -0
  155. package/examples/mods/token-meter/manifest.json +1 -0
  156. package/examples/mods/tool-guard/README.md +1 -0
  157. package/examples/mods/tool-guard/main.ts +9 -0
  158. package/examples/mods/tool-guard/manifest.json +1 -0
  159. package/out/web/assets/CliSessionsView-CtzUJpK_.css +1 -0
  160. package/out/web/assets/CliSessionsView-D7hw0Mgj.js +1 -0
  161. package/out/web/assets/CodeReviewPage-C7bEOJfd.js +4 -0
  162. package/out/web/assets/CodeReviewPage-Dte9uLiL.css +1 -0
  163. package/out/web/assets/CommandPalette-0RrF-AOT.js +1 -0
  164. package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +1 -0
  165. package/out/web/assets/LibraryPage--Qfisp6D.js +2 -0
  166. package/out/web/assets/LibraryPage-DAxUTAg7.css +1 -0
  167. package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +1 -0
  168. package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +1 -0
  169. package/out/web/assets/McpServersView-slfQJzNB.js +1 -0
  170. package/out/web/assets/MintDashboard-BSR5XpXh.js +25 -0
  171. package/out/web/assets/MintDashboard-CWUcCGhd.css +1 -0
  172. package/out/web/assets/PluginsView-l7LSm503.js +1 -0
  173. package/out/web/assets/ScheduledTasksView-CttmLbq1.js +1 -0
  174. package/out/web/assets/SettingsWindow-BCMLYvEV.js +4 -0
  175. package/out/web/assets/SettingsWindow-DcMVmU9u.css +1 -0
  176. package/out/web/assets/SkillsView-rNs1qr_U.js +2 -0
  177. package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +37 -0
  178. package/out/web/assets/ToolSurfacePage-CTfgggF2.css +1 -0
  179. package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +4 -0
  180. package/out/web/assets/WorkspaceSelector-B2xIp04D.js +1 -0
  181. package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +1 -0
  182. package/out/web/assets/{abnfDiagram-VCTEODGH-ByMyfanq.js → abnfDiagram-VCTEODGH-CD0CjoGl.js} +1 -1
  183. package/out/web/assets/{architecture-7GRP2DOG-CLq2kEOB.js → architecture-7GRP2DOG-RKV83OeZ.js} +1 -1
  184. package/out/web/assets/{architectureDiagram-5GKGNRK7-6PoVSmNG.js → architectureDiagram-5GKGNRK7-nN_HAFct.js} +1 -1
  185. package/out/web/assets/{blockDiagram-NRAW4CY4-cKw9mAKi.js → blockDiagram-NRAW4CY4-BrrqzHW5.js} +1 -1
  186. package/out/web/assets/{c4Diagram-UCG6FXSJ-Cqy8N5Ge.js → c4Diagram-UCG6FXSJ-DTdV8_zE.js} +1 -1
  187. package/out/web/assets/{chunk-75Z2AOVW-3qybijF5.js → chunk-75Z2AOVW-_M0z5olV.js} +1 -1
  188. package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +2 -0
  189. package/out/web/assets/{chunk-CLGD4ZFX-CndDQkww.js → chunk-CLGD4ZFX-D54yGvGS.js} +1 -1
  190. package/out/web/assets/{chunk-DSNCTWBM-Cc4NxvgD.js → chunk-DSNCTWBM-C-gvT2ru.js} +1 -1
  191. package/out/web/assets/{chunk-DU6HZSFF-drzh6GsU.js → chunk-DU6HZSFF-CnFngIhW.js} +1 -1
  192. package/out/web/assets/{chunk-F27PBJKO-FiY35l4v.js → chunk-F27PBJKO-BqtWrnEO.js} +1 -1
  193. package/out/web/assets/{chunk-G27WJ6UU-Bjt9Il4A.js → chunk-G27WJ6UU-Ckoq5mi2.js} +1 -1
  194. package/out/web/assets/{chunk-GMAD6QVW-Bppi3Ctd.js → chunk-GMAD6QVW-BuhEcgHq.js} +1 -1
  195. package/out/web/assets/{chunk-JQ64N6SF-DGg5kcEV.js → chunk-JQ64N6SF-CF8T7GiZ.js} +1 -1
  196. package/out/web/assets/{chunk-LCL6LL3I-CCYcjd7p.js → chunk-LCL6LL3I-BhXV9zyH.js} +1 -1
  197. package/out/web/assets/{chunk-OBVCFTLP-DJeNil5M.js → chunk-OBVCFTLP-CRIkunUB.js} +1 -1
  198. package/out/web/assets/{chunk-P2QGCYS3-lRzkRjBB.js → chunk-P2QGCYS3-UFEU6BxZ.js} +1 -1
  199. package/out/web/assets/{chunk-POPQ4Y6H-DouASMBW.js → chunk-POPQ4Y6H-CQcrNbjr.js} +1 -1
  200. package/out/web/assets/{chunk-PWAF6VOD-DMmD1vVf.js → chunk-PWAF6VOD-Cc2uVDsG.js} +1 -1
  201. package/out/web/assets/{chunk-R7TYR2AO-CYLA5UC5.js → chunk-R7TYR2AO-DiCxzdAY.js} +1 -1
  202. package/out/web/assets/{chunk-RHFEMEQ7-BiXwEcUT.js → chunk-RHFEMEQ7-b7hnPmrR.js} +1 -1
  203. package/out/web/assets/{chunk-SVP7TREG-BV-zPslF.js → chunk-SVP7TREG-Bu_yYb-V.js} +1 -1
  204. package/out/web/assets/{chunk-TEH6E4GO-B2RGEohZ.js → chunk-TEH6E4GO-G4Cdlyrt.js} +1 -1
  205. package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +1 -0
  206. package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +1 -0
  207. package/out/web/assets/config-CnvCChUM.js +2 -0
  208. package/out/web/assets/config-DM6oIVO3.css +1 -0
  209. package/out/web/assets/core-DsKkQ7ig.js +1 -0
  210. package/out/web/assets/{cynefin-OW5HDTMX-Cas4csHM.js → cynefin-OW5HDTMX-CnzQfOGp.js} +1 -1
  211. package/out/web/assets/{cynefinDiagram-5FMLGOSQ-Bbpj66Y3.js → cynefinDiagram-5FMLGOSQ-DVtQnfpm.js} +1 -1
  212. package/out/web/assets/{dagre-3AP2YEHR-B0-2RDEd.js → dagre-3AP2YEHR-DG76_k5_.js} +1 -1
  213. package/out/web/assets/{diagram-S7CK7UJ4-BdzEjUyH.js → diagram-S7CK7UJ4-CaouUoze.js} +1 -1
  214. package/out/web/assets/{diagram-UQ7AKVKN-CJDwyPxF.js → diagram-UQ7AKVKN-B4bEc26B.js} +1 -1
  215. package/out/web/assets/{diagram-VSXAHHWV-BxaG1r_B.js → diagram-VSXAHHWV-BJ86Ov2Y.js} +1 -1
  216. package/out/web/assets/{diagram-VX7I27RA-BMmUqm8f.js → diagram-VX7I27RA-7hH5IPYf.js} +1 -1
  217. package/out/web/assets/{diagram-Z3DM3KII-CFtd03eE.js → diagram-Z3DM3KII-CCM4clo8.js} +1 -1
  218. package/out/web/assets/dist-js-BkYNznHX.js +1 -0
  219. package/out/web/assets/{ebnfDiagram-PWID7BFC-DwAen1hO.js → ebnfDiagram-PWID7BFC-Da7WAM3k.js} +1 -1
  220. package/out/web/assets/{erDiagram-SSCWMZ5O-BCZSHACj.js → erDiagram-SSCWMZ5O-CzzmnZWT.js} +1 -1
  221. package/out/web/assets/{event-ChBVpRy0.js → event-Cdt7Byyj.js} +1 -1
  222. package/out/web/assets/{eventmodeling-NTZA5JFV-XHStE4E_.js → eventmodeling-NTZA5JFV-xcfsA0XD.js} +1 -1
  223. package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +1 -0
  224. package/out/web/assets/{ganttDiagram-EL5Y4UJY-BAEu1Cql.js → ganttDiagram-EL5Y4UJY-B3ClFGmL.js} +1 -1
  225. package/out/web/assets/{gitGraph-4MIJSDKK-r32Vyper.js → gitGraph-4MIJSDKK-BZ_y_cDU.js} +1 -1
  226. package/out/web/assets/{gitGraphDiagram-WWUBYQGX-z9o9qt6V.js → gitGraphDiagram-WWUBYQGX-drhRSYm3.js} +1 -1
  227. package/out/web/assets/index-BZ9xgmMP.css +1 -0
  228. package/out/web/assets/index-Ca8cCS4h.js +168 -0
  229. package/out/web/assets/{info-A6RAGUB7-BvLaC2cw.js → info-A6RAGUB7-B7I3K0F1.js} +1 -1
  230. package/out/web/assets/{infoDiagram-RXCK75RN-Be6WAXXw.js → infoDiagram-RXCK75RN-deX_1MPh.js} +1 -1
  231. package/out/web/assets/{ishikawaDiagram-5VMMS53U-DZjoHJHC.js → ishikawaDiagram-5VMMS53U-s38yo28y.js} +1 -1
  232. package/out/web/assets/{journeyDiagram-EYS64GPL-CtVkjkGm.js → journeyDiagram-EYS64GPL-CZn2kB8b.js} +1 -1
  233. package/out/web/assets/jsx-runtime-DN4NhQUK.js +1 -0
  234. package/out/web/assets/{kanban-definition-3QL26DDD-CW5FMv1w.js → kanban-definition-3QL26DDD-DodjgySL.js} +1 -1
  235. package/out/web/assets/markdown-CMhYIcWB.js +39 -0
  236. package/out/web/assets/{mermaid-parser.core-aUgCqsZ5.js → mermaid-parser.core-Whu2rlJC.js} +3 -3
  237. package/out/web/assets/{mermaid.core-D57sEiSL.js → mermaid.core-CKyPo8VH.js} +4 -4
  238. package/out/web/assets/{mindmap-definition-FBJOCRG2-DAmSpM3a.js → mindmap-definition-FBJOCRG2-260WBDxZ.js} +1 -1
  239. package/out/web/assets/modelManager-CUaGWMWu.js +2 -0
  240. package/out/web/assets/{oauthManager-9jxicDWJ.js → oauthManager-DlNhXJr6.js} +1 -1
  241. package/out/web/assets/{packet-AYTQ26CC-DJ27iIoJ.js → packet-AYTQ26CC-CEeIRKRG.js} +1 -1
  242. package/out/web/assets/{pegDiagram-XKGWAZYB-Bj3ii-gS.js → pegDiagram-XKGWAZYB-BYadI-KO.js} +1 -1
  243. package/out/web/assets/{pie-WAS4IAKB-DG5mCUbc.js → pie-WAS4IAKB-D8uf4dh5.js} +1 -1
  244. package/out/web/assets/{pieDiagram-E7YTZNPT-BrJLPnDA.js → pieDiagram-E7YTZNPT-CjSDy4hO.js} +1 -1
  245. package/out/web/assets/{quadrantDiagram-AXDQQJYC-3x_TmF3j.js → quadrantDiagram-AXDQQJYC-B8D3gU5d.js} +1 -1
  246. package/out/web/assets/{radar-RG4KPBEZ-CrXaTTuV.js → radar-RG4KPBEZ-DZJxnokY.js} +1 -1
  247. package/out/web/assets/{railroad-74A4TZTK-BpqMH9BE.js → railroad-74A4TZTK-DBysUiUi.js} +1 -1
  248. package/out/web/assets/{railroad-abnf-HS5TGJTU-DHI0uLlV.js → railroad-abnf-HS5TGJTU-CHWxoJYg.js} +1 -1
  249. package/out/web/assets/{railroad-ebnf-LZEXJU2U-CQCb316y.js → railroad-ebnf-LZEXJU2U-DDv7X6bY.js} +1 -1
  250. package/out/web/assets/{railroad-peg-WCYAUIDC-Ph1giKkH.js → railroad-peg-WCYAUIDC-DpfcYYNJ.js} +1 -1
  251. package/out/web/assets/{railroadDiagram-O6MQD6OU-BRq6wIxx.js → railroadDiagram-O6MQD6OU-CYtyv0t3.js} +1 -1
  252. package/out/web/assets/{requirementDiagram-EFPCY7ZU-DIJj6G1g.js → requirementDiagram-EFPCY7ZU-D2X-Ewik.js} +1 -1
  253. package/out/web/assets/{sankeyDiagram-P5KCCOFB-DZajSryq.js → sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js} +1 -1
  254. package/out/web/assets/{sequenceDiagram-WJ2MYXX4-DxJCWyZS.js → sequenceDiagram-WJ2MYXX4-BvFLKtPd.js} +1 -1
  255. package/out/web/assets/{stateDiagram-HBIQ2CUA-k6voi8Vf.js → stateDiagram-HBIQ2CUA-Bx0GWeaY.js} +1 -1
  256. package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +1 -0
  257. package/out/web/assets/{swimlanes-XN3QIQJK-igYhTjXB.js → swimlanes-XN3QIQJK-CCma0T7L.js} +1 -1
  258. package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +8 -0
  259. package/out/web/assets/{timeline-definition-24CTP7MA-Dke2p93p.js → timeline-definition-24CTP7MA-iCRhhJ7C.js} +1 -1
  260. package/out/web/assets/{treeView-Q6P3EWNA-hNELnXUs.js → treeView-Q6P3EWNA-DZ-y08qp.js} +1 -1
  261. package/out/web/assets/{treemap-WGGIJYW6-D2B6wDsx.js → treemap-WGGIJYW6-De0CxzMx.js} +1 -1
  262. package/out/web/assets/{vennDiagram-4TSXK5OY-CDkW7rUP.js → vennDiagram-4TSXK5OY-w_7aZ6xe.js} +1 -1
  263. package/out/web/assets/{wardley-WFR3VGLG-BECdXETi.js → wardley-WFR3VGLG-DT0y0xJ4.js} +1 -1
  264. package/out/web/assets/{wardleyDiagram-VM6X3IG4-B5BycpQ4.js → wardleyDiagram-VM6X3IG4-DAdXELbQ.js} +1 -1
  265. package/out/web/assets/window-BJCVtyET.js +1 -0
  266. package/out/web/assets/{xychartDiagram-S5SC5T6Z-CtJS3b--.js → xychartDiagram-S5SC5T6Z-IZIXf3Vo.js} +1 -1
  267. package/out/web/index-web.html +3 -2
  268. package/out/web/index.html +3 -2
  269. package/package.json +71 -22
  270. package/shared-modules/.github/workflows/ci.yml +120 -0
  271. package/shared-modules/.github/workflows/update.yaml +28 -0
  272. package/slash-commands.json +7 -2
  273. package/src/bin/auto-build.js +66 -0
  274. package/src/bin/desktop.js +113 -0
  275. package/src/bin/desktop.test.js +113 -0
  276. package/src/bin/index.js +18 -25
  277. package/src/bin/index.test.js +89 -0
  278. package/src/bin/measure-effects.mjs +53 -0
  279. package/src/bin/package.test.js +28 -0
  280. package/src/bin/release-notes.test.js +84 -0
  281. package/src/bin/styles.test.js +20 -0
  282. package/src/bin/web.js +5 -0
  283. package/src/bin/web.test.js +39 -0
  284. package/src/renderer/index.html +0 -2
  285. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  286. package/src/renderer/shared/agentProgress.ts +33 -0
  287. package/src/renderer/shared/components/AgentActivityDrawer.tsx +3 -2
  288. package/src/renderer/shared/components/AgentActivityTable.tsx +1 -1
  289. package/src/renderer/shared/components/ApprovalCard.test.tsx +24 -0
  290. package/src/renderer/shared/components/ApprovalCard.tsx +10 -3
  291. package/src/renderer/shared/components/ArtifactPreviewPanel.tsx +88 -37
  292. package/src/renderer/shared/components/AuthGate.tsx +75 -39
  293. package/src/renderer/shared/components/BackgroundTerminals.tsx +181 -0
  294. package/src/renderer/shared/components/ChatCodeBlock.tsx +8 -4
  295. package/src/renderer/shared/components/ChatMessageItem.test.tsx +68 -0
  296. package/src/renderer/shared/components/ChatMessageItem.tsx +36 -16
  297. package/src/renderer/shared/components/ChatPanel.test.tsx +21 -0
  298. package/src/renderer/shared/components/ChatPanel.tsx +294 -272
  299. package/src/renderer/shared/components/ChunkErrorBoundary.tsx +4 -102
  300. package/src/renderer/shared/components/CliSessionsView.test.tsx +125 -0
  301. package/src/renderer/shared/components/CliSessionsView.tsx +61 -13
  302. package/src/renderer/shared/components/CodeReviewPage.tsx +111 -8
  303. package/src/renderer/shared/components/CollapsiblePasteInput.tsx +90 -0
  304. package/src/renderer/shared/components/ContextCompactionStatus.tsx +17 -0
  305. package/src/renderer/shared/components/DashboardSidebar.tsx +15 -128
  306. package/src/renderer/shared/components/DesktopTitlebar.tsx +45 -19
  307. package/src/renderer/shared/components/ErrorNotice.tsx +29 -0
  308. package/src/renderer/shared/components/FormattedMessage.tsx +11 -0
  309. package/src/renderer/shared/components/GeminiLiveOverlay.css +86 -0
  310. package/src/renderer/shared/components/GeminiLiveOverlay.test.tsx +24 -0
  311. package/src/renderer/shared/components/GeminiLiveOverlay.tsx +85 -101
  312. package/src/renderer/shared/components/GlideSelect.css +138 -0
  313. package/src/renderer/shared/components/GlideSelect.d.ts +31 -0
  314. package/src/renderer/shared/components/GlideSelect.jsx +266 -0
  315. package/src/renderer/shared/components/ImageSearchCard.tsx +46 -56
  316. package/src/renderer/shared/components/ImageStudioPanel.tsx +9 -8
  317. package/src/renderer/shared/components/LibraryItemCard.tsx +72 -0
  318. package/src/renderer/shared/components/LibraryPage.tsx +165 -0
  319. package/src/renderer/shared/components/LibraryPreview.tsx +59 -0
  320. package/src/renderer/shared/components/McpServersView.tsx +27 -8
  321. package/src/renderer/shared/components/McpToolAllowlist.tsx +2 -4
  322. package/src/renderer/shared/components/McpToolResults.tsx +99 -0
  323. package/src/renderer/shared/components/MintDashboard.tsx +308 -770
  324. package/src/renderer/shared/components/ModSessionControls.tsx +8 -0
  325. package/src/renderer/shared/components/ModUi.test.tsx +65 -0
  326. package/src/renderer/shared/components/ModUi.tsx +26 -0
  327. package/src/renderer/shared/components/ModelSelectorPopover.tsx +14 -7
  328. package/src/renderer/shared/components/ModsPanel.tsx +156 -0
  329. package/src/renderer/shared/components/ProgressActivity.tsx +17 -0
  330. package/src/renderer/shared/components/ReviewHistory.tsx +42 -0
  331. package/src/renderer/shared/components/RewindModal.tsx +5 -12
  332. package/src/renderer/shared/components/RunSummaryDashboard.tsx +6 -12
  333. package/src/renderer/shared/components/ScheduledTasksView.tsx +7 -6
  334. package/src/renderer/shared/components/SelectField.test.tsx +27 -0
  335. package/src/renderer/shared/components/SelectField.tsx +38 -0
  336. package/src/renderer/shared/components/SessionSources.tsx +48 -0
  337. package/src/renderer/shared/components/SessionSourcesPopover.tsx +61 -0
  338. package/src/renderer/shared/components/Settings/AgentsTab.tsx +7 -6
  339. package/src/renderer/shared/components/Settings/AudioTab.tsx +8 -7
  340. package/src/renderer/shared/components/Settings/AutomationTab.tsx +2 -2
  341. package/src/renderer/shared/components/Settings/GeneralTab.tsx +33 -32
  342. package/src/renderer/shared/components/Settings/MemoryTab.test.tsx +37 -0
  343. package/src/renderer/shared/components/Settings/MemoryTab.tsx +71 -31
  344. package/src/renderer/shared/components/Settings/NotificationsTab.test.tsx +15 -0
  345. package/src/renderer/shared/components/Settings/NotificationsTab.tsx +84 -0
  346. package/src/renderer/shared/components/Settings/ThemeTab.tsx +19 -11
  347. package/src/renderer/shared/components/SlashChoicePanel.tsx +88 -0
  348. package/src/renderer/shared/components/SlashSuggestions.test.tsx +33 -0
  349. package/src/renderer/shared/components/SlashSuggestions.tsx +38 -10
  350. package/src/renderer/shared/components/SourcesBlock.tsx +12 -20
  351. package/src/renderer/shared/components/ToolSurfacePage.test.tsx +32 -0
  352. package/src/renderer/shared/components/ToolSurfacePage.tsx +59 -11
  353. package/src/renderer/shared/components/ToolsPanelToggle.tsx +13 -0
  354. package/src/renderer/shared/components/VeoStudioPanel.tsx +9 -8
  355. package/src/renderer/shared/components/ViewedImages.tsx +36 -0
  356. package/src/renderer/shared/components/VirtualChatHistory.tsx +82 -0
  357. package/src/renderer/shared/components/VoicePill.css +85 -0
  358. package/src/renderer/shared/components/VoicePill.d.ts +12 -0
  359. package/src/renderer/shared/components/VoicePill.jsx +190 -0
  360. package/src/renderer/shared/components/VoicePill.test.tsx +22 -0
  361. package/src/renderer/shared/components/WorkspaceContextPopover.tsx +20 -15
  362. package/src/renderer/shared/components/WorkspacePaneResizer.tsx +92 -0
  363. package/src/renderer/shared/components/WorkspacePreviewActions.test.tsx +44 -0
  364. package/src/renderer/shared/components/WorkspacePreviewActions.tsx +19 -0
  365. package/src/renderer/shared/components/WorkspaceSelector.tsx +13 -8
  366. package/src/renderer/shared/components/background-terminals.css +292 -0
  367. package/src/renderer/shared/components/ui/README.md +52 -0
  368. package/src/renderer/shared/components/ui/button.tsx +37 -0
  369. package/src/renderer/shared/components/ui/demo.tsx +26 -0
  370. package/src/renderer/shared/components/ui/error-recovery.css +35 -0
  371. package/src/renderer/shared/components/ui/error-recovery.tsx +35 -0
  372. package/src/renderer/shared/components/ui/voice-powered-orb.css +6 -0
  373. package/src/renderer/shared/components/ui/voice-powered-orb.tsx +374 -0
  374. package/src/renderer/shared/components/workspace-selector.css +248 -0
  375. package/src/renderer/shared/constants/config.ts +30 -1
  376. package/src/renderer/shared/constants/slashCommands.ts +1 -1
  377. package/src/renderer/shared/conversation/lifecycle.test.ts +362 -0
  378. package/src/renderer/shared/conversation/lifecycle.ts +418 -0
  379. package/src/renderer/shared/conversation/projectNavigation.test.ts +105 -0
  380. package/src/renderer/shared/conversation/projectNavigation.ts +39 -0
  381. package/src/renderer/shared/conversation/sourcesTransport.ts +27 -0
  382. package/src/renderer/shared/conversation/syncView.test.ts +1 -34
  383. package/src/renderer/shared/conversation/syncView.ts +0 -37
  384. package/src/renderer/shared/conversation/transport.test.ts +163 -0
  385. package/src/renderer/shared/conversation/transport.ts +159 -0
  386. package/src/renderer/shared/conversation/useConversationCoordinator.ts +30 -72
  387. package/src/renderer/shared/css/agent-observability.css +20 -21
  388. package/src/renderer/shared/css/auth-gate.css +112 -13
  389. package/src/renderer/shared/css/code-review.css +33 -0
  390. package/src/renderer/shared/css/code-sessions.css +27 -0
  391. package/src/renderer/shared/css/collapsed-paste.css +35 -0
  392. package/src/renderer/shared/css/effects.css +15 -0
  393. package/src/renderer/shared/css/error-notice.css +60 -0
  394. package/src/renderer/shared/css/library.css +476 -0
  395. package/src/renderer/shared/css/management-views.css +138 -0
  396. package/src/renderer/shared/css/mcp-results.css +11 -0
  397. package/src/renderer/shared/css/model-selector.css +163 -105
  398. package/src/renderer/shared/css/mods.css +77 -0
  399. package/src/renderer/shared/css/notification-notice.css +28 -0
  400. package/src/renderer/shared/css/session-sources-popover.css +9 -0
  401. package/src/renderer/shared/css/session-sources.css +23 -0
  402. package/src/renderer/shared/css/settings/memory.css +154 -0
  403. package/src/renderer/shared/css/settings/notifications.css +11 -0
  404. package/src/renderer/shared/css/settings/theme.css +5 -0
  405. package/src/renderer/shared/css/slash-choice.css +95 -0
  406. package/src/renderer/shared/css/slash-suggestions.css +68 -0
  407. package/src/renderer/shared/css/sources-block.css +91 -0
  408. package/src/renderer/shared/css/thinking-status.css +46 -0
  409. package/src/renderer/shared/css/tools-panel.css +7 -0
  410. package/src/renderer/shared/css/ui-tailwind.css +19 -0
  411. package/src/renderer/shared/css/viewed-images.css +15 -0
  412. package/src/renderer/shared/fonts.css +46 -0
  413. package/src/renderer/shared/fonts.ts +3 -12
  414. package/src/renderer/shared/lib/utils.ts +6 -0
  415. package/src/renderer/shared/library/controller.test.ts +61 -0
  416. package/src/renderer/shared/library/controller.ts +57 -0
  417. package/src/renderer/shared/library/transport.test.ts +26 -0
  418. package/src/renderer/shared/library/transport.ts +60 -0
  419. package/src/renderer/shared/library/useLibraryFile.ts +38 -0
  420. package/src/renderer/shared/mods.ts +58 -0
  421. package/src/renderer/shared/platform.test.ts +57 -1
  422. package/src/renderer/shared/platform.ts +46 -1
  423. package/src/renderer/shared/theme/themeManager.test.ts +43 -0
  424. package/src/renderer/shared/theme/themeManager.ts +17 -4
  425. package/src/renderer/shared/types.ts +56 -2
  426. package/src/renderer/shared/utils/agentActivity.test.ts +75 -0
  427. package/src/renderer/shared/utils/agentActivity.ts +42 -3
  428. package/src/renderer/shared/utils/approval.tsx +7 -0
  429. package/src/renderer/shared/utils/artifactBrowser.test.ts +80 -0
  430. package/src/renderer/shared/utils/artifactBrowser.ts +41 -0
  431. package/src/renderer/shared/utils/contextCompaction.test.tsx +48 -0
  432. package/src/renderer/shared/utils/contextCompaction.ts +21 -0
  433. package/src/renderer/shared/utils/effectVisibility.ts +9 -0
  434. package/src/renderer/shared/utils/markdown.tsx +3 -3
  435. package/src/renderer/shared/utils/mcpResults.test.tsx +91 -0
  436. package/src/renderer/shared/utils/modViewport.ts +7 -0
  437. package/src/renderer/shared/utils/nativeRecordingSession.test.ts +61 -0
  438. package/src/renderer/shared/utils/nativeRecordingSession.ts +46 -0
  439. package/src/renderer/shared/utils/notificationSettings.test.ts +14 -0
  440. package/src/renderer/shared/utils/notificationSettings.ts +23 -0
  441. package/src/renderer/shared/utils/notifications.test.ts +51 -0
  442. package/src/renderer/shared/utils/notifications.ts +54 -0
  443. package/src/renderer/shared/utils/pastedText.test.ts +20 -0
  444. package/src/renderer/shared/utils/pastedText.ts +13 -0
  445. package/src/renderer/shared/utils/progressCache.test.ts +32 -0
  446. package/src/renderer/shared/utils/sessionSources.test.ts +31 -0
  447. package/src/renderer/shared/utils/sessionSources.ts +34 -0
  448. package/src/renderer/shared/utils/slashCommandProcessor.ts +1 -1
  449. package/src/renderer/shared/utils/sourceAttachments.ts +28 -0
  450. package/src/renderer/shared/utils/speech.ts +51 -9
  451. package/src/renderer/shared/utils/syntaxHighlight.test.tsx +22 -0
  452. package/src/renderer/shared/utils/syntaxHighlight.tsx +26 -0
  453. package/src/renderer/shared/utils/useGeminiLiveVoice.ts +49 -5
  454. package/src/renderer/shared/utils/useLatestCallback.ts +9 -0
  455. package/src/renderer/shared/utils/useNativeVoiceInput.ts +80 -72
  456. package/src/renderer/shared/utils/useSessionSources.ts +33 -0
  457. package/src/renderer/shared/utils/viewedImages.ts +26 -0
  458. package/src/renderer/shared/utils/workspacePane.test.ts +33 -0
  459. package/src/renderer/shared/utils/workspacePane.ts +20 -0
  460. package/src/renderer/shared/utils/workspacePreview.test.ts +24 -0
  461. package/src/renderer/shared/utils/workspacePreview.ts +16 -0
  462. package/src/renderer/shared/utils/workspaceSnapshot.test.ts +49 -0
  463. package/src/renderer/shared/utils/workspaceSnapshot.ts +26 -0
  464. package/src/renderer/shared/utils/workspaces.ts +10 -0
  465. package/src/renderer/shared/workspaceUndo.ts +88 -0
  466. package/src/renderer/src/App.tsx +9 -1
  467. package/src/renderer/src/components/LiveTranslateControls.tsx +65 -0
  468. package/src/renderer/src/components/PicturesLibrary.tsx +2 -288
  469. package/src/renderer/src/components/ScreenPicker.css +67 -30
  470. package/src/renderer/src/components/ScreenPicker.tsx +201 -60
  471. package/src/renderer/src/components/SettingsWindow.tsx +10 -5
  472. package/src/renderer/src/components/WorkspacePanel.tsx +222 -32
  473. package/src/renderer/src/components/browser-shell.css +1 -1
  474. package/src/renderer/src/components/browser-suggestions-popup.css +1 -1
  475. package/src/renderer/src/components/liveTranslateFrames.test.ts +26 -5
  476. package/src/renderer/src/components/liveTranslateFrames.ts +18 -7
  477. package/src/renderer/src/components/liveTranslateLanguage.ts +6 -0
  478. package/src/renderer/src/css/app-shell.css +52 -137
  479. package/src/renderer/src/css/chat.css +21 -495
  480. package/src/renderer/src/css/desktop-tools.css +199 -1
  481. package/src/renderer/src/css/misc.css +0 -52
  482. package/src/renderer/src/css/pictures.css +2 -415
  483. package/src/renderer/src/css/settings/base.css +50 -47
  484. package/src/renderer/src/css/sidebar-workspace.css +151 -94
  485. package/src/renderer/src/css/tool-surfaces.css +65 -9
  486. package/src/renderer/src/css/widget.css +1 -1
  487. package/src/renderer/src/env.d.ts +1 -9
  488. package/src/renderer/src/index.css +1 -1
  489. package/src/renderer/src/main.tsx +2 -1
  490. package/src/renderer/src/proactiveSuggestions.ts +29 -0
  491. package/src/renderer/src/tauri.ts +122 -330
  492. package/src/renderer/src/voiceInput.ts +2 -1
  493. package/src/renderer/src-web/components/PicturesLibrary.tsx +2 -285
  494. package/src/renderer/src-web/components/PullToRefresh.tsx +1 -1
  495. package/src/renderer/src-web/components/SettingsWindow.tsx +10 -5
  496. package/src/renderer/src-web/css/app-shell.css +24 -121
  497. package/src/renderer/src-web/css/chat.css +21 -495
  498. package/src/renderer/src-web/css/misc.css +0 -52
  499. package/src/renderer/src-web/css/mobile.css +15 -14
  500. package/src/renderer/src-web/css/pictures.css +2 -462
  501. package/src/renderer/src-web/css/settings/base.css +50 -47
  502. package/src/renderer/src-web/css/sidebar-workspace.css +9 -95
  503. package/src/renderer/src-web/css/widget.css +1 -1
  504. package/src/renderer/src-web/env.d.ts +1 -12
  505. package/src/renderer/src-web/index.css +1 -1
  506. package/src/renderer/src-web/main.tsx +2 -1
  507. package/src/renderer/src-web/proactiveSuggestions.ts +3 -0
  508. package/src/renderer/src-web/tauri.ts +129 -354
  509. package/src/renderer/tests/backgroundTerminals.browser.html +81 -0
  510. package/src/renderer/tests/chatPanelFixture.ts +23 -0
  511. package/src/renderer/tests/chatPerformance.browser.html +71 -0
  512. package/src/renderer/tests/cliSessions.browser.html +82 -0
  513. package/src/renderer/tests/collapsedPaste.browser.html +70 -0
  514. package/src/renderer/tests/composerMenus.browser.html +116 -0
  515. package/src/renderer/tests/contextCompaction.browser.html +17 -0
  516. package/src/renderer/tests/conversationLifecycle.browser.html +70 -0
  517. package/src/renderer/tests/effectsPerformance.browser.html +13 -0
  518. package/src/renderer/tests/errorRecovery.browser.html +21 -0
  519. package/src/renderer/tests/glideSelect.browser.html +71 -0
  520. package/src/renderer/tests/glideSelect.preview.html +27 -0
  521. package/src/renderer/tests/library.browser.html +1 -0
  522. package/src/renderer/tests/library.browser.tsx +78 -0
  523. package/src/renderer/tests/liveOrb.browser.html +49 -0
  524. package/src/renderer/tests/liveVoice.browser.html +29 -0
  525. package/src/renderer/tests/modInput.browser.html +22 -0
  526. package/src/renderer/tests/sessionSources.browser.html +1 -0
  527. package/src/renderer/tests/sessionSources.browser.tsx +107 -0
  528. package/src/renderer/tests/skills.browser.html +24 -0
  529. package/src/renderer/tests/toolsPanel.browser.html +1 -0
  530. package/src/renderer/tests/toolsPanel.browser.tsx +113 -0
  531. package/src/renderer/tests/viewedImages.browser.html +1 -0
  532. package/src/renderer/tests/viewedImages.browser.tsx +93 -0
  533. package/src/renderer/tests/voicePill.browser.html +80 -0
  534. package/src/renderer/tests/voicePill.preview.html +34 -0
  535. package/src/renderer/tests/webSources.browser.html +1 -0
  536. package/src/renderer/tests/webSources.browser.tsx +98 -0
  537. package/src/renderer/tests/workspaceUndo.browser.html +92 -0
  538. package/src-tauri/Cargo.toml +40 -0
  539. package/src-tauri/build.rs +3 -0
  540. package/src-tauri/src/app/lifecycle.rs +277 -0
  541. package/src-tauri/src/app/mod.rs +4 -0
  542. package/src-tauri/src/app/shortcuts.rs +40 -0
  543. package/src-tauri/src/app/tray.rs +52 -0
  544. package/src-tauri/src/background/events.rs +70 -0
  545. package/src-tauri/src/background/headless.rs +230 -0
  546. package/src-tauri/src/background/mod.rs +4 -0
  547. package/src-tauri/src/background/proactive.rs +262 -0
  548. package/src-tauri/src/commands/approvals.rs +20 -0
  549. package/src-tauri/src/commands/auth.rs +127 -0
  550. package/src-tauri/src/commands/conversation.rs +642 -0
  551. package/src-tauri/src/commands/integrations.rs +157 -0
  552. package/src-tauri/src/commands/media.rs +179 -0
  553. package/src-tauri/src/commands/mod.rs +11 -0
  554. package/src-tauri/src/commands/mods.rs +6 -0
  555. package/src-tauri/src/commands/settings.rs +141 -0
  556. package/src-tauri/src/commands/voice.rs +153 -0
  557. package/src-tauri/src/commands/workspace.rs +501 -0
  558. package/src-tauri/src/lib.rs +10 -0
  559. package/src-tauri/src/main.rs +3 -0
  560. package/src-tauri/src/native/actions.rs +206 -0
  561. package/src-tauri/src/native/browser.rs +252 -0
  562. package/src-tauri/src/native/capture.rs +695 -0
  563. package/src-tauri/src/native/discord_rpc.rs +99 -0
  564. package/src-tauri/src/native/integrations.rs +126 -0
  565. package/src-tauri/src/native/mod.rs +12 -0
  566. package/src-tauri/src/native/notifications.rs +51 -0
  567. package/src-tauri/src/native/plugins.rs +14 -0
  568. package/src-tauri/src/native/system.rs +250 -0
  569. package/src-tauri/src/native/terminal.rs +201 -0
  570. package/src-tauri/src/native/updater.rs +148 -0
  571. package/src-tauri/src/native/windows.rs +143 -0
  572. package/tsconfig.json +2 -0
  573. package/vite.config.ts +4 -1
  574. package/vite.config.web.ts +4 -0
  575. package/.cargo/config.toml +0 -13
  576. package/.claude/settings.local.json +0 -182
  577. package/.codex +0 -0
  578. package/CLAUDE.md +0 -102
  579. package/ROADMAP.md +0 -30
  580. package/mint-presentation-demo.mp4 +0 -0
  581. package/out/web/Live2DCubismCore.js +0 -9
  582. package/out/web/assets/CliSessionsView-BxUVWEEL.js +0 -1
  583. package/out/web/assets/CliSessionsView-CBDTXuQv.css +0 -1
  584. package/out/web/assets/CodeReviewPage-DkMgfcos.css +0 -1
  585. package/out/web/assets/CodeReviewPage-jKlmLJwT.js +0 -3
  586. package/out/web/assets/CommandPalette-DnwPA5hy.js +0 -1
  587. package/out/web/assets/ImageStudioPanel-BR1XFwhR.js +0 -1
  588. package/out/web/assets/LinkedFoldersView-bi-CWQ-I.js +0 -1
  589. package/out/web/assets/McpRegistryPicker-D5tEFnyq.js +0 -1
  590. package/out/web/assets/McpServersView-BGG1dhFM.js +0 -1
  591. package/out/web/assets/MintDashboard-BIglDEWX.js +0 -20
  592. package/out/web/assets/MintDashboard-DSMywSgs.css +0 -1
  593. package/out/web/assets/ModelPanel-CbJ1PFoZ.js +0 -1
  594. package/out/web/assets/PicturesLibrary-CQP0fLP1.css +0 -1
  595. package/out/web/assets/PicturesLibrary-DoYN7T1p.js +0 -1
  596. package/out/web/assets/PluginsView-CU1HWXGk.js +0 -1
  597. package/out/web/assets/ScheduledTasksView-Bnl36y2N.js +0 -1
  598. package/out/web/assets/SettingsWindow-DhWLAn9T.css +0 -1
  599. package/out/web/assets/SettingsWindow-Dw8L01pw.js +0 -2
  600. package/out/web/assets/SkillsView-cnl8aY5p.js +0 -2
  601. package/out/web/assets/ToolSurfacePage-CgsQw6l5.css +0 -1
  602. package/out/web/assets/ToolSurfacePage-Cz2VJAPZ.js +0 -37
  603. package/out/web/assets/VeoStudioPanel-D4JnERWR.js +0 -4
  604. package/out/web/assets/chunk-CKBBP62Z-cIrXq6jN.js +0 -2
  605. package/out/web/assets/classDiagram-DTDB5LWJ-Dq0smRWk.js +0 -1
  606. package/out/web/assets/classDiagram-v2-JRS7N3AN-Dq0smRWk.js +0 -1
  607. package/out/web/assets/config-C-ZFtipU.css +0 -1
  608. package/out/web/assets/config-eEDngJXO.js +0 -1
  609. package/out/web/assets/core-hQ2VA9Ti.js +0 -1
  610. package/out/web/assets/dist-js-Bf2bhoku.js +0 -1
  611. package/out/web/assets/flowDiagram-A5DVABFB-BLg7nEcd.js +0 -1
  612. package/out/web/assets/index-Btsf4L8M.css +0 -1
  613. package/out/web/assets/index-D8D9MeRA.js +0 -11
  614. package/out/web/assets/lucide-react-Ip3L6Jtn.js +0 -1
  615. package/out/web/assets/markdown-BSeeUbJH.js +0 -38
  616. package/out/web/assets/modelManager-tMVmJVAW.js +0 -2
  617. package/out/web/assets/prompt-latin-400-normal-BQ9zjSN8.woff2 +0 -0
  618. package/out/web/assets/prompt-latin-400-normal-CxU4ec_r.woff +0 -0
  619. package/out/web/assets/prompt-latin-500-normal-B1edBDQ9.woff +0 -0
  620. package/out/web/assets/prompt-latin-500-normal-CxzxEHZc.woff2 +0 -0
  621. package/out/web/assets/prompt-latin-600-normal-CSDDLorv.woff +0 -0
  622. package/out/web/assets/prompt-latin-600-normal-hKZWXsc1.woff2 +0 -0
  623. package/out/web/assets/prompt-latin-700-normal-BfbftDSq.woff +0 -0
  624. package/out/web/assets/prompt-latin-700-normal-I2gc831J.woff2 +0 -0
  625. package/out/web/assets/prompt-thai-400-normal-BrkKv8cO.woff2 +0 -0
  626. package/out/web/assets/prompt-thai-400-normal-DJypnfr3.woff +0 -0
  627. package/out/web/assets/prompt-thai-500-normal-C18pDUoL.woff2 +0 -0
  628. package/out/web/assets/prompt-thai-500-normal-D7YNqUJD.woff +0 -0
  629. package/out/web/assets/prompt-thai-600-normal-CYPViXds.woff +0 -0
  630. package/out/web/assets/prompt-thai-600-normal-MrdfU7zR.woff2 +0 -0
  631. package/out/web/assets/prompt-thai-700-normal-Cb5ilR-c.woff +0 -0
  632. package/out/web/assets/prompt-thai-700-normal-Cg4aQ0Nn.woff2 +0 -0
  633. package/out/web/assets/stateDiagram-v2-4QOOHH4V-DeEc0lGZ.js +0 -1
  634. package/out/web/assets/swimlanesDiagram-VK2B7HYN-DpVik9v7.js +0 -8
  635. package/out/web/assets/window-5qYXKoW7.js +0 -1
  636. package/skills-lock.json +0 -77
  637. package/src/renderer/public/Live2DCubismCore.js +0 -9
  638. package/src/renderer/src/companionWidget.ts +0 -95
  639. package/src/renderer/src/components/Live2DStage.tsx +0 -412
  640. package/src/renderer/src/components/ModelPanel.tsx +0 -155
  641. package/src/renderer/src/css/model.css +0 -628
  642. package/src/renderer/src-web/companionWidget.ts +0 -37
  643. package/src/renderer/src-web/components/ModelPanel.tsx +0 -12
  644. 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,
@@ -31,11 +34,6 @@ import type {
31
34
  } from '../shared/types'
32
35
 
33
36
 
34
- type DesktopStreamEvent =
35
- | { type: 'started'; interactionId: number }
36
- | { type: 'chunk'; chunk: string }
37
- | { type: 'progress'; progress: AgentProgress }
38
-
39
37
  export type { GeminiLiveEvent } from '../shared/utils/useGeminiLiveVoice'
40
38
  import type { GeminiLiveEvent } from '../shared/utils/useGeminiLiveVoice'
41
39
 
@@ -50,9 +48,7 @@ function dispatchWebSettingsChanged(config: any) {
50
48
  window.dispatchEvent(new CustomEvent(WEB_SETTINGS_CHANGED_EVENT, { detail: config }))
51
49
  }
52
50
 
53
- /** The last browser Notification shown by notifyAiResponse's fallback
54
- * (non-Tauri) branch, so clearAiNotifications can dismiss it. */
55
- let lastAiNotification: Notification | null = null
51
+ import { sendBrowserNotification, clearBrowserNotifications, openNotificationChat } from '../shared/utils/notifications'
56
52
 
57
53
  /**
58
54
  * Root-relative: the web build's SPA fallback serves index-web.html at deep
@@ -410,9 +406,9 @@ export async function fetchProviderModels(
410
406
  return invoke<string[]>('fetch_provider_models', { provider, apiKey, baseUrl })
411
407
  }
412
408
 
413
- /** Fetch the live model list for image `provider` from its API.
414
- * Returns a dynamic list on success, falling back to static presets on any
415
- * 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. */
416
412
  export async function fetchImageProviderModels(
417
413
  provider: string,
418
414
  apiKey: string = '',
@@ -429,9 +425,9 @@ export async function fetchImageProviderModels(
429
425
  return invoke<string[]>('fetch_image_provider_models', { provider, apiKey: apiKey || '' })
430
426
  }
431
427
 
432
- /** Fetch the live model list for video `provider` from its API.
433
- * Returns a dynamic list on success, falling back to static presets on any
434
- * 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. */
435
431
  export async function fetchVideoProviderModels(
436
432
  provider: string,
437
433
  apiKey: string = '',
@@ -448,10 +444,9 @@ export async function fetchVideoProviderModels(
448
444
  return invoke<string[]>('fetch_video_provider_models', { provider, apiKey: apiKey || '' })
449
445
  }
450
446
 
451
- /** Fetch the list of Gemini Live–capable models (BidiGenerateContent / native-audio)
452
- * from the Gemini API. Returns a dynamic list on success; falls back to an empty
453
- * array so the hook can use its static GEMINI_LIVE_MODELS preset instead.
454
- * 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. */
455
450
  export async function fetchGeminiLiveModels(apiKey: string): Promise<string[]> {
456
451
  if (typeof window === 'undefined' || !isTauriRuntime()) {
457
452
  const params = new URLSearchParams({ apiKey: apiKey || '' })
@@ -465,182 +460,12 @@ export async function fetchGeminiLiveModels(apiKey: string): Promise<string[]> {
465
460
  return invoke<string[]>('fetch_gemini_live_models', { apiKey: apiKey || '' })
466
461
  }
467
462
 
468
- export async function sendChatMessage(
469
- message: string,
470
- imageDataUri?: string | null,
471
- audioDataUri?: string | null,
472
- videoDataUri?: string | null,
473
- documentAttachment?: DocumentAttachment | null,
474
- workspacePath?: string | null,
475
- chatId?: string | null,
476
- agentId?: string | null,
477
- ): Promise<ChatResponse> {
478
- const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri)
479
- if (typeof window === 'undefined' || !isTauriRuntime()) {
480
- const API_BASE = getApiBase();
481
- try {
482
- const res = await authFetch(`${API_BASE}/chat`, {
483
- method: 'POST',
484
- headers: { 'Content-Type': 'application/json' },
485
- body: JSON.stringify({ message: outgoingMessage, systemInstruction: '', chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId })
486
- });
487
- const data = await res.json().catch(() => null);
488
- if (!res.ok) {
489
- return {
490
- provider: 'error',
491
- model: 'error',
492
- text: data?.text || data?.message || data?.status || `Local API returned HTTP ${res.status}`,
493
- };
494
- }
495
- if (!data || typeof data.text !== 'string') {
496
- return {
497
- provider: 'error',
498
- model: 'error',
499
- text: 'Local API returned an invalid chat response.',
500
- };
501
- }
502
- return data;
503
- } catch (e) {
504
- console.error("Failed to send chat message to local server:", e);
505
- return { provider: 'error', model: 'error', text: `Failed to connect to Local API Server: ${e}` };
506
- }
507
- }
508
- const { invoke } = await import('@tauri-apps/api/core')
509
- const response = await invoke<ChatResponse>('send_chat_message', {
510
- request: { message: outgoingMessage, systemInstruction: '', chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId },
511
- })
512
- if (imageDataUri) {
513
- await invoke('save_pictures', {
514
- images: imageDataUri.split(' '),
515
- source: 'chat',
516
- message: outgoingMessage,
517
- })
518
- }
519
- if (videoDataUri) {
520
- await invoke('save_pictures', {
521
- images: videoDataUri.split(' '),
522
- source: 'chat',
523
- message: outgoingMessage,
524
- })
525
- }
526
- return response
527
- }
528
-
529
- export async function streamChatMessage(
530
- message: string,
531
- onChunk: (chunk: string) => void,
532
- imageDataUri?: string | null,
533
- audioDataUri?: string | null,
534
- videoDataUri?: string | null,
535
- systemInstruction = '',
536
- onProgress?: (progress: AgentProgress) => void,
537
- documentAttachment?: DocumentAttachment | null,
538
- workspacePath?: string | null,
539
- chatId?: string | null,
540
- agentId?: string | null,
541
- // Unused on web (no plan-mode-approval UI here) — kept only so this positional
542
- // arg list stays aligned with the desktop `tauri.ts`, since the shared
543
- // `MintDashboard.tsx` call site passes the same argument list to both builds.
544
- _planMode?: boolean,
545
- pinnedMcpServer?: string | null,
546
- // Web has no separate Tauri event bus for approvals (unlike desktop's
547
- // global `listen('tool-approval-requested', ...)`), so the server sends
548
- // an `approval-requested` event down this same ndjson stream instead —
549
- // this callback is how the caller learns about it.
550
- onApprovalRequested?: (payload: { token: string; approval: any }) => void,
551
- onTurnStarted?: (interactionId: number) => void,
552
- ): Promise<ChatResponse> {
553
- if (typeof window === 'undefined' || !isTauriRuntime()) {
554
- const API_BASE = getApiBase();
555
- const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri);
556
- const res = await authFetch(`${API_BASE}/chat-stream`, {
557
- method: 'POST',
558
- headers: { 'Content-Type': 'application/json' },
559
- body: JSON.stringify({ message: outgoingMessage, systemInstruction, chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId, pinnedMcpServer })
560
- });
561
- if (!res.ok) {
562
- const data = await res.json().catch(() => null);
563
- throw new Error(data?.text || data?.message || `HTTP ${res.status}`);
564
- }
565
- const reader = res.body?.getReader();
566
- if (!reader) {
567
- throw new Error("No response body reader");
568
- }
569
- const decoder = new TextDecoder();
570
- let buffer = '';
571
- let finalResponse: ChatResponse | null = null;
572
- while (true) {
573
- const { value, done } = await reader.read();
574
- if (done) break;
575
- buffer += decoder.decode(value, { stream: true });
576
- const lines = buffer.split('\n');
577
- buffer = lines.pop() || '';
578
- for (const line of lines) {
579
- if (!line.trim()) continue;
580
- try {
581
- const event = JSON.parse(line);
582
- if (event.type === 'chunk') {
583
- onChunk(event.chunk);
584
- } else if (event.type === 'started') {
585
- onTurnStarted?.(event.interactionId);
586
- } else if (event.type === 'progress') {
587
- onProgress?.(event.progress);
588
- } else if (event.type === 'done') {
589
- finalResponse = event.response;
590
- } else if (event.type === 'approval-requested') {
591
- onApprovalRequested?.({ token: event.token, approval: event.approval });
592
- }
593
- } catch (e) {
594
- console.error("Failed to parse stream line:", line, e);
595
- }
596
- }
597
- }
598
- if (finalResponse) return finalResponse;
599
- throw new Error("Stream closed without a final response");
600
- }
601
- const { invoke, Channel } = await import('@tauri-apps/api/core')
602
- const outgoingMessage = withImagePlaceholder(message, imageDataUri, videoDataUri)
603
- const onEvent = new Channel<DesktopStreamEvent>()
604
- onEvent.onmessage = (event) => {
605
- if (event.type === 'chunk') onChunk(event.chunk)
606
- else if (event.type === 'started') onTurnStarted?.(event.interactionId)
607
- else onProgress?.(event.progress)
608
- }
609
- const response = await invoke<ChatResponse>('stream_chat_message', {
610
- request: { message: outgoingMessage, systemInstruction, chatId, imageDataUri, audioDataUri, videoDataUri, documentAttachment, workspacePath, agentId, pinnedMcpServer },
611
- onEvent,
612
- })
613
- if (imageDataUri) {
614
- await invoke('save_pictures', {
615
- images: imageDataUri.split(' '),
616
- source: 'chat',
617
- message: outgoingMessage,
618
- })
619
- }
620
- if (videoDataUri) {
621
- await invoke('save_pictures', {
622
- images: videoDataUri.split(' '),
623
- source: 'chat',
624
- message: outgoingMessage,
625
- })
626
- }
627
- return response
628
- }
629
-
630
- function withImagePlaceholder(message: string, imageDataUri?: string | null, videoDataUri?: string | null) {
631
- let finalMessage = message
632
- if (imageDataUri && !finalMessage.includes('[Image #1]')) {
633
- const imageCount = imageDataUri.split(/\s+/).filter(Boolean).length
634
- const markers = Array.from({ length: imageCount }, (_, index) => `[Image #${index + 1}]`).join(' ')
635
- if (markers) finalMessage = `${finalMessage} ${markers}`
636
- }
637
- if (videoDataUri && !finalMessage.includes('[Video #1]')) {
638
- const videoCount = videoDataUri.split(/\s+/).filter(Boolean).length
639
- const markers = Array.from({ length: videoCount }, (_, index) => `[Video #${index + 1}]`).join(' ')
640
- if (markers) finalMessage = `${finalMessage} ${markers}`
641
- }
642
- return finalMessage
643
- }
463
+ export const { sendChatMessage, streamChatMessage } = createConversationTransport({
464
+ isNative: isTauriRuntime,
465
+ apiBase: getLocalApiBase,
466
+ fetch: authFetch,
467
+ ownerToken: getStoredAuthToken,
468
+ })
644
469
 
645
470
  export async function getTtsUrls(text: string): Promise<TtsUrl[]> {
646
471
  if (typeof window === 'undefined') return []
@@ -845,17 +670,16 @@ export async function listChatSessions(): Promise<ChatSession[]> {
845
670
 
846
671
  export async function updateChatSessionWorkspace(chatId: string, workspacePath: string | null): Promise<void> {
847
672
  if (typeof window === 'undefined' || !isTauriRuntime()) {
848
- const API_BASE = getApiBase();
849
- try {
850
- await authFetch(`${API_BASE}/chat-sessions/workspace`, {
851
- method: 'POST',
852
- headers: { 'Content-Type': 'application/json' },
853
- body: JSON.stringify({ chatId, workspacePath })
854
- });
855
- } catch (e) {
856
- console.error("Failed to update chat session workspace on local server:", e);
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})`)
857
681
  }
858
- return;
682
+ return
859
683
  }
860
684
  const { invoke } = await import('@tauri-apps/api/core')
861
685
  await invoke('update_chat_session_workspace', { chatId, workspacePath })
@@ -1258,16 +1082,6 @@ export function installTauriAdapters() {
1258
1082
  startDragging: async () => {},
1259
1083
  };
1260
1084
 
1261
- (window as any).screenPickerApi = {
1262
- onScreenshot: () => {},
1263
- sendSelection: () => {},
1264
- startContinuousTranslation: () => {},
1265
- stopContinuousTranslation: () => {},
1266
- onTranslationResult: () => {},
1267
- closePicker: () => {},
1268
- setOverlayInteractable: () => {},
1269
- };
1270
-
1271
1085
  (window as any).api = {
1272
1086
  sendMessage: async (message: string, imageDataUri?: string | null, audioDataUri?: string | null, documentAttachment?: DocumentAttachment | null) => {
1273
1087
  try {
@@ -1371,8 +1185,6 @@ export function installTauriAdapters() {
1371
1185
  })
1372
1186
  },
1373
1187
  startVision: () => {},
1374
- onVisionReady: async () => () => {},
1375
- captureSilentScreen: async () => '',
1376
1188
  getSmartContext: async () => {
1377
1189
  try {
1378
1190
  const res = await authFetch(`${API_BASE}/smart-context`);
@@ -1410,20 +1222,8 @@ export function installTauriAdapters() {
1410
1222
  }
1411
1223
  },
1412
1224
  onSpotlightToChat: async () => () => {},
1413
- notifyAiResponse: async (preview: string) => {
1414
- if (typeof Notification === 'undefined') return
1415
- let permission = Notification.permission
1416
- if (permission === 'default') {
1417
- permission = await Notification.requestPermission()
1418
- }
1419
- if (permission === 'granted') {
1420
- lastAiNotification = new Notification('Mint Agent', { body: preview })
1421
- }
1422
- },
1423
- clearAiNotifications: () => {
1424
- lastAiNotification?.close()
1425
- lastAiNotification = null
1426
- },
1225
+ notifyAiResponse: (preview: string, chatId?: string) => sendBrowserNotification(preview, chatId, openNotificationChat),
1226
+ clearAiNotifications: clearBrowserNotifications,
1427
1227
  getTtsUrls: async () => [],
1428
1228
  setAiState: () => {},
1429
1229
  };
@@ -1530,58 +1330,6 @@ export function installTauriAdapters() {
1530
1330
  startDragging: async () => {},
1531
1331
  }
1532
1332
 
1533
- window.screenPickerApi = {
1534
- onScreenshot: async (callback) => {
1535
- const { invoke } = await import('@tauri-apps/api/core')
1536
- try {
1537
- const image = await captureSharedScreen()
1538
- callback(image)
1539
- } catch (reason) {
1540
- console.warn('Screen share capture failed, falling back to native capture:', reason)
1541
- void invoke<string>('capture_silent_screen').then(callback)
1542
- }
1543
- },
1544
- sendSelection: async (image) => {
1545
- const { invoke } = await import('@tauri-apps/api/core')
1546
- return void invoke('submit_screen_selection', { image })
1547
- },
1548
- startContinuousTranslation: (rect) => {
1549
- let translationTimer: ReturnType<typeof setInterval> | null = null
1550
- const translate = async () => {
1551
- const { invoke } = await import('@tauri-apps/api/core')
1552
- void invoke<string>('translate_capture_region', { rect })
1553
- .then((text) => window.dispatchEvent(new CustomEvent('mint-translation', { detail: text })))
1554
- .catch((reason) => {
1555
- window.dispatchEvent(new CustomEvent('mint-translation', { detail: String(reason) }))
1556
- })
1557
- }
1558
- translate()
1559
- translationTimer = setInterval(translate, 3000)
1560
-
1561
- // Clean up helper attached to window if needed
1562
- if ((window as any)._stopTranslate) (window as any)._stopTranslate()
1563
- ;(window as any)._stopTranslate = () => {
1564
- if (translationTimer) clearInterval(translationTimer)
1565
- }
1566
- },
1567
- stopContinuousTranslation: () => {
1568
- if ((window as any)._stopTranslate) {
1569
- (window as any)._stopTranslate()
1570
- }
1571
- },
1572
- onTranslationResult: (callback) => {
1573
- window.addEventListener('mint-translation', ((event: CustomEvent<string>) => {
1574
- callback(event.detail)
1575
- }) as EventListener)
1576
- },
1577
- closePicker: async () => {
1578
- const { invoke } = await import('@tauri-apps/api/core')
1579
- const { getCurrentWindow } = await import('@tauri-apps/api/window')
1580
- return invoke('close_desktop_window', { label: getCurrentWindow().label })
1581
- },
1582
- setOverlayInteractable: () => {},
1583
- }
1584
-
1585
1333
  window.api = {
1586
1334
  sendMessage: (message, imageDataUri, audioDataUri, documentAttachment) => sendChatMessage(message, imageDataUri, audioDataUri, undefined, documentAttachment),
1587
1335
  closeWindow: async () => {
@@ -1627,22 +1375,7 @@ export function installTauriAdapters() {
1627
1375
  onSettingsChanged: settingsChanged,
1628
1376
  startVision: async () => {
1629
1377
  const { invoke } = await import('@tauri-apps/api/core')
1630
- let image: string
1631
- try {
1632
- image = await captureSharedScreen()
1633
- } catch (reason) {
1634
- console.warn('Screen share capture failed before opening picker:', reason)
1635
- image = await invoke<string>('capture_silent_screen')
1636
- }
1637
- return invoke('start_screen_capture', { image })
1638
- },
1639
- onVisionReady: async (callback) => {
1640
- const { listen } = await import('@tauri-apps/api/event')
1641
- return listen<string>('vision-ready', (event) => callback(event.payload))
1642
- },
1643
- captureSilentScreen: async () => {
1644
- const { invoke } = await import('@tauri-apps/api/core')
1645
- return invoke('capture_silent_screen')
1378
+ return invoke('start_live_translate')
1646
1379
  },
1647
1380
  getSmartContext: async () => {
1648
1381
  const { invoke } = await import('@tauri-apps/api/core')
@@ -1670,19 +1403,10 @@ export function installTauriAdapters() {
1670
1403
  const { listen } = await import('@tauri-apps/api/event')
1671
1404
  return listen<string>('spotlight-to-chat', (event) => callback(event.payload))
1672
1405
  },
1673
- notifyAiResponse: async (preview) => {
1674
- const { isPermissionGranted, requestPermission, sendNotification } = await import('@tauri-apps/plugin-notification')
1675
- let granted = await isPermissionGranted()
1676
- if (!granted) {
1677
- granted = (await requestPermission()) === 'granted'
1678
- }
1679
- if (granted) {
1680
- sendNotification({ title: 'Mint Agent', body: preview })
1681
- }
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 })
1682
1409
  },
1683
- // The plugin has no reliable cross-platform way to dismiss an
1684
- // already-shown OS notification from JS — best-effort no-op; there's
1685
- // simply nothing stale left for the next unfocused reply to build on.
1686
1410
  clearAiNotifications: () => {},
1687
1411
  getTtsUrls: async (text) => {
1688
1412
  const { invoke } = await import('@tauri-apps/api/core')
@@ -1695,51 +1419,14 @@ export function installTauriAdapters() {
1695
1419
  }
1696
1420
  }
1697
1421
 
1698
- async function captureSharedScreen(): Promise<string> {
1699
- // On Linux (especially under Wayland/WebKitGTK), getDisplayMedia often returns a black screen
1700
- // or fails silently. Bypass it to force fallback to native screenshot commands.
1701
- if (navigator.userAgent.toLowerCase().includes('linux')) {
1702
- throw new Error('Linux detected, bypassing getDisplayMedia to use native screenshot tools')
1703
- }
1704
-
1705
- if (!navigator.mediaDevices?.getDisplayMedia) {
1706
- throw new Error('getDisplayMedia is not available')
1707
- }
1708
-
1709
- const stream = await navigator.mediaDevices.getDisplayMedia({
1710
- video: true,
1711
- audio: false,
1712
- })
1713
- try {
1714
- const video = document.createElement('video')
1715
- video.srcObject = stream
1716
- video.muted = true
1717
- await video.play()
1718
- await new Promise<void>((resolve) => {
1719
- if (video.videoWidth > 0 && video.videoHeight > 0) {
1720
- resolve()
1721
- } else {
1722
- video.onloadedmetadata = () => resolve()
1723
- }
1724
- })
1725
-
1726
- const canvas = document.createElement('canvas')
1727
- canvas.width = video.videoWidth || window.screen.width
1728
- canvas.height = video.videoHeight || window.screen.height
1729
- const context = canvas.getContext('2d')
1730
- if (!context) throw new Error('Unable to create screen capture canvas')
1731
- context.drawImage(video, 0, 0, canvas.width, canvas.height)
1732
- return canvas.toDataURL('image/png')
1733
- } finally {
1734
- stream.getTracks().forEach((track) => track.stop())
1735
- }
1736
- }
1737
-
1738
1422
  export async function listLearnedSkills(workspacePath?: string): Promise<LearnedSkill[]> {
1739
1423
  if (typeof window === 'undefined' || !isTauriRuntime()) {
1740
1424
  try {
1741
1425
  const API_BASE = getLocalApiBase()
1742
- 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}`)
1743
1430
  if (res.ok) {
1744
1431
  return await res.json()
1745
1432
  }
@@ -1859,19 +1546,20 @@ export async function deleteSubagent(sourcePath: string): Promise<void> {
1859
1546
 
1860
1547
  export async function runSlashCommand(
1861
1548
  input: string,
1862
- cwd?: string | null
1549
+ cwd?: string | null,
1550
+ chatId?: string | null
1863
1551
  ): Promise<import('../shared/platform').SlashResponse> {
1864
1552
  if (typeof window === 'undefined' || !isTauriRuntime()) {
1865
1553
  const res = await authFetch(`${getLocalApiBase()}/slash`, {
1866
1554
  method: 'POST',
1867
1555
  headers: { 'Content-Type': 'application/json' },
1868
- body: JSON.stringify({ input, cwd: cwd ?? null })
1556
+ body: JSON.stringify({ input, cwd: cwd ?? null, chat_id: chatId ?? null })
1869
1557
  })
1870
1558
  if (!res.ok) return { kind: 'not_handled' }
1871
1559
  return res.json()
1872
1560
  }
1873
1561
  const { invoke } = await import('@tauri-apps/api/core')
1874
- return invoke('run_slash_command', { input, cwd: cwd ?? null })
1562
+ return invoke('run_slash_command', { input, cwd: cwd ?? null, chatId: chatId ?? null })
1875
1563
  }
1876
1564
 
1877
1565
  export async function listCronJobs(): Promise<CronJob[]> {
@@ -2090,6 +1778,36 @@ export async function deleteWorkspaceItem(operation: import('../shared/types').W
2090
1778
  return invoke('delete_workspace_item', { operation })
2091
1779
  }
2092
1780
 
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.')
1783
+ const { invoke } = await import('@tauri-apps/api/core')
1784
+ return invoke('move_workspace_item', { operation, destination })
1785
+ }
1786
+
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
+ }
1794
+ const { invoke } = await import('@tauri-apps/api/core')
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 })
1809
+ }
1810
+
2093
1811
  export async function selectWorkspaceDirectory(): Promise<string | null> {
2094
1812
  if (typeof window === 'undefined' || !isTauriRuntime()) {
2095
1813
  return null
@@ -2574,8 +2292,28 @@ export const readWorkspaceFile = async (path: string, workspacePath?: string): P
2574
2292
  return invoke('read_workspace_file', { path, workspacePath })
2575
2293
  }
2576
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
+
2577
2310
  // Enforce compile-time check against the shared platform interface
2578
2311
  const _apiCheck: MintPlatformApi = {
2312
+ listLibrary, getLibraryItem, setLibraryTrashed, removeLibraryItem, readLibraryFile,
2313
+ getConversationSources, saveSourceAttachments,
2314
+ modsOperation,
2315
+ readMcpArtifact,
2316
+ listBackgroundJobs, getBackgroundJob, stopBackgroundJob, deleteBackgroundJob,
2579
2317
  runSlashCommand,
2580
2318
  authRegister,
2581
2319
  authLogin,
@@ -2622,6 +2360,10 @@ const _apiCheck: MintPlatformApi = {
2622
2360
  createWorkspaceFile,
2623
2361
  createWorkspaceFolder,
2624
2362
  deleteWorkspaceItem,
2363
+ moveWorkspaceItem,
2364
+ listWorkspaceHistory,
2365
+ startHtmlPreview,
2366
+ undoWorkspaceAction,
2625
2367
  selectWorkspaceDirectory,
2626
2368
  selectLinkedFolderPath,
2627
2369
  submitToolApproval,
@@ -2635,3 +2377,36 @@ const _apiCheck: MintPlatformApi = {
2635
2377
  readWorkspaceFile,
2636
2378
  testMcpConnection,
2637
2379
  }
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
+ }