@pheem49/mint 1.16.0 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (848) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +1 -1
  4. package/Release_Note.md +71 -72
  5. package/apps/mint-companion/src-tauri/src/compact.rs +69 -0
  6. package/apps/mint-companion/src-tauri/src/main.rs +218 -11
  7. package/apps/mint-companion/vite.config.ts +2 -1
  8. package/crates/mint-cli/src/agent/live_status.rs +43 -2
  9. package/crates/mint-cli/src/agent.rs +178 -38
  10. package/crates/mint-cli/src/commands/agent.rs +225 -31
  11. package/crates/mint-cli/src/commands/browser.rs +127 -0
  12. package/crates/mint-cli/src/commands/config.rs +14 -1
  13. package/crates/mint-cli/src/commands/knowledge.rs +16 -2
  14. package/crates/mint-cli/src/commands/mod.rs +15 -1
  15. package/crates/mint-cli/src/commands/tailnet_web.rs +2 -7
  16. package/crates/mint-cli/src/companion_navigation.rs +268 -0
  17. package/crates/mint-cli/src/interactive/chat_tui.rs +1065 -63
  18. package/crates/mint-cli/src/interactive/command_ui.rs +39 -0
  19. package/crates/mint-cli/src/interactive/slash_commands.rs +114 -6
  20. package/crates/mint-cli/src/interactive/tool_activity.rs +375 -36
  21. package/crates/mint-cli/src/interactive.rs +37 -5
  22. package/crates/mint-cli/src/main.rs +23 -2
  23. package/crates/mint-cli/src/onboard.rs +3494 -1336
  24. package/crates/mint-cli/tests/mods_testing.rs +5 -1
  25. package/crates/mint-companion-protocol/src/lib.rs +113 -0
  26. package/crates/mint-core/src/agent/chat.rs +240 -1
  27. package/crates/mint-core/src/agent/memory.rs +73 -6
  28. package/crates/mint-core/src/agent/safety.rs +56 -4
  29. package/crates/mint-core/src/agent/skill_inventory.rs +3 -1
  30. package/crates/mint-core/src/agent/skills.rs +1 -0
  31. package/crates/mint-core/src/api_server/routes/auth.rs +1 -4
  32. package/crates/mint-core/src/api_server/routes/chat.rs +29 -15
  33. package/crates/mint-core/src/api_server/routes/misc.rs +116 -0
  34. package/crates/mint-core/src/api_server/routes/profile_oauth.rs +43 -26
  35. package/crates/mint-core/src/api_server/routes/sessions.rs +93 -76
  36. package/crates/mint-core/src/api_server/routes/skills_subagents.rs +11 -7
  37. package/crates/mint-core/src/api_server/routes/status_health.rs +18 -8
  38. package/crates/mint-core/src/api_server.rs +211 -65
  39. package/crates/mint-core/src/avatar_bridge.rs +5 -2
  40. package/crates/mint-core/src/browser/cdp.rs +82 -26
  41. package/crates/mint-core/src/browser/lifecycle.rs +143 -43
  42. package/crates/mint-core/src/browser/mod.rs +5 -4
  43. package/crates/mint-core/src/browser/navigate.rs +82 -9
  44. package/crates/mint-core/src/browser/runtime.rs +284 -0
  45. package/crates/mint-core/src/browser/session.rs +263 -7
  46. package/crates/mint-core/src/browser/workflow.rs +386 -0
  47. package/crates/mint-core/src/companion/navigation.rs +115 -0
  48. package/crates/mint-core/src/companion.rs +109 -1
  49. package/crates/mint-core/src/integrations/mcp_result.rs +45 -0
  50. package/crates/mint-core/src/lib.rs +10 -6
  51. package/crates/mint-core/src/media/image_proxy.rs +563 -0
  52. package/crates/mint-core/src/media/tool_images.rs +196 -0
  53. package/crates/mint-core/src/media/tts/playback.rs +609 -0
  54. package/crates/mint-core/src/media/tts.rs +1 -0
  55. package/crates/mint-core/src/media.rs +2 -0
  56. package/crates/mint-core/src/orchestration/context_render.rs +450 -33
  57. package/crates/mint-core/src/orchestration/decision_parsing.rs +5 -23
  58. package/crates/mint-core/src/orchestration/diagnostics.rs +307 -0
  59. package/crates/mint-core/src/orchestration/image_regressions.rs +379 -0
  60. package/crates/mint-core/src/orchestration/loop_guard.rs +334 -0
  61. package/crates/mint-core/src/orchestration/mod.rs +1104 -560
  62. package/crates/mint-core/src/orchestration/reliability.rs +541 -0
  63. package/crates/mint-core/src/orchestration/repeated_failures.rs +8 -0
  64. package/crates/mint-core/src/orchestration/review_regressions.rs +174 -28
  65. package/crates/mint-core/src/orchestration/tools/files.rs +31 -3
  66. package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +19 -4
  67. package/crates/mint-core/src/orchestration/tools/project.rs +1 -1
  68. package/crates/mint-core/src/orchestration/tools/shell.rs +29 -5
  69. package/crates/mint-core/src/orchestration/tools/web.rs +5 -1
  70. package/crates/mint-core/src/orchestration/trajectory_schema.rs +353 -0
  71. package/crates/mint-core/src/orchestration/truncation.rs +211 -0
  72. package/crates/mint-core/src/orchestration/verification.rs +36 -6
  73. package/crates/mint-core/src/orchestration/workspace_helpers.rs +54 -23
  74. package/crates/mint-core/src/prompts/agent.rs +31 -40
  75. package/crates/mint-core/src/prompts/tool_catalog.rs +134 -40
  76. package/crates/mint-core/src/search/web_search.rs +44 -3
  77. package/crates/mint-core/src/slash/mod.rs +464 -1
  78. package/crates/mint-core/src/swarm/batch.rs +643 -0
  79. package/crates/mint-core/src/swarm/dossier.rs +152 -0
  80. package/crates/mint-core/src/swarm/labels.rs +100 -0
  81. package/crates/mint-core/src/swarm/mod.rs +158 -0
  82. package/crates/mint-core/src/swarm/permissions.rs +167 -0
  83. package/crates/mint-core/src/system/auth.rs +156 -7
  84. package/crates/mint-core/src/system/bg_shell.rs +77 -9
  85. package/crates/mint-core/src/system/config.rs +92 -3
  86. package/crates/mint-core/src/system/mint_web.rs +33 -12
  87. package/crates/mint-core/src/system/shell.rs +179 -10
  88. package/crates/mint-core/src/system/workspace.rs +204 -0
  89. package/crates/mint-core/tests/background_retention.rs +1 -1
  90. package/crates/mint-core/tests/memory_persistence.rs +27 -0
  91. package/out/web/assets/ArtifactPreviewPanel-DAT_Y7i0.css +1 -0
  92. package/out/web/assets/ArtifactPreviewPanel-S0dPfYFx.js +2 -0
  93. package/out/web/assets/CalculationCard-CRjP3E1j.js +1 -0
  94. package/out/web/assets/{CliSessionsView-CtzUJpK_.css → CliSessionsView-C3Br2v5Y.css} +1 -1
  95. package/out/web/assets/CliSessionsView-MI8kXMAb.js +1 -0
  96. package/out/web/assets/CodeReviewPage-CUJceQme.css +1 -0
  97. package/out/web/assets/CodeReviewPage-VCUgPla_.js +2 -0
  98. package/out/web/assets/CommandPalette-BD8SlTE5.js +1 -0
  99. package/out/web/assets/ImageGenCard-BCXxkVJX.js +1 -0
  100. package/out/web/assets/ImageSearchCard-N3yQOr8Z.js +1 -0
  101. package/out/web/assets/ImageStudioPanel-BP7N4rLr.js +1 -0
  102. package/out/web/assets/LibraryPage-WlviRdR8.js +2 -0
  103. package/out/web/assets/LinkedFoldersView-CKRgroWK.js +1 -0
  104. package/out/web/assets/McpRegistryPicker-CoS83vtc.js +1 -0
  105. package/out/web/assets/McpServersView-D3wHnuHg.js +1 -0
  106. package/out/web/assets/MermaidCard-NqrHdyJW.js +2 -0
  107. package/out/web/assets/MintDashboard-B2DJsDDO.css +1 -0
  108. package/out/web/assets/MintDashboard-COw_xol7.js +63 -0
  109. package/out/web/assets/PluginsView-jBYmcKh4.js +1 -0
  110. package/out/web/assets/RewindModal-DempuDod.js +1 -0
  111. package/out/web/assets/ScheduledTasksView-5uw9-V9H.js +1 -0
  112. package/out/web/assets/SelectField-DXBQtrUK.js +1 -0
  113. package/out/web/assets/SelectField-lFEkkWCU.css +1 -0
  114. package/out/web/assets/SettingsWindow-2YP3yj7s.js +4 -0
  115. package/out/web/assets/SettingsWindow-Dz8LQVgD.css +1 -0
  116. package/out/web/assets/SkillsView-C-gp9J7m.js +2 -0
  117. package/out/web/assets/StockCard-BDMCe7mx.js +1 -0
  118. package/out/web/assets/ToolSurfacePage-B0J_q0Jl.js +38 -0
  119. package/out/web/assets/ToolSurfacePage-CRIQ1owD.css +1 -0
  120. package/out/web/assets/UiFeatureCard-6BwxTOCe.js +1 -0
  121. package/out/web/assets/UiGridCard-DvZcLNxb.js +1 -0
  122. package/out/web/assets/UiMockupWidget-DD73QWg1.js +1 -0
  123. package/out/web/assets/VeoStudioPanel-DfsOJKv0.js +4 -0
  124. package/out/web/assets/WeatherCard-CPucIfq8.js +1 -0
  125. package/out/web/assets/WorkspacePanel-BfHKkulU.js +1 -0
  126. package/out/web/assets/WorkspacePdfPreview-Dx_lkjNu.js +2 -0
  127. package/out/web/assets/abnfDiagram-VCTEODGH-BOo3Ckng.js +1 -0
  128. package/out/web/assets/architecture-7GRP2DOG-ZOwheW3n.js +1 -0
  129. package/out/web/assets/architectureDiagram-5GKGNRK7-DC2FDzVd.js +36 -0
  130. package/out/web/assets/{blockDiagram-NRAW4CY4-BrrqzHW5.js → blockDiagram-I7D4REHJ-BrKFWdAH.js} +4 -4
  131. package/out/web/assets/c4Diagram-7LVT6UL2-BHTHK1Yd.js +38 -0
  132. package/out/web/assets/chunk-2Q5K7J3B-D2JLPQzF.js +1 -0
  133. package/out/web/assets/{chunk-TEH6E4GO-G4Cdlyrt.js → chunk-4HAMMTFA-BYFkZwNj.js} +3 -3
  134. package/out/web/assets/{chunk-5VM5RSS4-BiPuE0io.js → chunk-5VM5RSS4-BZ2oBPYQ.js} +1 -1
  135. package/out/web/assets/chunk-75Z2AOVW-BSKfSKSA.js +2 -0
  136. package/out/web/assets/chunk-DU6HZSFF-vIhsiW6n.js +128 -0
  137. package/out/web/assets/chunk-F27PBJKO-BlYpW9xq.js +1 -0
  138. package/out/web/assets/chunk-FOHPRMQF-JXEeeJ9r.js +161 -0
  139. package/out/web/assets/{chunk-GMAD6QVW-BuhEcgHq.js → chunk-GMAD6QVW-BIBz_Ug5.js} +12 -12
  140. package/out/web/assets/chunk-GVQU2GXP-NPSHxeqC.js +1 -0
  141. package/out/web/assets/chunk-IMKFNOWR-YlJK8_Fp.js +231 -0
  142. package/out/web/assets/chunk-JWPE2WC7-BeEMUFDw.js +1 -0
  143. package/out/web/assets/chunk-L3NEJ4N5-DMYi4-af.js +1 -0
  144. package/out/web/assets/chunk-OSK3NFVY-Begd3-jA.js +10 -0
  145. package/out/web/assets/chunk-P2QGCYS3-D1I4xFHN.js +1 -0
  146. package/out/web/assets/chunk-POPQ4Y6H-CafZZzNE.js +1 -0
  147. package/out/web/assets/chunk-PWAF6VOD-Dwh6_Lnt.js +1 -0
  148. package/out/web/assets/chunk-SHT3W25Y-B0XrCSEb.js +168 -0
  149. package/out/web/assets/{chunk-SVP7TREG-Bu_yYb-V.js → chunk-SVP7TREG-CxLsddxC.js} +1 -1
  150. package/out/web/assets/{chunk-LCL6LL3I-BhXV9zyH.js → chunk-TICWLB2K-y156QInb.js} +4 -4
  151. package/out/web/assets/chunk-XXDRQBXY-B9YlhOkE.js +1 -0
  152. package/out/web/assets/chunk-Y2CYZVJY-BxCWjNVG.js +1 -0
  153. package/out/web/assets/classDiagram-ZZMXUADV-BgJ5WtSp.js +1 -0
  154. package/out/web/assets/classDiagram-v2-VYDZK3BY-BgJ5WtSp.js +1 -0
  155. package/out/web/assets/config-CvIO5hkn.js +2 -0
  156. package/out/web/assets/config-DqXJXeZM.css +1 -0
  157. package/out/web/assets/core-Mi3s5D4_.js +1 -0
  158. package/out/web/assets/cose-bilkent-JH36ORCC-qlna31ty.js +1 -0
  159. package/out/web/assets/cynefin-OW5HDTMX-SMVvrLf-.js +1 -0
  160. package/out/web/assets/cynefinDiagram-5FMLGOSQ-rZznN24T.js +62 -0
  161. package/out/web/assets/cytoscape.esm-DWtAUG0r.js +321 -0
  162. package/out/web/assets/dagre-CnWJJM5f.js +1 -0
  163. package/out/web/assets/dagre-GXQ25YYZ-BOToydFu.js +4 -0
  164. package/out/web/assets/diagram-S7CK7UJ4-TMVaGQEJ.js +30 -0
  165. package/out/web/assets/diagram-UQ7AKVKN-C2JK-GP2.js +41 -0
  166. package/out/web/assets/{diagram-VSXAHHWV-BJ86Ov2Y.js → diagram-VSXAHHWV-Cw8VSi2K.js} +1 -1
  167. package/out/web/assets/diagram-VX7I27RA-DXp4fKk9.js +24 -0
  168. package/out/web/assets/diagram-Z3DM3KII-CzSicYiW.js +24 -0
  169. package/out/web/assets/dist-9ISJ7r-g.js +1 -0
  170. package/out/web/assets/dist-js-BV3mI7uw.js +1 -0
  171. package/out/web/assets/ebnfDiagram-PWID7BFC-Dqj-zqPu.js +1 -0
  172. package/out/web/assets/{erDiagram-SSCWMZ5O-CzzmnZWT.js → erDiagram-RLTQ6QDP-DZwFZAuD.js} +3 -3
  173. package/out/web/assets/event-D7D-EBy9.js +1 -0
  174. package/out/web/assets/eventmodeling-NTZA5JFV-C0O-Lvgp.js +1 -0
  175. package/out/web/assets/flowDiagram-HODETNUW-uqCHJond.js +1 -0
  176. package/out/web/assets/ganttDiagram-EL5Y4UJY-Da4ULXTl.js +292 -0
  177. package/out/web/assets/gitGraph-4MIJSDKK-B9wNFZIP.js +1 -0
  178. package/out/web/assets/gitGraphDiagram-WWUBYQGX-RjrhB0MP.js +106 -0
  179. package/out/web/assets/graphlib-Bh9gHply.js +1 -0
  180. package/out/web/assets/index-BmpulIkg.js +168 -0
  181. package/out/web/assets/index-CkvBwhX_.css +1 -0
  182. package/out/web/assets/info-A6RAGUB7-B3dfCpeY.js +1 -0
  183. package/out/web/assets/infoDiagram-27XIBGKW-QVWkLVx7.js +2 -0
  184. package/out/web/assets/{ishikawaDiagram-5VMMS53U-s38yo28y.js → ishikawaDiagram-5VMMS53U-CLFNIRI9.js} +4 -4
  185. package/out/web/assets/journeyDiagram-3NMN7TZE-fgOQadYF.js +139 -0
  186. package/out/web/assets/jsx-runtime-DmUwWVTj.js +1 -0
  187. package/out/web/assets/{kanban-definition-3QL26DDD-DodjgySL.js → kanban-definition-UXKFOSKX-G3Q_9g9O.js} +6 -6
  188. package/out/web/assets/katex-MCdQaEAD.js +257 -0
  189. package/out/web/assets/mermaid-parser.core-v3Jm7nco.js +7 -0
  190. package/out/web/assets/mermaid.core-DTEjLUA1.js +44 -0
  191. package/out/web/assets/{mindmap-definition-FBJOCRG2-260WBDxZ.js → mindmap-definition-YA3MSWOX-C_D42_fF.js} +4 -4
  192. package/out/web/assets/modelManager-BPLycQrN.js +2 -0
  193. package/out/web/assets/oauthManager-BUK7ic7q.js +1 -0
  194. package/out/web/assets/packet-AYTQ26CC-B-R-SHlF.js +1 -0
  195. package/out/web/assets/pdf-Bcahc2yC.js +56 -0
  196. package/out/web/assets/pdf.worker.min-Dkey6ZUl.mjs +27 -0
  197. package/out/web/assets/pegDiagram-XKGWAZYB-Da2q_giz.js +1 -0
  198. package/out/web/assets/pie-WAS4IAKB-BC8F0N7-.js +1 -0
  199. package/out/web/assets/pieDiagram-E7YTZNPT-Iy9REJNC.js +39 -0
  200. package/out/web/assets/{quadrantDiagram-AXDQQJYC-B8D3gU5d.js → quadrantDiagram-AXDQQJYC-ztsiYw7h.js} +4 -4
  201. package/out/web/assets/radar-RG4KPBEZ-B_1P8Z_z.js +1 -0
  202. package/out/web/assets/railroad-74A4TZTK-DuTqczSo.js +1 -0
  203. package/out/web/assets/railroad-abnf-HS5TGJTU-Df29WLmp.js +1 -0
  204. package/out/web/assets/railroad-ebnf-LZEXJU2U-ePFMo-qp.js +1 -0
  205. package/out/web/assets/railroad-peg-WCYAUIDC-DYXLW4_E.js +1 -0
  206. package/out/web/assets/railroadDiagram-O6MQD6OU-LStnZf2S.js +1 -0
  207. package/out/web/assets/{requirementDiagram-EFPCY7ZU-D2X-Ewik.js → requirementDiagram-BXWQKSXE-DmzonMH-.js} +3 -3
  208. package/out/web/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
  209. package/out/web/assets/rough.esm-CNnFptCR.js +1 -0
  210. package/out/web/assets/sankeyDiagram-P5KCCOFB-B8vjmUU1.js +40 -0
  211. package/out/web/assets/sequenceDiagram-WJ2MYXX4-CTnplOAX.js +162 -0
  212. package/out/web/assets/sizeCapture-INFHLROL-C8Q8DbV5.js +1 -0
  213. package/out/web/assets/src-CRDfRlHM.js +1 -0
  214. package/out/web/assets/stateDiagram-D77RDMKH-BFrIaLdI.js +1 -0
  215. package/out/web/assets/stateDiagram-v2-MP3YSRHH-uf3kdNW4.js +1 -0
  216. package/out/web/assets/studio-BBZQ_-QK.js +1 -0
  217. package/out/web/assets/swimlanes-42K2YHIH-BXGngUNU.js +1 -0
  218. package/out/web/assets/swimlanesDiagram-VR7AAH4N-Y8q5bQce.js +8 -0
  219. package/out/web/assets/timeline-definition-24CTP7MA-CegH7n43.js +120 -0
  220. package/out/web/assets/treeView-Q6P3EWNA-DTpJv2Tw.js +1 -0
  221. package/out/web/assets/treemap-WGGIJYW6-i8M9iJU6.js +1 -0
  222. package/out/web/assets/vennDiagram-4TSXK5OY-Dpzo1S8U.js +34 -0
  223. package/out/web/assets/wardley-WFR3VGLG-BrNsgtfw.js +1 -0
  224. package/out/web/assets/{wardleyDiagram-VM6X3IG4-DAdXELbQ.js → wardleyDiagram-VM6X3IG4-lQ92LFE1.js} +35 -35
  225. package/out/web/assets/window-CkUOP7t0.js +1 -0
  226. package/out/web/assets/workspaces-SYPrmbgC.js +1 -0
  227. package/out/web/assets/{xychartDiagram-S5SC5T6Z-IZIXf3Vo.js → xychartDiagram-S5SC5T6Z-BaOaEoBd.js} +4 -4
  228. package/out/web/index-web.html +4 -4
  229. package/out/web/index.html +4 -4
  230. package/out/web/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  231. package/out/web/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  232. package/out/web/pdfjs/cmaps/78-H.bcmap +0 -0
  233. package/out/web/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  234. package/out/web/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  235. package/out/web/pdfjs/cmaps/78-V.bcmap +0 -0
  236. package/out/web/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  237. package/out/web/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  238. package/out/web/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  239. package/out/web/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  240. package/out/web/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  241. package/out/web/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  242. package/out/web/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  243. package/out/web/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  244. package/out/web/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  245. package/out/web/pdfjs/cmaps/Add-H.bcmap +0 -0
  246. package/out/web/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  247. package/out/web/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  248. package/out/web/pdfjs/cmaps/Add-V.bcmap +0 -0
  249. package/out/web/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  250. package/out/web/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  251. package/out/web/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  252. package/out/web/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  253. package/out/web/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  254. package/out/web/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  255. package/out/web/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  256. package/out/web/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  257. package/out/web/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  258. package/out/web/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  259. package/out/web/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  260. package/out/web/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  261. package/out/web/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  262. package/out/web/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  263. package/out/web/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  264. package/out/web/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  265. package/out/web/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  266. package/out/web/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  267. package/out/web/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  268. package/out/web/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  269. package/out/web/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  270. package/out/web/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  271. package/out/web/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  272. package/out/web/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  273. package/out/web/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  274. package/out/web/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  275. package/out/web/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  276. package/out/web/pdfjs/cmaps/B5-H.bcmap +0 -0
  277. package/out/web/pdfjs/cmaps/B5-V.bcmap +0 -0
  278. package/out/web/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  279. package/out/web/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  280. package/out/web/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  281. package/out/web/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  282. package/out/web/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  283. package/out/web/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  284. package/out/web/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  285. package/out/web/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  286. package/out/web/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  287. package/out/web/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  288. package/out/web/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  289. package/out/web/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  290. package/out/web/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  291. package/out/web/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  292. package/out/web/pdfjs/cmaps/EUC-H.bcmap +0 -0
  293. package/out/web/pdfjs/cmaps/EUC-V.bcmap +0 -0
  294. package/out/web/pdfjs/cmaps/Ext-H.bcmap +0 -0
  295. package/out/web/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  296. package/out/web/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  297. package/out/web/pdfjs/cmaps/Ext-V.bcmap +0 -0
  298. package/out/web/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  299. package/out/web/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  300. package/out/web/pdfjs/cmaps/GB-H.bcmap +4 -0
  301. package/out/web/pdfjs/cmaps/GB-V.bcmap +0 -0
  302. package/out/web/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  303. package/out/web/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  304. package/out/web/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  305. package/out/web/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  306. package/out/web/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  307. package/out/web/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  308. package/out/web/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  309. package/out/web/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  310. package/out/web/pdfjs/cmaps/GBT-H.bcmap +0 -0
  311. package/out/web/pdfjs/cmaps/GBT-V.bcmap +0 -0
  312. package/out/web/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  313. package/out/web/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  314. package/out/web/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  315. package/out/web/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  316. package/out/web/pdfjs/cmaps/H.bcmap +0 -0
  317. package/out/web/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  318. package/out/web/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  319. package/out/web/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  320. package/out/web/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  321. package/out/web/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  322. package/out/web/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  323. package/out/web/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  324. package/out/web/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  325. package/out/web/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  326. package/out/web/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  327. package/out/web/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  328. package/out/web/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  329. package/out/web/pdfjs/cmaps/Hankaku.bcmap +0 -0
  330. package/out/web/pdfjs/cmaps/Hiragana.bcmap +0 -0
  331. package/out/web/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  332. package/out/web/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  333. package/out/web/pdfjs/cmaps/KSC-H.bcmap +0 -0
  334. package/out/web/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  335. package/out/web/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  336. package/out/web/pdfjs/cmaps/KSC-V.bcmap +0 -0
  337. package/out/web/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  338. package/out/web/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  339. package/out/web/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  340. package/out/web/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  341. package/out/web/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  342. package/out/web/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  343. package/out/web/pdfjs/cmaps/Katakana.bcmap +0 -0
  344. package/out/web/pdfjs/cmaps/LICENSE +36 -0
  345. package/out/web/pdfjs/cmaps/NWP-H.bcmap +0 -0
  346. package/out/web/pdfjs/cmaps/NWP-V.bcmap +0 -0
  347. package/out/web/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  348. package/out/web/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  349. package/out/web/pdfjs/cmaps/Roman.bcmap +0 -0
  350. package/out/web/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  351. package/out/web/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  352. package/out/web/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  353. package/out/web/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  354. package/out/web/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  355. package/out/web/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  356. package/out/web/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  357. package/out/web/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  358. package/out/web/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  359. package/out/web/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  360. package/out/web/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  361. package/out/web/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  362. package/out/web/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  363. package/out/web/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  364. package/out/web/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  365. package/out/web/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  366. package/out/web/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  367. package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  368. package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  369. package/out/web/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  370. package/out/web/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  371. package/out/web/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  372. package/out/web/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  373. package/out/web/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  374. package/out/web/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  375. package/out/web/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  376. package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  377. package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  378. package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  379. package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  380. package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  381. package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  382. package/out/web/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  383. package/out/web/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  384. package/out/web/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  385. package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  386. package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  387. package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  388. package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  389. package/out/web/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  390. package/out/web/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  391. package/out/web/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  392. package/out/web/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  393. package/out/web/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  394. package/out/web/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  395. package/out/web/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  396. package/out/web/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  397. package/out/web/pdfjs/cmaps/V.bcmap +0 -0
  398. package/out/web/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  399. package/out/web/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  400. package/out/web/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  401. package/out/web/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  402. package/out/web/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  403. package/out/web/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  404. package/out/web/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  405. package/out/web/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  406. package/out/web/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  407. package/out/web/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  408. package/out/web/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  409. package/out/web/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  410. package/out/web/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
  411. package/out/web/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  412. package/out/web/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  413. package/out/web/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  414. package/out/web/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  415. package/out/web/pdfjs/wasm/LICENSE_JBIG2 +196 -0
  416. package/out/web/pdfjs/wasm/LICENSE_OPENJPEG +39 -0
  417. package/out/web/pdfjs/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  418. package/out/web/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  419. package/out/web/pdfjs/wasm/LICENSE_PDFJS_QCMS +19 -0
  420. package/out/web/pdfjs/wasm/LICENSE_QCMS +21 -0
  421. package/out/web/pdfjs/wasm/jbig2.wasm +0 -0
  422. package/out/web/pdfjs/wasm/jbig2_nowasm_fallback.js +15 -0
  423. package/out/web/pdfjs/wasm/openjpeg.wasm +0 -0
  424. package/out/web/pdfjs/wasm/openjpeg_nowasm_fallback.js +17 -0
  425. package/out/web/pdfjs/wasm/qcms_bg.wasm +0 -0
  426. package/out/web/pdfjs/wasm/quickjs-eval.js +16 -0
  427. package/out/web/pdfjs/wasm/quickjs-eval.wasm +0 -0
  428. package/package.json +6 -4
  429. package/slash-commands.json +8 -2
  430. package/src/bin/index.js +4 -1
  431. package/src/bin/pdfjs-assets.mjs +31 -0
  432. package/src/renderer/node_modules/.vite/vitest/CACHEDIR.TAG +3 -0
  433. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  434. package/src/renderer/shared/agentProgress.ts +11 -2
  435. package/src/renderer/shared/components/Settings/AgentsTab.tsx +70 -6
  436. package/src/renderer/shared/components/Settings/AudioTab.tsx +1 -1
  437. package/src/renderer/shared/components/Settings/AutomationTab.tsx +57 -0
  438. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +18 -12
  439. package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.test.tsx +65 -0
  440. package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.tsx +456 -0
  441. package/src/renderer/shared/components/Settings/GeneralTab.tsx +40 -82
  442. package/src/renderer/shared/components/Settings/PluginsTab.tsx +101 -24
  443. package/src/renderer/shared/components/Settings/ProfileTab.tsx +1 -1
  444. package/src/renderer/shared/components/Settings/SettingsWindow.tsx +796 -0
  445. package/src/renderer/shared/components/Settings/ThemeTab.tsx +13 -1
  446. package/src/renderer/shared/components/{AgentActivityDrawer.tsx → activity/AgentActivityDrawer.tsx} +77 -61
  447. package/src/renderer/shared/components/{AgentActivityTable.tsx → activity/AgentActivityTable.tsx} +46 -7
  448. package/src/renderer/shared/components/{McpToolResults.tsx → activity/McpToolResults.tsx} +32 -13
  449. package/src/renderer/shared/components/{PlanChecklistWidget.tsx → activity/PlanChecklistWidget.tsx} +2 -2
  450. package/src/renderer/shared/components/activity/RunSummaryDashboard.test.tsx +127 -0
  451. package/src/renderer/shared/components/activity/RunSummaryDashboard.tsx +222 -0
  452. package/src/renderer/shared/components/activity/SubagentDagView.test.ts +123 -0
  453. package/src/renderer/shared/components/{SubagentDagView.tsx → activity/SubagentDagView.tsx} +97 -43
  454. package/src/renderer/shared/components/activity/SubagentStatusStrip.test.tsx +82 -0
  455. package/src/renderer/shared/components/activity/SubagentStatusStrip.tsx +107 -0
  456. package/src/renderer/shared/components/activity/ViewedImages.tsx +140 -0
  457. package/src/renderer/shared/components/{AuthGate.tsx → app/AuthGate.tsx} +3 -3
  458. package/src/renderer/shared/components/{ChunkErrorBoundary.tsx → app/ChunkErrorBoundary.tsx} +10 -10
  459. package/src/renderer/shared/components/{CommandPalette.tsx → app/CommandPalette.tsx} +25 -25
  460. package/src/renderer/shared/components/{DashboardSidebar.tsx → app/DashboardSidebar.tsx} +7 -5
  461. package/src/renderer/shared/components/{DesktopTitlebar.tsx → app/DesktopTitlebar.tsx} +7 -24
  462. package/src/renderer/shared/components/{ErrorNotice.tsx → app/ErrorNotice.tsx} +1 -1
  463. package/src/renderer/shared/components/{MintDashboard.tsx → app/MintDashboard.tsx} +191 -212
  464. package/src/renderer/shared/components/{ModalErrorBoundary.tsx → app/ModalErrorBoundary.tsx} +5 -5
  465. package/src/renderer/shared/components/{CalculationCard.tsx → cards/CalculationCard.tsx} +13 -27
  466. package/src/renderer/shared/components/{ImageGenCard.tsx → cards/ImageGenCard.tsx} +9 -22
  467. package/src/renderer/shared/components/{ImageSearchCard.tsx → cards/ImageSearchCard.tsx} +9 -22
  468. package/src/renderer/shared/components/{MermaidCard.tsx → cards/MermaidCard.tsx} +37 -21
  469. package/src/renderer/shared/components/{StockCard.tsx → cards/StockCard.tsx} +15 -31
  470. package/src/renderer/shared/components/cards/ToolResultCards.tsx +86 -0
  471. package/src/renderer/shared/components/{UiFeatureCard.tsx → cards/UiFeatureCard.tsx} +6 -6
  472. package/src/renderer/shared/components/{UiGridCard.tsx → cards/UiGridCard.tsx} +3 -3
  473. package/src/renderer/shared/components/{WeatherCard.tsx → cards/WeatherCard.tsx} +1 -1
  474. package/src/renderer/shared/components/{ApprovalCard.test.tsx → chat/ApprovalCard.test.tsx} +1 -1
  475. package/src/renderer/shared/components/{ApprovalCard.tsx → chat/ApprovalCard.tsx} +5 -5
  476. package/src/renderer/shared/components/{ChatCodeBlock.tsx → chat/ChatCodeBlock.tsx} +1 -1
  477. package/src/renderer/shared/components/{ChatMessageItem.test.tsx → chat/ChatMessageItem.test.tsx} +92 -15
  478. package/src/renderer/shared/components/{ChatMessageItem.tsx → chat/ChatMessageItem.tsx} +73 -157
  479. package/src/renderer/shared/components/chat/ChatPanel.test.tsx +31 -0
  480. package/src/renderer/shared/components/{ChatPanel.tsx → chat/ChatPanel.tsx} +244 -493
  481. package/src/renderer/shared/components/{CollapsiblePasteInput.tsx → chat/CollapsiblePasteInput.tsx} +2 -2
  482. package/src/renderer/shared/components/{DiffReviewModal.tsx → chat/DiffReviewModal.tsx} +40 -40
  483. package/src/renderer/shared/components/{GeminiLiveOverlay.tsx → chat/GeminiLiveOverlay.tsx} +2 -2
  484. package/src/renderer/shared/components/{ModelSelectorPopover.tsx → chat/ModelSelectorPopover.tsx} +3 -3
  485. package/src/renderer/shared/components/chat/QueuedMessagesBanner.test.tsx +89 -0
  486. package/src/renderer/shared/components/chat/QueuedMessagesBanner.tsx +201 -0
  487. package/src/renderer/shared/components/{RewindModal.tsx → chat/RewindModal.tsx} +4 -4
  488. package/src/renderer/shared/components/{SlashChoicePanel.tsx → chat/SlashChoicePanel.tsx} +2 -2
  489. package/src/renderer/shared/components/{SlashSuggestions.tsx → chat/SlashSuggestions.tsx} +4 -4
  490. package/src/renderer/shared/components/{SourcesBlock.tsx → chat/SourcesBlock.tsx} +30 -37
  491. package/src/renderer/shared/components/{ThinkingBlock.tsx → chat/ThinkingBlock.tsx} +1 -1
  492. package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +86 -0
  493. package/src/renderer/shared/components/chat/TurnFileChanges.tsx +430 -0
  494. package/src/renderer/shared/components/{VoicePill.css → chat/VoicePill.css} +1 -1
  495. package/src/renderer/shared/components/{VoicePill.jsx → chat/VoicePill.jsx} +3 -2
  496. package/src/renderer/shared/components/{CliSessionsView.test.tsx → extensions/CliSessionsView.test.tsx} +2 -2
  497. package/src/renderer/shared/components/{CliSessionsView.tsx → extensions/CliSessionsView.tsx} +14 -12
  498. package/src/renderer/shared/components/{LinkedFoldersView.tsx → extensions/LinkedFoldersView.tsx} +3 -3
  499. package/src/renderer/shared/components/{McpRegistryPicker.tsx → extensions/McpRegistryPicker.tsx} +3 -3
  500. package/src/renderer/shared/components/{McpServersView.tsx → extensions/McpServersView.tsx} +105 -36
  501. package/src/renderer/shared/components/{McpToolAllowlist.tsx → extensions/McpToolAllowlist.tsx} +2 -2
  502. package/src/renderer/shared/components/{ModUi.test.tsx → extensions/ModUi.test.tsx} +9 -4
  503. package/src/renderer/shared/components/{ModsPanel.tsx → extensions/ModsPanel.tsx} +59 -7
  504. package/src/renderer/shared/components/{PluginsView.tsx → extensions/PluginsView.tsx} +6 -6
  505. package/src/renderer/shared/components/{ScheduledTasksView.tsx → extensions/ScheduledTasksView.tsx} +5 -5
  506. package/src/renderer/shared/components/extensions/SkillsView.test.tsx +31 -0
  507. package/src/renderer/shared/components/{SkillsView.tsx → extensions/SkillsView.tsx} +20 -4
  508. package/src/renderer/shared/components/{ImageStudioPanel.tsx → studio/ImageStudioPanel.tsx} +6 -6
  509. package/src/renderer/shared/components/{LibraryItemCard.tsx → studio/LibraryItemCard.tsx} +2 -2
  510. package/src/renderer/shared/components/{LibraryPage.tsx → studio/LibraryPage.tsx} +5 -5
  511. package/src/renderer/shared/components/{LibraryPreview.tsx → studio/LibraryPreview.tsx} +2 -2
  512. package/src/renderer/shared/components/{VeoStudioPanel.tsx → studio/VeoStudioPanel.tsx} +7 -7
  513. package/src/renderer/shared/components/{GlideSelect.css → ui/GlideSelect.css} +7 -6
  514. package/src/renderer/shared/components/ui/ProviderBrandIcon.test.tsx +67 -0
  515. package/src/renderer/shared/components/ui/ProviderBrandIcon.tsx +167 -0
  516. package/src/renderer/shared/components/ui/SelectField.tsx +506 -0
  517. package/src/renderer/shared/components/ui/error-recovery.css +10 -10
  518. package/src/renderer/shared/components/ui/error-recovery.tsx +1 -1
  519. package/src/renderer/shared/components/{ArtifactPreviewPanel.tsx → workspace/ArtifactPreviewPanel.tsx} +256 -112
  520. package/src/renderer/shared/components/workspace/BackgroundTerminals.test.tsx +63 -0
  521. package/src/renderer/shared/components/{BackgroundTerminals.tsx → workspace/BackgroundTerminals.tsx} +40 -9
  522. package/src/renderer/shared/components/{CodeReviewPage.tsx → workspace/CodeReviewPage.tsx} +47 -8
  523. package/src/renderer/shared/components/{GitBranchSelector.tsx → workspace/GitBranchSelector.tsx} +2 -2
  524. package/src/renderer/shared/components/workspace/SessionSources.tsx +113 -0
  525. package/src/renderer/shared/components/{TerminalDock.tsx → workspace/TerminalDock.tsx} +5 -2
  526. package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +68 -0
  527. package/src/renderer/shared/components/{ToolSurfacePage.tsx → workspace/ToolSurfacePage.tsx} +322 -71
  528. package/src/renderer/shared/components/{ToolsPanelToggle.tsx → workspace/ToolsPanelToggle.tsx} +1 -1
  529. package/src/renderer/shared/components/workspace/WorkspaceFileInfo.tsx +28 -0
  530. package/src/renderer/shared/components/workspace/WorkspaceMediaPreview.tsx +17 -0
  531. package/src/renderer/shared/components/{WorkspacePaneResizer.tsx → workspace/WorkspacePaneResizer.tsx} +1 -1
  532. package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +89 -0
  533. package/src/renderer/shared/components/{WorkspacePreviewActions.test.tsx → workspace/WorkspacePreviewActions.test.tsx} +48 -3
  534. package/src/renderer/shared/components/{WorkspacePreviewActions.tsx → workspace/WorkspacePreviewActions.tsx} +3 -3
  535. package/src/renderer/shared/components/{WorkspaceSelector.tsx → workspace/WorkspaceSelector.tsx} +99 -7
  536. package/src/renderer/shared/components/{workspace-selector.css → workspace/workspace-selector.css} +84 -2
  537. package/src/renderer/shared/constants/config.ts +7 -0
  538. package/src/renderer/shared/conversation/coordinator.test.ts +46 -0
  539. package/src/renderer/shared/conversation/coordinator.ts +50 -2
  540. package/src/renderer/shared/conversation/lifecycle.test.ts +163 -1
  541. package/src/renderer/shared/conversation/lifecycle.ts +164 -7
  542. package/src/renderer/shared/conversation/projectNavigation.test.ts +18 -0
  543. package/src/renderer/shared/conversation/projectNavigation.ts +11 -0
  544. package/src/renderer/shared/conversation/transport.test.ts +20 -0
  545. package/src/renderer/shared/conversation/transport.ts +51 -9
  546. package/src/renderer/shared/conversation/useConversationCoordinator.ts +42 -12
  547. package/src/renderer/shared/css/agent-observability.css +72 -11
  548. package/src/renderer/shared/css/chat-ui-cards.css +35 -35
  549. package/src/renderer/shared/css/code-review.css +86 -86
  550. package/src/renderer/shared/css/code-sessions.css +10 -10
  551. package/src/renderer/shared/css/file-changes.css +167 -5
  552. package/src/renderer/shared/css/management-views.css +78 -37
  553. package/src/renderer/shared/css/mcp-results.css +46 -3
  554. package/src/renderer/shared/css/queued-messages.css +221 -0
  555. package/src/renderer/shared/css/session-sources.css +12 -7
  556. package/src/renderer/shared/css/settings/agents.css +2 -2
  557. package/src/renderer/{src-web → shared}/css/settings/base.css +101 -107
  558. package/src/renderer/shared/css/settings/general.css +384 -92
  559. package/src/renderer/shared/css/settings/plugins.css +8 -8
  560. package/src/renderer/shared/css/settings/theme.css +44 -32
  561. package/src/renderer/shared/css/ui-tailwind.css +2 -2
  562. package/src/renderer/shared/css/viewed-images.css +89 -0
  563. package/src/renderer/shared/css/workspace-file-info.css +12 -0
  564. package/src/renderer/shared/css/workspace-media-preview.css +13 -0
  565. package/src/renderer/shared/env.d.ts +9 -0
  566. package/src/renderer/shared/platform.test.ts +143 -0
  567. package/src/renderer/shared/platform.ts +10 -4
  568. package/src/renderer/shared/speech/player.ts +160 -0
  569. package/src/renderer/shared/speech/types.ts +11 -0
  570. package/src/renderer/shared/theme/themeManager.test.ts +20 -0
  571. package/src/renderer/shared/theme/themeManager.ts +3 -1
  572. package/src/renderer/shared/theme/themes.ts +17 -4
  573. package/src/renderer/shared/theme/tokens.css +448 -51
  574. package/src/renderer/shared/types.ts +56 -1
  575. package/src/renderer/shared/utils/agentActivity.test.ts +165 -6
  576. package/src/renderer/shared/utils/agentActivity.ts +181 -31
  577. package/src/renderer/shared/utils/artifactBrowser.ts +1 -1
  578. package/src/renderer/shared/utils/artifacts.ts +55 -0
  579. package/src/renderer/shared/utils/contextCompaction.test.tsx +1 -1
  580. package/src/renderer/shared/utils/externalLinks.ts +91 -0
  581. package/src/renderer/shared/utils/lazyWithRetry.ts +13 -0
  582. package/src/renderer/shared/utils/markdown.tsx +169 -35
  583. package/src/renderer/shared/utils/markdown.webImages.test.tsx +124 -2
  584. package/src/renderer/shared/utils/mcpResults.test.tsx +24 -1
  585. package/src/renderer/shared/utils/pdfRange.ts +16 -0
  586. package/src/renderer/shared/utils/previewObjectUrls.ts +20 -0
  587. package/src/renderer/shared/utils/sessionSources.test.ts +41 -1
  588. package/src/renderer/shared/utils/sessionSources.ts +2 -0
  589. package/src/renderer/shared/utils/slashCommandProcessor.ts +4 -1
  590. package/src/renderer/shared/utils/speech.ts +18 -4
  591. package/src/renderer/shared/utils/useNativeVoiceInput.ts +19 -5
  592. package/src/renderer/shared/utils/useSessionSources.ts +4 -0
  593. package/src/renderer/shared/utils/viewedImages.test.ts +129 -0
  594. package/src/renderer/shared/utils/viewedImages.ts +81 -10
  595. package/src/renderer/shared/utils/workspaceDrag.ts +30 -0
  596. package/src/renderer/shared/utils/workspaceImage.ts +17 -0
  597. package/src/renderer/shared/utils/workspaceListPreferences.test.ts +64 -0
  598. package/src/renderer/shared/utils/workspaceListPreferences.ts +54 -0
  599. package/src/renderer/shared/utils/workspaceMedia.ts +41 -0
  600. package/src/renderer/shared/utils/workspacePreview.test.ts +147 -2
  601. package/src/renderer/shared/utils/workspacePreview.ts +34 -3
  602. package/src/renderer/shared/utils/workspaces.ts +3 -2
  603. package/src/renderer/src/App.tsx +6 -8
  604. package/src/renderer/src/components/ChatPanel.tsx +1 -1
  605. package/src/renderer/src/components/DashboardSidebar.tsx +2 -2
  606. package/src/renderer/src/components/ImageStudioPanel.tsx +1 -1
  607. package/src/renderer/src/components/LiveTranslateControls.tsx +1 -1
  608. package/src/renderer/src/components/MintDashboard.tsx +1 -1
  609. package/src/renderer/src/components/ProactiveGlow.tsx +1 -1
  610. package/src/renderer/src/components/ScreenPicker.tsx +1 -1
  611. package/src/renderer/src/components/SettingsWindow.tsx +6 -830
  612. package/src/renderer/src/components/SpotlightWindow.tsx +4 -32
  613. package/src/renderer/src/components/VeoStudioPanel.tsx +1 -1
  614. package/src/renderer/src/components/WorkspacePanel.tsx +45 -12
  615. package/src/renderer/src/components/browser-shell.css +26 -26
  616. package/src/renderer/src/components/browser-suggestions-popup.css +8 -8
  617. package/src/renderer/src/css/app-shell.css +22 -102
  618. package/src/renderer/src/css/chat.css +221 -34
  619. package/src/renderer/src/css/desktop-tools.css +6 -337
  620. package/src/renderer/src/css/sidebar-workspace.css +20 -0
  621. package/src/renderer/src/css/spotlight.css +2 -2
  622. package/src/renderer/src/css/tool-surfaces.css +328 -58
  623. package/src/renderer/src/css/widget.css +6 -5
  624. package/src/renderer/src/env.d.ts +13 -0
  625. package/src/renderer/src/index.css +15 -63
  626. package/src/renderer/src/tauri.ts +77 -11
  627. package/src/renderer/src/voiceInput.ts +3 -1
  628. package/src/renderer/src-web/App.tsx +6 -8
  629. package/src/renderer/src-web/components/ChatPanel.tsx +1 -1
  630. package/src/renderer/src-web/components/DashboardSidebar.tsx +2 -2
  631. package/src/renderer/src-web/components/ImageStudioPanel.tsx +1 -1
  632. package/src/renderer/src-web/components/MintDashboard.tsx +1 -1
  633. package/src/renderer/src-web/components/SettingsWindow.tsx +6 -851
  634. package/src/renderer/src-web/components/VeoStudioPanel.tsx +1 -1
  635. package/src/renderer/src-web/css/app-shell.css +16 -100
  636. package/src/renderer/src-web/css/chat.css +221 -34
  637. package/src/renderer/src-web/css/sidebar-workspace.css +20 -0
  638. package/src/renderer/src-web/env.d.ts +14 -0
  639. package/src/renderer/src-web/index.css +15 -63
  640. package/src/renderer/src-web/tauri.ts +71 -13
  641. package/src/renderer/tests/browserArtifacts.browser.html +1 -0
  642. package/src/renderer/tests/browserArtifacts.browser.tsx +68 -0
  643. package/src/renderer/tests/chatEscape.browser.html +1 -0
  644. package/src/renderer/tests/chatEscape.browser.tsx +25 -0
  645. package/src/renderer/tests/chatPerformance.browser.html +1 -1
  646. package/src/renderer/tests/collapsedPaste.browser.html +1 -1
  647. package/src/renderer/tests/composerMenus.browser.html +3 -3
  648. package/src/renderer/tests/contextCompaction.browser.html +1 -1
  649. package/src/renderer/tests/errorRecovery.browser.html +1 -1
  650. package/src/renderer/tests/fixtures/preview.webm +0 -0
  651. package/src/renderer/tests/glideSelect.browser.html +1 -2
  652. package/src/renderer/tests/glideSelect.preview.html +1 -1
  653. package/src/renderer/tests/library.browser.tsx +1 -1
  654. package/src/renderer/tests/liveOrb.browser.html +1 -1
  655. package/src/renderer/tests/mediaFixtures.ts +32 -0
  656. package/src/renderer/tests/modInput.browser.html +1 -1
  657. package/src/renderer/tests/sessionSources.browser.tsx +76 -15
  658. package/src/renderer/tests/toolsPanel.browser.tsx +5 -5
  659. package/src/renderer/tests/viewedImages.browser.tsx +3 -3
  660. package/src/renderer/tests/voiceDictation.browser.html +101 -0
  661. package/src/renderer/tests/voicePill.browser.html +3 -3
  662. package/src/renderer/tests/voicePill.preview.html +1 -1
  663. package/src/renderer/tests/webSources.browser.tsx +2 -98
  664. package/src/renderer/tests/workspaceDrop.browser.html +1 -0
  665. package/src/renderer/tests/workspaceDrop.browser.tsx +183 -0
  666. package/src/renderer/tests/workspaceExpansion.browser.html +1 -0
  667. package/src/renderer/tests/workspaceExpansion.browser.tsx +66 -0
  668. package/src/renderer/tests/workspaceRemoval.browser.html +66 -0
  669. package/src/renderer/tests/workspaceUndo.browser.html +10 -2
  670. package/src-tauri/src/app/lifecycle.rs +44 -1
  671. package/src-tauri/src/commands/conversation.rs +99 -73
  672. package/src-tauri/src/commands/integrations.rs +7 -1
  673. package/src-tauri/src/commands/media.rs +7 -0
  674. package/src-tauri/src/commands/workspace.rs +38 -0
  675. package/tsconfig.json +15 -1
  676. package/vite.config.ts +2 -1
  677. package/vite.config.web.ts +2 -0
  678. package/out/web/assets/CliSessionsView-D7hw0Mgj.js +0 -1
  679. package/out/web/assets/CodeReviewPage-C7bEOJfd.js +0 -4
  680. package/out/web/assets/CodeReviewPage-Dte9uLiL.css +0 -1
  681. package/out/web/assets/CommandPalette-0RrF-AOT.js +0 -1
  682. package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +0 -1
  683. package/out/web/assets/LibraryPage--Qfisp6D.js +0 -2
  684. package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +0 -1
  685. package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +0 -1
  686. package/out/web/assets/McpServersView-slfQJzNB.js +0 -1
  687. package/out/web/assets/MintDashboard-BSR5XpXh.js +0 -25
  688. package/out/web/assets/MintDashboard-CWUcCGhd.css +0 -1
  689. package/out/web/assets/PluginsView-l7LSm503.js +0 -1
  690. package/out/web/assets/ScheduledTasksView-CttmLbq1.js +0 -1
  691. package/out/web/assets/SettingsWindow-BCMLYvEV.js +0 -4
  692. package/out/web/assets/SettingsWindow-DcMVmU9u.css +0 -1
  693. package/out/web/assets/SkillsView-rNs1qr_U.js +0 -2
  694. package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +0 -37
  695. package/out/web/assets/ToolSurfacePage-CTfgggF2.css +0 -1
  696. package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +0 -4
  697. package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +0 -1
  698. package/out/web/assets/WorkspaceSelector-B2xIp04D.js +0 -1
  699. package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +0 -1
  700. package/out/web/assets/abnfDiagram-VCTEODGH-CD0CjoGl.js +0 -1
  701. package/out/web/assets/architecture-7GRP2DOG-RKV83OeZ.js +0 -1
  702. package/out/web/assets/architectureDiagram-5GKGNRK7-nN_HAFct.js +0 -36
  703. package/out/web/assets/c4Diagram-UCG6FXSJ-DTdV8_zE.js +0 -38
  704. package/out/web/assets/chunk-2Q5K7J3B-Dmqrq8Tp.js +0 -1
  705. package/out/web/assets/chunk-75Z2AOVW-_M0z5olV.js +0 -2
  706. package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +0 -2
  707. package/out/web/assets/chunk-CLGD4ZFX-D54yGvGS.js +0 -1
  708. package/out/web/assets/chunk-CacB07dV.js +0 -1
  709. package/out/web/assets/chunk-DSNCTWBM-C-gvT2ru.js +0 -2
  710. package/out/web/assets/chunk-DU6HZSFF-CnFngIhW.js +0 -128
  711. package/out/web/assets/chunk-F27PBJKO-BqtWrnEO.js +0 -1
  712. package/out/web/assets/chunk-FOHPRMQF-BaVC1uA7.js +0 -161
  713. package/out/web/assets/chunk-G27WJ6UU-Ckoq5mi2.js +0 -231
  714. package/out/web/assets/chunk-JQ64N6SF-CF8T7GiZ.js +0 -1
  715. package/out/web/assets/chunk-JWPE2WC7-BwtYOHqU.js +0 -1
  716. package/out/web/assets/chunk-LNGE3PJU-AdBoOWw2.js +0 -34
  717. package/out/web/assets/chunk-OBVCFTLP-CRIkunUB.js +0 -1
  718. package/out/web/assets/chunk-P2QGCYS3-UFEU6BxZ.js +0 -1
  719. package/out/web/assets/chunk-POPQ4Y6H-CQcrNbjr.js +0 -1
  720. package/out/web/assets/chunk-PWAF6VOD-Cc2uVDsG.js +0 -1
  721. package/out/web/assets/chunk-R7TYR2AO-DiCxzdAY.js +0 -10
  722. package/out/web/assets/chunk-RHFEMEQ7-b7hnPmrR.js +0 -168
  723. package/out/web/assets/chunk-XXDRQBXY-DnJkbUaw.js +0 -1
  724. package/out/web/assets/chunk-Y2CYZVJY-C9o-s6OY.js +0 -1
  725. package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +0 -1
  726. package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +0 -1
  727. package/out/web/assets/config-CnvCChUM.js +0 -2
  728. package/out/web/assets/config-DM6oIVO3.css +0 -1
  729. package/out/web/assets/core-DsKkQ7ig.js +0 -1
  730. package/out/web/assets/cose-bilkent-JH36ORCC--UN4aw5-.js +0 -1
  731. package/out/web/assets/cynefin-OW5HDTMX-CnzQfOGp.js +0 -1
  732. package/out/web/assets/cynefinDiagram-5FMLGOSQ-DVtQnfpm.js +0 -62
  733. package/out/web/assets/cytoscape.esm-Df1UN4Y1.js +0 -321
  734. package/out/web/assets/dagre-3AP2YEHR-DG76_k5_.js +0 -4
  735. package/out/web/assets/dagre-BWadQu2F.js +0 -1
  736. package/out/web/assets/diagram-S7CK7UJ4-CaouUoze.js +0 -30
  737. package/out/web/assets/diagram-UQ7AKVKN-B4bEc26B.js +0 -41
  738. package/out/web/assets/diagram-VX7I27RA-7hH5IPYf.js +0 -24
  739. package/out/web/assets/diagram-Z3DM3KII-CCM4clo8.js +0 -24
  740. package/out/web/assets/dist-BoTOASLF.js +0 -1
  741. package/out/web/assets/dist-js-BkYNznHX.js +0 -1
  742. package/out/web/assets/ebnfDiagram-PWID7BFC-Da7WAM3k.js +0 -1
  743. package/out/web/assets/event-Cdt7Byyj.js +0 -1
  744. package/out/web/assets/eventmodeling-NTZA5JFV-xcfsA0XD.js +0 -1
  745. package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +0 -1
  746. package/out/web/assets/ganttDiagram-EL5Y4UJY-B3ClFGmL.js +0 -292
  747. package/out/web/assets/gitGraph-4MIJSDKK-BZ_y_cDU.js +0 -1
  748. package/out/web/assets/gitGraphDiagram-WWUBYQGX-drhRSYm3.js +0 -106
  749. package/out/web/assets/graphlib-CTR5ZhLf.js +0 -1
  750. package/out/web/assets/index-BZ9xgmMP.css +0 -1
  751. package/out/web/assets/index-Ca8cCS4h.js +0 -168
  752. package/out/web/assets/info-A6RAGUB7-B7I3K0F1.js +0 -1
  753. package/out/web/assets/infoDiagram-RXCK75RN-deX_1MPh.js +0 -2
  754. package/out/web/assets/journeyDiagram-EYS64GPL-CZn2kB8b.js +0 -139
  755. package/out/web/assets/jsx-runtime-DN4NhQUK.js +0 -1
  756. package/out/web/assets/katex-O3jvqgnU.js +0 -257
  757. package/out/web/assets/markdown-CMhYIcWB.js +0 -39
  758. package/out/web/assets/mermaid-parser.core-Whu2rlJC.js +0 -7
  759. package/out/web/assets/mermaid.core-CKyPo8VH.js +0 -11
  760. package/out/web/assets/modelManager-CUaGWMWu.js +0 -2
  761. package/out/web/assets/oauthManager-DlNhXJr6.js +0 -1
  762. package/out/web/assets/packet-AYTQ26CC-CEeIRKRG.js +0 -1
  763. package/out/web/assets/pegDiagram-XKGWAZYB-BYadI-KO.js +0 -1
  764. package/out/web/assets/pie-WAS4IAKB-D8uf4dh5.js +0 -1
  765. package/out/web/assets/pieDiagram-E7YTZNPT-CjSDy4hO.js +0 -39
  766. package/out/web/assets/radar-RG4KPBEZ-DZJxnokY.js +0 -1
  767. package/out/web/assets/railroad-74A4TZTK-DBysUiUi.js +0 -1
  768. package/out/web/assets/railroad-abnf-HS5TGJTU-CHWxoJYg.js +0 -1
  769. package/out/web/assets/railroad-ebnf-LZEXJU2U-DDv7X6bY.js +0 -1
  770. package/out/web/assets/railroad-peg-WCYAUIDC-DpfcYYNJ.js +0 -1
  771. package/out/web/assets/railroadDiagram-O6MQD6OU-CYtyv0t3.js +0 -1
  772. package/out/web/assets/rough.esm-DFbTUy8a.js +0 -1
  773. package/out/web/assets/sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js +0 -40
  774. package/out/web/assets/sequenceDiagram-WJ2MYXX4-BvFLKtPd.js +0 -162
  775. package/out/web/assets/sizeCapture-X5ZJPWSS-DKeOCaN2.js +0 -1
  776. package/out/web/assets/src-DnfeXQPr.js +0 -1
  777. package/out/web/assets/stateDiagram-HBIQ2CUA-Bx0GWeaY.js +0 -1
  778. package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +0 -1
  779. package/out/web/assets/studio-B1mk40wD.js +0 -1
  780. package/out/web/assets/swimlanes-XN3QIQJK-CCma0T7L.js +0 -1
  781. package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +0 -8
  782. package/out/web/assets/timeline-definition-24CTP7MA-iCRhhJ7C.js +0 -120
  783. package/out/web/assets/treeView-Q6P3EWNA-DZ-y08qp.js +0 -1
  784. package/out/web/assets/treemap-WGGIJYW6-De0CxzMx.js +0 -1
  785. package/out/web/assets/vennDiagram-4TSXK5OY-w_7aZ6xe.js +0 -34
  786. package/out/web/assets/wardley-WFR3VGLG-DT0y0xJ4.js +0 -1
  787. package/out/web/assets/window-BJCVtyET.js +0 -1
  788. package/src/renderer/shared/components/ChatPanel.test.tsx +0 -21
  789. package/src/renderer/shared/components/FormattedMessage.tsx +0 -11
  790. package/src/renderer/shared/components/GlideSelect.d.ts +0 -31
  791. package/src/renderer/shared/components/GlideSelect.jsx +0 -266
  792. package/src/renderer/shared/components/InlineThoughtNote.tsx +0 -27
  793. package/src/renderer/shared/components/ModSessionControls.tsx +0 -8
  794. package/src/renderer/shared/components/ModUi.tsx +0 -26
  795. package/src/renderer/shared/components/ProgressActivity.tsx +0 -17
  796. package/src/renderer/shared/components/ReviewHistory.tsx +0 -42
  797. package/src/renderer/shared/components/RunSummaryDashboard.tsx +0 -143
  798. package/src/renderer/shared/components/SelectField.tsx +0 -38
  799. package/src/renderer/shared/components/SessionSources.tsx +0 -48
  800. package/src/renderer/shared/components/SessionSourcesPopover.tsx +0 -61
  801. package/src/renderer/shared/components/ToolSurfacePage.test.tsx +0 -32
  802. package/src/renderer/shared/components/ViewedImages.tsx +0 -36
  803. package/src/renderer/shared/components/WorkspaceContextPopover.tsx +0 -138
  804. package/src/renderer/shared/components/ui/demo.tsx +0 -26
  805. package/src/renderer/shared/css/session-sources-popover.css +0 -9
  806. package/src/renderer/src/components/CalculationCard.tsx +0 -3
  807. package/src/renderer/src/components/ImageGenCard.tsx +0 -2
  808. package/src/renderer/src/components/ImageSearchCard.tsx +0 -2
  809. package/src/renderer/src/components/MermaidCard.tsx +0 -1
  810. package/src/renderer/src/components/PicturesLibrary.tsx +0 -2
  811. package/src/renderer/src/components/Settings/AgentsTab.tsx +0 -4
  812. package/src/renderer/src/components/Settings/AudioTab.tsx +0 -3
  813. package/src/renderer/src/components/Settings/AutomationTab.tsx +0 -3
  814. package/src/renderer/src/components/Settings/GeneralTab.tsx +0 -3
  815. package/src/renderer/src/components/Settings/MemoryTab.tsx +0 -3
  816. package/src/renderer/src/components/Settings/PluginsTab.tsx +0 -3
  817. package/src/renderer/src/components/Settings/ProfileTab.tsx +0 -3
  818. package/src/renderer/src/components/Settings/ShortcutsTab.tsx +0 -3
  819. package/src/renderer/src/components/Settings/ThemeTab.tsx +0 -3
  820. package/src/renderer/src/components/StockCard.tsx +0 -3
  821. package/src/renderer/src/components/WeatherCard.tsx +0 -3
  822. package/src/renderer/src/css/pictures.css +0 -2
  823. package/src/renderer/src/css/settings/base.css +0 -1266
  824. package/src/renderer/src-web/components/PicturesLibrary.tsx +0 -2
  825. package/src/renderer/src-web/components/Settings/AgentsTab.tsx +0 -4
  826. package/src/renderer/src-web/components/Settings/AudioTab.tsx +0 -3
  827. package/src/renderer/src-web/components/Settings/AutomationTab.tsx +0 -3
  828. package/src/renderer/src-web/components/Settings/GeneralTab.tsx +0 -3
  829. package/src/renderer/src-web/components/Settings/MemoryTab.tsx +0 -3
  830. package/src/renderer/src-web/components/Settings/PluginsTab.tsx +0 -3
  831. package/src/renderer/src-web/components/Settings/ProfileTab.tsx +0 -3
  832. package/src/renderer/src-web/components/Settings/ShortcutsTab.tsx +0 -3
  833. package/src/renderer/src-web/components/Settings/ThemeTab.tsx +0 -3
  834. package/src/renderer/src-web/css/pictures.css +0 -2
  835. package/src/renderer/src-web/css/spotlight.css +0 -102
  836. package/src/renderer/src-web/css/widget.css +0 -213
  837. /package/src/renderer/shared/components/{UiMockupWidget.tsx → cards/UiMockupWidget.tsx} +0 -0
  838. /package/src/renderer/shared/components/{ContextCompactionStatus.tsx → chat/ContextCompactionStatus.tsx} +0 -0
  839. /package/src/renderer/shared/components/{GeminiLiveOverlay.css → chat/GeminiLiveOverlay.css} +0 -0
  840. /package/src/renderer/shared/components/{GeminiLiveOverlay.test.tsx → chat/GeminiLiveOverlay.test.tsx} +0 -0
  841. /package/src/renderer/shared/components/{SlashSuggestions.test.tsx → chat/SlashSuggestions.test.tsx} +0 -0
  842. /package/src/renderer/shared/components/{VirtualChatHistory.tsx → chat/VirtualChatHistory.tsx} +0 -0
  843. /package/src/renderer/shared/components/{VoicePill.d.ts → chat/VoicePill.d.ts} +0 -0
  844. /package/src/renderer/shared/components/{VoicePill.test.tsx → chat/VoicePill.test.tsx} +0 -0
  845. /package/src/renderer/shared/components/{ScreenCaptureDialog.css → studio/ScreenCaptureDialog.css} +0 -0
  846. /package/src/renderer/shared/components/{ScreenCaptureDialog.tsx → studio/ScreenCaptureDialog.tsx} +0 -0
  847. /package/src/renderer/shared/components/{SelectField.test.tsx → ui/SelectField.test.tsx} +0 -0
  848. /package/src/renderer/shared/components/{background-terminals.css → workspace/background-terminals.css} +0 -0
