@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
package/index.html CHANGED
@@ -17,7 +17,7 @@
17
17
  html,
18
18
  body,
19
19
  #root {
20
- background: #ffffff;
20
+ background: #faf8f4;
21
21
  }
22
22
 
23
23
  html[data-theme="minimal"],
@@ -80,71 +80,20 @@
80
80
  background: #fefcf6;
81
81
  }
82
82
  </style>
83
- <script>
84
- (() => {
85
- const storageKey = 'nextclaw.ui.theme';
86
- const storedTheme = window.localStorage.getItem(storageKey);
87
- const themeColors = {
88
- natural: '#FAF9F7',
89
- work: '#FFFFFF',
90
- minimal: '#FFFFFF',
91
- warm: '#FAF8F4',
92
- cool: '#F8FAFC',
93
- dawn: '#FAF7F4',
94
- graphite: '#F8F8F7',
95
- night: '#101318',
96
- charcoal: '#1C1C1C',
97
- island: '#FBF8ED',
98
- probe: '#FEFCF6'
99
- };
100
- const themeAppearances = {
101
- natural: 'light',
102
- work: 'light',
103
- minimal: 'light',
104
- warm: 'light',
105
- cool: 'light',
106
- dawn: 'light',
107
- graphite: 'light',
108
- night: 'dark',
109
- charcoal: 'dark',
110
- island: 'light',
111
- probe: 'light'
112
- };
113
- const legacyThemeAliases = {
114
- leaf: 'warm'
115
- };
116
- const normalizedStoredTheme = typeof storedTheme === 'string' && Object.prototype.hasOwnProperty.call(legacyThemeAliases, storedTheme)
117
- ? legacyThemeAliases[storedTheme]
118
- : storedTheme;
119
- const nextTheme = Object.prototype.hasOwnProperty.call(themeColors, normalizedStoredTheme)
120
- ? normalizedStoredTheme
121
- : 'work';
122
- if (storedTheme !== nextTheme) {
123
- window.localStorage.setItem(storageKey, nextTheme);
124
- }
125
- if (nextTheme === 'island') {
126
- const islandBackgroundPreload = document.createElement('link');
127
- islandBackgroundPreload.rel = 'preload';
128
- islandBackgroundPreload.as = 'image';
129
- islandBackgroundPreload.href = '/themes/island/island-atmosphere-7a037243.webp';
130
- islandBackgroundPreload.fetchPriority = 'high';
131
- document.head.appendChild(islandBackgroundPreload);
132
- }
133
- const themeColor = themeColors[nextTheme];
134
- const themeAppearance = themeAppearances[nextTheme];
135
- document.documentElement.setAttribute('data-theme', nextTheme);
136
- document.documentElement.setAttribute('data-theme-appearance', themeAppearance);
137
- document.documentElement.style.backgroundColor = themeColor;
138
- document.documentElement.style.colorScheme = themeAppearance;
139
- const themeMeta = document.querySelector('meta[name="theme-color"]');
140
- if (themeMeta) {
141
- themeMeta.setAttribute('content', themeColor);
142
- }
143
- const colorSchemeMeta = document.querySelector('meta[name="color-scheme"]');
144
- if (colorSchemeMeta) {
145
- colorSchemeMeta.setAttribute('content', themeAppearance);
146
- }
147
- })();
83
+ <script type="module">
84
+ import { initializeTheme, resolveTheme } from '/src/shared/lib/theme/index.ts';
85
+ import { pwaShellThemeManager } from '/src/features/pwa/managers/pwa-shell-theme.manager.ts';
86
+
87
+ const theme = initializeTheme();
88
+ pwaShellThemeManager.syncTheme(theme);
89
+ if (resolveTheme(theme) === 'island') {
90
+ const preload = document.createElement('link');
91
+ preload.rel = 'preload';
92
+ preload.as = 'image';
93
+ preload.href = '/themes/island/island-atmosphere-7a037243.webp';
94
+ preload.fetchPriority = 'high';
95
+ document.head.appendChild(preload);
96
+ }
148
97
  </script>
