@nextclaw/ui 0.26.4 → 0.27.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 (376) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/.vite/manifest.json +1271 -1227
  3. package/dist/assets/{abnfDiagram-VRR7QNED-Dcw10Yt1.js → abnfDiagram-VRR7QNED-DmeCRAkd.js} +1 -1
  4. package/dist/assets/account-panel-BYxGT4m4.js +1 -0
  5. package/dist/assets/{aiden0z-pptx-renderer.es--oNqetPA.js → aiden0z-pptx-renderer.es-ChX5DHqP.js} +1 -1
  6. package/dist/assets/api-CG22BskB.js +20 -0
  7. package/dist/assets/app-presenter-provider-CJFjhVYI.js +28 -0
  8. package/dist/assets/app-presenter-provider-D3BuuOyZ.css +1 -0
  9. package/dist/assets/appearance-settings-page-BcXr0vHp.js +1 -0
  10. package/dist/assets/{arc-DBRedCax.js → arc-Cu6Ols44.js} +1 -1
  11. package/dist/assets/architecture-TIHT7OUA-CLjV_xu4.js +1 -0
  12. package/dist/assets/{architectureDiagram-ZJ3FMSHR-Dufhtuv-.js → architectureDiagram-ZJ3FMSHR-DrNB0eLE.js} +1 -1
  13. package/dist/assets/{blockDiagram-677ZJIJ3-BUk0vtJ7.js → blockDiagram-677ZJIJ3-08rHt6DJ.js} +1 -1
  14. package/dist/assets/{book-open-CmRdT3N1.js → book-open-ClbJmmxP.js} +1 -1
  15. package/dist/assets/{c4Diagram-LMCZKHZV-CxDcVE9p.js → c4Diagram-LMCZKHZV-CCVgRG-u.js} +1 -1
  16. package/dist/assets/{card-CdRBL1E0.js → card-BdC01NFF.js} +1 -1
  17. package/dist/assets/channel-BgpbPyEH.js +1 -0
  18. package/dist/assets/channels-list-page-BrIvJlop.js +8 -0
  19. package/dist/assets/chunk-2Q5K7J3B-DjhMPqAC.js +1 -0
  20. package/dist/assets/{chunk-32BRIVSS-DSF3KElA.js → chunk-32BRIVSS-BeCaI-JN.js} +1 -1
  21. package/dist/assets/{chunk-52WLFC77-Costxzr3.js → chunk-52WLFC77-ZXIcYPYs.js} +1 -1
  22. package/dist/assets/{chunk-5FCAYU7R-rhqzGGZo.js → chunk-5FCAYU7R-DDwTPcy8.js} +1 -1
  23. package/dist/assets/{chunk-5HE753X5-BsEsmIao.js → chunk-5HE753X5-WygrMYPL.js} +1 -1
  24. package/dist/assets/{chunk-5JV3BV7I-Dqw_DCoN.js → chunk-5JV3BV7I-o8T3KZgk.js} +1 -1
  25. package/dist/assets/{chunk-5TONJI2A-Cft82fp8.js → chunk-5TONJI2A-BKFbUT7J.js} +1 -1
  26. package/dist/assets/{chunk-5VM5RSS4-DqNHn9Dl.js → chunk-5VM5RSS4-DYxCRV86.js} +1 -1
  27. package/dist/assets/{chunk-7BUUIJ7U-A5SBEMYY.js → chunk-7BUUIJ7U-CvSeJlKZ.js} +1 -1
  28. package/dist/assets/{chunk-BIQX33UG-1Ng3mTrH.js → chunk-BIQX33UG-BhH3RHCY.js} +1 -1
  29. package/dist/assets/{chunk-C7G6YPKG-DRJEy8ZI.js → chunk-C7G6YPKG-BTL0-xL3.js} +1 -1
  30. package/dist/assets/{chunk-CQNSW5MT-Bydv_J3J.js → chunk-CQNSW5MT-DWAU4QaD.js} +1 -1
  31. package/dist/assets/{chunk-CYSBUYHQ-HkMIg12u.js → chunk-CYSBUYHQ-B7ZBMXTx.js} +1 -1
  32. package/dist/assets/{chunk-EMLP6XTP-C5ndDvm3.js → chunk-EMLP6XTP-D92HvnHE.js} +1 -1
  33. package/dist/assets/{chunk-EX3LRPZG-DzeloZRo.js → chunk-EX3LRPZG-DfOGKwW8.js} +1 -1
  34. package/dist/assets/{chunk-FWX5IMBZ-n_2_CLTQ.js → chunk-FWX5IMBZ-DUuJUrXJ.js} +2 -2
  35. package/dist/assets/{chunk-HOUHSVGY-kx_slvu3.js → chunk-HOUHSVGY-i3MDyUY5.js} +1 -1
  36. package/dist/assets/{chunk-ICXQ74PX-sQLMURqL.js → chunk-ICXQ74PX-F_pmNX6t.js} +1 -1
  37. package/dist/assets/{chunk-JG7HCLWE-CMUn5Elc.js → chunk-JG7HCLWE-DygOelrU.js} +1 -1
  38. package/dist/assets/{chunk-JWPE2WC7-Cra3s-Uk.js → chunk-JWPE2WC7-BpiZMeRl.js} +1 -1
  39. package/dist/assets/{chunk-MOJQB5TN-umcrg5Bi.js → chunk-MOJQB5TN-CV10sB1I.js} +1 -1
  40. package/dist/assets/{chunk-MOZMSUNE-BnljD1ig.js → chunk-MOZMSUNE-Cf1WZNm0.js} +1 -1
  41. package/dist/assets/{chunk-OGEWGWER-BXx5pQjU.js → chunk-OGEWGWER-DuSw54VR.js} +1 -1
  42. package/dist/assets/{chunk-OSBZ3O6U-D-1qfdWu.js → chunk-OSBZ3O6U-_rt_XKSZ.js} +1 -1
  43. package/dist/assets/{chunk-PUDLZKDR-DLzX78LC.js → chunk-PUDLZKDR-BFPaAGNW.js} +1 -1
  44. package/dist/assets/{chunk-Q4XR5HBZ-DTK-rtW6.js → chunk-Q4XR5HBZ-GE0v_E5y.js} +1 -1
  45. package/dist/assets/{chunk-QBLGF6JB-CsFeIGfr.js → chunk-QBLGF6JB-BK_FpnlJ.js} +1 -1
  46. package/dist/assets/{chunk-R7FJI6CG-4xNYUeng.js → chunk-R7FJI6CG-CpYh6rGo.js} +1 -1
  47. package/dist/assets/{chunk-RYQCIY6F-DJiHiTE5.js → chunk-RYQCIY6F-htnxL_Cl.js} +1 -1
  48. package/dist/assets/{chunk-U6XO7XAA-BVYkauHz.js → chunk-U6XO7XAA-wDbE4BZ7.js} +1 -1
  49. package/dist/assets/{chunk-V7JOEXUC-BsazE8cS.js → chunk-V7JOEXUC-DDRSVFTB.js} +1 -1
  50. package/dist/assets/chunk-VAUOI2AC-GYimZYx9.js +1 -0
  51. package/dist/assets/{chunk-VR4S4FIN-7RoZQffO.js → chunk-VR4S4FIN-COdhHR1o.js} +1 -1
  52. package/dist/assets/{chunk-WYO6CB5R-DEuS6N1R.js → chunk-WYO6CB5R-DPDGhyF6.js} +3 -3
  53. package/dist/assets/chunk-XXDRQBXY-KKCf0HV5.js +1 -0
  54. package/dist/assets/{chunk-YOTPTUD7-9KBrosZL.js → chunk-YOTPTUD7-D8ir9Nx5.js} +1 -1
  55. package/dist/assets/{chunk-ZGVPDNZ5-IYgN9f5A.js → chunk-ZGVPDNZ5-BuNKD836.js} +1 -1
  56. package/dist/assets/{chunk-ZIRB5QZD-BUo0-zcp.js → chunk-ZIRB5QZD-DyHzq8jH.js} +1 -1
  57. package/dist/assets/{circle-dashed-HOgt3gIJ.js → circle-dashed-nDaMRmP-.js} +1 -1
  58. package/dist/assets/classDiagram-OUVF2IWQ-iRMPRR8M.js +1 -0
  59. package/dist/assets/classDiagram-v2-EOCWNBFH-BguFy_wj.js +1 -0
  60. package/dist/assets/{client-DKKbdJ6Q.js → client-DlFB5dW5.js} +1 -1
  61. package/dist/assets/config-split-page-C06fU9OQ.js +1 -0
  62. package/dist/assets/confirm-dialog-DpcmlXhd.js +1 -0
  63. package/dist/assets/{app-presenter-provider-jNGlmBLe.css → context-menu-DEcVZfaU.css} +1 -1
  64. package/dist/assets/context-menu-DKIEaY7f.js +211 -0
  65. package/dist/assets/{cose-bilkent-JH36ORCC-DhqbC1fR.js → cose-bilkent-JH36ORCC-B1I1_P6a.js} +1 -1
  66. package/dist/assets/{createLucideIcon-DE0sB9Nu.js → createLucideIcon-Lnt-4LMC.js} +1 -1
  67. package/dist/assets/cynefin-VYW2F7L2-CtbjXuCW.js +1 -0
  68. package/dist/assets/{cynefinDiagram-TSTJHNR4-C-TBRi5V.js → cynefinDiagram-TSTJHNR4-DcOnhnCo.js} +1 -1
  69. package/dist/assets/{dagre-VKFMJZFB-BmafJymp.js → dagre-VKFMJZFB-hAX89lg3.js} +1 -1
  70. package/dist/assets/{dagre-CrgsRasE.js → dagre-nSYhf9yY.js} +1 -1
  71. package/dist/assets/{desktop-capabilities-page-B9-B9k1A.js → desktop-capabilities-page-DPORyZAu.js} +1 -1
  72. package/dist/assets/desktop-update-config-BMTeWZmn.js +1 -0
  73. package/dist/assets/{diagram-FQU43EPY-BoOMwa6D.js → diagram-FQU43EPY-C1mRMD2k.js} +1 -1
  74. package/dist/assets/{diagram-G47NLZAW-Le7N6Uym.js → diagram-G47NLZAW-D2XBn5al.js} +1 -1
  75. package/dist/assets/{diagram-NH7WQ7WH-Fbpj3-MO.js → diagram-NH7WQ7WH-3LmRsmkC.js} +1 -1
  76. package/dist/assets/{diagram-OA4YK3LP-D3QuGGuu.js → diagram-OA4YK3LP-CFWn-osC.js} +1 -1
  77. package/dist/assets/{diagram-WEI45ONY-Cxu1uiN6.js → diagram-WEI45ONY-BqNRbUvU.js} +1 -1
  78. package/dist/assets/dialog-BNXSPMX_.js +1 -0
  79. package/dist/assets/dist-Cuiqqp1O.js +41 -0
  80. package/dist/assets/doc-browser-CDEapjmj.js +1 -0
  81. package/dist/assets/{doc-browser-context-ClLgMbxd.js → doc-browser-context-0QDWYorh.js} +1 -1
  82. package/dist/assets/{docx-preview-CkU2psnd.js → docx-preview-CunAATyC.js} +1 -1
  83. package/dist/assets/{download-CKqS1Ksj.js → download-f_sPcoLZ.js} +1 -1
  84. package/dist/assets/{ebnfDiagram-CCIWWBDH-CCAjuQM6.js → ebnfDiagram-CCIWWBDH-CYb8IwqD.js} +1 -1
  85. package/dist/assets/{erDiagram-Q63AITRT-BuzUAq-d.js → erDiagram-Q63AITRT-H47mUoeK.js} +1 -1
  86. package/dist/assets/eventmodeling-45OFAUF4-Djd6id_u.js +1 -0
  87. package/dist/assets/extensions-B-0xQz3L.js +1 -0
  88. package/dist/assets/external-link-CbVlnlNy.js +1 -0
  89. package/dist/assets/flowDiagram-23GEKE2U-DUrsM_ZL.js +1 -0
  90. package/dist/assets/{form-actions-CCoxz33Q.js → form-actions-BoTqELHB.js} +1 -1
  91. package/dist/assets/{ganttDiagram-NO4QXBWP-cJmWVY8F.js → ganttDiagram-NO4QXBWP-hSX45zfV.js} +1 -1
  92. package/dist/assets/gitGraph-TEB2WS4Q-CU6P_2Cm.js +1 -0
  93. package/dist/assets/{gitGraphDiagram-IHSO6WYX-F58o-vtP.js → gitGraphDiagram-IHSO6WYX-Br0UW2qg.js} +1 -1
  94. package/dist/assets/{i18n-OGmF0Ws_.js → i18n-B0V5NkFj.js} +2 -2
  95. package/dist/assets/inbox-Bna8iUy0.js +1 -0
  96. package/dist/assets/info-DKCQHKI2-Bj2P_7RC.js +1 -0
  97. package/dist/assets/{infoDiagram-FWYZ7A6U-Gt59b83C.js → infoDiagram-FWYZ7A6U-DQmP_67w.js} +1 -1
  98. package/dist/assets/{ishikawaDiagram-FXEZZL3T-1u4IAj1I.js → ishikawaDiagram-FXEZZL3T-BHAV2oes.js} +1 -1
  99. package/dist/assets/{journeyDiagram-5HDEW3XC-CCQsfV-5.js → journeyDiagram-5HDEW3XC-CFHax4_d.js} +1 -1
  100. package/dist/assets/{kanban-definition-HUTT4EX6-vlB6O_Zn.js → kanban-definition-HUTT4EX6-B4ZA9rp5.js} +1 -1
  101. package/dist/assets/katex-BprZ-Wwb.js +1 -0
  102. package/dist/assets/{keyboard-shortcuts-settings-page-D8rosOVh.js → keyboard-shortcuts-settings-page-BluWKrSo.js} +1 -1
  103. package/dist/assets/{line-D_bHubTL.js → line-BboM0HLF.js} +1 -1
  104. package/dist/assets/{linear-ChlwuS5y.js → linear-4K_M1oYM.js} +1 -1
  105. package/dist/assets/login-page-BMHW0Hh0.js +1 -0
  106. package/dist/assets/{login-page-BT3GV3Sb.js → login-page-JNr5JCEw.js} +1 -1
  107. package/dist/assets/main-BCX_Untx.css +1 -0
  108. package/dist/assets/main-C5kbmGUV.js +2 -0
  109. package/dist/assets/main-i18n-catalog.config-DO4wNT7T.js +1 -0
  110. package/dist/assets/{map-oGHTsIu8.js → map-26GpO1wn.js} +1 -1
  111. package/dist/assets/mcp-marketplace-page-CV-PHKTN.js +1 -0
  112. package/dist/assets/{mermaid-parser.core-CuRe1ZG4.js → mermaid-parser.core-BTJFnvRC.js} +2 -2
  113. package/dist/assets/{mermaid.core-u4YCFKRf.js → mermaid.core-B7ufoXgq.js} +3 -3
  114. package/dist/assets/{mindmap-definition-LN4V7U3C-DeJAQYTu.js → mindmap-definition-LN4V7U3C-BHyru6KE.js} +1 -1
  115. package/dist/assets/model-config-page-C-wbM6Fe.js +1 -0
  116. package/dist/assets/{navigation-link-DC-Pku0Y.js → navigation-link-DFLSVIut.js} +2 -2
  117. package/dist/assets/{ordinal-C6JFfkKN.js → ordinal-BqFe2ePF.js} +1 -1
  118. package/dist/assets/packet-7NZHBO7P-ti5ge2jr.js +1 -0
  119. package/dist/assets/panel-app-CSQmm_7E.js +1 -0
  120. package/dist/assets/panel-app-i18n-catalog.config-Bo52dPuF.js +1 -0
  121. package/dist/assets/panelStandalone-PuuMF65O.js +2 -0
  122. package/dist/assets/panelStandalone-XRlWxbRS.css +1 -0
  123. package/dist/assets/{pegDiagram-2B236MQR-nVMkxShH.js → pegDiagram-2B236MQR-PVTatU5j.js} +1 -1
  124. package/dist/assets/pie-RZYD4A2V-Bnep8TyV.js +1 -0
  125. package/dist/assets/{pieDiagram-ENE6RG2P-8aUH44QZ.js → pieDiagram-ENE6RG2P-CGc-QCc7.js} +1 -1
  126. package/dist/assets/plus-CywSlIbG.js +1 -0
  127. package/dist/assets/privacy-settings-page-CPdEiouE.js +1 -0
  128. package/dist/assets/projects-D_cd_t4G.js +1 -0
  129. package/dist/assets/provider-models-XRArsply.js +1 -0
  130. package/dist/assets/provider-scoped-model-input-C8JI-hus.js +1 -0
  131. package/dist/assets/providers-config-page-fyMlVgvq.js +1 -0
  132. package/dist/assets/puzzle-Bk3ud1KI.js +1 -0
  133. package/dist/assets/pwa-Cx6Fnox4.js +1 -0
  134. package/dist/assets/{quadrantDiagram-ABIIQ3AL-EY8hpFv8.js → quadrantDiagram-ABIIQ3AL-DGL36riv.js} +1 -1
  135. package/dist/assets/radar-I7S5WNFK-BYg-icAP.js +1 -0
  136. package/dist/assets/railroad-3IZDKUUU-_CHO-Fi1.js +1 -0
  137. package/dist/assets/railroad-abnf-AHOZXSZD-hbQDevHe.js +1 -0
  138. package/dist/assets/railroad-ebnf-EBAXGLYW-v4RZkOfi.js +1 -0
  139. package/dist/assets/railroad-peg-LSFZ7HO6-bC9BqkI5.js +1 -0
  140. package/dist/assets/{railroadDiagram-RFXS5EU6-CNhcIeji.js → railroadDiagram-RFXS5EU6-CyNwvhSb.js} +1 -1
  141. package/dist/assets/{refresh-cw-BG8VfcdA.js → refresh-cw-Ca2napNx.js} +1 -1
  142. package/dist/assets/remote-D5MBQNZE.js +1 -0
  143. package/dist/assets/{requirementDiagram-TGXJPOKE-D8Dcs-Rt.js → requirementDiagram-TGXJPOKE-C31NMKJ0.js} +1 -1
  144. package/dist/assets/{rotate-cw-DPEegUU2.js → rotate-cw-DXg7sNUE.js} +1 -1
  145. package/dist/assets/runtime-config-page--ivCxBT4.js +1 -0
  146. package/dist/assets/{sankeyDiagram-HTMAVEWB-HTrb6aa-.js → sankeyDiagram-HTMAVEWB-CwrQ_7PA.js} +1 -1
  147. package/dist/assets/{save-CPlctBjT.js → save-DNigywZ9.js} +1 -1
  148. package/dist/assets/search-U9C0oTQJ.js +1 -0
  149. package/dist/assets/search-config-page-Bdx_RR1q.js +1 -0
  150. package/dist/assets/secrets-config-page-CvMIcsfJ.js +3 -0
  151. package/dist/assets/security-config-CQmMqQ8v.js +1 -0
  152. package/dist/assets/select-DxwDeKUR.js +1 -0
  153. package/dist/assets/{sequenceDiagram-DBY2YBRQ-6f_4X16Y.js → sequenceDiagram-DBY2YBRQ-EFD482_y.js} +1 -1
  154. package/dist/assets/service-apps-panel-CiYO1Be4.js +1 -0
  155. package/dist/assets/{settings-2-CrGx9_De.js → settings-2-BrBUdRoY.js} +1 -1
  156. package/dist/assets/{sizeCapture-X5ZJPWSS-Ck9rsuwL.js → sizeCapture-X5ZJPWSS-TDvULTE1.js} +1 -1
  157. package/dist/assets/{src-C8AUg09O.js → src-CI2AvEMj.js} +1 -1
  158. package/dist/assets/{stateDiagram-2N3HPSRC-Cm33MLHu.js → stateDiagram-2N3HPSRC-JdPsIYHo.js} +1 -1
  159. package/dist/assets/stateDiagram-v2-6OUMAXLB-4_aAQfB_.js +1 -0
  160. package/dist/assets/{status-dot-Cb8ewlUr.js → status-dot-BbGsrkIX.js} +1 -1
  161. package/dist/assets/{swimlanes-5IMT3BWC-B107vmvM.js → swimlanes-5IMT3BWC-BnxpKeK_.js} +2 -2
  162. package/dist/assets/swimlanesDiagram-G3AALYLV-wCqfwsw-.js +8 -0
  163. package/dist/assets/tag-chip-BDbxcf6P.js +1 -0
  164. package/dist/assets/theme-provider-D98XGa-c.js +1 -0
  165. package/dist/assets/{timeline-definition-FHXFAJF6-CJEoAj33.js → timeline-definition-FHXFAJF6-2IL22-uC.js} +1 -1
  166. package/dist/assets/trash-2-DwSkRfeB.js +1 -0
  167. package/dist/assets/treeView-QDETBFTQ-BAyOb14Z.js +1 -0
  168. package/dist/assets/treemap-6X3UGDF4-DgPDM0zS.js +1 -0
  169. package/dist/assets/{use-config-BM5jC65L.js → use-config-D3cNzk2k.js} +1 -1
  170. package/dist/assets/{use-desktop-capabilities-ezKJwKqg.js → use-desktop-capabilities-D7odgaTB.js} +1 -1
  171. package/dist/assets/use-viewport-layout-BANU5E1t.js +1 -0
  172. package/dist/assets/{vennDiagram-L72KCM5P-DzsUHk5I.js → vennDiagram-L72KCM5P-Cjf6n5Va.js} +1 -1
  173. package/dist/assets/wardley-OPB4EBWU-eCElh8z5.js +1 -0
  174. package/dist/assets/{wardleyDiagram-EHGQE667-1NfFs5ua.js → wardleyDiagram-EHGQE667-yv4qKbBO.js} +1 -1
  175. package/dist/assets/x-BqGj6_Vq.js +1 -0
  176. package/dist/assets/{xychartDiagram-FW5EYKEG-Ci8AI3Qo.js → xychartDiagram-FW5EYKEG-Bmp8Ck8X.js} +1 -1
  177. package/dist/index.html +43 -106
  178. package/dist/panel-standalone.html +18 -12
  179. package/index.html +15 -66
  180. package/package.json +5 -5
  181. package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -2
  182. package/src/app/configs/app-navigation.config.ts +7 -2
  183. package/src/app/styles/design-system.css +85 -1
  184. package/src/app/styles/island-theme.css +8 -6
  185. package/src/features/agents/components/agent-details-dialog.tsx +5 -3
  186. package/src/features/app-data/components/app-retained-data-section.tsx +2 -2
  187. package/src/features/apps/components/__tests__/app-marketplace-catalog.test.tsx +2 -2
  188. package/src/features/apps/components/__tests__/app-packages-panel.test.tsx +94 -23
  189. package/src/features/apps/components/__tests__/apps-panel.test.tsx +5 -3
  190. package/src/features/apps/components/app-document-access-section.tsx +17 -14
  191. package/src/features/apps/components/app-marketplace-catalog.tsx +66 -39
  192. package/src/features/apps/components/app-marketplace-cover.tsx +5 -2
  193. package/src/features/apps/components/app-marketplace-detail.tsx +9 -6
  194. package/src/features/apps/components/app-marketplace-operation.tsx +8 -3
  195. package/src/features/apps/components/app-marketplace-panel.tsx +168 -0
  196. package/src/features/apps/components/app-package-card.tsx +224 -147
  197. package/src/features/apps/components/app-package-details-dialog.tsx +103 -0
  198. package/src/features/apps/components/app-packages-panel.tsx +159 -144
  199. package/src/features/apps/components/apps-panel.tsx +40 -11
  200. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -1
  201. package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
  202. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +2 -2
  203. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +9 -7
  204. package/src/features/chat/features/conversation/components/floating-session-conversation.tsx +2 -3
  205. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +1 -0
  206. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-input-state.test.tsx +33 -0
  207. package/src/features/chat/features/message/components/chat-message-list.container.tsx +0 -2
  208. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +4 -6
  209. package/src/features/chat/features/message/utils/chat-message-execution-summary.utils.ts +3 -0
  210. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +2 -10
  211. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +2 -0
  212. package/src/features/chat/features/message/utils/chat-message-trigger-details.utils.ts +3 -0
  213. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +2 -1
  214. package/src/features/chat/features/session/components/session-header/chat-session-metadata-dialog.tsx +1 -1
  215. package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +2 -2
  216. package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +31 -6
  217. package/src/features/chat/features/welcome/components/chat-conversation-welcome.tsx +13 -1
  218. package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +1 -1
  219. package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +1 -1
  220. package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +56 -13
  221. package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +3 -3
  222. package/src/features/chat/features/welcome/components/chat-welcome.tsx +14 -4
  223. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-continuation.utils.test.ts +40 -0
  224. package/src/features/chat/features/welcome/utils/chat-welcome-continuation.utils.ts +21 -0
  225. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +1 -1
  226. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +5 -9
  227. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +6 -4
  228. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +27 -27
  229. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +1 -1
  230. package/src/features/chat/features/workspace/components/overview/chat-session-continuous-attention.tsx +11 -11
  231. package/src/features/chat/features/workspace/components/overview/chat-session-token-usage.tsx +15 -15
  232. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +2 -2
  233. package/src/features/chat/features/workspace/components/project-files/workspace-new-folder-tree-item.tsx +1 -1
  234. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +2 -2
  235. package/src/features/chat/features/workspace/components/session-cron-job-content.tsx +7 -4
  236. package/src/features/cron/components/cron-job-row.tsx +5 -4
  237. package/src/features/desktop-capabilities/components/desktop-authorization-dialog.tsx +5 -5
  238. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +46 -6
  239. package/src/features/inbox/components/inbox-reader-dialog.tsx +38 -29
  240. package/src/features/inbox/managers/inbox.manager.test.ts +28 -0
  241. package/src/features/inbox/managers/inbox.manager.ts +18 -4
  242. package/src/features/inbox/pages/inbox-page.test.ts +16 -5
  243. package/src/features/inbox/pages/inbox-page.tsx +37 -29
  244. package/src/features/panel-apps/components/panel-app-list-item.tsx +4 -3
  245. package/src/features/panel-apps/components/panel-app-service-action-authorization-dialog.tsx +2 -2
  246. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +5 -24
  247. package/src/features/projects/components/work/project-work-items.tsx +1 -1
  248. package/src/features/projects/pages/project-home-page.tsx +4 -2
  249. package/src/features/pwa/managers/__tests__/pwa-shell-theme.manager.test.ts +3 -3
  250. package/src/features/pwa/managers/pwa-shell-theme.manager.ts +8 -3
  251. package/src/features/right-panel-resources/components/__tests__/page-resource-icon.test.tsx +13 -2
  252. package/src/features/right-panel-resources/components/page-resource-icon.tsx +15 -7
  253. package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +1 -1
  254. package/src/features/right-panel-resources/index.ts +3 -0
  255. package/src/features/right-panel-resources/utils/__tests__/right-panel-resource-route-resolver.utils.test.ts +5 -0
  256. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +3 -2
  257. package/src/features/service-apps/components/service-action-row.tsx +4 -3
  258. package/src/features/service-apps/components/service-app-delete-dialog.tsx +2 -2
  259. package/src/features/service-apps/components/service-app-list-item.tsx +5 -4
  260. package/src/features/settings/components/config/provider-model-suggestions-panel.tsx +1 -1
  261. package/src/features/settings/pages/providers-config-page.tsx +3 -2
  262. package/src/index.css +42 -8
  263. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +9 -0
  264. package/src/platforms/mobile/components/mobile-app-shell.tsx +4 -2
  265. package/src/platforms/mobile/components/mobile-topbar.tsx +2 -2
  266. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +2 -2
  267. package/src/shared/components/path-picker/server-path-picker-dialog.tsx +5 -3
  268. package/src/shared/components/ui/__tests__/dialog.test.tsx +37 -1
  269. package/src/shared/components/ui/actions/action-feedback.ts +1 -8
  270. package/src/shared/components/ui/actions/icon-action-button.tsx +1 -1
  271. package/src/shared/components/ui/confirm-dialog.tsx +1 -2
  272. package/src/shared/components/ui/context-menu/context-menu-items.tsx +2 -2
  273. package/src/shared/components/ui/dialog.tsx +29 -7
  274. package/src/shared/components/ui/popover.tsx +14 -3
  275. package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +5 -5
  276. package/src/shared/components/ui/tooltip.tsx +2 -1
  277. package/src/shared/components/workbench/__tests__/workbench-surface.test.tsx +21 -0
  278. package/src/shared/components/workbench/workbench-surface-toolbar.tsx +4 -0
  279. package/src/shared/components/workbench/workbench-surface.tsx +5 -2
  280. package/src/shared/lib/i18n/locales/en-US/chat.json +14 -9
  281. package/src/shared/lib/i18n/locales/en-US/core.json +5 -1
  282. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +10 -5
  283. package/src/shared/lib/i18n/locales/en-US/inbox.json +1 -0
  284. package/src/shared/lib/i18n/locales/zh-CN/chat.json +14 -9
  285. package/src/shared/lib/i18n/locales/zh-CN/core.json +5 -1
  286. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +11 -6
  287. package/src/shared/lib/i18n/locales/zh-CN/inbox.json +1 -0
  288. package/src/shared/lib/theme/index.test.ts +28 -1
  289. package/src/shared/lib/theme/index.ts +14 -3
  290. package/dist/assets/account-panel-DVi_jhkG.js +0 -1
  291. package/dist/assets/api-BZvNpFOS.js +0 -20
  292. package/dist/assets/app-presenter-provider-BcYL-VNe.js +0 -124
  293. package/dist/assets/appearance-settings-page-AZNBzLmT.js +0 -1
  294. package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +0 -1
  295. package/dist/assets/channel-CpMstUPF.js +0 -1
  296. package/dist/assets/channels-list-page-eZN74FN3.js +0 -8
  297. package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +0 -1
  298. package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +0 -1
  299. package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +0 -1
  300. package/dist/assets/classDiagram-OUVF2IWQ-DFN1v3PQ.js +0 -1
  301. package/dist/assets/classDiagram-v2-EOCWNBFH-DRvglADa.js +0 -1
  302. package/dist/assets/config-split-page-BA3V6b3Q.js +0 -1
  303. package/dist/assets/confirm-dialog-8vqYZ0wy.js +0 -1
  304. package/dist/assets/context-menu-DHVVdHzN.js +0 -1
  305. package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +0 -1
  306. package/dist/assets/desktop-update-config-Cfr3IRUe.js +0 -1
  307. package/dist/assets/dialog-BUfWO8hr.js +0 -5
  308. package/dist/assets/doc-browser-w8q1j0jL.js +0 -1
  309. package/dist/assets/es2015-BiB05Sav.js +0 -41
  310. package/dist/assets/eventmodeling-45OFAUF4-ZBfVS3ZC.js +0 -1
  311. package/dist/assets/extensions-vPD4dGqt.js +0 -1
  312. package/dist/assets/eye-bKzylu3p.js +0 -1
  313. package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +0 -1
  314. package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +0 -1
  315. package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +0 -1
  316. package/dist/assets/katex-B4FQSo9k.js +0 -1
  317. package/dist/assets/loader-circle-Clq1Gtb1.js +0 -1
  318. package/dist/assets/login-page-DKId3By8.js +0 -1
  319. package/dist/assets/main-bEWCGDHr.js +0 -2
  320. package/dist/assets/main-i18n-catalog.config-Bpu5GcwF.js +0 -1
  321. package/dist/assets/main-kqMRTwOs.css +0 -1
  322. package/dist/assets/mcp-marketplace-page-CZIP6j3L.js +0 -1
  323. package/dist/assets/model-config-page-D21a-BO0.js +0 -1
  324. package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +0 -1
  325. package/dist/assets/panel-app-BYfQu_TS.js +0 -1
  326. package/dist/assets/panel-app-i18n-catalog.config-D44qmtfk.js +0 -1
  327. package/dist/assets/panelStandalone-BRg7B1EI.css +0 -1
  328. package/dist/assets/panelStandalone-CX8X2hjh.js +0 -2
  329. package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +0 -1
  330. package/dist/assets/privacy-settings-page-e0LFHZJm.js +0 -1
  331. package/dist/assets/projects-Rki7Fmth.js +0 -1
  332. package/dist/assets/provider-models-DFQgF4hS.js +0 -1
  333. package/dist/assets/provider-scoped-model-input-DaONL0j_.js +0 -1
  334. package/dist/assets/providers-config-page-CEOhQlMe.js +0 -1
  335. package/dist/assets/puzzle-D_TiFXOv.js +0 -1
  336. package/dist/assets/pwa-C9ac_1dg.js +0 -1
  337. package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +0 -1
  338. package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +0 -1
  339. package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +0 -1
  340. package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +0 -1
  341. package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +0 -1
  342. package/dist/assets/remote-DkSx5x4R.js +0 -1
  343. package/dist/assets/runtime-config-page-DDT1dVLt.js +0 -1
  344. package/dist/assets/search-config-page-CDwmd6eX.js +0 -1
  345. package/dist/assets/secrets-config-page-1OvgmwPv.js +0 -3
  346. package/dist/assets/security-config-Pv4CM-kw.js +0 -1
  347. package/dist/assets/select-Y9IEbx9x.js +0 -1
  348. package/dist/assets/service-apps-panel-DPrLeF3N.js +0 -1
  349. package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +0 -1
  350. package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +0 -8
  351. package/dist/assets/tag-chip-D-6aPuuh.js +0 -1
  352. package/dist/assets/theme-provider-BjF1Eowc.js +0 -1
  353. package/dist/assets/trash-2-DER2EJKK.js +0 -1
  354. package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +0 -1
  355. package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +0 -1
  356. package/dist/assets/use-viewport-layout-vmbQUNT6.js +0 -1
  357. package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +0 -1
  358. package/dist/assets/x-DSz9cGhy.js +0 -1
  359. package/src/features/apps/components/app-marketplace-dialog.tsx +0 -168
  360. /package/dist/assets/{array-BV9OtnO8.js → array-DstOKG9P.js} +0 -0
  361. /package/dist/assets/{chunk-KEIR6QF5-Cx-8EJ4_.js → chunk-KEIR6QF5-0TA8nwgf.js} +0 -0
  362. /package/dist/assets/{chunk-Y2CYZVJY-Dy1ufvjf.js → chunk-Y2CYZVJY-rfGCG6pM.js} +0 -0
  363. /package/dist/assets/{config-hints-DbmiyTKg.js → config-hints-BfGoD7-o.js} +0 -0
  364. /package/dist/assets/{cytoscape.esm-CSCjuT4Z.js → cytoscape.esm-DdIcNEda.js} +0 -0
  365. /package/dist/assets/{defaultLocale-DWTiNsbT.js → defaultLocale-CzXix2iJ.js} +0 -0
  366. /package/dist/assets/{dist-BVCSkfWY.js → dist-D5dwMwKA.js} +0 -0
  367. /package/dist/assets/{graphlib-B1yb1Wl8.js → graphlib-BKOe0eFe.js} +0 -0
  368. /package/dist/assets/{host-capabilities-DuIFVsvM.js → host-capabilities-CnSVTaot.js} +0 -0
  369. /package/dist/assets/{init-BF6GH5oe.js → init-OCFb3zgY.js} +0 -0
  370. /package/dist/assets/{jszip.min-D12teKzP.js → jszip.min-B2uhSxvV.js} +0 -0
  371. /package/dist/assets/{katex-CsAM73R9.js → katex-dBrYsE7B.js} +0 -0
  372. /package/dist/assets/{middleware-B--6mAUM.js → middleware-CAXxl-af.js} +0 -0
  373. /package/dist/assets/{path-C56XkznJ.js → path-T5eoIRSJ.js} +0 -0
  374. /package/dist/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  375. /package/dist/assets/{rough.esm-CGfeEbtE.js → rough.esm-DmGXmZEB.js} +0 -0
  376. /package/dist/assets/{xlsx-sds5nUpL.js → xlsx-CoYacou7.js} +0 -0