@@ -1,11 +1,12 @@
1
- import McpToolResults from './McpToolResults'
2
- import ViewedImages from './ViewedImages'
1
+ import { SpeechPlayer } from '../../speech/player'
2
+ import McpToolResults from '../activity/McpToolResults'
3
+ import ViewedImages from '../activity/ViewedImages'
3
4
  import { CollapsiblePasteInput } from './CollapsiblePasteInput'
4
5
  import { ContextCompactionStatus } from './ContextCompactionStatus'
5
- import { activeCompactionFrom } from '../utils/contextCompaction'
6
- import { useEffect, useMemo, useRef, useState, useCallback, Fragment, type ChangeEvent, type ClipboardEvent, type DragEvent, type FormEvent, type KeyboardEvent, type RefObject } from 'react'
7
- import { EMPTY_AGENT_PROGRESS, hasAgentToolActivity, thoughtsFrom, extendedThoughtsFrom, mergeFileChanges, parseFileChangesFromProgress } from '../agentProgress'
8
- import { visibleInteractionsDuringRun } from '../conversation/syncView'
6
+ import { activeCompactionFrom } from '../../utils/contextCompaction'
7
+ import { useEffect, useMemo, useRef, useState, useCallback, Fragment, lazy, Suspense, useSyncExternalStore, type ChangeEvent, type ClipboardEvent, type DragEvent, type FormEvent, type KeyboardEvent, type RefObject } from 'react'
8
+ import { EMPTY_AGENT_PROGRESS, hasAgentToolActivity, thoughtsFrom, extendedThoughtsFrom, mergeFileChanges, parseFileChangesFromProgress } from '../../agentProgress'
9
+ import { visibleInteractionsDuringRun } from '../../conversation/syncView'
9
10
  import {
10
11
  GEMINI_MODELS,
11
12
  OPENAI_MODELS,
@@ -16,42 +17,66 @@ import {
16
17
  LOCAL_MODELS,
17
18
  OLLAMA_MODELS,
18
19
  GEMINI_LIVE_VOICES,
19
- } from '../constants/models'
20
- import { badge, providerLabel, fallbackNotice } from '../utils/providers'
21
- import { parseWebSearchSources } from '../utils/agentActivity'
22
- import { useLatestCallback } from '../utils/useLatestCallback'
20
+ } from '../../constants/models'
21
+ import { badge, providerLabel, fallbackNotice } from '../../utils/providers'
22
+ import { parseWebSearchSources } from '../../utils/agentActivity'
23
+ import { useLatestCallback } from '../../utils/useLatestCallback'
23
24
  import SlashChoicePanel from './SlashChoicePanel'
