@pheem49/mint 1.17.0 → 1.18.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 (421) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +2 -2
  3. package/README.md +8 -2
  4. package/Release_Note.md +222 -71
  5. package/crates/mint-cli/src/agent/diff_render.rs +66 -44
  6. package/crates/mint-cli/src/agent/live_status.rs +21 -4
  7. package/crates/mint-cli/src/agent/markdown_render.rs +342 -5
  8. package/crates/mint-cli/src/agent.rs +25 -10
  9. package/crates/mint-cli/src/commands/agent.rs +4 -92
  10. package/crates/mint-cli/src/commands/browser.rs +2 -15
  11. package/crates/mint-cli/src/commands/integrations.rs +3 -3
  12. package/crates/mint-cli/src/commands/mod.rs +0 -3
  13. package/crates/mint-cli/src/commands/tailnet_web.rs +1 -0
  14. package/crates/mint-cli/src/interactive/chat_tui/dialog.rs +572 -0
  15. package/crates/mint-cli/src/interactive/chat_tui/mod.rs +1427 -0
  16. package/crates/mint-cli/src/interactive/chat_tui/render.rs +1524 -0
  17. package/crates/mint-cli/src/interactive/chat_tui/selection.rs +401 -0
  18. package/crates/mint-cli/src/interactive/chat_tui/state.rs +1833 -0
  19. package/crates/mint-cli/src/interactive/chat_tui/tests.rs +3414 -0
  20. package/crates/mint-cli/src/interactive/chat_tui/thought.rs +202 -0
  21. package/crates/mint-cli/src/interactive/chat_tui/transcript.rs +728 -0
  22. package/crates/mint-cli/src/interactive/chat_tui/watermark.rs +148 -0
  23. package/crates/mint-cli/src/interactive/command_ui.rs +53 -5
  24. package/crates/mint-cli/src/interactive/composer.rs +186 -0
  25. package/crates/mint-cli/src/interactive/format.rs +78 -3
  26. package/crates/mint-cli/src/interactive/input_box.rs +61 -1
  27. package/crates/mint-cli/src/interactive/resume_picker.rs +367 -25
  28. package/crates/mint-cli/src/interactive/slash_commands.rs +648 -371
  29. package/crates/mint-cli/src/interactive/tool_activity.rs +93 -20
  30. package/crates/mint-cli/src/interactive.rs +37 -0
  31. package/crates/mint-cli/src/main.rs +6 -3
  32. package/crates/mint-cli/src/markdown.rs +2 -37
  33. package/crates/mint-cli/src/onboard.rs +700 -282
  34. package/crates/mint-cli/src/setup.rs +1342 -624
  35. package/crates/mint-cli/src/terminal_theme.rs +159 -35
  36. package/crates/mint-cli/tests/library_intake.rs +1 -0
  37. package/crates/mint-core/src/agent/chat/anthropic.rs +318 -0
  38. package/crates/mint-core/src/agent/chat/custom.rs +149 -0
  39. package/crates/mint-core/src/agent/chat/gemini.rs +518 -0
  40. package/crates/mint-core/src/agent/chat/mod.rs +857 -0
  41. package/crates/mint-core/src/agent/chat/ollama.rs +321 -0
  42. package/crates/mint-core/src/agent/chat/openai.rs +582 -0
  43. package/crates/mint-core/src/agent/chat/streaming.rs +469 -0
  44. package/crates/mint-core/src/agent/chat/tests.rs +1479 -0
  45. package/crates/mint-core/src/agent/memory.rs +56 -2
  46. package/crates/mint-core/src/agent/tasks.rs +2 -2
  47. package/crates/mint-core/src/api_server/routes/chat.rs +24 -2
  48. package/crates/mint-core/src/api_server/routes/gemini_live.rs +14 -1
  49. package/crates/mint-core/src/api_server/routes/html_preview.rs +1 -8
  50. package/crates/mint-core/src/api_server/routes/sessions.rs +21 -0
  51. package/crates/mint-core/src/avatar_bridge.rs +0 -22
  52. package/crates/mint-core/src/browser/cdp.rs +10 -4
  53. package/crates/mint-core/src/browser/headless.rs +582 -0
  54. package/crates/mint-core/src/browser/input.rs +7 -62
  55. package/crates/mint-core/src/browser/interact.rs +0 -14
  56. package/crates/mint-core/src/browser/mod.rs +8 -29
  57. package/crates/mint-core/src/browser/navigate.rs +2 -36
  58. package/crates/mint-core/src/browser/runtime.rs +2 -4
  59. package/crates/mint-core/src/browser/session.rs +50 -466
  60. package/crates/mint-core/src/browser/workflow.rs +142 -32
  61. package/crates/mint-core/src/cron/store.rs +2 -2
  62. package/crates/mint-core/src/integrations/mcp.rs +6 -8
  63. package/crates/mint-core/src/lib.rs +0 -5
  64. package/crates/mint-core/src/media/gemini_live.rs +636 -86
  65. package/crates/mint-core/src/media/library/migration.rs +26 -0
  66. package/crates/mint-core/src/media/library/tests.rs +1 -1
  67. package/crates/mint-core/src/media/library/thumbnails.rs +8 -2
  68. package/crates/mint-core/src/media/pictures.rs +1 -1
  69. package/crates/mint-core/src/media/tool_images.rs +92 -1
  70. package/crates/mint-core/src/mods/manager.rs +101 -35
  71. package/crates/mint-core/src/orchestration/context_render.rs +441 -24
  72. package/crates/mint-core/src/orchestration/decision_parsing.rs +531 -16
  73. package/crates/mint-core/src/orchestration/full_skill_result_tests.rs +12 -0
  74. package/crates/mint-core/src/orchestration/loop_guard.rs +145 -0
  75. package/crates/mint-core/src/orchestration/mcp_outcome_tests.rs +864 -0
  76. package/crates/mint-core/src/orchestration/memory_skill.rs +88 -28
  77. package/crates/mint-core/src/orchestration/mod.rs +320 -4249
  78. package/crates/mint-core/src/orchestration/reliability.rs +67 -27
  79. package/crates/mint-core/src/orchestration/review_regressions.rs +5 -0
  80. package/crates/mint-core/src/orchestration/tests.rs +1665 -0
  81. package/crates/mint-core/src/orchestration/tools/dispatch.rs +967 -0
  82. package/crates/mint-core/src/orchestration/tools/files.rs +1 -0
  83. package/crates/mint-core/src/orchestration/tools/mod.rs +5 -1
  84. package/crates/mint-core/src/orchestration/tools/planning.rs +102 -42
  85. package/crates/mint-core/src/orchestration/tools/shell.rs +129 -58
  86. package/crates/mint-core/src/orchestration/truncation.rs +170 -13
  87. package/crates/mint-core/src/orchestration/types.rs +648 -0
  88. package/crates/mint-core/src/orchestration/verification.rs +0 -3
  89. package/crates/mint-core/src/orchestration/workspace_helpers.rs +24 -6
  90. package/crates/mint-core/src/prompts/agent.rs +52 -76
  91. package/crates/mint-core/src/prompts/tool_catalog.rs +8 -151
  92. package/crates/mint-core/src/search/files.rs +20 -0
  93. package/crates/mint-core/src/slash/mod.rs +228 -265
  94. package/crates/mint-core/src/slash/models.rs +6 -1
  95. package/crates/mint-core/src/system/bg_shell.rs +1 -0
  96. package/crates/mint-core/src/system/config.rs +176 -34
  97. package/crates/mint-mod-runtime/src/lib.rs +37 -23
  98. package/out/web/assets/ArtifactPreviewPanel-Cx6BVOOF.js +2 -0
  99. package/out/web/assets/CalculationCard-D2E74u5q.js +1 -0
  100. package/out/web/assets/CliSessionsView-ZbdtSjvK.css +1 -0
  101. package/out/web/assets/{CliSessionsView-MI8kXMAb.js → CliSessionsView-z5i6qGyb.js} +1 -1
  102. package/out/web/assets/CodeReviewPage-BK2bOScd.css +1 -0
  103. package/out/web/assets/CodeReviewPage-Dp6zHuHu.js +2 -0
  104. package/out/web/assets/{CommandPalette-BD8SlTE5.js → CommandPalette-DaKlzbKs.js} +1 -1
  105. package/out/web/assets/ImageGenCard-BMCJHP9O.js +1 -0
  106. package/out/web/assets/ImageSearchCard-Cld_SOUg.js +1 -0
  107. package/out/web/assets/{ImageStudioPanel-BP7N4rLr.js → ImageStudioPanel-B5N7TjeB.js} +1 -1
  108. package/out/web/assets/LibraryPage-CMB89rJ0.css +1 -0
  109. package/out/web/assets/LibraryPage-DbZEi4W_.js +2 -0
  110. package/out/web/assets/LinkedFoldersView-9B9DIPoZ.js +1 -0
  111. package/out/web/assets/{McpRegistryPicker-CoS83vtc.js → McpRegistryPicker-DnXPlzI7.js} +1 -1
  112. package/out/web/assets/McpServersView-CiNBNUl4.js +1 -0
  113. package/out/web/assets/MermaidCard-BBDNEXbY.js +2 -0
  114. package/out/web/assets/MintDashboard-C_UYPoNV.js +119 -0
  115. package/out/web/assets/MintDashboard-DTd8C_c8.css +1 -0
  116. package/out/web/assets/PlanCard-C2x5pajq.js +1 -0
  117. package/out/web/assets/{PluginsView-jBYmcKh4.js → PluginsView-DoTg9MVa.js} +1 -1
  118. package/out/web/assets/RewindModal-B5oowrR0.js +1 -0
  119. package/out/web/assets/{ScheduledTasksView-5uw9-V9H.js → ScheduledTasksView-BD5DVPkZ.js} +1 -1
  120. package/out/web/assets/{SelectField-DXBQtrUK.js → SelectField-Cy6CghrU.js} +1 -1
  121. package/out/web/assets/SettingsWindow-BYl_oCFh.js +4 -0
  122. package/out/web/assets/SettingsWindow-Ckcgnjt8.css +1 -0
  123. package/out/web/assets/{SkillsView-C-gp9J7m.js → SkillsView-CIeWwq5z.js} +1 -1
  124. package/out/web/assets/StockCard-DxUciKyp.js +1 -0
  125. package/out/web/assets/ToolSurfacePage-qBgs_VHq.css +1 -0
  126. package/out/web/assets/ToolSurfacePage-saVbVrkE.js +38 -0
  127. package/out/web/assets/{UiFeatureCard-6BwxTOCe.js → UiFeatureCard-CdY0hGWy.js} +1 -1
  128. package/out/web/assets/{UiGridCard-DvZcLNxb.js → UiGridCard-BBK3I5hC.js} +1 -1
  129. package/out/web/assets/UiMockupWidget-CpR9EDuc.js +1 -0
  130. package/out/web/assets/{VeoStudioPanel-DOj7_WR3.css → VeoStudioPanel-9kU9YLEN.css} +1 -1
  131. package/out/web/assets/{VeoStudioPanel-DfsOJKv0.js → VeoStudioPanel-Co6-wEWM.js} +2 -2
  132. package/out/web/assets/WeatherCard-Buzi7Vfu.js +1 -0
  133. package/out/web/assets/WorkspacePdfPreview-Bi8Zzyir.js +2 -0
  134. package/out/web/assets/{abnfDiagram-VCTEODGH-BOo3Ckng.js → abnfDiagram-VCTEODGH-CMfR95N2.js} +1 -1
  135. package/out/web/assets/{architecture-7GRP2DOG-ZOwheW3n.js → architecture-7GRP2DOG-DhAM4HyO.js} +1 -1
  136. package/out/web/assets/{architectureDiagram-5GKGNRK7-DC2FDzVd.js → architectureDiagram-5GKGNRK7-Yk3TUJ_F.js} +1 -1
  137. package/out/web/assets/{blockDiagram-I7D4REHJ-BrKFWdAH.js → blockDiagram-I7D4REHJ-X9fBgJik.js} +1 -1
  138. package/out/web/assets/{c4Diagram-7LVT6UL2-BHTHK1Yd.js → c4Diagram-7LVT6UL2-Bk9x7N-8.js} +1 -1
  139. package/out/web/assets/{chunk-4HAMMTFA-BYFkZwNj.js → chunk-4HAMMTFA-Dx5fk1_0.js} +1 -1
  140. package/out/web/assets/{chunk-75Z2AOVW-BSKfSKSA.js → chunk-75Z2AOVW-BszTQoM4.js} +1 -1
  141. package/out/web/assets/{chunk-DU6HZSFF-vIhsiW6n.js → chunk-DU6HZSFF-DK-As3rk.js} +1 -1
  142. package/out/web/assets/{chunk-F27PBJKO-BlYpW9xq.js → chunk-F27PBJKO-LmncZZIS.js} +1 -1
  143. package/out/web/assets/{chunk-GMAD6QVW-BIBz_Ug5.js → chunk-GMAD6QVW-DSQ_sDRJ.js} +1 -1
  144. package/out/web/assets/{chunk-GVQU2GXP-NPSHxeqC.js → chunk-GVQU2GXP-Cno3ulje.js} +1 -1
  145. package/out/web/assets/{chunk-IMKFNOWR-YlJK8_Fp.js → chunk-IMKFNOWR-bIzfY9Jc.js} +1 -1
  146. package/out/web/assets/{chunk-L3NEJ4N5-DMYi4-af.js → chunk-L3NEJ4N5-Dl6eOa0D.js} +1 -1
  147. package/out/web/assets/{chunk-OSK3NFVY-Begd3-jA.js → chunk-OSK3NFVY-BaUGJ-cM.js} +1 -1
  148. package/out/web/assets/{chunk-P2QGCYS3-D1I4xFHN.js → chunk-P2QGCYS3-_066ndhH.js} +1 -1
  149. package/out/web/assets/{chunk-POPQ4Y6H-CafZZzNE.js → chunk-POPQ4Y6H-YT1AKhTv.js} +1 -1
  150. package/out/web/assets/{chunk-PWAF6VOD-Dwh6_Lnt.js → chunk-PWAF6VOD-CrEgDsxh.js} +1 -1
  151. package/out/web/assets/{chunk-SHT3W25Y-B0XrCSEb.js → chunk-SHT3W25Y-_KwaRLOl.js} +1 -1
  152. package/out/web/assets/{chunk-SVP7TREG-CxLsddxC.js → chunk-SVP7TREG-BQ1qb32L.js} +1 -1
  153. package/out/web/assets/{chunk-TICWLB2K-y156QInb.js → chunk-TICWLB2K-BDyehCtg.js} +1 -1
  154. package/out/web/assets/classDiagram-ZZMXUADV-BoSpzRCJ.js +1 -0
  155. package/out/web/assets/classDiagram-v2-VYDZK3BY-BoSpzRCJ.js +1 -0
  156. package/out/web/assets/{config-DqXJXeZM.css → config-2suVFPZg.css} +1 -1
  157. package/out/web/assets/config-CkRCdkxn.js +2 -0
  158. package/out/web/assets/{cynefin-OW5HDTMX-SMVvrLf-.js → cynefin-OW5HDTMX-Dl_31aaN.js} +1 -1
  159. package/out/web/assets/{cynefinDiagram-5FMLGOSQ-rZznN24T.js → cynefinDiagram-5FMLGOSQ-Bpir8jha.js} +1 -1
  160. package/out/web/assets/{dagre-GXQ25YYZ-BOToydFu.js → dagre-GXQ25YYZ-D9xu3nsq.js} +1 -1
  161. package/out/web/assets/{diagram-S7CK7UJ4-TMVaGQEJ.js → diagram-S7CK7UJ4-DeveoEeB.js} +1 -1
  162. package/out/web/assets/{diagram-UQ7AKVKN-C2JK-GP2.js → diagram-UQ7AKVKN-p4xWRESV.js} +1 -1
  163. package/out/web/assets/{diagram-VSXAHHWV-Cw8VSi2K.js → diagram-VSXAHHWV-C7qz9NDF.js} +1 -1
  164. package/out/web/assets/{diagram-VX7I27RA-DXp4fKk9.js → diagram-VX7I27RA-DRiCa3Vd.js} +1 -1
  165. package/out/web/assets/{diagram-Z3DM3KII-CzSicYiW.js → diagram-Z3DM3KII-Bt7zduQX.js} +1 -1
  166. package/out/web/assets/{ebnfDiagram-PWID7BFC-Dqj-zqPu.js → ebnfDiagram-PWID7BFC-DV9WpwdR.js} +1 -1
  167. package/out/web/assets/{erDiagram-RLTQ6QDP-DZwFZAuD.js → erDiagram-RLTQ6QDP-BJ_nwG2m.js} +1 -1
  168. package/out/web/assets/{eventmodeling-NTZA5JFV-C0O-Lvgp.js → eventmodeling-NTZA5JFV-BTBMrfVa.js} +1 -1
  169. package/out/web/assets/flowDiagram-HODETNUW-Cdlq3cJL.js +1 -0
  170. package/out/web/assets/{ganttDiagram-EL5Y4UJY-Da4ULXTl.js → ganttDiagram-EL5Y4UJY-DQLdsXrC.js} +1 -1
  171. package/out/web/assets/{gitGraph-4MIJSDKK-B9wNFZIP.js → gitGraph-4MIJSDKK-CL1OEOQ_.js} +1 -1
  172. package/out/web/assets/{gitGraphDiagram-WWUBYQGX-RjrhB0MP.js → gitGraphDiagram-WWUBYQGX-8cSi42H7.js} +1 -1
  173. package/out/web/assets/index-BocxnrDG.js +168 -0
  174. package/out/web/assets/index-yeh_r55a.css +1 -0
  175. package/out/web/assets/{info-A6RAGUB7-B3dfCpeY.js → info-A6RAGUB7-C1zsX5sc.js} +1 -1
  176. package/out/web/assets/{infoDiagram-27XIBGKW-QVWkLVx7.js → infoDiagram-27XIBGKW-DsRYtIyI.js} +1 -1
  177. package/out/web/assets/{ishikawaDiagram-5VMMS53U-CLFNIRI9.js → ishikawaDiagram-5VMMS53U-B2crwIXj.js} +1 -1
  178. package/out/web/assets/{journeyDiagram-3NMN7TZE-fgOQadYF.js → journeyDiagram-3NMN7TZE-BTH-GyVR.js} +1 -1
  179. package/out/web/assets/{kanban-definition-UXKFOSKX-G3Q_9g9O.js → kanban-definition-UXKFOSKX-BeRfCnuA.js} +1 -1
  180. package/out/web/assets/{mermaid-parser.core-v3Jm7nco.js → mermaid-parser.core-BJwgCBBc.js} +3 -3
  181. package/out/web/assets/{mermaid.core-DTEjLUA1.js → mermaid.core-CsDDodN8.js} +4 -4
  182. package/out/web/assets/{mindmap-definition-YA3MSWOX-C_D42_fF.js → mindmap-definition-YA3MSWOX-B42efOQ1.js} +1 -1
  183. package/out/web/assets/{modelManager-BPLycQrN.js → modelManager-B3ZFMh8v.js} +2 -2
  184. package/out/web/assets/{oauthManager-BUK7ic7q.js → oauthManager-Ch5Du2fF.js} +1 -1
  185. package/out/web/assets/{packet-AYTQ26CC-B-R-SHlF.js → packet-AYTQ26CC-B6xUyE6r.js} +1 -1
  186. package/out/web/assets/{pegDiagram-XKGWAZYB-Da2q_giz.js → pegDiagram-XKGWAZYB-1LabVycL.js} +1 -1
  187. package/out/web/assets/{pie-WAS4IAKB-BC8F0N7-.js → pie-WAS4IAKB-DJwo-nf_.js} +1 -1
  188. package/out/web/assets/{pieDiagram-E7YTZNPT-Iy9REJNC.js → pieDiagram-E7YTZNPT-icmAqzy4.js} +1 -1
  189. package/out/web/assets/{quadrantDiagram-AXDQQJYC-ztsiYw7h.js → quadrantDiagram-AXDQQJYC-CZ-wEx41.js} +1 -1
  190. package/out/web/assets/{radar-RG4KPBEZ-B_1P8Z_z.js → radar-RG4KPBEZ-D7d-Xriw.js} +1 -1
  191. package/out/web/assets/{railroad-74A4TZTK-DuTqczSo.js → railroad-74A4TZTK-viuhdYbs.js} +1 -1
  192. package/out/web/assets/{railroad-abnf-HS5TGJTU-Df29WLmp.js → railroad-abnf-HS5TGJTU-DNXiCNea.js} +1 -1
  193. package/out/web/assets/{railroad-ebnf-LZEXJU2U-ePFMo-qp.js → railroad-ebnf-LZEXJU2U-nkSu1-0C.js} +1 -1
  194. package/out/web/assets/{railroad-peg-WCYAUIDC-DYXLW4_E.js → railroad-peg-WCYAUIDC-BhbMeQzz.js} +1 -1
  195. package/out/web/assets/{railroadDiagram-O6MQD6OU-LStnZf2S.js → railroadDiagram-O6MQD6OU-CLpG1jUX.js} +1 -1
  196. package/out/web/assets/{requirementDiagram-BXWQKSXE-DmzonMH-.js → requirementDiagram-BXWQKSXE-kRDrvWrc.js} +1 -1
  197. package/out/web/assets/{sankeyDiagram-P5KCCOFB-B8vjmUU1.js → sankeyDiagram-P5KCCOFB-DxAwmq4x.js} +1 -1
  198. package/out/web/assets/{sequenceDiagram-WJ2MYXX4-CTnplOAX.js → sequenceDiagram-WJ2MYXX4-aLgY-6Wz.js} +1 -1
  199. package/out/web/assets/{stateDiagram-D77RDMKH-BFrIaLdI.js → stateDiagram-D77RDMKH-D5QWfOhp.js} +1 -1
  200. package/out/web/assets/stateDiagram-v2-MP3YSRHH-D6OiZoAP.js +1 -0
  201. package/out/web/assets/{swimlanes-42K2YHIH-BXGngUNU.js → swimlanes-42K2YHIH-CRs5UyA-.js} +1 -1
  202. package/out/web/assets/swimlanesDiagram-VR7AAH4N-UgEXIsV0.js +8 -0
  203. package/out/web/assets/syntaxHighlight-C-wAGT84.js +3 -0
  204. package/out/web/assets/{timeline-definition-24CTP7MA-CegH7n43.js → timeline-definition-24CTP7MA-Denqd9qb.js} +1 -1
  205. package/out/web/assets/{treeView-Q6P3EWNA-DTpJv2Tw.js → treeView-Q6P3EWNA-0my3Z3s4.js} +1 -1
  206. package/out/web/assets/{treemap-WGGIJYW6-i8M9iJU6.js → treemap-WGGIJYW6-B_EjkLYq.js} +1 -1
  207. package/out/web/assets/{vennDiagram-4TSXK5OY-Dpzo1S8U.js → vennDiagram-4TSXK5OY-DxVg3Ewr.js} +1 -1
  208. package/out/web/assets/{wardley-WFR3VGLG-BrNsgtfw.js → wardley-WFR3VGLG-CGD-Tj4p.js} +1 -1
  209. package/out/web/assets/{wardleyDiagram-VM6X3IG4-lQ92LFE1.js → wardleyDiagram-VM6X3IG4-CmfS39Xm.js} +1 -1
  210. package/out/web/assets/{xychartDiagram-S5SC5T6Z-BaOaEoBd.js → xychartDiagram-S5SC5T6Z-BVM9bKis.js} +1 -1
  211. package/out/web/index-web.html +2 -2
  212. package/out/web/index.html +2 -2
  213. package/package.json +2 -2
  214. package/shared-modules/CODEOWNERS +3 -3
  215. package/shared-modules/SDL2/SDL2_mixer.json +27 -0
  216. package/shared-modules/appstream/README.md +13 -0
  217. package/shared-modules/appstream/appstream-compose.json +111 -0
  218. package/shared-modules/dbus-glib/dbus-glib.json +2 -2
  219. package/shared-modules/libportal/libportal.json +23 -0
  220. package/shared-modules/linux-audio/fluidsynth2-static.json +2 -2
  221. package/shared-modules/linux-audio/fluidsynth2.json +2 -2
  222. package/shared-modules/linux-audio/libinstpatch.json +2 -2
  223. package/shared-modules/linux-audio/liblo-static.json +3 -0
  224. package/shared-modules/luajit/luajit.json +2 -2
  225. package/shared-modules/squashfs-tools/squashfs-tools.json +0 -3
  226. package/slash-commands.json +7 -2
  227. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  228. package/src/renderer/shared/agentProgress.ts +51 -3
  229. package/src/renderer/shared/components/Settings/AutomationTab.tsx +2 -56
  230. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +15 -1
  231. package/src/renderer/shared/components/Settings/GeneralTab.tsx +25 -12
  232. package/src/renderer/shared/components/Settings/ThemeTab.test.tsx +45 -0
  233. package/src/renderer/shared/components/Settings/ThemeTab.tsx +106 -3
  234. package/src/renderer/shared/components/activity/AgentActivityDrawer.tsx +67 -17
  235. package/src/renderer/shared/components/activity/AgentActivityTable.tsx +376 -134
  236. package/src/renderer/shared/components/activity/AskUserActivityCard.test.tsx +122 -0
  237. package/src/renderer/shared/components/activity/AskUserActivityCard.tsx +70 -0
  238. package/src/renderer/shared/components/activity/McpToolResults.tsx +39 -2
  239. package/src/renderer/shared/components/activity/SubagentDagView.tsx +7 -7
  240. package/src/renderer/shared/components/activity/ViewedImages.tsx +41 -2
  241. package/src/renderer/shared/components/app/ChunkErrorBoundary.tsx +3 -3
  242. package/src/renderer/shared/components/app/CommandPalette.tsx +7 -7
  243. package/src/renderer/shared/components/app/DesktopTitlebar.tsx +2 -2
  244. package/src/renderer/shared/components/app/MintDashboard.tsx +27 -17
  245. package/src/renderer/shared/components/app/ModalErrorBoundary.tsx +3 -3
  246. package/src/renderer/shared/components/cards/CalculationCard.tsx +3 -3
  247. package/src/renderer/shared/components/cards/ImageGenCard.tsx +2 -2
  248. package/src/renderer/shared/components/cards/ImageSearchCard.tsx +2 -2
  249. package/src/renderer/shared/components/cards/MermaidCard.tsx +1 -1
  250. package/src/renderer/shared/components/cards/PlanCard.test.tsx +41 -0
  251. package/src/renderer/shared/components/cards/PlanCard.tsx +32 -0
  252. package/src/renderer/shared/components/cards/ReleaseNotesCard.test.tsx +29 -0
  253. package/src/renderer/shared/components/cards/ReleaseNotesCard.tsx +137 -0
  254. package/src/renderer/shared/components/cards/StockCard.tsx +7 -7
  255. package/src/renderer/shared/components/cards/ToolResultCards.tsx +11 -3
  256. package/src/renderer/shared/components/cards/UiMockupWidget.tsx +4 -4
  257. package/src/renderer/shared/components/cards/WeatherCard.tsx +5 -5
  258. package/src/renderer/shared/components/chat/ApprovalCard.test.tsx +11 -0
  259. package/src/renderer/shared/components/chat/ApprovalCard.tsx +21 -2
  260. package/src/renderer/shared/components/chat/ArtifactCards.test.tsx +69 -0
  261. package/src/renderer/shared/components/chat/ArtifactCards.tsx +238 -0
  262. package/src/renderer/shared/components/chat/AttachedDocumentCard.test.tsx +39 -0
  263. package/src/renderer/shared/components/chat/AttachedDocumentCard.tsx +220 -0
  264. package/src/renderer/shared/components/chat/ChatCodeBlock.test.tsx +33 -0
  265. package/src/renderer/shared/components/chat/ChatCodeBlock.tsx +15 -1
  266. package/src/renderer/shared/components/chat/ChatMessageItem.test.tsx +40 -2
  267. package/src/renderer/shared/components/chat/ChatMessageItem.tsx +180 -34
  268. package/src/renderer/shared/components/chat/ChatModeSelector.css +227 -0
  269. package/src/renderer/shared/components/chat/ChatModeSelector.test.tsx +45 -0
  270. package/src/renderer/shared/components/chat/ChatModeSelector.tsx +198 -0
  271. package/src/renderer/shared/components/chat/ChatPanel.test.tsx +22 -0
  272. package/src/renderer/shared/components/chat/ChatPanel.tsx +227 -53
  273. package/src/renderer/shared/components/chat/DiffReviewModal.tsx +6 -6
  274. package/src/renderer/shared/components/chat/GeminiLiveOverlay.test.tsx +142 -1
  275. package/src/renderer/shared/components/chat/GeminiLiveOverlay.tsx +45 -3
  276. package/src/renderer/shared/components/chat/ModelSelectorPopover.tsx +42 -14
  277. package/src/renderer/shared/components/chat/RewindModal.tsx +10 -10
  278. package/src/renderer/shared/components/chat/SlashSuggestions.test.tsx +14 -0
  279. package/src/renderer/shared/components/chat/SourcesBlock.test.tsx +53 -0
  280. package/src/renderer/shared/components/chat/SourcesBlock.tsx +236 -90
  281. package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +45 -1
  282. package/src/renderer/shared/components/chat/TurnFileChanges.tsx +202 -169
  283. package/src/renderer/shared/components/extensions/CliSessionsView.tsx +5 -4
  284. package/src/renderer/shared/components/extensions/McpRegistryPicker.tsx +3 -3
  285. package/src/renderer/shared/components/studio/LibraryPage.tsx +48 -5
  286. package/src/renderer/shared/components/workspace/ArtifactPreviewPanel.tsx +125 -13
  287. package/src/renderer/shared/components/workspace/CodeReviewPage.test.tsx +50 -0
  288. package/src/renderer/shared/components/workspace/CodeReviewPage.tsx +77 -16
  289. package/src/renderer/shared/components/workspace/GitBranchSelector.tsx +78 -22
  290. package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +13 -0
  291. package/src/renderer/shared/components/workspace/ToolSurfacePage.tsx +48 -28
  292. package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +266 -47
  293. package/src/renderer/shared/components/workspace/WorkspacePreviewActions.test.tsx +18 -6
  294. package/src/renderer/shared/components/workspace/background-terminals.css +11 -11
  295. package/src/renderer/shared/constants/config.ts +1 -5
  296. package/src/renderer/shared/constants/models.test.ts +51 -0
  297. package/src/renderer/shared/constants/models.ts +139 -32
  298. package/src/renderer/shared/conversation/lifecycle.test.ts +91 -3
  299. package/src/renderer/shared/conversation/lifecycle.ts +104 -5
  300. package/src/renderer/shared/conversation/progressiveStream.test.ts +83 -0
  301. package/src/renderer/shared/conversation/progressiveStream.ts +219 -0
  302. package/src/renderer/shared/css/agent-observability.css +133 -0
  303. package/src/renderer/shared/css/chat-ui-cards.css +13 -13
  304. package/src/renderer/shared/css/code-review.css +63 -34
  305. package/src/renderer/shared/css/code-sessions.css +47 -18
  306. package/src/renderer/shared/css/collapsed-paste.css +1 -1
  307. package/src/renderer/shared/css/error-notice.css +1 -1
  308. package/src/renderer/shared/css/file-changes.css +165 -80
  309. package/src/renderer/shared/css/library.css +105 -10
  310. package/src/renderer/shared/css/management-views.css +1 -1
  311. package/src/renderer/shared/css/mcp-results.css +5 -5
  312. package/src/renderer/shared/css/model-selector.css +18 -18
  313. package/src/renderer/shared/css/mods.css +7 -7
  314. package/src/renderer/shared/css/notification-notice.css +2 -2
  315. package/src/renderer/shared/css/queued-messages.css +5 -5
  316. package/src/renderer/shared/css/settings/general.css +18 -13
  317. package/src/renderer/shared/css/settings/profile.css +5 -5
  318. package/src/renderer/shared/css/settings/theme.css +5 -5
  319. package/src/renderer/shared/css/slash-choice.css +2 -2
  320. package/src/renderer/shared/css/slash-suggestions.css +3 -3
  321. package/src/renderer/shared/css/sources-block.css +41 -2
  322. package/src/renderer/shared/css/tools-panel.css +2 -2
  323. package/src/renderer/shared/css/ui-tailwind.css +8 -0
  324. package/src/renderer/shared/css/veo-studio.css +2 -2
  325. package/src/renderer/shared/css/viewed-images.css +7 -7
  326. package/src/renderer/shared/platform.ts +2 -1
  327. package/src/renderer/shared/theme/themeManager.test.ts +17 -0
  328. package/src/renderer/shared/theme/themeManager.ts +21 -4
  329. package/src/renderer/shared/theme/themes.ts +54 -0
  330. package/src/renderer/shared/theme/tokens.css +6 -4
  331. package/src/renderer/shared/types.ts +1 -1
  332. package/src/renderer/shared/utils/agentActivity.test.ts +468 -2
  333. package/src/renderer/shared/utils/agentActivity.ts +602 -35
  334. package/src/renderer/shared/utils/artifactBrowser.test.ts +37 -32
  335. package/src/renderer/shared/utils/artifactBrowser.ts +17 -19
  336. package/src/renderer/shared/utils/attachedDocument.test.ts +73 -0
  337. package/src/renderer/shared/utils/attachedDocument.ts +49 -0
  338. package/src/renderer/shared/utils/fileIcons.test.ts +59 -0
  339. package/src/renderer/shared/utils/fileIcons.ts +149 -16
  340. package/src/renderer/shared/utils/markdown.tsx +72 -19
  341. package/src/renderer/shared/utils/markdown.webImages.test.tsx +16 -0
  342. package/src/renderer/shared/utils/mcpResults.test.tsx +29 -0
  343. package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
  344. package/src/renderer/shared/utils/syntaxHighlight.test.tsx +11 -1
  345. package/src/renderer/shared/utils/syntaxHighlight.tsx +51 -3
  346. package/src/renderer/shared/utils/useGeminiLiveVoice.ts +324 -51
  347. package/src/renderer/shared/utils/workspaceDrag.test.ts +153 -0
  348. package/src/renderer/shared/utils/workspaceDrag.ts +142 -0
  349. package/src/renderer/shared/utils/workspaceMedia.ts +10 -2
  350. package/src/renderer/src/App.tsx +14 -8
  351. package/src/renderer/src/agentProgress.ts +1 -0
  352. package/src/renderer/src/components/ScreenPicker.css +1 -1
  353. package/src/renderer/src/components/WorkspacePanel.tsx +6 -5
  354. package/src/renderer/src/css/app-shell.css +4 -4
  355. package/src/renderer/src/css/chat.css +1261 -241
  356. package/src/renderer/src/css/desktop-tools.css +11 -11
  357. package/src/renderer/src/css/sidebar-workspace.css +2 -2
  358. package/src/renderer/src/css/tool-surfaces.css +12 -12
  359. package/src/renderer/src/index.css +38 -20
  360. package/src/renderer/src/tauri.ts +22 -2
  361. package/src/renderer/src-web/App.tsx +14 -0
  362. package/src/renderer/src-web/agentProgress.ts +1 -0
  363. package/src/renderer/src-web/css/app-shell.css +4 -4
  364. package/src/renderer/src-web/css/chat.css +1278 -190
  365. package/src/renderer/src-web/css/mobile.css +29 -13
  366. package/src/renderer/src-web/css/settings/mobile.css +2 -2
  367. package/src/renderer/src-web/css/sidebar-workspace.css +1 -1
  368. package/src/renderer/src-web/index.css +38 -20
  369. package/src/renderer/src-web/tauri.ts +22 -2
  370. package/src/renderer/tests/browserArtifacts.browser.tsx +1 -1
  371. package/src/renderer/tests/library.browser.tsx +3 -0
  372. package/src/renderer/tests/liveVoice.browser.html +1 -0
  373. package/src/renderer/tests/workspaceDrop.browser.tsx +1 -1
  374. package/src-tauri/src/app/lifecycle.rs +1 -14
  375. package/src-tauri/src/background/headless.rs +14 -8
  376. package/src-tauri/src/commands/conversation.rs +38 -0
  377. package/src-tauri/src/native/mod.rs +0 -1
  378. package/src-tauri/src/native/system.rs +4 -47
  379. package/crates/mint-cli/src/interactive/chat_tui.rs +0 -8855
  380. package/crates/mint-core/src/agent/chat.rs +0 -4394
  381. package/crates/mint-core/src/browser/lifecycle.rs +0 -291
  382. package/crates/mint-core/src/browser/logging.rs +0 -20
  383. package/crates/mint-core/src/orchestration/tools/browser.rs +0 -31
  384. package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +0 -2
  385. package/out/web/assets/CalculationCard-CRjP3E1j.js +0 -1
  386. package/out/web/assets/CliSessionsView-C3Br2v5Y.css +0 -1
  387. package/out/web/assets/CodeReviewPage-CUJceQme.css +0 -1
  388. package/out/web/assets/CodeReviewPage-VCUgPla_.js +0 -2
  389. package/out/web/assets/ImageGenCard-BCXxkVJX.js +0 -1
  390. package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +0 -1
  391. package/out/web/assets/LibraryPage-DAxUTAg7.css +0 -1
  392. package/out/web/assets/LibraryPage-WlviRdR8.js +0 -2
  393. package/out/web/assets/LinkedFoldersView-CKRgroWK.js +0 -1
  394. package/out/web/assets/McpServersView-D3wHnuHg.js +0 -1
  395. package/out/web/assets/MermaidCard-NqrHdyJW.js +0 -2
  396. package/out/web/assets/MintDashboard-B2DJsDDO.css +0 -1
  397. package/out/web/assets/MintDashboard-COw_xol7.js +0 -63
  398. package/out/web/assets/RewindModal-DempuDod.js +0 -1
  399. package/out/web/assets/SettingsWindow-2YP3yj7s.js +0 -4
  400. package/out/web/assets/SettingsWindow-Dz8LQVgD.css +0 -1
  401. package/out/web/assets/StockCard-BDMCe7mx.js +0 -1
  402. package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +0 -38
  403. package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +0 -1
  404. package/out/web/assets/UiMockupWidget-DD73QWg1.js +0 -1
  405. package/out/web/assets/WeatherCard-CPucIfq8.js +0 -1
  406. package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +0 -2
  407. package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +0 -1
  408. package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +0 -1
  409. package/out/web/assets/config-CvIO5hkn.js +0 -2
  410. package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +0 -1
  411. package/out/web/assets/index-BmpulIkg.js +0 -168
  412. package/out/web/assets/index-CkvBwhX_.css +0 -1
  413. package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +0 -1
  414. package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +0 -8
  415. package/shared-modules/libsecret/libsecret.json +0 -23
  416. package/shared-modules/libusb/libusb.json +0 -27
  417. package/shared-modules/lzo/lzo.json +0 -27
  418. package/src/renderer/src/components/BrowserShell.tsx +0 -108
  419. package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +0 -91
  420. package/src/renderer/src/components/browser-shell.css +0 -185
  421. package/src-tauri/src/native/browser.rs +0 -252
