@pheem49/mint 1.16.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (984) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +2 -2
  3. package/README.md +8 -2
  4. package/Release_Note.md +222 -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/diff_render.rs +66 -44
  9. package/crates/mint-cli/src/agent/live_status.rs +64 -6
  10. package/crates/mint-cli/src/agent/markdown_render.rs +342 -5
  11. package/crates/mint-cli/src/agent.rs +202 -47
  12. package/crates/mint-cli/src/commands/agent.rs +223 -117
  13. package/crates/mint-cli/src/commands/browser.rs +114 -0
  14. package/crates/mint-cli/src/commands/config.rs +14 -1
  15. package/crates/mint-cli/src/commands/integrations.rs +3 -3
  16. package/crates/mint-cli/src/commands/knowledge.rs +16 -2
  17. package/crates/mint-cli/src/commands/mod.rs +15 -4
  18. package/crates/mint-cli/src/commands/tailnet_web.rs +3 -7
  19. package/crates/mint-cli/src/companion_navigation.rs +268 -0
  20. package/crates/mint-cli/src/interactive/chat_tui/dialog.rs +572 -0
  21. package/crates/mint-cli/src/interactive/chat_tui/mod.rs +1427 -0
  22. package/crates/mint-cli/src/interactive/chat_tui/render.rs +1524 -0
  23. package/crates/mint-cli/src/interactive/chat_tui/selection.rs +401 -0
  24. package/crates/mint-cli/src/interactive/chat_tui/state.rs +1833 -0
  25. package/crates/mint-cli/src/interactive/chat_tui/tests.rs +3414 -0
  26. package/crates/mint-cli/src/interactive/chat_tui/thought.rs +202 -0
  27. package/crates/mint-cli/src/interactive/chat_tui/transcript.rs +728 -0
  28. package/crates/mint-cli/src/interactive/chat_tui/watermark.rs +148 -0
  29. package/crates/mint-cli/src/interactive/command_ui.rs +92 -5
  30. package/crates/mint-cli/src/interactive/composer.rs +186 -0
  31. package/crates/mint-cli/src/interactive/format.rs +78 -3
  32. package/crates/mint-cli/src/interactive/input_box.rs +61 -1
  33. package/crates/mint-cli/src/interactive/resume_picker.rs +367 -25
  34. package/crates/mint-cli/src/interactive/slash_commands.rs +758 -373
  35. package/crates/mint-cli/src/interactive/tool_activity.rs +468 -56
  36. package/crates/mint-cli/src/interactive.rs +74 -5
  37. package/crates/mint-cli/src/main.rs +26 -2
  38. package/crates/mint-cli/src/markdown.rs +2 -37
  39. package/crates/mint-cli/src/onboard.rs +3897 -1321
  40. package/crates/mint-cli/src/setup.rs +1342 -624
  41. package/crates/mint-cli/src/terminal_theme.rs +159 -35
  42. package/crates/mint-cli/tests/library_intake.rs +1 -0
  43. package/crates/mint-cli/tests/mods_testing.rs +5 -1
  44. package/crates/mint-companion-protocol/src/lib.rs +113 -0
  45. package/crates/mint-core/src/agent/chat/anthropic.rs +318 -0
  46. package/crates/mint-core/src/agent/chat/custom.rs +149 -0
  47. package/crates/mint-core/src/agent/chat/gemini.rs +518 -0
  48. package/crates/mint-core/src/agent/chat/mod.rs +857 -0
  49. package/crates/mint-core/src/agent/chat/ollama.rs +321 -0
  50. package/crates/mint-core/src/agent/chat/openai.rs +582 -0
  51. package/crates/mint-core/src/agent/chat/streaming.rs +469 -0
  52. package/crates/mint-core/src/agent/chat/tests.rs +1479 -0
  53. package/crates/mint-core/src/agent/memory.rs +129 -8
  54. package/crates/mint-core/src/agent/safety.rs +56 -4
  55. package/crates/mint-core/src/agent/skill_inventory.rs +3 -1
  56. package/crates/mint-core/src/agent/skills.rs +1 -0
  57. package/crates/mint-core/src/agent/tasks.rs +2 -2
  58. package/crates/mint-core/src/api_server/routes/auth.rs +1 -4
  59. package/crates/mint-core/src/api_server/routes/chat.rs +53 -17
  60. package/crates/mint-core/src/api_server/routes/gemini_live.rs +14 -1
  61. package/crates/mint-core/src/api_server/routes/html_preview.rs +1 -8
  62. package/crates/mint-core/src/api_server/routes/misc.rs +116 -0
  63. package/crates/mint-core/src/api_server/routes/profile_oauth.rs +43 -26
  64. package/crates/mint-core/src/api_server/routes/sessions.rs +114 -76
  65. package/crates/mint-core/src/api_server/routes/skills_subagents.rs +11 -7
  66. package/crates/mint-core/src/api_server/routes/status_health.rs +18 -8
  67. package/crates/mint-core/src/api_server.rs +211 -65
  68. package/crates/mint-core/src/avatar_bridge.rs +5 -24
  69. package/crates/mint-core/src/browser/cdp.rs +92 -30
  70. package/crates/mint-core/src/browser/headless.rs +582 -0
  71. package/crates/mint-core/src/browser/input.rs +7 -62
  72. package/crates/mint-core/src/browser/interact.rs +0 -14
  73. package/crates/mint-core/src/browser/mod.rs +10 -30
  74. package/crates/mint-core/src/browser/navigate.rs +83 -44
  75. package/crates/mint-core/src/browser/runtime.rs +282 -0
  76. package/crates/mint-core/src/browser/session.rs +240 -400
  77. package/crates/mint-core/src/browser/workflow.rs +496 -0
  78. package/crates/mint-core/src/companion/navigation.rs +115 -0
  79. package/crates/mint-core/src/companion.rs +109 -1
  80. package/crates/mint-core/src/cron/store.rs +2 -2
  81. package/crates/mint-core/src/integrations/mcp.rs +6 -8
  82. package/crates/mint-core/src/integrations/mcp_result.rs +45 -0
  83. package/crates/mint-core/src/lib.rs +10 -11
  84. package/crates/mint-core/src/media/gemini_live.rs +636 -86
  85. package/crates/mint-core/src/media/image_proxy.rs +563 -0
  86. package/crates/mint-core/src/media/library/migration.rs +26 -0
  87. package/crates/mint-core/src/media/library/tests.rs +1 -1
  88. package/crates/mint-core/src/media/library/thumbnails.rs +8 -2
  89. package/crates/mint-core/src/media/pictures.rs +1 -1
  90. package/crates/mint-core/src/media/tool_images.rs +287 -0
  91. package/crates/mint-core/src/media/tts/playback.rs +609 -0
  92. package/crates/mint-core/src/media/tts.rs +1 -0
  93. package/crates/mint-core/src/media.rs +2 -0
  94. package/crates/mint-core/src/mods/manager.rs +101 -35
  95. package/crates/mint-core/src/orchestration/context_render.rs +878 -44
  96. package/crates/mint-core/src/orchestration/decision_parsing.rs +536 -39
  97. package/crates/mint-core/src/orchestration/diagnostics.rs +307 -0
  98. package/crates/mint-core/src/orchestration/full_skill_result_tests.rs +12 -0
  99. package/crates/mint-core/src/orchestration/image_regressions.rs +379 -0
  100. package/crates/mint-core/src/orchestration/loop_guard.rs +479 -0
  101. package/crates/mint-core/src/orchestration/mcp_outcome_tests.rs +864 -0
  102. package/crates/mint-core/src/orchestration/memory_skill.rs +88 -28
  103. package/crates/mint-core/src/orchestration/mod.rs +859 -4244
  104. package/crates/mint-core/src/orchestration/reliability.rs +581 -0
  105. package/crates/mint-core/src/orchestration/repeated_failures.rs +8 -0
  106. package/crates/mint-core/src/orchestration/review_regressions.rs +179 -28
  107. package/crates/mint-core/src/orchestration/tests.rs +1665 -0
  108. package/crates/mint-core/src/orchestration/tools/dispatch.rs +967 -0
  109. package/crates/mint-core/src/orchestration/tools/files.rs +32 -3
  110. package/crates/mint-core/src/orchestration/tools/mod.rs +5 -1
  111. package/crates/mint-core/src/orchestration/tools/planning.rs +102 -42
  112. package/crates/mint-core/src/orchestration/tools/plugins_mcp.rs +19 -4
  113. package/crates/mint-core/src/orchestration/tools/project.rs +1 -1
  114. package/crates/mint-core/src/orchestration/tools/shell.rs +157 -62
  115. package/crates/mint-core/src/orchestration/tools/web.rs +5 -1
  116. package/crates/mint-core/src/orchestration/trajectory_schema.rs +353 -0
  117. package/crates/mint-core/src/orchestration/truncation.rs +368 -0
  118. package/crates/mint-core/src/orchestration/types.rs +648 -0
  119. package/crates/mint-core/src/orchestration/verification.rs +36 -9
  120. package/crates/mint-core/src/orchestration/workspace_helpers.rs +76 -27
  121. package/crates/mint-core/src/prompts/agent.rs +69 -102
  122. package/crates/mint-core/src/prompts/tool_catalog.rs +104 -153
  123. package/crates/mint-core/src/search/files.rs +20 -0
  124. package/crates/mint-core/src/search/web_search.rs +44 -3
  125. package/crates/mint-core/src/slash/mod.rs +481 -55
  126. package/crates/mint-core/src/slash/models.rs +6 -1
  127. package/crates/mint-core/src/swarm/batch.rs +643 -0
  128. package/crates/mint-core/src/swarm/dossier.rs +152 -0
  129. package/crates/mint-core/src/swarm/labels.rs +100 -0
  130. package/crates/mint-core/src/swarm/mod.rs +158 -0
  131. package/crates/mint-core/src/swarm/permissions.rs +167 -0
  132. package/crates/mint-core/src/system/auth.rs +156 -7
  133. package/crates/mint-core/src/system/bg_shell.rs +78 -9
  134. package/crates/mint-core/src/system/config.rs +266 -35
  135. package/crates/mint-core/src/system/mint_web.rs +33 -12
  136. package/crates/mint-core/src/system/shell.rs +179 -10
  137. package/crates/mint-core/src/system/workspace.rs +204 -0
  138. package/crates/mint-core/tests/background_retention.rs +1 -1
  139. package/crates/mint-core/tests/memory_persistence.rs +27 -0
  140. package/crates/mint-mod-runtime/src/lib.rs +37 -23
  141. package/out/web/assets/ArtifactPreviewPanel-Cx6BVOOF.js +2 -0
  142. package/out/web/assets/ArtifactPreviewPanel-DAT_Y7i0.css +1 -0
  143. package/out/web/assets/CalculationCard-D2E74u5q.js +1 -0
  144. package/out/web/assets/CliSessionsView-ZbdtSjvK.css +1 -0
  145. package/out/web/assets/CliSessionsView-z5i6qGyb.js +1 -0
  146. package/out/web/assets/CodeReviewPage-BK2bOScd.css +1 -0
  147. package/out/web/assets/CodeReviewPage-Dp6zHuHu.js +2 -0
  148. package/out/web/assets/CommandPalette-DaKlzbKs.js +1 -0
  149. package/out/web/assets/ImageGenCard-BMCJHP9O.js +1 -0
  150. package/out/web/assets/ImageSearchCard-Cld_SOUg.js +1 -0
  151. package/out/web/assets/ImageStudioPanel-B5N7TjeB.js +1 -0
  152. package/out/web/assets/LibraryPage-CMB89rJ0.css +1 -0
  153. package/out/web/assets/LibraryPage-DbZEi4W_.js +2 -0
  154. package/out/web/assets/LinkedFoldersView-9B9DIPoZ.js +1 -0
  155. package/out/web/assets/McpRegistryPicker-DnXPlzI7.js +1 -0
  156. package/out/web/assets/McpServersView-CiNBNUl4.js +1 -0
  157. package/out/web/assets/MermaidCard-BBDNEXbY.js +2 -0
  158. package/out/web/assets/MintDashboard-C_UYPoNV.js +119 -0
  159. package/out/web/assets/MintDashboard-DTd8C_c8.css +1 -0
  160. package/out/web/assets/PlanCard-C2x5pajq.js +1 -0
  161. package/out/web/assets/PluginsView-DoTg9MVa.js +1 -0
  162. package/out/web/assets/RewindModal-B5oowrR0.js +1 -0
  163. package/out/web/assets/ScheduledTasksView-BD5DVPkZ.js +1 -0
  164. package/out/web/assets/SelectField-Cy6CghrU.js +1 -0
  165. package/out/web/assets/SelectField-lFEkkWCU.css +1 -0
  166. package/out/web/assets/SettingsWindow-BYl_oCFh.js +4 -0
  167. package/out/web/assets/SettingsWindow-Ckcgnjt8.css +1 -0
  168. package/out/web/assets/SkillsView-CIeWwq5z.js +2 -0
  169. package/out/web/assets/StockCard-DxUciKyp.js +1 -0
  170. package/out/web/assets/ToolSurfacePage-qBgs_VHq.css +1 -0
  171. package/out/web/assets/ToolSurfacePage-saVbVrkE.js +38 -0
  172. package/out/web/assets/UiFeatureCard-CdY0hGWy.js +1 -0
  173. package/out/web/assets/UiGridCard-BBK3I5hC.js +1 -0
  174. package/out/web/assets/UiMockupWidget-CpR9EDuc.js +1 -0
  175. package/out/web/assets/{VeoStudioPanel-DOj7_WR3.css → VeoStudioPanel-9kU9YLEN.css} +1 -1
  176. package/out/web/assets/VeoStudioPanel-Co6-wEWM.js +4 -0
  177. package/out/web/assets/WeatherCard-Buzi7Vfu.js +1 -0
  178. package/out/web/assets/WorkspacePanel-BfHKkulU.js +1 -0
  179. package/out/web/assets/WorkspacePdfPreview-Bi8Zzyir.js +2 -0
  180. package/out/web/assets/abnfDiagram-VCTEODGH-CMfR95N2.js +1 -0
  181. package/out/web/assets/architecture-7GRP2DOG-DhAM4HyO.js +1 -0
  182. package/out/web/assets/architectureDiagram-5GKGNRK7-Yk3TUJ_F.js +36 -0
  183. package/out/web/assets/{blockDiagram-NRAW4CY4-BrrqzHW5.js → blockDiagram-I7D4REHJ-X9fBgJik.js} +4 -4
  184. package/out/web/assets/c4Diagram-7LVT6UL2-Bk9x7N-8.js +38 -0
  185. package/out/web/assets/chunk-2Q5K7J3B-D2JLPQzF.js +1 -0
  186. package/out/web/assets/{chunk-TEH6E4GO-G4Cdlyrt.js → chunk-4HAMMTFA-Dx5fk1_0.js} +3 -3
  187. package/out/web/assets/{chunk-5VM5RSS4-BiPuE0io.js → chunk-5VM5RSS4-BZ2oBPYQ.js} +1 -1
  188. package/out/web/assets/chunk-75Z2AOVW-BszTQoM4.js +2 -0
  189. package/out/web/assets/chunk-DU6HZSFF-DK-As3rk.js +128 -0
  190. package/out/web/assets/chunk-F27PBJKO-LmncZZIS.js +1 -0
  191. package/out/web/assets/chunk-FOHPRMQF-JXEeeJ9r.js +161 -0
  192. package/out/web/assets/{chunk-GMAD6QVW-BuhEcgHq.js → chunk-GMAD6QVW-DSQ_sDRJ.js} +12 -12
  193. package/out/web/assets/chunk-GVQU2GXP-Cno3ulje.js +1 -0
  194. package/out/web/assets/chunk-IMKFNOWR-bIzfY9Jc.js +231 -0
  195. package/out/web/assets/chunk-JWPE2WC7-BeEMUFDw.js +1 -0
  196. package/out/web/assets/chunk-L3NEJ4N5-Dl6eOa0D.js +1 -0
  197. package/out/web/assets/chunk-OSK3NFVY-BaUGJ-cM.js +10 -0
  198. package/out/web/assets/chunk-P2QGCYS3-_066ndhH.js +1 -0
  199. package/out/web/assets/chunk-POPQ4Y6H-YT1AKhTv.js +1 -0
  200. package/out/web/assets/chunk-PWAF6VOD-CrEgDsxh.js +1 -0
  201. package/out/web/assets/chunk-SHT3W25Y-_KwaRLOl.js +168 -0
  202. package/out/web/assets/{chunk-SVP7TREG-Bu_yYb-V.js → chunk-SVP7TREG-BQ1qb32L.js} +1 -1
  203. package/out/web/assets/{chunk-LCL6LL3I-BhXV9zyH.js → chunk-TICWLB2K-BDyehCtg.js} +4 -4
  204. package/out/web/assets/chunk-XXDRQBXY-B9YlhOkE.js +1 -0
  205. package/out/web/assets/chunk-Y2CYZVJY-BxCWjNVG.js +1 -0
  206. package/out/web/assets/classDiagram-ZZMXUADV-BoSpzRCJ.js +1 -0
  207. package/out/web/assets/classDiagram-v2-VYDZK3BY-BoSpzRCJ.js +1 -0
  208. package/out/web/assets/config-2suVFPZg.css +1 -0
  209. package/out/web/assets/config-CkRCdkxn.js +2 -0
  210. package/out/web/assets/core-Mi3s5D4_.js +1 -0
  211. package/out/web/assets/cose-bilkent-JH36ORCC-qlna31ty.js +1 -0
  212. package/out/web/assets/cynefin-OW5HDTMX-Dl_31aaN.js +1 -0
  213. package/out/web/assets/cynefinDiagram-5FMLGOSQ-Bpir8jha.js +62 -0
  214. package/out/web/assets/cytoscape.esm-DWtAUG0r.js +321 -0
  215. package/out/web/assets/dagre-CnWJJM5f.js +1 -0
  216. package/out/web/assets/dagre-GXQ25YYZ-D9xu3nsq.js +4 -0
  217. package/out/web/assets/diagram-S7CK7UJ4-DeveoEeB.js +30 -0
  218. package/out/web/assets/diagram-UQ7AKVKN-p4xWRESV.js +41 -0
  219. package/out/web/assets/{diagram-VSXAHHWV-BJ86Ov2Y.js → diagram-VSXAHHWV-C7qz9NDF.js} +1 -1
  220. package/out/web/assets/diagram-VX7I27RA-DRiCa3Vd.js +24 -0
  221. package/out/web/assets/diagram-Z3DM3KII-Bt7zduQX.js +24 -0
  222. package/out/web/assets/dist-9ISJ7r-g.js +1 -0
  223. package/out/web/assets/dist-js-BV3mI7uw.js +1 -0
  224. package/out/web/assets/ebnfDiagram-PWID7BFC-DV9WpwdR.js +1 -0
  225. package/out/web/assets/{erDiagram-SSCWMZ5O-CzzmnZWT.js → erDiagram-RLTQ6QDP-BJ_nwG2m.js} +3 -3
  226. package/out/web/assets/event-D7D-EBy9.js +1 -0
  227. package/out/web/assets/eventmodeling-NTZA5JFV-BTBMrfVa.js +1 -0
  228. package/out/web/assets/flowDiagram-HODETNUW-Cdlq3cJL.js +1 -0
  229. package/out/web/assets/ganttDiagram-EL5Y4UJY-DQLdsXrC.js +292 -0
  230. package/out/web/assets/gitGraph-4MIJSDKK-CL1OEOQ_.js +1 -0
  231. package/out/web/assets/gitGraphDiagram-WWUBYQGX-8cSi42H7.js +106 -0
  232. package/out/web/assets/graphlib-Bh9gHply.js +1 -0
  233. package/out/web/assets/index-BocxnrDG.js +168 -0
  234. package/out/web/assets/index-yeh_r55a.css +1 -0
  235. package/out/web/assets/info-A6RAGUB7-C1zsX5sc.js +1 -0
  236. package/out/web/assets/infoDiagram-27XIBGKW-DsRYtIyI.js +2 -0
  237. package/out/web/assets/{ishikawaDiagram-5VMMS53U-s38yo28y.js → ishikawaDiagram-5VMMS53U-B2crwIXj.js} +4 -4
  238. package/out/web/assets/journeyDiagram-3NMN7TZE-BTH-GyVR.js +139 -0
  239. package/out/web/assets/jsx-runtime-DmUwWVTj.js +1 -0
  240. package/out/web/assets/{kanban-definition-3QL26DDD-DodjgySL.js → kanban-definition-UXKFOSKX-BeRfCnuA.js} +6 -6
  241. package/out/web/assets/katex-MCdQaEAD.js +257 -0
  242. package/out/web/assets/mermaid-parser.core-BJwgCBBc.js +7 -0
  243. package/out/web/assets/mermaid.core-CsDDodN8.js +44 -0
  244. package/out/web/assets/{mindmap-definition-FBJOCRG2-260WBDxZ.js → mindmap-definition-YA3MSWOX-B42efOQ1.js} +4 -4
  245. package/out/web/assets/modelManager-B3ZFMh8v.js +2 -0
  246. package/out/web/assets/oauthManager-Ch5Du2fF.js +1 -0
  247. package/out/web/assets/packet-AYTQ26CC-B6xUyE6r.js +1 -0
  248. package/out/web/assets/pdf-Bcahc2yC.js +56 -0
  249. package/out/web/assets/pdf.worker.min-Dkey6ZUl.mjs +27 -0
  250. package/out/web/assets/pegDiagram-XKGWAZYB-1LabVycL.js +1 -0
  251. package/out/web/assets/pie-WAS4IAKB-DJwo-nf_.js +1 -0
  252. package/out/web/assets/pieDiagram-E7YTZNPT-icmAqzy4.js +39 -0
  253. package/out/web/assets/{quadrantDiagram-AXDQQJYC-B8D3gU5d.js → quadrantDiagram-AXDQQJYC-CZ-wEx41.js} +4 -4
  254. package/out/web/assets/radar-RG4KPBEZ-D7d-Xriw.js +1 -0
  255. package/out/web/assets/railroad-74A4TZTK-viuhdYbs.js +1 -0
  256. package/out/web/assets/railroad-abnf-HS5TGJTU-DNXiCNea.js +1 -0
  257. package/out/web/assets/railroad-ebnf-LZEXJU2U-nkSu1-0C.js +1 -0
  258. package/out/web/assets/railroad-peg-WCYAUIDC-BhbMeQzz.js +1 -0
  259. package/out/web/assets/railroadDiagram-O6MQD6OU-CLpG1jUX.js +1 -0
  260. package/out/web/assets/{requirementDiagram-EFPCY7ZU-D2X-Ewik.js → requirementDiagram-BXWQKSXE-kRDrvWrc.js} +3 -3
  261. package/out/web/assets/rolldown-runtime-CNOWq4Kh.js +1 -0
  262. package/out/web/assets/rough.esm-CNnFptCR.js +1 -0
  263. package/out/web/assets/sankeyDiagram-P5KCCOFB-DxAwmq4x.js +40 -0
  264. package/out/web/assets/sequenceDiagram-WJ2MYXX4-aLgY-6Wz.js +162 -0
  265. package/out/web/assets/sizeCapture-INFHLROL-C8Q8DbV5.js +1 -0
  266. package/out/web/assets/src-CRDfRlHM.js +1 -0
  267. package/out/web/assets/stateDiagram-D77RDMKH-D5QWfOhp.js +1 -0
  268. package/out/web/assets/stateDiagram-v2-MP3YSRHH-D6OiZoAP.js +1 -0
  269. package/out/web/assets/studio-BBZQ_-QK.js +1 -0
  270. package/out/web/assets/swimlanes-42K2YHIH-CRs5UyA-.js +1 -0
  271. package/out/web/assets/swimlanesDiagram-VR7AAH4N-UgEXIsV0.js +8 -0
  272. package/out/web/assets/syntaxHighlight-C-wAGT84.js +3 -0
  273. package/out/web/assets/timeline-definition-24CTP7MA-Denqd9qb.js +120 -0
  274. package/out/web/assets/treeView-Q6P3EWNA-0my3Z3s4.js +1 -0
  275. package/out/web/assets/treemap-WGGIJYW6-B_EjkLYq.js +1 -0
  276. package/out/web/assets/vennDiagram-4TSXK5OY-DxVg3Ewr.js +34 -0
  277. package/out/web/assets/wardley-WFR3VGLG-CGD-Tj4p.js +1 -0
  278. package/out/web/assets/{wardleyDiagram-VM6X3IG4-DAdXELbQ.js → wardleyDiagram-VM6X3IG4-CmfS39Xm.js} +35 -35
  279. package/out/web/assets/window-CkUOP7t0.js +1 -0
  280. package/out/web/assets/workspaces-SYPrmbgC.js +1 -0
  281. package/out/web/assets/{xychartDiagram-S5SC5T6Z-IZIXf3Vo.js → xychartDiagram-S5SC5T6Z-BVM9bKis.js} +4 -4
  282. package/out/web/index-web.html +4 -4
  283. package/out/web/index.html +4 -4
  284. package/out/web/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  285. package/out/web/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  286. package/out/web/pdfjs/cmaps/78-H.bcmap +0 -0
  287. package/out/web/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  288. package/out/web/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  289. package/out/web/pdfjs/cmaps/78-V.bcmap +0 -0
  290. package/out/web/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  291. package/out/web/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  292. package/out/web/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  293. package/out/web/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  294. package/out/web/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  295. package/out/web/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  296. package/out/web/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  297. package/out/web/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  298. package/out/web/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  299. package/out/web/pdfjs/cmaps/Add-H.bcmap +0 -0
  300. package/out/web/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  301. package/out/web/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  302. package/out/web/pdfjs/cmaps/Add-V.bcmap +0 -0
  303. package/out/web/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  304. package/out/web/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  305. package/out/web/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  306. package/out/web/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  307. package/out/web/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  308. package/out/web/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  309. package/out/web/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  310. package/out/web/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  311. package/out/web/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  312. package/out/web/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  313. package/out/web/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  314. package/out/web/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  315. package/out/web/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  316. package/out/web/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  317. package/out/web/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  318. package/out/web/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  319. package/out/web/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  320. package/out/web/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  321. package/out/web/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  322. package/out/web/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  323. package/out/web/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  324. package/out/web/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  325. package/out/web/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  326. package/out/web/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  327. package/out/web/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  328. package/out/web/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  329. package/out/web/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  330. package/out/web/pdfjs/cmaps/B5-H.bcmap +0 -0
  331. package/out/web/pdfjs/cmaps/B5-V.bcmap +0 -0
  332. package/out/web/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  333. package/out/web/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  334. package/out/web/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  335. package/out/web/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  336. package/out/web/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  337. package/out/web/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  338. package/out/web/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  339. package/out/web/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  340. package/out/web/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  341. package/out/web/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  342. package/out/web/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  343. package/out/web/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  344. package/out/web/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  345. package/out/web/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  346. package/out/web/pdfjs/cmaps/EUC-H.bcmap +0 -0
  347. package/out/web/pdfjs/cmaps/EUC-V.bcmap +0 -0
  348. package/out/web/pdfjs/cmaps/Ext-H.bcmap +0 -0
  349. package/out/web/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  350. package/out/web/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  351. package/out/web/pdfjs/cmaps/Ext-V.bcmap +0 -0
  352. package/out/web/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  353. package/out/web/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  354. package/out/web/pdfjs/cmaps/GB-H.bcmap +4 -0
  355. package/out/web/pdfjs/cmaps/GB-V.bcmap +0 -0
  356. package/out/web/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  357. package/out/web/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  358. package/out/web/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  359. package/out/web/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  360. package/out/web/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  361. package/out/web/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  362. package/out/web/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  363. package/out/web/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  364. package/out/web/pdfjs/cmaps/GBT-H.bcmap +0 -0
  365. package/out/web/pdfjs/cmaps/GBT-V.bcmap +0 -0
  366. package/out/web/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  367. package/out/web/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  368. package/out/web/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  369. package/out/web/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  370. package/out/web/pdfjs/cmaps/H.bcmap +0 -0
  371. package/out/web/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  372. package/out/web/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  373. package/out/web/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  374. package/out/web/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  375. package/out/web/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  376. package/out/web/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  377. package/out/web/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  378. package/out/web/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  379. package/out/web/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  380. package/out/web/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  381. package/out/web/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  382. package/out/web/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  383. package/out/web/pdfjs/cmaps/Hankaku.bcmap +0 -0
  384. package/out/web/pdfjs/cmaps/Hiragana.bcmap +0 -0
  385. package/out/web/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  386. package/out/web/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  387. package/out/web/pdfjs/cmaps/KSC-H.bcmap +0 -0
  388. package/out/web/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  389. package/out/web/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  390. package/out/web/pdfjs/cmaps/KSC-V.bcmap +0 -0
  391. package/out/web/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  392. package/out/web/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  393. package/out/web/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  394. package/out/web/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  395. package/out/web/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  396. package/out/web/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  397. package/out/web/pdfjs/cmaps/Katakana.bcmap +0 -0
  398. package/out/web/pdfjs/cmaps/LICENSE +36 -0
  399. package/out/web/pdfjs/cmaps/NWP-H.bcmap +0 -0
  400. package/out/web/pdfjs/cmaps/NWP-V.bcmap +0 -0
  401. package/out/web/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  402. package/out/web/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  403. package/out/web/pdfjs/cmaps/Roman.bcmap +0 -0
  404. package/out/web/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  405. package/out/web/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  406. package/out/web/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  407. package/out/web/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  408. package/out/web/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  409. package/out/web/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  410. package/out/web/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  411. package/out/web/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  412. package/out/web/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  413. package/out/web/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  414. package/out/web/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  415. package/out/web/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  416. package/out/web/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  417. package/out/web/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  418. package/out/web/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  419. package/out/web/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  420. package/out/web/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  421. package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  422. package/out/web/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  423. package/out/web/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  424. package/out/web/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  425. package/out/web/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  426. package/out/web/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  427. package/out/web/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  428. package/out/web/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  429. package/out/web/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  430. package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  431. package/out/web/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  432. package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  433. package/out/web/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  434. package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  435. package/out/web/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  436. package/out/web/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  437. package/out/web/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  438. package/out/web/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  439. package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  440. package/out/web/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  441. package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  442. package/out/web/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  443. package/out/web/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  444. package/out/web/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  445. package/out/web/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  446. package/out/web/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  447. package/out/web/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  448. package/out/web/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  449. package/out/web/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  450. package/out/web/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  451. package/out/web/pdfjs/cmaps/V.bcmap +0 -0
  452. package/out/web/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  453. package/out/web/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  454. package/out/web/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  455. package/out/web/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  456. package/out/web/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  457. package/out/web/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  458. package/out/web/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  459. package/out/web/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  460. package/out/web/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  461. package/out/web/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  462. package/out/web/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  463. package/out/web/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  464. package/out/web/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
  465. package/out/web/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  466. package/out/web/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  467. package/out/web/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  468. package/out/web/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  469. package/out/web/pdfjs/wasm/LICENSE_JBIG2 +196 -0
  470. package/out/web/pdfjs/wasm/LICENSE_OPENJPEG +39 -0
  471. package/out/web/pdfjs/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  472. package/out/web/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  473. package/out/web/pdfjs/wasm/LICENSE_PDFJS_QCMS +19 -0
  474. package/out/web/pdfjs/wasm/LICENSE_QCMS +21 -0
  475. package/out/web/pdfjs/wasm/jbig2.wasm +0 -0
  476. package/out/web/pdfjs/wasm/jbig2_nowasm_fallback.js +15 -0
  477. package/out/web/pdfjs/wasm/openjpeg.wasm +0 -0
  478. package/out/web/pdfjs/wasm/openjpeg_nowasm_fallback.js +17 -0
  479. package/out/web/pdfjs/wasm/qcms_bg.wasm +0 -0
  480. package/out/web/pdfjs/wasm/quickjs-eval.js +16 -0
  481. package/out/web/pdfjs/wasm/quickjs-eval.wasm +0 -0
  482. package/package.json +6 -4
  483. package/shared-modules/CODEOWNERS +3 -3
  484. package/shared-modules/SDL2/SDL2_mixer.json +27 -0
  485. package/shared-modules/appstream/README.md +13 -0
  486. package/shared-modules/appstream/appstream-compose.json +111 -0
  487. package/shared-modules/dbus-glib/dbus-glib.json +2 -2
  488. package/shared-modules/libportal/libportal.json +23 -0
  489. package/shared-modules/linux-audio/fluidsynth2-static.json +2 -2
  490. package/shared-modules/linux-audio/fluidsynth2.json +2 -2
  491. package/shared-modules/linux-audio/libinstpatch.json +2 -2
  492. package/shared-modules/linux-audio/liblo-static.json +3 -0
  493. package/shared-modules/luajit/luajit.json +2 -2
  494. package/shared-modules/squashfs-tools/squashfs-tools.json +0 -3
  495. package/slash-commands.json +14 -3
  496. package/src/bin/index.js +4 -1
  497. package/src/bin/pdfjs-assets.mjs +31 -0
  498. package/src/renderer/node_modules/.vite/vitest/CACHEDIR.TAG +3 -0
  499. package/src/renderer/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  500. package/src/renderer/shared/agentProgress.ts +62 -5
  501. package/src/renderer/shared/components/Settings/AgentsTab.tsx +70 -6
  502. package/src/renderer/shared/components/Settings/AudioTab.tsx +1 -1
  503. package/src/renderer/shared/components/Settings/AutomationTab.tsx +32 -29
  504. package/src/renderer/shared/components/Settings/AvatarCropModal.tsx +32 -12
  505. package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.test.tsx +65 -0
  506. package/src/renderer/shared/components/Settings/CustomProviderLogoPicker.tsx +456 -0
  507. package/src/renderer/shared/components/Settings/GeneralTab.tsx +65 -94
  508. package/src/renderer/shared/components/Settings/PluginsTab.tsx +101 -24
  509. package/src/renderer/shared/components/Settings/ProfileTab.tsx +1 -1
  510. package/src/renderer/shared/components/Settings/SettingsWindow.tsx +796 -0
  511. package/src/renderer/shared/components/Settings/ThemeTab.test.tsx +45 -0
  512. package/src/renderer/shared/components/Settings/ThemeTab.tsx +119 -4
  513. package/src/renderer/shared/components/activity/AgentActivityDrawer.tsx +270 -0
  514. package/src/renderer/shared/components/activity/AgentActivityTable.tsx +582 -0
  515. package/src/renderer/shared/components/activity/AskUserActivityCard.test.tsx +122 -0
  516. package/src/renderer/shared/components/activity/AskUserActivityCard.tsx +70 -0
  517. package/src/renderer/shared/components/{McpToolResults.tsx → activity/McpToolResults.tsx} +69 -13
  518. package/src/renderer/shared/components/{PlanChecklistWidget.tsx → activity/PlanChecklistWidget.tsx} +2 -2
  519. package/src/renderer/shared/components/activity/RunSummaryDashboard.test.tsx +127 -0
  520. package/src/renderer/shared/components/activity/RunSummaryDashboard.tsx +222 -0
  521. package/src/renderer/shared/components/activity/SubagentDagView.test.ts +123 -0
  522. package/src/renderer/shared/components/{SubagentDagView.tsx → activity/SubagentDagView.tsx} +104 -50
  523. package/src/renderer/shared/components/activity/SubagentStatusStrip.test.tsx +82 -0
  524. package/src/renderer/shared/components/activity/SubagentStatusStrip.tsx +107 -0
  525. package/src/renderer/shared/components/activity/ViewedImages.tsx +179 -0
  526. package/src/renderer/shared/components/{AuthGate.tsx → app/AuthGate.tsx} +3 -3
  527. package/src/renderer/shared/components/{ChunkErrorBoundary.tsx → app/ChunkErrorBoundary.tsx} +13 -13
  528. package/src/renderer/shared/components/{CommandPalette.tsx → app/CommandPalette.tsx} +30 -30
  529. package/src/renderer/shared/components/{DashboardSidebar.tsx → app/DashboardSidebar.tsx} +7 -5
  530. package/src/renderer/shared/components/{DesktopTitlebar.tsx → app/DesktopTitlebar.tsx} +9 -26
  531. package/src/renderer/shared/components/{ErrorNotice.tsx → app/ErrorNotice.tsx} +1 -1
  532. package/src/renderer/shared/components/{MintDashboard.tsx → app/MintDashboard.tsx} +217 -228
  533. package/src/renderer/shared/components/{ModalErrorBoundary.tsx → app/ModalErrorBoundary.tsx} +8 -8
  534. package/src/renderer/shared/components/{CalculationCard.tsx → cards/CalculationCard.tsx} +16 -30
  535. package/src/renderer/shared/components/{ImageGenCard.tsx → cards/ImageGenCard.tsx} +11 -24
  536. package/src/renderer/shared/components/{ImageSearchCard.tsx → cards/ImageSearchCard.tsx} +11 -24
  537. package/src/renderer/shared/components/{MermaidCard.tsx → cards/MermaidCard.tsx} +38 -22
  538. package/src/renderer/shared/components/cards/PlanCard.test.tsx +41 -0
  539. package/src/renderer/shared/components/cards/PlanCard.tsx +32 -0
  540. package/src/renderer/shared/components/cards/ReleaseNotesCard.test.tsx +29 -0
  541. package/src/renderer/shared/components/cards/ReleaseNotesCard.tsx +137 -0
  542. package/src/renderer/shared/components/{StockCard.tsx → cards/StockCard.tsx} +22 -38
  543. package/src/renderer/shared/components/cards/ToolResultCards.tsx +94 -0
  544. package/src/renderer/shared/components/{UiFeatureCard.tsx → cards/UiFeatureCard.tsx} +6 -6
  545. package/src/renderer/shared/components/{UiGridCard.tsx → cards/UiGridCard.tsx} +3 -3
  546. package/src/renderer/shared/components/{UiMockupWidget.tsx → cards/UiMockupWidget.tsx} +4 -4
  547. package/src/renderer/shared/components/{WeatherCard.tsx → cards/WeatherCard.tsx} +6 -6
  548. package/src/renderer/shared/components/{ApprovalCard.test.tsx → chat/ApprovalCard.test.tsx} +12 -1
  549. package/src/renderer/shared/components/{ApprovalCard.tsx → chat/ApprovalCard.tsx} +26 -7
  550. package/src/renderer/shared/components/chat/ArtifactCards.test.tsx +69 -0
  551. package/src/renderer/shared/components/chat/ArtifactCards.tsx +238 -0
  552. package/src/renderer/shared/components/chat/AttachedDocumentCard.test.tsx +39 -0
  553. package/src/renderer/shared/components/chat/AttachedDocumentCard.tsx +220 -0
  554. package/src/renderer/shared/components/chat/ChatCodeBlock.test.tsx +33 -0
  555. package/src/renderer/shared/components/{ChatCodeBlock.tsx → chat/ChatCodeBlock.tsx} +16 -2
  556. package/src/renderer/shared/components/chat/ChatMessageItem.test.tsx +183 -0
  557. package/src/renderer/shared/components/chat/ChatMessageItem.tsx +388 -0
  558. package/src/renderer/shared/components/chat/ChatModeSelector.css +227 -0
  559. package/src/renderer/shared/components/chat/ChatModeSelector.test.tsx +45 -0
  560. package/src/renderer/shared/components/chat/ChatModeSelector.tsx +198 -0
  561. package/src/renderer/shared/components/chat/ChatPanel.test.tsx +53 -0
  562. package/src/renderer/shared/components/{ChatPanel.tsx → chat/ChatPanel.tsx} +462 -537
  563. package/src/renderer/shared/components/{CollapsiblePasteInput.tsx → chat/CollapsiblePasteInput.tsx} +2 -2
  564. package/src/renderer/shared/components/{DiffReviewModal.tsx → chat/DiffReviewModal.tsx} +44 -44
  565. package/src/renderer/shared/components/chat/GeminiLiveOverlay.test.tsx +165 -0
  566. package/src/renderer/shared/components/{GeminiLiveOverlay.tsx → chat/GeminiLiveOverlay.tsx} +47 -5
  567. package/src/renderer/shared/components/{ModelSelectorPopover.tsx → chat/ModelSelectorPopover.tsx} +44 -16
  568. package/src/renderer/shared/components/chat/QueuedMessagesBanner.test.tsx +89 -0
  569. package/src/renderer/shared/components/chat/QueuedMessagesBanner.tsx +201 -0
  570. package/src/renderer/shared/components/{RewindModal.tsx → chat/RewindModal.tsx} +14 -14
  571. package/src/renderer/shared/components/{SlashChoicePanel.tsx → chat/SlashChoicePanel.tsx} +2 -2
  572. package/src/renderer/shared/components/{SlashSuggestions.test.tsx → chat/SlashSuggestions.test.tsx} +14 -0
  573. package/src/renderer/shared/components/{SlashSuggestions.tsx → chat/SlashSuggestions.tsx} +4 -4
  574. package/src/renderer/shared/components/chat/SourcesBlock.test.tsx +53 -0
  575. package/src/renderer/shared/components/{SourcesBlock.tsx → chat/SourcesBlock.tsx} +262 -123
  576. package/src/renderer/shared/components/{ThinkingBlock.tsx → chat/ThinkingBlock.tsx} +1 -1
  577. package/src/renderer/shared/components/chat/TurnFileChanges.test.tsx +130 -0
  578. package/src/renderer/shared/components/chat/TurnFileChanges.tsx +463 -0
  579. package/src/renderer/shared/components/{VoicePill.css → chat/VoicePill.css} +1 -1
  580. package/src/renderer/shared/components/{VoicePill.jsx → chat/VoicePill.jsx} +3 -2
  581. package/src/renderer/shared/components/{CliSessionsView.test.tsx → extensions/CliSessionsView.test.tsx} +2 -2
  582. package/src/renderer/shared/components/{CliSessionsView.tsx → extensions/CliSessionsView.tsx} +19 -16
  583. package/src/renderer/shared/components/{LinkedFoldersView.tsx → extensions/LinkedFoldersView.tsx} +3 -3
  584. package/src/renderer/shared/components/{McpRegistryPicker.tsx → extensions/McpRegistryPicker.tsx} +6 -6
  585. package/src/renderer/shared/components/{McpServersView.tsx → extensions/McpServersView.tsx} +105 -36
  586. package/src/renderer/shared/components/{McpToolAllowlist.tsx → extensions/McpToolAllowlist.tsx} +2 -2
  587. package/src/renderer/shared/components/{ModUi.test.tsx → extensions/ModUi.test.tsx} +9 -4
  588. package/src/renderer/shared/components/{ModsPanel.tsx → extensions/ModsPanel.tsx} +59 -7
  589. package/src/renderer/shared/components/{PluginsView.tsx → extensions/PluginsView.tsx} +6 -6
  590. package/src/renderer/shared/components/{ScheduledTasksView.tsx → extensions/ScheduledTasksView.tsx} +5 -5
  591. package/src/renderer/shared/components/extensions/SkillsView.test.tsx +31 -0
  592. package/src/renderer/shared/components/{SkillsView.tsx → extensions/SkillsView.tsx} +20 -4
  593. package/src/renderer/shared/components/{ImageStudioPanel.tsx → studio/ImageStudioPanel.tsx} +6 -6
  594. package/src/renderer/shared/components/{LibraryItemCard.tsx → studio/LibraryItemCard.tsx} +2 -2
  595. package/src/renderer/shared/components/{LibraryPage.tsx → studio/LibraryPage.tsx} +53 -10
  596. package/src/renderer/shared/components/{LibraryPreview.tsx → studio/LibraryPreview.tsx} +2 -2
  597. package/src/renderer/shared/components/{VeoStudioPanel.tsx → studio/VeoStudioPanel.tsx} +7 -7
  598. package/src/renderer/shared/components/{GlideSelect.css → ui/GlideSelect.css} +7 -6
  599. package/src/renderer/shared/components/ui/ProviderBrandIcon.test.tsx +67 -0
  600. package/src/renderer/shared/components/ui/ProviderBrandIcon.tsx +167 -0
  601. package/src/renderer/shared/components/ui/SelectField.tsx +506 -0
  602. package/src/renderer/shared/components/ui/error-recovery.css +10 -10
  603. package/src/renderer/shared/components/ui/error-recovery.tsx +1 -1
  604. package/src/renderer/shared/components/{ArtifactPreviewPanel.tsx → workspace/ArtifactPreviewPanel.tsx} +374 -118
  605. package/src/renderer/shared/components/workspace/BackgroundTerminals.test.tsx +63 -0
  606. package/src/renderer/shared/components/{BackgroundTerminals.tsx → workspace/BackgroundTerminals.tsx} +40 -9
  607. package/src/renderer/shared/components/workspace/CodeReviewPage.test.tsx +50 -0
  608. package/src/renderer/shared/components/{CodeReviewPage.tsx → workspace/CodeReviewPage.tsx} +124 -24
  609. package/src/renderer/shared/components/{GitBranchSelector.tsx → workspace/GitBranchSelector.tsx} +80 -24
  610. package/src/renderer/shared/components/workspace/SessionSources.tsx +113 -0
  611. package/src/renderer/shared/components/{TerminalDock.tsx → workspace/TerminalDock.tsx} +5 -2
  612. package/src/renderer/shared/components/workspace/ToolSurfacePage.test.tsx +81 -0
  613. package/src/renderer/shared/components/{ToolSurfacePage.tsx → workspace/ToolSurfacePage.tsx} +361 -90
  614. package/src/renderer/shared/components/{ToolsPanelToggle.tsx → workspace/ToolsPanelToggle.tsx} +1 -1
  615. package/src/renderer/shared/components/workspace/WorkspaceFileInfo.tsx +28 -0
  616. package/src/renderer/shared/components/workspace/WorkspaceMediaPreview.tsx +17 -0
  617. package/src/renderer/shared/components/{WorkspacePaneResizer.tsx → workspace/WorkspacePaneResizer.tsx} +1 -1
  618. package/src/renderer/shared/components/workspace/WorkspacePdfPreview.tsx +308 -0
  619. package/src/renderer/shared/components/workspace/WorkspacePreviewActions.test.tsx +101 -0
  620. package/src/renderer/shared/components/{WorkspacePreviewActions.tsx → workspace/WorkspacePreviewActions.tsx} +3 -3
  621. package/src/renderer/shared/components/{WorkspaceSelector.tsx → workspace/WorkspaceSelector.tsx} +99 -7
  622. package/src/renderer/shared/components/{background-terminals.css → workspace/background-terminals.css} +11 -11
  623. package/src/renderer/shared/components/{workspace-selector.css → workspace/workspace-selector.css} +84 -2
  624. package/src/renderer/shared/constants/config.ts +6 -3
  625. package/src/renderer/shared/constants/models.test.ts +51 -0
  626. package/src/renderer/shared/constants/models.ts +139 -32
  627. package/src/renderer/shared/conversation/coordinator.test.ts +46 -0
  628. package/src/renderer/shared/conversation/coordinator.ts +50 -2
  629. package/src/renderer/shared/conversation/lifecycle.test.ts +254 -4
  630. package/src/renderer/shared/conversation/lifecycle.ts +268 -12
  631. package/src/renderer/shared/conversation/progressiveStream.test.ts +83 -0
  632. package/src/renderer/shared/conversation/progressiveStream.ts +219 -0
  633. package/src/renderer/shared/conversation/projectNavigation.test.ts +18 -0
  634. package/src/renderer/shared/conversation/projectNavigation.ts +11 -0
  635. package/src/renderer/shared/conversation/transport.test.ts +20 -0
  636. package/src/renderer/shared/conversation/transport.ts +51 -9
  637. package/src/renderer/shared/conversation/useConversationCoordinator.ts +42 -12
  638. package/src/renderer/shared/css/agent-observability.css +205 -11
  639. package/src/renderer/shared/css/chat-ui-cards.css +48 -48
  640. package/src/renderer/shared/css/code-review.css +139 -110
  641. package/src/renderer/shared/css/code-sessions.css +56 -27
  642. package/src/renderer/shared/css/collapsed-paste.css +1 -1
  643. package/src/renderer/shared/css/error-notice.css +1 -1
  644. package/src/renderer/shared/css/file-changes.css +298 -51
  645. package/src/renderer/shared/css/library.css +105 -10
  646. package/src/renderer/shared/css/management-views.css +79 -38
  647. package/src/renderer/shared/css/mcp-results.css +48 -5
  648. package/src/renderer/shared/css/model-selector.css +18 -18
  649. package/src/renderer/shared/css/mods.css +7 -7
  650. package/src/renderer/shared/css/notification-notice.css +2 -2
  651. package/src/renderer/shared/css/queued-messages.css +221 -0
  652. package/src/renderer/shared/css/session-sources.css +12 -7
  653. package/src/renderer/shared/css/settings/agents.css +2 -2
  654. package/src/renderer/{src → shared}/css/settings/base.css +101 -107
  655. package/src/renderer/shared/css/settings/general.css +397 -100
  656. package/src/renderer/shared/css/settings/plugins.css +8 -8
  657. package/src/renderer/shared/css/settings/profile.css +5 -5
  658. package/src/renderer/shared/css/settings/theme.css +49 -37
  659. package/src/renderer/shared/css/slash-choice.css +2 -2
  660. package/src/renderer/shared/css/slash-suggestions.css +3 -3
  661. package/src/renderer/shared/css/sources-block.css +41 -2
  662. package/src/renderer/shared/css/tools-panel.css +2 -2
  663. package/src/renderer/shared/css/ui-tailwind.css +10 -2
  664. package/src/renderer/shared/css/veo-studio.css +2 -2
  665. package/src/renderer/shared/css/viewed-images.css +93 -4
  666. package/src/renderer/shared/css/workspace-file-info.css +12 -0
  667. package/src/renderer/shared/css/workspace-media-preview.css +13 -0
  668. package/src/renderer/shared/env.d.ts +9 -0
  669. package/src/renderer/shared/platform.test.ts +143 -0
  670. package/src/renderer/shared/platform.ts +12 -5
  671. package/src/renderer/shared/speech/player.ts +160 -0
  672. package/src/renderer/shared/speech/types.ts +11 -0
  673. package/src/renderer/shared/theme/themeManager.test.ts +37 -0
  674. package/src/renderer/shared/theme/themeManager.ts +24 -5
  675. package/src/renderer/shared/theme/themes.ts +71 -4
  676. package/src/renderer/shared/theme/tokens.css +452 -53
  677. package/src/renderer/shared/types.ts +57 -2
  678. package/src/renderer/shared/utils/agentActivity.test.ts +633 -8
  679. package/src/renderer/shared/utils/agentActivity.ts +776 -59
  680. package/src/renderer/shared/utils/artifactBrowser.test.ts +37 -32
  681. package/src/renderer/shared/utils/artifactBrowser.ts +18 -20
  682. package/src/renderer/shared/utils/artifacts.ts +55 -0
  683. package/src/renderer/shared/utils/attachedDocument.test.ts +73 -0
  684. package/src/renderer/shared/utils/attachedDocument.ts +49 -0
  685. package/src/renderer/shared/utils/contextCompaction.test.tsx +1 -1
  686. package/src/renderer/shared/utils/externalLinks.ts +91 -0
  687. package/src/renderer/shared/utils/fileIcons.test.ts +59 -0
  688. package/src/renderer/shared/utils/fileIcons.ts +149 -16
  689. package/src/renderer/shared/utils/lazyWithRetry.ts +13 -0
  690. package/src/renderer/shared/utils/markdown.tsx +238 -51
  691. package/src/renderer/shared/utils/markdown.webImages.test.tsx +140 -2
  692. package/src/renderer/shared/utils/mcpResults.test.tsx +53 -1
  693. package/src/renderer/shared/utils/pdfRange.ts +16 -0
  694. package/src/renderer/shared/utils/previewObjectUrls.ts +20 -0
  695. package/src/renderer/shared/utils/sessionSources.test.ts +41 -1
  696. package/src/renderer/shared/utils/sessionSources.ts +2 -0
  697. package/src/renderer/shared/utils/slashCommandProcessor.ts +7 -1
  698. package/src/renderer/shared/utils/speech.ts +18 -4
  699. package/src/renderer/shared/utils/syntaxHighlight.test.tsx +11 -1
  700. package/src/renderer/shared/utils/syntaxHighlight.tsx +51 -3
  701. package/src/renderer/shared/utils/useGeminiLiveVoice.ts +324 -51
  702. package/src/renderer/shared/utils/useNativeVoiceInput.ts +19 -5
  703. package/src/renderer/shared/utils/useSessionSources.ts +4 -0
  704. package/src/renderer/shared/utils/viewedImages.test.ts +129 -0
  705. package/src/renderer/shared/utils/viewedImages.ts +81 -10
  706. package/src/renderer/shared/utils/workspaceDrag.test.ts +153 -0
  707. package/src/renderer/shared/utils/workspaceDrag.ts +172 -0
  708. package/src/renderer/shared/utils/workspaceImage.ts +17 -0
  709. package/src/renderer/shared/utils/workspaceListPreferences.test.ts +64 -0
  710. package/src/renderer/shared/utils/workspaceListPreferences.ts +54 -0
  711. package/src/renderer/shared/utils/workspaceMedia.ts +49 -0
  712. package/src/renderer/shared/utils/workspacePreview.test.ts +147 -2
  713. package/src/renderer/shared/utils/workspacePreview.ts +34 -3
  714. package/src/renderer/shared/utils/workspaces.ts +3 -2
  715. package/src/renderer/src/App.tsx +20 -16
  716. package/src/renderer/src/agentProgress.ts +1 -0
  717. package/src/renderer/src/components/ChatPanel.tsx +1 -1
  718. package/src/renderer/src/components/DashboardSidebar.tsx +2 -2
  719. package/src/renderer/src/components/ImageStudioPanel.tsx +1 -1
  720. package/src/renderer/src/components/LiveTranslateControls.tsx +1 -1
  721. package/src/renderer/src/components/MintDashboard.tsx +1 -1
  722. package/src/renderer/src/components/ProactiveGlow.tsx +1 -1
  723. package/src/renderer/src/components/ScreenPicker.css +1 -1
  724. package/src/renderer/src/components/ScreenPicker.tsx +1 -1
  725. package/src/renderer/src/components/SettingsWindow.tsx +6 -830
  726. package/src/renderer/src/components/SpotlightWindow.tsx +4 -32
  727. package/src/renderer/src/components/VeoStudioPanel.tsx +1 -1
  728. package/src/renderer/src/components/WorkspacePanel.tsx +49 -15
  729. package/src/renderer/src/components/browser-suggestions-popup.css +8 -8
  730. package/src/renderer/src/css/app-shell.css +26 -106
  731. package/src/renderer/src/css/chat.css +1499 -292
  732. package/src/renderer/src/css/desktop-tools.css +17 -348
  733. package/src/renderer/src/css/sidebar-workspace.css +22 -2
  734. package/src/renderer/src/css/spotlight.css +2 -2
  735. package/src/renderer/src/css/tool-surfaces.css +335 -65
  736. package/src/renderer/src/css/widget.css +6 -5
  737. package/src/renderer/src/env.d.ts +13 -0
  738. package/src/renderer/src/index.css +53 -83
  739. package/src/renderer/src/tauri.ts +99 -13
  740. package/src/renderer/src/voiceInput.ts +3 -1
  741. package/src/renderer/src-web/App.tsx +20 -8
  742. package/src/renderer/src-web/agentProgress.ts +1 -0
  743. package/src/renderer/src-web/components/ChatPanel.tsx +1 -1
  744. package/src/renderer/src-web/components/DashboardSidebar.tsx +2 -2
  745. package/src/renderer/src-web/components/ImageStudioPanel.tsx +1 -1
  746. package/src/renderer/src-web/components/MintDashboard.tsx +1 -1
  747. package/src/renderer/src-web/components/SettingsWindow.tsx +6 -851
  748. package/src/renderer/src-web/components/VeoStudioPanel.tsx +1 -1
  749. package/src/renderer/src-web/css/app-shell.css +20 -104
  750. package/src/renderer/src-web/css/chat.css +1536 -261
  751. package/src/renderer/src-web/css/mobile.css +29 -13
  752. package/src/renderer/src-web/css/settings/mobile.css +2 -2
  753. package/src/renderer/src-web/css/sidebar-workspace.css +21 -1
  754. package/src/renderer/src-web/env.d.ts +14 -0
  755. package/src/renderer/src-web/index.css +53 -83
  756. package/src/renderer/src-web/tauri.ts +93 -15
  757. package/src/renderer/tests/browserArtifacts.browser.html +1 -0
  758. package/src/renderer/tests/browserArtifacts.browser.tsx +68 -0
  759. package/src/renderer/tests/chatEscape.browser.html +1 -0
  760. package/src/renderer/tests/chatEscape.browser.tsx +25 -0
  761. package/src/renderer/tests/chatPerformance.browser.html +1 -1
  762. package/src/renderer/tests/collapsedPaste.browser.html +1 -1
  763. package/src/renderer/tests/composerMenus.browser.html +3 -3
  764. package/src/renderer/tests/contextCompaction.browser.html +1 -1
  765. package/src/renderer/tests/errorRecovery.browser.html +1 -1
  766. package/src/renderer/tests/fixtures/preview.webm +0 -0
  767. package/src/renderer/tests/glideSelect.browser.html +1 -2
  768. package/src/renderer/tests/glideSelect.preview.html +1 -1
  769. package/src/renderer/tests/library.browser.tsx +4 -1
  770. package/src/renderer/tests/liveOrb.browser.html +1 -1
  771. package/src/renderer/tests/liveVoice.browser.html +1 -0
  772. package/src/renderer/tests/mediaFixtures.ts +32 -0
  773. package/src/renderer/tests/modInput.browser.html +1 -1
  774. package/src/renderer/tests/sessionSources.browser.tsx +76 -15
  775. package/src/renderer/tests/toolsPanel.browser.tsx +5 -5
  776. package/src/renderer/tests/viewedImages.browser.tsx +3 -3
  777. package/src/renderer/tests/voiceDictation.browser.html +101 -0
  778. package/src/renderer/tests/voicePill.browser.html +3 -3
  779. package/src/renderer/tests/voicePill.preview.html +1 -1
  780. package/src/renderer/tests/webSources.browser.tsx +2 -98
  781. package/src/renderer/tests/workspaceDrop.browser.html +1 -0
  782. package/src/renderer/tests/workspaceDrop.browser.tsx +183 -0
  783. package/src/renderer/tests/workspaceExpansion.browser.html +1 -0
  784. package/src/renderer/tests/workspaceExpansion.browser.tsx +66 -0
  785. package/src/renderer/tests/workspaceRemoval.browser.html +66 -0
  786. package/src/renderer/tests/workspaceUndo.browser.html +10 -2
  787. package/src-tauri/src/app/lifecycle.rs +45 -15
  788. package/src-tauri/src/background/headless.rs +14 -8
  789. package/src-tauri/src/commands/conversation.rs +137 -73
  790. package/src-tauri/src/commands/integrations.rs +7 -1
  791. package/src-tauri/src/commands/media.rs +7 -0
  792. package/src-tauri/src/commands/workspace.rs +38 -0
  793. package/src-tauri/src/native/mod.rs +0 -1
  794. package/src-tauri/src/native/system.rs +4 -47
  795. package/tsconfig.json +15 -1
  796. package/vite.config.ts +2 -1
  797. package/vite.config.web.ts +2 -0
  798. package/crates/mint-cli/src/interactive/chat_tui.rs +0 -7853
  799. package/crates/mint-core/src/agent/chat.rs +0 -4155
  800. package/crates/mint-core/src/browser/lifecycle.rs +0 -191
  801. package/crates/mint-core/src/browser/logging.rs +0 -20
  802. package/crates/mint-core/src/orchestration/tools/browser.rs +0 -31
  803. package/out/web/assets/CliSessionsView-CtzUJpK_.css +0 -1
  804. package/out/web/assets/CliSessionsView-D7hw0Mgj.js +0 -1
  805. package/out/web/assets/CodeReviewPage-C7bEOJfd.js +0 -4
  806. package/out/web/assets/CodeReviewPage-Dte9uLiL.css +0 -1
  807. package/out/web/assets/CommandPalette-0RrF-AOT.js +0 -1
  808. package/out/web/assets/ImageStudioPanel-CdxkAf_r.js +0 -1
  809. package/out/web/assets/LibraryPage--Qfisp6D.js +0 -2
  810. package/out/web/assets/LibraryPage-DAxUTAg7.css +0 -1
  811. package/out/web/assets/LinkedFoldersView-2nfZbDgN.js +0 -1
  812. package/out/web/assets/McpRegistryPicker-h9uS8_wT.js +0 -1
  813. package/out/web/assets/McpServersView-slfQJzNB.js +0 -1
  814. package/out/web/assets/MintDashboard-BSR5XpXh.js +0 -25
  815. package/out/web/assets/MintDashboard-CWUcCGhd.css +0 -1
  816. package/out/web/assets/PluginsView-l7LSm503.js +0 -1
  817. package/out/web/assets/ScheduledTasksView-CttmLbq1.js +0 -1
  818. package/out/web/assets/SettingsWindow-BCMLYvEV.js +0 -4
  819. package/out/web/assets/SettingsWindow-DcMVmU9u.css +0 -1
  820. package/out/web/assets/SkillsView-rNs1qr_U.js +0 -2
  821. package/out/web/assets/ToolSurfacePage-B9DzEPWN.js +0 -37
  822. package/out/web/assets/ToolSurfacePage-CTfgggF2.css +0 -1
  823. package/out/web/assets/VeoStudioPanel-DiJs_Cg2.js +0 -4
  824. package/out/web/assets/WorkspacePanel-CbJ1PFoZ.js +0 -1
  825. package/out/web/assets/WorkspaceSelector-B2xIp04D.js +0 -1
  826. package/out/web/assets/WorkspaceSelector-Ca8uJOsS.css +0 -1
  827. package/out/web/assets/abnfDiagram-VCTEODGH-CD0CjoGl.js +0 -1
  828. package/out/web/assets/architecture-7GRP2DOG-RKV83OeZ.js +0 -1
  829. package/out/web/assets/architectureDiagram-5GKGNRK7-nN_HAFct.js +0 -36
  830. package/out/web/assets/c4Diagram-UCG6FXSJ-DTdV8_zE.js +0 -38
  831. package/out/web/assets/chunk-2Q5K7J3B-Dmqrq8Tp.js +0 -1
  832. package/out/web/assets/chunk-75Z2AOVW-_M0z5olV.js +0 -2
  833. package/out/web/assets/chunk-CKBBP62Z-BpQEgeHF.js +0 -2
  834. package/out/web/assets/chunk-CLGD4ZFX-D54yGvGS.js +0 -1
  835. package/out/web/assets/chunk-CacB07dV.js +0 -1
  836. package/out/web/assets/chunk-DSNCTWBM-C-gvT2ru.js +0 -2
  837. package/out/web/assets/chunk-DU6HZSFF-CnFngIhW.js +0 -128
  838. package/out/web/assets/chunk-F27PBJKO-BqtWrnEO.js +0 -1
  839. package/out/web/assets/chunk-FOHPRMQF-BaVC1uA7.js +0 -161
  840. package/out/web/assets/chunk-G27WJ6UU-Ckoq5mi2.js +0 -231
  841. package/out/web/assets/chunk-JQ64N6SF-CF8T7GiZ.js +0 -1
  842. package/out/web/assets/chunk-JWPE2WC7-BwtYOHqU.js +0 -1
  843. package/out/web/assets/chunk-LNGE3PJU-AdBoOWw2.js +0 -34
  844. package/out/web/assets/chunk-OBVCFTLP-CRIkunUB.js +0 -1
  845. package/out/web/assets/chunk-P2QGCYS3-UFEU6BxZ.js +0 -1
  846. package/out/web/assets/chunk-POPQ4Y6H-CQcrNbjr.js +0 -1
  847. package/out/web/assets/chunk-PWAF6VOD-Cc2uVDsG.js +0 -1
  848. package/out/web/assets/chunk-R7TYR2AO-DiCxzdAY.js +0 -10
  849. package/out/web/assets/chunk-RHFEMEQ7-b7hnPmrR.js +0 -168
  850. package/out/web/assets/chunk-XXDRQBXY-DnJkbUaw.js +0 -1
  851. package/out/web/assets/chunk-Y2CYZVJY-C9o-s6OY.js +0 -1
  852. package/out/web/assets/classDiagram-DTDB5LWJ-RnC2mYO4.js +0 -1
  853. package/out/web/assets/classDiagram-v2-JRS7N3AN-RnC2mYO4.js +0 -1
  854. package/out/web/assets/config-CnvCChUM.js +0 -2
  855. package/out/web/assets/config-DM6oIVO3.css +0 -1
  856. package/out/web/assets/core-DsKkQ7ig.js +0 -1
  857. package/out/web/assets/cose-bilkent-JH36ORCC--UN4aw5-.js +0 -1
  858. package/out/web/assets/cynefin-OW5HDTMX-CnzQfOGp.js +0 -1
  859. package/out/web/assets/cynefinDiagram-5FMLGOSQ-DVtQnfpm.js +0 -62
  860. package/out/web/assets/cytoscape.esm-Df1UN4Y1.js +0 -321
  861. package/out/web/assets/dagre-3AP2YEHR-DG76_k5_.js +0 -4
  862. package/out/web/assets/dagre-BWadQu2F.js +0 -1
  863. package/out/web/assets/diagram-S7CK7UJ4-CaouUoze.js +0 -30
  864. package/out/web/assets/diagram-UQ7AKVKN-B4bEc26B.js +0 -41
  865. package/out/web/assets/diagram-VX7I27RA-7hH5IPYf.js +0 -24
  866. package/out/web/assets/diagram-Z3DM3KII-CCM4clo8.js +0 -24
  867. package/out/web/assets/dist-BoTOASLF.js +0 -1
  868. package/out/web/assets/dist-js-BkYNznHX.js +0 -1
  869. package/out/web/assets/ebnfDiagram-PWID7BFC-Da7WAM3k.js +0 -1
  870. package/out/web/assets/event-Cdt7Byyj.js +0 -1
  871. package/out/web/assets/eventmodeling-NTZA5JFV-xcfsA0XD.js +0 -1
  872. package/out/web/assets/flowDiagram-A5DVABFB-JdtH1673.js +0 -1
  873. package/out/web/assets/ganttDiagram-EL5Y4UJY-B3ClFGmL.js +0 -292
  874. package/out/web/assets/gitGraph-4MIJSDKK-BZ_y_cDU.js +0 -1
  875. package/out/web/assets/gitGraphDiagram-WWUBYQGX-drhRSYm3.js +0 -106
  876. package/out/web/assets/graphlib-CTR5ZhLf.js +0 -1
  877. package/out/web/assets/index-BZ9xgmMP.css +0 -1
  878. package/out/web/assets/index-Ca8cCS4h.js +0 -168
  879. package/out/web/assets/info-A6RAGUB7-B7I3K0F1.js +0 -1
  880. package/out/web/assets/infoDiagram-RXCK75RN-deX_1MPh.js +0 -2
  881. package/out/web/assets/journeyDiagram-EYS64GPL-CZn2kB8b.js +0 -139
  882. package/out/web/assets/jsx-runtime-DN4NhQUK.js +0 -1
  883. package/out/web/assets/katex-O3jvqgnU.js +0 -257
  884. package/out/web/assets/markdown-CMhYIcWB.js +0 -39
  885. package/out/web/assets/mermaid-parser.core-Whu2rlJC.js +0 -7
  886. package/out/web/assets/mermaid.core-CKyPo8VH.js +0 -11
  887. package/out/web/assets/modelManager-CUaGWMWu.js +0 -2
  888. package/out/web/assets/oauthManager-DlNhXJr6.js +0 -1
  889. package/out/web/assets/packet-AYTQ26CC-CEeIRKRG.js +0 -1
  890. package/out/web/assets/pegDiagram-XKGWAZYB-BYadI-KO.js +0 -1
  891. package/out/web/assets/pie-WAS4IAKB-D8uf4dh5.js +0 -1
  892. package/out/web/assets/pieDiagram-E7YTZNPT-CjSDy4hO.js +0 -39
  893. package/out/web/assets/radar-RG4KPBEZ-DZJxnokY.js +0 -1
  894. package/out/web/assets/railroad-74A4TZTK-DBysUiUi.js +0 -1
  895. package/out/web/assets/railroad-abnf-HS5TGJTU-CHWxoJYg.js +0 -1
  896. package/out/web/assets/railroad-ebnf-LZEXJU2U-DDv7X6bY.js +0 -1
  897. package/out/web/assets/railroad-peg-WCYAUIDC-DpfcYYNJ.js +0 -1
  898. package/out/web/assets/railroadDiagram-O6MQD6OU-CYtyv0t3.js +0 -1
  899. package/out/web/assets/rough.esm-DFbTUy8a.js +0 -1
  900. package/out/web/assets/sankeyDiagram-P5KCCOFB-Bn2x6C4Y.js +0 -40
  901. package/out/web/assets/sequenceDiagram-WJ2MYXX4-BvFLKtPd.js +0 -162
  902. package/out/web/assets/sizeCapture-X5ZJPWSS-DKeOCaN2.js +0 -1
  903. package/out/web/assets/src-DnfeXQPr.js +0 -1
  904. package/out/web/assets/stateDiagram-HBIQ2CUA-Bx0GWeaY.js +0 -1
  905. package/out/web/assets/stateDiagram-v2-4QOOHH4V--hol1yg_.js +0 -1
  906. package/out/web/assets/studio-B1mk40wD.js +0 -1
  907. package/out/web/assets/swimlanes-XN3QIQJK-CCma0T7L.js +0 -1
  908. package/out/web/assets/swimlanesDiagram-VK2B7HYN-BkohoVsU.js +0 -8
  909. package/out/web/assets/timeline-definition-24CTP7MA-iCRhhJ7C.js +0 -120
  910. package/out/web/assets/treeView-Q6P3EWNA-DZ-y08qp.js +0 -1
  911. package/out/web/assets/treemap-WGGIJYW6-De0CxzMx.js +0 -1
  912. package/out/web/assets/vennDiagram-4TSXK5OY-w_7aZ6xe.js +0 -34
  913. package/out/web/assets/wardley-WFR3VGLG-DT0y0xJ4.js +0 -1
  914. package/out/web/assets/window-BJCVtyET.js +0 -1
  915. package/shared-modules/libsecret/libsecret.json +0 -23
  916. package/shared-modules/libusb/libusb.json +0 -27
  917. package/shared-modules/lzo/lzo.json +0 -27
  918. package/src/renderer/shared/components/AgentActivityDrawer.tsx +0 -204
  919. package/src/renderer/shared/components/AgentActivityTable.tsx +0 -301
  920. package/src/renderer/shared/components/ChatMessageItem.test.tsx +0 -68
  921. package/src/renderer/shared/components/ChatMessageItem.tsx +0 -326
  922. package/src/renderer/shared/components/ChatPanel.test.tsx +0 -21
  923. package/src/renderer/shared/components/FormattedMessage.tsx +0 -11
  924. package/src/renderer/shared/components/GeminiLiveOverlay.test.tsx +0 -24
  925. package/src/renderer/shared/components/GlideSelect.d.ts +0 -31
  926. package/src/renderer/shared/components/GlideSelect.jsx +0 -266
  927. package/src/renderer/shared/components/InlineThoughtNote.tsx +0 -27
  928. package/src/renderer/shared/components/ModSessionControls.tsx +0 -8
  929. package/src/renderer/shared/components/ModUi.tsx +0 -26
  930. package/src/renderer/shared/components/ProgressActivity.tsx +0 -17
  931. package/src/renderer/shared/components/ReviewHistory.tsx +0 -42
  932. package/src/renderer/shared/components/RunSummaryDashboard.tsx +0 -143
  933. package/src/renderer/shared/components/SelectField.tsx +0 -38
  934. package/src/renderer/shared/components/SessionSources.tsx +0 -48
  935. package/src/renderer/shared/components/SessionSourcesPopover.tsx +0 -61
  936. package/src/renderer/shared/components/ToolSurfacePage.test.tsx +0 -32
  937. package/src/renderer/shared/components/ViewedImages.tsx +0 -36
  938. package/src/renderer/shared/components/WorkspaceContextPopover.tsx +0 -138
  939. package/src/renderer/shared/components/WorkspacePreviewActions.test.tsx +0 -44
  940. package/src/renderer/shared/components/ui/demo.tsx +0 -26
  941. package/src/renderer/shared/css/session-sources-popover.css +0 -9
  942. package/src/renderer/src/components/BrowserShell.tsx +0 -108
  943. package/src/renderer/src/components/BrowserSuggestionsPopup.tsx +0 -91
  944. package/src/renderer/src/components/CalculationCard.tsx +0 -3
  945. package/src/renderer/src/components/ImageGenCard.tsx +0 -2
  946. package/src/renderer/src/components/ImageSearchCard.tsx +0 -2
  947. package/src/renderer/src/components/MermaidCard.tsx +0 -1
  948. package/src/renderer/src/components/PicturesLibrary.tsx +0 -2
  949. package/src/renderer/src/components/Settings/AgentsTab.tsx +0 -4
  950. package/src/renderer/src/components/Settings/AudioTab.tsx +0 -3
  951. package/src/renderer/src/components/Settings/AutomationTab.tsx +0 -3
  952. package/src/renderer/src/components/Settings/GeneralTab.tsx +0 -3
  953. package/src/renderer/src/components/Settings/MemoryTab.tsx +0 -3
  954. package/src/renderer/src/components/Settings/PluginsTab.tsx +0 -3
  955. package/src/renderer/src/components/Settings/ProfileTab.tsx +0 -3
  956. package/src/renderer/src/components/Settings/ShortcutsTab.tsx +0 -3
  957. package/src/renderer/src/components/Settings/ThemeTab.tsx +0 -3
  958. package/src/renderer/src/components/StockCard.tsx +0 -3
  959. package/src/renderer/src/components/WeatherCard.tsx +0 -3
  960. package/src/renderer/src/components/browser-shell.css +0 -185
  961. package/src/renderer/src/css/pictures.css +0 -2
  962. package/src/renderer/src-web/components/PicturesLibrary.tsx +0 -2
  963. package/src/renderer/src-web/components/Settings/AgentsTab.tsx +0 -4
  964. package/src/renderer/src-web/components/Settings/AudioTab.tsx +0 -3
  965. package/src/renderer/src-web/components/Settings/AutomationTab.tsx +0 -3
  966. package/src/renderer/src-web/components/Settings/GeneralTab.tsx +0 -3
  967. package/src/renderer/src-web/components/Settings/MemoryTab.tsx +0 -3
  968. package/src/renderer/src-web/components/Settings/PluginsTab.tsx +0 -3
  969. package/src/renderer/src-web/components/Settings/ProfileTab.tsx +0 -3
  970. package/src/renderer/src-web/components/Settings/ShortcutsTab.tsx +0 -3
  971. package/src/renderer/src-web/components/Settings/ThemeTab.tsx +0 -3
  972. package/src/renderer/src-web/css/pictures.css +0 -2
  973. package/src/renderer/src-web/css/settings/base.css +0 -1266
  974. package/src/renderer/src-web/css/spotlight.css +0 -102
  975. package/src/renderer/src-web/css/widget.css +0 -213
  976. package/src-tauri/src/native/browser.rs +0 -252
  977. /package/src/renderer/shared/components/{ContextCompactionStatus.tsx → chat/ContextCompactionStatus.tsx} +0 -0
  978. /package/src/renderer/shared/components/{GeminiLiveOverlay.css → chat/GeminiLiveOverlay.css} +0 -0
  979. /package/src/renderer/shared/components/{VirtualChatHistory.tsx → chat/VirtualChatHistory.tsx} +0 -0
  980. /package/src/renderer/shared/components/{VoicePill.d.ts → chat/VoicePill.d.ts} +0 -0
  981. /package/src/renderer/shared/components/{VoicePill.test.tsx → chat/VoicePill.test.tsx} +0 -0
  982. /package/src/renderer/shared/components/{ScreenCaptureDialog.css → studio/ScreenCaptureDialog.css} +0 -0
  983. /package/src/renderer/shared/components/{ScreenCaptureDialog.tsx → studio/ScreenCaptureDialog.tsx} +0 -0
  984. /package/src/renderer/shared/components/{SelectField.test.tsx → ui/SelectField.test.tsx} +0 -0