24
25
  import SlashSuggestions, { type SlashSuggestionsHandle } from './SlashSuggestions'
25
26
  import { ChatCodeBlock } from './ChatCodeBlock'
26
- import { renderApprovalDetails, renderDiff, type ApprovalDetails } from '../utils/approval'
27
+ import { renderApprovalDetails, renderDiff, type ApprovalDetails } from '../../utils/approval'
27
28
  import { ApprovalCard } from './ApprovalCard'
28
- import { readableAssistantText, cleanSpeechText, renderSpeakerIcon, renderCopyIcon } from '../utils/markdown'
29
+ import { FormattedMessage, readableAssistantText, renderSpeakerIcon, renderCopyIcon } from '../../utils/markdown'
29
30
  import { ThinkingBlock } from './ThinkingBlock'
30
31
  import ChatMessageItem from './ChatMessageItem'
31
- import { FormattedMessage } from './FormattedMessage'
32
- import { ProgressActivity } from './ProgressActivity'
32
+ import ProviderBrandIcon from '../ui/ProviderBrandIcon'
33
+ import { AgentActivityDrawer } from '../activity/AgentActivityDrawer'
34
+ import { TurnFileChanges, type RewindRequestPayload } from './TurnFileChanges'
35
+ import { SubagentStatusStrip } from '../activity/SubagentStatusStrip'
33
36
  import { VirtualChatHistory, type VirtualChatHistoryHandle } from './VirtualChatHistory'
