@pheem49/mint 1.16.0 → 1.17.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 (848) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +1 -1
  4. package/Release_Note.md +71 -72
  5. package/apps/mint-companion/src-tauri/src/compact.rs +69 -0
  6. package/apps/mint-companion/src-tauri/src/main.rs +218 -11
  7. package/apps/mint-companion/vite.config.ts +2 -1
  8. package/crates/mint-cli/src/agent/live_status.rs +43 -2
  9. package/crates/mint-cli/src/agent.rs +178 -38
  10. package/crates/mint-cli/src/commands/agent.rs +225 -31
  11. package/crates/mint-cli/src/commands/browser.rs +127 -0
  12. package/crates/mint-cli/src/commands/config.rs +14 -1
  13. package/crates/mint-cli/src/commands/knowledge.rs +16 -2
  14. package/crates/mint-cli/src/commands/mod.rs +15 -1
  15. package/crates/mint-cli/src/commands/tailnet_web.rs +2 -7
  16. package/crates/mint-cli/src/companion_navigation.rs +268 -0
  17. package/crates/mint-cli/src/interactive/chat_tui.rs +1065 -63
  18. package/crates/mint-cli/src/interactive/command_ui.rs +39 -0
  19. package/crates/mint-cli/src/interactive/slash_commands.rs +114 -6
  20. package/crates/mint-cli/src/interactive/tool_activity.rs +375 -36
  21. package/crates/mint-cli/src/interactive.rs +37 -5
  22. package/crates/mint-cli/src/main.rs +23 -2
  23. package/crates/mint-cli/src/onboard.rs +3494 -1336
  24. package/crates/mint-cli/tests/mods_testing.rs +5 -1
  25. package/crates/mint-companion-protocol/src/lib.rs +113 -0
  26. package/crates/mint-core/src/agent/chat.rs +240 -1
  27. package/crates/mint-core/src/agent/memory.rs +73 -6
  28. package/crates/mint-core/src/agent/safety.rs +56 -4
  29. package/crates/mint-core/src/agent/skill_inventory.rs +3 -1
  30. package/crates/mint-core/src/agent/skills.rs +1 -0
  31. package/crates/mint-core/src/api_server/routes/auth.rs +1 -4
  32. package/crates/mint-core/src/api_server/routes/chat.rs +29 -15
  33. package/crates/mint-core/src/api_server/routes/misc.rs +116 -0
  34. package/crates/mint-core/src/api_server/routes/profile_oauth.rs +43 -26
  35. package/crates/mint-core/src/api_server/routes/sessions.rs +93 -76
  36. package/crates/mint-core/src/api_server/routes/skills_subagents.rs +11 -7
  37. package/crates/mint-core/src/api_server/routes/status_health.rs +18 -8
  38. package/crates/mint-core/src/api_server.rs +211 -65
  39. package/crates/mint-core/src/avatar_bridge.rs +5 -2
  40. package/crates/mint-core/src/browser/cdp.rs +82 -26
  41. package/crates/mint-core/src/browser/lifecycle.rs +143 -43
  42. package/crates/mint-core/src/browser/mod.rs +5 -4
  43. package/crates/mint-core/src/browser/navigate.rs +82 -9
  44. package/crates/mint-core/src/browser/runtime.rs +284 -0
  45. package/crates/mint-core/src/browser/session.rs +263 -7
  46. package/crates/mint-core/src/browser/workflow.rs +386 -0
  47. package/crates/mint-core/src/companion/navigation.rs +115 -0
  48. package/crates/mint-core/src/companion.rs +109 -1
  49. package/crates/mint-core/src/integrations/mcp_result.rs +45 -0
  50. package/crates/mint-core/src/lib.rs +10 -6
  51. package/crates/mint-core/src/media/image_proxy.rs +563 -0
  52. package/crates/mint-core/src/media/tool_images.rs +196 -0
  53. package/crates/mint-core/src/media/tts/playback.rs +609 -0
  54. package/crates/mint-core/src/media/tts.rs +1 -0
  55. package/crates/mint-core/src/media.rs +2 -0
  56. package/crates/mint-core/src/orchestration/context_render.rs +450 -33
  57. package/crates/mint-core/src/orchestration/decision_parsing.rs +5 -23
  58. package/crates/mint-core/src/orchestration/diagnostics.rs +307 -0
  59. package/crates/mint-core/src/orchestration/image_regressions.rs +379 -0
  60. package/crates/mint-core/src/orchestration/loop_guard.rs +334 -0
  61. package/crates/mint-core/src/orchestration/mod.rs +1104 -560
  62. package/crates/mint-core/src/orchestration/reliability.rs +541 -0
  63. package/crates/mint-core/src/orchestration/repeated_failures.rs +8 -0
  64. package/crates/mint-core/src/orchestration/review_regressions.rs +174 -28
  65. package/crates/mint-core/src/orchestration/tools/files.rs +31 -3
  66. package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +19 -4
  67. package/crates/mint-core/src/orchestration/tools/project.rs +1 -1
  68. package/crates/mint-core/src/orchestration/tools/shell.rs +29 -5
  69. package/crates/mint-core/src/orchestration/tools/web.rs +5 -1
  70. package/crates/mint-core/src/orchestration/trajectory_schema.rs +353 -0
  71. package/crates/mint-core/src/orchestration/truncation.rs +211 -0
  72. package/crates/mint-core/src/orchestration/verification.rs +36 -6
  73. package/crates/mint-core/src/orchestration/workspace_helpers.rs +54 -23
  74. package/crates/mint-core/src/prompts/agent.rs +31 -40
  75. package/crates/mint-core/src/prompts/tool_catalog.rs +134 -40
  76. package/crates/mint-core/src/search/web_search.rs +44 -3
  77. package/crates/mint-core/src/slash/mod.rs +464 -1
  78. package/crates/mint-core/src/swarm/batch.rs +643 -0
  79. package/crates/mint-core/src/swarm/dossier.rs +152 -0
  80. package/crates/mint-core/src/swarm/labels.rs +100 -0
  81. package/crates/mint-core/src/swarm/mod.rs +158 -0
  82. package/crates/mint-core/src/swarm/permissions.rs +167 -0
  83. package/crates/mint-core/src/system/auth.rs +156 -7
  84. package/crates/mint-core/src/system/bg_shell.rs +77 -9
  85. package/crates/mint-core/src/system/config.rs +92 -3
  86. package/crates/mint-core/src/system/mint_web.rs +33 -12
  87. package/crates/mint-core/src/system/shell.rs +179 -10
  88. package/crates/mint-core/src/system/workspace.rs +204 -0
  89. package/crates/mint-core/tests/background_retention.rs +1 -1
  90. package/crates/mint-core/tests/memory_persistence.rs +27 -0
  91. package/out/web/assets/ArtifactPreviewPanel-DAT_Y7i0.css +1 -0
  92. package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +2 -0
  93. package/out/web/assets/CalculationCard-CRjP3E1j.js +1 -0
  94. package/out/web/assets/{CliSessionsView-CtzUJpK_.css → CliSessionsView-C3Br2v5Y.css} +1 -1
  95. package/out/web/assets/CliSessionsView-MI8kXMAb.js +1 -0
  96. package/out/web/assets/CodeReviewPage-CUJceQme.css +1 -0
  97. package/out/web/assets/CodeReviewPage-VCUgPla_.js +2 -0
  98. package/out/web/assets/CommandPalette-BD8SlTE5.js +1 -0
  99. package/out/web/assets/ImageGenCard-BCXxkVJX.js +1 -0
  100. package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +1 -0
  101. package/out/web/assets/ImageStudioPanel-BP7N4rLr.js +1 -0
  102. package/out/web/assets/LibraryPage-WlviRdR8.js +2 -0
  103. package/out/web/assets/LinkedFoldersView-CKRgroWK.js +1 -0
  104. package/out/web/assets/McpRegistryPicker-CoS83vtc.js +1 -0
  105. package/out/web/assets/McpServersView-D3wHnuHg.js +1 -0
  106. package/out/web/assets/MermaidCard-NqrHdyJW.js +2 -0
  107. package/out/web/assets/MintDashboard-B2DJsDDO.css +1 -0
  108. package/out/web/assets/MintDashboard-COw_xol7.js +63 -0
  109. package/out/web/assets/PluginsView-jBYmcKh4.js +1 -0
  110. package/out/web/assets/RewindModal-DempuDod.js +1 -0
  111. package/out/web/assets/ScheduledTasksView-5uw9-V9H.js +1 -0
  112. package/out/web/assets/SelectField-DXBQtrUK.js +1 -0
  113. package/out/web/assets/SelectField-lFEkkWCU.css +1 -0
  114. package/out/web/assets/SettingsWindow-2YP3yj7s.js +4 -0
  115. package/out/web/assets/SettingsWindow-Dz8LQVgD.css +1 -0
  116. package/out/web/assets/SkillsView-C-gp9J7m.js +2 -0
  117. package/out/web/assets/StockCard-BDMCe7mx.js +1 -0
  118. package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +38 -0
  119. package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +1 -0
  120. package/out/web/assets/UiFeatureCard-6BwxTOCe.js +1 -0
  121. package/out/web/assets/UiGridCard-DvZcLNxb.js +1 -0
  122. package/out/web/assets/UiMockupWidget-DD73QWg1.js +1 -0
  123. package/out/web/assets/VeoStudioPanel-DfsOJKv0.js +4 -0
  124. package/out/web/assets/WeatherCard-CPucIfq8.js +1 -0
  125. package/out/web/assets/WorkspacePanel-BfHKkulU.js +1 -0
  126. package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +2 -0
  127. package/out/web/assets/abnfDiagram-VCTEODGH-BOo3Ckng.js +1 -0
  128. package/out/web/assets/architecture-7GRP2DOG-ZOwheW3n.js +1 -0
  129. package/out/web/assets/architectureDiagram-5GKGNRK7-DC2FDzVd.js +36 -0
  130. package/out/web/assets/{blockDiagram-NRAW4CY4-BrrqzHW5.js → blockDiagram-I7D4REHJ-BrKFWdAH.js} +4 -4
  131. package/out/web/assets/c4Diagram-7LVT6UL2-BHTHK1Yd.js +38 -0
  132. package/out/web/assets/chunk-2Q5K7J3B-D2JLPQzF.js +1 -0
  133. package/out/web/assets/{chunk-TEH6E4GO-G4Cdlyrt.js → chunk-4HAMMTFA-BYFkZwNj.js} +3 -3
  134. package/out/web/assets/{chunk-5VM5RSS4-BiPuE0io.js → chunk-5VM5RSS4-BZ2oBPYQ.js} +1 -1
  135. package/out/web/assets/chunk-75Z2AOVW-BSKfSKSA.js +2 -0
  136. package/out/web/assets/chunk-DU6HZSFF-vIhsiW6n.js +128 -0
  137. package/out/web/assets/chunk-F27PBJKO-BlYpW9xq.js +1 -0
  138. package/out/web/assets/chunk-FOHPRMQF-JXEeeJ9r.js +161 -0
  139. package/out/web/assets/{chunk-GMAD6QVW-BuhEcgHq.js → chunk-GMAD6QVW-BIBz_Ug5.js} +12 -12
  140. package/out/web/assets/chunk-GVQU2GXP-NPSHxeqC.js +1 -0
  141. package/out/web/assets/chunk-IMKFNOWR-YlJK8_Fp.js +231 -0
  142. package/out/web/assets/chunk-JWPE2WC7-BeEMUFDw.js +1 -0
  143. package/out/web/assets/chunk-L3NEJ4N5-DMYi4-af.js +1 -0
  144. package/out/web/assets/chunk-OSK3NFVY-Begd3-jA.js +10 -0
  145. package/out/web/assets/chunk-P2QGCYS3-D1I4xFHN.js +1 -0
  146. package/out/web/assets/chunk-POPQ4Y6H-CafZZzNE.js +1 -0
  147. package/out/web/assets/chunk-PWAF6VOD-Dwh6_Lnt.js +1 -0
  148. package/out/web/assets/chunk-SHT3W25Y-B0XrCSEb.js +168 -0
  149. package/out/web/assets/{chunk-SVP7TREG-Bu_yYb-V.js → chunk-SVP7TREG-CxLsddxC.js} +1 -1
  150. package/out/web/assets/{chunk-LCL6LL3I-BhXV9zyH.js → chunk-TICWLB2K-y156QInb.js} +4 -4
  151. package/out/web/assets/chunk-XXDRQBXY-B9YlhOkE.js +1 -0
  152. package/out/web/assets/chunk-Y2CYZVJY-BxCWjNVG.js +1 -0
  153. package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +1 -0
  154. package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +1 -0
  155. package/out/web/assets/config-CvIO5hkn.js +2 -0
  156. package/out/web/assets/config-DqXJXeZM.css +1 -0
  157. package/out/web/assets/core-Mi3s5D4_.js +1 -0
  158. package/out/web/assets/cose-bilkent-JH36ORCC-qlna31ty.js +1 -0
  159. package/out/web/assets/cynefin-OW5HDTMX-SMVvrLf-.js +1 -0
  160. package/out/web/assets/cynefinDiagram-5FMLGOSQ-rZznN24T.js +62 -0
  161. package/out/web/assets/cytoscape.esm-DWtAUG0r.js +321 -0
  162. package/out/web/assets/dagre-CnWJJM5f.js +1 -0
  163. package/out/web/assets/dagre-GXQ25YYZ-BOToydFu.js +4 -0
  164. package/out/web/assets/diagram-S7CK7UJ4-TMVaGQEJ.js +30 -0
  165. package/out/web/assets/diagram-UQ7AKVKN-C2JK-GP2.js +41 -0
  166. package/out/web/assets/{diagram-VSXAHHWV-BJ86Ov2Y.js → diagram-VSXAHHWV-Cw8VSi2K.js} +1 -1
  167. package/out/web/assets/diagram-VX7I27RA-DXp4fKk9.js +24 -0
  168. package/out/web/assets/diagram-Z3DM3KII-CzSicYiW.js +24 -0
  169. package/out/web/assets/dist-9ISJ7r-g.js +1 -0
  170. package/out/web/assets/dist-js-BV3mI7uw.js +1 -0
  171. package/out/web/assets/ebnfDiagram-PWID7BFC-Dqj-zqPu.js +1 -0
  172. package/out/web/assets/{erDiagram-SSCWMZ5O-CzzmnZWT.js → erDiagram-RLTQ6QDP-DZwFZAuD.js} +3 -3
  173. package/out/web/assets/event-D7D-EBy9.js +1 -0
  174. package/out/web/assets/eventmodeling-NTZA5JFV-C0O-Lvgp.js +1 -0
  175. package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +1 -0
  176. package/out/web/assets/ganttDiagram-EL5Y4UJY-Da4ULXTl.js +292 -0
  177. package/out/web/assets/gitGraph-4MIJSDKK-B9wNFZIP.js +1 -0
  178. package/out/web/assets/gitGraphDiagram-WWUBYQGX-RjrhB0MP.js +106 -0
  179. package/out/web/assets/graphlib-Bh9gHply.js +1 -0
  180. package/out/web/assets/index-BmpulIkg.js +168 -0
  181. package/out/web/assets/index-CkvBwhX_.css +1 -0
  182. package/out/web/assets/info-A6RAGUB7-B3dfCpeY.js +1 -0
  183. package/out/web/assets/infoDiagram-27XIBGKW-QVWkLVx7.js +2 -0
  184. package/out/web/assets/{ishikawaDiagram-5VMMS53U-s38yo28y.js → ishikawaDiagram-5VMMS53U-CLFNIRI9.js} +4 -4
  185. package/out/web/assets/journeyDiagram-3NMN7TZE-fgOQadYF.js +139 -0
  186. package/out/web/assets/jsx-runtime-DmUwWVTj.js +1 -0
  187. package/out/web/assets/{kanban-definition-3QL26DDD-DodjgySL.js → kanban-definition-UXKFOSKX-G3Q_9g9O.js} +6 -6
  188. package/out/web/assets/katex-MCdQaEAD.js +257 -0
  189. package/out/web/assets/mermaid-parser.core-v3Jm7nco.js +7 -0
  190. package/out/web/assets/mermaid.core-DTEjLUA1.js +44 -0
  191. package/out/web/assets/{mindmap-definition-FBJOCRG2-260WBDxZ.js → mindmap-definition-YA3MSWOX-C_D42_fF.js} +4 -4
  192. package/out/web/assets/modelManager-BPLycQrN.js +2 -0
  193. package/out/web/assets/oauthManager-BUK7ic7q.js +1 -0
  194. package/out/web/assets/packet-AYTQ26CC-B-R-SHlF.js +1 -0
  195. package/out/web/assets/pdf-Bcahc2yC.js +56 -0
  196. package/out/web/assets/pdf.worker.min-Dkey6ZUl.mjs +27 -0
  197. package/out/web/assets/pegDiagram-XKGWAZYB-Da2q_giz.js +1 -0
  198. package/out/web/assets/pie-WAS4IAKB-BC8F0N7-.js +1 -0
  199. package/out/web/assets/pieDiagram-E7YTZNPT-Iy9REJNC.js +39 -0
  200. package/out/web/assets/{quadrantDiagram-AXDQQJYC-B8D3gU5d.js → quadrantDiagram-AXDQQJYC-ztsiYw7h.js} +4 -4
  201. package/out/web/assets/radar-RG4KPBEZ-B_1P8Z_z.js +1 -0
  202. package/out/web/assets/railroad-74A4TZTK-DuTqczSo.js +1 -0
  203. package/out/web/assets/railroad-abnf-HS5TGJTU-Df29WLmp.js +1 -0
  204. package/out/web/assets/railroad-ebnf-LZEXJU2U-ePFMo-qp.js +1 -0
  205. package/out/web/assets/railroad-peg-WCYAUIDC-DYXLW4_E.js +1 -0
  206. package/out/web/assets/railroadDiagram-O6MQD6OU-LStnZf2S.js +1 -0
  207. package/out/web/assets/{requirementDiagram-EFPCY7ZU-D2X-Ewik.js → requirementDiagram-BXWQKSXE-DmzonMH-.js} +3 -3
  208. package/out/web/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
  209. package/out/web/assets/rough.esm-CNnFptCR.js +1 -0
  210. package/out/web/assets/sankeyDiagram-P5KCCOFB-B8vjmUU1.js +40 -0
  211. package/out/web/assets/sequenceDiagram-WJ2MYXX4-CTnplOAX.js +162 -0
  212. package/out/web/assets/sizeCapture-INFHLROL-C8Q8DbV5.js +1 -0
  213. package/out/web/assets/src-CRDfRlHM.js +1 -0
  214. package/out/web/assets/stateDiagram-D77RDMKH-BFrIaLdI.js +1 -0
  215. package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +1 -0
  216. package/out/web/assets/studio-BBZQ_-QK.js +1 -0
  217. package/out/web/assets/swimlanes-42K2YHIH-BXGngUNU.js +1 -0
  218. package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +8 -0
  219. package/out/web/assets/timeline-definition-24CTP7MA-CegH7n43.js +120 -0
  220. package/out/web/assets/treeView-Q6P3EWNA-DTpJv2Tw.js +1 -0
  221. package/out/web/assets/treemap-WGGIJYW6-i8M9iJU6.js +1 -0
  222. package/out/web/assets/vennDiagram-4TSXK5OY-Dpzo1S8U.js +34 -0
  223. package/out/web/assets/wardley-WFR3VGLG-BrNsgtfw.js +1 -0
  224. package/out/web/assets/{wardleyDiagram-VM6X3IG4-DAdXELbQ.js → wardleyDiagram-VM6X3IG4-lQ92LFE1.js} +35 -35
  225. package/out/web/assets/window-CkUOP7t0.js +1 -0
  226. package/out/web/assets/workspaces-SYPrmbgC.js +1 -0
  227. package/out/web/assets/{xychartDiagram-S5SC5T6Z-IZIXf3Vo.js → xychartDiagram-S5SC5T6Z-BaOaEoBd.js} +4 -4
  228. package/out/web/index-web.html +4 -4
  229. package/out/web/index.html +4 -4
  230. package/out/web/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  231. package/out/web/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  232. package/out/web/pdfjs/cmaps/78-H.bcmap +0 -0
  233. package/out/web/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  234. package/out/web/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  235. package/out/web/pdfjs/cmaps/78-V.bcmap +0 -0
  236. package/out/web/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  237. package/out/web/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  238. package/out/web/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  239. package/out/web/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  240. package/out/web/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  241. package/out/web/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  242. package/out/web/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  243. package/out/web/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  244. package/out/web/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  245. package/out/web/pdfjs/cmaps/Add-H.bcmap +0 -0
  246. package/out/web/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  247. package/out/web/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  248. package/out/web/pdfjs/cmaps/Add-V.bcmap +0 -0
  249. package/out/web/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  250. package/out/web/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  251. package/out/web/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  252. package/out/web/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  253. package/out/web/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  254. package/out/web/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  255. package/out/web/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  256. package/out/web/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  257. package/out/web/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  258. package/out/web/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  259. package/out/web/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  260. package/out/web/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  261. package/out/web/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  262. package/out/web/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  263. package/out/web/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  264. package/out/web/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  265. package/out/web/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  266. package/out/web/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  267. package/out/web/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  268. package/out/web/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  269. package/out/web/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  270. package/out/web/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  271. package/out/web/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  272. package/out/web/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  273. package/out/web/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  274. package/out/web/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  275. package/out/web/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  276. package/out/web/pdfjs/cmaps/B5-H.bcmap +0 -0
  277. package/out/web/pdfjs/cmaps/B5-V.bcmap +0 -0
  278. package/out/web/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  279. package/out/web/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  280. package/out/web/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  281. package/out/web/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  282. package/out/web/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  283. package/out/web/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  284. package/out/web/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  285. package/out/web/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  286. package/out/web/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  287. package/out/web/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  288. package/out/web/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  289. package/out/web/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  290. package/out/web/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  291. package/out/web/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  292. package/out/web/pdfjs/cmaps/EUC-H.bcmap +0 -0
  293. package/out/web/pdfjs/cmaps/EUC-V.bcmap +0 -0
  294. package/out/web/pdfjs/cmaps/Ext-H.bcmap +0 -0
  295. package/out/web/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  296. package/out/web/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  297. package/out/web/pdfjs/cmaps/Ext-V.bcmap +0 -0
  298. package/out/web/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  299. package/out/web/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  300. package/out/web/pdfjs/cmaps/GB-H.bcmap +4 -0
  301. package/out/web/pdfjs/cmaps/GB-V.bcmap +0 -0
  302. package/out/web/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  303. package/out/web/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  304. package/out/web/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  305. package/out/web/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  306. package/out/web/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  307. package/out/web/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  308. package/out/web/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  309. package/out/web/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  310. package/out/web/pdfjs/cmaps/GBT-H.bcmap +0 -0
  311. package/out/web/pdfjs/cmaps/GBT-V.bcmap +0 -0
  312. package/out/web/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  313. package/out/web/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  314. package/out/web/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  315. package/out/web/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  316. package/out/web/pdfjs/cmaps/H.bcmap +0 -0
  317. package/out/web/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  318. package/out/web/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  319. package/out/web/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  320. package/out/web/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  321. package/out/web/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  322. package/out/web/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  323. package/out/web/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  324. package/out/web/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  325. package/out/web/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  326. package/out/web/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  327. package/out/web/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  328. package/out/web/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  329. package/out/web/pdfjs/cmaps/Hankaku.bcmap +0 -0
  330. package/out/web/pdfjs/cmaps/Hiragana.bcmap +0 -0
  331. package/out/web/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  332. package/out/web/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  333. package/out/web/pdfjs/cmaps/KSC-H.bcmap +0 -0
  334. package/out/web/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  335. package/out/web/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  336. package/out/web/pdfjs/cmaps/KSC-V.bcmap +0 -0
  337. package/out/web/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  338. package/out/web/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  339. package/out/web/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  340. package/out/web/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  341. package/out/web/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  342. package/out/web/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  343. package/out/web/pdfjs/cmaps/Katakana.bcmap +0 -0
  344. package/out/web/pdfjs/cmaps/LICENSE +36 -0
  345. package/out/web/pdfjs/cmaps/NWP-H.bcmap +0 -0
  346. package/out/web/pdfjs/cmaps/NWP-V.bcmap +0 -0
  347. package/out/web/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  348. package/out/web/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  349. package/out/web/pdfjs/cmaps/Roman.bcmap +0 -0
  350. package/out/web/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  351. package/out/web/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  352. package/out/web/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  353. package/out/web/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  354. package/out/web/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  355. package/out/web/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  356. package/out/web/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  357. package/out/web/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  358. package/out/web/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  359. package/out/web/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  360. package/out/web/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  361. package/out/web/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  362. package/out/web/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  363. package/out/web/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  364. package/out/web/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  365. package/out/web/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  366. package/out/web/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  367. package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  368. package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  369. package/out/web/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  370. package/out/web/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  371. package/out/web/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  372. package/out/web/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  373. package/out/web/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  374. package/out/web/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  375. package/out/web/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  376. package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  377. package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  378. package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  379. package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  380. package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  381. package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  382. package/out/web/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  383. package/out/web/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  384. package/out/web/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  385. package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  386. package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  387. package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  388. package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  389. package/out/web/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  390. package/out/web/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  391. package/out/web/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  392. package/out/web/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  393. package/out/web/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  394. package/out/web/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  395. package/out/web/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  396. package/out/web/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  397. package/out/web/pdfjs/cmaps/V.bcmap +0 -0
  398. package/out/web/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  399. package/out/web/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  400. package/out/web/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  401. package/out/web/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  402. package/out/web/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  403. package/out/web/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  404. package/out/web/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  405. package/out/web/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  406. package/out/web/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  407. package/out/web/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  408. package/out/web/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  409. package/out/web/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  410. package/out/web/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
  411. package/out/web/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  412. package/out/web/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  413. package/out/web/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  414. package/out/web/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  415. package/out/web/pdfjs/wasm/LICENSE_JBIG2 +196 -0
  416. package/out/web/pdfjs/wasm/LICENSE_OPENJPEG +39 -0
  417. package/out/web/pdfjs/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  418. package/out/web/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  419. package/out/web/pdfjs/wasm/LICENSE_PDFJS_QCMS +19 -0
  420. package/out/web/pdfjs/wasm/LICENSE_QCMS +21 -0
  421. package/out/web/pdfjs/wasm/jbig2.wasm +0 -0
  422. package/out/web/pdfjs/wasm/jbig2_nowasm_fallback.js +15 -0
  423. package/out/web/pdfjs/wasm/openjpeg.wasm +0 -0
  424. package/out/web/pdfjs/wasm/openjpeg_nowasm_fallback.js +17 -0
  425. package/out/web/pdfjs/wasm/qcms_bg.wasm +0 -0
  426. package/out/web/pdfjs/wasm/quickjs-eval.js +16 -0
  427. package/out/web/pdfjs/wasm/quickjs-eval.wasm +0 -0
  428. package/package.json +6 -4
  429. package/slash-commands.json +8 -2
  430. package/src/bin/index.js +4 -1
  431. package/src/bin/pdfjs-assets.mjs +31 -0
  432. package/src/renderer/node_modules/.vite/vitest/CACHEDIR.TAG +3 -0
  433. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  434. package/src/renderer/shared/agentProgress.ts +11 -2
  435. package/src/renderer/shared/components/Settings/AgentsTab.tsx +70 -6
  436. package/src/renderer/shared/components/Settings/AudioTab.tsx +1 -1
  437. package/src/renderer/shared/components/Settings/AutomationTab.tsx +57 -0
  438. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +18 -12
  439. package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.test.tsx +65 -0
  440. package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.tsx +456 -0
  441. package/src/renderer/shared/components/Settings/GeneralTab.tsx +40 -82
  442. package/src/renderer/shared/components/Settings/PluginsTab.tsx +101 -24
  443. package/src/renderer/shared/components/Settings/ProfileTab.tsx +1 -1
  444. package/src/renderer/shared/components/Settings/SettingsWindow.tsx +796 -0
  445. package/src/renderer/shared/components/Settings/ThemeTab.tsx +13 -1
  446. package/src/renderer/shared/components/{AgentActivityDrawer.tsx → activity/AgentActivityDrawer.tsx} +77 -61
  447. package/src/renderer/shared/components/{AgentActivityTable.tsx → activity/AgentActivityTable.tsx} +46 -7
  448. package/src/renderer/shared/components/{McpToolResults.tsx → activity/McpToolResults.tsx} +32 -13
  449. package/src/renderer/shared/components/{PlanChecklistWidget.tsx → activity/PlanChecklistWidget.tsx} +2 -2
  450. package/src/renderer/shared/components/activity/RunSummaryDashboard.test.tsx +127 -0
  451. package/src/renderer/shared/components/activity/RunSummaryDashboard.tsx +222 -0
  452. package/src/renderer/shared/components/activity/SubagentDagView.test.ts +123 -0
  453. package/src/renderer/shared/components/{SubagentDagView.tsx → activity/SubagentDagView.tsx} +97 -43
  454. package/src/renderer/shared/components/activity/SubagentStatusStrip.test.tsx +82 -0
  455. package/src/renderer/shared/components/activity/SubagentStatusStrip.tsx +107 -0
  456. package/src/renderer/shared/components/activity/ViewedImages.tsx +140 -0
  457. package/src/renderer/shared/components/{AuthGate.tsx → app/AuthGate.tsx} +3 -3
  458. package/src/renderer/shared/components/{ChunkErrorBoundary.tsx → app/ChunkErrorBoundary.tsx} +10 -10
  459. package/src/renderer/shared/components/{CommandPalette.tsx → app/CommandPalette.tsx} +25 -25
  460. package/src/renderer/shared/components/{DashboardSidebar.tsx → app/DashboardSidebar.tsx} +7 -5
  461. package/src/renderer/shared/components/{DesktopTitlebar.tsx → app/DesktopTitlebar.tsx} +7 -24
  462. package/src/renderer/shared/components/{ErrorNotice.tsx → app/ErrorNotice.tsx} +1 -1
  463. package/src/renderer/shared/components/{MintDashboard.tsx → app/MintDashboard.tsx} +191 -212
  464. package/src/renderer/shared/components/{ModalErrorBoundary.tsx → app/ModalErrorBoundary.tsx} +5 -5
  465. package/src/renderer/shared/components/{CalculationCard.tsx → cards/CalculationCard.tsx} +13 -27
  466. package/src/renderer/shared/components/{ImageGenCard.tsx → cards/ImageGenCard.tsx} +9 -22
  467. package/src/renderer/shared/components/{ImageSearchCard.tsx → cards/ImageSearchCard.tsx} +9 -22
  468. package/src/renderer/shared/components/{MermaidCard.tsx → cards/MermaidCard.tsx} +37 -21
  469. package/src/renderer/shared/components/{StockCard.tsx → cards/StockCard.tsx} +15 -31
  470. package/src/renderer/shared/components/cards/ToolResultCards.tsx +86 -0
  471. package/src/renderer/shared/components/{UiFeatureCard.tsx → cards/UiFeatureCard.tsx} +6 -6
  472. package/src/renderer/shared/components/{UiGridCard.tsx → cards/UiGridCard.tsx} +3 -3
  473. package/src/renderer/shared/components/{WeatherCard.tsx → cards/WeatherCard.tsx} +1 -1
  474. package/src/renderer/shared/components/{ApprovalCard.test.tsx → chat/ApprovalCard.test.tsx} +1 -1
  475. package/src/renderer/shared/components/{ApprovalCard.tsx → chat/ApprovalCard.tsx} +5 -5
  476. package/src/renderer/shared/components/{ChatCodeBlock.tsx → chat/ChatCodeBlock.tsx} +1 -1
  477. package/src/renderer/shared/components/{ChatMessageItem.test.tsx → chat/ChatMessageItem.test.tsx} +92 -15
  478. package/src/renderer/shared/components/{ChatMessageItem.tsx → chat/ChatMessageItem.tsx} +73 -157
  479. package/src/renderer/shared/components/chat/ChatPanel.test.tsx +31 -0
  480. package/src/renderer/shared/components/{ChatPanel.tsx → chat/ChatPanel.tsx} +244 -493
  481. package/src/renderer/shared/components/{CollapsiblePasteInput.tsx → chat/CollapsiblePasteInput.tsx} +2 -2
  482. package/src/renderer/shared/components/{DiffReviewModal.tsx → chat/DiffReviewModal.tsx} +40 -40
  483. package/src/renderer/shared/components/{GeminiLiveOverlay.tsx → chat/GeminiLiveOverlay.tsx} +2 -2
  484. package/src/renderer/shared/components/{ModelSelectorPopover.tsx → chat/ModelSelectorPopover.tsx} +3 -3
  485. package/src/renderer/shared/components/chat/QueuedMessagesBanner.test.tsx +89 -0
  486. package/src/renderer/shared/components/chat/QueuedMessagesBanner.tsx +201 -0
  487. package/src/renderer/shared/components/{RewindModal.tsx → chat/RewindModal.tsx} +4 -4
  488. package/src/renderer/shared/components/{SlashChoicePanel.tsx → chat/SlashChoicePanel.tsx} +2 -2
  489. package/src/renderer/shared/components/{SlashSuggestions.tsx → chat/SlashSuggestions.tsx} +4 -4
  490. package/src/renderer/shared/components/{SourcesBlock.tsx → chat/SourcesBlock.tsx} +30 -37
  491. package/src/renderer/shared/components/{ThinkingBlock.tsx → chat/ThinkingBlock.tsx} +1 -1
  492. package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +86 -0
  493. package/src/renderer/shared/components/chat/TurnFileChanges.tsx +430 -0
  494. package/src/renderer/shared/components/{VoicePill.css → chat/VoicePill.css} +1 -1
  495. package/src/renderer/shared/components/{VoicePill.jsx → chat/VoicePill.jsx} +3 -2
  496. package/src/renderer/shared/components/{CliSessionsView.test.tsx → extensions/CliSessionsView.test.tsx} +2 -2
  497. package/src/renderer/shared/components/{CliSessionsView.tsx → extensions/CliSessionsView.tsx} +14 -12
  498. package/src/renderer/shared/components/{LinkedFoldersView.tsx → extensions/LinkedFoldersView.tsx} +3 -3
  499. package/src/renderer/shared/components/{McpRegistryPicker.tsx → extensions/McpRegistryPicker.tsx} +3 -3
  500. package/src/renderer/shared/components/{McpServersView.tsx → extensions/McpServersView.tsx} +105 -36
  501. package/src/renderer/shared/components/{McpToolAllowlist.tsx → extensions/McpToolAllowlist.tsx} +2 -2
  502. package/src/renderer/shared/components/{ModUi.test.tsx → extensions/ModUi.test.tsx} +9 -4
  503. package/src/renderer/shared/components/{ModsPanel.tsx → extensions/ModsPanel.tsx} +59 -7
  504. package/src/renderer/shared/components/{PluginsView.tsx → extensions/PluginsView.tsx} +6 -6
  505. package/src/renderer/shared/components/{ScheduledTasksView.tsx → extensions/ScheduledTasksView.tsx} +5 -5
  506. package/src/renderer/shared/components/extensions/SkillsView.test.tsx +31 -0
  507. package/src/renderer/shared/components/{SkillsView.tsx → extensions/SkillsView.tsx} +20 -4
  508. package/src/renderer/shared/components/{ImageStudioPanel.tsx → studio/ImageStudioPanel.tsx} +6 -6
  509. package/src/renderer/shared/components/{LibraryItemCard.tsx → studio/LibraryItemCard.tsx} +2 -2
  510. package/src/renderer/shared/components/{LibraryPage.tsx → studio/LibraryPage.tsx} +5 -5
  511. package/src/renderer/shared/components/{LibraryPreview.tsx → studio/LibraryPreview.tsx} +2 -2
  512. package/src/renderer/shared/components/{VeoStudioPanel.tsx → studio/VeoStudioPanel.tsx} +7 -7
  513. package/src/renderer/shared/components/{GlideSelect.css → ui/GlideSelect.css} +7 -6
  514. package/src/renderer/shared/components/ui/ProviderBrandIcon.test.tsx +67 -0
  515. package/src/renderer/shared/components/ui/ProviderBrandIcon.tsx +167 -0
  516. package/src/renderer/shared/components/ui/SelectField.tsx +506 -0
  517. package/src/renderer/shared/components/ui/error-recovery.css +10 -10
  518. package/src/renderer/shared/components/ui/error-recovery.tsx +1 -1
  519. package/src/renderer/shared/components/{ArtifactPreviewPanel.tsx → workspace/ArtifactPreviewPanel.tsx} +256 -112
  520. package/src/renderer/shared/components/workspace/BackgroundTerminals.test.tsx +63 -0
  521. package/src/renderer/shared/components/{BackgroundTerminals.tsx → workspace/BackgroundTerminals.tsx} +40 -9
  522. package/src/renderer/shared/components/{CodeReviewPage.tsx → workspace/CodeReviewPage.tsx} +47 -8
  523. package/src/renderer/shared/components/{GitBranchSelector.tsx → workspace/GitBranchSelector.tsx} +2 -2
  524. package/src/renderer/shared/components/workspace/SessionSources.tsx +113 -0
  525. package/src/renderer/shared/components/{TerminalDock.tsx → workspace/TerminalDock.tsx} +5 -2
  526. package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +68 -0
  527. package/src/renderer/shared/components/{ToolSurfacePage.tsx → workspace/ToolSurfacePage.tsx} +322 -71
  528. package/src/renderer/shared/components/{ToolsPanelToggle.tsx → workspace/ToolsPanelToggle.tsx} +1 -1
  529. package/src/renderer/shared/components/workspace/WorkspaceFileInfo.tsx +28 -0
  530. package/src/renderer/shared/components/workspace/WorkspaceMediaPreview.tsx +17 -0
  531. package/src/renderer/shared/components/{WorkspacePaneResizer.tsx → workspace/WorkspacePaneResizer.tsx} +1 -1
  532. package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +89 -0
  533. package/src/renderer/shared/components/{WorkspacePreviewActions.test.tsx → workspace/WorkspacePreviewActions.test.tsx} +48 -3
  534. package/src/renderer/shared/components/{WorkspacePreviewActions.tsx → workspace/WorkspacePreviewActions.tsx} +3 -3
  535. package/src/renderer/shared/components/{WorkspaceSelector.tsx → workspace/WorkspaceSelector.tsx} +99 -7
  536. package/src/renderer/shared/components/{workspace-selector.css → workspace/workspace-selector.css} +84 -2
  537. package/src/renderer/shared/constants/config.ts +7 -0
  538. package/src/renderer/shared/conversation/coordinator.test.ts +46 -0
  539. package/src/renderer/shared/conversation/coordinator.ts +50 -2
  540. package/src/renderer/shared/conversation/lifecycle.test.ts +163 -1
  541. package/src/renderer/shared/conversation/lifecycle.ts +164 -7
  542. package/src/renderer/shared/conversation/projectNavigation.test.ts +18 -0
  543. package/src/renderer/shared/conversation/projectNavigation.ts +11 -0
  544. package/src/renderer/shared/conversation/transport.test.ts +20 -0
  545. package/src/renderer/shared/conversation/transport.ts +51 -9
  546. package/src/renderer/shared/conversation/useConversationCoordinator.ts +42 -12
  547. package/src/renderer/shared/css/agent-observability.css +72 -11
  548. package/src/renderer/shared/css/chat-ui-cards.css +35 -35
  549. package/src/renderer/shared/css/code-review.css +86 -86
  550. package/src/renderer/shared/css/code-sessions.css +10 -10
  551. package/src/renderer/shared/css/file-changes.css +167 -5
  552. package/src/renderer/shared/css/management-views.css +78 -37
  553. package/src/renderer/shared/css/mcp-results.css +46 -3
  554. package/src/renderer/shared/css/queued-messages.css +221 -0
  555. package/src/renderer/shared/css/session-sources.css +12 -7
  556. package/src/renderer/shared/css/settings/agents.css +2 -2
  557. package/src/renderer/{src-web → shared}/css/settings/base.css +101 -107
  558. package/src/renderer/shared/css/settings/general.css +384 -92
  559. package/src/renderer/shared/css/settings/plugins.css +8 -8
  560. package/src/renderer/shared/css/settings/theme.css +44 -32
  561. package/src/renderer/shared/css/ui-tailwind.css +2 -2
  562. package/src/renderer/shared/css/viewed-images.css +89 -0
  563. package/src/renderer/shared/css/workspace-file-info.css +12 -0
  564. package/src/renderer/shared/css/workspace-media-preview.css +13 -0
  565. package/src/renderer/shared/env.d.ts +9 -0
  566. package/src/renderer/shared/platform.test.ts +143 -0
  567. package/src/renderer/shared/platform.ts +10 -4
  568. package/src/renderer/shared/speech/player.ts +160 -0
  569. package/src/renderer/shared/speech/types.ts +11 -0
  570. package/src/renderer/shared/theme/themeManager.test.ts +20 -0
  571. package/src/renderer/shared/theme/themeManager.ts +3 -1
  572. package/src/renderer/shared/theme/themes.ts +17 -4
  573. package/src/renderer/shared/theme/tokens.css +448 -51
  574. package/src/renderer/shared/types.ts +56 -1
  575. package/src/renderer/shared/utils/agentActivity.test.ts +165 -6
  576. package/src/renderer/shared/utils/agentActivity.ts +181 -31
  577. package/src/renderer/shared/utils/artifactBrowser.ts +1 -1
  578. package/src/renderer/shared/utils/artifacts.ts +55 -0
  579. package/src/renderer/shared/utils/contextCompaction.test.tsx +1 -1
  580. package/src/renderer/shared/utils/externalLinks.ts +91 -0
  581. package/src/renderer/shared/utils/lazyWithRetry.ts +13 -0
  582. package/src/renderer/shared/utils/markdown.tsx +169 -35
  583. package/src/renderer/shared/utils/markdown.webImages.test.tsx +124 -2
  584. package/src/renderer/shared/utils/mcpResults.test.tsx +24 -1
  585. package/src/renderer/shared/utils/pdfRange.ts +16 -0
  586. package/src/renderer/shared/utils/previewObjectUrls.ts +20 -0
  587. package/src/renderer/shared/utils/sessionSources.test.ts +41 -1
  588. package/src/renderer/shared/utils/sessionSources.ts +2 -0
  589. package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
  590. package/src/renderer/shared/utils/speech.ts +18 -4
  591. package/src/renderer/shared/utils/useNativeVoiceInput.ts +19 -5
  592. package/src/renderer/shared/utils/useSessionSources.ts +4 -0
  593. package/src/renderer/shared/utils/viewedImages.test.ts +129 -0
  594. package/src/renderer/shared/utils/viewedImages.ts +81 -10
  595. package/src/renderer/shared/utils/workspaceDrag.ts +30 -0
  596. package/src/renderer/shared/utils/workspaceImage.ts +17 -0
  597. package/src/renderer/shared/utils/workspaceListPreferences.test.ts +64 -0
  598. package/src/renderer/shared/utils/workspaceListPreferences.ts +54 -0
  599. package/src/renderer/shared/utils/workspaceMedia.ts +41 -0
  600. package/src/renderer/shared/utils/workspacePreview.test.ts +147 -2
  601. package/src/renderer/shared/utils/workspacePreview.ts +34 -3
  602. package/src/renderer/shared/utils/workspaces.ts +3 -2
  603. package/src/renderer/src/App.tsx +6 -8
  604. package/src/renderer/src/components/ChatPanel.tsx +1 -1
  605. package/src/renderer/src/components/DashboardSidebar.tsx +2 -2
  606. package/src/renderer/src/components/ImageStudioPanel.tsx +1 -1
  607. package/src/renderer/src/components/LiveTranslateControls.tsx +1 -1
  608. package/src/renderer/src/components/MintDashboard.tsx +1 -1
  609. package/src/renderer/src/components/ProactiveGlow.tsx +1 -1
  610. package/src/renderer/src/components/ScreenPicker.tsx +1 -1
  611. package/src/renderer/src/components/SettingsWindow.tsx +6 -830
  612. package/src/renderer/src/components/SpotlightWindow.tsx +4 -32
  613. package/src/renderer/src/components/VeoStudioPanel.tsx +1 -1
  614. package/src/renderer/src/components/WorkspacePanel.tsx +45 -12
  615. package/src/renderer/src/components/browser-shell.css +26 -26
  616. package/src/renderer/src/components/browser-suggestions-popup.css +8 -8
  617. package/src/renderer/src/css/app-shell.css +22 -102
  618. package/src/renderer/src/css/chat.css +221 -34
  619. package/src/renderer/src/css/desktop-tools.css +6 -337
  620. package/src/renderer/src/css/sidebar-workspace.css +20 -0
  621. package/src/renderer/src/css/spotlight.css +2 -2
  622. package/src/renderer/src/css/tool-surfaces.css +328 -58
  623. package/src/renderer/src/css/widget.css +6 -5
  624. package/src/renderer/src/env.d.ts +13 -0
  625. package/src/renderer/src/index.css +15 -63
  626. package/src/renderer/src/tauri.ts +77 -11
  627. package/src/renderer/src/voiceInput.ts +3 -1
  628. package/src/renderer/src-web/App.tsx +6 -8
  629. package/src/renderer/src-web/components/ChatPanel.tsx +1 -1
  630. package/src/renderer/src-web/components/DashboardSidebar.tsx +2 -2
  631. package/src/renderer/src-web/components/ImageStudioPanel.tsx +1 -1
  632. package/src/renderer/src-web/components/MintDashboard.tsx +1 -1
  633. package/src/renderer/src-web/components/SettingsWindow.tsx +6 -851
  634. package/src/renderer/src-web/components/VeoStudioPanel.tsx +1 -1
  635. package/src/renderer/src-web/css/app-shell.css +16 -100
  636. package/src/renderer/src-web/css/chat.css +221 -34
  637. package/src/renderer/src-web/css/sidebar-workspace.css +20 -0
  638. package/src/renderer/src-web/env.d.ts +14 -0
  639. package/src/renderer/src-web/index.css +15 -63
  640. package/src/renderer/src-web/tauri.ts +71 -13
  641. package/src/renderer/tests/browserArtifacts.browser.html +1 -0
  642. package/src/renderer/tests/browserArtifacts.browser.tsx +68 -0
  643. package/src/renderer/tests/chatEscape.browser.html +1 -0
  644. package/src/renderer/tests/chatEscape.browser.tsx +25 -0
  645. package/src/renderer/tests/chatPerformance.browser.html +1 -1
  646. package/src/renderer/tests/collapsedPaste.browser.html +1 -1
  647. package/src/renderer/tests/composerMenus.browser.html +3 -3
  648. package/src/renderer/tests/contextCompaction.browser.html +1 -1
  649. package/src/renderer/tests/errorRecovery.browser.html +1 -1
  650. package/src/renderer/tests/fixtures/preview.webm +0 -0
  651. package/src/renderer/tests/glideSelect.browser.html +1 -2
  652. package/src/renderer/tests/glideSelect.preview.html +1 -1
  653. package/src/renderer/tests/library.browser.tsx +1 -1
  654. package/src/renderer/tests/liveOrb.browser.html +1 -1
  655. package/src/renderer/tests/mediaFixtures.ts +32 -0
  656. package/src/renderer/tests/modInput.browser.html +1 -1
  657. package/src/renderer/tests/sessionSources.browser.tsx +76 -15
  658. package/src/renderer/tests/toolsPanel.browser.tsx +5 -5
  659. package/src/renderer/tests/viewedImages.browser.tsx +3 -3
  660. package/src/renderer/tests/voiceDictation.browser.html +101 -0
  661. package/src/renderer/tests/voicePill.browser.html +3 -3
  662. package/src/renderer/tests/voicePill.preview.html +1 -1
  663. package/src/renderer/tests/webSources.browser.tsx +2 -98
  664. package/src/renderer/tests/workspaceDrop.browser.html +1 -0
  665. package/src/renderer/tests/workspaceDrop.browser.tsx +183 -0
  666. package/src/renderer/tests/workspaceExpansion.browser.html +1 -0
  667. package/src/renderer/tests/workspaceExpansion.browser.tsx +66 -0
  668. package/src/renderer/tests/workspaceRemoval.browser.html +66 -0
  669. package/src/renderer/tests/workspaceUndo.browser.html +10 -2
  670. package/src-tauri/src/app/lifecycle.rs +44 -1
  671. package/src-tauri/src/commands/conversation.rs +99 -73
  672. package/src-tauri/src/commands/integrations.rs +7 -1
  673. package/src-tauri/src/commands/media.rs +7 -0
  674. package/src-tauri/src/commands/workspace.rs +38 -0
  675. package/tsconfig.json +15 -1
  676. package/vite.config.ts +2 -1
  677. package/vite.config.web.ts +2 -0
  678. package/out/web/assets/CliSessionsView-D7hw0Mgj.js +0 -1
  679. package/out/web/assets/CodeReviewPage-C7bEOJfd.js +0 -4
  680. package/out/web/assets/CodeReviewPage-Dte9uLiL.css +0 -1
  681. package/out/web/assets/CommandPalette-0RrF-AOT.js +0 -1
  682. package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +0 -1
  683. package/out/web/assets/LibraryPage--Qfisp6D.js +0 -2
  684. package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +0 -1
  685. package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +0 -1
  686. package/out/web/assets/McpServersView-slfQJzNB.js +0 -1
  687. package/out/web/assets/MintDashboard-BSR5XpXh.js +0 -25
  688. package/out/web/assets/MintDashboard-CWUcCGhd.css +0 -1
  689. package/out/web/assets/PluginsView-l7LSm503.js +0 -1
  690. package/out/web/assets/ScheduledTasksView-CttmLbq1.js +0 -1
  691. package/out/web/assets/SettingsWindow-BCMLYvEV.js +0 -4
  692. package/out/web/assets/SettingsWindow-DcMVmU9u.css +0 -1
  693. package/out/web/assets/SkillsView-rNs1qr_U.js +0 -2
  694. package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +0 -37
  695. package/out/web/assets/ToolSurfacePage-CTfgggF2.css +0 -1
  696. package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +0 -4
  697. package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +0 -1
  698. package/out/web/assets/WorkspaceSelector-B2xIp04D.js +0 -1
  699. package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +0 -1
  700. package/out/web/assets/abnfDiagram-VCTEODGH-CD0CjoGl.js +0 -1
  701. package/out/web/assets/architecture-7GRP2DOG-RKV83OeZ.js +0 -1
  702. package/out/web/assets/architectureDiagram-5GKGNRK7-nN_HAFct.js +0 -36
  703. package/out/web/assets/c4Diagram-UCG6FXSJ-DTdV8_zE.js +0 -38
  704. package/out/web/assets/chunk-2Q5K7J3B-Dmqrq8Tp.js +0 -1
  705. package/out/web/assets/chunk-75Z2AOVW-_M0z5olV.js +0 -2
  706. package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +0 -2
  707. package/out/web/assets/chunk-CLGD4ZFX-D54yGvGS.js +0 -1
  708. package/out/web/assets/chunk-CacB07dV.js +0 -1
  709. package/out/web/assets/chunk-DSNCTWBM-C-gvT2ru.js +0 -2
  710. package/out/web/assets/chunk-DU6HZSFF-CnFngIhW.js +0 -128
  711. package/out/web/assets/chunk-F27PBJKO-BqtWrnEO.js +0 -1
  712. package/out/web/assets/chunk-FOHPRMQF-BaVC1uA7.js +0 -161
  713. package/out/web/assets/chunk-G27WJ6UU-Ckoq5mi2.js +0 -231
  714. package/out/web/assets/chunk-JQ64N6SF-CF8T7GiZ.js +0 -1
  715. package/out/web/assets/chunk-JWPE2WC7-BwtYOHqU.js +0 -1
  716. package/out/web/assets/chunk-LNGE3PJU-AdBoOWw2.js +0 -34
  717. package/out/web/assets/chunk-OBVCFTLP-CRIkunUB.js +0 -1
  718. package/out/web/assets/chunk-P2QGCYS3-UFEU6BxZ.js +0 -1
  719. package/out/web/assets/chunk-POPQ4Y6H-CQcrNbjr.js +0 -1
  720. package/out/web/assets/chunk-PWAF6VOD-Cc2uVDsG.js +0 -1
  721. package/out/web/assets/chunk-R7TYR2AO-DiCxzdAY.js +0 -10
  722. package/out/web/assets/chunk-RHFEMEQ7-b7hnPmrR.js +0 -168
  723. package/out/web/assets/chunk-XXDRQBXY-DnJkbUaw.js +0 -1
  724. package/out/web/assets/chunk-Y2CYZVJY-C9o-s6OY.js +0 -1
  725. package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +0 -1
  726. package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +0 -1
  727. package/out/web/assets/config-CnvCChUM.js +0 -2
  728. package/out/web/assets/config-DM6oIVO3.css +0 -1
  729. package/out/web/assets/core-DsKkQ7ig.js +0 -1
  730. package/out/web/assets/cose-bilkent-JH36ORCC--UN4aw5-.js +0 -1
  731. package/out/web/assets/cynefin-OW5HDTMX-CnzQfOGp.js +0 -1
  732. package/out/web/assets/cynefinDiagram-5FMLGOSQ-DVtQnfpm.js +0 -62
  733. package/out/web/assets/cytoscape.esm-Df1UN4Y1.js +0 -321
  734. package/out/web/assets/dagre-3AP2YEHR-DG76_k5_.js +0 -4
  735. package/out/web/assets/dagre-BWadQu2F.js +0 -1
  736. package/out/web/assets/diagram-S7CK7UJ4-CaouUoze.js +0 -30
  737. package/out/web/assets/diagram-UQ7AKVKN-B4bEc26B.js +0 -41
  738. package/out/web/assets/diagram-VX7I27RA-7hH5IPYf.js +0 -24
  739. package/out/web/assets/diagram-Z3DM3KII-CCM4clo8.js +0 -24
  740. package/out/web/assets/dist-BoTOASLF.js +0 -1
  741. package/out/web/assets/dist-js-BkYNznHX.js +0 -1
  742. package/out/web/assets/ebnfDiagram-PWID7BFC-Da7WAM3k.js +0 -1
  743. package/out/web/assets/event-Cdt7Byyj.js +0 -1
  744. package/out/web/assets/eventmodeling-NTZA5JFV-xcfsA0XD.js +0 -1
  745. package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +0 -1
  746. package/out/web/assets/ganttDiagram-EL5Y4UJY-B3ClFGmL.js +0 -292
  747. package/out/web/assets/gitGraph-4MIJSDKK-BZ_y_cDU.js +0 -1
  748. package/out/web/assets/gitGraphDiagram-WWUBYQGX-drhRSYm3.js +0 -106
  749. package/out/web/assets/graphlib-CTR5ZhLf.js +0 -1
  750. package/out/web/assets/index-BZ9xgmMP.css +0 -1
  751. package/out/web/assets/index-Ca8cCS4h.js +0 -168
  752. package/out/web/assets/info-A6RAGUB7-B7I3K0F1.js +0 -1
  753. package/out/web/assets/infoDiagram-RXCK75RN-deX_1MPh.js +0 -2
  754. package/out/web/assets/journeyDiagram-EYS64GPL-CZn2kB8b.js +0 -139
  755. package/out/web/assets/jsx-runtime-DN4NhQUK.js +0 -1
  756. package/out/web/assets/katex-O3jvqgnU.js +0 -257
  757. package/out/web/assets/markdown-CMhYIcWB.js +0 -39
  758. package/out/web/assets/mermaid-parser.core-Whu2rlJC.js +0 -7
  759. package/out/web/assets/mermaid.core-CKyPo8VH.js +0 -11
  760. package/out/web/assets/modelManager-CUaGWMWu.js +0 -2
  761. package/out/web/assets/oauthManager-DlNhXJr6.js +0 -1
  762. package/out/web/assets/packet-AYTQ26CC-CEeIRKRG.js +0 -1
  763. package/out/web/assets/pegDiagram-XKGWAZYB-BYadI-KO.js +0 -1
  764. package/out/web/assets/pie-WAS4IAKB-D8uf4dh5.js +0 -1
  765. package/out/web/assets/pieDiagram-E7YTZNPT-CjSDy4hO.js +0 -39
  766. package/out/web/assets/radar-RG4KPBEZ-DZJxnokY.js +0 -1
  767. package/out/web/assets/railroad-74A4TZTK-DBysUiUi.js +0 -1
  768. package/out/web/assets/railroad-abnf-HS5TGJTU-CHWxoJYg.js +0 -1
  769. package/out/web/assets/railroad-ebnf-LZEXJU2U-DDv7X6bY.js +0 -1
  770. package/out/web/assets/railroad-peg-WCYAUIDC-DpfcYYNJ.js +0 -1
  771. package/out/web/assets/railroadDiagram-O6MQD6OU-CYtyv0t3.js +0 -1
  772. package/out/web/assets/rough.esm-DFbTUy8a.js +0 -1
  773. package/out/web/assets/sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js +0 -40
  774. package/out/web/assets/sequenceDiagram-WJ2MYXX4-BvFLKtPd.js +0 -162
  775. package/out/web/assets/sizeCapture-X5ZJPWSS-DKeOCaN2.js +0 -1
  776. package/out/web/assets/src-DnfeXQPr.js +0 -1
  777. package/out/web/assets/stateDiagram-HBIQ2CUA-Bx0GWeaY.js +0 -1
  778. package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +0 -1
  779. package/out/web/assets/studio-B1mk40wD.js +0 -1
  780. package/out/web/assets/swimlanes-XN3QIQJK-CCma0T7L.js +0 -1
  781. package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +0 -8
  782. package/out/web/assets/timeline-definition-24CTP7MA-iCRhhJ7C.js +0 -120
  783. package/out/web/assets/treeView-Q6P3EWNA-DZ-y08qp.js +0 -1
  784. package/out/web/assets/treemap-WGGIJYW6-De0CxzMx.js +0 -1
  785. package/out/web/assets/vennDiagram-4TSXK5OY-w_7aZ6xe.js +0 -34
  786. package/out/web/assets/wardley-WFR3VGLG-DT0y0xJ4.js +0 -1
  787. package/out/web/assets/window-BJCVtyET.js +0 -1
  788. package/src/renderer/shared/components/ChatPanel.test.tsx +0 -21
  789. package/src/renderer/shared/components/FormattedMessage.tsx +0 -11
  790. package/src/renderer/shared/components/GlideSelect.d.ts +0 -31
  791. package/src/renderer/shared/components/GlideSelect.jsx +0 -266
  792. package/src/renderer/shared/components/InlineThoughtNote.tsx +0 -27
  793. package/src/renderer/shared/components/ModSessionControls.tsx +0 -8
  794. package/src/renderer/shared/components/ModUi.tsx +0 -26
  795. package/src/renderer/shared/components/ProgressActivity.tsx +0 -17
  796. package/src/renderer/shared/components/ReviewHistory.tsx +0 -42
  797. package/src/renderer/shared/components/RunSummaryDashboard.tsx +0 -143
  798. package/src/renderer/shared/components/SelectField.tsx +0 -38
  799. package/src/renderer/shared/components/SessionSources.tsx +0 -48
  800. package/src/renderer/shared/components/SessionSourcesPopover.tsx +0 -61
  801. package/src/renderer/shared/components/ToolSurfacePage.test.tsx +0 -32
  802. package/src/renderer/shared/components/ViewedImages.tsx +0 -36
  803. package/src/renderer/shared/components/WorkspaceContextPopover.tsx +0 -138
  804. package/src/renderer/shared/components/ui/demo.tsx +0 -26
  805. package/src/renderer/shared/css/session-sources-popover.css +0 -9
  806. package/src/renderer/src/components/CalculationCard.tsx +0 -3
  807. package/src/renderer/src/components/ImageGenCard.tsx +0 -2
  808. package/src/renderer/src/components/ImageSearchCard.tsx +0 -2
  809. package/src/renderer/src/components/MermaidCard.tsx +0 -1
  810. package/src/renderer/src/components/PicturesLibrary.tsx +0 -2
  811. package/src/renderer/src/components/Settings/AgentsTab.tsx +0 -4
  812. package/src/renderer/src/components/Settings/AudioTab.tsx +0 -3
  813. package/src/renderer/src/components/Settings/AutomationTab.tsx +0 -3
  814. package/src/renderer/src/components/Settings/GeneralTab.tsx +0 -3
  815. package/src/renderer/src/components/Settings/MemoryTab.tsx +0 -3
  816. package/src/renderer/src/components/Settings/PluginsTab.tsx +0 -3
  817. package/src/renderer/src/components/Settings/ProfileTab.tsx +0 -3
  818. package/src/renderer/src/components/Settings/ShortcutsTab.tsx +0 -3
  819. package/src/renderer/src/components/Settings/ThemeTab.tsx +0 -3
  820. package/src/renderer/src/components/StockCard.tsx +0 -3
  821. package/src/renderer/src/components/WeatherCard.tsx +0 -3
  822. package/src/renderer/src/css/pictures.css +0 -2
  823. package/src/renderer/src/css/settings/base.css +0 -1266
  824. package/src/renderer/src-web/components/PicturesLibrary.tsx +0 -2
  825. package/src/renderer/src-web/components/Settings/AgentsTab.tsx +0 -4
  826. package/src/renderer/src-web/components/Settings/AudioTab.tsx +0 -3
  827. package/src/renderer/src-web/components/Settings/AutomationTab.tsx +0 -3
  828. package/src/renderer/src-web/components/Settings/GeneralTab.tsx +0 -3
  829. package/src/renderer/src-web/components/Settings/MemoryTab.tsx +0 -3
  830. package/src/renderer/src-web/components/Settings/PluginsTab.tsx +0 -3
  831. package/src/renderer/src-web/components/Settings/ProfileTab.tsx +0 -3
  832. package/src/renderer/src-web/components/Settings/ShortcutsTab.tsx +0 -3
  833. package/src/renderer/src-web/components/Settings/ThemeTab.tsx +0 -3
  834. package/src/renderer/src-web/css/pictures.css +0 -2
  835. package/src/renderer/src-web/css/spotlight.css +0 -102
  836. package/src/renderer/src-web/css/widget.css +0 -213
  837. /package/src/renderer/shared/components/{UiMockupWidget.tsx → cards/UiMockupWidget.tsx} +0 -0
  838. /package/src/renderer/shared/components/{ContextCompactionStatus.tsx → chat/ContextCompactionStatus.tsx} +0 -0
  839. /package/src/renderer/shared/components/{GeminiLiveOverlay.css → chat/GeminiLiveOverlay.css} +0 -0
  840. /package/src/renderer/shared/components/{GeminiLiveOverlay.test.tsx → chat/GeminiLiveOverlay.test.tsx} +0 -0
  841. /package/src/renderer/shared/components/{SlashSuggestions.test.tsx → chat/SlashSuggestions.test.tsx} +0 -0
  842. /package/src/renderer/shared/components/{VirtualChatHistory.tsx → chat/VirtualChatHistory.tsx} +0 -0
  843. /package/src/renderer/shared/components/{VoicePill.d.ts → chat/VoicePill.d.ts} +0 -0
  844. /package/src/renderer/shared/components/{VoicePill.test.tsx → chat/VoicePill.test.tsx} +0 -0
  845. /package/src/renderer/shared/components/{ScreenCaptureDialog.css → studio/ScreenCaptureDialog.css} +0 -0
  846. /package/src/renderer/shared/components/{ScreenCaptureDialog.tsx → studio/ScreenCaptureDialog.tsx} +0 -0
  847. /package/src/renderer/shared/components/{SelectField.test.tsx → ui/SelectField.test.tsx} +0 -0
  848. /package/src/renderer/shared/components/{background-terminals.css → workspace/background-terminals.css} +0 -0