149
98
  <script>
150
99
  (() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/ui",
3
- "version": "0.26.4",
3
+ "version": "0.27.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -34,12 +34,12 @@
34
34
  "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
35
35
  "zod": "^3.23.8",
36
36
  "zustand": "^5.0.2",
37
- "@nextclaw/agent-chat": "0.3.14",
38
- "@nextclaw/client-sdk": "0.12.9",
37
+ "@nextclaw/agent-chat-ui": "0.12.1",
38
+ "@nextclaw/client-sdk": "0.12.10",
39
39
  "@nextclaw/ncp": "0.11.2",
40
- "@nextclaw/agent-chat-ui": "0.11.0",
41
- "@nextclaw/ncp-react": "0.5.30",
42
40
  "@nextclaw/ncp-http-agent-client": "0.4.25",
41
+ "@nextclaw/agent-chat": "0.3.14",
42
+ "@nextclaw/ncp-react": "0.5.30",
43
43
  "@nextclaw/ncp-toolkit": "0.6.27",
44
44
  "@nextclaw/shared": "0.8.2"
45
45
  },
@@ -29,8 +29,10 @@ describe("panel app main navigation", () => {
29
29
  describe("project home navigation", () => {
30
30
  const translate = (key: string) => key;
31
31
 
32
- it("returns project details to the project picker", () => {
33
- expect(resolveMobileRouteMeta("/projects/example/overview", translate).backTarget).toBe("/projects");
32
+ it("returns project details to their chat source instead of the project picker", () => {
33
+ expect(resolveMobileRouteMeta("/projects/example/overview", translate).backTarget).toBe("/chat");
34
+ expect(resolveMobileRouteMeta("/projects/example/overview", translate, "/chat/session-a").backTarget).toBe("/chat/session-a");
35
+ expect(resolveMobileRouteMeta("/projects/example/overview", translate, "https://example.com").backTarget).toBe("/chat");
34
36
  });
35
37
 
36
38
  it("labels scheduled tasks and returns to chat", () => {
@@ -74,6 +74,10 @@ export function isChatSessionDetailRoute(pathname: string): boolean {
74
74
  return normalized.startsWith("/chat/") && normalized !== "/chat";
75
75
  }
76
76
 
77
+ export function isInboxDetailRoute(pathname: string): boolean {
78
+ return /^\/inbox\/[^/]+\/?$/i.test(pathname);
79
+ }
80
+
77
81
  export function getMobileBottomNavItems(
78
82
  translate: Translate,
79
83
  ): AppNavigationItem[] {
@@ -207,6 +211,7 @@ export function isSettingsRoute(pathname: string): boolean {
207
211
  export function resolveMobileRouteMeta(
208
212
  pathname: string,
209
213
  translate: Translate,
214
+ returnTo?: string,
210
215
  ): {
211
216
  title: string;
212
217
  backTarget: string | null;
@@ -259,8 +264,8 @@ export function resolveMobileRouteMeta(
259
264
  if (normalized === "/projects" || normalized.startsWith("/projects/")) {
260
265
  return {
261
266
  title: translate("projectsTitle"),
262
- backTarget: normalized === "/projects" ? "/chat" : "/projects",
263
- backLabel: translate(normalized === "/projects" ? "chat" : "projectsTitle"),
267
+ backTarget: returnTo && /^\/chat(?:[/?]|$)/.test(returnTo) ? returnTo : "/chat",
268
+ backLabel: translate("chat"),
264
269
  };
265
270
  }
266
271
 
@@ -65,6 +65,8 @@
65
65
 
66
66
  /* Foreground (Text) */
67
67
  --foreground: var(--gray-800);
68
+ --welcome-title-foreground: var(--foreground);
69
+ --welcome-title-weight: 600;
68
70
  --foreground-secondary: var(--gray-700);
69
71
  --foreground-tertiary: var(--gray-500);
70
72
  --foreground-muted: var(--gray-400);
@@ -94,6 +96,13 @@
94
96
  --sidebar-interaction-hover: hsl(var(--gray-200) / 0.6);
95
97
  --sidebar-interaction-selection: hsl(var(--gray-200) / 0.8);
96
98
  --sidebar-segment-selection: hsl(var(--gray-200) / 0.7);
99
+ --sidebar-create-background: hsl(var(--primary) / 0.1);
100
+ --sidebar-create-hover: hsl(var(--primary) / 0.15);
101
+ --sidebar-create-foreground: hsl(var(--primary));
102
+ --sidebar-create-hover-foreground: hsl(var(--accent-foreground));
103
+ --sidebar-create-radius: 0.5rem;
104
+ --sidebar-create-weight: 500;
105
+ --sidebar-create-shadow: none;
97
106
  /* Mobile conversation rows retain their separate paper surface. */
98
107
  --session-interaction-hover: hsl(var(--background) / 0.65);
99
108
  --session-interaction-selection: hsl(var(--background) / 0.9);
@@ -394,7 +403,9 @@
394
403
  }
395
404
 
396
405
  @layer base {
397
- :root[data-theme="warm"] {
406
+ :root[data-theme="warm"],
407
+ :root[data-theme="plain-paper"],
408
+ :root[data-theme="paper-ink"] {
398
409
  /* ========================================
399
410
  BRAND COLORS (Paper Taupe)
400
411
  ======================================== */
@@ -466,6 +477,79 @@
466
477
  }
467
478
 
468
479
  @layer base {
480
+ :root[data-theme="paper-ink"] {
481
+ /* Warm paper and olive ink with restrained contrast. */
482
+ --brand-50: 70 15% 95%;
483
+ --brand-100: 75 13% 90%;
484
+ --brand-200: 85 12% 80%;
485
+ --brand-300: 100 10% 65%;
486
+ --brand-400: 88 13% 44%;
487
+ --brand-500: 86 14% 32%;
488
+ --brand-600: 86 15% 27%;
489
+ --brand-700: 86 15% 22%;
490
+ --brand-800: 86 13% 16%;
491
+ --brand-900: 86 11% 10%;
492
+ --primary-foreground: 42 35% 94%;
493
+ --welcome-title-foreground: 105 4% 32%;
494
+ --welcome-title-weight: 500;
495
+ --gray-700: 45 8% 27%;
496
+ --gray-800: 45 9% 18%;
497
+ --gray-900: 45 10% 11%;
498
+ --accent: 70 12% 90%;
499
+ --link-foreground: 86 16% 29%;
500
+ --link-foreground-hover: 86 16% 23%;
501
+ --sidebar-create-background: hsl(38 27% 90%);
502
+ --sidebar-create-hover: hsl(38 25% 87%);
503
+ --sidebar-create-foreground: hsl(var(--brand-500));
504
+ --sidebar-create-hover-foreground: hsl(var(--brand-600));
505
+ --sidebar-create-radius: 0.5rem;
506
+ --sidebar-create-weight: 400;
507
+ --sidebar-create-shadow: none;
508
+ }
509
+
510
+ :root[data-theme="paper-ink"] .nextclaw-chat-message-user {
511
+ background-color: hsl(var(--brand-500));
512
+ border-color: transparent;
513
+ color: hsl(var(--primary-foreground));
514
+ }
515
+
516
+ :root[data-theme="plain-paper"] {
517
+ /* Paper, tea-gray washes and soft graphite: one warm neutral family. */
518
+ --brand-50: 38 25% 95%;
519
+ --brand-100: 36 22% 91%;
520
+ --brand-200: 34 17% 83%;
521
+ --brand-300: 32 12% 70%;
522
+ --brand-400: 30 8% 51%;
523
+ --brand-500: 28 7% 35%;
524
+ --brand-600: 28 8% 29%;
525
+ --brand-700: 28 8% 24%;
526
+ --brand-800: 28 7% 18%;
527
+ --brand-900: 28 6% 12%;
528
+ --gray-700: 30 6% 28%;
529
+ --gray-800: 30 5% 22%;
530
+ --gray-900: 30 5% 14%;
531
+ --primary-foreground: 40 38% 97%;
532
+ --welcome-title-foreground: 30 5% 33%;
533
+ --welcome-title-weight: 500;
534
+ --accent: 36 20% 91%;
535
+ --border: 35 18% 86%;
536
+ --card-border: var(--border);
537
+ --input-border: var(--border);
538
+ --link-foreground: 28 18% 34%;
539
+ --link-foreground-hover: 28 18% 26%;
540
+ --sidebar-create-background: hsl(36 22% 90%);
541
+ --sidebar-create-hover: hsl(36 20% 87%);
542
+ --sidebar-create-foreground: hsl(var(--brand-600));
543
+ --sidebar-create-hover-foreground: hsl(var(--brand-700));
544
+ --sidebar-create-weight: 400;
545
+ }
546
+
547
+ :root[data-theme="plain-paper"] .nextclaw-chat-message-user {
548
+ background-color: hsl(var(--brand-100));
549
+ border-color: transparent;
550
+ color: hsl(var(--foreground));
551
+ }
552
+
469
553
  :root[data-theme="cool"] {
470
554
  /* ========================================
471
555
  BRAND COLORS (Mist Blue)
@@ -304,7 +304,7 @@
304
304
 
305
305
  :root[data-theme="island"]
306
306
  [data-theme-surface="doc-browser"]
307
- .doc-browser-tab-scrollbar {
307
+ .compact-tab-scrollbar {
308
308
  background-color: transparent;
309
309
  }
310
310
 
@@ -446,20 +446,22 @@
446
446
  :root[data-theme="island"]
447
447
  :is(
448
448
  .custom-scrollbar,
449
- .workspace-horizontal-scrollbar,
450
- .doc-browser-tab-scrollbar
449
+ .workspace-horizontal-scrollbar
451
450
  ) {
452
451
  scrollbar-color: hsl(var(--brand-400) / 0.35) transparent;
453
452
  }
454
453
 
455
454
  :root[data-theme="island"] .custom-scrollbar::-webkit-scrollbar-thumb,
456
455
  :root[data-theme="island"]
457
- .workspace-horizontal-scrollbar::-webkit-scrollbar-thumb,
458
- :root[data-theme="island"]
459
- .doc-browser-tab-scrollbar::-webkit-scrollbar-thumb {
456
+ .workspace-horizontal-scrollbar::-webkit-scrollbar-thumb {
460
457
  background: hsl(var(--brand-400) / 0.3);
461
458
  }
462
459
 
460
+ :root[data-theme="island"] .compact-tab-scrollbar {
461
+ --tab-scrollbar-thumb: hsl(var(--brand-400) / 0.3);
462
+ --tab-scrollbar-thumb-hover: hsl(var(--brand-400) / 0.4);
463
+ }
464
+
463
465
  @media (max-width: 760px) {
464
466
  :root[data-theme="island"] [data-theme-surface="app-shell"] {
465
467
  background-image: none;
@@ -74,8 +74,11 @@ export function AgentDetailsDialog({
74
74
  <Dialog open={agent !== null} onOpenChange={onOpenChange}>
75
75
  <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[720px] sm:max-w-2xl">
76
76
  <div className="shrink-0 px-5 pb-3 pt-5">
77
- <DialogHeader className="text-left">
78
- <div className="flex min-w-0 items-center gap-3 pr-7">
77
+ <DialogHeader
78
+ className="items-center"
79
+ actions={<PageResourceActionsMenu page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />}
80
+ >
81
+ <div className="flex min-w-0 items-center gap-3">
79
82
  <AgentAvatar
80
83
  agentId={agent.id}
81
84
  displayName={agent.displayName}
@@ -90,7 +93,6 @@ export function AgentDetailsDialog({
90
93
  @{agent.id}
91
94
  </DialogDescription>
92
95
  </div>
93
- <PageResourceActionsMenu page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
94
96
  </div>
95
97
  </DialogHeader>
96
98
  </div>
@@ -113,13 +113,13 @@ export function AppRetainedDataSection({
113
113
 
114
114
  <Dialog open={Boolean(selected)} onOpenChange={(open) => !open && closeDialog()}>
115
115
  <DialogContent
116
- className="max-w-md [&>:last-child]:hidden"
116
+ className="max-w-md"
117
117
  onEscapeKeyDown={(event) => deletion.isPending && event.preventDefault()}
118
118
  onInteractOutside={(event) => deletion.isPending && event.preventDefault()}
119
119
  >
120
120
  {selected ? (
121
121
  <>
122
- <DialogHeader>
122
+ <DialogHeader showClose={false}>
123
123
  <DialogTitle>{t('appDataDeleteTitle')}</DialogTitle>
124
124
  <DialogDescription>{t('appDataDeleteDescription')}</DialogDescription>
125
125
  </DialogHeader>
@@ -92,7 +92,7 @@ describe('AppMarketplaceCatalog compatibility actions', () => {
92
92
  expect(onSelect).toHaveBeenCalledWith('rust-todo');
93
93
  });
94
94
 
95
- it('does not project a persisted terminal failure back into a compatible card', () => {
95
+ it('shows the latest failure while allowing a compatible app to be installed again', () => {
96
96
  setLanguage('zh');
97
97
  const onInstall = vi.fn();
98
98
 
@@ -147,7 +147,7 @@ describe('AppMarketplaceCatalog compatibility actions', () => {
147
147
  </TooltipProvider>,
148
148
  );
149
149
 
150
- expect(screen.queryByText('persisted registry failure')).toBeNull();
150
+ expect(screen.getByRole('alert').textContent).toBe('persisted registry failure');
151
151
  expect(screen.queryByRole('button', { name: '重试' })).toBeNull();
152
152
  const installButton = screen.getByRole('button', { name: '安装应用' });
153
153
  expect((installButton as HTMLButtonElement).disabled).toBe(false);
@@ -1,3 +1,4 @@
1
+ import { useState } from 'react';
1
2
  import { act, render, screen, waitFor } from "@testing-library/react";
2
3
  import userEvent from "@testing-library/user-event";
3
4
  import type { AppPackageOperationView } from "@nextclaw/client-sdk";
@@ -303,8 +304,7 @@ vi.mock("@/features/panel-apps/hooks/use-panel-apps", () => ({
303
304
  useRecordPanelAppOpened: () => ({ mutateAsync: mocks.recordOpened }),
304
305
  }));
305
306
 
306
- describe("AppPackagesPanel", () => {
307
- beforeEach(() => {
307
+ beforeEach(() => {
308
308
  mocks.appDataError = false;
309
309
  mocks.enabled = false;
310
310
  mocks.includePackageStorageUsage = true;
@@ -331,14 +331,20 @@ describe("AppPackagesPanel", () => {
331
331
  mocks.requestAuthorization.mockResolvedValue(true);
332
332
  });
333
333
 
334
+ function PackagePanelHarness() {
335
+ const [marketplaceActive, setMarketplaceActive] = useState(false);
336
+ return <AppPackagesPanel onOpenPanelApp={mocks.onOpen} marketplaceActive={marketplaceActive} onBrowseMarketplace={() => setMarketplaceActive(true)} onManagePackage={() => setMarketplaceActive(false)} />;
337
+ }
338
+
339
+ describe("AppPackagesPanel", () => {
334
340
  it("shows a built-in package and enables it from the primary action", async () => {
335
341
  const user = userEvent.setup();
336
342
 
337
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
343
+ render(<PackagePanelHarness />);
338
344
 
339
- expect(screen.getByText("Personal Space")).toBeTruthy();
345
+ expect(screen.getAllByText("Personal Space")[0]).toBeTruthy();
340
346
  expect(screen.getByText("Available")).toBeTruthy();
341
- expect(screen.getByText("Local data service")).toBeTruthy();
347
+ expect(screen.queryByText("Local data service")).toBeNull();
342
348
 
343
349
  await user.click(screen.getByRole("button", { name: "Enable" }));
344
350
 
@@ -360,8 +366,9 @@ describe("AppPackagesPanel", () => {
360
366
  },
361
367
  ];
362
368
  const user = userEvent.setup();
363
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
369
+ render(<PackagePanelHarness />);
364
370
 
371
+ await user.click(screen.getByRole("button", { name: "Personal Space" }));
365
372
  await user.selectOptions(
366
373
  screen.getByLabelText("Access mode"),
367
374
  "read-write",
@@ -383,7 +390,7 @@ describe("AppPackagesPanel", () => {
383
390
  it("explains missing external setup and does not offer an unusable enable action", () => {
384
391
  mocks.readinessStatus = "needs-configuration";
385
392
 
386
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
393
+ render(<PackagePanelHarness />);
387
394
 
388
395
  expect(screen.getByText("Needs setup")).toBeTruthy();
389
396
  expect(screen.getByText(/Shared workspace connection/)).toBeTruthy();
@@ -397,6 +404,8 @@ describe("AppPackagesPanel", () => {
397
404
  it("scrolls and transfers focus to a package selected from Service Apps", async () => {
398
405
  render(
399
406
  <AppPackagesPanel
407
+ onBrowseMarketplace={vi.fn()}
408
+ onManagePackage={vi.fn()}
400
409
  focusedPackageId="nextclaw.personal-organizer"
401
410
  onOpenPanelApp={mocks.onOpen}
402
411
  />,
@@ -407,13 +416,16 @@ describe("AppPackagesPanel", () => {
407
416
  expect(packageCard.className).toContain("ring-2");
408
417
  });
409
418
 
410
- it("distinguishes an untouched app from an App Data query failure", () => {
419
+ it("distinguishes an untouched app from an App Data query failure in details", async () => {
420
+ const user = userEvent.setup();
411
421
  mocks.includePackageStorageUsage = false;
412
- const view = render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
422
+ const view = render(<PackagePanelHarness />);
423
+ expect(screen.queryByTitle("/tmp/data")).toBeNull();
424
+ await user.click(screen.getByRole("button", { name: "Personal Space" }));
413
425
  expect(screen.getByTitle("/tmp/data").textContent).toContain("No data yet");
414
426
 
415
427
  mocks.appDataError = true;
416
- view.rerender(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
428
+ view.rerender(<PackagePanelHarness />);
417
429
 
418
430
  expect(screen.getByTitle("/tmp/data").textContent).toContain(
419
431
  "Size unavailable",
@@ -430,27 +442,62 @@ describe("AppPackagesPanel", () => {
430
442
  };
431
443
  mocks.recordOpened.mockResolvedValue(openedEntry);
432
444
 
433
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
445
+ render(<PackagePanelHarness />);
434
446
 
435
- await user.click(screen.getByRole("button", { name: /Todos/ }));
447
+ await user.click(screen.getByRole("button", { name: "Open" }));
436
448
 
437
449
  expect(mocks.recordOpened).toHaveBeenCalledWith("todos");
438
450
  expect(mocks.onOpen).toHaveBeenCalledWith(openedEntry);
439
451
  });
440
452
 
453
+ it("opens details on demand, restores focus, and keeps disable in the menu", async () => {
454
+ const user = userEvent.setup();
455
+ mocks.enabled = true;
456
+ render(<PackagePanelHarness />);
457
+ const title = screen.getByRole("button", { name: "Personal Space" });
458
+ expect(screen.queryByText("Local data service")).toBeNull();
459
+ expect(screen.queryByRole("button", { name: "Disable" })).toBeNull();
460
+ await user.click(title);
461
+ expect(screen.getByRole("dialog")).toBeTruthy();
462
+ expect(screen.getByText("Local data service")).toBeTruthy();
463
+ await user.click(screen.getByRole("button", { name: "Close" }));
464
+ await waitFor(() => expect(document.activeElement).toBe(title));
465
+ await user.click(screen.getByRole("button", { name: "More app actions" }));
466
+ await user.click(screen.getByRole("menuitem", { name: "Disable" }));
467
+ expect(mocks.lifecycleMutate).toHaveBeenCalledWith(
468
+ { action: "disable", appId: "nextclaw.personal-organizer" },
469
+ { onSuccess: undefined },
470
+ );
471
+ });
472
+
473
+ it("offers source installation from the same add menu", async () => {
474
+ const user = userEvent.setup();
475
+ render(<PackagePanelHarness />);
476
+ await user.click(screen.getByRole("button", { name: "Add apps" }));
477
+ await user.click(screen.getByRole("button", { name: "Install from a source" }));
478
+ await user.type(screen.getByRole("textbox", { name: "Install source" }), "/tmp/example.napp");
479
+ await user.click(screen.getByRole("button", { name: "Install app" }));
480
+ expect(mocks.lifecycleMutate).toHaveBeenCalledWith(
481
+ { action: "install", source: "/tmp/example.napp" },
482
+ { onSuccess: expect.any(Function) },
483
+ );
484
+ await user.click(screen.getByRole("button", { name: "Cancel" }));
485
+ await waitFor(() => expect(document.activeElement).toBe(screen.getByRole("button", { name: "Install from a source" })));
486
+ });
487
+
441
488
  it("discovers marketplace apps and installs one through its registry spec", async () => {
442
489
  const user = userEvent.setup();
443
490
 
444
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
491
+ render(<PackagePanelHarness />);
445
492
 
446
493
  await user.click(screen.getByRole("button", { name: "Add apps" }));
447
494
 
448
- expect(screen.getByRole("heading", { name: "Add apps" })).toBeTruthy();
495
+ expect(screen.getByRole("heading", { name: "App marketplace" })).toBeTruthy();
449
496
  expect(screen.getByText("Workspace Glance")).toBeTruthy();
450
497
  expect(
451
- (screen.getByRole("button", { name: "Installed" }) as HTMLButtonElement)
498
+ (screen.getByRole("button", { name: "View installed" }) as HTMLButtonElement)
452
499
  .disabled,
453
- ).toBe(true);
500
+ ).toBe(false);
454
501
 
455
502
  const installButtons = screen.getAllByRole("button", {
456
503
  name: "Install app",
@@ -467,13 +514,14 @@ describe("AppPackagesPanel", () => {
467
514
  );
468
515
  });
469
516
 
517
+
470
518
  it("allows a built-in app to be uninstalled while keeping its data by default", async () => {
471
519
  const user = userEvent.setup();
472
520
 
473
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
521
+ render(<PackagePanelHarness />);
474
522
 
475
523
  await user.click(screen.getByRole("button", { name: "More app actions" }));
476
- await user.click(screen.getByRole("button", { name: "Uninstall" }));
524
+ await user.click(screen.getByRole("menuitem", { name: "Uninstall" }));
477
525
  expect(
478
526
  screen.getByRole("heading", { name: "Uninstall this app?" }),
479
527
  ).toBeTruthy();
@@ -525,7 +573,7 @@ describe("AppPackagesPanel", () => {
525
573
  actions: { deleteRetainedData: true },
526
574
  },
527
575
  ];
528
- const view = render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
576
+ const view = render(<PackagePanelHarness />);
529
577
 
530
578
  expect(
531
579
  screen.getByRole("heading", { name: "Saved app data" }),
@@ -547,7 +595,7 @@ describe("AppPackagesPanel", () => {
547
595
  const onSuccess = mocks.deleteRetained.mock.calls[0]?.[1]
548
596
  .onSuccess as () => void;
549
597
  mocks.retainedEntries = [];
550
- view.rerender(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
598
+ view.rerender(<PackagePanelHarness />);
551
599
  await act(async () => onSuccess());
552
600
  await waitFor(() => {
553
601
  expect(document.activeElement).toBe(
@@ -572,14 +620,14 @@ describe("AppPackagesPanel", () => {
572
620
  },
573
621
  ];
574
622
 
575
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
623
+ render(<PackagePanelHarness />);
576
624
 
577
625
  expect(screen.getByRole("status").textContent).toContain("Downloading");
578
626
  expect(screen.getByText("nextclaw.workspace-glance")).toBeTruthy();
579
627
 
580
628
  await user.click(screen.getByRole("button", { name: "Add apps" }));
581
629
 
582
- expect(screen.getByRole("heading", { name: "Add apps" })).toBeTruthy();
630
+ expect(screen.getByRole("heading", { name: "App marketplace" })).toBeTruthy();
583
631
  expect(screen.getAllByText("Downloading")).not.toHaveLength(0);
584
632
  expect(
585
633
  (screen.getByRole("button", { name: "Downloading" }) as HTMLButtonElement)
@@ -614,9 +662,32 @@ describe("AppPackagesPanel", () => {
614
662
  },
615
663
  ];
616
664
 
617
- render(<AppPackagesPanel onOpenPanelApp={mocks.onOpen} />);
665
+ render(<PackagePanelHarness />);
618
666
 
619
667
  expect(screen.queryByRole("alert")).toBeNull();
620
668
  expect(screen.queryByText("name 必须是非空字符串。")).toBeNull();
621
669
  });
622
670
  });
671
+
672
+
673
+ describe("App marketplace navigation", () => {
674
+ it("retains the catalog DOM and search when returning from details", async () => {
675
+ const user = userEvent.setup();
676
+ render(<PackagePanelHarness />);
677
+ await user.click(screen.getByRole("button", { name: "Add apps" }));
678
+ const search = screen.getByRole("textbox", { name: "Search apps, features, or tags" });
679
+ await user.type(search, "workspace");
680
+ const card = screen.getByRole("button", { name: /Workspace Glance A local/ });
681
+ await user.click(card);
682
+ expect(screen.queryByRole("textbox", { name: "Search apps, features, or tags" })).toBeNull();
683
+ await user.click(screen.getByRole("button", { name: "Back to marketplace" }));
684
+ expect(screen.getByRole("textbox", { name: "Search apps, features, or tags" })).toBe(search);
685
+ expect((search as HTMLInputElement).value).toBe("workspace");
686
+ await waitFor(() => expect(document.activeElement).toBe(card));
687
+ await user.click(screen.getByRole("button", { name: "View installed" }));
688
+ expect(screen.getByRole("heading", { name: "Your apps" })).toBeTruthy();
689
+ await user.click(screen.getByRole("button", { name: "Add apps" }));
690
+ expect(screen.getByRole("textbox", { name: "Search apps, features, or tags" })).toBe(search);
691
+ });
692
+
693
+ });
@@ -40,12 +40,14 @@ describe('AppsPanel', () => {
40
40
  render(<AppsPanelHarness />);
41
41
 
42
42
  const navigation = screen.getByRole('tablist');
43
- expect(navigation.className).toContain('w-full');
44
- expect(navigation.className).toContain('max-w-[390px]');
43
+ expect(navigation.className).toContain('w-max');
45
44
 
46
45
  await user.click(screen.getByRole('tab', { name: 'panelAppsTitle' }));
47
46
  expect(screen.getByText('panel-apps-content')).toBeTruthy();
48
47
  expect(screen.getByRole('tablist')).toBe(navigation);
48
+ await user.click(screen.getByRole('tab', { name: 'appPackagesMarketplaceTitle' }));
49
+ expect(screen.getByRole('tab', { name: 'appPackagesMarketplaceTitle' }).getAttribute('aria-selected')).toBe('true');
50
+ expect(screen.getByRole('tablist')).toBe(navigation);
49
51
 
50
52
  await user.click(screen.getByRole('tab', { name: 'serviceAppsTitle' }));
51
53
  expect(screen.getByText('service-apps-content')).toBeTruthy();
@@ -56,7 +58,7 @@ describe('AppsPanel', () => {
56
58
  const user = userEvent.setup();
57
59
  render(<AppsPanelHarness />);
58
60
 
59
- const firstTab = screen.getByRole('tab', { name: 'appsTitle' });
61
+ const firstTab = screen.getByRole('tab', { name: 'appPackagesLibraryTitle' });
60
62
  firstTab.focus();
61
63
  await user.keyboard('{ArrowRight}');
62
64