34
- import { ArtifactPreviewPanel, type ArtifactFile } from './ArtifactPreviewPanel'
35
- import { RewindModal } from './RewindModal'
36
- import type { AgentProgress, ChatResponse, DiffHunk, FileChange, GitCheckpoint, RuntimeStatus } from '../types'
37
- import { numericSetting, shouldShowSessionDivider, formatSessionDividerLabel } from '../utils/ui'
37
+ import type { ArtifactFile } from '../../utils/artifacts'
38
+ import type { AgentProgress, ChatResponse, DiffHunk, FileChange, GitCheckpoint, QueuedPrompt, RuntimeStatus } from '../../types'
39
+ import { shouldShowSessionDivider, formatSessionDividerLabel } from '../../utils/ui'
38
40
  import { useVoiceInput } from '@/voiceInput'
39
41
  import VoicePill from './VoicePill'
40
- import { useGeminiLiveVoice } from '../utils/useGeminiLiveVoice'
42
+ import { useGeminiLiveVoice } from '../../utils/useGeminiLiveVoice'
41
43
  import GeminiLiveOverlay from './GeminiLiveOverlay'
42
- import { isSupportedDocument, SUPPORTED_DOCUMENT_ACCEPT } from '../utils/documentTypes'
44
+ import { isSupportedDocument, SUPPORTED_DOCUMENT_ACCEPT } from '../../utils/documentTypes'
43
45
  import ModelSelectorPopover from './ModelSelectorPopover'