@@ -36,6 +36,8 @@ pub(crate) const SHELL_COMMAND_TIMEOUT: Duration = Duration::from_secs(180);
36
36
  pub(crate) struct CommandResult {
37
37
  pub(crate) status_code: Option<i32>,
38
38
  pub(crate) success: bool,
39
+ pub(crate) job_id: Option<String>,
40
+ pub(crate) cancelled: bool,
39
41
  pub(crate) stdout: Vec<u8>,
40
42
  pub(crate) stderr: Vec<u8>,
41
43
  }
@@ -62,10 +64,20 @@ fn spawn_reader(
62
64
  /// the same timeout/output-buffering behavior for `docker exec` instead of
63
65
  /// duplicating it.
64
66
  pub(crate) fn run_with_timeout(
67
+ cmd: Command,
68
+ timeout: Duration,
69
+ command: &str,
70
+ cwd: &Path,
71
+ ) -> std::io::Result<CommandResult> {
72
+ run_with_timeout_cancellable(cmd, timeout, command, cwd, None)
73
+ }
74
+
75
+ fn run_with_timeout_cancellable(
65
76
  mut cmd: Command,
66
77
  timeout: Duration,
67
78
  command: &str,
68
79
  cwd: &Path,
80
+ cancellation: Option<&tokio_util::sync::CancellationToken>,
69
81
  ) -> std::io::Result<CommandResult> {
70
82
  cmd.stdin(Stdio::null())
71
83
  .stdout(Stdio::piped())
@@ -82,12 +94,50 @@ pub(crate) fn run_with_timeout(
82
94
 
83
95
  let deadline = Instant::now() + timeout;
84
96
  loop {
97
+ if cancellation.is_some_and(|token| token.is_cancelled()) {
98
+ #[cfg(unix)]
99
+ unsafe {
100
+ libc::kill(-(child.id() as i32), libc::SIGTERM);
101
+ }
102
+ // Allow the browser helper to drop its separate Chrome runtime.
103
+ let grace = Instant::now() + Duration::from_millis(500);
104
+ while Instant::now() < grace {
105
+ if child.try_wait()?.is_some() {
106
+ break;
107
+ }
108
+ std::thread::sleep(Duration::from_millis(10));
109
+ }
110
+ #[cfg(unix)]
111
+ unsafe {
112
+ libc::kill(-(child.id() as i32), libc::SIGKILL);
113
+ }
114
+ #[cfg(windows)]
115
+ {
116
+ let _ = Command::new("taskkill")
117
+ .args(["/PID", &child.id().to_string(), "/T", "/F"])
118
+ .output();
119
+ }
120
+ let _ = child.kill();
121
+ let _ = child.wait();
122
+ let stdout = stdout_handle.join().unwrap_or_default();
123
+ let stderr = stderr_handle.join().unwrap_or_default();
124
+ return Ok(CommandResult {
125
+ status_code: None,
126
+ success: false,
127
+ job_id: None,
128
+ cancelled: true,
129
+ stdout,
130
+ stderr,
131
+ });
132
+ }
85
133
  if let Some(status) = child.try_wait()? {
86
134
  let stdout = stdout_handle.join().unwrap_or_default();
87
135
  let stderr = stderr_handle.join().unwrap_or_default();
88
136
  return Ok(CommandResult {
89
137
  status_code: status.code(),
90
138
  success: status.success(),
139
+ job_id: None,
140
+ cancelled: false,
91
141
  stdout,
92
142
  stderr,
93
143
  });
@@ -117,6 +167,8 @@ pub(crate) fn run_with_timeout(
117
167
  return Ok(CommandResult {
118
168
  status_code: None,
119
169
  success: false,
170
+ job_id: Some(started.id),
171
+ cancelled: false,
120
172
  stdout: Vec::new(),
121
173
  stderr,
122
174
  });
@@ -133,6 +185,8 @@ pub struct ShellOutput {
133
185
  pub mode: String,
134
186
  pub status: Option<i32>,
135
187
  pub success: bool,
188
+ pub job_id: Option<String>,
189
+ pub cancelled: bool,
136
190
  pub sandboxed: bool,
137
191
  /// Set when a mutating/network command ran unconfined because sandboxing was
138
192
  /// unavailable (rather than intentionally disabled via `sandboxMode: "off"`),
@@ -193,6 +247,23 @@ pub fn run_shell_command(
193
247
  config: &MintConfig,
194
248
  chat_id: Option<&str>,
195
249
  ) -> Result<ShellOutput, ShellError> {
250
+ run_shell_command_cancellable(command, cwd, approved, config, chat_id, None)
251
+ }
252
+
253
+ pub fn run_shell_command_cancellable(
254
+ command: &str,
255
+ cwd: &Path,
256
+ approved: bool,
257
+ config: &MintConfig,
258
+ chat_id: Option<&str>,
259
+ cancellation: Option<&tokio_util::sync::CancellationToken>,
260
+ ) -> Result<ShellOutput, ShellError> {
261
+ if cancellation.is_some_and(|token| token.is_cancelled()) {
262
+ return Err(ShellError::Execute(std::io::Error::new(
263
+ std::io::ErrorKind::Interrupted,
264
+ "Command cancelled before dispatch",
265
+ )));
266
+ }
196
267
  if crate::bg_shell::is_shutting_down() {
197
268
  return Err(ShellError::Execute(std::io::Error::other(
198
269
  "Mint backend is shutting down",
@@ -245,7 +316,7 @@ pub fn run_shell_command(
245
316
  let sandbox_mode = config.sandbox_mode.trim().to_ascii_lowercase();
246
317
  let mut sandbox_warning = None;
247
318
  if config.safety_enabled && sandbox_mode != "off" {
248
- if let Some(output) = run_in_sandbox(&prepared_cmd, &cwd, config)? {
319
+ if let Some(output) = run_in_sandbox(&prepared_cmd, &cwd, config, cancellation)? {
249
320
  return Ok(shell_output(
250
321
  command,
251
322
  cwd,
@@ -288,8 +359,10 @@ pub fn run_shell_command(
288
359
  }
289
360
 
290
361
  let mut cmd = shell_command(&prepared_cmd);
362
+ crate::browser::workflow::configure_shell(&mut cmd, config);
291
363
  cmd.current_dir(&cwd);
292
- let output = run_with_timeout(cmd, SHELL_COMMAND_TIMEOUT, command, &cwd)?;
364
+ let output =
365
+ run_with_timeout_cancellable(cmd, SHELL_COMMAND_TIMEOUT, command, &cwd, cancellation)?;
293
366
  Ok(shell_output(
294
367
  command,
295
368
  cwd,
@@ -321,6 +394,7 @@ fn run_in_sandbox(
321
394
  command: &str,
322
395
  cwd: &Path,
323
396
  config: &MintConfig,
397
+ cancellation: Option<&tokio_util::sync::CancellationToken>,
324
398
  ) -> Result<Option<CommandResult>, ShellError> {
325
399
  #[cfg(target_os = "linux")]
326
400
  {
@@ -331,21 +405,42 @@ fn run_in_sandbox(
331
405
  return Ok(None);
332
406
  }
333
407
  let mut process = Command::new(sandbox);
408
+ crate::browser::workflow::configure_shell(&mut process, config);
334
409
  // Own process group, same reasoning as `shell_command`'s: lets a
335
410
  // timed-out or interrupted run be killed as a whole tree via
336
411
  // `terminate_process_group` instead of just the `bwrap` wrapper.
337
- process
338
- .process_group(0)
339
- .args(["--die-with-parent", "--ro-bind", "/", "/", "--dev", "/dev"])
340
- .args(["--proc", "/proc", "--tmpfs", "/tmp"]);
341
- for root in writable_roots(config, cwd) {
412
+ let roots = writable_roots(config, cwd);
413
+ let has_tmp = roots
414
+ .iter()
415
+ .any(|r| r == Path::new("/tmp") || r == &std::env::temp_dir());
416
+
417
+ process.process_group(0).args([
418
+ "--die-with-parent",
419
+ "--ro-bind",
420
+ "/",
421
+ "/",
422
+ "--dev",
423
+ "/dev",
424
+ "--proc",
425
+ "/proc",
426
+ ]);
427
+ if !has_tmp {
428
+ process.args(["--tmpfs", "/tmp"]);
429
+ }
430
+ for root in roots {
342
431
  process.arg("--bind").arg(&root).arg(&root);
343
432
  }
344
433
  process
345
434
  .arg("--chdir")
346
435
  .arg(cwd)
347
436
  .args(["bash", "-lc", command]);
348
- let output = run_with_timeout(process, SHELL_COMMAND_TIMEOUT, command, cwd)?;
437
+ let output = run_with_timeout_cancellable(
438
+ process,
439
+ SHELL_COMMAND_TIMEOUT,
440
+ command,
441
+ cwd,
442
+ cancellation,
443
+ )?;
349
444
  Ok(Some(output))
350
445
  }
351
446
 
@@ -358,19 +453,26 @@ fn run_in_sandbox(
358
453
  return Ok(None);
359
454
  }
360
455
  let mut process = Command::new(sandbox);
456
+ crate::browser::workflow::configure_shell(&mut process, config);
361
457
  process
362
458
  .process_group(0)
363
459
  .arg("-p")
364
460
  .arg(mac_sandbox_profile(config, cwd))
365
461
  .args(["bash", "-lc", command])
366
462
  .current_dir(cwd);
367
- let output = run_with_timeout(process, SHELL_COMMAND_TIMEOUT, command, cwd)?;
463
+ let output = run_with_timeout_cancellable(
464
+ process,
465
+ SHELL_COMMAND_TIMEOUT,
466
+ command,
467
+ cwd,
468
+ cancellation,
469
+ )?;
368
470
  return Ok(Some(output));
369
471
  }
370
472
 
371
473
  #[cfg(not(any(target_os = "linux", target_os = "macos")))]
372
474
  {
373
- let _ = (command, cwd, config);
475
+ let _ = (command, cwd, config, cancellation);
374
476
  Ok(None)
375
477
  }
376
478
  }
@@ -438,6 +540,27 @@ pub(crate) fn writable_roots(config: &MintConfig, cwd: &Path) -> Vec<PathBuf> {
438
540
  .filter(|root| root.exists())
439
541
  .cloned()
440
542
  .collect::<Vec<_>>();
543
+ let temp = std::env::temp_dir();
544
+ if temp.exists() && !roots.iter().any(|r| r == &temp) {
545
+ roots.push(temp.clone());
546
+ }
547
+ if let Ok(canonical_temp) = temp.canonicalize() {
548
+ if !roots.iter().any(|r| r == &canonical_temp) {
549
+ roots.push(canonical_temp);
550
+ }
551
+ }
552
+ #[cfg(unix)]
553
+ {
554
+ let slash_tmp = PathBuf::from("/tmp");
555
+ if slash_tmp.exists() && !roots.iter().any(|r| r == &slash_tmp) {
556
+ roots.push(slash_tmp.clone());
557
+ }
558
+ if let Ok(canonical_slash_tmp) = slash_tmp.canonicalize() {
559
+ if !roots.iter().any(|r| r == &canonical_slash_tmp) {
560
+ roots.push(canonical_slash_tmp);
561
+ }
562
+ }
563
+ }
441
564
  if !roots.iter().any(|root| cwd.starts_with(root)) {
442
565
  roots.push(cwd.to_path_buf());
443
566
  }
@@ -525,6 +648,8 @@ fn shell_output(
525
648
  mode: mode.into(),
526
649
  status: output.status_code,
527
650
  success: output.success,
651
+ job_id: output.job_id,
652
+ cancelled: output.cancelled,
528
653
  sandboxed,
529
654
  sandbox_warning,
530
655
  stdout: String::from_utf8_lossy(&output.stdout).into_owned(),
@@ -534,6 +659,34 @@ fn shell_output(
534
659
 
535
660
  #[cfg(test)]
536
661
  mod tests {
662
+ #[test]
663
+ #[cfg(unix)]
664
+ fn cancellation_stops_the_foreground_process_group_and_preserves_partial_output() {
665
+ let token = tokio_util::sync::CancellationToken::new();
666
+ let cancel = token.clone();
667
+ let thread = std::thread::spawn(move || {
668
+ std::thread::sleep(std::time::Duration::from_millis(400));
669
+ cancel.cancel();
670
+ });
671
+ let mut config = local_config();
672
+ config.allowed_write_paths.push(std::env::temp_dir());
673
+ let started = std::time::Instant::now();
674
+ let result = super::run_shell_command_cancellable(
675
+ "printf started; sleep 5; printf should-not-run",
676
+ &std::env::temp_dir(),
677
+ true,
678
+ &config,
679
+ None,
680
+ Some(&token),
681
+ )
682
+ .unwrap();
683
+ thread.join().unwrap();
684
+ assert!(result.cancelled);
685
+ assert_eq!(result.status, None);
686
+ assert!(result.stdout.contains("started"));
687
+ assert!(!result.stdout.contains("should-not-run"));
688
+ assert!(started.elapsed() < std::time::Duration::from_secs(2));
689
+ }
537
690
  use super::*;
538
691
 
539
692
  fn local_config() -> MintConfig {
@@ -697,4 +850,20 @@ mod tests {
697
850
  assert!(matches!(job.status, crate::bg_shell::JobStatus::Running));
698
851
  let _ = crate::bg_shell::kill_job(&job.id);
699
852
  }
853
+
854
+ #[test]
855
+ fn writable_roots_always_includes_temp_directory() {
856
+ let config = MintConfig {
857
+ allowed_write_paths: vec![],
858
+ ..MintConfig::default()
859
+ };
860
+ let cwd = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
861
+ let roots = writable_roots(&config, &cwd);
862
+ let temp = std::env::temp_dir();
863
+ assert!(
864
+ roots
865
+ .iter()
866
+ .any(|r| r == &temp || (cfg!(unix) && r == Path::new("/tmp")))
867
+ );
868
+ }
700
869
  }
@@ -5,6 +5,110 @@ use std::{
5
5
  };
6
6
 
7
7
  const MAX_DEPTH: usize = 9;
8
+
9
+ #[derive(Debug, Serialize)]
10
+ #[serde(rename_all = "camelCase")]
11
+ pub struct PreparedWorkspaceMedia {
12
+ pub path: PathBuf,
13
+ pub mime_type: &'static str,
14
+ pub byte_length: u64,
15
+ }
16
+
17
+ /// Authorize one document/media file without reading its payload into memory.
18
+ pub fn prepare_media(
19
+ root: &Path,
20
+ relative: &str,
21
+ config: &crate::MintConfig,
22
+ ) -> Result<PreparedWorkspaceMedia, String> {
23
+ let root = crate::assert_path_capability(root, crate::Capability::Read, config)
24
+ .map_err(|error| error.to_string())?;
25
+ let path = resolve(&root, relative)?;
26
+ let path = crate::assert_path_capability(&path, crate::Capability::Read, config)
27
+ .map_err(|error| error.to_string())?
28
+ .canonicalize()
29
+ .map_err(|error| error.to_string())?;
30
+ let extension = path
31
+ .extension()
32
+ .and_then(|value| value.to_str())
33
+ .unwrap_or_default()
34
+ .to_ascii_lowercase();
35
+ let mime_type = match extension.as_str() {
36
+ "pdf" => "application/pdf",
37
+ "mp3" => "audio/mpeg",
38
+ "wav" => "audio/wav",
39
+ "ogg" | "oga" | "opus" => "audio/ogg",
40
+ "flac" => "audio/flac",
41
+ "m4a" => "audio/mp4",
42
+ "aac" => "audio/aac",
43
+ "weba" => "audio/webm",
44
+ "mp4" | "m4v" => "video/mp4",
45
+ "webm" => "video/webm",
46
+ "ogv" => "video/ogg",
47
+ "mov" => "video/quicktime",
48
+ _ => {
49
+ return Err("Select a supported PDF, audio, or video file inside the workspace".into());
50
+ }
51
+ };
52
+ let metadata = fs::metadata(&path).map_err(|error| error.to_string())?;
53
+ if !metadata.is_file() {
54
+ return Err("Select a media file".into());
55
+ }
56
+ Ok(PreparedWorkspaceMedia {
57
+ path,
58
+ mime_type,
59
+ byte_length: metadata.len(),
60
+ })
61
+ }
62
+
63
+ const MAX_PREVIEW_IMAGE_BYTES: u64 = 32 * 1024 * 1024;
64
+
65
+ /// Return image bytes over the existing IPC/API boundary, without a background service.
66
+ pub fn read_image(
67
+ root: &Path,
68
+ relative: &str,
69
+ config: &crate::MintConfig,
70
+ ) -> Result<String, String> {
71
+ use base64::Engine;
72
+ use std::io::Read;
73
+ let root = crate::assert_path_capability(root, crate::Capability::Read, config)
74
+ .map_err(|error| error.to_string())?;
75
+ let path = resolve(&root, relative)?;
76
+ crate::assert_path_capability(&path, crate::Capability::Read, config)
77
+ .map_err(|error| error.to_string())?;
78
+ let extension = path
79
+ .extension()
80
+ .and_then(|value| value.to_str())
81
+ .unwrap_or_default()
82
+ .to_ascii_lowercase();
83
+ let mime = match extension.as_str() {
84
+ "png" => "image/png",
85
+ "jpg" | "jpeg" => "image/jpeg",
86
+ "gif" => "image/gif",
87
+ "webp" => "image/webp",
88
+ "ico" => "image/x-icon",
89
+ "svg" => "image/svg+xml",
90
+ _ => return Err("Select a supported image file inside the workspace".into()),
91
+ };
92
+ let file = fs::File::open(&path).map_err(|error| error.to_string())?;
93
+ let metadata = file.metadata().map_err(|error| error.to_string())?;
94
+ if !metadata.is_file() {
95
+ return Err("Select an image file".into());
96
+ }
97
+ if metadata.len() > MAX_PREVIEW_IMAGE_BYTES {
98
+ return Err("Image preview supports files up to 32 MiB".into());
99
+ }
100
+ let mut bytes = Vec::new();
101
+ file.take(MAX_PREVIEW_IMAGE_BYTES + 1)
102
+ .read_to_end(&mut bytes)
103
+ .map_err(|error| error.to_string())?;
104
+ if bytes.len() as u64 > MAX_PREVIEW_IMAGE_BYTES {
105
+ return Err("Image preview supports files up to 32 MiB".into());
106
+ }
107
+ Ok(format!(
108
+ "data:{mime};base64,{}",
109
+ base64::engine::general_purpose::STANDARD.encode(bytes)
110
+ ))
111
+ }
8
112
  const MAX_CHILDREN: usize = 400;
9
113
  const COLLAPSED: &[&str] = &[
10
114
  ".git",
@@ -204,6 +308,106 @@ mod tests {
204
308
  root
205
309
  }
206
310
 
311
+ #[test]
312
+ fn workspace_media_prepares_scoped_files_without_reading_large_payloads() {
313
+ let root = root();
314
+ let config = crate::MintConfig {
315
+ allowed_read_paths: vec![root.clone()],
316
+ ..Default::default()
317
+ };
318
+ for (name, mime) in [
319
+ ("book.PDF", "application/pdf"),
320
+ ("song.mp3", "audio/mpeg"),
321
+ ("clip.webm", "video/webm"),
322
+ ] {
323
+ fs::write(root.join(name), [0_u8, 255, 128]).unwrap();
324
+ let media = prepare_media(&root, name, &config).unwrap();
325
+ assert_eq!(media.mime_type, mime);
326
+ assert_eq!(media.byte_length, 3);
327
+ assert_eq!(media.path, root.join(name).canonicalize().unwrap());
328
+ }
329
+ fs::File::create(root.join("large.mp4"))
330
+ .unwrap()
331
+ .set_len(1024 * 1024 * 1024)
332
+ .unwrap();
333
+ assert_eq!(
334
+ prepare_media(&root, "large.mp4", &config)
335
+ .unwrap()
336
+ .byte_length,
337
+ 1024 * 1024 * 1024
338
+ );
339
+ fs::write(root.join("private.txt"), "not media").unwrap();
340
+ assert!(prepare_media(&root, "private.txt", &config).is_err());
341
+ assert!(prepare_media(&root, "../book.PDF", &config).is_err());
342
+ fs::remove_dir_all(root).unwrap();
343
+ }
344
+
345
+ #[cfg(unix)]
346
+ #[test]
347
+ fn workspace_media_rejects_links_outside_the_selected_root() {
348
+ let root = root();
349
+ let outside =
350
+ std::env::temp_dir().join(format!("mint-outside-media-{}.mp4", uuid::Uuid::new_v4()));
351
+ fs::write(&outside, [1_u8]).unwrap();
352
+ std::os::unix::fs::symlink(&outside, root.join("escape.mp4")).unwrap();
353
+ let config = crate::MintConfig {
354
+ allowed_read_paths: vec![root.clone()],
355
+ ..Default::default()
356
+ };
357
+ assert!(prepare_media(&root, "escape.mp4", &config).is_err());
358
+ fs::remove_file(outside).unwrap();
359
+ fs::remove_dir_all(root).unwrap();
360
+ }
361
+
362
+ #[test]
363
+ fn workspace_image_reads_binary_data_directly_and_rejects_unsupported_or_oversized_files() {
364
+ let root = root();
365
+ let config = crate::MintConfig {
366
+ allowed_read_paths: vec![root.clone()],
367
+ ..Default::default()
368
+ };
369
+ fs::write(root.join("photo.PNG"), [0_u8, 255, 128, 1]).unwrap();
370
+ assert_eq!(
371
+ read_image(&root, "photo.PNG", &config).unwrap(),
372
+ "data:image/png;base64,AP+AAQ=="
373
+ );
374
+ fs::write(root.join("icon.svg"), "<svg/>").unwrap();
375
+ assert_eq!(
376
+ read_image(&root, "icon.svg", &config).unwrap(),
377
+ "data:image/svg+xml;base64,PHN2Zy8+"
378
+ );
379
+ fs::write(root.join("notes.txt"), "hello").unwrap();
380
+ assert!(read_image(&root, "notes.txt", &config).is_err());
381
+ assert!(read_image(&root, "../photo.PNG", &config).is_err());
382
+ assert!(read_image(&root, root.join("photo.PNG").to_str().unwrap(), &config).is_err());
383
+ let large = fs::File::create(root.join("large.png")).unwrap();
384
+ large.set_len(MAX_PREVIEW_IMAGE_BYTES + 1).unwrap();
385
+ assert!(
386
+ read_image(&root, "large.png", &config)
387
+ .unwrap_err()
388
+ .contains("32 MiB")
389
+ );
390
+ fs::remove_dir_all(root).unwrap();
391
+ }
392
+
393
+ #[cfg(unix)]
394
+ #[test]
395
+ fn workspace_image_rejects_symlinks_outside_its_source_root() {
396
+ let root = root();
397
+ let other = root
398
+ .join("../")
399
+ .join(format!("mint-outside-{}.png", uuid::Uuid::new_v4()));
400
+ fs::write(&other, [1_u8, 2, 3]).unwrap();
401
+ std::os::unix::fs::symlink(&other, root.join("escape.png")).unwrap();
402
+ let config = crate::MintConfig {
403
+ allowed_read_paths: vec![root.clone()],
404
+ ..Default::default()
405
+ };
406
+ assert!(read_image(&root, "escape.png", &config).is_err());
407
+ fs::remove_file(other).unwrap();
408
+ fs::remove_dir_all(root).unwrap();
409
+ }
410
+
207
411
  #[test]
208
412
  fn interface_workspace_operations_return_snapshots_and_advance_revision() {
209
413
  let root = root();
@@ -20,7 +20,7 @@ fn retains_latest_hundred_finished_jobs_without_evicting_active_jobs() {
20
20
  .id,
21
21
  );
22
22
  }
23
- let deadline = Instant::now() + Duration::from_secs(5);
23
+ let deadline = Instant::now() + Duration::from_secs(30);
24
24
  while bg_shell::running_count() > 1 && Instant::now() < deadline {
25
25
  std::thread::sleep(Duration::from_millis(20));
26
26
  }
@@ -85,6 +85,33 @@ fn stores_and_reads_interaction_agent_activity() {
85
85
  );
86
86
  }
87
87
 
88
+ #[test]
89
+ fn exports_trajectory_json_from_agent_activity() {
90
+ let store = store("trajectory-export");
91
+ let interaction_id = store
92
+ .add_interaction_with_metadata(
93
+ "Write hello world",
94
+ "Done",
95
+ "anthropic",
96
+ "claude-3-7-sonnet",
97
+ )
98
+ .unwrap();
99
+ store
100
+ .set_interaction_agent_activity_json(
101
+ interaction_id,
102
+ r#"[{"type":"Thought","data":{"thought":"inspect code"}},{"type":"ToolEnd","data":{"action":"write_file","input":{"path":"src/main.rs"},"result":"Written successfully","elapsed_ms":45,"status":"success"}},{"type":"RunCompleted","data":{"summary":{"runId":"run-999","task":"Write hello world","outcome":"SUCCESS","totalTokens":500,"toolCallsCount":1,"filesChanged":["src/main.rs"],"filesCreated":["src/main.rs"],"durationSecs":1.2,"toolTimeline":[],"retriesCount":0}}}]"#,
103
+ )
104
+ .unwrap();
105
+
106
+ let trajectory_json = store
107
+ .export_trajectory_json("default", Some("run-999"))
108
+ .unwrap();
109
+ assert!(trajectory_json.contains("\"schemaVersion\": \"1.0\""));
110
+ assert!(trajectory_json.contains("\"runId\": \"run-999\""));
111
+ assert!(trajectory_json.contains("\"outcome\": \"SUCCESS\""));
112
+ assert!(trajectory_json.contains("\"action\": \"write_file\""));
113
+ }
114
+
88
115
  #[test]
89
116
  fn preserves_chat_history_when_store_is_reopened() {
90
117
  let path = test_path("reopen-history", "sqlite");
@@ -0,0 +1 @@
1
+ .workspace-file-info{width:100%;color:var(--text-main);padding:32px 20px}.workspace-file-info>svg{color:var(--accent)}.workspace-file-info h2{overflow-wrap:anywhere;margin:16px 0 8px;font-size:16px}.workspace-file-info p{color:var(--text-muted);font-size:12px;line-height:1.6}.workspace-file-info dl{margin:24px 0;font-size:12px}.workspace-file-info dt{color:var(--text-muted);margin-top:14px}.workspace-file-info dd{overflow-wrap:anywhere;margin:4px 0 0}.workspace-file-info button{border:1px solid var(--border);border-radius:var(--radius-sm,6px);background:var(--surface-bg);min-height:36px;color:var(--accent);font:inherit;cursor:pointer;align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:inline-flex}.workspace-file-info button:hover:not(:disabled){background:var(--surface-strong)}.workspace-file-info button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.workspace-file-info button:disabled{opacity:.5;cursor:default}.workspace-file-info .workspace-file-info-error{color:var(--status-error)}.workspace-pdf-preview{width:100%;height:100%;min-height:0;color:var(--text-main);flex-direction:column;display:flex}.workspace-pdf-controls{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;justify-content:center;align-items:center;gap:8px;padding:10px;font-size:12px;display:flex}.workspace-pdf-controls button,.workspace-pdf-pages>button{border:1px solid var(--border);border-radius:var(--radius-xs,6px);background:var(--surface-bg);min-height:30px;color:var(--text-main);font:inherit;cursor:pointer;padding:4px 8px}.workspace-pdf-controls button:disabled{opacity:.4;cursor:default}.workspace-pdf-controls button:hover:not(:disabled){color:var(--accent);background:var(--surface-strong)}.workspace-pdf-controls button:focus-visible,.workspace-pdf-pages>button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.workspace-pdf-pages{flex:1;min-height:0;padding:16px;overflow:auto}.workspace-pdf-pages canvas{margin-inline:auto;display:block}.workspace-pdf-pages>p{color:var(--text-muted);font-size:12px}.workspace-media-preview{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;min-height:180px;padding:20px;display:flex;overflow:auto}.workspace-media-preview audio{width:100%}.workspace-media-preview video{object-fit:contain;width:100%;max-height:100%}.workspace-media-preview .workspace-media-error,.workspace-pdf-pages .workspace-media-error{color:var(--status-error);font-size:12px;line-height:1.6}
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/core-Mi3s5D4_.js","assets/rolldown-runtime-CNOWq4Kh.js","assets/WorkspacePdfPreview-Dx_lkjNu.js","assets/jsx-runtime-DmUwWVTj.js","assets/index-BmpulIkg.js","assets/index-CkvBwhX_.css"])))=>i.map(i=>d[i]);
2
+ import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{An as i,Bn as a,F as o,Hn as s,I as c,J as l,Jn as u,Kn as d,L as f,Rn as p,Xt as m,g as h,h as g,j as _,wn as v}from"./index-BmpulIkg.js";import{C as y,M as b,O as x,_ as S,j as C,k as w,v as T,x as E,y as D}from"./MintDashboard-COw_xol7.js";async function O(e,t,n={desktop:o.isTauriRuntime(),startPreview:(e,t,n)=>c.startHtmlPreview(e,t,n),openMintBrowser:async e=>{let{invoke:t}=await g(async()=>{let{invoke:e}=await import(`./core-Mi3s5D4_.js`).then(e=>(e.a(),e.i));return{invoke:e}},__vite__mapDeps([0,1]));await t(`open_mint_browser`,{url:e})}}){if(n.desktop&&e.url){await n.openMintBrowser(e.url);return}let r=(e.workspacePath??t)?.trim();if(!r)throw Error(`Select a project before opening its preview in Mint Browser`);let i=e.path.replace(/\\/g,`/`);if(/^(\/|[a-z]:\/)/i.test(i)){let e=r.replace(/\\/g,`/`).replace(/\/+$/,``),t=`${e}/`;if(!(/^[a-z]:\//i.test(e)||e.startsWith(`//`)?i.toLowerCase().startsWith(t.toLowerCase()):i.startsWith(t)))throw Error(`This file is outside its source project`);i=i.slice(t.length)}let a=await n.startPreview(r,i,!n.desktop);n.desktop&&await n.openMintBrowser(a.url)}var k=t((()=>{_(),h()})),A=t((()=>{}));function j({path:e,root:t}){let[n,r]=(0,M.useState)(!1),[i,a]=(0,M.useState)(``),o=e.replace(/\\/g,`/`).split(`/`).pop()||e,s=async()=>{if(t&&!n){r(!0),a(``);try{let n=y(t,e),{invoke:r}=await g(async()=>{let{invoke:e}=await import(`./core-Mi3s5D4_.js`).then(e=>(e.a(),e.i));return{invoke:e}},__vite__mapDeps([0,1]));await r(`run_desktop_action`,{action:{type:`open_url`,target:n}})}catch(e){a(e instanceof Error?e.message:String(e))}finally{r(!1)}}};return(0,N.jsxs)(`section`,{className:`workspace-file-info`,"aria-label":`File information`,children:[(0,N.jsx)(p,{size:32,"aria-hidden":`true`}),(0,N.jsx)(`h2`,{children:o}),(0,N.jsx)(`p`,{children:`Preview is not available for this file type.`}),(0,N.jsxs)(`dl`,{children:[(0,N.jsx)(`dt`,{children:`File type`}),(0,N.jsx)(`dd`,{children:o.includes(`.`)?o.split(`.`).pop().toUpperCase():`File`}),(0,N.jsx)(`dt`,{children:`Path`}),(0,N.jsx)(`dd`,{children:e}),(0,N.jsx)(`dt`,{children:`Workspace`}),(0,N.jsx)(`dd`,{children:t||`Unavailable`})]}),(0,N.jsxs)(`button`,{type:`button`,disabled:!t||n,"aria-busy":n,onClick:()=>{s()},children:[(0,N.jsx)(u,{size:15,"aria-hidden":`true`}),n?`Opening…`:`Open with external app`]}),i&&(0,N.jsxs)(`p`,{className:`workspace-file-info-error`,role:`alert`,children:[`Could not open file: `,i]})]})}var M,N,P=t((()=>{M=e(n()),f(),E(),A(),N=r(),h()})),F=t((()=>{}));function I({kind:e,url:t,path:n,root:r,mimeType:i}){let a=(0,L.useRef)(null),[o,s]=(0,L.useState)(!1);return(0,L.useEffect)(()=>{let e=a.current;return()=>{e&&(e.pause(),e.removeAttribute(`src`),e.querySelector(`source`)?.removeAttribute(`src`),e.load())}},[t]),(0,R.jsx)(`section`,{className:`workspace-media-preview is-${e}`,"aria-label":`${e===`audio`?`Audio`:`Video`} preview`,children:o?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{role:`alert`,className:`workspace-media-error`,children:`This file could not be played in Mint. Open it with an external app instead.`}),(0,R.jsx)(j,{path:n,root:r})]}):e===`audio`?(0,R.jsx)(`audio`,{ref:a,controls:!0,preload:`metadata`,"aria-label":n,onError:()=>s(!0),children:(0,R.jsx)(`source`,{src:t,type:i})}):(0,R.jsx)(`video`,{ref:a,controls:!0,preload:`metadata`,playsInline:!0,"aria-label":n,onError:()=>s(!0),children:(0,R.jsx)(`source`,{src:t,type:i})})})}var L,R,z=t((()=>{L=e(n()),P(),F(),R=r()}));function B(e){switch(e){case`image`:return(0,U.jsx)(v,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`html`:return(0,U.jsx)(i,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`svg`:case`code`:return(0,U.jsx)(s,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`markdown`:case`pdf`:return(0,U.jsx)(a,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`audio`:return(0,U.jsx)(m,{size:13,strokeWidth:2.2,"aria-hidden":`true`});case`video`:return(0,U.jsx)(l,{size:13,strokeWidth:2.2,"aria-hidden":`true`});default:return(0,U.jsx)(p,{size:13,strokeWidth:2.2,"aria-hidden":`true`})}}function V({artifact:e,onClose:t,workspacePath:n}){let r=e?.path||``,i=(0,H.useMemo)(()=>{if(!r)return``;let e=r.replace(/\\/g,`/`).split(`/`);return e[e.length-1]||r},[r]),a=(0,H.useMemo)(()=>e?.type?e.type:S(r),[e,r]),c=a===`html`||a===`svg`||a===`markdown`,[l,u]=(0,H.useState)(a===`code`?`code`:`preview`),[f,p]=(0,H.useState)(`desktop`),[m,h]=(0,H.useState)(e?.content||``),[g,_]=(0,H.useState)(e?.url||``),[y,b]=(0,H.useState)(!1),[x,E]=(0,H.useState)(null),[D,k]=(0,H.useState)(!1),[A,M]=(0,H.useState)(null),N=(0,H.useRef)(!1),P=(0,H.useRef)(e);P.current=e;let[F,L]=(0,H.useState)(!1),[R,z]=(0,H.useState)(null),[V,G]=(0,H.useState)(0),K=(0,H.useRef)(0),q=e?.workspacePath??n,J=(0,H.useMemo)(()=>T(r),[r]),Y=a===`pdf`||a===`audio`||a===`video`,X=(0,H.useMemo)(()=>{if(a!==`image`)return`Image`;let e=r.split(`.`).pop()?.toUpperCase()||``;return e===`JPG`?`JPEG`:[`PNG`,`JPEG`,`WEBP`,`GIF`,`SVG`,`ICO`,`AVIF`,`BMP`,`TIFF`].includes(e)?e:`IMAGE`},[a,r]),Z=(0,H.useMemo)(()=>!J||J===`plaintext`?`Code`:{javascript:`JavaScript`,typescript:`TypeScript`,python:`Python`,rust:`Rust`,json:`JSON`,html:`HTML`,css:`CSS`,cpp:`C++`,csharp:`C#`,php:`PHP`,ruby:`Ruby`,shell:`Shell`,bash:`Bash`,sql:`SQL`,yaml:`YAML`,xml:`XML`,toml:`TOML`,markdown:`Markdown`}[J.toLowerCase()]||J.charAt(0).toUpperCase()+J.slice(1),[J]),Q=(0,H.useCallback)(async(t=!1)=>{let n=++K.current;if(E(null),z(null),G(e=>e+1),r){if(t&&l===`preview`&&(a===`image`||a===`svg`)&&e?.url?.startsWith(`data:image/`)&&q){b(!0);try{let e=await o.readWorkspaceImage(r,q);K.current===n&&_(e)}catch(e){K.current===n&&E(e instanceof Error?e.message:String(e))}finally{K.current===n&&b(!1)}}else if(Y||a===`file`||a===`image`||e?.url&&l===`preview`)b(!1),Y&&!e?.url&&E(`No media preview source is available`),a===`image`&&!e?.url&&E(`No image preview URL is available`);else{b(!0);try{let e=await o.readWorkspaceFile(r,q);K.current===n&&h(e)}catch(t){if(K.current!==n)return;e?.content===void 0?E(t instanceof Error?t.message:`Unable to read file content`):h(e.content)}finally{K.current===n&&b(!1)}}}},[r,q,e,a,l,Y]);(0,H.useEffect)(()=>{u(a===`code`?`code`:`preview`),M(null),h(e?.content??``),_(e?.url??``),z(null),E(null)},[e,a]),(0,H.useEffect)(()=>(e?.content!==void 0&&(l===`preview`||!r)?(b(!1),E(null)):Q(),()=>{K.current+=1}),[e,l,r,Q]);let $=async()=>{if(r)try{await navigator.clipboard.writeText(r),L(!0),setTimeout(()=>L(!1),1800)}catch{}},ee=async()=>{if(e&&!N.current){N.current=!0,k(!0),M(null);try{await O(e,q)}catch(t){P.current===e&&M(t instanceof Error?t.message:String(t))}finally{N.current=!1,k(!1)}}};return e?(0,U.jsxs)(`aside`,{className:`artifact-preview-panel`,style:{display:`flex`,flexDirection:`column`,width:`var(--preview-width, 50%)`,minWidth:`280px`,maxWidth:`none`,height:`100%`,background:`var(--panel-bg, #1e1e20)`,color:`var(--text-main, #e8e8ea)`,position:`relative`,zIndex:10,overflow:`hidden`},children:[(0,U.jsxs)(`header`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`10px 14px`,borderBottom:`1px solid var(--border)`,background:`var(--surface-bg, #252527)`,gap:`8px`,flexShrink:0},children:[(0,U.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,minWidth:0},children:[(0,U.jsx)(`span`,{style:{display:`inline-flex`,alignItems:`center`,justifyContent:`center`,width:`24px`,height:`24px`,borderRadius:`var(--radius-xs, 4px)`,background:`color-mix(in srgb, var(--accent) 15%, transparent)`,color:`var(--interactive-fg)`,flexShrink:0},title:a.toUpperCase(),"aria-label":`${a} artifact`,children:B(a)}),(0,U.jsxs)(`div`,{style:{minWidth:0,display:`flex`,flexDirection:`column`},children:[(0,U.jsx)(`span`,{style:{fontWeight:600,fontSize:`0.86rem`,color:`var(--text-main)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:r,children:i}),(0,U.jsx)(`button`,{type:`button`,onClick:$,style:{background:`none`,border:`none`,color:F?`var(--accent)`:`var(--text-muted)`,fontSize:`0.7rem`,padding:0,cursor:`pointer`,textAlign:`left`,display:`inline-flex`,alignItems:`center`,gap:`4px`},children:F?`Path Copied`:`Copy path`})]})]}),(0,U.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[c?(0,U.jsxs)(`div`,{style:{display:`inline-flex`,padding:`2px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`var(--radius-sm, 6px)`,border:`1px solid var(--border)`},children:[(0,U.jsx)(`button`,{type:`button`,onClick:()=>u(`preview`),style:{background:l===`preview`?`var(--accent)`:`transparent`,color:l===`preview`?`var(--text-on-accent)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 9px`,fontSize:`0.75rem`,fontWeight:500,cursor:`pointer`,transition:`all 0.15s ease`},children:`Preview`}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>u(`code`),style:{background:l===`code`?`var(--accent)`:`transparent`,color:l===`code`?`var(--text-on-accent)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 9px`,fontSize:`0.75rem`,fontWeight:500,cursor:`pointer`,transition:`all 0.15s ease`},children:`Code`})]}):(0,U.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,U.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,gap:`5px`,padding:`3px 10px`,background:a===`image`||a===`code`?`color-mix(in srgb, var(--accent) 10%, transparent)`:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`9999px`,border:a===`image`||a===`code`?`1px solid color-mix(in srgb, var(--accent) 25%, transparent)`:`1px solid var(--border)`,color:a===`image`||a===`code`?`var(--accent)`:`var(--text-muted)`,fontSize:`0.72rem`,fontWeight:500,letterSpacing:`0.01em`},children:[a===`code`?(0,U.jsx)(s,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):a===`image`?(0,U.jsx)(v,{size:12,strokeWidth:2.2,"aria-hidden":`true`}):(0,U.jsx)(d,{size:12,strokeWidth:2.2,"aria-hidden":`true`}),(0,U.jsx)(`span`,{children:a===`code`?Z:a===`image`?X:a===`file`?`Details`:`Preview`})]}),a===`image`&&R&&(0,U.jsxs)(`div`,{style:{display:`inline-flex`,alignItems:`center`,padding:`3px 9px`,borderRadius:`9999px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,border:`1px solid var(--border)`,fontSize:`0.7rem`,color:`var(--text-muted)`,fontFamily:`var(--font-mono, monospace)`,letterSpacing:`0.01em`,whiteSpace:`nowrap`},title:`Image dimensions (width × height)`,children:[R.width,` × `,R.height,` px`]})]}),l===`preview`&&a===`html`&&(0,U.jsxs)(`div`,{style:{display:`inline-flex`,padding:`2px`,background:`color-mix(in srgb, var(--text-main) 6%, transparent)`,borderRadius:`var(--radius-sm, 6px)`,border:`1px solid var(--border)`},children:[(0,U.jsx)(`button`,{type:`button`,onClick:()=>p(`desktop`),title:`Desktop 100%`,style:{background:f===`desktop`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:f===`desktop`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Desktop`}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>p(`tablet`),title:`Tablet (768px)`,style:{background:f===`tablet`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:f===`tablet`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Tablet`}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>p(`mobile`),title:`Mobile (375px)`,style:{background:f===`mobile`?`color-mix(in srgb, var(--text-main) 12%, transparent)`:`transparent`,color:f===`mobile`?`var(--text-main)`:`var(--text-muted)`,border:`none`,borderRadius:`var(--radius-xs, 4px)`,padding:`3px 7px`,cursor:`pointer`,fontSize:`0.72rem`},children:`Mobile`})]})]}),(0,U.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`4px`},children:[!Y&&(0,U.jsx)(`button`,{type:`button`,onClick:()=>{Q(!0)},disabled:y,title:`Reload content from file`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,U.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,style:{animation:y?`spin 1s linear infinite`:`none`},children:[(0,U.jsx)(`polyline`,{points:`23 4 23 10 17 10`}),(0,U.jsx)(`polyline`,{points:`1 20 1 14 7 14`}),(0,U.jsx)(`path`,{d:`M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15`})]})}),a===`html`&&(0,U.jsx)(`button`,{type:`button`,onClick:()=>{ee()},disabled:D,"aria-label":`Open in Mint Browser (Mint Auto)`,"aria-busy":D,title:D?`Opening Mint Browser…`:`Open in Mint Browser (Mint Auto)`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,U.jsxs)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,U.jsx)(`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}),(0,U.jsx)(`polyline`,{points:`15 3 21 3 21 9`}),(0,U.jsx)(`line`,{x1:`10`,y1:`14`,x2:`21`,y2:`3`})]})}),(0,U.jsx)(`button`,{type:`button`,onClick:t,title:`Close preview Panel`,style:{background:`none`,border:`none`,color:`var(--text-muted)`,padding:`5px`,borderRadius:`var(--radius-xs, 4px)`,cursor:`pointer`,display:`inline-flex`,alignItems:`center`},children:(0,U.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,U.jsx)(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),(0,U.jsx)(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})]})})]})]}),A&&(0,U.jsxs)(`div`,{role:`alert`,style:{padding:`8px 14px`,fontSize:`0.8rem`,color:`var(--status-error, #f87171)`,flexShrink:0},children:[`Could not open Mint Browser: `,A]}),(0,U.jsx)(`div`,{style:{flex:1,overflow:`auto`,display:`flex`,flexDirection:`column`,alignItems:`center`,justifyContent:`flex-start`,background:l===`preview`&&a===`html`?`var(--input-bg, #0a0a0b)`:`transparent`,padding:l===`preview`&&a===`html`?`16px`:`0`},children:x?(0,U.jsxs)(`div`,{style:{padding:`24px`,textAlign:`center`,color:`var(--status-error, #f87171)`},children:[(0,U.jsx)(`p`,{style:{fontWeight:600,marginBottom:`8px`},children:`Error loading preview`}),(0,U.jsx)(`p`,{style:{fontSize:`0.8rem`,opacity:.8},children:x}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>{Q(!0)},style:{marginTop:`12px`,padding:`4px 12px`,borderRadius:`var(--radius-xs, 4px)`,background:`var(--hover-delete-bg, rgba(239, 68, 68, 0.15))`,color:`var(--status-error, #f87171)`,border:`1px solid color-mix(in srgb, var(--status-error, #ef4444) 30%, transparent)`,cursor:`pointer`,fontSize:`0.78rem`},children:`Retry`})]}):a===`file`?(0,U.jsx)(j,{path:r,root:q},`${q}:${r}`):a===`pdf`&&e.url?(0,U.jsx)(H.Suspense,{fallback:(0,U.jsx)(`p`,{role:`status`,children:`Loading PDF viewer…`}),children:(0,U.jsx)(W,{url:e.url,path:r,root:q,byteLength:e.byteLength,range:e.range},e.url)}):(a===`audio`||a===`video`)&&e.url?(0,U.jsx)(I,{kind:a,url:e.url,path:r,root:q,mimeType:e.mimeType},e.url):l===`code`?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,U.jsx)(C,{code:m,language:J})}):a===`html`?(0,U.jsx)(`div`,{style:{width:f===`mobile`?`375px`:f===`tablet`?`768px`:`100%`,maxWidth:`100%`,height:`100%`,background:`#ffffff`,borderRadius:f===`desktop`?`0px`:`var(--radius-md, 8px)`,overflow:`hidden`,boxShadow:f===`desktop`?`none`:`var(--shadow-md, 0 10px 25px rgba(0,0,0,0.5))`,border:f===`desktop`?`none`:`1px solid var(--border)`,transition:`width 0.25s cubic-bezier(0.4, 0, 0.2, 1)`},children:(0,U.jsx)(`iframe`,{title:i,src:e.url,srcDoc:e.url?void 0:m,sandbox:e.url?`allow-scripts allow-forms allow-modals allow-same-origin`:`allow-scripts allow-forms allow-modals`,style:{width:`100%`,height:`100%`,border:`none`,background:`#ffffff`}},V)}):a===`image`||a===`svg`&&e.url?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,padding:`24px`,display:`flex`,alignItems:`center`,justifyContent:`center`,overflow:`hidden`},children:(0,U.jsx)(`img`,{ref:e=>{e&&e.complete&&e.naturalWidth&&e.naturalHeight&&z(t=>t?.width===e.naturalWidth&&t?.height===e.naturalHeight?t:{width:e.naturalWidth,height:e.naturalHeight})},src:g||e.url,alt:i,style:{width:`100%`,height:`100%`,objectFit:`contain`},onLoad:e=>{let t=e.currentTarget;t.naturalWidth&&t.naturalHeight&&z({width:t.naturalWidth,height:t.naturalHeight})},onError:()=>E(`Unable to load image. Reload the preview or check that the file is still available.`)},V)}):a===`svg`?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`24px`,backgroundImage:`linear-gradient(45deg, color-mix(in srgb, var(--text-main) 4%, transparent) 25%, transparent 25%), linear-gradient(-45deg, color-mix(in srgb, var(--text-main) 4%, transparent) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, color-mix(in srgb, var(--text-main) 4%, transparent) 75%), linear-gradient(-45deg, transparent 75%, color-mix(in srgb, var(--text-main) 4%, transparent) 75%)`,backgroundSize:`20px 20px`,backgroundPosition:`0 0, 0 10px, 10px -10px, -10px 0px`,overflow:`auto`},children:(0,U.jsx)(`div`,{style:{maxWidth:`90%`,maxHeight:`90%`,display:`flex`,alignItems:`center`,justifyContent:`center`},dangerouslySetInnerHTML:{__html:m}})}):a===`markdown`?(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`20px 24px`,lineHeight:1.6,color:`var(--text-chat, var(--text-main))`},children:w(m)}):(0,U.jsx)(`div`,{style:{width:`100%`,height:`100%`,overflow:`auto`,padding:`12px`},children:(0,U.jsx)(C,{code:m,language:J})})})]}):null}var H,U,W,G=t((()=>{H=e(n()),f(),k(),_(),x(),b(),P(),z(),U=r(),D(),h(),W=(0,H.lazy)(()=>g(()=>import(`./WorkspacePdfPreview-Dx_lkjNu.js`),__vite__mapDeps([2,1,3,4,5])))}));D(),G();export{V as ArtifactPreviewPanel,j as n,P as r,F as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-CNOWq4Kh.js";import{n as t,t as n}from"./jsx-runtime-DmUwWVTj.js";import{L as r,Pr as i}from"./index-BmpulIkg.js";function a({data:e}){let t=typeof e.result==`number`?Number.isInteger(e.result)?e.result.toLocaleString():e.result.toLocaleString(void 0,{maximumFractionDigits:6}):String(e.result),n={cardBg:`var(--bg-surface-soft)`,cardText:`var(--text-primary)`,cardBorder:`var(--border-subtle)`,cardShadow:`var(--shadow-md)`,labelColor:`var(--text-muted)`,exprBg:`var(--bg-surface-raised)`,exprBorder:`var(--border-subtle)`,exprText:`var(--text-secondary)`,dividerColor:`var(--text-muted)`,resultBg:`var(--bg-surface-raised)`,resultBorder:`var(--border-default)`,resultText:`var(--text-primary)`};return(0,o.jsxs)(`div`,{style:{background:n.cardBg,color:n.cardText,borderRadius:`12px`,padding:`16px 20px`,margin:`12px 0`,boxShadow:n.cardShadow,border:`1px solid ${n.cardBorder}`,fontFamily:`system-ui, -apple-system, sans-serif`},children:[(0,o.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,marginBottom:`12px`},children:[(0,o.jsx)(i,{size:16,strokeWidth:2,style:{opacity:.9,color:n.labelColor}}),(0,o.jsx)(`span`,{style:{fontSize:`11px`,fontWeight:700,letterSpacing:`0.8px`,color:n.labelColor},children:`CALCULATION`})]}),(0,o.jsx)(`div`,{style:{background:n.exprBg,border:`1px solid ${n.exprBorder}`,borderRadius:`8px`,padding:`10px 14px`,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,fontSize:`14px`,color:n.exprText,letterSpacing:`0.3px`},children:e.expression}),(0,o.jsx)(`div`,{style:{display:`flex`,justifyContent:`center`,margin:`6px 0`,color:n.dividerColor,fontSize:`16px`,fontWeight:`bold`},children:`=`}),(0,o.jsx)(`div`,{style:{background:n.resultBg,border:`1px solid ${n.resultBorder}`,borderRadius:`10px`,padding:`12px 18px`},children:(0,o.jsx)(`div`,{style:{fontSize:`30px`,fontWeight:800,color:n.resultText,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,letterSpacing:`-0.5px`},children:t})})]})}var o;e((()=>{t(),r(),o=n()}))();export{a as default};