@@ -1,10 +1,10 @@
1
1
  import { useEffect, useMemo, useRef, useState, type FormEvent } from 'react';
2
2
  import type { AppDataEntry, AppPackageOperationView, AppPackageView } from '@nextclaw/client-sdk';
3
- import { LoaderCircle, PackagePlus, RefreshCw, ShieldCheck, Store } from 'lucide-react';
3
+ import { LoaderCircle, PackagePlus, RefreshCw, ShieldCheck } from 'lucide-react';
4
4
  import { AppArtwork } from '@/features/apps/components/app-artwork';
5
5
  import type { PanelAppEntryView } from '@/shared/lib/api';
6
6
  import { useAppPresenter } from '@/app/components/app-presenter-provider';
7
- import { AppMarketplaceDialog } from '@/features/apps/components/app-marketplace-dialog';
7
+ import { AppMarketplacePanel } from '@/features/apps/components/app-marketplace-panel';
8
8
  import { AppPackageCard } from '@/features/apps/components/app-package-card';
9
9
  import { AppRetainedDataSection, useAppData } from '@/features/app-data';
10
10
  import {
@@ -15,11 +15,8 @@ import {
15
15
  isAppPackageOperationActive,
16
16
  type AppPackageMutationInput,
17
17
  } from '@/features/apps/hooks/use-app-packages';
18
- import {
19
- useGrantPanelAppClient,
20
- usePanelApps,
21
- useRecordPanelAppOpened,
22
- } from '@/features/panel-apps';
18
+ import { useGrantPanelAppClient, usePanelApps, useRecordPanelAppOpened } from '@/features/panel-apps';
19
+ import { IconActionButton } from '@/shared/components/ui/actions/icon-action-button';
23
20
  import { Button } from '@/shared/components/ui/button';
24
21
  import {
25
22
  Dialog,
@@ -35,9 +32,15 @@ import { t } from '@/shared/lib/i18n';
35
32
 
36
33
  export function AppPackagesPanel({
37
34
  focusedPackageId,
35
+ marketplaceActive = false,
36
+ onBrowseMarketplace,
37
+ onManagePackage,
38
38
  onOpenPanelApp,
39
39
  }: {
40
40
  focusedPackageId?: string;
41
+ marketplaceActive?: boolean;
42
+ onBrowseMarketplace: () => void;
43
+ onManagePackage: (appId: string) => void;
41
44
  onOpenPanelApp: (entry: PanelAppEntryView) => void;
42
45
  }) {
43
46
  const appPackages = useAppPackages();
@@ -49,14 +52,11 @@ export function AppPackagesPanel({
49
52
  const grantClient = useGrantPanelAppClient();
50
53
  const presenter = useAppPresenter();
51
54
  const libraryTitleRef = useRef<HTMLHeadingElement>(null);
55
+ const addButtonRef = useRef<HTMLButtonElement>(null);
52
56
  const [installOpen, setInstallOpen] = useState(false);
53
57
  const [installSource, setInstallSource] = useState('');
54
- const [marketplaceOpen, setMarketplaceOpen] = useState(false);
55
58
 
56
- const operations = useMemo(
57
- () => appPackageOperations.data?.entries ?? [],
58
- [appPackageOperations.data?.entries],
59
- );
59
+ const operations = useMemo(() => appPackageOperations.data?.entries ?? [], [appPackageOperations.data?.entries]);
60
60
 
61
61
  useEffect(() => {
62
62
  if (!focusedPackageId || appPackages.isLoading) return;
@@ -83,12 +83,14 @@ export function AppPackagesPanel({
83
83
  if (entry.clientDeclared && !entry.clientGranted) {
84
84
  const allowed = await presenter.serviceActionAuthorizationManager.requestAuthorization({
85
85
  panelAppId: entry.appId,
86
- actions: [{
87
- actionId: 'nextclaw.client',
88
- actionTitle: t('panelAppsClientGrantTitle'),
89
- actionDescription: t('panelAppsClientGrantDescription'),
90
- risk: 'dangerous',
91
- }],
86
+ actions: [
87
+ {
88
+ actionId: 'nextclaw.client',
89
+ actionTitle: t('panelAppsClientGrantTitle'),
90
+ actionDescription: t('panelAppsClientGrantDescription'),
91
+ risk: 'dangerous',
92
+ },
93
+ ],
92
94
  });
93
95
  if (!allowed) return;
94
96
  await grantClient.mutateAsync(entry.appId);
@@ -118,60 +120,31 @@ export function AppPackagesPanel({
118
120
  };
119
121
 
120
122
  return (
121
- <div className="@container flex h-full min-h-0 flex-col bg-card text-card-foreground">
122
- <div className="flex min-h-12 shrink-0 items-center justify-end gap-1 border-b border-border/70 px-4 py-2">
123
- <button
124
- type="button"
125
- onClick={refetch}
126
- className="rounded-full p-2 text-muted-foreground transition-colors hover:bg-[var(--interaction-hover)] hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
127
- title={t('appPackagesRefresh')}
128
- aria-label={t('appPackagesRefresh')}
129
- >
130
- <RefreshCw className="h-3.5 w-3.5" />
131
- </button>
132
- <Button
133
- type="button"
134
- size="sm"
135
- variant="outline"
136
- onClick={() => {
137
- lifecycle.reset();
138
- setMarketplaceOpen(true);
139
- }}
140
- >
141
- <Store className="mr-1.5 h-3.5 w-3.5" />
142
- {t('appPackagesBrowse')}
143
- </Button>
144
- <Button
145
- type="button"
146
- size="sm"
147
- variant="outline"
148
- onClick={() => {
149
- lifecycle.reset();
150
- setInstallOpen(true);
151
- }}
152
- >
153
- <PackagePlus className="mr-1.5 h-3.5 w-3.5" />
154
- {t('appPackagesInstall')}
155
- </Button>
156
- </div>
157
-
158
- <div className="custom-scrollbar min-h-0 flex-1 overflow-y-auto">
159
- <div className="mx-auto w-full max-w-3xl p-3 sm:p-5">
160
- <div className="mb-4 px-1">
161
- <h1
162
- ref={libraryTitleRef}
163
- tabIndex={-1}
164
- className="text-base font-semibold tracking-tight text-foreground"
165
- >
123
+ <div className="[container-type:inline-size] flex h-full min-h-0 flex-col bg-card text-card-foreground">
124
+ <div hidden={marketplaceActive} className={marketplaceActive ? 'hidden' : 'custom-scrollbar min-h-0 flex-1 overflow-y-auto'}>
125
+ <div className="mx-auto w-full max-w-3xl px-3 py-4 [@container(min-width:28rem)]:px-5">
126
+ <div className="mb-4 flex flex-wrap items-center justify-between gap-3 px-1">
127
+ <h1 ref={libraryTitleRef} tabIndex={-1} className="text-base font-semibold tracking-tight text-foreground">
166
128
  {t('appPackagesLibraryTitle')}
167
129
  </h1>
168
- <p className="mt-1 text-xs leading-5 text-muted-foreground">
169
- {t('appPackagesLibraryDescription')}
170
- </p>
130
+ <div className="flex items-center gap-2">
131
+ <IconActionButton
132
+ icon={<RefreshCw className="h-3.5 w-3.5" />}
133
+ label={t('appPackagesRefresh')}
134
+ onClick={refetch}
135
+ />
136
+ <Button type="button" size="sm" onClick={onBrowseMarketplace}>
137
+ <PackagePlus className="mr-1.5 h-3.5 w-3.5" />
138
+ {t('appPackagesBrowse')}
139
+ </Button>
140
+ </div>
171
141
  </div>
172
142
 
173
143
  {lifecycle.isError ? (
174
- <div role="alert" className="mb-3 rounded-xl bg-destructive/8 px-3 py-2.5 text-xs leading-5 text-destructive ring-1 ring-destructive/15">
144
+ <div
145
+ role="alert"
146
+ className="mb-3 rounded-xl bg-destructive/8 px-3 py-2.5 text-xs leading-5 text-destructive ring-1 ring-destructive/15"
147
+ >
175
148
  {lifecycle.error instanceof Error ? lifecycle.error.message : t('appPackagesActionFailed')}
176
149
  </div>
177
150
  ) : null}
@@ -184,14 +157,14 @@ export function AppPackagesPanel({
184
157
  focusedPackageId={focusedPackageId}
185
158
  isLoading={appPackages.isLoading || panelApps.isLoading}
186
159
  isPending={lifecycle.isPending}
187
- mutationAppId={'appId' in (lifecycle.variables ?? {})
188
- ? (lifecycle.variables as { appId: string }).appId
189
- : undefined}
160
+ mutationAppId={
161
+ 'appId' in (lifecycle.variables ?? {}) ? (lifecycle.variables as { appId: string }).appId : undefined
162
+ }
190
163
  packages={appPackages.data?.entries ?? []}
191
164
  panelApps={panelApps.data?.entries ?? []}
192
165
  unavailablePackages={panelApps.data?.unavailablePackages ?? []}
193
166
  operations={operations}
194
- onInstall={() => setInstallOpen(true)}
167
+ onInstall={onBrowseMarketplace}
195
168
  onMutate={runMutation}
196
169
  onOpenPanelApp={(entry) => void openPanelApp(entry)}
197
170
  />
@@ -205,29 +178,40 @@ export function AppPackagesPanel({
205
178
  </div>
206
179
  </div>
207
180
 
208
- <AppMarketplaceDialog
209
- error={lifecycle.error instanceof Error ? lifecycle.error : null}
210
- hostTarget={appPackages.data?.hostTarget}
211
- installedPackages={appPackages.data?.entries ?? []}
212
- startingSource={lifecycle.variables?.action === 'install'
213
- ? lifecycle.variables.source
214
- : undefined}
215
- isStarting={lifecycle.isPending}
216
- operations={operations}
217
- open={marketplaceOpen}
218
- onOpenChange={setMarketplaceOpen}
219
- onInstall={(source, registryUrl) => runMutation({
220
- action: 'install',
221
- source,
222
- registryUrl,
223
- })}
224
- onUpdate={(appId) => runMutation({ action: 'update', appId })}
225
- />
181
+ <div hidden={!marketplaceActive} className={marketplaceActive ? 'flex min-h-0 flex-1 flex-col' : 'hidden'}>
182
+ <AppMarketplacePanel
183
+ sourceButtonRef={addButtonRef}
184
+ onCustomInstall={() => { lifecycle.reset(); setInstallOpen(true); }}
185
+ onManagePackage={onManagePackage}
186
+ error={lifecycle.error instanceof Error ? lifecycle.error : null}
187
+ hostTarget={appPackages.data?.hostTarget}
188
+ installedPackages={appPackages.data?.entries ?? []}
189
+ startingSource={lifecycle.variables?.action === 'install' ? lifecycle.variables.source : undefined}
190
+ isStarting={lifecycle.isPending}
191
+ operations={operations}
192
+ active={marketplaceActive}
193
+ onInstall={(source, registryUrl) =>
194
+ runMutation({
195
+ action: 'install',
196
+ source,
197
+ registryUrl,
198
+ })
199
+ }
200
+ onUpdate={(appId) => runMutation({ action: 'update', appId })}
201
+ />
202
+
203
+ </div>
226
204
 
227
205
  <Dialog open={installOpen} onOpenChange={setInstallOpen}>
228
- <DialogContent className="max-w-md [&>:last-child]:hidden">
206
+ <DialogContent
207
+ className="max-w-md"
208
+ onCloseAutoFocus={(event) => {
209
+ event.preventDefault();
210
+ addButtonRef.current?.focus();
211
+ }}
212
+ >
229
213
  <form onSubmit={submitInstall}>
230
- <DialogHeader>
214
+ <DialogHeader showClose={false}>
231
215
  <DialogTitle>{t('appPackagesInstallTitle')}</DialogTitle>
232
216
  <DialogDescription>{t('appPackagesInstallDescription')}</DialogDescription>
233
217
  </DialogHeader>
@@ -299,7 +283,7 @@ function AppPackageLibrary({
299
283
  }) {
300
284
  if (isLoading) {
301
285
  return (
302
- <div className="space-y-2.5" aria-label={t('appPackagesLoading')}>
286
+ <div className="divide-y divide-border/50" aria-label={t('appPackagesLoading')}>
303
287
  <Skeleton className="h-44 w-full rounded-2xl" />
304
288
  <Skeleton className="h-32 w-full rounded-2xl" />
305
289
  </div>
@@ -313,44 +297,50 @@ function AppPackageLibrary({
313
297
  );
314
298
  }
315
299
  if (packages.length === 0) {
316
- const activeInstalls = operations.filter((entry) =>
317
- entry.action === 'install' && isAppPackageOperationActive(entry.status));
300
+ const activeInstalls = operations.filter(
301
+ (entry) => entry.action === 'install' && isAppPackageOperationActive(entry.status),
302
+ );
318
303
  if (activeInstalls.length > 0) {
319
- return <div className="space-y-2.5">{activeInstalls.map((operation) => (
320
- <PendingInstallCard key={operation.id} operation={operation} />
321
- ))}</div>;
304
+ return (
305
+ <div className="divide-y divide-border/50">
306
+ {activeInstalls.map((operation) => (
307
+ <PendingInstallCard key={operation.id} operation={operation} />
308
+ ))}
309
+ </div>
310
+ );
322
311
  }
323
312
  return (
324
313
  <div className="flex flex-col items-center rounded-2xl border border-dashed border-border px-6 py-10 text-center">
325
314
  <PackagePlus className="h-7 w-7 text-muted-foreground" />
326
315
  <h2 className="mt-3 text-sm font-semibold text-foreground">{t('appPackagesEmptyTitle')}</h2>
327
- <p className="mt-1 max-w-sm text-xs leading-5 text-muted-foreground">
328
- {t('appPackagesEmptyDescription')}
329
- </p>
316
+ <p className="mt-1 max-w-sm text-xs leading-5 text-muted-foreground">{t('appPackagesEmptyDescription')}</p>
330
317
  <Button type="button" size="sm" className="mt-4" onClick={onInstall}>
331
- {t('appPackagesInstall')}
318
+ {t('appPackagesBrowse')}
332
319
  </Button>
333
320
  </div>
334
321
  );
335
322
  }
336
323
  return (
337
- <div className="space-y-2.5">
338
- {operations.filter((entry) =>
339
- entry.action === 'install' &&
340
- isAppPackageOperationActive(entry.status) &&
341
- !packages.some((appPackage) => appPackage.id === entry.appId),
342
- ).map((operation) => (
343
- <PendingInstallCard key={operation.id} operation={operation} />
344
- ))}
324
+ <div className="divide-y divide-border/50">
325
+ {operations
326
+ .filter(
327
+ (entry) =>
328
+ entry.action === 'install' &&
329
+ isAppPackageOperationActive(entry.status) &&
330
+ !packages.some((appPackage) => appPackage.id === entry.appId),
331
+ )
332
+ .map((operation) => (
333
+ <PendingInstallCard key={operation.id} operation={operation} />
334
+ ))}
345
335
  {packages.map((appPackage) => {
346
336
  const latestOperation = operations.find((entry) => entry.appId === appPackage.id);
347
- const visibleOperation = latestOperation && (
348
- isAppPackageOperationActive(latestOperation.status) ||
349
- latestOperation.status === 'failed' ||
350
- latestOperation.status === 'interrupted'
351
- )
352
- ? latestOperation
353
- : undefined;
337
+ const visibleOperation =
338
+ latestOperation &&
339
+ (isAppPackageOperationActive(latestOperation.status) ||
340
+ latestOperation.status === 'failed' ||
341
+ latestOperation.status === 'interrupted')
342
+ ? latestOperation
343
+ : undefined;
354
344
 
355
345
  return (
356
346
  <section
@@ -358,18 +348,24 @@ function AppPackageLibrary({
358
348
  id={`app-package-${appPackage.id}`}
359
349
  aria-label={appPackage.name}
360
350
  tabIndex={-1}
361
- className={focusedPackageId === appPackage.id
362
- ? 'rounded-xl outline-none ring-2 ring-primary/35 ring-offset-2 ring-offset-background'
363
- : 'rounded-xl outline-none'}
351
+ className={
352
+ focusedPackageId === appPackage.id
353
+ ? 'rounded-xl outline-none ring-2 ring-primary/35 ring-offset-2 ring-offset-background'
354
+ : 'outline-none'
355
+ }
364
356
  >
365
357
  <AppPackageCard
366
358
  appPackage={appPackage}
367
359
  unavailableMessage={unavailablePackages.find((entry) => entry.appId === appPackage.id)?.message}
368
- storageUsage={appDataEntries.find((entry) =>
369
- entry.source === 'package' &&
370
- entry.lifecycle === 'active' &&
371
- entry.appId === appPackage.id &&
372
- entry.instanceId === appPackage.instanceId)?.usage ?? appPackage.storageUsage}
360
+ storageUsage={
361
+ appDataEntries.find(
362
+ (entry) =>
363
+ entry.source === 'package' &&
364
+ entry.lifecycle === 'active' &&
365
+ entry.appId === appPackage.id &&
366
+ entry.instanceId === appPackage.instanceId,
367
+ )?.usage ?? appPackage.storageUsage
368
+ }
373
369
  storageUsageLoading={appDataLoading}
374
370
  storageUsageUnavailable={appDataUnavailable}
375
371
  panelApps={panelApps.filter((entry) => entry.packageId === appPackage.id)}
@@ -378,16 +374,20 @@ function AppPackageLibrary({
378
374
  onEnable={() => onMutate({ action: 'enable', appId: appPackage.id })}
379
375
  onDisable={() => onMutate({ action: 'disable', appId: appPackage.id })}
380
376
  onUpdate={() => onMutate({ action: 'update', appId: appPackage.id })}
381
- onRollback={(version) => onMutate({
382
- action: 'rollback',
383
- appId: appPackage.id,
384
- version,
385
- })}
386
- onUninstall={(purgeData) => onMutate({
387
- action: 'uninstall',
388
- appId: appPackage.id,
389
- purgeData,
390
- })}
377
+ onRollback={(version) =>
378
+ onMutate({
379
+ action: 'rollback',
380
+ appId: appPackage.id,
381
+ version,
382
+ })
383
+ }
384
+ onUninstall={(purgeData) =>
385
+ onMutate({
386
+ action: 'uninstall',
387
+ appId: appPackage.id,
388
+ purgeData,
389
+ })
390
+ }
391
391
  onOpenPanelApp={onOpenPanelApp}
392
392
  />
393
393
  </section>
@@ -401,7 +401,11 @@ function PendingInstallCard({ operation }: { operation: AppPackageOperationView
401
401
  const label = operation.appId ?? operation.source ?? t('appPackagesInstall');
402
402
  const progress = Math.max(4, Math.round((operation.completedSteps / operation.totalSteps) * 100));
403
403
  return (
404
- <div className="rounded-xl border border-border/60 bg-card px-4 py-3.5 shadow-[0_1px_2px_rgba(0,0,0,0.025)]" role="status" aria-live="polite">
404
+ <div
405
+ className="rounded-xl border border-border/60 bg-card px-4 py-3.5 shadow-[0_1px_2px_rgba(0,0,0,0.025)]"
406
+ role="status"
407
+ aria-live="polite"
408
+ >
405
409
  <div className="flex items-center gap-3">
406
410
  <AppArtwork name={label} />
407
411
  <div className="min-w-0 flex-1">
@@ -413,7 +417,10 @@ function PendingInstallCard({ operation }: { operation: AppPackageOperationView
413
417
  </div>
414
418
  </div>
415
419
  <div className="ml-14 mt-2 h-1 overflow-hidden rounded-full bg-muted">
416
- <div className="h-full rounded-full bg-primary transition-[width] duration-300" style={{ width: `${progress}%` }} />
420
+ <div
421
+ className="h-full rounded-full bg-primary transition-[width] duration-300"
422
+ style={{ width: `${progress}%` }}
423
+ />
417
424
  </div>
418
425
  </div>
419
426
  );
@@ -421,15 +428,23 @@ function PendingInstallCard({ operation }: { operation: AppPackageOperationView
421
428
 
422
429
  function operationProgressLabel(operation: AppPackageOperationView): string {
423
430
  switch (operation.status) {
424
- case 'queued': return t('appPackagesPreparing');
425
- case 'resolving': return t('appPackagesResolving');
426
- case 'downloading': return t('appPackagesDownloading');
427
- case 'verifying': return t('appPackagesVerifying');
428
- case 'installing': return t('appPackagesInstalling');
429
- case 'finalizing': return t('appPackagesFinalizing');
430
- case 'succeeded': return t('appPackagesCompleted');
431
+ case 'queued':
432
+ return t('appPackagesPreparing');
433
+ case 'resolving':
434
+ return t('appPackagesResolving');
435
+ case 'downloading':
436
+ return t('appPackagesDownloading');
437
+ case 'verifying':
438
+ return t('appPackagesVerifying');
439
+ case 'installing':
440
+ return t('appPackagesInstalling');
441
+ case 'finalizing':
442
+ return t('appPackagesFinalizing');
443
+ case 'succeeded':
444
+ return t('appPackagesCompleted');
431
445
  case 'failed':
432
- case 'interrupted': return operation.error ?? t('appPackagesActionFailed');
446
+ case 'interrupted':
447
+ return operation.error ?? t('appPackagesActionFailed');
433
448
  }
434
449
  }
435
450
 
@@ -1,5 +1,5 @@
1
- import { lazy, Suspense, useState } from 'react';
2
- import { AppWindow, Boxes, Server } from 'lucide-react';
1
+ import { lazy, Suspense, useEffect, useRef, useState } from 'react';
2
+ import { AppWindow, Boxes, Server, Store } from 'lucide-react';
3
3
  import type { PanelAppEntryView } from '@/shared/lib/api';
4
4
  import { AppPackagesPanel } from '@/features/apps/components/app-packages-panel';
5
5
  import { PanelAppsList } from '@/features/panel-apps';
@@ -7,7 +7,8 @@ import { loadServiceAppsPanel } from '@/features/service-apps';
7
7
  import { Tabs, TabsList, TabsTrigger } from '@/shared/components/ui/tabs';
8
8
  import { t } from '@/shared/lib/i18n';
9
9
 
10
- export type AppsPanelTab = 'apps' | 'panel-apps' | 'service-apps';
10
+ export type { RightPanelAppsTab as AppsPanelTab } from '@/features/right-panel-resources';
11
+ import type { RightPanelAppsTab as AppsPanelTab } from '@/features/right-panel-resources';
11
12
 
12
13
  const ServiceAppsPanel = lazy(async () => ({
13
14
  default: (await loadServiceAppsPanel()).ServiceAppsPanel,
@@ -23,6 +24,23 @@ export function AppsPanel({
23
24
  onOpenPanelApp: (entry: PanelAppEntryView) => void;
24
25
  }) {
25
26
  const [focusedPackageId, setFocusedPackageId] = useState<string>();
27
+ const navigationRef = useRef<HTMLElement>(null);
28
+ useEffect(() => {
29
+ const navigation = navigationRef.current;
30
+ if (!navigation) return;
31
+ const revealSelectedTab = () => {
32
+ const selected = navigation.querySelector('[aria-selected="true"]');
33
+ if (!selected) return;
34
+ const bounds = navigation.getBoundingClientRect();
35
+ const tab = selected.getBoundingClientRect();
36
+ if (tab.right > bounds.right) navigation.scrollLeft += tab.right - bounds.right + 12;
37
+ else if (tab.left < bounds.left) navigation.scrollLeft -= bounds.left - tab.left + 12;
38
+ };
39
+ revealSelectedTab();
40
+ const observer = new ResizeObserver(revealSelectedTab);
41
+ observer.observe(navigation);
42
+ return () => observer.disconnect();
43
+ }, [activeTab]);
26
44
  const changeTab = (tab: AppsPanelTab) => {
27
45
  setFocusedPackageId(undefined);
28
46
  onActiveTabChange(tab);
@@ -34,12 +52,12 @@ export function AppsPanel({
34
52
 
35
53
  return (
36
54
  <div className="flex h-full min-h-0 flex-col bg-card text-card-foreground">
37
- <nav className="shrink-0 border-b border-border/70 px-4 py-3" aria-label={t('appsTitle')}>
55
+ <nav ref={navigationRef} className="custom-scrollbar shrink-0 overflow-x-auto border-b border-border/60 px-3 py-2" aria-label={t('appsTitle')}>
38
56
  <Tabs value={activeTab} onValueChange={(value) => changeTab(value as AppsPanelTab)}>
39
- <TabsList className="grid h-auto w-full max-w-[390px] grid-cols-3 rounded-lg bg-muted/70 p-0.5">
57
+ <TabsList className="flex h-auto w-max flex-nowrap rounded-lg bg-transparent p-0.5 [&>button]:shrink-0">
40
58
  <TabsTrigger value="apps" className="min-w-0 gap-1.5 px-2 py-1.5 text-xs">
41
59
  <Boxes className="h-3.5 w-3.5 shrink-0" />
42
- <span className="truncate">{t('appsTitle')}</span>
60
+ <span>{t('appPackagesLibraryTitle')}</span>
43
61
  </TabsTrigger>
44
62
  <TabsTrigger value="panel-apps" className="min-w-0 gap-1.5 px-2 py-1.5 text-xs">
45
63
  <AppWindow className="h-3.5 w-3.5 shrink-0" />
@@ -49,19 +67,30 @@ export function AppsPanel({
49
67
  <Server className="h-3.5 w-3.5 shrink-0" />
50
68
  <span className="truncate">{t('serviceAppsTitle')}</span>
51
69
  </TabsTrigger>
70
+ <TabsTrigger value="marketplace" className="gap-1.5 px-2 py-1.5 text-xs">
71
+ <Store className="h-3.5 w-3.5 shrink-0" />
72
+ <span>{t('appPackagesMarketplaceTitle')}</span>
73
+ </TabsTrigger>
52
74
  </TabsList>
53
75
  </Tabs>
54
76
  </nav>
55
77
  <div className="min-h-0 flex-1">
56
- {activeTab === 'apps' ? (
57
- <AppPackagesPanel focusedPackageId={focusedPackageId} onOpenPanelApp={onOpenPanelApp} />
58
- ) : activeTab === 'panel-apps' ? (
78
+ <div hidden={activeTab !== 'apps' && activeTab !== 'marketplace'} className={activeTab === 'apps' || activeTab === 'marketplace' ? 'h-full' : 'hidden'}>
79
+ <AppPackagesPanel
80
+ focusedPackageId={focusedPackageId}
81
+ onOpenPanelApp={onOpenPanelApp}
82
+ marketplaceActive={activeTab === 'marketplace'}
83
+ onBrowseMarketplace={() => changeTab('marketplace')}
84
+ onManagePackage={managePackage}
85
+ />
86
+ </div>
87
+ {activeTab === 'panel-apps' ? (
59
88
  <PanelAppsList onOpenPanelApp={onOpenPanelApp} />
60
- ) : (
89
+ ) : activeTab === 'service-apps' ? (
61
90
  <Suspense fallback={null}>
62
91
  <ServiceAppsPanel onManagePackage={managePackage} />
63
92
  </Suspense>
64
- )}
93
+ ) : null}
65
94
  </div>
66
95
  </div>
67
96
  );
@@ -150,7 +150,7 @@ export function ChatConversationHeaderSection({
150
150
  ) : null
151
151
  }
152
152
  actions={
153
- <IconActionGroup>
153
+ <IconActionGroup className="[--icon-control-size:2rem] [--icon-feedback-size:1.75rem]">
154
154
  {layoutMode === "mobile" && sessionKey ? (
155
155
  <IconActionButton
156
156
  icon={<SquarePen className="h-4 w-4" />}
@@ -63,7 +63,7 @@ export function ChatConversationHeader({
63
63
  data-testid="chat-conversation-header"
64
64
  data-theme-surface="header"
65
65
  className={cn(
66
- "bg-background/80 backdrop-blur-sm flex items-center justify-between shrink-0 overflow-hidden transition-colors duration-200",
66
+ "bg-background/80 backdrop-blur-sm flex items-center justify-between gap-2 shrink-0 overflow-hidden transition-colors duration-200",
67
67
  isMobileLayout ? "px-3 sm:px-3" : "px-4 sm:px-5",
68
68
  shouldShow ? "opacity-100" : "h-0 py-0 opacity-0",
69
69
  shouldShow && (isMobileLayout ? "min-h-[var(--mobile-header-height)] pb-0.5 pt-0.5" : "h-[52px]"),
@@ -29,7 +29,7 @@ export function ChatSidebarDesktopToolbar({ onCreateSession, collapsed }: Pick<C
29
29
  }
30
30
  return <>
31
31
  <div className="px-4 pb-2">
32
- <Button variant="ghost" className="w-full rounded-lg bg-primary/10 text-primary hover:bg-primary/15" onClick={onCreateSession}>
32
+ <Button variant="ghost" className="w-full rounded-[var(--sidebar-create-radius)] [box-shadow:var(--sidebar-create-shadow)] bg-[var(--sidebar-create-background)] font-[number:var(--sidebar-create-weight)] text-[var(--sidebar-create-foreground)] hover:bg-[var(--sidebar-create-hover)] hover:text-[var(--sidebar-create-hover-foreground)]" onClick={onCreateSession}>
33
33
  <Plus className="mr-1.5 h-4 w-4" />{t('chatSidebarNewTask')}
34
34
  </Button>
35
35
  </div>
@@ -93,7 +93,7 @@ export function ChatSidebarMobileToolbar(props: ChatSidebarToolbarProps & {
93
93
  </button>
94
94
  </PopoverTrigger>
95
95
  </h1>
96
- <ChatPopoverContent align="start" className="w-48 p-1.5">
96
+ <ChatPopoverContent align="start" variant="menu">
97
97
  <div onClick={() => setViewMenuOpen(false)}>
98
98
  <ChatSessionHeaderMenuItem icon={Clock3} label={t('chatSidebarViewTime')} onClick={() => onSelectMode('time-first')} />
99
99
  <ChatSessionHeaderMenuItem icon={Folder} label={t('chatSidebarViewProject')} onClick={() => onSelectMode('project-first')} />
@@ -1,3 +1,4 @@
1
+ import { ACTION_FEEDBACK, ACTION_MENU_ITEM_CLASS } from '@/shared/components/ui/actions/action-feedback';
1
2
  import { NavLink } from "react-router-dom";
2
3
  import {
3
4
  Popover,
@@ -112,13 +113,14 @@ export function ChatSidebarUtilityMenu({
112
113
  <ChatPopoverContent
113
114
  side={collapsed ? "right" : "top"}
114
115
  align={collapsed ? "end" : "start"}
115
- className="w-64 p-2"
116
+ variant="menu"
117
+ matchTriggerWidth={!collapsed}
116
118
  >
117
- <div className="space-y-1">
119
+ <div>
118
120
  <NavLink
119
121
  to="/settings"
120
122
  onClick={() => onOpenChange(false)}
121
- className="flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-[13px] font-medium text-foreground transition-colors hover:bg-[var(--interaction-hover)] hover:text-gray-900"
123
+ className={`${ACTION_MENU_ITEM_CLASS} text-foreground ${ACTION_FEEDBACK.item}`}
122
124
  >
123
125
  <Settings className="h-4 w-4 text-muted-foreground/70" />
124
126
  <span className="flex-1 text-left">{t("settings")}</span>
@@ -134,7 +136,7 @@ export function ChatSidebarUtilityMenu({
134
136
  action();
135
137
  onOpenChange(false);
136
138
  }}
137
- className="flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-[13px] font-medium text-foreground transition-colors hover:bg-[var(--interaction-hover)] hover:text-gray-900"
139
+ className={`${ACTION_MENU_ITEM_CLASS} text-foreground ${ACTION_FEEDBACK.item}`}
138
140
  >
139
141
  <Icon className="h-4 w-4 text-muted-foreground/70" />
140
142
  <span className="flex-1 text-left">{label}</span>
@@ -142,7 +144,7 @@ export function ChatSidebarUtilityMenu({
142
144
  ))}
143
145
  </div>
144
146
 
145
- <div className="my-2 h-px bg-border" />
147
+ <div className="my-1 h-px bg-border" />
146
148
 
147
149
  <ChatSidebarUtilitySelect
148
150
  icon={Palette}
@@ -197,10 +199,10 @@ function ChatSidebarUtilitySelect<Value extends string>({
197
199
  >
198
200
  <SelectTrigger
199
201
  aria-label={label}
200
- className="h-auto w-full rounded-lg border-0 bg-transparent px-3 py-2 text-[13px] font-medium text-foreground shadow-none hover:bg-[var(--interaction-hover)] hover:text-gray-900 focus:ring-0"
202
+ className={`${ACTION_MENU_ITEM_CLASS} h-auto border-0 bg-transparent text-foreground shadow-none focus:ring-0 ${ACTION_FEEDBACK.item}`}
201
203
  indicator={<ChevronRight className="h-4 w-4 text-muted-foreground/70" />}
202
204
  >
203
- <div className="flex min-w-0 items-center gap-2.5">
205
+ <div className="flex min-w-0 items-center gap-2">
204
206
  <Icon className="h-4 w-4 shrink-0 text-muted-foreground/70" />
205
207
  <span className="text-left">{label}</span>
206
208
  </div>