@@ -3,9 +3,14 @@
3
3
  * Agent activity parsing and transformation logic.
4
4
  * Shared by both Desktop and Web ChatPanel — do NOT duplicate this.
5
5
  */
6
- import type { AgentProgress } from '../types'
6
+ import type { AgentProgress, ActivePlan, RunTelemetrySummary } from '../types'
7
7
  import { isInternalCot } from '../agentProgress'
8
- import { viewedImageDataUri } from './viewedImages'
8
+ import { viewedImageDataUri, viewedImagesFrom, type ViewedImageItem } from './viewedImages'
9
+
10
+ export interface AskUserItem {
11
+ question: string
12
+ answer?: string
13
+ }
9
14
 
10
15
  export interface AgentActivity {
11
16
  label: string
@@ -16,6 +21,22 @@ export interface AgentActivity {
16
21
  callId?: string
17
22
  /** Raw ToolEnd output text, shown when the row is expanded in the UI. */
18
23
  result?: string
24
+ viewedImage?: ViewedImageItem
25
+ /** Semantic verb (e.g. 'Analyzed', 'Edited', 'Created', 'Ran', 'Searched') */
26
+ semanticVerb?: string
27
+ /** Human-readable intent or title (e.g. toolSummary for commands, or skill title) */
28
+ intentTitle?: string
29
+ /** Line range suffix if available, e.g. '#L25-50' */
30
+ lineRange?: string
31
+ /** Git diff additions/deletions if available */
32
+ diffStats?: { additions: number; deletions: number }
33
+ /** Elapsed duration in ms or s */
34
+ elapsedMs?: number
35
+ /** Structured ask_user questions and answers */
36
+ askUserData?: {
37
+ header?: string
38
+ questions: AskUserItem[]
39
+ }
19
40
  }
20
41
 
21
42
  export interface AgentActivityGroup {
@@ -27,6 +48,7 @@ export interface AgentActivityGroup {
27
48
  count: number
28
49
  state: 'active' | 'done' | 'error' | 'retry'
29
50
  items: AgentActivity[]
51
+ semanticVerb?: string
30
52
  }
31
53
 
32
54
  export type TimelineItem =
@@ -37,18 +59,42 @@ export type TimelineItem =
37
59
 
38
60
  export interface AgentActivityView {
39
61
  summary: string
62
+ /** Natural composite summary phrase, e.g. "Explored files, ran commands, edited files" */
63
+ naturalSummary?: string
64
+ /** Total elapsed time string if available, e.g. "2m", "14s" */
65
+ durationText?: string
40
66
  items: AgentActivity[]
41
67
  groups?: AgentActivityGroup[]
42
68
  /** Unified chronological list of thoughts, extended thinking, and tool activities. */
43
69
  timeline?: TimelineItem[]
44
70
  }
45
71
 
72
+ export function isDummyValue(value: unknown): boolean {
73
+ if (typeof value !== 'string') return false
74
+ const lower = value.trim().toLowerCase()
75
+ return (
76
+ lower === 'null' ||
77
+ lower === 'undefined' ||
78
+ lower === 'none' ||
79
+ lower === 'nil' ||
80
+ lower === '(null)' ||
81
+ lower === '""' ||
82
+ lower === "''"
83
+ )
84
+ }
85
+
46
86
  function activityDetail(input: Record<string, unknown>, key: string): string {
87
+ if (!input || typeof input !== 'object') return ''
47
88
  const value = input[key]
48
- return typeof value === 'string' && value.trim() ? value : ''
89
+ if (typeof value === 'string') {
90
+ const trimmed = value.trim()
91
+ return isDummyValue(trimmed) ? '' : trimmed
92
+ }
93
+ return ''
49
94
  }
50
95
 
51
96
  export function formatActivityTarget(value: string): string {
97
+ if (!value || value === '.' || value === './' || value === 'list files') return 'workspace'
52
98
  const compact = value.replace(/^\/home\/([^/]+)/, '~')
53
99
  return compact || 'workspace'
54
100
  }
@@ -56,8 +102,8 @@ export function formatActivityTarget(value: string): string {
56
102
  export function activityKind(action: string, target: string): AgentActivity['kind'] {
57
103
  if (['search_code', 'semantic_search', 'knowledge_search', 'web_search', 'image_search', 'memory_recall', 'find_definition', 'find_references'].includes(action)) return 'search'
58
104
  if (['run_shell', 'verify', 'run_tests', 'run_typecheck', 'run_linter'].includes(action)) return 'terminal'
59
- if (['list_files', 'detect_project'].includes(action)) return 'folder'
60
- if (['read_file', 'symbols', 'read_diagnostics', 'git_diff', 'apply_patch', 'write_file', 'note_write', 'view_image'].includes(action)) return 'file'
105
+ if (['list_files', 'list_directory', 'list_dir', 'detect_project'].includes(action)) return 'folder'
106
+ if (['read_file', 'symbols', 'read_diagnostics', 'git_diff', 'apply_patch', 'write_file', 'edit_file', 'apply_code_edits', 'note_write', 'view_image'].includes(action)) return 'file'
61
107
  if (['calculation', 'calculator'].includes(action)) return 'calc'
62
108
  return target.includes('/') && !/\.[^/]+$/.test(target) ? 'folder' : 'tool'
63
109
  }
@@ -72,9 +118,53 @@ export function describeTool(action: string, input: Record<string, unknown>): Ag
72
118
  activityDetail(input, 'prompt') ||
73
119
  activityDetail(input, 'searchTerm') ||
74
120
  activityDetail(input, 'search_term')
75
- const command = activityDetail(input, 'command') || activityDetail(input, 'cmd')
121
+ let command =
122
+ activityDetail(input, 'command') ||
123
+ activityDetail(input, 'cmd') ||
124
+ activityDetail(input, 'script') ||
125
+ activityDetail(input, 'exec') ||
126
+ activityDetail(input, 'code') ||
127
+ activityDetail(input, 'bash') ||
128
+ activityDetail(input, 'sh')
129
+
130
+ if (!command && input && typeof input === 'object') {
131
+ if (typeof input.arguments === 'object' && input.arguments !== null) {
132
+ const nested = input.arguments as Record<string, unknown>
133
+ command =
134
+ activityDetail(nested, 'command') ||
135
+ activityDetail(nested, 'cmd') ||
136
+ activityDetail(nested, 'script') ||
137
+ activityDetail(nested, 'exec') ||
138
+ activityDetail(nested, 'code') ||
139
+ activityDetail(nested, 'bash') ||
140
+ activityDetail(nested, 'sh')
141
+ } else if (typeof input.arguments === 'string') {
142
+ try {
143
+ const parsed = JSON.parse(input.arguments)
144
+ if (parsed && typeof parsed === 'object') {
145
+ command =
146
+ activityDetail(parsed, 'command') ||
147
+ activityDetail(parsed, 'cmd') ||
148
+ activityDetail(parsed, 'script') ||
149
+ activityDetail(parsed, 'exec') ||
150
+ activityDetail(parsed, 'code') ||
151
+ activityDetail(parsed, 'bash') ||
152
+ activityDetail(parsed, 'sh')
153
+ }
154
+ } catch {
155
+ // best-effort
156
+ }
157
+ }
158
+ }
159
+
160
+ if (!command && typeof (input as unknown) === 'string') {
161
+ const raw = (input as unknown as string).trim()
162
+ if (raw && !raw.startsWith('{') && !isDummyValue(raw)) command = raw
163
+ }
164
+
76
165
  const name = activityDetail(input, 'name')
77
166
  const tool = activityDetail(input, 'tool')
167
+ const server = activityDetail(input, 'server')
78
168
  const symbol = activityDetail(input, 'symbol') || activityDetail(input, 'ticker')
79
169
  const filter = activityDetail(input, 'filter')
80
170
  const expression = activityDetail(input, 'expression') || activityDetail(input, 'expr') || activityDetail(input, 'math')
@@ -82,52 +172,174 @@ export function describeTool(action: string, input: Record<string, unknown>): Ag
82
172
  const url = activityDetail(input, 'url')
83
173
  const selector = activityDetail(input, 'selector')
84
174
 
85
- const fallbackTarget =
86
- action === 'web_search' || action === 'search_code' || action === 'knowledge_search'
87
- ? (query || '(empty query)')
88
- : action === 'read_file' || action === 'write_file'
89
- ? (path || '(empty path)')
90
- : action === 'find_definition' || action === 'find_references'
91
- ? (symbol || '(empty symbol)')
92
- : action === 'run_tests'
93
- ? (filter || '(all tests)')
94
- : action === 'run_typecheck' || action === 'run_linter'
95
- ? (path || 'workspace')
96
- : action === 'run_shell'
97
- ? (command || '(empty command)')
98
- : action === 'calculation'
99
- ? (expression || '(math expression)')
100
- : action === 'weather'
101
- ? (city || '(location)')
102
- : action === 'stock'
103
- ? (query || symbol || '(symbol)')
104
- : action === 'browser_open'
105
- ? (url || '(url)')
106
- : action === 'browser_click'
107
- ? (selector || '(element)')
108
- : action.replaceAll('_', ' ')
109
-
110
- const rawTarget = path || query || command || expression || symbol || city || url || selector || filter || name || tool || fallbackTarget
175
+ let rawTarget = ''
176
+ switch (action) {
177
+ case 'run_shell':
178
+ rawTarget = command || '(empty command)'
179
+ break
180
+ case 'web_search':
181
+ case 'search_code':
182
+ case 'knowledge_search':
183
+ rawTarget = query || '(empty query)'
184
+ break
185
+ case 'read_file':
186
+ case 'write_file':
187
+ case 'view_image':
188
+ rawTarget = path || '(empty path)'
189
+ break
190
+ case 'find_definition':
191
+ case 'find_references':
192
+ rawTarget = symbol || '(empty symbol)'
193
+ break
194
+ case 'run_tests':
195
+ rawTarget = filter || '(all tests)'
196
+ break
197
+ case 'run_typecheck':
198
+ case 'run_linter':
199
+ rawTarget = path || 'workspace'
200
+ break
201
+ case 'calculation':
202
+ case 'calculator':
203
+ rawTarget = expression || '(math expression)'
204
+ break
205
+ case 'weather':
206
+ rawTarget = city || '(location)'
207
+ break
208
+ case 'stock':
209
+ rawTarget = query || symbol || '(symbol)'
210
+ break
211
+ case 'mcp_tool':
212
+ rawTarget = tool ? (server ? `${server}/${tool}` : tool) : (name || 'mcp tool')
213
+ break
214
+ case 'note_write':
215
+ rawTarget = name || path || '(note)'
216
+ break
217
+ case 'exit_plan_mode':
218
+ rawTarget = 'plan approval'
219
+ break
220
+ case 'list_files':
221
+ case 'list_directory':
222
+ case 'list_dir': {
223
+ const targetPath =
224
+ path ||
225
+ activityDetail(input, 'directory') ||
226
+ activityDetail(input, 'dir') ||
227
+ activityDetail(input, 'folder') ||
228
+ activityDetail(input, 'target')
229
+ if (!targetPath || targetPath === '.' || targetPath === './' || targetPath === 'list files') {
230
+ rawTarget = 'workspace'
231
+ } else {
232
+ rawTarget = formatActivityTarget(targetPath)
233
+ }
234
+ break
235
+ }
236
+ case 'create_plan':
237
+ case 'update_plan': {
238
+ const summary = activityDetail(input, 'summary') || activityDetail(input, 'title')
239
+ const stepsCount = Array.isArray(input.steps) ? input.steps.length : 0
240
+ const stepsLabel = stepsCount > 0 ? `${stepsCount} step${stepsCount === 1 ? '' : 's'}` : ''
241
+ rawTarget = summary && stepsLabel
242
+ ? `${summary} (${stepsLabel})`
243
+ : summary || stepsLabel || 'task plan'
244
+ break
245
+ }
246
+ default:
247
+ rawTarget = path || query || command || expression || symbol || city || url || selector || filter || name || tool || action.replaceAll('_', ' ')
248
+ break
249
+ }
111
250
 
112
251
  // Append line range for read_file when startLine / endLine are available
113
252
  let target = rawTarget
253
+ let lineRange: string | undefined
114
254
  if (action === 'read_file' && path) {
115
255
  const startLine =
116
256
  typeof input.startLine === 'number'
117
257
  ? input.startLine
118
258
  : typeof input.start_line === 'number'
119
259
  ? input.start_line
120
- : undefined
260
+ : typeof input.StartLine === 'number'
261
+ ? input.StartLine
262
+ : undefined
121
263
  const endLine =
122
264
  typeof input.endLine === 'number'
123
265
  ? input.endLine
124
266
  : typeof input.end_line === 'number'
125
267
  ? input.end_line
126
- : undefined
268
+ : typeof input.EndLine === 'number'
269
+ ? input.EndLine
270
+ : undefined
127
271
  if (startLine !== undefined && endLine !== undefined) {
128
- target = `${rawTarget} #L${startLine}-${endLine}`
272
+ lineRange = `#L${startLine}-${endLine}`
273
+ target = `${rawTarget} ${lineRange}`
129
274
  } else if (startLine !== undefined) {
130
- target = `${rawTarget} #L${startLine}`
275
+ lineRange = `#L${startLine}`
276
+ target = `${rawTarget} ${lineRange}`
277
+ }
278
+ }
279
+
280
+ // Diff stats extraction for edit_file / write_file
281
+ let diffStats: { additions: number; deletions: number } | undefined
282
+ if (action === 'edit_file') {
283
+ const targetText = typeof input.Target === 'string' ? input.Target : typeof input.target === 'string' ? input.target : ''
284
+ const replacementText = typeof input.Replacement === 'string' ? input.Replacement : typeof input.replacement === 'string' ? input.replacement : ''
285
+ const deletions = targetText ? targetText.split('\n').length : 0
286
+ const additions = replacementText ? replacementText.split('\n').length : 0
287
+ diffStats = { additions, deletions }
288
+ } else if (action === 'write_file' || action === 'note_write') {
289
+ const rawContent = input.fileContent ?? input.file_content ?? input.Content ?? input.content ?? input.text ?? input.body
290
+ const content = typeof rawContent === 'string' ? rawContent : ''
291
+ const additions = content ? content.split('\n').length : 0
292
+ diffStats = { additions, deletions: 0 }
293
+ }
294
+
295
+ // Intent / summary extraction for commands
296
+ let intentTitle: string | undefined
297
+ if (action === 'run_shell' || action === 'run_command' || action === 'bash') {
298
+ intentTitle = activityDetail(input, 'toolSummary') || activityDetail(input, 'summary') || activityDetail(input, 'description')
299
+ }
300
+
301
+ let semanticVerb = 'Executed'
302
+ let askUserData: AgentActivity['askUserData']
303
+ if (action === 'read_file') {
304
+ semanticVerb = 'Analyzed'
305
+ } else if (action === 'list_files' || action === 'list_directory' || action === 'list_dir') {
306
+ semanticVerb = 'Explored'
307
+ } else if (action === 'edit_file' || action === 'apply_patch' || action === 'apply_code_edits') {
308
+ semanticVerb = 'Edited'
309
+ } else if (action === 'write_file' || action === 'note_write') {
310
+ semanticVerb = 'Edited'
311
+ } else if (action === 'run_shell' || action === 'run_command' || action === 'bash') {
312
+ semanticVerb = 'Ran'
313
+ } else if (action?.includes('search')) {
314
+ semanticVerb = 'Searched'
315
+ } else if (action === 'calculation' || action === 'calculator') {
316
+ semanticVerb = 'Calculated'
317
+ } else if (action === 'view_image') {
318
+ semanticVerb = 'Viewed'
319
+ } else if (action === 'create_plan' || action === 'update_plan') {
320
+ semanticVerb = 'Planned'
321
+ } else if (action === 'ask_user') {
322
+ semanticVerb = 'Asked'
323
+ let questions: AskUserItem[] = []
324
+ const rawQuestions = input?.questions
325
+ if (Array.isArray(rawQuestions) && rawQuestions.length > 0) {
326
+ questions = (rawQuestions as Array<Record<string, unknown> | string>)
327
+ .map((q) => {
328
+ if (typeof q === 'string') return { question: q.trim() }
329
+ const questionText = String(q.question || q.query || q.title || '').trim()
330
+ const answerText = typeof q.answer === 'string' ? q.answer.trim() : undefined
331
+ return { question: questionText, answer: answerText }
332
+ })
333
+ .filter((q) => q.question.length > 0)
334
+ } else if (query) {
335
+ questions = [{ question: query }]
336
+ }
337
+ if (questions.length > 0) {
338
+ const headerText = typeof input?.header === 'string' ? input.header.trim() : undefined
339
+ askUserData = {
340
+ header: headerText || undefined,
341
+ questions,
342
+ }
131
343
  }
132
344
  }
133
345
 
@@ -139,7 +351,348 @@ export function describeTool(action: string, input: Record<string, unknown>): Ag
139
351
  kind: activityKind(action, target),
140
352
  state: 'active',
141
353
  action,
354
+ semanticVerb,
355
+ intentTitle,
356
+ lineRange,
357
+ diffStats,
358
+ askUserData,
359
+ }
360
+ }
361
+
362
+ export function formatDurationText(durationSecs?: number): string {
363
+ if (durationSecs === undefined || durationSecs === null || durationSecs <= 0) return ''
364
+ const secs = Math.round(durationSecs)
365
+ if (secs < 60) return `${secs}s`
366
+ const mins = Math.floor(secs / 60)
367
+ const remSecs = secs % 60
368
+ if (remSecs === 0) return `${mins}m`
369
+ return `${mins}m ${remSecs}s`
370
+ }
371
+
372
+ export function isMarkdownContent(action?: string, target?: string, output?: string): boolean {
373
+ if (!output || !output.trim()) return false
374
+ if (action === 'run_shell' || action === 'run_command' || action === 'bash') return false
375
+ const cleanTarget = (target || '').toLowerCase()
376
+ if (cleanTarget.endsWith('.md') || cleanTarget.endsWith('.markdown') || cleanTarget.endsWith('.txt')) {
377
+ return true
378
+ }
379
+ if (cleanTarget.includes('skill') || output.startsWith('[Loaded skill:')) {
380
+ return true
381
+ }
382
+ if (action === 'note_read' || action === 'web_search') {
383
+ return true
384
+ }
385
+ if (/^#{1,6}\s+/m.test(output) && (output.includes('\n\n') || output.includes('\n- '))) {
386
+ return true
387
+ }
388
+ return false
389
+ }
390
+
391
+ export function cleanMarkdownOutput(text: string): string {
392
+ let cleaned = text.trim()
393
+ cleaned = cleaned.replace(/^\[Loaded skill:\s*([^\]]+)\][\s\n]*/i, '**Skill: $1**\n\n')
394
+ const frontmatterMatch = cleaned.match(/^(\*\*Skill:[^\n]+\*\*[\s\n]*)?---\s*\n([\s\S]*?)\n---\s*\n/)
395
+ if (frontmatterMatch) {
396
+ const prefix = frontmatterMatch[1] ? frontmatterMatch[1].trim() + '\n\n' : ''
397
+ const yaml = frontmatterMatch[2]
398
+ const descMatch = yaml.match(/description:\s*([^\n]+(?:\n\s+[^\n]+)*)/)
399
+ const desc = descMatch ? descMatch[1].replace(/\n\s+/g, ' ').trim() : ''
400
+ const remaining = cleaned.slice(frontmatterMatch[0].length)
401
+ if (desc) {
402
+ cleaned = `${prefix}> ${desc}\n\n${remaining}`
403
+ } else {
404
+ cleaned = `${prefix}${remaining}`
405
+ }
142
406
  }
407
+ return cleaned
408
+ }
409
+
410
+ export interface DirectoryEntryItem {
411
+ name?: string
412
+ path?: string
413
+ kind?: 'directory' | 'file' | 'symlink' | string
414
+ size?: number | null
415
+ }
416
+
417
+ export function formatFileSize(bytes?: number | null): string {
418
+ if (bytes === null || bytes === undefined || isNaN(bytes)) return ''
419
+ if (bytes < 0) return '0 B'
420
+ if (bytes < 1024) return `${bytes} B`
421
+ const kb = bytes / 1024
422
+ if (kb < 1024) return `${Number(kb.toFixed(1))} KB`
423
+ const mb = kb / 1024
424
+ if (mb < 1024) return `${Number(mb.toFixed(1))} MB`
425
+ const gb = mb / 1024
426
+ return `${Number(gb.toFixed(1))} GB`
427
+ }
428
+
429
+ export function parseDirectoryEntries(text: string): DirectoryEntryItem[] | null {
430
+ if (!text || typeof text !== 'string') return null
431
+ let trimmed = text.trim()
432
+
433
+ if (!trimmed.startsWith('[') && trimmed.includes('stdout:')) {
434
+ const stdoutMatch = trimmed.match(/stdout:\s*\n([\s\S]*?)(?:\n\s*stderr:|$)/)
435
+ if (stdoutMatch && stdoutMatch[1]) {
436
+ trimmed = stdoutMatch[1].trim()
437
+ }
438
+ }
439
+
440
+ if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) return null
441
+
442
+ let parsed: unknown
443
+ try {
444
+ parsed = JSON.parse(trimmed)
445
+ } catch {
446
+ return null
447
+ }
448
+
449
+ if (!Array.isArray(parsed)) return null
450
+ if (parsed.length === 0) return []
451
+
452
+ const isDirEntryArray = parsed.every(
453
+ (item) =>
454
+ item &&
455
+ typeof item === 'object' &&
456
+ (typeof item.name === 'string' || typeof item.path === 'string') &&
457
+ ('kind' in item || 'size' in item)
458
+ )
459
+
460
+ if (!isDirEntryArray) return null
461
+
462
+ const entries = parsed as DirectoryEntryItem[]
463
+ const dirs: DirectoryEntryItem[] = []
464
+ const files: DirectoryEntryItem[] = []
465
+ const others: DirectoryEntryItem[] = []
466
+
467
+ for (const entry of entries) {
468
+ const kind = (entry.kind || '').toLowerCase()
469
+ if (kind === 'directory' || kind === 'dir' || kind === 'folder') {
470
+ dirs.push(entry)
471
+ } else if (kind === 'file') {
472
+ files.push(entry)
473
+ } else {
474
+ others.push(entry)
475
+ }
476
+ }
477
+
478
+ const getEntryName = (e: DirectoryEntryItem): string => {
479
+ if (e.name) return e.name
480
+ if (e.path) {
481
+ const parts = e.path.split(/[/\\]/)
482
+ return parts[parts.length - 1] || e.path
483
+ }
484
+ return ''
485
+ }
486
+
487
+ dirs.sort((a, b) => getEntryName(a).localeCompare(getEntryName(b), undefined, { sensitivity: 'base' }))
488
+ files.sort((a, b) => getEntryName(a).localeCompare(getEntryName(b), undefined, { sensitivity: 'base' }))
489
+ others.sort((a, b) => getEntryName(a).localeCompare(getEntryName(b), undefined, { sensitivity: 'base' }))
490
+
491
+ return [...dirs, ...others, ...files]
492
+ }
493
+
494
+ export function formatDirectoryListing(text: string): string | null {
495
+ const entries = parseDirectoryEntries(text)
496
+ if (!entries) return null
497
+ if (entries.length === 0) return '(empty directory)'
498
+
499
+ const getEntryName = (e: DirectoryEntryItem): string => {
500
+ if (e.name) return e.name
501
+ if (e.path) {
502
+ const parts = e.path.split(/[/\\]/)
503
+ return parts[parts.length - 1] || e.path
504
+ }
505
+ return ''
506
+ }
507
+
508
+ const lines: string[] = []
509
+
510
+ for (const entry of entries) {
511
+ const kind = (entry.kind || '').toLowerCase()
512
+ const name = getEntryName(entry)
513
+ if (kind === 'directory' || kind === 'dir' || kind === 'folder') {
514
+ const displayName = name.endsWith('/') ? name : `${name}/`
515
+ lines.push(`📁 ${displayName}`)
516
+ } else if (kind === 'symlink') {
517
+ const sizeStr = formatFileSize(entry.size)
518
+ const suffix = sizeStr ? ` (${sizeStr})` : ''
519
+ lines.push(`🔗 ${name}${suffix}`)
520
+ } else {
521
+ const sizeStr = formatFileSize(entry.size)
522
+ const suffix = sizeStr ? ` (${sizeStr})` : ''
523
+ lines.push(`📄 ${name}${suffix}`)
524
+ }
525
+ }
526
+
527
+ return lines.join('\n')
528
+ }
529
+
530
+ export function summarizeDirectoryListing(text: string): string | null {
531
+ if (!text || typeof text !== 'string') return null
532
+ const trimmed = text.trim()
533
+
534
+ const entries = parseDirectoryEntries(trimmed)
535
+ if (entries) {
536
+ if (entries.length === 0) return 'empty folder'
537
+ let dirCount = 0
538
+ let fileCount = 0
539
+ let otherCount = 0
540
+
541
+ for (const item of entries) {
542
+ const kind = String(item.kind || '').toLowerCase()
543
+ if (kind === 'directory' || kind === 'dir' || kind === 'folder') {
544
+ dirCount++
545
+ } else if (kind === 'file') {
546
+ fileCount++
547
+ } else {
548
+ otherCount++
549
+ }
550
+ }
551
+
552
+ const total = dirCount + fileCount + otherCount
553
+ if (total === 0) return 'empty folder'
554
+
555
+ if (dirCount > 0 && fileCount > 0) {
556
+ const folderStr = `${dirCount} folder${dirCount === 1 ? '' : 's'}`
557
+ const fileStr = `${fileCount} file${fileCount === 1 ? '' : 's'}`
558
+ const detailed = `${total} items (${folderStr}, ${fileStr})`
559
+ if (detailed.length <= 35) return detailed
560
+ return `${total} items`
561
+ }
562
+
563
+ if (dirCount > 0 && fileCount === 0) {
564
+ return `${dirCount} folder${dirCount === 1 ? '' : 's'}`
565
+ }
566
+
567
+ if (fileCount > 0 && dirCount === 0) {
568
+ return `${fileCount} file${fileCount === 1 ? '' : 's'}`
569
+ }
570
+
571
+ return `${total} items`
572
+ }
573
+
574
+ // Check if already formatted lines
575
+ if (!trimmed.startsWith('[') && (trimmed.includes('📁 ') || trimmed.includes('📄 ') || trimmed.includes('🔗 '))) {
576
+ const lines = trimmed.split('\n').map((l) => l.trim()).filter(Boolean)
577
+ const dirCount = lines.filter((l) => l.startsWith('📁')).length
578
+ const fileCount = lines.filter((l) => l.startsWith('📄') || l.startsWith('🔗')).length
579
+ const total = dirCount + fileCount
580
+ if (total === 0) return 'empty folder'
581
+ if (dirCount > 0 && fileCount > 0) {
582
+ const detailed = `${total} items (${dirCount} folders, ${fileCount} files)`
583
+ return detailed.length <= 35 ? detailed : `${total} items`
584
+ }
585
+ if (dirCount > 0) return `${dirCount} folder${dirCount === 1 ? '' : 's'}`
586
+ if (fileCount > 0) return `${fileCount} file${fileCount === 1 ? '' : 's'}`
587
+ return `${total} items`
588
+ }
589
+
590
+ return null
591
+ }
592
+
593
+ /**
594
+ * Strips internal machine/executor envelope lines (`exit:`, `mode:`, `sandboxed:`, empty `stderr:`)
595
+ * from raw command execution output, returning clean stdout/stderr for human viewing.
596
+ */
597
+ export function cleanCommandOutput(text: string): string {
598
+ if (!text || typeof text !== 'string') return ''
599
+ const trimmed = text.trim()
600
+ if (!trimmed) return ''
601
+
602
+ // If text is serialized directory listing JSON, format it cleanly into readable entries
603
+ const formattedDir = formatDirectoryListing(trimmed)
604
+ if (formattedDir) return formattedDir
605
+
606
+ const lines = text.split('\n')
607
+ const hasEnvelope = lines.some((l) => {
608
+ const t = l.trim()
609
+ return t.startsWith('mode: ') || t.startsWith('sandboxed: ') || (t.startsWith('exit: ') && lines.some(x => x.trim() === 'stdout:'))
610
+ })
611
+
612
+ if (hasEnvelope) {
613
+ let section: 'meta' | 'stdout' | 'stderr' = 'meta'
614
+ const stdoutLines: string[] = []
615
+ const stderrLines: string[] = []
616
+
617
+ for (const line of lines) {
618
+ const t = line.trim()
619
+ if (section === 'meta' && (t.startsWith('exit: ') || t.startsWith('mode: ') || t.startsWith('sandboxed: '))) {
620
+ continue
621
+ }
622
+ if (t === 'stdout:') {
623
+ section = 'stdout'
624
+ continue
625
+ }
626
+ if (t === 'stderr:') {
627
+ section = 'stderr'
628
+ continue
629
+ }
630
+
631
+ if (section === 'stdout') {
632
+ stdoutLines.push(line)
633
+ } else if (section === 'stderr') {
634
+ stderrLines.push(line)
635
+ } else {
636
+ stdoutLines.push(line)
637
+ }
638
+ }
639
+
640
+ const cleanStdout = stdoutLines.join('\n').trim()
641
+ const cleanStderr = stderrLines.join('\n').trim()
642
+
643
+ if (cleanStdout && cleanStderr) {
644
+ const formattedStdout = formatDirectoryListing(cleanStdout) || cleanStdout
645
+ return `${formattedStdout}\n\n[stderr]\n${cleanStderr}`
646
+ }
647
+ if (cleanStderr) {
648
+ return cleanStderr
649
+ }
650
+ if (cleanStdout) {
651
+ return formatDirectoryListing(cleanStdout) || cleanStdout
652
+ }
653
+ return '(no output)'
654
+ }
655
+
656
+ // If there's no full envelope, strip empty trailing `stderr:` or `stderr:\n`
657
+ const cleaned = trimmed.replace(/\n\s*stderr:\s*$/i, '').trim()
658
+ return formatDirectoryListing(cleaned) || cleaned
659
+ }
660
+
661
+ export function generateNaturalActivitySummary(items: AgentActivity[], timeline?: TimelineItem[]): string {
662
+ if (!items || items.length === 0) {
663
+ if (timeline && timeline.some(t => t.kind === 'extendedThinking' || t.kind === 'thought')) {
664
+ return 'Thinking'
665
+ }
666
+ return 'Working'
667
+ }
668
+
669
+ let hasRead = false
670
+ let hasWrite = false
671
+ let hasCommand = false
672
+ let hasSearch = false
673
+ let hasExplore = false
674
+ let hasThought = Boolean(timeline && timeline.some(t => t.kind === 'extendedThinking'))
675
+
676
+ for (const item of items) {
677
+ if (item.action === 'read_file') hasRead = true
678
+ else if (item.action === 'write_file' || item.action === 'edit_file' || item.action === 'apply_patch') hasWrite = true
679
+ else if (item.action === 'run_shell' || item.action === 'run_command' || item.action === 'bash') hasCommand = true
680
+ else if (item.action?.includes('search')) hasSearch = true
681
+ else if (item.action === 'list_files' || item.action === 'list_directory' || item.action === 'list_dir' || item.kind === 'folder') hasExplore = true
682
+ }
683
+
684
+ const parts: string[] = []
685
+ if (hasExplore && !hasRead) parts.push('Explored workspace')
686
+ if (hasRead) parts.push('Explored files')
687
+ if (hasCommand) parts.push('ran commands')
688
+ if (hasWrite) parts.push('edited files')
689
+ if (hasSearch && !hasRead && !hasExplore) parts.push('searched codebase')
690
+ if (parts.length === 0) {
691
+ if (hasThought) return 'Analyzed task'
692
+ return 'Working through task'
693
+ }
694
+
695
+ return parts.join(', ')
143
696
  }