44
- import GitBranchSelector from './GitBranchSelector'
45
- import WorkspaceSelector from './WorkspaceSelector'
46
- import ToolsPanelToggle from './ToolsPanelToggle'
47
- import SessionSourcesPopover from './SessionSourcesPopover'
48
- import { ModsPanel } from './ModsPanel'
49
- import CodeReviewPage from './CodeReviewPage'
50
- import type { ToolSurface } from './ToolSurfacePage'
51
- import '../css/thinking-status.css'
52
- import '../css/slash-choice.css'
53
-
54
- import { catalogPlatform, conversationPlatform, runtimePlatform } from '../platform'
46
+ import GitBranchSelector from '../workspace/GitBranchSelector'
47
+ import WorkspaceSelector from '../workspace/WorkspaceSelector'
48
+ import ToolsPanelToggle from '../workspace/ToolsPanelToggle'
49
+ import { ModsPanel } from '../extensions/ModsPanel'
50
+ import type { ToolSurface } from '../workspace/ToolSurfacePage'
51
+ import QueuedMessagesBanner from './QueuedMessagesBanner'
52
+ import '../../css/thinking-status.css'
53
+ import '../../css/slash-choice.css'
54
+
55
+ import { catalogPlatform, conversationPlatform, runtimePlatform } from '../../platform'
56
+
57
+ const ArtifactPreviewPanel = lazy(() => import('../workspace/ArtifactPreviewPanel').then(m => ({ default: m.ArtifactPreviewPanel })))
58
+ const RewindModal = lazy(() => import('./RewindModal').then(m => ({ default: m.RewindModal })))
59
+ const CodeReviewPage = lazy(() => import('../workspace/CodeReviewPage'))
60
+
61
+ export function shouldProbeOllamaModels(status?: RuntimeStatus | null, settingsConfig?: any): boolean {
62
+ return status?.activeProvider === 'ollama' || Boolean(settingsConfig?.ollamaHost || settingsConfig?.ollamaModel)
63
+ }
64
+
65
+ export function ThinkingElapsedMeta() {
66
+ const [elapsedSeconds, setElapsedSeconds] = useState(0)
67
+ useEffect(() => {
68
+ const startTime = Date.now()
69
+ const timer = setInterval(() => {
70
+ setElapsedSeconds(Math.round((Date.now() - startTime) / 1000))
71
+ }, 1000)
72
+ return () => clearInterval(timer)
73
+ }, [])
74
+ return (
75
+ <span className="thinking-status-meta">
76
+ {` · ${elapsedSeconds}s · Esc to cancel`}
77
+ </span>
78
+ )
79
+ }
55
80
 
56
81
  const STREAM_MARKDOWN_UPDATE_MS = 120
57
82
 
@@ -83,7 +108,7 @@ function useThrottledValue<T>(value: T, intervalMs: number): T {
83
108
  }
84
109
 
85
110
  const {
86
- getTtsUrls, startGeminiLiveSession, sendGeminiLiveAudioChunk, stopGeminiLiveSession,
111
+ speechRequest, startGeminiLiveSession, sendGeminiLiveAudioChunk, stopGeminiLiveSession,
87
112
  listGitCheckpoints, rollbackGitCheckpoint, undoGitCheckpoint,
88
113
  } = conversationPlatform
89
114
  const { fetchProviderModels } = catalogPlatform