@@ -1,291 +0,0 @@
1
- //! Starting, detecting, and preparing the automation browser instance itself
2
- //! (as opposed to driving an already-running one — see `navigate`/`interact`).
3
-
4
- use crate::MintConfig;
5
- use serde_json::Value;
6
-
7
- use super::cdp::fetch_pages_endpoint;
8
-
9
- pub async fn is_browser_running(config: &MintConfig) -> bool {
10
- let endpoint = config
11
- .extra
12
- .get("browserDebugUrl")
13
- .and_then(Value::as_str)
14
- .unwrap_or("http://127.0.0.1:9222/json/list");
15
- fetch_pages_endpoint(endpoint).await.is_ok()
16
- }
17
-
18
- pub(crate) const BROWSER_TOOLS: &[&str] = &[
19
- "browser_open",
20
- "browser_click",
21
- "browser_type",
22
- "browser_read",
23
- "browser_mouse_move",
24
- "browser_mouse_click",
25
- "browser_key_press",
26
- "browser_screenshot",
27
- "browser_tabs",
28
- "browser_observe",
29
- "browser_fill",
30
- "browser_select",
31
- "browser_scroll",
32
- "browser_wait",
33
- ];
34
-
35
- pub fn enable_browser_tools(config: &mut MintConfig) -> bool {
36
- let mut changed = false;
37
- for tool in BROWSER_TOOLS {
38
- if config.disabled_tools.contains(&tool.to_string()) {
39
- config.disabled_tools.retain(|x| x != *tool);
40
- changed = true;
41
- }
42
- }
43
- changed
44
- }
45
-
46
- async fn spawn_browser_process(
47
- config: &MintConfig,
48
- initial_url: Option<&str>,
49
- ) -> Result<(), String> {
50
- let endpoint = config
51
- .extra
52
- .get("browserDebugUrl")
53
- .and_then(Value::as_str)
54
- .unwrap_or("http://127.0.0.1:9222/json/list");
55
-
56
- if fetch_pages_endpoint(endpoint).await.is_ok() {
57
- return Ok(());
58
- }
59
-
60
- let debug_url = reqwest::Url::parse(endpoint).map_err(|e| e.to_string())?;
61
- if !matches!(
62
- debug_url.host_str(),
63
- Some("localhost" | "127.0.0.1" | "[::1]" | "::1")
64
- ) {
65
- return Err("Configured remote browser is unavailable; start it at the configured endpoint before using Mint Auto".into());
66
- }
67
- let browser_name = config
68
- .extra
69
- .get("automationBrowser")
70
- .and_then(Value::as_str)
71
- .unwrap_or("chromium");
72
-
73
- let args = build_browser_args(config, endpoint, initial_url)?;
74
-
75
- let custom_exe = config
76
- .extra
77
- .get("browserExecutable")
78
- .and_then(Value::as_str)
79
- .map(str::trim)
80
- .filter(|s| !s.is_empty());
81
-
82
- let mut spawned = false;
83
- let mut executables: Vec<&str> = Vec::new();
84
- if let Some(exe) = custom_exe {
85
- executables.push(exe);
86
- }
87
- if cfg!(target_os = "windows") {
88
- executables.extend_from_slice(&["chrome.exe", "chromium.exe", "msedge.exe"]);
89
- } else if cfg!(target_os = "macos") {
90
- executables.extend_from_slice(&[
91
- "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
92
- "/Applications/Chromium.app/Contents/MacOS/Chromium",
93
- "chromium",
94
- "google-chrome",
95
- ]);
96
- } else {
97
- executables.extend_from_slice(&[
98
- "google-chrome",
99
- "google-chrome-stable",
100
- "chromium",
101
- "chrome",
102
- "chromium-browser",
103
- "/opt/google/chrome/google-chrome",
104
- "/opt/google/chrome/chrome",
105
- ]);
106
- }
107
-
108
- for exe in executables {
109
- if std::process::Command::new(exe)
110
- .args(&args)
111
- .stdout(std::process::Stdio::null())
112
- .stderr(std::process::Stdio::null())
113
- .spawn()
114
- .is_ok()
115
- {
116
- spawned = true;
117
- break;
118
- }
119
- }
120
-
121
- if !spawned {
122
- return Err(format!(
123
- "Could not find or spawn browser '{browser_name}' with remote debugging. \
124
- Please verify it is installed."
125
- ));
126
- }
127
-
128
- for _ in 0..20 {
129
- tokio::time::sleep(std::time::Duration::from_millis(250)).await;
130
- if fetch_pages_endpoint(endpoint).await.is_ok() {
131
- return Ok(());
132
- }
133
- }
134
-
135
- Err(format!(
136
- "Browser spawned but debugging endpoint {endpoint} did not become available."
137
- ))
138
- }
139
-
140
- pub async fn spawn_automation_browser(config: &MintConfig) -> Result<(), String> {
141
- spawn_browser_process(config, None).await
142
- }
143
-
144
- pub async fn ensure_page_open(config: &MintConfig) -> Result<(), String> {
145
- if !is_browser_running(config).await {
146
- spawn_browser_process(config, None).await?;
147
- }
148
- let endpoint = config
149
- .extra
150
- .get("browserDebugUrl")
151
- .and_then(Value::as_str)
152
- .unwrap_or("http://127.0.0.1:9222/json/list");
153
-
154
- let pages = fetch_pages_endpoint(endpoint).await?;
155
- if let Some(id) = super::selected_tab() {
156
- return if pages.iter().any(|p| p["type"] == "page" && p["id"] == id) {
157
- Ok(())
158
- } else {
159
- Err("tab_unavailable".into())
160
- };
161
- }
162
- let has_page = pages.iter().any(|p| p["type"] == "page");
163
- if !has_page {
164
- let base_url = endpoint.replace("/json/list", "/json/new");
165
- let client = crate::HTTP_CLIENT.clone();
166
- let _ = client
167
- .put(&base_url)
168
- .send()
169
- .await
170
- .map_err(|e| format!("failed to open new tab: {e}"))?;
171
- }
172
- Ok(())
173
- }
174
-
175
- pub async fn spawn_automation_browser_with_url(
176
- config: &MintConfig,
177
- initial_url: Option<&str>,
178
- ) -> Result<(), String> {
179
- spawn_browser_process(config, initial_url).await?;
180
- if let Some(url) = initial_url {
181
- let trimmed = url.trim();
182
- if !trimmed.is_empty() {
183
- ensure_page_open(config).await?;
184
- super::navigate::navigate(config, trimmed).await?;
185
- }
186
- }
187
- Ok(())
188
- }
189
-
190
- pub(crate) fn build_browser_args(
191
- config: &MintConfig,
192
- endpoint: &str,
193
- initial_url: Option<&str>,
194
- ) -> Result<Vec<String>, String> {
195
- let agent_mode = config
196
- .extra
197
- .get("browserAgentMode")
198
- .and_then(Value::as_str)
199
- .unwrap_or("headless");
200
-
201
- let profile_dir = dirs::config_dir()
202
- .unwrap_or_else(std::env::temp_dir)
203
- .join("mint")
204
- .join("automation-profile");
205
- let profile_arg = format!("--user-data-dir={}", profile_dir.to_string_lossy());
206
-
207
- let mut args = vec![
208
- format!(
209
- "--remote-debugging-port={}",
210
- reqwest::Url::parse(endpoint)
211
- .map_err(|e| e.to_string())?
212
- .port_or_known_default()
213
- .ok_or("Missing debugging port")?
214
- ),
215
- "--no-first-run".to_owned(),
216
- "--no-default-browser-check".to_owned(),
217
- profile_arg,
218
- ];
219
-
220
- if agent_mode == "headless" {
221
- args.push("--headless=new".to_owned());
222
- args.push("--disable-gpu".to_owned());
223
- if cfg!(target_os = "linux") {
224
- args.push("--no-sandbox".to_owned());
225
- args.push("--disable-setuid-sandbox".to_owned());
226
- args.push("--disable-dev-shm-usage".to_owned());
227
- }
228
- }
229
-
230
- let width = config
231
- .extra
232
- .get("browserViewportWidth")
233
- .and_then(Value::as_u64)
234
- .unwrap_or(1440);
235
- let height = config
236
- .extra
237
- .get("browserViewportHeight")
238
- .and_then(Value::as_u64)
239
- .unwrap_or(900);
240
- args.push(format!("--window-size={width},{height}"));
241
-
242
- if let Some(url) = initial_url {
243
- let trimmed = url.trim();
244
- if !trimmed.is_empty() {
245
- args.push(trimmed.to_owned());
246
- }
247
- }
248
-
249
- Ok(args)
250
- }
251
-
252
- #[cfg(test)]
253
- mod tests {
254
- use super::*;
255
-
256
- #[test]
257
- fn build_browser_args_headless_mode() {
258
- let config = MintConfig::default();
259
- let args = build_browser_args(&config, "http://127.0.0.1:9222/json/list", None).unwrap();
260
- assert!(args.contains(&"--headless=new".to_string()));
261
- assert!(args.contains(&"--window-size=1440,900".to_string()));
262
- assert!(
263
- args.iter()
264
- .any(|a| a.starts_with("--remote-debugging-port=9222"))
265
- );
266
- }
267
-
268
- #[test]
269
- fn build_browser_args_headed_mode() {
270
- let mut config = MintConfig::default();
271
- config
272
- .extra
273
- .insert("browserAgentMode".into(), serde_json::json!("headed"));
274
- config
275
- .extra
276
- .insert("browserViewportWidth".into(), serde_json::json!(1920));
277
- config
278
- .extra
279
- .insert("browserViewportHeight".into(), serde_json::json!(1080));
280
-
281
- let args = build_browser_args(
282
- &config,
283
- "http://127.0.0.1:9222/json/list",
284
- Some("https://example.com"),
285
- )
286
- .unwrap();
287
- assert!(!args.contains(&"--headless=new".to_string()));
288
- assert!(args.contains(&"--window-size=1920,1080".to_string()));
289
- assert!(args.contains(&"https://example.com".to_string()));
290
- }
291
- }
@@ -1,20 +0,0 @@
1
- //! Best-effort append-only log for browser automation actions. `mint auto`
2
- //! tails `browser-automation.log` in the CLI to show live progress in the
3
- //! terminal, so every public action in this module reports through here.
4
-
5
- pub(super) fn log_action(action: &str, details: &str) {
6
- if let Some(config_dir) = dirs::config_dir() {
7
- let log_dir = config_dir.join("mint");
8
- let log_file = log_dir.join("browser-automation.log");
9
- let _ = std::fs::create_dir_all(&log_dir);
10
- if let Ok(mut file) = std::fs::OpenOptions::new()
11
- .create(true)
12
- .append(true)
13
- .open(&log_file)
14
- {
15
- use std::io::Write;
16
- let now = chrono::Local::now().format("%Y-%m-%d %H:%M:%S");
17
- let _ = writeln!(file, "[{}] [{}] {}", now, action, details);
18
- }
19
- }
20
- }
@@ -1,31 +0,0 @@
1
- use std::path::Path;
2
-
3
- use super::super::*;
4
-
5
- /// Handles the subset of `execute_tool` actions related to browser.
6
- /// Keeps legacy argument aliases at the orchestration seam; session behavior
7
- /// and browser result verification live in the shared browser module.
8
- pub(in crate::orchestration) async fn execute(
9
- action: &str,
10
- input: &AgentInput,
11
- _root: &Path,
12
- config: &MintConfig,
13
- _chat_id: &str,
14
- _approve_cb: &mut (dyn FnMut(&AgentApproval) -> Result<ApprovalOutcome, String> + Send),
15
- ) -> Result<String, OrchestrationError> {
16
- let mut args =
17
- serde_json::to_value(input).map_err(|e| OrchestrationError::Agent(e.to_string()))?;
18
- // Preserve the established legacy argument aliases.
19
- if input.url.is_empty() && !input.path.is_empty() {
20
- args["url"] = input.path.clone().into();
21
- }
22
- if input.selector.is_empty() && input.element_ref.is_empty() && !input.path.is_empty() {
23
- args["selector"] = input.path.clone().into();
24
- }
25
- if input.text.is_empty() && !input.query.is_empty() {
26
- args["text"] = input.query.clone().into();
27
- }
28
- crate::browser::execute_action(config, action, &args)
29
- .await
30
- .map_err(OrchestrationError::Agent)
31
- }
@@ -1,2 +0,0 @@
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};
@@ -1 +0,0 @@
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};
@@ -1 +0,0 @@
1
- .code-sessions-container{max-width:960px;color:var(--text-main,#ececec);margin:0 auto;padding:32px 24px 64px;font-family:inherit;animation:.2s ease-out codeFadeIn}@keyframes codeFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.code-sessions-header{border-bottom:1px solid var(--border,#ffffff14);flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:24px;padding-bottom:16px;display:flex}.code-header-main{flex-direction:column;gap:4px;display:flex}.code-header-title-row{align-items:center;gap:10px;display:flex}.code-header-title{letter-spacing:-.02em;color:var(--text-main,#fff);align-items:center;gap:8px;margin:0;font-size:1.35rem;font-weight:600;display:flex}.code-header-count{border-radius:var(--radius-xs,6px);background:var(--surface-bg,#ffffff0f);color:var(--text-muted,#8e8e8e);border:1px solid var(--border,#ffffff0f);padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.76rem;font-weight:500}.code-header-subtitle{color:var(--text-muted,#8e8e8e);margin:0;font-size:.86rem}.code-controls-bar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px;display:flex}.code-search-box{flex:280px;position:relative}.code-search-input{background:var(--panel-soft,#121214);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);width:100%;color:var(--text-main,#ececec);outline:none;padding:8px 12px 8px 34px;font-size:.86rem;transition:border-color .15s}.code-search-input:focus{border-color:var(--border-light,#fff3);background:var(--surface-bg,#1a1a1c)}.code-search-input::placeholder{color:var(--placeholder,#71717a)}.code-search-icon{color:var(--placeholder,#71717a);pointer-events:none;position:absolute;top:50%;left:11px;transform:translateY(-50%)}.code-segmented-toggle{background:var(--panel-soft,#121214);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);gap:2px;padding:3px;display:inline-flex}.code-segmented-btn{border-radius:calc(var(--radius-sm,8px) - 2px);color:var(--text-muted,#8e8e8e);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:5px 12px;font-size:.8rem;font-weight:500;transition:all .15s}.code-segmented-btn:hover{color:var(--text-main,#ececec)}.code-segmented-btn.active{background:var(--surface-strong,#2c2c2e);color:var(--text-main,#fff);box-shadow:0 1px 3px #0000004d}.code-sort-select{background:var(--panel-soft,#121214);color:var(--text-muted,#8e8e8e);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);cursor:pointer;outline:none;padding:6px 10px;font-size:.8rem}.code-sort-select:hover,.code-sort-select:focus{color:var(--text-main,#ececec);border-color:var(--border-light,#ffffff29)}.code-header-controls{flex-wrap:wrap;flex:100%;align-items:center;gap:8px;min-width:0;display:flex}.code-header-controls .workspace-selector{max-width:100%}.code-header-controls .workspace-select-btn{min-height:36px}.code-show-all-btn{min-height:36px;margin-bottom:16px}.code-show-all-btn:focus-visible{outline:2px solid var(--interactive-fg,#a1a1aa);outline-offset:2px}.code-sessions-list{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-md,12px);background:var(--panel-soft,#121214);flex-direction:column;display:flex;overflow:hidden}.code-session-row{border-bottom:1px solid var(--border,#ffffff0f);cursor:pointer;grid-template-columns:minmax(140px,200px) 1fr auto;align-items:center;gap:16px;padding:13px 18px;text-decoration:none;transition:background .15s;display:grid}.code-session-row:last-child{border-bottom:none}.code-session-row:hover{background:var(--surface-bg,#ffffff09)}.code-session-row.is-active{background:color-mix(in srgb, var(--accent,#10b981) 6%, transparent)}.code-row-meta{flex-direction:column;gap:4px;min-width:0;display:flex}.code-row-meta-top{align-items:center;gap:7px;display:flex}.code-active-badge{text-transform:none;letter-spacing:.04em;color:var(--interactive-fg);background:color-mix(in srgb, var(--accent,#10b981) 12%, transparent);border:1px solid color-mix(in srgb, var(--accent,#10b981) 25%, transparent);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.65rem;font-weight:600;line-height:1}.code-session-id{color:var(--text-muted,#a1a1aa);letter-spacing:-.01em;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:500}.code-row-meta-sub{color:var(--text-muted,#71717a);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:.74rem;display:flex;overflow:hidden}.code-branch-tag{color:var(--status-success-fg);align-items:center;gap:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;font-weight:500;display:inline-flex}.code-folder-name{color:var(--text-muted,#a1a1aa);text-overflow:ellipsis;overflow:hidden}.code-row-content{flex-direction:column;gap:3px;min-width:0;display:flex}.code-session-title{color:var(--text-main,#fff);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:.92rem;font-weight:500;overflow:hidden}.code-session-snippet{color:var(--text-muted,#71717a);white-space:nowrap;text-overflow:ellipsis;font-family:inherit;font-size:.78rem;overflow:hidden}.code-row-actions{flex-shrink:0;align-items:center;gap:12px;display:flex}.code-metric-turns{color:var(--text-muted,#71717a);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem}.code-metric-time{color:var(--text-muted,#71717a);white-space:nowrap;text-align:right;min-width:65px;font-size:.76rem}.code-resume-chip{background:var(--bg-surface-soft);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-xs,6px);color:var(--text-muted,#a1a1aa);cursor:pointer;align-items:center;gap:5px;padding:3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.72rem;transition:all .15s;display:inline-flex}.code-resume-chip:hover{background:var(--bg-surface-hover);border-color:var(--border-strong);color:var(--text-main,#fff)}.code-icon-btn{color:var(--text-muted,#71717a);border-radius:var(--radius-xs,6px);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;transition:all .15s;display:inline-flex}.code-icon-btn:hover{color:var(--text-main,#fff);background:var(--bg-surface-hover)}.code-icon-btn.destructive:hover{color:var(--hover-delete);background:var(--hover-delete-bg)}.code-open-arrow{color:var(--text-muted,#52525b);align-items:center;transition:transform .15s,color .15s;display:inline-flex}.code-session-row:hover .code-open-arrow{color:var(--text-main,#fff);transform:translate(2px)}.code-empty-terminal{border:1px solid var(--border,#ffffff14);border-radius:var(--radius-md,12px);background:var(--panel-soft,#121214);max-width:520px;margin:32px auto;overflow:hidden}.code-terminal-header{background:var(--bg-surface-subtle);border-bottom:1px solid var(--border,#ffffff0f);align-items:center;gap:6px;padding:10px 14px;display:flex}.code-terminal-dot{background:var(--border-strong);border-radius:50%;width:10px;height:10px}.code-terminal-title{color:var(--text-muted,#71717a);margin-left:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.74rem}.code-terminal-body{text-align:left;padding:24px}.code-terminal-text{color:var(--text-muted,#a1a1aa);margin-bottom:16px;font-size:.86rem;line-height:1.5}.code-terminal-codeblock{background:var(--bg-input);border:1px solid var(--border,#ffffff14);border-radius:var(--radius-sm,8px);color:var(--interactive-fg);justify-content:space-between;align-items:center;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.84rem;display:flex}@media (width<=720px){.code-session-row{grid-template-columns:1fr;gap:10px;padding:14px}.code-row-actions{border-top:1px solid var(--border,#ffffff0a);justify-content:space-between;width:100%;padding-top:6px}}
@@ -1 +0,0 @@
1
- .review-tabs{flex-wrap:wrap;gap:6px;padding:8px 16px;display:flex}.review-tabs button,.review-undo-button,.review-undo-actions button{border:1px solid var(--border,#34343a);background:var(--bg-surface,#141518);color:var(--text-main,#f1f5f9);cursor:pointer;font:inherit;border-radius:6px;padding:6px 10px;font-size:.78rem}.review-tabs button[aria-selected=true]{color:var(--accent,#818cf8);border-color:var(--accent,#818cf8)}.review-tabs button:focus-visible,.review-undo-button:focus-visible,.review-undo-actions button:focus-visible{outline:2px solid var(--accent,#818cf8);outline-offset:2px}.review-undo-button:disabled,.review-undo-actions button:disabled{opacity:.5;cursor:not-allowed}.review-changes-panel{flex-direction:column;flex:1;min-height:0;display:flex}.review-history-panel{color:var(--text-main,#f1f5f9);padding:16px;font-size:.82rem;overflow:auto}.review-history-picker{flex-direction:column;gap:8px;display:flex}.review-history-picker select{border:1px solid var(--border,#34343a);width:100%;min-width:0;color:var(--text-main,#f1f5f9);background:var(--bg-surface,#141518);border-radius:6px;padding:8px}.review-history-details{grid-template-columns:auto minmax(0,1fr);gap:10px 14px;display:grid}.review-history-details dt{color:var(--text-muted,#94a3b8)}.review-history-details dd{overflow-wrap:anywhere;margin:0}.review-feedback{overflow-wrap:anywhere;color:var(--text-main,#f1f5f9);margin:4px 16px;font-size:.8rem}.review-undo-dialog{border:1px solid var(--border,#34343a);background:var(--bg-surface,#141518);width:min(480px,100vw - 40px);max-height:calc(100vh - 40px);color:var(--text-main,#f1f5f9);border-radius:12px;padding:20px;font-size:.85rem;overflow:auto}.review-undo-dialog::backdrop{background:#00000080}.review-undo-dialog h3{margin-top:0}.review-undo-actions{justify-content:flex-end;gap:8px;display:flex}.code-review-file-bar{flex-wrap:wrap}.code-review-page{background:var(--bg-surface,#141518);will-change:transform, opacity;flex-direction:column;flex:auto;min-height:0;animation:.28s cubic-bezier(.16,1,.3,1) forwards codeReviewEntrance;display:flex;overflow:hidden}@keyframes codeReviewEntrance{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.code-review-top-bar{flex:none;justify-content:space-between;align-items:center;padding:10px 16px 4px;display:flex}.code-review-branch-group{align-items:center;gap:8px;display:flex}.code-review-branch-btn{color:var(--text-main,#f1f5f9);cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:4px;padding:2px 4px;font-size:.88rem;font-weight:600;transition:background .15s;display:inline-flex}.code-review-branch-btn:hover{background:var(--bg-surface-hover)}.code-review-chevron-small{color:var(--text-muted,#94a3b8);font-size:.8rem}.code-review-branch-stat-add{color:var(--status-success,#22c55e);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-branch-stat-del{color:var(--status-error,#ef4444);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.82rem;font-weight:600}.code-review-top-actions{align-items:center;gap:4px;display:flex}.code-review-icon-btn,.code-review-close-btn{width:28px;height:28px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;transition:all .15s;display:inline-flex}.code-review-icon-btn:hover,.code-review-close-btn:hover{color:var(--text-main,#f1f5f9);background:var(--bg-surface-hover)}.code-review-close-btn{margin-left:2px;font-size:1.15rem;line-height:1}.code-review-target-branch{align-items:center;padding:0 16px 8px;display:flex}.code-review-target-branch-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:center;gap:4px;padding:2px 4px;font-size:.78rem;transition:color .15s,background .15s;display:inline-flex}.code-review-target-branch-btn:hover{color:var(--text-main,#f1f5f9);background:var(--bg-surface-soft)}.code-review-banner{background:var(--bg-surface-soft);border:1px solid var(--border-subtle);border-radius:10px;justify-content:space-between;align-items:center;gap:12px;margin:4px 16px 10px;padding:8px 14px;animation:.25s cubic-bezier(.16,1,.3,1) forwards codeReviewBannerIn;display:flex}@keyframes codeReviewBannerIn{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:scale(1)}}.code-review-banner-left{color:var(--text-secondary,#cbd5e1);align-items:center;gap:8px;font-size:.78rem;font-weight:500;display:flex}.code-review-banner-info-icon{color:var(--interactive-fg);flex-shrink:0}.code-review-pagination{align-items:center;gap:6px;display:flex}.code-review-page-arrow{background:var(--bg-surface-soft);border:1px solid var(--border-subtle);width:24px;height:24px;color:var(--text-muted,#94a3b8);cursor:pointer;border-radius:5px;justify-content:center;align-items:center;font-size:.95rem;line-height:1;transition:all .15s;display:inline-flex}.code-review-page-arrow:hover:not(:disabled){background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-page-arrow:disabled{opacity:.3;cursor:not-allowed}.code-review-split{border-top:1px solid var(--border-subtle);flex-direction:row;flex:auto;min-height:0;display:flex;position:relative;overflow:hidden}.code-review-split.is-resizing{-webkit-user-select:none;user-select:none;cursor:col-resize}.code-review-split.is-resizing *{pointer-events:none;-webkit-user-select:none!important;user-select:none!important}.code-review-split.is-resizing .code-review-resizer{pointer-events:auto}.code-review-diff-pane{flex-direction:column;flex:1 1 0;min-width:0;display:flex;overflow:auto}.code-review-resizer{z-index:10;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;outline:none;flex:0 0 10px;justify-content:center;align-items:center;margin:0 -5px;transition:background-color .15s;display:flex;position:relative}.code-review-resizer-line{background:var(--border-subtle);width:1px;transition:background-color .15s,box-shadow .15s,width .15s;position:absolute;top:0;bottom:0;left:4px}.code-review-resizer:hover .code-review-resizer-line,.code-review-resizer.is-dragging .code-review-resizer-line{background:var(--accent);box-shadow:0 0 8px var(--accent-glow);width:2px}.code-review-resizer-handle{background:var(--border-strong);z-index:2;border-radius:2px;width:4px;height:26px;transition:all .15s}.code-review-resizer:hover .code-review-resizer-handle,.code-review-resizer.is-dragging .code-review-resizer-handle{background:var(--accent-hover);height:38px;box-shadow:0 0 6px var(--accent-glow)}.code-review-resizer.is-collapsed{cursor:pointer;flex:0 0 8px;margin:0}.code-review-resizer.is-collapsed .code-review-resizer-line{background:var(--border-default);left:3px}.code-review-file-view{flex-direction:column;flex:1;animation:.2s cubic-bezier(.16,1,.3,1) forwards codeReviewDiffSwap;display:flex}@keyframes codeReviewDiffSwap{0%{opacity:.4;transform:translate(-4px)}to{opacity:1;transform:translate(0)}}.code-review-file-bar{background:var(--bg-surface-soft);border-bottom:1px solid var(--border-subtle);z-index:2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);align-items:center;gap:8px;padding:8px 16px;font-size:.78rem;display:flex;position:sticky;top:0}[data-surface=opaque] .code-review-file-bar{background:var(--bg-surface,#141518);-webkit-backdrop-filter:none}.code-review-file-bar-status{border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:700;line-height:1.2}.code-review-file-bar-status.is-modified{color:var(--status-info-fg);background:var(--status-info-bg)}.code-review-file-bar-status.is-created{color:var(--status-success-fg);background:var(--status-success-bg)}.code-review-file-bar-path{color:var(--text-main,#f1f5f9);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.code-review-file-bar-stat-add{color:var(--status-success,#22c55e);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-file-bar-stat-del{color:var(--status-error,#ef4444);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.code-review-code-container{min-width:0;padding:6px 0 20px;font-family:Fira Code,Cascadia Code,Consolas,monospace;font-size:.78rem;line-height:1.55;overflow:auto visible}.code-review-hunk-block{margin-bottom:8px}.code-review-line{align-items:stretch;width:max-content;min-width:100%;min-height:22px;padding:0 4px;transition:background-color .12s;display:flex}.code-review-line.is-add{background:var(--diff-add-bg);border-left:2px solid var(--diff-add-border)}.code-review-line.is-del{background:var(--diff-del-bg);border-left:2px solid var(--diff-del-border)}.code-review-gutter{text-align:right;width:38px;color:var(--text-muted,#64748b);-webkit-user-select:none;user-select:none;flex-shrink:0;padding-right:12px}.code-review-line.is-add .code-review-gutter{color:var(--diff-add-gutter)}.code-review-line.is-del .code-review-gutter{color:var(--diff-del-gutter)}.code-review-sign{text-align:center;width:14px;color:var(--text-muted,#64748b);-webkit-user-select:none;user-select:none;flex-shrink:0}.code-review-line.is-add .code-review-sign{color:var(--diff-add-border)}.code-review-line.is-del .code-review-sign{color:var(--diff-del-border)}.code-review-code-text{color:var(--text-main,#e2e8f0);font:inherit;white-space:pre;word-break:normal;padding-left:4px;padding-right:16px}.code-review-line.is-add .code-review-code-text{color:var(--diff-add-text)}.code-review-line.is-del .code-review-code-text{color:var(--diff-del-text)}.code-review-empty-diff,.code-review-empty-state{color:var(--text-muted,#94a3b8);padding:24px;font-size:.8rem}.code-review-tree-pane{border-left:1px solid var(--border-subtle);background:var(--bg-surface-soft);flex-direction:column;flex:none;min-width:0;display:flex;overflow:hidden}[data-surface=opaque] .code-review-tree-pane{background:var(--bg-surface-raised,var(--bg-surface,#141518))}.code-review-tree-collapse-btn{width:22px;height:22px;color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:0;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;font-size:1rem;line-height:1;transition:all .15s;display:inline-flex}.code-review-tree-collapse-btn:hover{background:var(--bg-surface-hover);color:var(--text-main,#f1f5f9)}.code-review-icon-btn.is-active{color:var(--interactive-fg);background:var(--accent-subtle)}.code-review-search-wrap{border-bottom:1px solid var(--border-subtle);align-items:center;gap:8px;padding:10px 12px;display:flex}.code-review-search-icon{color:var(--text-muted,#94a3b8);flex-shrink:0}.code-review-search-input{background:var(--bg-input);border:1px solid var(--border-default);width:100%;color:var(--text-main,#f1f5f9);border-radius:8px;outline:none;padding:5px 10px;font-size:.76rem;transition:border-color .15s,background .15s}.code-review-search-input:focus{border-color:var(--accent-border);background:var(--bg-surface-hover)}.code-review-tree-list{flex-direction:column;flex:1;gap:2px;padding:8px 6px;display:flex;overflow-y:auto}.code-review-tree-folder{flex-direction:column;display:flex}.code-review-tree-folder-btn{width:100%;color:var(--text-secondary,#cbd5e1);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;padding-top:5px;padding-bottom:5px;padding-right:8px;font-size:.78rem;font-weight:500;transition:background-color .12s;display:flex}.code-review-tree-folder-btn:hover{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-chevron{width:12px;color:var(--text-muted,#94a3b8);flex-shrink:0;font-size:.85rem}.code-review-folder-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.code-review-mod-dot{color:var(--status-warning);flex-shrink:0;margin-left:auto;font-size:1rem;line-height:1}.code-review-tree-sub{flex-direction:column;gap:2px;display:flex}.code-review-tree-file{width:100%;color:var(--text-secondary,#cbd5e1);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;padding-top:6px;padding-bottom:6px;padding-right:8px;font-size:.76rem;transition:all .15s cubic-bezier(.16,1,.3,1);display:flex}.code-review-tree-file:hover{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-tree-file.is-selected{background:var(--accent-subtle);border-color:var(--accent-border);color:var(--text-primary);box-shadow:var(--shadow-sm)}.code-review-tree-icon{flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex;position:relative}.code-review-tree-icon.material-icon img{object-fit:contain;pointer-events:none;-webkit-user-select:none;user-select:none;flex:none;width:16px;height:16px;display:block}.code-review-file-status-icon{border-radius:4px;flex-shrink:0;margin-left:auto;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.7rem;font-weight:700;line-height:1.2}.code-review-file-status-icon.is-modified{color:var(--status-info-fg);background:var(--status-info-bg)}.code-review-file-status-icon.is-created{color:var(--status-success-fg);background:var(--status-success-bg)}.code-review-tree-file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.code-review-branch-group .git-branch-selector{flex:none;min-width:0;max-width:none}.code-review-branch-group .git-branch-trigger{background:var(--bg-surface-soft);border:1px solid var(--border-default);color:var(--text-main,#f1f5f9);cursor:pointer;border-radius:6px;align-items:center;gap:7px;max-width:260px;height:28px;min-height:28px;padding:4px 10px;font-size:.84rem;font-weight:500;transition:all .15s;display:inline-flex}.code-review-branch-group .git-branch-trigger:hover{background:var(--bg-surface-hover);border-color:var(--border-strong)}.code-review-branch-group .git-branch-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:180px;color:var(--text-main,#f1f5f9);font-size:.82rem;font-weight:600;line-height:1.2;overflow:hidden}.code-review-branch-group .git-branch-icon{color:var(--interactive-fg);flex-shrink:0}.code-review-branch-group .git-branch-dirty{background:var(--accent,#10b981);border-radius:50%;flex:0 0 6px;width:6px;height:6px}.code-review-branch-group .git-branch-chevron{color:var(--text-muted,#94a3b8);flex-shrink:0}.code-review-branch-group .git-branch-menu{z-index:200}.code-review-branch-static{color:var(--text-main,#f1f5f9);font-size:.85rem;font-weight:600}.code-review-spin{animation:1s linear infinite codeReviewSpin}@keyframes codeReviewSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.code-review-clean-state{text-align:center;color:var(--text-muted,#94a3b8);flex-direction:column;flex:1;justify-content:center;align-items:center;padding:60px 24px;display:flex}.code-review-clean-state h3{color:var(--text-main,#f1f5f9);margin:14px 0 6px;font-size:1.05rem;font-weight:600}.code-review-clean-state p{margin:0 0 16px;font-size:.82rem}.code-review-clean-refresh-btn{background:var(--bg-surface-soft);border:1px solid var(--border-default);color:var(--text-secondary,#cbd5e1);cursor:pointer;border-radius:8px;align-items:center;gap:6px;padding:6px 14px;font-size:.78rem;font-weight:500;transition:all .15s;display:inline-flex}.code-review-clean-refresh-btn:hover{background:var(--bg-surface-hover);color:var(--text-primary)}.code-review-scope-group{align-items:center;gap:4px;display:flex}.code-review-scope-btn{background:var(--bg-surface-soft);border:1px solid var(--border-subtle);color:var(--text-muted,#94a3b8);cursor:pointer;border-radius:5px;padding:3px 8px;font-size:.74rem;transition:all .15s}.code-review-scope-btn:hover{color:var(--text-primary);background:var(--bg-surface-hover)}.code-review-scope-btn.is-active{background:var(--accent-subtle);border-color:var(--accent-border);color:var(--interactive-fg);font-weight:600}
@@ -1,2 +0,0 @@
1
- import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{I as i,j as a}from"./index-BmpulIkg.js";import{n as o,t as ee}from"./SelectField-DXBQtrUK.js";import{a as s,g as te,h as c,i as l,m as u,o as ne,p as re,r as d}from"./MintDashboard-COw_xol7.js";var f=t((()=>{}));function p(e){switch(e.kind){case`edit`:return e.backup?`Restore the saved content from before this edit.`:`Move the file created by this edit to Trash.`;case`create`:return`Move this created file or folder to Trash.`;case`trash`:return`Restore this file or folder to its original location.`;case`move`:return`Move ${e.destination||e.path} back to ${e.path}.`;default:return e.label}}function m({entry:e}){return(0,b.jsxs)(`dl`,{className:`review-history-details`,children:[(0,b.jsx)(`dt`,{children:`File`}),(0,b.jsx)(`dd`,{children:e.path}),(0,b.jsx)(`dt`,{children:`Action`}),(0,b.jsx)(`dd`,{children:e.label.replace(/^Undo /,``)}),e.destination&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`dt`,{children:`Destination`}),(0,b.jsx)(`dd`,{children:e.destination})]}),(0,b.jsx)(`dt`,{children:`Undo will`}),(0,b.jsx)(`dd`,{children:p(e)})]})}function h({entry:e,busy:t,error:n,onCancel:r,onConfirm:i}){let a=(0,y.useRef)(null);return(0,y.useEffect)(()=>{let e=a.current;return e?.showModal(),()=>e?.close()},[]),(0,b.jsxs)(`dialog`,{ref:a,className:`review-undo-dialog`,"aria-labelledby":`review-undo-title`,onCancel:e=>{e.preventDefault(),t||r()},children:[(0,b.jsx)(`h3`,{id:`review-undo-title`,children:`Confirm Undo`}),(0,b.jsx)(m,{entry:e}),(0,b.jsx)(`p`,{children:`Undo is refused if the file has changed since this action or the destination is occupied.`}),n&&(0,b.jsx)(`p`,{role:`alert`,children:n}),(0,b.jsxs)(`div`,{className:`review-undo-actions`,children:[(0,b.jsx)(`button`,{type:`button`,autoFocus:!0,disabled:t,onClick:r,children:`Cancel`}),(0,b.jsx)(`button`,{type:`button`,disabled:t,onClick:i,children:t?`Undoing…`:`Confirm Undo`})]})]})}function g(e){return e?e.replace(/\n$/,``).split(`
2
- `):[]}function _(e,t){let n=e.replace(/\\/g,`/`),r=t?.replace(/\\/g,`/`).replace(/\/+$/,``),i=/^(\/|[a-z]:\/)/i.test(n),a=n;if(r&&i){let e=/^[a-z]:\//i.test(r)||r.startsWith(`//`),t=`${r}/`;if(!(e?n.toLowerCase().startsWith(t.toLowerCase()):n.startsWith(t)))return null;a=n.slice(t.length)}else if(!r&&i)return n;let o=[];for(let e of a.split(`/`))if(e&&e!==`.`){if(e===`..`){if(!o.length)return null;o.pop()}else o.push(e)}return o.length?o.join(`/`):null}function ie(e){let t={};for(let n of e){let e=n.path.split(`/`).filter(Boolean),r=t,i=``;for(let t=0;t<e.length;t++){let a=e[t];i=i?`${i}/${a}`:a;let o=t===e.length-1;r[a]||(r[a]={name:a,path:i,isDir:!o,children:o?void 0:{},change:o?n:void 0}),o||(r=r[a].children)}}function n(e){return Object.values(e).map(e=>e.isDir&&e.children?{...e,children:n(e.children)}:e)}return n(t)}function v({changes:e,workspacePath:t,onBack:n,onOpenFiles:r}){let a=(0,y.useRef)(t);a.current=t;let o=(0,y.useRef)(0),[c,l]=(0,y.useState)(`changes`),[u,f]=(0,y.useState)(0),[p,v]=(0,y.useState)(``),[x,S]=(0,y.useState)(null),[C,w]=(0,y.useState)(``),[T,E]=(0,y.useState)(new Set),[D,ae]=(0,y.useState)([]),[O,k]=(0,y.useState)(!1),[oe,se]=(0,y.useState)(null),A=(0,y.useMemo)(()=>(e||[]).flatMap(e=>{let n=_(e.path,t);return n?[{...e,path:n}]:[]}),[e,t]),j=A.length>0,[M,N]=(0,y.useState)(j?`agent`:`workspace`),[P,ce]=(0,y.useState)(``),[le,ue]=(0,y.useState)({}),F=(0,y.useCallback)(async()=>{if(!t)return;let e=++o.current;f(e=>e+1),k(!0);try{let[n,r]=await Promise.all([i.getWorkspaceGitDiff(t),i.getGitBranchInfo(t).catch(()=>null)]);if(a.current!==t||e!==o.current)return;ae((n||[]).flatMap(e=>{let n=_(e.path,t);return n?[{...e,path:n}]:[]})),r&&se(r)}catch(e){console.error(`Failed to load workspace git diff:`,e)}finally{a.current===t&&e===o.current&&k(!1)}},[t]);(0,y.useEffect)(()=>{F()},[F]);let I=te(t||``,u,()=>{F()});(0,y.useEffect)(()=>{S(null),v(``),w(``),E(new Set),ae([])},[t]);let de=async()=>{if(x&&x.root===t&&await I.undo(x.entry.id)){if(a.current!==x.root)return;E(e=>new Set([...e,_(x.entry.path,x.root)||``,_(x.entry.destination||``,x.root)||``])),N(`workspace`),w(`Undone: ${x.entry.label.replace(/^Undo /,``)}`),S(null),F()}},L=(0,y.useMemo)(()=>M===`agent`&&j?A.filter(e=>!T.has(e.path)):D.length>0?D:j?A.filter(e=>!T.has(e.path)):[],[M,j,A,D,T]),R=(0,y.useMemo)(()=>{if(!P.trim())return L;let e=P.toLowerCase();return L.filter(t=>t.path.toLowerCase().includes(e))},[L,P]),[z,B]=(0,y.useState)(R[0]?.path??``);(0,y.useEffect)(()=>{R.length>0&&!R.some(e=>e.path===z)&&B(R[0].path)},[R,z]);let V=Math.max(0,R.findIndex(e=>e.path===z)),H=R[V]||R[0],U=I.entries.find(e=>e.id===p)||I.entries[0],W=H&&I.entries.find(e=>_(e.path,t)===H.path||_(e.destination||``,t)===H.path),G=!!(W&&W.id===I.entries[0]?.id),K=e=>{t&&S({root:t,entry:e})},fe=L.reduce((e,t)=>e+t.additions,0),pe=L.reduce((e,t)=>e+t.deletions,0),me=(0,y.useMemo)(()=>ie(R),[R]),q=(0,y.useRef)(null),[J,Y]=(0,y.useState)(250),[X,Z]=(0,y.useState)(!1),[Q,$]=(0,y.useState)(!1),he=e=>{if(e.pointerType===`mouse`&&e.button!==0)return;e.preventDefault(),Z(!0);let t=e.clientX,n=Q?0:J,r=q.current?.getBoundingClientRect().width??600,i=e=>{let i=t-e.clientX,a=n+i;if(a<70)$(!0);else{$(!1);let e=Math.max(100,r-100);Y(Math.round(Math.max(100,Math.min(e,a))))}},a=()=>{Z(!1),window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a)};window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a,{once:!0})},ge=()=>{Q?($(!1),Y(250)):Y(J===250?320:250)},_e=e=>{e.key===`ArrowLeft`?($(!1),Y(e=>Math.min(500,e+20))):e.key===`ArrowRight`?Y(e=>e<=110?($(!0),100):Math.max(100,e-20)):(e.key===`Enter`||e.key===` `)&&ge()},ve=e=>{ue(t=>({...t,[e]:!t[e]}))},ye=()=>{V>0&&B(R[V-1].path)},be=()=>{V<R.length-1&&B(R[V+1].path)},xe=(e,t=0)=>e.map(e=>{if(e.isDir){let n=!!le[e.path],r=ne(e.name,!n)||(n?`data:image/svg+xml,%3csvg%20viewBox='0%200%2016%2016'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='m6.922%203.768-.644-.536A1%201%200%200%200%205.638%203H2a1%201%200%200%200-1%201v8a1%201%200%200%200%201%201h12a1%201%200%200%200%201-1V5a1%201%200%200%200-1-1H7.562a1%201%200%200%201-.64-.232'%20fill='%2390a4ae'%20/%3e%3c/svg%3e`:`data:image/svg+xml,%3csvg%20viewBox='0%200%2016%2016'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M14.483%206H4.721a1%201%200%200%200-.949.684L2%2012V5h12a1%201%200%200%200-1-1H7.562a1%201%200%200%201-.64-.232l-.644-.536A1%201%200%200%200%205.638%203H2a1%201%200%200%200-1%201v8a1%201%200%200%200%201%201h11l2.403-5.606A1%201%200%200%200%2014.483%206'%20fill='%2390a4ae'%20/%3e%3c/svg%3e`);return(0,b.jsxs)(`div`,{className:`code-review-tree-folder`,children:[(0,b.jsxs)(`button`,{type:`button`,className:`code-review-tree-folder-btn`,style:{paddingLeft:`${t*14+10}px`},onClick:()=>ve(e.path),"aria-expanded":!n,children:[(0,b.jsx)(`span`,{className:`code-review-chevron`,children:n?`›`:`⌄`}),(0,b.jsx)(`span`,{className:`code-review-tree-icon material-icon folder`,"aria-hidden":`true`,children:r&&(0,b.jsx)(`img`,{src:r,alt:``,draggable:!1})}),(0,b.jsx)(`span`,{className:`code-review-folder-name`,children:e.name}),(0,b.jsx)(`span`,{className:`code-review-mod-dot`,title:`Modified in this folder`,"aria-hidden":`true`,children:`•`})]}),!n&&e.children&&(0,b.jsx)(`div`,{className:`code-review-tree-sub`,children:xe(e.children,t+1)})]},e.path)}let n=e.path===z,r=d(e.name),i=s(e.name,r)||`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M0%200h24v24H0z'/%3e%3cpath%20fill='%2342a5f5'%20d='M8%2016h8v2H8zm0-4h8v2H8zm6-10H6c-1.1%200-2%20.9-2%202v16c0%201.1.89%202%201.99%202H18c1.1%200%202-.9%202-2V8zm4%2018H6V4h7v5h5z'/%3e%3c/svg%3e`,a=!!e.change?.created;return(0,b.jsxs)(`button`,{type:`button`,className:`code-review-tree-file${n?` is-selected`:``}`,style:{paddingLeft:`${t*14+12}px`},onClick:()=>B(e.path),title:e.path,children:[(0,b.jsx)(`span`,{className:`code-review-tree-icon material-icon file`,"aria-hidden":`true`,children:i&&(0,b.jsx)(`img`,{src:i,alt:``,draggable:!1})}),(0,b.jsx)(`span`,{className:`code-review-tree-file-name`,children:e.name}),(0,b.jsx)(`span`,{className:`code-review-file-status-icon ${a?`is-created`:`is-modified`}`,"aria-hidden":`true`,children:a?`A`:`M`})]},e.path)});return(0,b.jsxs)(`main`,{className:`code-review-page`,children:[(0,b.jsxs)(`header`,{className:`code-review-top-bar`,children:[(0,b.jsxs)(`div`,{className:`code-review-branch-group`,children:[t?(0,b.jsx)(re,{workspacePath:t,onBranchChanged:F}):(0,b.jsx)(`span`,{className:`code-review-branch-static`,children:oe?.currentBranch||`Review`}),(0,b.jsxs)(`span`,{className:`code-review-branch-stat-add`,children:[`+`,fe.toLocaleString()]}),(0,b.jsxs)(`span`,{className:`code-review-branch-stat-del`,children:[`-`,pe.toLocaleString()]})]}),(0,b.jsxs)(`div`,{className:`code-review-top-actions`,children:[(0,b.jsx)(`button`,{type:`button`,className:`code-review-icon-btn`,onClick:F,disabled:O,title:`Refresh changes`,"aria-label":`Refresh changes`,children:(0,b.jsx)(`svg`,{className:O?`code-review-spin`:``,width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})}),r&&(0,b.jsx)(`button`,{type:`button`,className:`code-review-icon-btn`,onClick:r,title:`Open workspace files (Ctrl+P)`,"aria-label":`Open workspace files`,children:(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`path`,{d:`M3 6h7l2 2h9v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z`}),(0,b.jsx)(`path`,{d:`M3 6v12`})]})}),(0,b.jsx)(`button`,{type:`button`,className:`code-review-icon-btn ${Q?``:`is-active`}`,onClick:()=>$(e=>!e),"aria-label":Q?`Show file tree`:`Hide file tree`,title:Q?`Show file tree`:`Hide file tree`,children:(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`rect`,{x:`3`,y:`3`,width:`18`,height:`18`,rx:`2`}),(0,b.jsx)(`path`,{d:`M15 3v18`})]})}),(0,b.jsx)(`button`,{type:`button`,className:`code-review-close-btn`,onClick:n,"aria-label":`Close review`,title:`Close review`,children:`×`})]})]}),(0,b.jsxs)(`div`,{className:`review-tabs`,role:`tablist`,"aria-label":`Review views`,children:[(0,b.jsx)(`button`,{type:`button`,role:`tab`,id:`review-changes-tab`,"aria-selected":c===`changes`,"aria-controls":`review-changes`,onClick:()=>l(`changes`),children:`Changes`}),(0,b.jsxs)(`button`,{type:`button`,role:`tab`,id:`review-history-tab`,"aria-selected":c===`history`,"aria-controls":`review-history`,onClick:()=>l(`history`),children:[`File history (`,I.entries.length,`)`]})]}),I.error&&(0,b.jsx)(`p`,{className:`review-feedback`,role:`alert`,children:I.error}),C&&(0,b.jsx)(`p`,{className:`review-feedback`,role:`status`,children:C}),c===`history`&&(0,b.jsx)(`section`,{id:`review-history`,role:`tabpanel`,"aria-labelledby":`review-history-tab`,className:`review-history-panel`,children:t?I.loading&&I.entries.length===0?(0,b.jsx)(`p`,{children:`Loading file history…`}):I.entries.length===0?(0,b.jsx)(`p`,{children:`No saved file history in this workspace.`}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`label`,{className:`review-history-picker`,children:[`Saved action`,(0,b.jsx)(ee,{"aria-label":`Saved action`,value:U?.id||``,onValueChange:e=>v(e),children:I.entries.map((e,t)=>(0,b.jsxs)(`option`,{value:e.id,children:[t===0?`Latest · `:``,e.label.replace(/^Undo /,``)]},e.id))})]}),U&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(m,{entry:U}),(0,b.jsx)(`button`,{type:`button`,className:`review-undo-button`,disabled:I.busy||U.id!==I.entries[0]?.id,onClick:()=>K(U),children:`Undo action…`}),U.id!==I.entries[0]?.id&&(0,b.jsx)(`p`,{children:`Undo newer actions first. History is restored in reverse order.`})]})]}):(0,b.jsx)(`p`,{children:`Select a workspace to view file history.`})}),c===`changes`&&(0,b.jsxs)(`div`,{id:`review-changes`,role:`tabpanel`,"aria-labelledby":`review-changes-tab`,className:`review-changes-panel`,children:[(0,b.jsxs)(`div`,{className:`code-review-banner`,children:[(0,b.jsxs)(`div`,{className:`code-review-banner-left`,children:[(0,b.jsxs)(`svg`,{className:`code-review-banner-info-icon`,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`path`,{d:`M12 16v-4M12 8h.01`})]}),j&&D.length>0?(0,b.jsxs)(`div`,{className:`code-review-scope-group`,children:[(0,b.jsxs)(`button`,{type:`button`,className:`code-review-scope-btn ${M===`workspace`?`is-active`:``}`,onClick:()=>N(`workspace`),children:[`Workspace Git (`,D.length,`)`]}),(0,b.jsxs)(`button`,{type:`button`,className:`code-review-scope-btn ${M===`agent`?`is-active`:``}`,onClick:()=>N(`agent`),children:[`AI Edits (`,A.length,`)`]})]}):(0,b.jsx)(`span`,{children:O?`Scanning workspace Git changes...`:R.length>0?`${R.length} changed file${R.length===1?``:`s`} in workspace`:`Working tree is clean · No uncommitted changes`})]}),R.length>1&&(0,b.jsxs)(`div`,{className:`code-review-pagination`,children:[(0,b.jsx)(`button`,{type:`button`,className:`code-review-page-arrow`,onClick:ye,disabled:V<=0,"aria-label":`Previous file`,title:`Previous file`,children:`‹`}),(0,b.jsx)(`button`,{type:`button`,className:`code-review-page-arrow`,onClick:be,disabled:V>=R.length-1,"aria-label":`Next file`,title:`Next file`,children:`›`})]})]}),(0,b.jsxs)(`div`,{className:`code-review-split ${X?`is-resizing`:``}`,ref:q,children:[(0,b.jsx)(`section`,{className:`code-review-diff-pane`,"aria-label":`Diff viewer`,children:H?(0,b.jsxs)(`article`,{className:`code-review-file-view`,children:[(0,b.jsxs)(`div`,{className:`code-review-file-bar`,children:[(0,b.jsx)(`span`,{className:`code-review-tree-icon material-icon file`,"aria-hidden":`true`,children:(0,b.jsx)(`img`,{src:s(H.path.split(`/`).pop()||``,d(H.path))||`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M0%200h24v24H0z'/%3e%3cpath%20fill='%2342a5f5'%20d='M8%2016h8v2H8zm0-4h8v2H8zm6-10H6c-1.1%200-2%20.9-2%202v16c0%201.1.89%202%201.99%202H18c1.1%200%202-.9%202-2V8zm4%2018H6V4h7v5h5z'/%3e%3c/svg%3e`,alt:``,draggable:!1})}),(0,b.jsx)(`span`,{className:`code-review-file-bar-status ${H.created?`is-created`:`is-modified`}`,children:H.created?`A`:`M`}),(0,b.jsx)(`span`,{className:`code-review-file-bar-path`,title:H.path,children:H.path}),(0,b.jsx)(`button`,{type:`button`,className:`review-undo-button`,disabled:!G||I.busy,title:G?W?.label:W?`Undo newer workspace actions first in File history.`:`No saved undo action for this file.`,onClick:()=>W&&K(W),children:`Undo edit…`}),(0,b.jsxs)(`span`,{className:`code-review-file-bar-stat-add`,children:[`+`,H.additions]}),(0,b.jsxs)(`span`,{className:`code-review-file-bar-stat-del`,children:[`-`,H.deletions]})]}),(0,b.jsx)(`div`,{className:`code-review-code-container`,children:H.hunks&&H.hunks.length>0?H.hunks.map((e,t)=>{let n=g(e.oldText),r=g(e.newText),i=1;return(0,b.jsxs)(`div`,{className:`code-review-hunk-block`,children:[n.map((e,t)=>(0,b.jsxs)(`div`,{className:`code-review-line is-del`,children:[(0,b.jsx)(`span`,{className:`code-review-gutter`,children:i++}),(0,b.jsx)(`span`,{className:`code-review-sign`,children:`−`}),(0,b.jsx)(`code`,{className:`code-review-code-text`,children:e||` `})]},`del-${t}`)),r.map((e,t)=>(0,b.jsxs)(`div`,{className:`code-review-line is-add`,children:[(0,b.jsx)(`span`,{className:`code-review-gutter`,children:i++}),(0,b.jsx)(`span`,{className:`code-review-sign`,children:`+`}),(0,b.jsx)(`code`,{className:`code-review-code-text`,children:e||` `})]},`add-${t}`))]},`${H.path}-hunk-${t}`)}):(0,b.jsx)(`div`,{className:`code-review-empty-diff`,children:`No diff hunks available for this file.`})})]},H.path):(0,b.jsxs)(`div`,{className:`code-review-clean-state`,children:[(0,b.jsxs)(`svg`,{width:`44`,height:`44`,viewBox:`0 0 24 24`,fill:`none`,stroke:`var(--status-success, #22c55e)`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,b.jsx)(`path`,{d:`M22 11.08V12a10 10 0 1 1-5.93-9.14`}),(0,b.jsx)(`polyline`,{points:`22 4 12 14.01 9 11.01`})]}),(0,b.jsx)(`h3`,{children:`Working tree is clean`}),(0,b.jsx)(`p`,{children:`No uncommitted changes found in this workspace.`}),(0,b.jsx)(`button`,{type:`button`,className:`code-review-clean-refresh-btn`,onClick:F,children:`↻ Refresh Git status`})]})}),R.length>0&&(0,b.jsxs)(`div`,{className:`code-review-resizer ${X?`is-dragging`:``} ${Q?`is-collapsed`:``}`,onPointerDown:he,onDoubleClick:ge,onKeyDown:_e,role:`separator`,tabIndex:0,"aria-orientation":`vertical`,"aria-valuenow":Q?0:J,"aria-label":`Resize panel divider`,title:Q?`Drag or double-click to expand file list`:`Drag to resize file list / Double click to reset`,children:[(0,b.jsx)(`div`,{className:`code-review-resizer-line`}),(0,b.jsx)(`div`,{className:`code-review-resizer-handle`})]}),R.length>0&&!Q&&(0,b.jsxs)(`aside`,{className:`code-review-tree-pane`,style:{width:`${J}px`},"aria-label":`Changed files tree`,children:[(0,b.jsxs)(`div`,{className:`code-review-search-wrap`,children:[(0,b.jsxs)(`svg`,{className:`code-review-search-icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`path`,{d:`m21 21-4.3-4.3`})]}),(0,b.jsx)(`input`,{type:`text`,className:`code-review-search-input`,placeholder:`Filter files...`,value:P,onChange:e=>ce(e.target.value),spellCheck:!1}),(0,b.jsx)(`button`,{type:`button`,className:`code-review-tree-collapse-btn`,onClick:()=>$(!0),title:`Collapse file list`,"aria-label":`Collapse file list`,children:`›`})]}),(0,b.jsx)(`div`,{className:`code-review-tree-list`,role:`tree`,children:xe(me)})]})]})]}),x&&x.root===t&&(0,b.jsx)(h,{entry:x.entry,busy:I.busy,error:I.error,onCancel:()=>S(null),onConfirm:()=>{de()}})]})}var y,b;t((()=>{o(),y=e(n()),a(),c(),u(),l(),f(),b=r()}))();export{m as HistoryDetails,h as UndoConfirmation,v as default,p as undoDescription};
@@ -1 +0,0 @@
1
- import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{L as i,mt as a}from"./index-BmpulIkg.js";function o(e){return e?e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)?e:e.startsWith(`/api/`)?`${typeof window<`u`&&window.location.port===`9000`?`http://localhost:3000`:typeof window<`u`?window.location.origin:``}${e}`:e:``}function s({url:e,single:t}){let[n,r]=(0,l.useState)(!1),i=o(e);return n||!i?null:(0,u.jsx)(`div`,{style:{position:`relative`,display:`block`,borderRadius:`10px`,overflow:`hidden`,aspectRatio:t?void 0:`1 / 1`,background:`var(--surface-strong)`,border:`1px solid var(--border)`},children:(0,u.jsx)(`img`,{src:i,alt:`Generated`,loading:`lazy`,onError:()=>r(!0),style:{width:`100%`,height:t?`auto`:`100%`,maxHeight:t?`420px`:void 0,objectFit:`cover`,display:`block`}})})}function c({data:e}){let t=(e?.images??[]).filter(e=>e?.url),n=`var(--text-muted)`;return(0,u.jsxs)(`div`,{style:{background:`var(--bg-surface-soft)`,color:`var(--text-primary)`,borderRadius:`12px`,padding:`16px 20px`,margin:`12px 0`,boxShadow:`var(--shadow-md)`,border:`1px solid var(--border-subtle)`,fontFamily:`system-ui, -apple-system, sans-serif`},children:[(0,u.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,marginBottom:`12px`},children:[(0,u.jsx)(a,{size:16,strokeWidth:2,style:{opacity:.9,color:n}}),(0,u.jsx)(`span`,{style:{fontSize:`11px`,fontWeight:700,letterSpacing:`0.8px`,color:n},children:`IMAGE GENERATED`}),e?.model&&(0,u.jsxs)(`span`,{style:{fontSize:`11px`,color:`var(--text-muted)`},children:[e.model,e.provider?` · ${e.provider}`:``]})]}),t.length===0?(0,u.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-muted)`},children:`No image returned.`}):t.length===1?(0,u.jsx)(s,{url:t[0].url,single:!0}):(0,u.jsx)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fill, minmax(140px, 1fr))`,gap:`8px`},children:t.map((e,t)=>(0,u.jsx)(s,{url:e.url,single:!1},`${e.url}-${t}`))}),e?.prompt&&(0,u.jsxs)(`div`,{style:{marginTop:`10px`,fontSize:`13px`,lineHeight:1.4,color:`var(--text-secondary)`},children:[`“`,e.prompt,`”`]})]})}var l,u;t((()=>{l=e(n()),i(),u=r()}))();export{c as default};
@@ -1 +0,0 @@
1
- import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{L as i,Sn as a}from"./index-BmpulIkg.js";import{A as o,O as s}from"./MintDashboard-COw_xol7.js";function c({image:e}){let[t,n]=(0,u.useState)(!1),r=o(e.thumbnailUrl||e.imageUrl),[i,a]=(0,u.useState)(r),s=/^https?:\/\//.test(e.sourceUrl)?e.sourceUrl:e.imageUrl;return(0,d.jsxs)(`article`,{style:{display:`flex`,flex:`0 0 116px`,flexDirection:`column`,borderRadius:`10px`,overflow:`hidden`,background:`var(--surface-strong)`,border:`1px solid var(--border)`},children:[(0,d.jsx)(`a`,{href:s,target:`_blank`,rel:`noopener noreferrer`,title:e.title,style:{display:`block`,width:`100%`,aspectRatio:`1 / 1`,flexShrink:0,textDecoration:`none`},children:t||!i?(0,d.jsx)(`span`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,padding:`12px`,boxSizing:`border-box`,color:`var(--text-muted, #94a3b8)`,fontSize:`11px`,lineHeight:1.4,textAlign:`center`},children:`Preview unavailable · Open source`}):(0,d.jsx)(`img`,{src:i,alt:e.title,loading:`lazy`,referrerPolicy:`no-referrer`,onError:()=>{let t=o(e.imageUrl);i!==t&&t?a(t):n(!0)},style:{width:`100%`,height:`100%`,objectFit:`cover`,display:`block`}})}),(0,d.jsxs)(`div`,{style:{minWidth:0,padding:`7px 8px`,display:`grid`,gap:`5px`},children:[e.title&&(0,d.jsx)(`div`,{title:e.title,style:{fontSize:`11px`,lineHeight:1.3,color:`var(--text-primary, inherit)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.title}),(0,d.jsx)(`a`,{href:o(e.imageUrl),target:`_blank`,rel:`noopener noreferrer`,style:{justifySelf:`start`,color:`var(--interactive-fg-hover)`,fontSize:`10px`,lineHeight:1.4,textDecoration:`underline`,textUnderlineOffset:`2px`},children:`View full image`})]})]})}function l({data:e}){let t=(e?.images??[]).filter(e=>e.thumbnailUrl||e.imageUrl),n=`var(--text-muted)`;return(0,d.jsxs)(`div`,{style:{background:`var(--bg-surface-soft)`,color:`var(--text-primary)`,borderRadius:`12px`,padding:`16px 20px`,margin:`12px 0`,boxShadow:`var(--shadow-md)`,border:`1px solid var(--border-subtle)`,fontFamily:`system-ui, -apple-system, sans-serif`},children:[(0,d.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,marginBottom:`12px`},children:[(0,d.jsx)(a,{size:16,strokeWidth:2,style:{opacity:.9,color:n}}),(0,d.jsx)(`span`,{style:{fontSize:`11px`,fontWeight:700,letterSpacing:`0.8px`,color:n},children:`IMAGE SEARCH`}),e?.query&&(0,d.jsxs)(`span`,{title:e.query,style:{minWidth:0,fontSize:`13px`,color:`var(--text-secondary)`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:[`“`,e.query,`”`]})]}),t.length===0?(0,d.jsx)(`div`,{style:{fontSize:`13px`,color:`var(--text-muted)`},children:`No images found.`}):(0,d.jsx)(`div`,{style:{display:`flex`,gap:`8px`,overflowX:`auto`,paddingBottom:`4px`,scrollbarWidth:`thin`},children:t.map((e,t)=>(0,d.jsx)(c,{image:e},`${e.imageUrl}-${t}`))})]})}var u,d;t((()=>{u=e(n()),i(),s(),d=r()}))();export{l as default};
@@ -1 +0,0 @@
1
- .library-page{z-index:5;background:var(--bg-gradient);min-width:0;color:var(--text-main);padding:48px clamp(20px,5vw,76px) 40px;position:absolute;inset:0;overflow:auto}.library-content{max-width:1200px;margin:0 auto}.library-header{justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:30px;display:flex}.library-eyebrow{color:var(--text-muted);align-items:center;gap:7px;font-size:12px;display:flex}.library-header h1{margin:8px 0;font-size:28px;font-weight:600}.library-header p{color:var(--text-muted);margin:0;font-size:13px;line-height:1.6}.library-header-actions,.library-item-actions{flex-shrink:0;gap:6px;display:flex}.library-page button,.library-preview button,.library-preview a{border:1px solid var(--border);border-radius:var(--radius-md,8px);background:var(--bg-surface-soft);min-height:34px;color:var(--text-soft,var(--text-main));font:inherit;cursor:pointer;justify-content:center;align-items:center;gap:7px;padding:7px 10px;font-size:12px;text-decoration:none;display:inline-flex}.library-page button:hover:not(:disabled),.library-preview button:hover,.library-preview a:hover{background:var(--bg-surface-hover);color:var(--text-main)}.library-page button:disabled{opacity:.45;cursor:default}.library-page :focus-visible,.library-preview :focus-visible{outline:2px solid var(--accent);outline-offset:3px}.library-toolbar{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;padding-bottom:12px;display:flex}.library-filters{flex-wrap:wrap;gap:4px;display:flex}.library-filters button{background:0 0;border-color:#0000}.library-filters button[aria-pressed=true]{color:var(--text-main);background:var(--bg-surface-hover);border-color:var(--border)}.library-search-row{align-items:center;gap:12px;margin:18px 0;display:flex}.library-search{border:1px solid var(--border);border-radius:var(--radius-md,8px);background:var(--bg-surface-soft);min-width:0;max-width:430px;color:var(--text-muted);flex:1;align-items:center;gap:9px;padding:0 11px;display:flex}.library-search input{width:100%;min-width:0;color:var(--text-main);font:inherit;background:0 0;border:0;outline:none;min-height:38px;font-size:13px}.library-search:focus-within{outline:2px solid var(--accent);outline-offset:1px}.library-search-row select{border:1px solid var(--border);border-radius:var(--radius-md,8px);background:var(--bg-surface-soft);max-width:210px;min-height:38px;color:var(--text-soft,var(--text-main));font:inherit;padding:6px 9px;font-size:12px}.library-trash-note{color:var(--text-muted);font-size:12px;line-height:1.6}.library-items{flex-direction:column;display:flex}.library-item{border-bottom:1px solid var(--border);align-items:center;gap:18px;min-width:0;padding:11px 0;display:flex}.library-page .library-item-preview{text-align:left;min-width:0;color:var(--text-main);background:0 0;border:0;flex:1;justify-content:flex-start;gap:14px;padding:0;display:flex}.library-thumbnail{background:var(--bg-surface-soft);width:48px;height:48px;color:var(--text-muted);border-radius:7px;flex-shrink:0;place-items:center;display:grid;overflow:hidden}.library-thumbnail img{object-fit:cover;width:100%;height:100%}.library-item-copy{min-width:0}.library-item-copy strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:1.5;display:block;overflow:hidden}.library-item-copy small{color:var(--text-muted);margin-top:4px;font-size:11px;display:block}.library-item-date{color:var(--text-muted);flex-shrink:0;font-size:11px}.library-page .library-item-actions button{background:0 0;border-color:#0000;padding:7px}.library-empty{text-align:center;color:var(--text-muted);padding:70px 15px;font-size:13px}.library-empty h2{color:var(--text-main);font-size:17px;font-weight:500}.library-empty p{line-height:1.6}.library-error{border:1px solid var(--border);overflow-wrap:anywhere;border-radius:8px;justify-content:space-between;align-items:center;gap:14px;padding:12px;font-size:12px;display:flex}.library-action-error{overflow-wrap:anywhere;color:var(--text-main);font-size:12px}.library-load-more{margin:22px auto;display:flex!important}.library-items.is-grid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:20px;display:grid}.is-grid .library-item{flex-wrap:wrap;align-content:start;gap:8px;padding:0 0 10px;display:flex}.is-grid .library-item-preview{flex-direction:column;flex-basis:100%;align-items:stretch;gap:10px}.is-grid .library-thumbnail{aspect-ratio:8/5;width:100%;height:auto}.is-grid .library-item-date{flex:1}.is-grid .library-item-copy small{margin-top:2px}.library-preview-backdrop{z-index:10000;color:var(--text-main);background:#000000bf;justify-content:center;align-items:center;padding:28px;display:flex;position:fixed;inset:0}.library-preview{border:1px solid var(--border);background:var(--bg-overlay,var(--bg-surface-soft));border-radius:12px;flex-direction:column;width:min(1050px,100%);min-width:0;max-height:calc(100dvh - 56px);display:flex;overflow:hidden}.library-preview header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:18px;padding:16px 20px;display:flex}.library-preview h2{overflow-wrap:anywhere;min-width:0;margin:0;font-size:15px;font-weight:500}.library-preview-body{place-items:center;min-height:180px;max-height:70dvh;padding:18px;display:grid;overflow:auto}.library-preview-source{padding:12px 20px 0}.library-preview-source>span{color:var(--text-muted);font-size:11px}.library-preview-source p{-webkit-line-clamp:2;overflow-wrap:anywhere;color:var(--text-soft,var(--text-main));-webkit-box-orient:vertical;margin:4px 0 0;font-size:13px;line-height:1.5;display:-webkit-box;overflow:hidden}.library-preview-body img,.library-preview-body video{object-fit:contain;max-width:100%;max-height:60dvh}.library-preview-body pre{white-space:pre-wrap;overflow-wrap:anywhere;width:100%;font-family:var(--font-mono,monospace);margin:0;font-size:13px;line-height:1.6}.library-preview-body iframe{border:0;width:100%;height:60dvh}.library-preview-body p{font-size:13px;line-height:1.7}.library-preview footer{border-top:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;padding:14px 20px;display:flex}.library-preview footer>span{color:var(--text-muted);overflow-wrap:anywhere;font-size:11px}.library-preview footer>div{flex-wrap:wrap;gap:8px;display:flex}@media (width<=600px){.library-page{padding:24px 16px 35px}.library-header{gap:12px;margin-bottom:24px}.library-header h1{font-size:24px}.library-header-actions{gap:4px}.library-header-actions button{padding:7px}.library-toolbar{align-items:flex-start;gap:8px}.library-filters{gap:0}.library-filters button{padding:7px 9px}.library-trash-toggle{padding:7px!important}.library-search-row{flex-wrap:wrap}.library-search{flex-basis:100%;width:100%;max-width:none}.library-search-row select{width:100%;max-width:none}.library-item{gap:8px}.library-item-date{display:none}.library-thumbnail{width:40px;height:44px}.library-page .library-item-preview{gap:10px}.library-item-copy strong{font-size:12px}.library-item-copy small{font-size:10px}.library-item-actions{gap:0}.library-items.is-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.library-preview-backdrop{padding:12px}.library-preview{max-height:calc(100dvh - 24px)}.library-preview header{padding:12px}.library-preview-source{padding:12px 12px 0}.library-preview footer,.library-preview-body{padding:12px}.library-preview h2{font-size:13px}}.library-item.is-linked{outline:1px solid var(--accent);outline-offset:4px;border-radius:var(--radius-md,8px)}
@@ -1,2 +0,0 @@
1
- import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{B as i,Bn as a,Et as o,J as s,Jr as c,L as l,M as u,Mt as d,Qn as f,j as p,mn as m,nt as h,ut as g,wn as _}from"./index-BmpulIkg.js";function v(e){let t={items:[],query:{},nextCursor:null,loading:!1,error:``,actionId:null,actionError:``},n=0,r=1,i=new Set,a=e=>{t={...t,...e},i.forEach(e=>e())},o=async(i=!1)=>{if(i&&(t.loading||!t.nextCursor))return;let o=++n,s={...t.query,cursor:i?t.nextCursor:void 0},c=i?1:r;a({loading:!0,error:``});try{let l=await e.list(s);if(o!==n)return;let u=1,d=[...l.items];for(;!i&&u<c&&l.nextCursor;){if(l=await e.list({...s,cursor:l.nextCursor}),o!==n)return;d.push(...l.items),u++}i||(l={...l,items:d}),r=i?r+1:u;let f=i?[...new Map([...t.items,...l.items].map(e=>[e.id,e])).values()]:l.items;a({items:f,nextCursor:l.nextCursor})}catch(e){o===n&&a({error:String(e)})}finally{o===n&&a({loading:!1})}},s=async(e,r)=>{if(t.actionId)return;let i=n;a({actionId:e,actionError:``});try{await r(),i===n?(n++,a({items:t.items.filter(t=>t.id!==e),loading:!1})):await o()}catch(e){a({actionError:String(e)})}finally{a({actionId:null})}};return{remove:t=>s(t,()=>e.remove(t)),getSnapshot:()=>t,subscribe:e=>(i.add(e),()=>{i.delete(e)}),setQuery:async e=>{r=1,a({query:{...e,cursor:void 0},items:[],nextCursor:null,actionError:``}),await o()},refresh:()=>o(),loadMore:()=>o(!0),setTrashed:(t,n)=>s(t,()=>e.setTrashed(t,n))}}var y=t((()=>{}));function b(e,t=!1,n=0){let[r,i]=(0,S.useState)({url:``,blob:null,error:``});return(0,S.useEffect)(()=>{let n=!0,r=``;return i({url:``,blob:null,error:``}),e&&u.readLibraryFile(e,t).then(e=>{n&&(r=URL.createObjectURL(e),i({url:r,blob:e,error:``}))}).catch(e=>{n&&i({url:``,blob:null,error:String(e)})}),()=>{n=!1,r&&URL.revokeObjectURL(r)}},[e,t,n]),r}async function x(e,t){let n=await u.readLibraryFile(e),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,document.body.append(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(r),1e3)}var S,C=t((()=>{S=e(n()),p()}));function w(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function T({item:e}){let t=b(e.thumbnailStatus===`ready`&&!e.deletedAt&&e.availability===`ready`?e.id:null,!0),n=e.kind===`image`?_:e.kind===`video`?s:a;return(0,D.jsx)(`span`,{className:`library-thumbnail is-${e.kind}`,children:t.url?(0,D.jsx)(`img`,{src:t.url,alt:``,loading:`lazy`}):(0,D.jsx)(n,{size:23})})}function E({item:e,linked:t,trashed:n,actionPending:r,downloadPending:i,onPreview:a,onDownload:o,onMove:s,onRemove:c}){let l=e.availability===`missing`,u=l||!!e.deletedAt,d=l?`Original file missing`:e.deletedAt?`In Trash`:e.origin===`generated`?`AI generated`:e.origin===`legacy`?`Imported from Pictures`:`Uploaded`;return(0,D.jsxs)(`article`,{className:`library-item ${t?`is-linked`:``}`,children:[(0,D.jsxs)(`button`,{className:`library-item-preview`,"data-preview":e.id,type:`button`,disabled:u,onClick:()=>a(e),"aria-label":`Preview ${e.name}`,children:[(0,D.jsx)(T,{item:e}),(0,D.jsxs)(`span`,{className:`library-item-copy`,children:[(0,D.jsx)(`strong`,{title:e.name,children:e.name}),(0,D.jsxs)(`small`,{children:[d,` · `,w(e.size)]})]})]}),(0,D.jsx)(`span`,{className:`library-item-date`,children:new Date(e.createdAt).toLocaleDateString(void 0,{day:`numeric`,month:`short`,year:`numeric`})}),(0,D.jsxs)(`div`,{className:`library-item-actions`,children:[!n&&(0,D.jsx)(`button`,{type:`button`,"aria-label":`Download ${e.name}`,disabled:u||i,onClick:()=>o(e),children:(0,D.jsx)(f,{size:16})}),(0,D.jsx)(`button`,{type:`button`,"aria-label":n?`Restore ${e.name}`:`Move ${e.name} to Trash`,"data-trash":n?void 0:e.id,"data-restore":n?e.id:void 0,disabled:r,onClick:()=>s(e),children:n?(0,D.jsx)(h,{size:16}):(0,D.jsx)(g,{size:16})}),n&&(0,D.jsx)(`button`,{type:`button`,"data-remove":e.id,disabled:r,"aria-label":`Remove ${e.name} from Mint`,title:`Remove from Mint and move files to system Trash`,onClick:()=>c(e),children:(0,D.jsx)(g,{size:16})})]})]})}var D,O=t((()=>{l(),C(),D=r()}));function k({item:e,onClose:t,onOpenConversation:n}){let[r,a]=(0,A.useState)(0),o=b(e.id,!1,r),[s,c]=(0,A.useState)(``),l=(0,A.useRef)(null),u=e.message.replace(/^\/chat\s+/,``).replace(/\[(?:Image|Video) #\d+\]/g,``).replace(/\s+/g,` `).trim(),d=e.kind===`file`&&/\.(txt|md|json|toml|ya?ml|rs|tsx?|jsx?|py|html?|css)$/i.test(e.name);return(0,A.useEffect)(()=>{let e=!0;return c(``),d&&o.blob&&o.blob.slice(0,1048576).text().then(t=>{e&&c(t)}),()=>{e=!1}},[o.blob,d]),(0,A.useEffect)(()=>{let e=document.activeElement,n=document.body.style.overflow;document.body.style.overflow=`hidden`,l.current?.querySelector(`button`)?.focus();let r=e=>{if(e.key===`Escape`&&(e.preventDefault(),t()),e.key===`Tab`){let t=Array.from(l.current?.querySelectorAll(`button:not([disabled]),a[href],video[controls],iframe,[tabindex="0"]`)??[]),n=t[0],r=t.at(-1);e.shiftKey&&document.activeElement===n?(e.preventDefault(),r?.focus()):!e.shiftKey&&document.activeElement===r&&(e.preventDefault(),n?.focus())}};return document.addEventListener(`keydown`,r),()=>{document.body.style.overflow=n,document.removeEventListener(`keydown`,r),e?.focus()}},[t]),(0,j.createPortal)((0,M.jsx)(`div`,{className:`library-preview-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,M.jsxs)(`div`,{className:`library-preview`,ref:l,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`library-preview-title`,children:[(0,M.jsxs)(`header`,{children:[(0,M.jsx)(`h2`,{id:`library-preview-title`,children:e.name}),(0,M.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Close preview`,children:(0,M.jsx)(i,{size:18})})]}),u&&(0,M.jsxs)(`section`,{className:`library-preview-source`,"aria-label":`Source message`,children:[(0,M.jsx)(`span`,{children:`Source message`}),(0,M.jsx)(`p`,{children:u})]}),(0,M.jsx)(`div`,{className:`library-preview-body`,children:o.error?(0,M.jsxs)(`div`,{role:`alert`,children:[(0,M.jsx)(`p`,{children:o.error}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>a(e=>e+1),children:`Retry`})]}):o.url?e.kind===`image`?(0,M.jsx)(`img`,{src:o.url,alt:e.name}):e.kind===`video`?(0,M.jsx)(`video`,{src:o.url,controls:!0,autoPlay:!1}):d?(0,M.jsxs)(`pre`,{tabIndex:0,children:[s,o.blob.size>1048576?`
2
- [Preview limited to the first 1 MiB. Download to read the entire file.]`:``]}):/\.pdf$/i.test(e.name)?(0,M.jsx)(`iframe`,{title:e.name,src:o.url,sandbox:``}):(0,M.jsx)(`p`,{children:`This file is ready to download. A preview is not available for this format.`}):(0,M.jsx)(`p`,{role:`status`,children:`Loading file…`})}),(0,M.jsxs)(`footer`,{children:[(0,M.jsxs)(`span`,{children:[e.origin===`generated`?`AI generated`:e.origin===`legacy`?`Imported from Pictures`:`Uploaded`,` · `,e.mimeType]}),(0,M.jsxs)(`div`,{children:[[...new Set(e.references.map(e=>e.chatId))].map(e=>(0,M.jsx)(`button`,{type:`button`,"data-open-chat":!0,onClick:()=>n?.(e),children:`Open source chat`},e)),o.url&&(0,M.jsxs)(`a`,{href:o.url,download:e.name,children:[(0,M.jsx)(f,{size:15}),`Download`]})]})]})]})}),document.body)}var A,j,M,N=t((()=>{A=e(n()),j=c(),l(),C(),M=r()})),P=t((()=>{}));function F({chatId:e,onClose:t,onOpenConversation:n}){let r=(0,I.useMemo)(()=>v({list:u.listLibrary,setTrashed:u.setLibraryTrashed,remove:u.removeLibraryItem}),[]),a=(0,I.useSyncExternalStore)(r.subscribe,r.getSnapshot),[s,c]=(0,I.useState)(``),[l,f]=(0,I.useState)(``),[p,h]=(0,I.useState)(``),[_,y]=(0,I.useState)(`all`),[b,S]=(0,I.useState)(()=>new URLSearchParams(location.search).get(`trash`)===`1`),[C,w]=(0,I.useState)(null),[T,D]=(0,I.useState)(null),[O,A]=(0,I.useState)(``),[j,M]=(0,I.useState)(``),[N,P]=(0,I.useState)(0),F=(0,I.useCallback)(()=>D(null),[]);(0,I.useEffect)(()=>{let e=()=>P(e=>e+1);return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]),(0,I.useEffect)(()=>{let e=setTimeout(()=>h(l),200);return()=>clearTimeout(e)},[l]),(0,I.useEffect)(()=>{r.setQuery({kind:s||void 0,search:p,chatId:_===`session`?e:void 0,trashed:b})},[s,p,_,e,b,r]),(0,I.useEffect)(()=>{let e=()=>{r.refresh()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[r]),(0,I.useEffect)(()=>{if(!a.items.some(e=>e.thumbnailStatus===`pending`&&!e.deletedAt))return;let e=setTimeout(()=>{r.refresh()},2500);return()=>clearTimeout(e)},[a.items,r]),(0,I.useEffect)(()=>{let e=new URLSearchParams(location.search),t=e.get(`item`),n=!0;return w(null),D(null),A(``),S(e.get(`trash`)===`1`),t&&(c(``),f(``),y(`all`),u.getLibraryItem(t).then(e=>{n&&(w(e),e.deletedAt?S(!0):e.availability===`ready`&&D(e))}).catch(e=>{n&&A(String(e))})),()=>{n=!1}},[N]);async function z(e){M(e.id),A(``);try{await x(e.id,e.name)}catch(e){A(String(e))}finally{M(``)}}async function B(e){await r.setTrashed(e.id,!b),!r.getSnapshot().actionError&&C?.id===e.id&&w(null)}async function V(e){await r.remove(e.id),!r.getSnapshot().actionError&&C?.id===e.id&&w(null)}let H=C&&!!C.deletedAt===b&&!a.items.some(e=>e.id===C.id)&&!l&&!s&&_===`all`?[C,...a.items]:a.items,U=l||s||_===`session`;return(0,L.jsxs)(`section`,{className:`library-page`,"aria-label":`Library`,children:[(0,L.jsxs)(`div`,{className:`library-content`,children:[(0,L.jsxs)(`header`,{className:`library-header`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsxs)(`div`,{className:`library-eyebrow`,children:[(0,L.jsx)(m,{size:16}),`Your files`]}),(0,L.jsx)(`h1`,{children:`Library`}),(0,L.jsx)(`p`,{children:`Images, videos, and files from your conversations.`})]}),(0,L.jsxs)(`div`,{className:`library-header-actions`,children:[(0,L.jsx)(`button`,{type:`button`,"aria-label":`Refresh library`,disabled:a.loading,onClick:()=>{r.refresh()},children:(0,L.jsx)(d,{size:17})}),t&&(0,L.jsx)(`button`,{type:`button`,"aria-label":`Close library`,onClick:t,children:(0,L.jsx)(i,{size:18})})]})]}),(0,L.jsxs)(`div`,{className:`library-toolbar`,children:[(0,L.jsx)(`div`,{className:`library-filters`,role:`group`,"aria-label":`File type`,children:R.map(([e,t])=>(0,L.jsx)(`button`,{type:`button`,"data-filter":e||`all`,"aria-pressed":s===e,onClick:()=>c(e),children:t},e))}),(0,L.jsxs)(`button`,{type:`button`,className:`library-trash-toggle`,"data-view":b?`active`:`trash`,"aria-pressed":b,onClick:()=>S(e=>!e),children:[b?(0,L.jsx)(m,{size:15}):(0,L.jsx)(g,{size:15}),` `,b?`Back to library`:`Trash`]})]}),(0,L.jsxs)(`div`,{className:`library-search-row`,children:[(0,L.jsxs)(`label`,{className:`library-search`,children:[(0,L.jsx)(o,{size:16}),(0,L.jsx)(`input`,{type:`search`,placeholder:`Search filenames`,"aria-label":`Search filenames`,value:l,onChange:e=>f(e.target.value)})]}),e&&(0,L.jsxs)(`select`,{"aria-label":`Conversation scope`,value:_,onChange:e=>y(e.target.value),children:[(0,L.jsx)(`option`,{value:`all`,children:`All conversations`}),(0,L.jsx)(`option`,{value:`session`,children:`Current conversation`})]})]}),b&&(0,L.jsx)(`p`,{className:`library-trash-note`,children:`Restore files to Library, or remove them from Mint to move them to system Trash on the computer running Mint.`}),a.error&&(0,L.jsxs)(`div`,{className:`library-error`,role:`alert`,children:[(0,L.jsx)(`span`,{children:a.error}),(0,L.jsx)(`button`,{type:`button`,onClick:()=>{r.refresh()},children:`Retry`})]}),(a.actionError||O)&&(0,L.jsx)(`p`,{className:`library-action-error`,role:`alert`,children:a.actionError||O}),a.loading&&!a.items.length?(0,L.jsx)(`p`,{className:`library-empty`,role:`status`,children:`Loading library…`}):!H.length&&!a.error?(0,L.jsxs)(`div`,{className:`library-empty`,children:[(0,L.jsx)(m,{size:30}),(0,L.jsx)(`h2`,{children:U?`No files match these filters`:b?`Trash is empty`:`Your library starts here`}),(0,L.jsx)(`p`,{children:b?`Files you move to Trash can be restored here.`:`Send an image, video, or file in a conversation to keep it here.`})]}):null,(0,L.jsx)(`div`,{className:`library-items ${s===`image`||s===`video`?`is-grid`:``}`,children:H.map(e=>(0,L.jsx)(E,{item:e,linked:C?.id===e.id,trashed:b,actionPending:!!a.actionId,downloadPending:!!j,onPreview:D,onDownload:z,onMove:B,onRemove:V},e.id))}),a.nextCursor&&(0,L.jsx)(`button`,{type:`button`,className:`library-load-more`,disabled:a.loading,onClick:()=>{r.loadMore()},children:a.loading?`Loading…`:`Load more`})]}),T&&(0,L.jsx)(k,{item:T,onClose:F,onOpenConversation:n})]})}var I,L,R;t((()=>{I=e(n()),l(),p(),y(),C(),O(),N(),P(),L=r(),R=[[``,`All`],[`image`,`Images`],[`video`,`Videos`],[`file`,`Files`]]}))();export{F as default};
@@ -1 +0,0 @@
1
- import{i as e,n as t}from"./rolldown-runtime-CNOWq4Kh.js";import{n,t as r}from"./jsx-runtime-DmUwWVTj.js";import{J as i,Q as a,X as o,Z as ee}from"./config-CvIO5hkn.js";var s,c,l;t((()=>{s=e(n()),o(),i(),c=r(),l=s.memo(function({listLinkedFolders:e,addLinkedFolder:t,removeLinkedFolder:n,linkedFolderStatus:r,refreshLinkedFolder:i,listLinkedFolderNotes:o,readLinkedFolderNote:l,openLinkedFolderNote:te,canOpenNote:ne,selectFolder:u}){let[d,re]=(0,s.useState)([]),[ie,f]=(0,s.useState)(!1),[p,ae]=(0,s.useState)(``),[oe,se]=(0,s.useState)(``),[m,h]=(0,s.useState)(``),[g,_]=(0,s.useState)(``),[v,y]=(0,s.useState)(``),[b,x]=(0,s.useState)(!1),[S,C]=(0,s.useState)(!1),[w,T]=(0,s.useState)({}),[ce,E]=(0,s.useState)(!1),le=(0,s.useRef)(null),ue=(0,s.useRef)(null),D=(0,s.useRef)(null),O=(0,s.useRef)(null),k=(0,s.useRef)(null),A=(0,s.useRef)(null),[j,M]=(0,s.useState)(null),[N,P]=(0,s.useState)(null),[F,I]=(0,s.useState)([]),[L,R]=(0,s.useState)(``),[z,B]=(0,s.useState)(null),[de,V]=(0,s.useState)(!1),H=(0,s.useRef)(0),[U,W]=(0,s.useState)(``),[G,K]=(0,s.useState)(!1),[q,J]=(0,s.useState)(null),[fe,Y]=(0,s.useState)({}),[pe,me]=(0,s.useState)({}),[he,X]=(0,s.useState)({}),Z=async()=>{f(!0),ae(``);try{let t=await e();re(Object.values(t||{}))}catch(e){console.error(`Failed to fetch linked folders:`,e),ae(`Failed to load linked folders`)}finally{f(!1)}};(0,s.useEffect)(()=>{Z()},[]);let ge=d.map(e=>`${e.name}\u0000${e.path}`).join(``),_e=(e,t)=>{if(e.key!==`Tab`||!t)return;let n=Array.from(t.querySelectorAll(`button:not(:disabled), input:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex="-1"])`));if(n.length===0)return;let r=n[0],i=n[n.length-1];e.shiftKey&&(document.activeElement===r||!t.contains(document.activeElement))?(e.preventDefault(),i.focus()):e.shiftKey||document.activeElement!==i&&t.contains(document.activeElement)||(e.preventDefault(),r.focus())};(0,s.useEffect)(()=>{if(d.length===0)return;let e=!0,t=!1,n=async()=>{if(!t){t=!0;try{let t=await Promise.all(d.map(async e=>{let[t,n]=await Promise.allSettled([r(e.name),o(e.name)]);return{name:e.name,statusResult:t,notesResult:n}}));if(!e)return;let n={},i={},a={};for(let e of t)e.statusResult.status===`fulfilled`?n[e.name]=e.statusResult.value:a[e.name]=`Could not load folder status`,e.notesResult.status===`fulfilled`?i[e.name]=e.notesResult.value:a[e.name]=`Could not load recent notes`;Y(n),me(i),X(a)}finally{t=!1}}};n();let i=window.setInterval(n,15e3);return()=>{e=!1,window.clearInterval(i)}},[ge,r,o]),(0,s.useEffect)(()=>{S&&le.current?.focus()},[S]),(0,s.useEffect)(()=>{if(!S)return;let e=e=>{e.key===`Escape`&&!b&&Q(),_e(e,D.current)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[S,b]);let ve=()=>{ue.current=document.activeElement instanceof HTMLElement?document.activeElement:null,T({}),C(!0)},Q=()=>{C(!1),T({}),window.requestAnimationFrame(()=>ue.current?.focus())},ye=e=>{O.current=document.activeElement instanceof HTMLElement?document.activeElement:null,W(``),M(e)},$=()=>{M(null),window.requestAnimationFrame(()=>O.current?.focus())};(0,s.useEffect)(()=>{if(!j)return;k.current?.focus();let e=e=>{e.key===`Escape`&&$(),_e(e,A.current)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[j?.name]),(0,s.useEffect)(()=>{if(!j)return;P(null),I([]),R(``),B(null),V(!1),H.current+=1;let e=!0,t=async()=>{try{let[t,n]=await Promise.all([r(j.name),o(j.name)]);e&&(P(t),I(n),W(``))}catch(t){e&&W(t?.message||`Failed to load linked folder details`)}};t();let n=window.setInterval(t,1e4);return()=>{e=!1,window.clearInterval(n)}},[j?.name,r,o]);let be=async()=>{if(j){K(!0);try{let e=await i(j.name);P(e),Y(t=>({...t,[j.name]:e})),W(``)}catch(e){W(e?.message||`Could not refresh folder`)}finally{K(!1)}}},xe=async e=>{if(z===e.id){H.current+=1,B(null),R(``),V(!1);return}let t=++H.current;B(e.id),R(``),V(!0);try{let n=await l(e.folder,e.id);t===H.current&&(R(n),W(``))}catch(e){t===H.current&&W(e?.message||`Could not read note`)}finally{t===H.current&&V(!1)}},Se=async e=>{try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(e);else{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`Could not copy path`)}W(``)}catch(e){W(e?.message||`Could not copy path`)}},Ce=async e=>{e.preventDefault();let n={};if(m.trim()?d.some(e=>e.name===m.trim())&&(n.name=`This name is already linked. Choose another name.`):n.name=`Enter a name for this folder.`,g.trim()||(n.path=`Choose or enter a folder path.`),Object.keys(n).length)T(n);else{T({}),x(!0);try{await t({name:m.trim(),path:g.trim(),description:v.trim()||void 0}),h(``),_(``),y(``),E(!1),Q(),await Z()}catch(e){console.error(`Failed to add linked folder:`,e),T({form:e?.message||`Could not link folder. Check that the path exists and Mint can access it.`})}finally{x(!1)}}},we=async()=>{if(u)try{let e=await u();if(e&&(_(e),T(e=>({...e,path:void 0,form:void 0})),!m.trim()||ce)){let t=e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||``;h(t),E(!0),T(e=>({...e,name:void 0}))}}catch(e){console.error(`Failed to open folder picker:`,e),T(t=>({...t,path:e?.message||`Could not open folder picker.`}))}},Te=async e=>{J(e);try{let t=await i(e);Y(n=>({...n,[e]:t})),X(t=>({...t,[e]:``}))}catch(t){X(n=>({...n,[e]:t?.message||`Could not refresh folder.`}))}finally{J(null)}},Ee=async e=>{if(window.confirm(`Unlink folder "${e}"? (The folder and its notes are not deleted.)`))try{await n(e),j?.name===e&&$(),Z()}catch(e){console.error(`Failed to remove linked folder:`,e),alert(`Error unlinking folder`)}},De=d.filter(e=>{let t=oe.toLowerCase();return e.name.toLowerCase().includes(t)||e.path.toLowerCase().includes(t)||(e.description||``).toLowerCase().includes(t)});return(0,c.jsxs)(`div`,{className:`management-container`,children:[(0,c.jsxs)(`div`,{className:`management-header`,children:[(0,c.jsxs)(`div`,{className:`management-title-group`,children:[(0,c.jsxs)(`h1`,{className:`management-title`,children:[(0,c.jsx)(`span`,{className:`management-title-icon`,style:{display:`inline-flex`,alignItems:`center`},children:a(22,`var(--accent)`)}),`Linked folders`]}),(0,c.jsxs)(`p`,{className:`management-subtitle`,children:[`Mint reads linked folder files to find relevant chats and saves useful notes into `,(0,c.jsx)(`code`,{children:`mint-notes/`}),`.`]})]}),(0,c.jsxs)(`button`,{type:`button`,className:`management-primary-btn`,onClick:ve,children:[(0,c.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.5`,children:[(0,c.jsx)(`line`,{x1:`12`,y1:`5`,x2:`12`,y2:`19`}),(0,c.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`})]}),`Link a Folder`]})]}),d.length>0&&(0,c.jsx)(`div`,{className:`management-control-bar`,children:(0,c.jsxs)(`div`,{className:`management-search-wrapper`,children:[(0,c.jsx)(`input`,{type:`text`,className:`management-search-input`,"aria-label":`Search linked folders`,placeholder:`Search linked folders...`,value:oe,onChange:e=>se(e.target.value)}),(0,c.jsxs)(`svg`,{className:`management-search-icon`,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,c.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,c.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]})]})}),p&&d.length>0&&(0,c.jsx)(`div`,{className:`management-error-banner`,role:`alert`,children:p}),ie?(0,c.jsx)(`div`,{className:`mgmt-empty`,children:`Loading…`}):p&&d.length===0?(0,c.jsxs)(`div`,{className:`linked-load-error`,role:`alert`,children:[(0,c.jsx)(`p`,{children:`Could not load linked folders.`}),(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,onClick:()=>void Z(),children:`Try again`})]}):d.length===0?(0,c.jsxs)(`section`,{className:`linked-empty`,"aria-labelledby":`linked-empty-title`,children:[(0,c.jsx)(`div`,{className:`linked-empty-icon`,"aria-hidden":`true`,children:a(30,`var(--accent)`)}),(0,c.jsx)(`h2`,{id:`linked-empty-title`,children:`Give a folder a place in your conversations`}),(0,c.jsx)(`p`,{children:`Link a folder so Mint can use its supported files to find relevant context and save useful notes from your chats.`}),(0,c.jsxs)(`div`,{className:`linked-empty-steps`,"aria-label":`How linked folders work`,children:[(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`strong`,{children:`1 · Choose a folder`}),(0,c.jsx)(`span`,{children:`Mint reads supported files in it and its subfolders.`})]}),(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`strong`,{children:`2 · Chat as usual`}),(0,c.jsx)(`span`,{children:`Mint uses relevant content when a conversation matches.`})]}),(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`strong`,{children:`3 · Find your notes`}),(0,c.jsxs)(`span`,{children:[`Saved notes appear inside that folder’s `,(0,c.jsx)(`code`,{children:`mint-notes/`}),`.`]})]})]}),(0,c.jsx)(`button`,{type:`button`,className:`management-primary-btn`,onClick:ve,children:`Link a Folder`}),(0,c.jsxs)(`p`,{className:`linked-empty-cli`,children:[`You can also run `,(0,c.jsx)(`code`,{children:`mint link add`}),` in your terminal.`]})]}):De.length===0?(0,c.jsx)(`div`,{className:`mgmt-empty`,children:`No linked folders match your search.`}):(0,c.jsx)(`div`,{className:`mgmt-list linked-folder-list`,children:De.map(e=>{let t=fe[e.name],n=pe[e.name]?.find(e=>e.status===`saved`),r=he[e.name]||t?.indexError,i=r?`Needs attention`:t?t.indexedAt?`Ready`:`Reading files…`:`Checking…`;return(0,c.jsxs)(`div`,{className:`mgmt-row linked-folder-row`,children:[(0,c.jsxs)(`div`,{className:`mgmt-row-main`,children:[(0,c.jsxs)(`div`,{className:`linked-folder-heading`,children:[(0,c.jsx)(`span`,{className:`mgmt-row-title`,children:e.name}),(0,c.jsx)(`span`,{className:`mgmt-status ${r?`failed`:t?.indexedAt?`ok`:`running`}`,role:`status`,children:i})]}),(0,c.jsx)(`div`,{className:`mgmt-row-sub`,title:e.path,children:e.path}),e.description&&(0,c.jsx)(`div`,{className:`linked-folder-description`,children:e.description}),(0,c.jsxs)(`div`,{className:`linked-folder-meta`,children:[(0,c.jsx)(`span`,{children:t?`${t.indexedFiles} files indexed`:`Checking files…`}),(0,c.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,c.jsx)(`span`,{children:n?`Last note ${new Date(n.createdAt).toLocaleString()}`:`No notes yet`})]}),n&&(0,c.jsx)(`p`,{className:`linked-folder-note-snippet`,children:n.content.slice(0,180)}),r&&(0,c.jsx)(`p`,{className:`linked-folder-error`,role:`alert`,children:r})]}),(0,c.jsxs)(`div`,{className:`linked-folder-actions`,children:[(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,onClick:()=>ye(e),children:`View notes`}),(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,disabled:q===e.name,onClick:()=>void Te(e.name),children:q===e.name?`Refreshing…`:`Refresh`})]})]},e.name)})}),j&&(0,c.jsx)(`div`,{className:`management-modal-overlay`,onClick:$,children:(0,c.jsxs)(`div`,{ref:A,className:`management-modal linked-detail-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`linked-detail-title`,onClick:e=>e.stopPropagation(),children:[(0,c.jsxs)(`div`,{className:`management-modal-header`,children:[(0,c.jsxs)(`div`,{className:`management-card-title-group`,children:[ee(44),(0,c.jsx)(`h2`,{id:`linked-detail-title`,className:`management-modal-title`,children:j.name})]}),(0,c.jsx)(`button`,{type:`button`,className:`management-modal-close`,ref:k,"aria-label":`Close folder details`,onClick:$,children:`✕`})]}),(0,c.jsxs)(`div`,{className:`management-modal-body`,children:[(0,c.jsx)(`p`,{style:{color:`var(--text-soft, #d1d1d4)`,lineHeight:1.55,margin:0},children:j.description||`No description`}),(0,c.jsxs)(`div`,{className:`mgmt-detail-grid`,children:[(0,c.jsx)(`span`,{children:`Path`}),(0,c.jsx)(`code`,{children:j.path}),(0,c.jsx)(`span`,{children:`Notes`}),(0,c.jsxs)(`code`,{children:[j.path.replace(/\/$/,``),`/mint-notes/`]}),(0,c.jsx)(`span`,{children:`Indexed files`}),(0,c.jsx)(`span`,{children:N?N.indexedFiles:`Indexing…`}),(0,c.jsx)(`span`,{children:`Last indexed`}),(0,c.jsx)(`span`,{children:N?.indexedAt?new Date(N.indexedAt).toLocaleString():`Pending`}),(0,c.jsx)(`span`,{children:`Background notes (all folders)`}),(0,c.jsx)(`span`,{children:N?`${N.pendingJobs} pending · ${N.failedJobs} failed`:`Loading…`})]}),N?.indexError&&(0,c.jsx)(`p`,{role:`status`,className:`management-error-banner`,children:N.indexError}),N?.lastJobError&&(0,c.jsxs)(`p`,{role:`status`,className:`management-error-banner`,children:[`Last note error: `,N.lastJobError]}),U&&(0,c.jsx)(`p`,{role:`alert`,className:`management-error-banner`,children:U}),(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,onClick:be,disabled:G,children:G?`Refreshing…`:`Refresh file index`}),(0,c.jsx)(`h3`,{children:`Recent notes`}),F.length===0?(0,c.jsx)(`p`,{children:`No notes saved yet.`}):(0,c.jsx)(`div`,{className:`mgmt-list`,children:F.map(e=>(0,c.jsx)(`div`,{className:`mgmt-row linked-note-row`,children:(0,c.jsxs)(`div`,{className:`mgmt-row-main`,children:[(0,c.jsxs)(`div`,{className:`mgmt-row-title`,children:[new Date(e.createdAt).toLocaleString(),` · `,e.status]}),(0,c.jsx)(`div`,{className:`mgmt-row-sub`,children:e.content.slice(0,160)}),e.error&&(0,c.jsx)(`p`,{role:`status`,children:e.error}),(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,disabled:e.status!==`saved`,"aria-expanded":z===e.id,onClick:()=>void xe(e),children:z===e.id?`Hide note`:`View note`}),ne&&(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,disabled:e.status!==`saved`,onClick:()=>void te(e.folder,e.id).catch(e=>W(String(e))),children:`Open file`}),(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,onClick:()=>void Se(e.path),children:`Copy path`}),z===e.id&&(0,c.jsx)(`div`,{className:`linked-note-preview`,role:`region`,"aria-label":`Note file for ${new Date(e.createdAt).toLocaleString()}`,children:de?(0,c.jsx)(`p`,{children:`Loading note…`}):L?(0,c.jsx)(`pre`,{children:L}):(0,c.jsx)(`p`,{children:`Could not show this note.`})})]})},e.id))})]}),(0,c.jsxs)(`div`,{className:`management-modal-footer`,children:[(0,c.jsx)(`span`,{}),(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn danger`,onClick:()=>Ee(j.name),children:`Unlink`})]})]})}),S&&(0,c.jsx)(`div`,{className:`management-modal-overlay`,children:(0,c.jsxs)(`div`,{ref:D,className:`management-modal linked-add-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`linked-add-title`,children:[(0,c.jsxs)(`div`,{className:`management-modal-header`,children:[(0,c.jsx)(`h2`,{id:`linked-add-title`,className:`management-modal-title`,children:`Link a Folder`}),(0,c.jsx)(`button`,{type:`button`,className:`management-modal-close`,"aria-label":`Close`,disabled:b,onClick:Q,children:`✕`})]}),(0,c.jsxs)(`form`,{onSubmit:Ce,noValidate:!0,children:[(0,c.jsxs)(`div`,{className:`management-modal-body`,children:[(0,c.jsxs)(`div`,{className:`management-form-group`,children:[(0,c.jsx)(`label`,{className:`management-label`,htmlFor:`linked-folder-name`,children:`Name`}),(0,c.jsx)(`input`,{ref:le,id:`linked-folder-name`,type:`text`,className:`management-input-field`,placeholder:`e.g. Food`,value:m,"aria-invalid":!!w.name,"aria-describedby":w.name?`linked-name-error`:void 0,onChange:e=>{h(e.target.value),E(!1),T(e=>({...e,name:void 0,form:void 0}))},required:!0}),w.name&&(0,c.jsx)(`span`,{id:`linked-name-error`,className:`linked-field-error`,role:`alert`,children:w.name})]}),(0,c.jsxs)(`div`,{className:`management-form-group`,children:[(0,c.jsx)(`label`,{className:`management-label`,htmlFor:`linked-folder-path`,children:`Folder path`}),(0,c.jsxs)(`div`,{className:`linked-path-row`,children:[(0,c.jsx)(`input`,{id:`linked-folder-path`,type:`text`,className:`management-input-field`,placeholder:`~/notes/food`,value:g,"aria-invalid":!!w.path,"aria-describedby":w.path?`linked-path-error`:void 0,onChange:e=>{_(e.target.value),T(e=>({...e,path:void 0,form:void 0}))},required:!0}),u&&(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,onClick:we,children:`Browse...`})]}),w.path&&(0,c.jsx)(`span`,{id:`linked-path-error`,className:`linked-field-error`,role:`alert`,children:w.path})]}),(0,c.jsxs)(`div`,{className:`management-form-group`,children:[(0,c.jsxs)(`label`,{className:`management-label`,htmlFor:`linked-folder-description`,children:[`What should Mint remember here? `,(0,c.jsx)(`span`,{className:`linked-optional`,children:`Optional`})]}),(0,c.jsx)(`textarea`,{id:`linked-folder-description`,className:`management-textarea-field`,placeholder:`e.g. Restaurant reviews, recipes, and places I want to try`,value:v,onChange:e=>y(e.target.value),rows:3}),(0,c.jsx)(`p`,{className:`linked-field-hint`,children:`Describe the topics that belong in this folder. Mint uses this when deciding where a chat note belongs.`})]}),(0,c.jsxs)(`p`,{className:`linked-scope-note`,children:[`Mint reads supported files in this folder and its subfolders (such as Markdown, PDF, Word, spreadsheets and code), then saves useful chat notes in `,(0,c.jsx)(`code`,{children:`mint-notes/`}),` inside the folder.`]}),w.form&&(0,c.jsx)(`p`,{className:`management-error-banner`,role:`alert`,children:w.form})]}),(0,c.jsxs)(`div`,{className:`management-modal-footer`,children:[(0,c.jsx)(`button`,{type:`button`,className:`management-action-btn`,disabled:b,onClick:Q,children:`Cancel`}),(0,c.jsx)(`button`,{type:`submit`,disabled:b,className:`management-primary-btn`,children:b?`Linking...`:`Link Folder`})]})]})]})})]})})}))();export{l as LinkedFoldersView,l as default};