144
697
 
145
698
  export function activitySummary(items: AgentActivity[]): string {
@@ -205,6 +758,7 @@ function finalizeGroup(group: AgentActivityGroup): AgentActivityGroup {
205
758
  if (count === 1) {
206
759
  group.title = group.items[0].target
207
760
  group.state = group.items[0].state
761
+ group.semanticVerb = group.items[0].semanticVerb
208
762
  return group
209
763
  }
210
764
 
@@ -228,25 +782,28 @@ function finalizeGroup(group: AgentActivityGroup): AgentActivityGroup {
228
782
 
229
783
  const action = group.action
230
784
  const doneCount = group.items.filter((it) => it.state === 'done').length
231
- if (action === 'calculation') {
232
- group.title = group.state === 'active'
233
- ? `Calculating expressions (${doneCount}/${count})`
234
- : `Calculated ${count} expressions`
785
+ if (action === 'calculation' || action === 'calculator') {
786
+ group.semanticVerb = 'Calculated'
787
+ group.title = `${count} expressions`
235
788
  } else if (action === 'read_file') {
236
- group.title = group.state === 'active'
237
- ? `Reading files (${doneCount}/${count})`
238
- : `Read ${count} files`
239
- } else if (action === 'write_file') {
240
- group.title = group.state === 'active'
241
- ? `Writing files (${doneCount}/${count})`
242
- : `Wrote ${count} files`
243
- } else if (action === 'search_code' || action === 'semantic_search') {
244
- group.title = `Searched codebase (${count} queries)`
245
- } else if (action === 'web_search') {
246
- group.title = `Searched web (${count} queries)`
789
+ group.semanticVerb = 'Analyzed'
790
+ group.title = group.state === 'active' ? `reading files (${doneCount}/${count})` : `${count} files`
791
+ } else if (action === 'write_file' || action === 'edit_file' || action === 'apply_patch') {
792
+ group.semanticVerb = 'Edited'
793
+ group.title = group.state === 'active' ? `writing files (${doneCount}/${count})` : `${count} files`
794
+ } else if (action === 'run_shell' || action === 'run_command' || action === 'bash') {
795
+ group.semanticVerb = 'Ran'
796
+ group.title = `${count} commands`
797
+ } else if (action === 'list_files' || action === 'list_directory' || action === 'list_dir') {
798
+ group.semanticVerb = 'Explored'
799
+ group.title = `${count} directories`
800
+ } else if (action === 'search_code' || action === 'semantic_search' || action === 'web_search') {
801
+ group.semanticVerb = 'Searched'
802
+ group.title = `${count} queries`
247
803
  } else {
804
+ group.semanticVerb = 'Executed'
248
805
  const readableAction = action.replaceAll('_', ' ')
249
- group.title = `Executed ${count} ${readableAction}`
806
+ group.title = `${count} ${readableAction}`
250
807
  }
251
808
 
252
809
  return group
@@ -281,6 +838,7 @@ function deriveActivitiesFrom(progress: AgentProgress[]): AgentActivityView {
281
838
 
282
839
  for (const event of progress) {
283
840
  if (event.type === 'ToolStart') {
841
+ if (event.data.subagent) continue
284
842
  const item = describeTool(event.data.action, event.data.input)
285
843
  item.callId = event.data.callId
286
844
  activities.push(item)
@@ -313,12 +871,26 @@ function deriveActivitiesFrom(progress: AgentProgress[]): AgentActivityView {
313
871
  }
314
872
  }
315
873
  } else if (event.type === 'ToolEnd') {
874
+ if (event.data.subagent) continue
316
875
  const finished = describeTool(event.data.action, event.data.input)
317
876
  for (let index = activities.length - 1; index >= 0; index -= 1) {
318
877
  if (activities[index].state !== 'active') continue
319
878
  if (event.data.callId && activities[index].callId !== event.data.callId) continue
320
- if (activities[index].action !== finished.action || activities[index].target !== finished.target) continue
879
+ if (activities[index].action !== finished.action) continue
880
+ if (event.data.input && activities[index].target !== finished.target) continue
321
881
  activities[index].state = event.data.status ? (event.data.status === 'success' ? 'done' : 'error') : /^(Error:|Blocked|User denied)/.test(event.data.result) ? 'error' : 'done'
882
+ const elapsed = event.data.elapsed_ms ?? event.data.elapsedMs
883
+ if (typeof elapsed === 'number') {
884
+ activities[index].elapsedMs = elapsed
885
+ }
886
+ const lineMatch = typeof event.data.result === 'string' && event.data.result.match(/\+(\d+)\/-(\d+) lines/)
887
+ if (lineMatch) {
888
+ const add = parseInt(lineMatch[1], 10)
889
+ const del = parseInt(lineMatch[2], 10)
890
+ if (!isNaN(add) && !isNaN(del)) {
891
+ activities[index].diffStats = { additions: add, deletions: del }
892
+ }
893
+ }
322
894
  const viewedImage = event.data.action === 'view_image' ? viewedImageDataUri(event.data.result) : null
323
895
  activities[index].result = viewedImage ? event.data.result.replace(viewedImage, '[Image displayed below]') : event.data.result
324
896
  if (event.data.action === 'read_file') {
@@ -330,9 +902,46 @@ function deriveActivitiesFrom(progress: AgentProgress[]): AgentActivityView {
330
902
  : activities[index].label.replace('Reading skill:', 'Read skill preview:')
331
903
  }
332
904
  }
333
- if (activities[index].action === 'ask_user' && event.data.result.startsWith('User answered:')) {
334
- const answer = event.data.result.replace('User answered:', '').trim()
335
- activities[index].target = `(Answered: "${answer}") ${activities[index].target}`
905
+ if (activities[index].action === 'ask_user') {
906
+ let answer: string | undefined
907
+ if (typeof event.data.result === 'string') {
908
+ if (event.data.result.startsWith('User answered:')) {
909
+ answer = event.data.result.replace(/^User answered:\s*/, '').trim()
910
+ activities[index].target = `(Answered: "${answer}") ${activities[index].target}`
911
+ } else if (event.data.result.startsWith('User approved')) {
912
+ answer = 'Approved'
913
+ } else if (event.data.result.startsWith('User declined')) {
914
+ answer = 'Declined'
915
+ }
916
+ }
917
+
918
+ if (answer) {
919
+ if (!activities[index].askUserData) {
920
+ const cleanQuestion = activities[index].target.replace(/^\(Answered:\s*".*?"\)\s*/s, '').trim()
921
+ activities[index].askUserData = {
922
+ questions: [{ question: cleanQuestion, answer }],
923
+ }
924
+ } else if (activities[index].askUserData.questions.length > 0) {
925
+ let assigned = false
926
+ if (answer.startsWith('[') && answer.endsWith(']')) {
927
+ try {
928
+ const parsed = JSON.parse(answer)
929
+ if (Array.isArray(parsed) && parsed.length === activities[index].askUserData.questions.length) {
930
+ parsed.forEach((ans, i) => {
931
+ activities[index].askUserData!.questions[i].answer =
932
+ typeof ans === 'string' ? ans : JSON.stringify(ans)
933
+ })
934
+ assigned = true
935
+ }
936
+ } catch {
937
+ // ignore
938
+ }
939
+ }
940
+ if (!assigned) {
941
+ activities[index].askUserData.questions[0].answer = answer
942
+ }
943
+ }
944
+ }
336
945
  }
337
946
  break
338
947
  }
@@ -344,9 +953,10 @@ function deriveActivitiesFrom(progress: AgentProgress[]): AgentActivityView {
344
953
  currentGroup.state = hasActive ? 'active' : hasDone ? 'done' : hasRetry ? 'retry' : hasError ? 'error' : 'done'
345
954
  }
346
955
  } else if (event.type === 'ContextCompaction') {
956
+ if (event.data.subagent) continue
347
957
  if (event.data.status !== 'started') {
348
958
  flushGroup()
349
- timeline.push({ id: `context-${nextId++}`, kind: 'thought', thought: event.data.subagent ? `[${event.data.subagent}] ${event.data.message}` : event.data.message })
959
+ timeline.push({ id: `context-${nextId++}`, kind: 'thought', thought: event.data.message })
350
960
  }
351
961
  } else if (event.type === 'Thought') {
352
962
  const text = event.data?.thought?.trim()
@@ -420,8 +1030,51 @@ function deriveActivitiesFrom(progress: AgentProgress[]): AgentActivityView {
420
1030
  }
421
1031
  }
422
1032
 
423
- const items = activities.slice(-25)
424
- return { summary: activitySummary(activities), items, groups: groupActivities(items), timeline: timeline.slice(-60) }
1033
+ const viewedImages = viewedImagesFrom(progress)
1034
+ if (viewedImages.length > 0) {
1035
+ const byCallId = new Map<string, ViewedImageItem>()
1036
+ const byPath = new Map<string, ViewedImageItem[]>()
1037
+ for (const img of viewedImages) {
1038
+ if (img.id) byCallId.set(img.id, img)
1039
+ if (img.path) {
1040
+ const list = byPath.get(img.path) || []
1041
+ list.push(img)
1042
+ byPath.set(img.path, list)
1043
+ }
1044
+ }
1045
+ for (const act of activities) {
1046
+ if (act.action === 'view_image' && act.state === 'done') {
1047
+ if (act.callId && byCallId.has(act.callId)) {
1048
+ act.viewedImage = byCallId.get(act.callId)
1049
+ } else if (byPath.has(act.target)) {
1050
+ const list = byPath.get(act.target)!
1051
+ if (list.length > 0) {
1052
+ act.viewedImage = list.shift()
1053
+ }
1054
+ }
1055
+ }
1056
+ }
1057
+ }
1058
+
1059
+ let totalDurationSecs: number | undefined
1060
+ for (const event of progress) {
1061
+ if (event.type === 'RunCompleted' && typeof event.data?.summary?.durationSecs === 'number') {
1062
+ totalDurationSecs = event.data.summary.durationSecs
1063
+ }
1064
+ }
1065
+
1066
+ const naturalSummary = generateNaturalActivitySummary(activities, timeline)
1067
+ const durationText = formatDurationText(totalDurationSecs)
1068
+
1069
+ const items = activities.slice(-50)
1070
+ return {
1071
+ summary: activitySummary(activities),
1072
+ naturalSummary,
1073
+ durationText,
1074
+ items,
1075
+ groups: groupActivities(items),
1076
+ timeline: timeline.slice(-80),
1077
+ }
425
1078
  }
426
1079
 
427
1080
  export interface WebSearchSource {
@@ -495,3 +1148,67 @@ export function cleanIntermediateThought(text: string): string {
495
1148
  cleaned = cleaned.replace(/^[\s•\-\*]+\s*/, '')
496
1149
  return cleaned.trim() || text.trim()
497
1150
  }
1151
+
1152
+ export function extractLatestPlan(progress: AgentProgress[]): ActivePlan | undefined {
1153
+ for (let i = progress.length - 1; i >= 0; i--) {
1154
+ const event = progress[i]
1155
+ if (event.type === 'PlanUpdated') {
1156
+ return event.data.plan
1157
+ }
1158
+ }
1159
+ return undefined
1160
+ }
1161
+
1162
+ export function extractLatestRunSummary(progress: AgentProgress[]): RunTelemetrySummary | undefined {
1163
+ for (let i = progress.length - 1; i >= 0; i--) {
1164
+ const event = progress[i]
1165
+ if (event.type === 'RunCompleted') {
1166
+ return event.data.summary
1167
+ }
1168
+ }
1169
+ return undefined
1170
+ }
1171
+
1172
+ export function hasSubagentActivity(progress: AgentProgress[]): boolean {
1173
+ return progress.some(
1174
+ (e) =>
1175
+ e.type === 'SubagentStarted' ||
1176
+ e.type === 'SubagentFinished' ||
1177
+ ((e.type === 'ToolStart' || e.type === 'ToolEnd') &&
1178
+ (e.data.subagent || e.data.action === 'dispatch_agents' || e.data.action === 'dispatch_subagent')),
1179
+ )
1180
+ }
1181
+
1182
+ export function isAskUserActivity(activity: AgentActivity): boolean {
1183
+ return (
1184
+ activity.action === 'ask_user' ||
1185
+ activity.label === 'ask_user' ||
1186
+ Boolean(activity.askUserData) ||
1187
+ activity.target.startsWith('(Answered:')
1188
+ )
1189
+ }
1190
+
1191
+ export function extractAskUserQuestions(activity: AgentActivity): AskUserItem[] {
1192
+ if (activity.askUserData?.questions && activity.askUserData.questions.length > 0) {
1193
+ return activity.askUserData.questions
1194
+ }
1195
+ const match = activity.target.match(/^\(Answered:\s*"(.*?)"\)\s*(.*)$/s)
1196
+ if (match) {
1197
+ return [{ question: match[2].trim(), answer: match[1].trim() }]
1198
+ }
1199
+ let answer: string | undefined
1200
+ if (typeof activity.result === 'string') {
1201
+ if (activity.result.startsWith('User answered:')) {
1202
+ answer = activity.result.replace(/^User answered:\s*/, '').trim()
1203
+ } else if (activity.result.startsWith('User approved')) {
1204
+ answer = 'Approved'
1205
+ } else if (activity.result.startsWith('User declined')) {
1206
+ answer = 'Declined'
1207
+ }
1208
+ }
1209
+ const cleanQuestion = activity.target.replace(/^\(Answered:\s*".*?"\)\s*/s, '').trim()
1210
+ if (cleanQuestion) {
1211
+ return [{ question: cleanQuestion, answer }]
1212
+ }
1213
+ return []
1214
+ }