@@ -118,6 +143,8 @@ interface ChatPanelContract {
118
143
  chatId: string
119
144
  chatEnd: RefObject<HTMLDivElement | null>
120
145
  welcomeInteraction: any
146
+ queuedPrompts?: QueuedPrompt[]
147
+ queuePaused?: boolean
121
148
  onSubmit: (event: FormEvent<HTMLFormElement>) => void
122
149
  onSelectImage: (event: ChangeEvent<HTMLInputElement>) => void
123
150
  onSelectVideo: (event: ChangeEvent<HTMLInputElement>) => void
@@ -157,6 +184,13 @@ interface ChatPanelContract {
157
184
  onOpenReview?: (review: Extract<ToolSurface, { kind: 'review' }>) => void
158
185
  onSelectSlashChoice?: (value: string) => void
159
186
  onDismissSlashChoice?: () => void
187
+ subscribeMessage?: (notify: () => void) => () => void
188
+ getMessage?: () => string
189
+ onRemoveQueuedPrompt?: (id: string) => void
190
+ onEditQueuedPrompt?: (id: string) => void
191
+ onClearQueuedPrompts?: () => void
192
+ onSteerQueuedPrompt?: (id: string) => void
193
+ onResumeQueue?: () => void
160
194
  }
161
195
 
162
196
  export type ConversationViewModel = Pick<ChatPanelContract,
@@ -168,13 +202,32 @@ export type ConversationViewModel = Pick<ChatPanelContract,
168
202
  | 'conversationTitle' | 'slashChoice'
169
203
  | 'hasOlder'
170
204
  | 'sendingInteractionId'
205
+ | 'queuedPrompts'
206
+ | 'queuePaused'
171
207
  >
172
- export type ConversationActions = Omit<ChatPanelContract, keyof ConversationViewModel>
208
+ export type ConversationActions = Omit<ChatPanelContract, keyof ConversationViewModel> & {
209
+ subscribeMessage?: (notify: () => void) => () => void
210
+ getMessage?: () => string
211
+ }
212
+
213
+ const NOOP_SUBSCRIBE = () => () => {}
214
+
215
+ export function useComposerDraft(
216
+ fallbackMessage: string,
217
+ subscribe?: (notify: () => void) => () => void,
218
+ getMessage?: () => string,
219
+ ): string {
220
+ const getSnapshot = () => (getMessage ? getMessage() : fallbackMessage)
221
+ return useSyncExternalStore(
222
+ subscribe ?? NOOP_SUBSCRIBE,
223
+ getSnapshot,
224
+ getSnapshot,
225
+ )
226
+ }
173
227
 
174
228
  interface ChatPanelProps {
175
229
  conversation: ConversationViewModel
176
230
  actions: ConversationActions
177
- showSessionSources?: boolean
178
231
  tools?: { modsPanelTarget: HTMLElement | null; onOpenMods: () => void; onToggle?: () => void; open: boolean; backgroundTaskCount: number }
179
232
  }
180
233
 
@@ -182,7 +235,6 @@ export default function ChatPanel({
182
235
  conversation,
183
236
  actions,
184
237
  tools,
185
- showSessionSources = false,
186
238
  }: ChatPanelProps) {
187
239
  const {
188
240
  interactions,
@@ -199,7 +251,7 @@ export default function ChatPanel({
199
251
  agentActivitySnapshots,
200
252
  thinkingExpanded,
201
253
  onThinkingExpandedChange: handleThinkingExpandedChange,
202
- message,
254
+ message: initialMessage,
203
255
  imageAttachments,
204
256
  videoAttachments,
205
257
  documentName,
@@ -247,7 +299,15 @@ export default function ChatPanel({
247
299
  onOpenReview,
248
300
  onSelectSlashChoice,
249
301
  onDismissSlashChoice,
302
+ queuedPrompts = [],
303
+ queuePaused = false,
304
+ onRemoveQueuedPrompt,
305
+ onEditQueuedPrompt,
306
+ onClearQueuedPrompts,
307
+ onSteerQueuedPrompt,
308
+ onResumeQueue,
250
309
  } = { ...conversation, ...actions }
310
+ const message = useComposerDraft(initialMessage, actions.subscribeMessage, actions.getMessage)
251
311
  const onThinkingExpandedChange = useLatestCallback(handleThinkingExpandedChange)
252
312
  // The initiating surface already renders a live prompt/reply pair below.
253
313
  // Hide its matching persisted turn until the local stream settles, while
@@ -306,14 +366,9 @@ export default function ChatPanel({
306
366
  activeModelName = (lastThinkingProgress.data as any).model_name || null
307
367
  }
308
368
  const [openActivityIds, setOpenActivityIds] = useState<Record<string, boolean>>({})
309
- const [openReviewIds, setOpenReviewIds] = useState<Record<string, boolean>>({})
310
- const [openFileDiffs, setOpenFileDiffs] = useState<Record<string, boolean>>({})
311
- const [showAllFileChanges, setShowAllFileChanges] = useState<Record<string, boolean>>({})
312
369
  const [reviewPage, setReviewPage] = useState<{ title: string; changes: FileChange[] } | null>(null)
313
370
  const [activeArtifact, setActiveArtifact] = useState<ArtifactFile | null>(null)
314
371
  const [toolMenuOpen, setToolMenuOpen] = useState(false)
315
- const [sessionSourcesOpen, setSessionSourcesOpen] = useState(false)
316
- const [elapsedSeconds, setElapsedSeconds] = useState(0)
317
372
  const [dynamicOllamaModels, setDynamicOllamaModels] = useState<string[]>(OLLAMA_MODELS)
318
373
  const toggleActivity = useCallback((id: string) => {
319
374
  setOpenActivityIds(current => ({ ...current, [id]: !(current[id] ?? (id === 'live')) }))
@@ -329,7 +384,12 @@ export default function ChatPanel({
329
384
  else setReviewPage({ title, changes })
330
385
  })
331
386
 
387
+ const openAllConversationReview = useLatestCallback(() => {
388
+ openReview('All conversation changes', getConversationChanges())
389
+ })
390
+
332
391
  useEffect(() => {
392
+ if (!shouldProbeOllamaModels(status, settingsConfig)) return
333
393
  let cancelled = false
334
394
  const fetchOllamaModels = async () => {
335
395
  const host = settingsConfig?.ollamaHost || 'http://localhost:11434'
@@ -372,24 +432,8 @@ export default function ChatPanel({
372
432
  return () => {
373
433
  cancelled = true
374
434
  }
375
- }, [settingsConfig?.ollamaHost, settingsConfig?.ollamaModel])
376
-
377
- useEffect(() => {
378
- if (!sending) {
379
- setElapsedSeconds(0)
380
- return
381
- }
382
-
383
- const startTime = Date.now()
384
- setElapsedSeconds(0)
385
-
386
- const timer = setInterval(() => {
387
- const elapsed = Math.round((Date.now() - startTime) / 1000)
388
- setElapsedSeconds(elapsed)
389
- }, 1000)
390
-
391
- return () => clearInterval(timer)
392
- }, [sending])
435
+ }, [status?.activeProvider, settingsConfig?.ollamaHost, settingsConfig?.ollamaModel])
436
+ const [speechError, setSpeechError] = useState('')
393
437
  const [speakingText, setSpeakingText] = useState<string | null>(null)
394
438
  const [copiedId, setCopiedId] = useState<string | number | null>(null)
395
439
 
@@ -637,8 +681,6 @@ export default function ChatPanel({
637
681
 
638
682
 
639
683
  const toolMenuRef = useRef<HTMLDivElement | null>(null)
640
- const audioRef = useRef<HTMLAudioElement | null>(null)
641
- const speechRunRef = useRef(0)
642
684
  const historyReadyRef = useRef(false)
643
685
  const submittedDuringSessionRef = useRef(false)
644
686
  const lastAutoSpokenIdRef = useRef<number | string | null>(null)
@@ -718,9 +760,8 @@ export default function ChatPanel({
718
760
  }
719
761
 
720
762
 
721
- // The mic button always drives native push-to-talk transcription; Gemini Live is a
722
- // separate "Live" button + overlay (see below), not a swap-in replacement for the
723
- // same button.
763
+ // The mic button dictates into the composer (native capture on Desktop,
764
+ // browser speech recognition on Web). Gemini Live has its own button and overlay.
724
765
  const {
725
766
  isRecording,
726
767
  voiceMode,
@@ -736,6 +777,7 @@ export default function ChatPanel({
736
777
  scheduleVoiceListen,
737
778
  clearRestartTimer
738
779
  } = useVoiceInput({
780
+ chatId,
739
781
  onSendVoiceMessage,
740
782
  language: settingsConfig?.language,
741
783
  message,
@@ -944,86 +986,25 @@ export default function ChatPanel({
944
986
  submitOnEnter(event)
945
987
  }
946
988
 
947
- const cancelSpeech = () => {
948
- speechRunRef.current += 1
949
- audioRef.current?.pause()
950
- audioRef.current = null
951
- speakingRef.current = null
952
- if (typeof window !== 'undefined' && window.speechSynthesis) {
953
- window.speechSynthesis.cancel()
954
- }
955
- setSpeakingText(null)
956
- }
957
- const speakNative = (text: string, displayText: string) => {
958
- if (typeof window === 'undefined' || !window.speechSynthesis) {
959
- setSpeakingText(null)
960
- return
961
- }
962
- const hasThai = /[\u0e00-\u0e7f]/.test(text)
963
- const utterance = new SpeechSynthesisUtterance(text)
964
- utterance.lang = hasThai ? 'th-TH' : 'en-US'
965
- utterance.volume = Math.max(0, Math.min(1, numericSetting(settingsConfig?.ttsVolume, 1)))
966
- utterance.rate = Math.max(0.1, Math.min(10, numericSetting(settingsConfig?.ttsSpeed, 1)))
967
- utterance.pitch = Math.max(0, Math.min(2, numericSetting(settingsConfig?.ttsPitch, 1)))
968
- const voice = window.speechSynthesis.getVoices().find((item) => {
969
- const lang = item.lang.toLowerCase()
970
- const target = hasThai ? 'th' : 'en'
971
- return lang.startsWith(target) || lang.includes(target)
972
- })
973
- if (voice) utterance.voice = voice
974
- const finishSpeech = () => {
975
- setSpeakingText((current) => (current === displayText ? null : current))
976
- speakingRef.current = null
977
- scheduleVoiceListen(900)
978
- }
979
- utterance.onend = finishSpeech
980
- utterance.onerror = finishSpeech
981
- speakingRef.current = displayText
982
- setSpeakingText(displayText)
983
- window.speechSynthesis.speak(utterance)
984
- }
985
- const playGoogleTts = async (text: string, displayText: string, runId: number) => {
986
- const chunks = await getTtsUrls(text)
987
- for (const chunk of chunks) {
988
- if (speechRunRef.current !== runId) return
989
- await new Promise<void>((resolve, reject) => {
990
- const audio = new Audio(chunk.url)
991
- audio.volume = Math.max(0, Math.min(1, numericSetting(settingsConfig?.ttsVolume, 1)))
992
- audio.playbackRate = Math.max(0.25, Math.min(4, numericSetting(settingsConfig?.ttsSpeed, 1)))
993
- audioRef.current = audio
994
- audio.onended = () => resolve()
995
- audio.onpause = () => resolve()
996
- audio.onerror = () => reject(new Error('Google TTS playback failed'))
997
- audio.play().catch(reject)
998
- })
999
- }
1000
- if (speechRunRef.current === runId) {
1001
- setSpeakingText((current) => (current === displayText ? null : current))
1002
- speakingRef.current = null
1003
- scheduleVoiceListen(900)
1004
- }
1005
- }
1006
- const speak = useLatestCallback((text: string) => {
1007
- const speechText = cleanSpeechText(text)
1008
- if (!speechText) return
1009
- if (speakingText === text) {
1010
- cancelSpeech()
1011
- return
1012
- }
1013
-
1014
- cancelSpeech()
1015
- const runId = speechRunRef.current
1016
- speakingRef.current = text
1017
- setSpeakingText(text)
1018
- if (settingsConfig?.ttsProvider === 'google') {
1019
- playGoogleTts(speechText, text, runId).catch((error) => {
1020
- console.warn('Google TTS failed, falling back to native speech synthesis:', error)
1021
- if (speechRunRef.current === runId) speakNative(speechText, text)
1022
- })
1023
- return
1024
- }
1025
- speakNative(speechText, text)
989
+ const speechPlayerRef = useRef<SpeechPlayer | null>(null)
990
+ const speechTextRef = useRef<string | null>(null)
991
+ if (!speechPlayerRef.current) speechPlayerRef.current = new SpeechPlayer(speechRequest, state => {
992
+ setSpeakingText(state === 'idle' ? null : speechTextRef.current)
993
+ speakingRef.current = state === 'idle' ? null : speechTextRef.current
994
+ if (state === 'idle') scheduleVoiceListen(900)
995
+ }, message => setSpeechError(message))
996
+ const cancelSpeech = () => { void speechPlayerRef.current?.stop() }
997
+ const speak = useLatestCallback((text: string, turnId?: number, automatic = false) => {
998
+ if (!automatic && speakingText === text) { cancelSpeech(); return }
999
+ setSpeechError('')
1000
+ speechTextRef.current = text
1001
+ const saved = turnId ?? Number([...interactions].reverse().find(interaction => interaction.aiText === text)?.id)
1002
+ void speechPlayerRef.current?.play({ chatId, text, turnId: Number.isFinite(saved) && saved > 0 ? saved : undefined, automatic })
1026
1003
  })
1004
+ useEffect(() => { cancelSpeech() }, [chatId, sending])
1005
+ useEffect(() => {
1006
+ historyReadyRef.current = false; submittedDuringSessionRef.current = false; lastAutoSpokenIdRef.current = null
1007
+ }, [chatId])
1027
1008
 
1028
1009
  const resizeInput = (element: HTMLTextAreaElement) => {
1029
1010
  element.style.height = 'auto'
@@ -1031,7 +1012,7 @@ export default function ChatPanel({
1031
1012
  }
1032
1013
  useEffect(() => {
1033
1014
  return () => {
1034
- cancelSpeech()
1015
+ void speechPlayerRef.current?.dispose()
1035
1016
  }
1036
1017
  }, [])
1037
1018
  useEffect(() => {
@@ -1061,7 +1042,7 @@ export default function ChatPanel({
1061
1042
  }
1062
1043
 
1063
1044
  lastAutoSpokenIdRef.current = latest.id
1064
- speak(latest.aiText)
1045
+ speak(latest.aiText, Number(latest.id), true)
1065
1046
  }, [interactions, sending, settingsConfig?.enableVoiceReply, geminiLive.voiceMode, voiceMode])
1066
1047
  useEffect(() => {
1067
1048
  if (!toolMenuOpen) return
@@ -1085,13 +1066,14 @@ export default function ChatPanel({
1085
1066
  }, [onPasteImage])
1086
1067
  useEffect(() => {
1087
1068
  const handleEscapeKeyDown = (event: globalThis.KeyboardEvent) => {
1088
- if (event.key === 'Escape' && sending && !sessionSourcesOpen) {
1069
+ const insideTools = event.target instanceof Element && event.target.closest('.tool-surface-page')
1070
+ if (event.key === 'Escape' && sending && !event.defaultPrevented && !insideTools) {
1089
1071
  onCancelMessage()
1090
1072
  }
1091
1073
  }
1092
1074
  window.addEventListener('keydown', handleEscapeKeyDown, true)
1093
1075
  return () => window.removeEventListener('keydown', handleEscapeKeyDown, true)
1094
- }, [sending, onCancelMessage, sessionSourcesOpen])
1076
+ }, [sending, onCancelMessage])
1095
1077
  useEffect(() => {
1096
1078
  if (message) return
1097
1079
  const input = document.getElementById('chat-input') as HTMLTextAreaElement | null
@@ -1140,296 +1122,27 @@ export default function ChatPanel({
1140
1122
  appendWorkspaceReference(reference)
1141
1123
  }
1142
1124
  const isEmptyChat = interactions.length === 0 && !sending && !pendingApproval
1143
- const renderChangesList = (changes: ReturnType<typeof parseFileChangesFromProgress>, idPrefix: string) => {
1144
- const showAll = Boolean(showAllFileChanges[idPrefix])
1145
- const visibleChanges = showAll ? changes : changes.slice(0, 3)
1146
- return (
1147
- <div className="file-changes-list" style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>
1148
- {visibleChanges.map((change) => {
1149
- const fileKey = `${idPrefix}-${change.path}`
1150
- const isDiffOpen = Boolean(openFileDiffs[fileKey])
1151
- const fileName = change.path.split('/').pop() || change.path
1152
- const dirPath = change.path.includes('/') ? change.path.substring(0, change.path.lastIndexOf('/')) : ''
1153
-
1154
- return (
1155
- <div key={change.path} className="file-changes-item">
1156
- <div
1157
- className="file-changes-item-header"
1158
- onClick={() => setOpenFileDiffs((current) => ({ ...current, [fileKey]: !current[fileKey] }))}
1159
- >
1160
- <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
1161
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" style={{ color: 'var(--text-muted)' }}>
1162
- <path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" />
1163
- <polyline points="14 2 14 8 20 8" />
1164
- </svg>
1165
- <span className={`file-changes-filename ${change.created ? 'is-new' : ''}`}>
1166
- {fileName}
1167
- {dirPath && <span className="file-changes-dirpath">{dirPath}</span>}
1168
- {change.created && (
1169
- <span className="file-changes-badge-new">
1170
- [NEW FILE]
1171
- </span>
1172
- )}
1173
- </span>
1174
- </div>
1175
- <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontSize: '0.76rem' }}>
1176
- {change.created ? (
1177
- <span className="file-changes-count-add">
1178
- +{change.additions} {change.additions === 1 ? 'line' : 'lines'}
1179
- </span>
1180
- ) : (
1181
- <>
1182
- {change.additions > 0 && <span className="file-changes-count-add">+{change.additions}</span>}
1183
- {change.deletions > 0 && <span className="file-changes-count-del">-{change.deletions}</span>}
1184
- </>
1185
- )}
1186
- <button
1187
- type="button"
1188
- className="file-changes-preview-btn"
1189
- onClick={(e) => {
1190
- e.stopPropagation()
1191
- const fallbackContent =
1192
- change.created && change.hunks.length > 0
1193
- ? change.hunks.map((h) => h.newText).filter(Boolean).join('\n')
1194
- : undefined
1195
- openArtifact({ path: change.path, content: fallbackContent })
1196
- }}
1197
- title="Open Live Preview Split View"
1198
- >
1199
- Preview
1200
- </button>
1201
- <span style={{ color: 'var(--text-muted)', transform: isDiffOpen ? 'rotate(90deg)' : 'none', display: 'inline-block', transition: 'transform 0.15s' }}>&gt;</span>
1202
- </div>
1203
- </div>
1204
-
1205
- {isDiffOpen && (
1206
- <div className="file-changes-diff-box">
1207
- {change.hunks.map((hunk, hIdx) => (
1208
- <div key={hIdx} className="file-changes-diff-hunk" style={{ marginBottom: hIdx < change.hunks.length - 1 ? '10px' : 0 }}>
1209
- {hunk.oldText && (
1210
- <div className="file-changes-diff-del">
1211
- {hunk.oldText.split('\n').map((line, lIdx) => (
1212
- <div key={lIdx} style={{ display: 'flex' }}>
1213
- <span className="file-changes-diff-sign-del">-</span>
1214
- <span>{line}</span>
1215
- </div>
1216
- ))}
1217
- </div>
1218
- )}
1219
- {hunk.newText && (
1220
- <div className="file-changes-diff-add">
1221
- {hunk.newText.split('\n').map((line, lIdx) => (
1222
- <div key={lIdx} style={{ display: 'flex' }}>
1223
- <span className="file-changes-diff-sign-add">+</span>
1224
- <span>{line}</span>
1225
- </div>
1226
- ))}
1227
- </div>
1228
- )}
1229
- </div>
1230
- ))}
1231
- </div>
1232
- )}
1233
- </div>
1234
- )
1235
- })}
1236
- {changes.length > 3 && (
1237
- <button
1238
- type="button"
1239
- className="file-changes-show-more"
1240
- aria-expanded={showAll}
1241
- onClick={() => setShowAllFileChanges((current) => ({ ...current, [idPrefix]: !current[idPrefix] }))}
1242
- >
1243
- {showAll ? 'Show fewer files' : `Show ${changes.length - 3} more ${changes.length - 3 === 1 ? 'file' : 'files'}`}
1244
- <span aria-hidden="true" className={showAll ? 'is-expanded' : ''}>⌄</span>
1245
- </button>
1246
- )}
1247
- </div>
1248
- )
1249
- }
1250
-
1251
- const renderFileChanges = useCallback((interaction: any) => {
1252
- const interactionId = String(interaction.id)
1253
- const progress = agentActivitySnapshots[interactionId] ?? interaction.agentActivity ?? EMPTY_AGENT_PROGRESS
1254
- const changes = parseFileChangesFromProgress(progress)
1255
- if (changes.length === 0) return null
1256
-
1257
- const totalAdditions = changes.reduce((sum, c) => sum + c.additions, 0)
1258
- const totalDeletions = changes.reduce((sum, c) => sum + c.deletions, 0)
1259
- const createdCount = changes.filter((c) => c.created).length
1260
- const modifiedCount = changes.length - createdCount
1261
- const isOpen = openReviewIds[interactionId] ?? true
1262
-
1263
- let summaryLabel = ''
1264
- if (createdCount > 0 && modifiedCount === 0) {
1265
- summaryLabel = `${createdCount} ${createdCount === 1 ? 'file created' : 'files created'}`
1266
- } else if (createdCount > 0 && modifiedCount > 0) {
1267
- summaryLabel = `${createdCount} created, ${modifiedCount} modified`
1268
- } else {
1269
- summaryLabel = `${changes.length} ${changes.length === 1 ? 'file changed' : 'files changed'}`
1270
- }
1271
-
1272
- const handleRewind = async (e: React.MouseEvent) => {
1273
- e.stopPropagation()
1274
- const chatId = interaction.chatId || 'cli'
1275
- try {
1276
- const checkpoints = await listGitCheckpoints(chatId)
1277
- if (!checkpoints || checkpoints.length === 0) {
1278
- setUndoToastState({
1279
- visible: true,
1280
- message: 'No git checkpoints recorded for this session.',
1281
- canUndo: false,
1282
- isUndoing: false,
1283
- type: 'error',
1284
- })
1285
- return
1286
- }
1287
-
1288
- // Targeted Step Checkpoint resolution:
1289
- // Match checkpoints against files touched in this specific interaction
1290
- const changePaths = new Set(changes.map((c) => c.path.trim().toLowerCase()))
1291
- const matching = checkpoints.filter((cp) => {
1292
- if (!cp.targetPath) return false
1293
- const cpPath = cp.targetPath.trim().toLowerCase()
1294
- return changePaths.has(cpPath) || Array.from(changePaths).some((p) => cpPath.endsWith(p) || p.endsWith(cpPath))
1295
- })
1296
-
1297
- let targetCp: GitCheckpoint | null = null
1298
- if (matching.length > 0) {
1299
- // Earliest matching checkpoint represents the state immediately before this turn's modifications
1300
- targetCp = matching.reduce((earliest, curr) => (curr.step < earliest.step ? curr : earliest), matching[0])
1301
- } else {
1302
- // If no direct target path, try matching by timestamp
1303
- const interactionTs = interaction.createdAt ? new Date(interaction.createdAt).getTime() / 1000 : 0
1304
- if (interactionTs > 0) {
1305
- const afterCreated = checkpoints.filter((cp) => cp.timestamp >= interactionTs - 10)
1306
- if (afterCreated.length > 0) {
1307
- targetCp = afterCreated[0]
1308
- }
1309
- }
1310
- if (!targetCp) {
1311
- targetCp = checkpoints[checkpoints.length - 1]
1312
- }
1313
- }
1314
-
1315
- setRewindModalState({
1316
- isOpen: true,
1317
- interaction,
1318
- changes,
1319
- checkpoints,
1320
- targetCheckpoint: targetCp,
1321
- isLoading: false,
1322
- })
1323
- } catch (err: any) {
1324
- setUndoToastState({
1325
- visible: true,
1326
- message: `Failed to load checkpoints: ${err.message || String(err)}`,
1327
- canUndo: false,
1328
- isUndoing: false,
1329
- type: 'error',
1330
- })
1331
- }
1332
- }
1333
1125
 
1334
- return (
1335
- <div className="file-changes-summary-container">
1336
- <div className="agent-activity-card file-changes-card">
1337
- <div className="file-changes-summary-row">
1338
- <div className="file-changes-summary">
1339
- <span className="file-changes-summary-icon" aria-hidden="true">⊞</span>
1340
- <span className="file-changes-summary-copy">
1341
- <span className="file-changes-summary-label">{summaryLabel}</span>
1342
- <span className="file-changes-summary-counts">
1343
- {totalAdditions > 0 && <span className="file-changes-count-add">+{totalAdditions}</span>}
1344
- {totalDeletions > 0 && <span className="file-changes-count-del">-{totalDeletions}</span>}
1345
- </span>
1346
- </span>
1347
- </div>
1348
- <div className="file-changes-summary-actions">
1349
- <button
1350
- type="button"
1351
- className="file-changes-rewind-btn"
1352
- onClick={handleRewind}
1353
- title="Rewind workspace to before these file edits (Git Checkpoint)"
1354
- >
1355
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1356
- <polyline points="1 4 7 4 7 10" />
1357
- <path d="M3 9a9 9 0 1 0 2.13-5.36L1 7" />
1358
- </svg>
1359
- Undo
1360
- </button>
1361
- <button
1362
- type="button"
1363
- className="file-changes-review-btn"
1364
- title="Review changed code"
1365
- onClick={() => {
1366
- openReview('All conversation changes', getConversationChanges())
1367
- }}
1368
- >
1369
- Review
1370
- </button>
1371
- </div>
1372
- </div>
1373
- {isOpen && <div className="file-changes-list-container">{renderChangesList(changes, interactionId)}</div>}
1374
- </div>
1375
- </div>
1376
- )
1377
- }, [agentActivitySnapshots, getConversationChanges, openReviewIds, openFileDiffs, showAllFileChanges, workspacePath, onOpenArtifact, onOpenReview])
1378
-
1379
- const renderActiveFileChanges = () => {
1380
- const changes = composerChanges
1381
- if (changes.length === 0) return null
1382
-
1383
- const totalAdditions = changes.reduce((sum, c) => sum + c.additions, 0)
1384
- const totalDeletions = changes.reduce((sum, c) => sum + c.deletions, 0)
1385
- const createdCount = changes.filter((c) => c.created).length
1386
- const modifiedCount = changes.length - createdCount
1387
- const isOpen = openReviewIds['active-run'] ?? true
1388
-
1389
- let summaryLabel = ''
1390
- if (createdCount > 0 && modifiedCount === 0) {
1391
- summaryLabel = `${createdCount} ${createdCount === 1 ? 'file created' : 'files created'}`
1392
- } else if (createdCount > 0 && modifiedCount > 0) {
1393
- summaryLabel = `${createdCount} created, ${modifiedCount} modified`
1394
- } else {
1395
- summaryLabel = `${changes.length} ${changes.length === 1 ? 'file changed' : 'files changed'}`
1396
- }
1397
-
1398
- return (
1399
- <div className="message ai-message agent-activity-message" style={{ marginTop: '4px', marginBottom: '8px' }}>
1400
- <div className="agent-activity-card file-changes-card">
1401
- <div className="file-changes-summary-row">
1402
- <div className="file-changes-summary">
1403
- <span className="file-changes-summary-icon" aria-hidden="true">✓</span>
1404
- <span className="file-changes-summary-copy">
1405
- <span className="file-changes-summary-label">{summaryLabel}</span>
1406
- <span className="file-changes-summary-counts">
1407
- {totalAdditions > 0 && <span className="file-changes-count-add">+{totalAdditions}</span>}
1408
- {totalDeletions > 0 && <span className="file-changes-count-del">-{totalDeletions}</span>}
1409
- </span>
1410
- </span>
1411
- </div>
1412
- <button
1413
- type="button"
1414
- className="file-changes-review-btn"
1415
- title="Review changed code"
1416
- onClick={() => {
1417
- openReview('All conversation changes', getConversationChanges())
1418
- }}
1419
- >
1420
- Review
1421
- </button>
1422
- </div>
1126
+ const handleRewindRequest = useLatestCallback((payload: RewindRequestPayload) => {
1127
+ setRewindModalState({
1128
+ isOpen: true,
1129
+ interaction: payload.interaction,
1130
+ changes: payload.changes,
1131
+ checkpoints: payload.checkpoints,
1132
+ targetCheckpoint: payload.targetCheckpoint,
1133
+ isLoading: false,
1134
+ })
1135
+ })
1423
1136
 
1424
- {isOpen && (
1425
- <div className="file-changes-list-container" style={{ marginTop: '8px' }}>
1426
- {renderChangesList(changes, 'active')}
1427
- </div>
1428
- )}
1429
- </div>
1430
- </div>
1431
- )
1432
- }
1137
+ const handleRewindError = useLatestCallback((message: string) => {
1138
+ setUndoToastState({
1139
+ visible: true,
1140
+ message,
1141
+ canUndo: false,
1142
+ isUndoing: false,
1143
+ type: 'error',
1144
+ })
1145
+ })
1433
1146
 
1434
1147
  const liveTurn = sending || pendingApproval ? (
1435
1148
  <>
@@ -1437,15 +1150,22 @@ export default function ChatPanel({
1437
1150
  <div style={{ display: 'flex', flexDirection: 'column', gap: '8px', marginBottom: '16px' }}>
1438
1151
  <div className="message user-message"><div className="bubble-wrapper"><div className="message-bubble"><FormattedMessage text={[sendingMessage, sendingImageMarkers, sendingVideoMarkers].filter(Boolean).join(' ')} /></div></div></div>
1439
1152
  {agentMode && (
1440
- <ProgressActivity
1153
+ <AgentActivityDrawer
1441
1154
  progress={agentProgress}
1442
1155
  id="live"
1443
1156
  isOpen={openActivityIds['live'] ?? true}
1444
1157
  onToggle={toggleActivity}
1445
1158
  pendingApproval={!!pendingApproval}
1159
+ chatId={chatId}
1160
+ onOpenArtifact={openArtifact}
1446
1161
  />
1447
1162
  )}
1448
- {renderActiveFileChanges()}
1163
+ <TurnFileChanges
1164
+ changes={composerChanges}
1165
+ isLive
1166
+ onOpenArtifact={openArtifact}
1167
+ onOpenReview={openAllConversationReview}
1168
+ />
1449
1169
  <div className="message ai-message thinking-message">
1450
1170
  <div className="bubble-wrapper">
1451
1171
  {!agentMode && liveExtendedThoughts.length > 0 && (
@@ -1468,8 +1188,8 @@ export default function ChatPanel({
1468
1188
  />
1469
1189
  )}
1470
1190
  <div className="message-bubble">
1471
- <McpToolResults progress={agentProgress} running />
1472
- <ViewedImages progress={agentProgress} />
1191
+ <McpToolResults progress={agentProgress} running chatId={chatId} />
1192
+ <ViewedImages progress={agentProgress} chatId={chatId} onOpenArtifact={openArtifact} />
1473
1193
  <span>
1474
1194
  {compaction ? (
1475
1195
  <ContextCompactionStatus key={compaction.index} />
@@ -1483,9 +1203,7 @@ export default function ChatPanel({
1483
1203
  ? `${activeAgentName} (${activeModelName}) is thinking...`
1484
1204
  : 'Thinking'}
1485
1205
  </span>
1486
- <span className="thinking-status-meta">
1487
- {` · ${elapsedSeconds}s · Esc to cancel`}
1488
- </span>
1206
+ <ThinkingElapsedMeta />
1489
1207
  </div>
1490
1208
  )}
1491
1209
  </span>
@@ -1493,7 +1211,7 @@ export default function ChatPanel({
1493
1211
  {streamedResponse && (
1494
1212
  <div className="message-time" style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
1495
1213
  <span className="provider-model-chip" data-provider={(streamedResponse.provider || '').toLowerCase()} title={`${streamedResponse.provider} • ${streamedResponse.model}`}>
1496
- <span className="provider-chip-dot" aria-hidden="true" />
1214
+ <ProviderBrandIcon provider={streamedResponse.provider} model={streamedResponse.model} customProviders={settingsConfig?.customProviders} size={13} />
1497
1215
  <span className="provider-chip-name">{streamedResponse.provider}</span>
1498
1216
  <span className="provider-chip-divider">/</span>
1499
1217
  <span className="provider-chip-model">{streamedResponse.model}</span>
@@ -1512,8 +1230,9 @@ export default function ChatPanel({
1512
1230
  <button
1513
1231
  type="button"
1514
1232
  className={`msg-action-btn tts-btn ${speakingText === throttledStreamedReply ? 'is-speaking' : ''}`}
1233
+ disabled={sending}
1515
1234
  onClick={() => speak(throttledStreamedReply)}
1516
- title={speakingText === throttledStreamedReply ? 'Stop reading' : 'Read aloud'}
1235
+ title={sending ? 'Read after the reply finishes' : speakingText === throttledStreamedReply ? 'Stop reading' : 'Read aloud'}
1517
1236
  >
1518
1237
  {renderSpeakerIcon(speakingText === throttledStreamedReply)}
1519
1238
  </button>
@@ -1545,6 +1264,7 @@ export default function ChatPanel({
1545
1264
  onDrop={handleDrop}
1546
1265
  style={activeArtifact || reviewPage ? { flex: '0 0 calc(100% - var(--preview-width, 50%))', width: 'calc(100% - var(--preview-width, 50%))', minWidth: '320px', maxWidth: 'none', margin: 0, position: 'relative' } : undefined}
1547
1266
  >
1267
+ {speechError && <p role="status" style={{ padding: '8px 16px', fontSize: '12px', color: 'var(--text-muted)' }}>{speechError} <button type="button" onClick={() => setSpeechError('')}>Dismiss</button></p>}
1548
1268
  {isDragging && (
1549
1269
  <div
1550
1270
  className="drag-drop-overlay"
@@ -1558,7 +1278,7 @@ export default function ChatPanel({
1558
1278
  left: 0,
1559
1279
  right: 0,
1560
1280
  bottom: 0,
1561
- background: 'rgba(15, 23, 42, 0.82)',
1281
+ background: 'var(--bg-backdrop)',
1562
1282
  backdropFilter: 'blur(8px)',
1563
1283
  border: '2px dashed var(--accent)',
1564
1284
  borderRadius: '16px',
@@ -1567,7 +1287,7 @@ export default function ChatPanel({
1567
1287
  flexDirection: 'column',
1568
1288
  alignItems: 'center',
1569
1289
  justifyContent: 'center',
1570
- color: 'white',
1290
+ color: 'var(--text-primary)',
1571
1291
  zIndex: 1000,
1572
1292
  pointerEvents: 'auto',
1573
1293
  }}
@@ -1651,7 +1371,6 @@ export default function ChatPanel({
1651
1371
  )}
1652
1372
  </div>
1653
1373
  <div className="chat-header-actions">
1654
- {showSessionSources && <SessionSourcesPopover chatId={chatId} liveProgress={agentProgress} open={sessionSourcesOpen} onOpenChange={setSessionSourcesOpen} />}
1655
1374
  {tools?.onToggle && <ToolsPanelToggle open={tools.open} count={tools.backgroundTaskCount} onToggle={tools.onToggle} />}
1656
1375
  {activeArtifact && (
1657
1376
  <button
@@ -1722,17 +1441,16 @@ export default function ChatPanel({
1722
1441
  onEditMessage={handleEditMessage}
1723
1442
  speakingText={speakingText}
1724
1443
  agentActivitySnapshots={agentActivitySnapshots}
1725
- thinkingExpanded={thinkingExpanded}
1726
1444
  openActivityIds={openActivityIds}
1727
- openReviewIds={openReviewIds}
1728
- openFileDiffs={openFileDiffs}
1729
- onThinkingExpandedChange={onThinkingExpandedChange}
1730
1445
  handleCopyMessage={handleCopyMessage}
1731
1446
  speak={speak}
1732
1447
  toggleActivity={toggleActivity}
1733
- showAllFileChanges={showAllFileChanges}
1734
- workspacePath={workspacePath}
1735
- renderFileChanges={renderFileChanges}
1448
+ chatId={chatId}
1449
+ customProviders={settingsConfig?.customProviders}
1450
+ onOpenArtifact={openArtifact}
1451
+ onOpenReview={openAllConversationReview}
1452
+ onRewindRequest={handleRewindRequest}
1453
+ onRewindError={handleRewindError}
1736
1454
  />
1737
1455
  </Fragment>
1738
1456
  )
@@ -1757,6 +1475,10 @@ export default function ChatPanel({
1757
1475
 
1758
1476
  <div className="input-area">
1759
1477
  <ModsPanel workspacePath={workspacePath} chatId={chatId} panelTarget={tools?.modsPanelTarget} onOpen={tools?.onOpenMods ?? (() => {})} />
1478
+ <SubagentStatusStrip
1479
+ progress={agentProgress}
1480
+ onOpenDetails={() => toggleActivity('live')}
1481
+ />
1760
1482
  {composerChanges.length > 0 && (
1761
1483
  <button
1762
1484
  type="button"
@@ -1815,6 +1537,18 @@ export default function ChatPanel({
1815
1537
  </label>
1816
1538
  )}
1817
1539
  </div>
1540
+ {queuedPrompts && queuedPrompts.length > 0 && (
1541
+ <QueuedMessagesBanner
1542
+ queuedPrompts={queuedPrompts}
1543
+ queuePaused={Boolean(queuePaused)}
1544
+ sending={sending}
1545
+ onRemove={onRemoveQueuedPrompt || (() => {})}
1546
+ onEdit={onEditQueuedPrompt || (() => {})}
1547
+ onClear={onClearQueuedPrompts || (() => {})}
1548
+ onSteer={onSteerQueuedPrompt || (() => {})}
1549
+ onResumeQueue={onResumeQueue}
1550
+ />
1551
+ )}
1818
1552
  <form
1819
1553
  id="chat-form"
1820
1554
  className={geminiLiveEnabled ? 'has-live-btn' : ''}
@@ -1881,7 +1615,7 @@ export default function ChatPanel({
1881
1615
  </svg>
1882
1616
  </span>
1883
1617
  <span style={{ fontSize: '0.76rem', color: 'var(--text-soft)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '220px' }}>{documentName}</span>
1884
- <button type="button" onClick={onRemoveDocument} style={{ background: 'transparent', border: 0, color: '#ef4444', cursor: 'pointer', display: 'inline-flex', alignItems: 'center' }}>
1618
+ <button type="button" onClick={onRemoveDocument} style={{ background: 'transparent', border: 0, color: 'var(--status-error)', cursor: 'pointer', display: 'inline-flex', alignItems: 'center' }}>
1885
1619
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
1886
1620
  <line x1="18" y1="6" x2="6" y2="18"></line>
1887
1621
  <line x1="6" y1="6" x2="18" y2="18"></line>
@@ -2041,9 +1775,9 @@ export default function ChatPanel({
2041
1775
  disabled={sending || voiceAwaitingResponse || geminiLive.voiceMode}
2042
1776
  ariaLabel="Voice input"
2043
1777
  title={isRecording ? 'Stop recording · Esc or slide left to cancel' : 'Tap to dictate · hold to record'}
2044
- accentColor="#f5f5f5"
2045
- iconColor="#a1a1aa"
2046
- background="#27272a"
1778
+ accentColor="var(--text-primary)"
1779
+ iconColor="var(--text-muted)"
1780
+ background="var(--bg-surface-soft)"
2047
1781
  size={28}
2048
1782
  shape="pill"
2049
1783
  reach={8}
@@ -2089,18 +1823,34 @@ export default function ChatPanel({
2089
1823
  </button>
2090
1824
  )}
2091
1825
  {sending ? (
2092
- <button
2093
- id="send-btn"
2094
- className="stop-btn"
2095
- type="button"
2096
- onClick={onCancelMessage}
2097
- title="Stop generating"
2098
- style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }}
2099
- >
2100
- <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
2101
- <rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect>
2102
- </svg>
2103
- </button>
1826
+ <div style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>
1827
+ {canSubmit && (
1828
+ <button
1829
+ id="queue-btn"
1830
+ className="queue-btn"
1831
+ type="submit"
1832
+ title="Add to queue (Enter)"
1833
+ style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }}
1834
+ >
1835
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1836
+ <line x1="22" y1="2" x2="11" y2="13"></line>
1837
+ <polygon points="22 2 15 22 11 13 2 9 22 2"></polygon>
1838
+ </svg>
1839
+ </button>
1840
+ )}
1841
+ <button
1842
+ id="send-btn"
1843
+ className="stop-btn"
1844
+ type="button"
1845
+ onClick={onCancelMessage}
1846
+ title="Stop generating"
1847
+ style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }}
1848
+ >
1849
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
1850
+ <rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect>
1851
+ </svg>
1852
+ </button>
1853
+ </div>
2104
1854
  ) : (
2105
1855
  <button id="send-btn" type="submit" disabled={!canSubmit} style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }}>
2106
1856
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
@@ -2114,9 +1864,6 @@ export default function ChatPanel({
2114
1864
  <p className="composer-voice-feedback" role="status">{voiceTranscript}</p>
2115
1865
  )}
2116
1866
  </div>
2117
- <p className="input-disclaimer">
2118
- Mint Agent is an AI gateway. Responses via third-party APIs. Verify critical info.
2119
- </p>
2120
1867
  {geminiLive.voiceMode && (
2121
1868
  <GeminiLiveOverlay
2122
1869
  status={
@@ -2219,29 +1966,33 @@ export default function ChatPanel({
2219
1966
  >
2220
1967
  <div className="preview-split-resizer-grip" />
2221
1968
  </div>
2222
- {reviewPage ? (
2223
- <CodeReviewPage
2224
- title={reviewPage.title}
2225
- changes={reviewPage.changes}
2226
- workspacePath={workspacePath}
2227
- onBack={() => setReviewPage(null)}
2228
- />
2229
- ) : activeArtifact ? (
2230
- <ArtifactPreviewPanel artifact={activeArtifact} onClose={() => setActiveArtifact(null)} workspacePath={workspacePath} />
2231
- ) : null}
1969
+ <Suspense fallback={null}>
1970
+ {reviewPage ? (
1971
+ <CodeReviewPage
1972
+ title={reviewPage.title}
1973
+ changes={reviewPage.changes}
1974
+ workspacePath={workspacePath}
1975
+ onBack={() => setReviewPage(null)}
1976
+ />
1977
+ ) : activeArtifact ? (
1978
+ <ArtifactPreviewPanel artifact={activeArtifact} onClose={() => setActiveArtifact(null)} workspacePath={workspacePath} />
1979
+ ) : null}
1980
+ </Suspense>
2232
1981
  </>
2233
1982
  )}
2234
1983
  {rewindModalState.isOpen && (
2235
- <RewindModal
2236
- isOpen={rewindModalState.isOpen}
2237
- onClose={() => setRewindModalState((prev) => ({ ...prev, isOpen: false }))}
2238
- onConfirm={handleConfirmRewind}
2239
- checkpoints={rewindModalState.checkpoints}
2240
- targetCheckpoint={rewindModalState.targetCheckpoint}
2241
- changes={rewindModalState.changes}
2242
- workspacePath={workspacePath}
2243
- isLoading={rewindModalState.isLoading}
2244
- />
1984
+ <Suspense fallback={null}>
1985
+ <RewindModal
1986
+ isOpen={rewindModalState.isOpen}
1987
+ onClose={() => setRewindModalState((prev) => ({ ...prev, isOpen: false }))}
1988
+ onConfirm={handleConfirmRewind}
1989
+ checkpoints={rewindModalState.checkpoints}
1990
+ targetCheckpoint={rewindModalState.targetCheckpoint}
1991
+ changes={rewindModalState.changes}
1992
+ workspacePath={workspacePath}
1993
+ isLoading={rewindModalState.isLoading}
1994
+ />
1995
+ </Suspense>
2245
1996
  )}
2246
1997
  </div>
2247
1998
  )