@nextclaw/ui 0.26.0 → 0.26.2
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.
- package/CHANGELOG.md +40 -0
- package/dist/.vite/manifest.json +1143 -1133
- package/dist/assets/{abnfDiagram-VRR7QNED-Bjrmb5-o.js → abnfDiagram-VRR7QNED-Dcw10Yt1.js} +1 -1
- package/dist/assets/{account-panel-C1S3xtUB.js → account-panel-ZM2qzKF4.js} +1 -1
- package/dist/assets/{aiden0z-pptx-renderer.es-DO4DCX3e.js → aiden0z-pptx-renderer.es--oNqetPA.js} +1 -1
- package/dist/assets/api-Cjq-o1VN.js +20 -0
- package/dist/assets/app-presenter-provider-C02YPoMr.js +124 -0
- package/dist/assets/{appearance-settings-page-BljTr6nB.js → appearance-settings-page-B4zouKzg.js} +1 -1
- package/dist/assets/{arc-g4XaP3S4.js → arc-DBRedCax.js} +1 -1
- package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +1 -0
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-CAP7YDux.js → architectureDiagram-ZJ3FMSHR-Dufhtuv-.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-DhaP0zUG.js → blockDiagram-677ZJIJ3-BUk0vtJ7.js} +1 -1
- package/dist/assets/{book-open-vxpV2eSM.js → book-open-AteA89HX.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-DHCQJJkD.js → c4Diagram-LMCZKHZV-CxDcVE9p.js} +1 -1
- package/dist/assets/{card-D9NYhSdf.js → card-BLXvBstA.js} +1 -1
- package/dist/assets/channel-CpMstUPF.js +1 -0
- package/dist/assets/{channels-list-page-BiHA1zZd.js → channels-list-page-fj8kMo-T.js} +1 -1
- package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +1 -0
- package/dist/assets/{chunk-32BRIVSS-BcQlxl4v.js → chunk-32BRIVSS-DSF3KElA.js} +1 -1
- package/dist/assets/{chunk-52WLFC77-ClPpG-2S.js → chunk-52WLFC77-Costxzr3.js} +1 -1
- package/dist/assets/{chunk-5FCAYU7R-B_qmYOdX.js → chunk-5FCAYU7R-rhqzGGZo.js} +1 -1
- package/dist/assets/{chunk-5HE753X5-DTO-V56q.js → chunk-5HE753X5-BsEsmIao.js} +1 -1
- package/dist/assets/{chunk-5JV3BV7I-CU1SOaaG.js → chunk-5JV3BV7I-Dqw_DCoN.js} +1 -1
- package/dist/assets/{chunk-5TONJI2A-CzSDkWNa.js → chunk-5TONJI2A-Cft82fp8.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-ChkfqIRE.js → chunk-5VM5RSS4-DqNHn9Dl.js} +1 -1
- package/dist/assets/{chunk-7BUUIJ7U-Du3Ozi62.js → chunk-7BUUIJ7U-A5SBEMYY.js} +1 -1
- package/dist/assets/{chunk-BIQX33UG-C-HVafHB.js → chunk-BIQX33UG-1Ng3mTrH.js} +1 -1
- package/dist/assets/{chunk-C7G6YPKG-BSjZ86D0.js → chunk-C7G6YPKG-DRJEy8ZI.js} +1 -1
- package/dist/assets/{chunk-CQNSW5MT-1D1W2lF6.js → chunk-CQNSW5MT-Bydv_J3J.js} +1 -1
- package/dist/assets/{chunk-CYSBUYHQ-ISpyj_lK.js → chunk-CYSBUYHQ-HkMIg12u.js} +1 -1
- package/dist/assets/{chunk-EMLP6XTP-Cp8iUBt2.js → chunk-EMLP6XTP-C5ndDvm3.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-BN5RzF5j.js → chunk-EX3LRPZG-DzeloZRo.js} +1 -1
- package/dist/assets/{chunk-FWX5IMBZ-DecJDW4r.js → chunk-FWX5IMBZ-n_2_CLTQ.js} +2 -2
- package/dist/assets/{chunk-HOUHSVGY-BE_XNgGk.js → chunk-HOUHSVGY-kx_slvu3.js} +1 -1
- package/dist/assets/{chunk-ICXQ74PX-BFOKMkWV.js → chunk-ICXQ74PX-sQLMURqL.js} +1 -1
- package/dist/assets/{chunk-JG7HCLWE-DL-pl8VB.js → chunk-JG7HCLWE-CMUn5Elc.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-B-bcwfmh.js → chunk-JWPE2WC7-Cra3s-Uk.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-BC0taFro.js → chunk-MOJQB5TN-umcrg5Bi.js} +1 -1
- package/dist/assets/{chunk-MOZMSUNE-RrhfU6MO.js → chunk-MOZMSUNE-BnljD1ig.js} +1 -1
- package/dist/assets/{chunk-OGEWGWER-TuI7SR7i.js → chunk-OGEWGWER-BXx5pQjU.js} +1 -1
- package/dist/assets/{chunk-OSBZ3O6U-C5jMBKlU.js → chunk-OSBZ3O6U-D-1qfdWu.js} +1 -1
- package/dist/assets/{chunk-PUDLZKDR-C5lMBn0K.js → chunk-PUDLZKDR-DLzX78LC.js} +1 -1
- package/dist/assets/{chunk-Q4XR5HBZ-B-kzUbwT.js → chunk-Q4XR5HBZ-DTK-rtW6.js} +1 -1
- package/dist/assets/{chunk-QBLGF6JB-CRb_WAEj.js → chunk-QBLGF6JB-CsFeIGfr.js} +1 -1
- package/dist/assets/{chunk-R7FJI6CG-De6Y7ozO.js → chunk-R7FJI6CG-4xNYUeng.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-Igv92q8k.js → chunk-RYQCIY6F-DJiHiTE5.js} +1 -1
- package/dist/assets/{chunk-U6XO7XAA-bCjRshkT.js → chunk-U6XO7XAA-BVYkauHz.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-0J1s_Kgq.js → chunk-V7JOEXUC-BsazE8cS.js} +1 -1
- package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +1 -0
- package/dist/assets/{chunk-VR4S4FIN-DX6lXnNx.js → chunk-VR4S4FIN-7RoZQffO.js} +1 -1
- package/dist/assets/{chunk-WYO6CB5R-DLqMXfFC.js → chunk-WYO6CB5R-DEuS6N1R.js} +1 -1
- package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +1 -0
- package/dist/assets/{chunk-YOTPTUD7-CY4obsV0.js → chunk-YOTPTUD7-9KBrosZL.js} +1 -1
- package/dist/assets/{chunk-ZGVPDNZ5-BleImZKe.js → chunk-ZGVPDNZ5-IYgN9f5A.js} +1 -1
- package/dist/assets/{chunk-ZIRB5QZD-C1TfdjpX.js → chunk-ZIRB5QZD-BUo0-zcp.js} +1 -1
- package/dist/assets/{circle-dashed-CEEssYIw.js → circle-dashed-LSYZTzM7.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DFN1v3PQ.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-DRvglADa.js +1 -0
- package/dist/assets/{client-C6YQx7A-.js → client-DudCRJw4.js} +1 -1
- package/dist/assets/{config-split-page-DKPelvjR.js → config-split-page-G7Kt2BnV.js} +1 -1
- package/dist/assets/confirm-dialog-DShT64F6.js +1 -0
- package/dist/assets/context-menu-rd7b_kVD.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-CVgUHXkj.js → cose-bilkent-JH36ORCC-DhqbC1fR.js} +1 -1
- package/dist/assets/{createLucideIcon-CF8U9dh7.js → createLucideIcon-D7hvIHV-.js} +1 -1
- package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +1 -0
- package/dist/assets/{cynefinDiagram-TSTJHNR4-cdfImbfI.js → cynefinDiagram-TSTJHNR4-C-TBRi5V.js} +1 -1
- package/dist/assets/{dagre-CHNN9L9I.js → dagre-CrgsRasE.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-PscaENwr.js → dagre-VKFMJZFB-BmafJymp.js} +1 -1
- package/dist/assets/{desktop-capabilities-page-BENHdKfk.js → desktop-capabilities-page-CzqzFZUY.js} +1 -1
- package/dist/assets/desktop-update-config-CgeQ0Ffo.js +1 -0
- package/dist/assets/{diagram-FQU43EPY-CH_wye41.js → diagram-FQU43EPY-BoOMwa6D.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-Dtjpmi6D.js → diagram-G47NLZAW-Le7N6Uym.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-UdjLHyaz.js → diagram-NH7WQ7WH-Fbpj3-MO.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-DYsToEaL.js → diagram-OA4YK3LP-D3QuGGuu.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-CA7kuIer.js → diagram-WEI45ONY-Cxu1uiN6.js} +1 -1
- package/dist/assets/dialog-C7glmAQJ.js +5 -0
- package/dist/assets/{doc-browser-context-CPLWVFLd.js → doc-browser-context-BlhBAOLH.js} +1 -1
- package/dist/assets/doc-browser-dBiR9Qi0.js +1 -0
- package/dist/assets/{docx-preview-D--EsUWi.js → docx-preview-CkU2psnd.js} +1 -1
- package/dist/assets/download-BYgECE0n.js +1 -0
- package/dist/assets/{ebnfDiagram-CCIWWBDH-BrjaoOuq.js → ebnfDiagram-CCIWWBDH-CCAjuQM6.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-nZQa2kCM.js → erDiagram-Q63AITRT-BuzUAq-d.js} +1 -1
- package/dist/assets/es2015-CsjAAQ6X.js +41 -0
- package/dist/assets/eventmodeling-45OFAUF4-ZBfVS3ZC.js +1 -0
- package/dist/assets/{extensions-CsWT7x3v.js → extensions-qYL-NpL3.js} +1 -1
- package/dist/assets/{eye-DJtw5KJ5.js → eye-BBuTzJ53.js} +1 -1
- package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +1 -0
- package/dist/assets/{form-actions-DDQk0END.js → form-actions-CLGWO52v.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-CyFZHIHN.js → ganttDiagram-NO4QXBWP-cJmWVY8F.js} +1 -1
- package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +1 -0
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-Dfpq3z2M.js → gitGraphDiagram-IHSO6WYX-F58o-vtP.js} +1 -1
- package/dist/assets/{i18n-BjPkAKMQ.js → i18n-qBGEbcW6.js} +2 -2
- package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +1 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-Diiz0k1E.js → infoDiagram-FWYZ7A6U-Gt59b83C.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-B3R3SN4M.js → ishikawaDiagram-FXEZZL3T-1u4IAj1I.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-DFOLKiNv.js → journeyDiagram-5HDEW3XC-CCQsfV-5.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-BMXpDp3g.js → kanban-definition-HUTT4EX6-vlB6O_Zn.js} +1 -1
- package/dist/assets/{keyboard-shortcuts-settings-page-hqTP7akj.js → keyboard-shortcuts-settings-page-B-wK_6zG.js} +1 -1
- package/dist/assets/{line-64_FhCoJ.js → line-D_bHubTL.js} +1 -1
- package/dist/assets/{linear-aF1fg7bK.js → linear-ChlwuS5y.js} +1 -1
- package/dist/assets/loader-circle-BA7EMkih.js +1 -0
- package/dist/assets/{login-page-BUwshAq4.js → login-page-Cd84lpVV.js} +1 -1
- package/dist/assets/login-page-VdMyNkFf.js +1 -0
- package/dist/assets/main-CR0SrTBf.js +2 -0
- package/dist/assets/main-DXH6EdXI.css +1 -0
- package/dist/assets/main-i18n-catalog.config-Btp_OowF.js +1 -0
- package/dist/assets/{map-BC3Amra3.js → map-oGHTsIu8.js} +1 -1
- package/dist/assets/mcp-marketplace-page-jacRwiI-.js +1 -0
- package/dist/assets/{mermaid-parser.core-DdMcZwnE.js → mermaid-parser.core-CuRe1ZG4.js} +2 -2
- package/dist/assets/{mermaid.core-BHdiEBbI.js → mermaid.core-u4YCFKRf.js} +3 -3
- package/dist/assets/{mindmap-definition-LN4V7U3C-CtHVaZyV.js → mindmap-definition-LN4V7U3C-DeJAQYTu.js} +1 -1
- package/dist/assets/{model-config-page-BSsHOhV7.js → model-config-page-D0DQlSDa.js} +1 -1
- package/dist/assets/{navigation-link-D-fxdv0i.js → navigation-link-32iM1-e6.js} +1 -1
- package/dist/assets/{ordinal-6b3jw4cz.js → ordinal-C6JFfkKN.js} +1 -1
- package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +1 -0
- package/dist/assets/panel-app-CC0bVSu4.js +1 -0
- package/dist/assets/panel-app-i18n-catalog.config-LUSBp5Ce.js +1 -0
- package/dist/assets/{panelStandalone-BeI0Ndsx.js → panelStandalone-C9EKaApN.js} +2 -2
- package/dist/assets/{pegDiagram-2B236MQR-BtbG3Bgu.js → pegDiagram-2B236MQR-nVMkxShH.js} +1 -1
- package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +1 -0
- package/dist/assets/{pieDiagram-ENE6RG2P-FmLl2hzN.js → pieDiagram-ENE6RG2P-8aUH44QZ.js} +1 -1
- package/dist/assets/{privacy-settings-page-pW_1naDz.js → privacy-settings-page-Bxxx12OO.js} +1 -1
- package/dist/assets/projects-D56yAPNT.js +1 -0
- package/dist/assets/provider-models-C3frdXeW.js +1 -0
- package/dist/assets/{provider-scoped-model-input-CVbtT8L9.js → provider-scoped-model-input-CYetrPYZ.js} +1 -1
- package/dist/assets/providers-config-page-DESB1h8g.js +1 -0
- package/dist/assets/{puzzle-kKiVft9-.js → puzzle-CWHfFyYN.js} +1 -1
- package/dist/assets/pwa-CiGUjpcd.js +1 -0
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-7-OzMNpF.js → quadrantDiagram-ABIIQ3AL-EY8hpFv8.js} +1 -1
- package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +1 -0
- package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +1 -0
- package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +1 -0
- package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +1 -0
- package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +1 -0
- package/dist/assets/{railroadDiagram-RFXS5EU6-B_UVtLJO.js → railroadDiagram-RFXS5EU6-CNhcIeji.js} +1 -1
- package/dist/assets/{refresh-cw-BeG0y6yZ.js → refresh-cw-y3L6PyLt.js} +1 -1
- package/dist/assets/remote-DiGFV8nP.js +1 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-D8TO2YeZ.js → requirementDiagram-TGXJPOKE-D8Dcs-Rt.js} +1 -1
- package/dist/assets/{rotate-cw-Ci2dcTO5.js → rotate-cw-CNE9qSHi.js} +1 -1
- package/dist/assets/{runtime-config-page-DCXN0nkS.js → runtime-config-page-5o98T-TD.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB-CUzIcq0B.js → sankeyDiagram-HTMAVEWB-HTrb6aa-.js} +1 -1
- package/dist/assets/{save-Cr895abt.js → save-B0p5a0ET.js} +1 -1
- package/dist/assets/{search-config-page-CNQd481d.js → search-config-page-CpGcnIzi.js} +1 -1
- package/dist/assets/{secrets-config-page--q7M58L8.js → secrets-config-page-C4VTiW3r.js} +1 -1
- package/dist/assets/security-config-C5-RQVpS.js +1 -0
- package/dist/assets/select-CctTN205.js +1 -0
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-kqJzXbwu.js → sequenceDiagram-DBY2YBRQ-6f_4X16Y.js} +1 -1
- package/dist/assets/service-apps-panel-CKE5HKNY.js +1 -0
- package/dist/assets/{settings-2-IodCcaXd.js → settings-2-EPflrNk6.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-D9ISogq1.js → sizeCapture-X5ZJPWSS-Ck9rsuwL.js} +1 -1
- package/dist/assets/{src-Bc0PoUJ1.js → src-C8AUg09O.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-CqH5xc9W.js → stateDiagram-2N3HPSRC-Cm33MLHu.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +1 -0
- package/dist/assets/{status-dot-DUYSKRCU.js → status-dot-CensgJZC.js} +1 -1
- package/dist/assets/{swimlanes-5IMT3BWC-mwejV-rW.js → swimlanes-5IMT3BWC-B107vmvM.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +8 -0
- package/dist/assets/{tag-chip-CQU51ST3.js → tag-chip-Bjzb4-qW.js} +1 -1
- package/dist/assets/{theme-provider-D-zZkXxS.js → theme-provider-hlle7Skk.js} +1 -1
- package/dist/assets/{timeline-definition-FHXFAJF6-CuikIDlX.js → timeline-definition-FHXFAJF6-CJEoAj33.js} +1 -1
- package/dist/assets/{trash-2-BDdqDh6E.js → trash-2-C5KH5Rw9.js} +1 -1
- package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +1 -0
- package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +1 -0
- package/dist/assets/{use-config-Bxx7DdaL.js → use-config-CPl_F79t.js} +1 -1
- package/dist/assets/use-desktop-capabilities-CEg9-DrQ.js +1 -0
- package/dist/assets/{use-viewport-layout-CDcca0YL.js → use-viewport-layout-CPZUmTPi.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-BD0P0qHh.js → vennDiagram-L72KCM5P-DzsUHk5I.js} +1 -1
- package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +1 -0
- package/dist/assets/{wardleyDiagram-EHGQE667-C6ma3t5D.js → wardleyDiagram-EHGQE667-1NfFs5ua.js} +1 -1
- package/dist/assets/x--xxUvHKW.js +1 -0
- package/dist/assets/{xychartDiagram-FW5EYKEG-D7E40NBk.js → xychartDiagram-FW5EYKEG-Ci8AI3Qo.js} +1 -1
- package/dist/index.html +37 -36
- package/dist/panel-standalone.html +11 -11
- package/package.json +8 -8
- package/src/app/components/layout/__tests__/app-layout.test.tsx +0 -1
- package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +36 -16
- package/src/app/components/layout/sidebar-items.tsx +27 -18
- package/src/app/components/layout/sidebar-rail.styles.ts +11 -2
- package/src/app/components/layout/sidebar.tsx +3 -2
- package/src/app/configs/app-navigation.config.ts +39 -86
- package/src/features/agents/components/agent-details-dialog.tsx +3 -3
- package/src/features/agents/components/agents-page.tsx +5 -4
- package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +0 -2
- package/src/features/chat/components/layout/chat-page-shell.tsx +0 -2
- package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +0 -1
- package/src/features/chat/features/conversation/components/chat-voice-input-panel.tsx +3 -2
- package/src/features/chat/features/conversation/hooks/__tests__/use-chat-voice-input.test.tsx +4 -0
- package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +32 -47
- package/src/features/chat/features/message/components/chat-message-list.container.tsx +6 -10
- package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +52 -6
- package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +22 -37
- package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
- package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +2 -1
- package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +4 -2
- package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +9 -6
- package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +2 -2
- package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +17 -17
- package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +4 -4
- package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +13 -6
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +1 -1
- package/src/features/chat/managers/chat-voice-input.manager.ts +5 -3
- package/src/features/chat/utils/chat-voice-permissions.utils.test.ts +12 -1
- package/src/features/chat/utils/chat-voice-permissions.utils.ts +6 -1
- package/src/features/cron/components/cron-job-row.tsx +11 -9
- package/src/features/inbox/components/inbox-reader-dialog.tsx +4 -2
- package/src/features/inbox/pages/inbox-page.tsx +10 -5
- package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +1 -1
- package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +6 -4
- package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +6 -4
- package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
- package/src/features/panel-apps/components/panel-app-toolbar.tsx +7 -7
- package/src/features/projects/components/project-skills.tsx +2 -2
- package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +27 -2
- package/src/features/right-panel-resources/components/page-resource-actions-menu.tsx +4 -22
- package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +10 -13
- package/src/features/right-panel-resources/hooks/use-page-resource-actions.ts +56 -3
- package/src/features/right-panel-resources/index.ts +0 -1
- package/src/features/service-apps/components/service-app-list-item.tsx +3 -2
- package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +40 -0
- package/src/features/system-status/components/desktop-update-config.tsx +19 -1
- package/src/platforms/desktop/components/__tests__/desktop-app-shell.test.tsx +0 -1
- package/src/platforms/desktop/components/desktop-app-shell.tsx +0 -2
- package/src/platforms/mobile/components/mobile-app-shell.tsx +0 -2
- package/src/platforms/mobile/components/mobile-settings-shell.tsx +8 -3
- package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +83 -1
- package/src/shared/components/ui/context-menu/context-menu-items.tsx +173 -0
- package/src/shared/components/ui/context-menu/context-menu.tsx +93 -114
- package/src/shared/components/ui/dialog.tsx +4 -0
- package/src/shared/components/ui/overlays/sheet.tsx +4 -0
- package/src/shared/components/ui/popover.tsx +10 -4
- package/src/shared/lib/i18n/locales/en-US/chat.json +8 -1
- package/src/shared/lib/i18n/locales/en-US/core.json +3 -1
- package/src/shared/lib/i18n/locales/en-US/desktop-update.json +1 -0
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +8 -1
- package/src/shared/lib/i18n/locales/zh-CN/core.json +11 -9
- package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +1 -0
- package/src/shared/lib/transport/__tests__/browser-realtime-recovery.service.test.ts +27 -2
- package/src/shared/lib/transport/__tests__/local-transport.service.test.ts +20 -0
- package/src/shared/lib/transport/__tests__/remote.transport.test.ts +26 -0
- package/src/shared/lib/transport/browser-realtime-recovery.service.ts +32 -5
- package/src/shared/lib/transport/local-transport.service.ts +1 -6
- package/src/shared/lib/transport/remote-transport.service.ts +22 -1
- package/dist/assets/api-D9e9cHtW.js +0 -20
- package/dist/assets/app-presenter-provider-J9IgTbc9.js +0 -124
- package/dist/assets/architecture-TIHT7OUA-BWywYH_m.js +0 -1
- package/dist/assets/channel-1nKIAEXr.js +0 -1
- package/dist/assets/chunk-2Q5K7J3B-CAwv72v4.js +0 -1
- package/dist/assets/chunk-VAUOI2AC-DnaryNw2.js +0 -1
- package/dist/assets/chunk-XXDRQBXY-BToo1uqb.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-D_TusZGx.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-B1NFZTmS.js +0 -1
- package/dist/assets/confirm-dialog-BCGeh61X.js +0 -1
- package/dist/assets/cynefin-VYW2F7L2-CJZSs5s_.js +0 -1
- package/dist/assets/desktop-update-config-BJMTQMRS.js +0 -1
- package/dist/assets/dialog-DQXou6pg.js +0 -5
- package/dist/assets/dist-CiC9Fd9J.js +0 -1
- package/dist/assets/doc-browser-CCYS_csH.js +0 -1
- package/dist/assets/es2015-DHRpDU-q.js +0 -41
- package/dist/assets/eventmodeling-45OFAUF4-rc7kUq4V.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-DAjaeGO8.js +0 -1
- package/dist/assets/gitGraph-TEB2WS4Q-Ce0gf6ps.js +0 -1
- package/dist/assets/info-DKCQHKI2-Cp-Tr78m.js +0 -1
- package/dist/assets/loader-circle-B-4WwzBj.js +0 -1
- package/dist/assets/login-page-CdlI6B8e.js +0 -1
- package/dist/assets/main-BVYdyT60.css +0 -1
- package/dist/assets/main-DYEALeoQ.js +0 -2
- package/dist/assets/main-i18n-catalog.config-1o2hjZ0m.js +0 -1
- package/dist/assets/mcp-marketplace-page-CRRQT6SP.js +0 -1
- package/dist/assets/packet-7NZHBO7P-BOJuCraS.js +0 -1
- package/dist/assets/panel-app-2EACRB8p.js +0 -1
- package/dist/assets/panel-app-i18n-catalog.config-kQO7QAwH.js +0 -1
- package/dist/assets/pie-RZYD4A2V-D-FEO81x.js +0 -1
- package/dist/assets/projects-k6SLda_A.js +0 -1
- package/dist/assets/provider-models-mVzuEQBS.js +0 -1
- package/dist/assets/providers-config-page-rBlVrHkb.js +0 -1
- package/dist/assets/pwa-BgGM4kkY.js +0 -1
- package/dist/assets/radar-I7S5WNFK-Bq3eK1vK.js +0 -1
- package/dist/assets/railroad-3IZDKUUU-C3uZ1esg.js +0 -1
- package/dist/assets/railroad-abnf-AHOZXSZD-D3iZd1KT.js +0 -1
- package/dist/assets/railroad-ebnf-EBAXGLYW-Dl0FWqZu.js +0 -1
- package/dist/assets/railroad-peg-LSFZ7HO6-B51SbzGp.js +0 -1
- package/dist/assets/remote-wYWqir2w.js +0 -1
- package/dist/assets/security-config-CJb2pK2O.js +0 -1
- package/dist/assets/select-Bq-UmfCK.js +0 -1
- package/dist/assets/service-apps-panel-iLLEByRF.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-CcOGfDdx.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-BMI2k8RZ.js +0 -8
- package/dist/assets/treeView-QDETBFTQ-C0_07QI1.js +0 -1
- package/dist/assets/treemap-6X3UGDF4-Djpx6ccG.js +0 -1
- package/dist/assets/use-desktop-capabilities-BTgdFgJy.js +0 -1
- package/dist/assets/wardley-OPB4EBWU-DZVFxu81.js +0 -1
- package/dist/assets/x-LUUwl8rK.js +0 -1
- package/src/features/right-panel-resources/components/current-page-actions.tsx +0 -36
- /package/dist/assets/{array-B0sEvCP9.js → array-BV9OtnO8.js} +0 -0
- /package/dist/assets/{chunk-KEIR6QF5-BeO7fxDQ.js → chunk-KEIR6QF5-Cx-8EJ4_.js} +0 -0
- /package/dist/assets/{chunk-Y2CYZVJY-JQfgEV36.js → chunk-Y2CYZVJY-Dy1ufvjf.js} +0 -0
- /package/dist/assets/{config-hints-D3OuwoEY.js → config-hints-DbmiyTKg.js} +0 -0
- /package/dist/assets/{cytoscape.esm-CzJ9uXgi.js → cytoscape.esm-CSCjuT4Z.js} +0 -0
- /package/dist/assets/{defaultLocale-USmzX3VG.js → defaultLocale-DWTiNsbT.js} +0 -0
- /package/dist/assets/{dist-BYF6XVna.js → dist-BVCSkfWY.js} +0 -0
- /package/dist/assets/{graphlib-DEFMkHdW.js → graphlib-B1yb1Wl8.js} +0 -0
- /package/dist/assets/{host-capabilities-C0MmWd3M.js → host-capabilities-DuIFVsvM.js} +0 -0
- /package/dist/assets/{init-04ErALoz.js → init-BF6GH5oe.js} +0 -0
- /package/dist/assets/{jszip.min-BnQ5NRy2.js → jszip.min-D12teKzP.js} +0 -0
- /package/dist/assets/{middleware-CAXxl-af.js → middleware-B--6mAUM.js} +0 -0
- /package/dist/assets/{navigation-history-CyawyVz0.js → navigation-history-CzErJuPG.js} +0 -0
- /package/dist/assets/{path-CzxQ9n2G.js → path-C56XkznJ.js} +0 -0
- /package/dist/assets/{rough.esm-pT9fdsW3.js → rough.esm-CGfeEbtE.js} +0 -0
- /package/dist/assets/{xlsx-BRpCSiE4.js → xlsx-sds5nUpL.js} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextclaw/ui",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
"zod": "^3.23.8",
|
|
36
36
|
"zustand": "^5.0.2",
|
|
37
37
|
"@nextclaw/agent-chat": "0.3.14",
|
|
38
|
-
"@nextclaw/client-sdk": "0.12.
|
|
39
|
-
"@nextclaw/agent-chat-ui": "0.10.
|
|
40
|
-
"@nextclaw/ncp": "0.11.
|
|
41
|
-
"@nextclaw/ncp-
|
|
42
|
-
"@nextclaw/ncp-
|
|
43
|
-
"@nextclaw/ncp-toolkit": "0.6.
|
|
44
|
-
"@nextclaw/shared": "0.8.
|
|
38
|
+
"@nextclaw/client-sdk": "0.12.8",
|
|
39
|
+
"@nextclaw/agent-chat-ui": "0.10.1",
|
|
40
|
+
"@nextclaw/ncp": "0.11.2",
|
|
41
|
+
"@nextclaw/ncp-react": "0.5.30",
|
|
42
|
+
"@nextclaw/ncp-http-agent-client": "0.4.25",
|
|
43
|
+
"@nextclaw/ncp-toolkit": "0.6.27",
|
|
44
|
+
"@nextclaw/shared": "0.8.2"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@testing-library/react": "^16.3.0",
|
|
@@ -250,4 +250,3 @@ vi.mock("@/features/right-panel-resources/hooks/use-page-resource-actions", () =
|
|
|
250
250
|
vi.mock("@/shared/components/doc-browser/use-doc-link-interceptor", () => ({ useDocLinkInterceptor: () => {} }));
|
|
251
251
|
|
|
252
252
|
vi.mock("@/shared/components/doc-browser/doc-browser", () => ({ DocBrowser: () => null }));
|
|
253
|
-
vi.mock("@/features/right-panel-resources/components/current-page-actions", () => ({ CurrentPageActions: () => null }));
|
|
@@ -2,6 +2,7 @@ import { render, screen, within } from "@testing-library/react";
|
|
|
2
2
|
import { fireEvent } from "@testing-library/react";
|
|
3
3
|
import { MemoryRouter } from "react-router-dom";
|
|
4
4
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { MobileSettingsShell } from "@/platforms/mobile/components/mobile-settings-shell";
|
|
5
6
|
import { Sidebar } from "@/app/components/layout/sidebar";
|
|
6
7
|
import { viewportLayoutManager } from "@/app/managers/viewport-layout.manager";
|
|
7
8
|
import type * as RemoteFeature from "@/features/remote";
|
|
@@ -19,6 +20,10 @@ const mocks = vi.hoisted(() => ({
|
|
|
19
20
|
},
|
|
20
21
|
}));
|
|
21
22
|
|
|
23
|
+
vi.mock("@/app/hooks/use-feature-controls", () => ({
|
|
24
|
+
useFeatureControls: () => ({ data: { desktopAutomation: { available: false } } }),
|
|
25
|
+
}));
|
|
26
|
+
|
|
22
27
|
vi.mock("@/shared/components/doc-browser", () => ({
|
|
23
28
|
useDocBrowser: () => ({
|
|
24
29
|
open: mocks.docOpen,
|
|
@@ -102,7 +107,7 @@ describe("Sidebar", () => {
|
|
|
102
107
|
expect(backLink).toBeTruthy();
|
|
103
108
|
expect(header.className).not.toContain("bg-white");
|
|
104
109
|
expect(header.className).not.toContain("rounded-2xl");
|
|
105
|
-
expect(backLink.className).toContain("hover:bg-gray-200/
|
|
110
|
+
expect(backLink.className).toContain("hover:bg-[hsl(var(--gray-200)/0.6)]");
|
|
106
111
|
});
|
|
107
112
|
|
|
108
113
|
it("keeps the settings navigation in the expected product order", () => {
|
|
@@ -127,9 +132,11 @@ describe("Sidebar", () => {
|
|
|
127
132
|
|
|
128
133
|
expect(groupHeadings).toEqual([
|
|
129
134
|
"Basic Configuration",
|
|
130
|
-
"
|
|
135
|
+
"Common Settings",
|
|
136
|
+
"Security & Privacy",
|
|
137
|
+
"System & Extensions",
|
|
131
138
|
]);
|
|
132
|
-
expect(groups).toHaveLength(
|
|
139
|
+
expect(groups).toHaveLength(4);
|
|
133
140
|
expect(
|
|
134
141
|
within(groups[0] as HTMLElement)
|
|
135
142
|
.getAllByRole("link")
|
|
@@ -140,32 +147,45 @@ describe("Sidebar", () => {
|
|
|
140
147
|
.getAllByRole("link")
|
|
141
148
|
.map((link) => link.textContent?.trim() || ""),
|
|
142
149
|
).toEqual([
|
|
143
|
-
"Extensions",
|
|
144
150
|
"Appearance",
|
|
145
|
-
"Sign-in Management",
|
|
146
|
-
"Privacy & Analytics",
|
|
147
|
-
"Search Channels",
|
|
148
151
|
"Updates",
|
|
149
|
-
"
|
|
150
|
-
"
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
"Search Channels",
|
|
153
|
+
"Keyboard shortcuts",
|
|
154
|
+
]);
|
|
155
|
+
expect(within(groups[2] as HTMLElement).getAllByRole("link").map((link) => link.textContent)).toEqual([
|
|
156
|
+
"Sign-in Management", "Privacy & Analytics", "Secrets",
|
|
157
|
+
]);
|
|
158
|
+
expect(within(groups[3] as HTMLElement).getAllByRole("link").map((link) => link.textContent)).toEqual([
|
|
159
|
+
"Remote Access", "Routing & Runtime", "MCP", "Extensions",
|
|
153
160
|
]);
|
|
154
161
|
expect(linkTexts).toEqual([
|
|
155
162
|
"Model",
|
|
156
163
|
"Providers",
|
|
157
164
|
"Channels",
|
|
158
|
-
"Extensions",
|
|
159
165
|
"Appearance",
|
|
166
|
+
"Updates",
|
|
167
|
+
"Search Channels",
|
|
168
|
+
"Keyboard shortcuts",
|
|
160
169
|
"Sign-in Management",
|
|
161
170
|
"Privacy & Analytics",
|
|
162
|
-
"
|
|
163
|
-
"Updates",
|
|
171
|
+
"Secrets",
|
|
164
172
|
"Remote Access",
|
|
165
173
|
"Routing & Runtime",
|
|
166
|
-
"Secrets",
|
|
167
174
|
"MCP",
|
|
175
|
+
"Extensions",
|
|
176
|
+
]);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("shares the grouped navigation with mobile while omitting desktop shortcuts", () => {
|
|
180
|
+
render(<MemoryRouter initialEntries={["/settings"]}><MobileSettingsShell /></MemoryRouter>);
|
|
181
|
+
expect(screen.getAllByRole("heading", { level: 2 }).map((heading) => heading.textContent)).toEqual([
|
|
182
|
+
"Basic Configuration", "Common Settings", "Security & Privacy", "System & Extensions",
|
|
168
183
|
]);
|
|
184
|
+
const links = screen.getAllByRole("link");
|
|
185
|
+
expect(links.slice(0, 3).map((link) => link.textContent?.trim())).toEqual(["Model", "Providers", "Channels"]);
|
|
186
|
+
expect(links.at(-1)?.textContent?.trim()).toBe("Extensions");
|
|
187
|
+
expect(screen.queryByRole("link", { name: "Keyboard shortcuts" })).toBeNull();
|
|
188
|
+
expect(new Set(links.map((link) => link.getAttribute("href"))).size).toBe(links.length);
|
|
169
189
|
});
|
|
170
190
|
|
|
171
191
|
it("keeps the footer utilities compact without changing the top header structure", () => {
|
|
@@ -187,7 +207,7 @@ describe("Sidebar", () => {
|
|
|
187
207
|
expect(screen.queryByRole("combobox", { name: "Language" })).toBeNull();
|
|
188
208
|
expect(accountEntry.className).toContain("py-2");
|
|
189
209
|
expect(accountEntry.className).toContain("text-muted-foreground");
|
|
190
|
-
expect(accountEntry.className).toContain("hover:bg-gray-200/
|
|
210
|
+
expect(accountEntry.className).toContain("hover:bg-[hsl(var(--gray-200)/0.6)]");
|
|
191
211
|
expect(navigationList?.className).toContain("space-y-0.5");
|
|
192
212
|
expect(footer?.className).toContain("space-y-0.5");
|
|
193
213
|
expect(footer?.firstElementChild?.textContent).toContain("Help Docs");
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
SIDEBAR_RAIL_CONTROL_CLASS,
|
|
18
18
|
SIDEBAR_RAIL_ICON_CLASS,
|
|
19
19
|
SIDEBAR_RAIL_SURFACE_CLASS,
|
|
20
|
+
SIDEBAR_ITEM_SURFACE_CLASS,
|
|
20
21
|
} from "@/app/components/layout/sidebar-rail.styles";
|
|
21
22
|
|
|
22
23
|
export type SidebarIcon = ComponentType<{ className?: string }>;
|
|
@@ -63,9 +64,12 @@ export function getSidebarItemStackClass(
|
|
|
63
64
|
return getSidebarItemTone(density).stack;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
function isSidebarRouteActive(pathname: string, target: string): boolean {
|
|
67
|
+
function isSidebarRouteActive(pathname: string, search: string, target: string): boolean {
|
|
67
68
|
const normalizedPathname = pathname.toLowerCase();
|
|
68
|
-
const
|
|
69
|
+
const [targetPath, targetSearch] = target.split("?");
|
|
70
|
+
const normalizedTarget = targetPath.toLowerCase();
|
|
71
|
+
const currentParams = new URLSearchParams(search);
|
|
72
|
+
if ([...new URLSearchParams(targetSearch)].some(([key, value]) => currentParams.get(key) !== value)) return false;
|
|
69
73
|
return (
|
|
70
74
|
normalizedPathname === normalizedTarget ||
|
|
71
75
|
normalizedPathname.startsWith(`${normalizedTarget}/`)
|
|
@@ -99,10 +103,11 @@ type SidebarNavLinkItemProps = {
|
|
|
99
103
|
icon?: SidebarIcon;
|
|
100
104
|
iconNode?: ReactNode;
|
|
101
105
|
density?: SidebarItemDensity;
|
|
102
|
-
className?: string;
|
|
103
106
|
collapsed?: boolean;
|
|
104
107
|
indicator?: boolean;
|
|
105
108
|
trailing?: ReactNode;
|
|
109
|
+
actions?: ReactNode;
|
|
110
|
+
onNavigate?: () => void;
|
|
106
111
|
};
|
|
107
112
|
|
|
108
113
|
function SidebarNavIcon({
|
|
@@ -149,32 +154,32 @@ export function SidebarNavLinkItem({
|
|
|
149
154
|
icon: Icon,
|
|
150
155
|
iconNode,
|
|
151
156
|
density = "default",
|
|
152
|
-
className,
|
|
153
157
|
collapsed = false,
|
|
154
158
|
indicator = false,
|
|
155
159
|
trailing,
|
|
160
|
+
actions,
|
|
161
|
+
onNavigate,
|
|
156
162
|
}: SidebarNavLinkItemProps) {
|
|
157
163
|
const tone = getSidebarItemTone(density);
|
|
158
|
-
const { pathname } = useLocation();
|
|
159
|
-
const isActive = isSidebarRouteActive(pathname, to);
|
|
164
|
+
const { pathname, search } = useLocation();
|
|
165
|
+
const isActive = isSidebarRouteActive(pathname, search, to);
|
|
160
166
|
const link = (
|
|
167
|
+
<div
|
|
168
|
+
data-sidebar-item=""
|
|
169
|
+
data-active={isActive || undefined}
|
|
170
|
+
className={cn("group group/sidebar-item relative flex items-center", collapsed ? SIDEBAR_RAIL_CONTROL_CLASS : "w-full", SIDEBAR_ITEM_SURFACE_CLASS, isActive && SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS)}
|
|
171
|
+
>
|
|
161
172
|
<Link
|
|
162
173
|
to={to}
|
|
174
|
+
onClick={onNavigate}
|
|
163
175
|
aria-label={label}
|
|
164
176
|
aria-current={isActive ? "page" : undefined}
|
|
165
177
|
className={cn(
|
|
166
|
-
"
|
|
178
|
+
"flex min-w-0 flex-1 items-center rounded-xl font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
|
|
167
179
|
collapsed
|
|
168
180
|
? cn(SIDEBAR_RAIL_CONTROL_CLASS, "justify-center px-0 py-0")
|
|
169
181
|
: tone.row,
|
|
170
|
-
|
|
171
|
-
? collapsed
|
|
172
|
-
? SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS
|
|
173
|
-
: "bg-gray-200/80 text-gray-900 shadow-sm"
|
|
174
|
-
: collapsed
|
|
175
|
-
? SIDEBAR_RAIL_SURFACE_CLASS
|
|
176
|
-
: "text-muted-foreground hover:bg-gray-200/60 hover:text-gray-900",
|
|
177
|
-
className,
|
|
182
|
+
actions && !collapsed && "pr-9",
|
|
178
183
|
)}
|
|
179
184
|
>
|
|
180
185
|
<SidebarNavIcon
|
|
@@ -185,7 +190,7 @@ export function SidebarNavLinkItem({
|
|
|
185
190
|
isActive={isActive}
|
|
186
191
|
tone={tone}
|
|
187
192
|
/>
|
|
188
|
-
<span className={collapsed ? "sr-only" : "min-w-0 flex-1 text-left"}>
|
|
193
|
+
<span className={collapsed ? "sr-only" : "min-w-0 flex-1 truncate text-left"}>
|
|
189
194
|
{label}
|
|
190
195
|
</span>
|
|
191
196
|
{!collapsed && trailing ? (
|
|
@@ -194,6 +199,8 @@ export function SidebarNavLinkItem({
|
|
|
194
199
|
</span>
|
|
195
200
|
) : null}
|
|
196
201
|
</Link>
|
|
202
|
+
{!collapsed && actions ? <span className="absolute right-1 flex items-center">{actions}</span> : null}
|
|
203
|
+
</div>
|
|
197
204
|
);
|
|
198
205
|
|
|
199
206
|
return collapsed ? (
|
|
@@ -270,7 +277,8 @@ export function SidebarActionItem({
|
|
|
270
277
|
onClick={onClick}
|
|
271
278
|
aria-label={label}
|
|
272
279
|
className={cn(
|
|
273
|
-
"group flex w-full items-center
|
|
280
|
+
"group flex w-full items-center font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
|
|
281
|
+
SIDEBAR_ITEM_SURFACE_CLASS,
|
|
274
282
|
collapsed
|
|
275
283
|
? cn(
|
|
276
284
|
SIDEBAR_RAIL_CONTROL_CLASS,
|
|
@@ -344,7 +352,8 @@ export function SidebarSelectItem({
|
|
|
344
352
|
<SelectTrigger
|
|
345
353
|
aria-label={label}
|
|
346
354
|
className={cn(
|
|
347
|
-
"group h-auto w-full
|
|
355
|
+
"group h-auto w-full border-0 bg-transparent font-medium shadow-none focus:ring-0 focus-visible:ring-1 focus-visible:ring-border",
|
|
356
|
+
SIDEBAR_ITEM_SURFACE_CLASS,
|
|
348
357
|
collapsed
|
|
349
358
|
? cn(
|
|
350
359
|
SIDEBAR_RAIL_CONTROL_CLASS,
|
|
@@ -6,10 +6,19 @@ export const SIDEBAR_RAIL_ICON_CLASS = "h-4 w-4";
|
|
|
6
6
|
export const SIDEBAR_RAIL_STACK_CLASS = "space-y-1";
|
|
7
7
|
export const SIDEBAR_RAIL_ITEM_GAP_CLASS = "gap-1";
|
|
8
8
|
|
|
9
|
+
// Shared by expanded navigation, compound rows and the collapsed rail.
|
|
10
|
+
// Use theme neutral tokens directly so legacy gray utility overrides cannot
|
|
11
|
+
// turn sidebar feedback into a content selection or accent surface.
|
|
12
|
+
export const SIDEBAR_ITEM_SURFACE_CLASS =
|
|
13
|
+
"rounded-xl text-muted-foreground transition-colors duration-base hover:bg-[hsl(var(--gray-200)/0.6)] hover:text-foreground focus-within:bg-[hsl(var(--gray-200)/0.6)] has-[[data-context-menu-open]]:bg-[hsl(var(--gray-200)/0.6)]";
|
|
14
|
+
|
|
15
|
+
export const SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS =
|
|
16
|
+
"bg-[hsl(var(--gray-200)/0.8)] text-foreground hover:bg-[hsl(var(--gray-200)/0.8)] focus-within:bg-[hsl(var(--gray-200)/0.8)] has-[[data-context-menu-open]]:bg-[hsl(var(--gray-200)/0.8)]";
|
|
17
|
+
|
|
9
18
|
export const SIDEBAR_RAIL_SURFACE_CLASS =
|
|
10
|
-
|
|
19
|
+
`${SIDEBAR_ITEM_SURFACE_CLASS} active:bg-[hsl(var(--gray-200)/0.8)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border`;
|
|
11
20
|
|
|
12
|
-
export const SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS =
|
|
21
|
+
export const SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS = SIDEBAR_ITEM_ACTIVE_SURFACE_CLASS;
|
|
13
22
|
|
|
14
23
|
export const SIDEBAR_RAIL_PRIMARY_SURFACE_CLASS =
|
|
15
24
|
"bg-primary/10 text-primary transition-colors duration-base hover:bg-primary/15 hover:text-primary-700 active:bg-primary/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border";
|
|
@@ -19,7 +19,7 @@ import { IconActionButton } from "@/shared/components/ui/actions/icon-action-but
|
|
|
19
19
|
import { SCROLL_BOTTOM_EDGE_FADE_CLASS } from "@/shared/components/ui/scroll-area";
|
|
20
20
|
import { useAppPresenter } from "@/app/components/app-presenter-provider";
|
|
21
21
|
import { useRemoteStatus } from "@/features/remote";
|
|
22
|
-
import { useDesktopCapabilityAvailability } from "@/features/desktop-capabilities
|
|
22
|
+
import { useDesktopCapabilityAvailability } from "@/features/desktop-capabilities";
|
|
23
23
|
import { getSettingsNavSections } from "@/app/configs/app-navigation.config";
|
|
24
24
|
import { viewportLayoutManager } from "@/app/managers/viewport-layout.manager";
|
|
25
25
|
import { useViewportLayoutStore } from "@/app/stores/viewport-layout.store";
|
|
@@ -89,7 +89,8 @@ function SettingsSidebarHeader({
|
|
|
89
89
|
to="/chat"
|
|
90
90
|
aria-label={t("backToMain")}
|
|
91
91
|
className={cn(
|
|
92
|
-
"group inline-flex min-w-0 items-center
|
|
92
|
+
"group inline-flex min-w-0 items-center text-[12px] font-medium",
|
|
93
|
+
SIDEBAR_RAIL_SURFACE_CLASS,
|
|
93
94
|
isCollapsed
|
|
94
95
|
? cn(
|
|
95
96
|
SIDEBAR_RAIL_CONTROL_CLASS,
|
|
@@ -138,107 +138,60 @@ export function getMainSidebarNavItems(
|
|
|
138
138
|
];
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
export function
|
|
141
|
+
export function getSettingsNavSections(
|
|
142
142
|
translate: Translate,
|
|
143
143
|
options: SettingsNavigationOptions = {},
|
|
144
|
-
):
|
|
145
|
-
const
|
|
146
|
-
{
|
|
147
|
-
target: "/model",
|
|
148
|
-
label: translate("model"),
|
|
149
|
-
icon: Cpu,
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
target: "/providers",
|
|
153
|
-
label: translate("providers"),
|
|
154
|
-
icon: Sparkles,
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
target: "/channels",
|
|
158
|
-
label: translate("channels"),
|
|
159
|
-
icon: MessageSquare,
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
target: "/extensions",
|
|
163
|
-
label: translate("extensions"),
|
|
164
|
-
icon: Puzzle,
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
target: "/appearance",
|
|
168
|
-
label: translate("appearance"),
|
|
169
|
-
icon: Palette,
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
target: "/keyboard-shortcuts",
|
|
173
|
-
label: translate("keyboardShortcuts"),
|
|
174
|
-
icon: Keyboard,
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
target: "/security",
|
|
178
|
-
label: translate("security"),
|
|
179
|
-
icon: Shield,
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
target: "/privacy",
|
|
183
|
-
label: translate("privacy"),
|
|
184
|
-
icon: Activity,
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
target: "/desktop-capabilities",
|
|
188
|
-
label: translate("desktopCapabilities"),
|
|
189
|
-
icon: MonitorCog,
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
target: "/search",
|
|
193
|
-
label: translate("searchChannels"),
|
|
194
|
-
icon: Search,
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
target: "/updates",
|
|
198
|
-
label: translate("updates"),
|
|
199
|
-
icon: Download,
|
|
200
|
-
},
|
|
144
|
+
): AppNavigationSection[] {
|
|
145
|
+
const sections = [
|
|
201
146
|
{
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
147
|
+
label: translate("settingsGroupBasic"),
|
|
148
|
+
items: [
|
|
149
|
+
{ target: "/model", label: translate("model"), icon: Cpu },
|
|
150
|
+
{ target: "/providers", label: translate("providers"), icon: Sparkles },
|
|
151
|
+
{ target: "/channels", label: translate("channels"), icon: MessageSquare },
|
|
152
|
+
],
|
|
205
153
|
},
|
|
206
154
|
{
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
155
|
+
label: translate("settingsGroupCommon"),
|
|
156
|
+
items: [
|
|
157
|
+
{ target: "/appearance", label: translate("appearance"), icon: Palette },
|
|
158
|
+
{ target: "/updates", label: translate("updates"), icon: Download },
|
|
159
|
+
{ target: "/search", label: translate("searchChannels"), icon: Search },
|
|
160
|
+
{ target: "/keyboard-shortcuts", label: translate("keyboardShortcuts"), icon: Keyboard },
|
|
161
|
+
],
|
|
210
162
|
},
|
|
211
163
|
{
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
164
|
+
label: translate("settingsGroupSecurity"),
|
|
165
|
+
items: [
|
|
166
|
+
{ target: "/security", label: translate("security"), icon: Shield },
|
|
167
|
+
{ target: "/privacy", label: translate("privacy"), icon: Activity },
|
|
168
|
+
{ target: "/secrets", label: translate("secrets"), icon: KeyRound },
|
|
169
|
+
{ target: "/desktop-capabilities", label: translate("desktopCapabilities"), icon: MonitorCog },
|
|
170
|
+
],
|
|
215
171
|
},
|
|
216
172
|
{
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
173
|
+
label: translate("settingsGroupSystem"),
|
|
174
|
+
items: [
|
|
175
|
+
{ target: "/remote", label: translate("remote"), icon: Wifi },
|
|
176
|
+
{ target: "/runtime", label: translate("runtime"), icon: Cpu },
|
|
177
|
+
{ target: "/marketplace/mcp", label: translate("marketplaceFilterMcp"), icon: Wrench },
|
|
178
|
+
{ target: "/extensions", label: translate("extensions"), icon: Puzzle },
|
|
179
|
+
],
|
|
220
180
|
},
|
|
221
181
|
];
|
|
222
|
-
return
|
|
223
|
-
|
|
224
|
-
(
|
|
182
|
+
return sections.map((section) => ({
|
|
183
|
+
...section,
|
|
184
|
+
items: section.items.filter((item) =>
|
|
185
|
+
(options.includeDesktopCapabilities !== false || item.target !== "/desktop-capabilities") &&
|
|
186
|
+
(options.includeKeyboardShortcuts !== false || item.target !== "/keyboard-shortcuts")),
|
|
187
|
+
})).filter((section) => section.items.length > 0);
|
|
225
188
|
}
|
|
226
189
|
|
|
227
|
-
export function
|
|
190
|
+
export function getSettingsNavItems(
|
|
228
191
|
translate: Translate,
|
|
229
192
|
options: SettingsNavigationOptions = {},
|
|
230
|
-
):
|
|
231
|
-
|
|
232
|
-
return [
|
|
233
|
-
{
|
|
234
|
-
label: translate("settingsGroupBasic"),
|
|
235
|
-
items: items.slice(0, 3),
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
label: translate("settingsGroupAdvanced"),
|
|
239
|
-
items: items.slice(3),
|
|
240
|
-
},
|
|
241
|
-
];
|
|
193
|
+
): AppNavigationItem[] {
|
|
194
|
+
return getSettingsNavSections(translate, options).flatMap((section) => section.items);
|
|
242
195
|
}
|
|
243
196
|
|
|
244
197
|
export function isSettingsRoute(pathname: string): boolean {
|
|
@@ -75,22 +75,22 @@ export function AgentDetailsDialog({
|
|
|
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
77
|
<DialogHeader className="text-left">
|
|
78
|
-
<div className="flex min-w-0 items-center gap-3">
|
|
78
|
+
<div className="flex min-w-0 items-center gap-3 pr-7">
|
|
79
79
|
<AgentAvatar
|
|
80
80
|
agentId={agent.id}
|
|
81
81
|
displayName={agent.displayName}
|
|
82
82
|
avatarUrl={agent.avatarUrl}
|
|
83
83
|
className="h-10 w-10 shrink-0"
|
|
84
84
|
/>
|
|
85
|
-
<div className="min-w-0">
|
|
85
|
+
<div className="min-w-0 flex-1">
|
|
86
86
|
<DialogTitle className="truncate text-base">
|
|
87
87
|
{agent.displayName?.trim() || agent.id}
|
|
88
88
|
</DialogTitle>
|
|
89
|
-
<PageResourceActionsMenu page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
|
|
90
89
|
<DialogDescription className="truncate text-xs">
|
|
91
90
|
@{agent.id}
|
|
92
91
|
</DialogDescription>
|
|
93
92
|
</div>
|
|
93
|
+
<PageResourceActionsMenu page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
|
|
94
94
|
</div>
|
|
95
95
|
</DialogHeader>
|
|
96
96
|
</div>
|
|
@@ -133,6 +133,7 @@ function AgentListCard(props: {
|
|
|
133
133
|
onEdit,
|
|
134
134
|
onDelete,
|
|
135
135
|
} = props;
|
|
136
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
136
137
|
const runtimeValue = agent.runtime?.trim() || agent.engine?.trim() || "";
|
|
137
138
|
const runtimeLabel = runtimeValue
|
|
138
139
|
? (runtimeOptions.find(
|
|
@@ -181,7 +182,7 @@ function AgentListCard(props: {
|
|
|
181
182
|
>
|
|
182
183
|
<MessageCircle className="h-4 w-4" />
|
|
183
184
|
</Button>
|
|
184
|
-
<Popover>
|
|
185
|
+
<Popover open={menuOpen} onOpenChange={setMenuOpen}>
|
|
185
186
|
<PopoverTrigger asChild>
|
|
186
187
|
<Button
|
|
187
188
|
type="button"
|
|
@@ -194,9 +195,7 @@ function AgentListCard(props: {
|
|
|
194
195
|
<MoreVertical className="h-4 w-4" />
|
|
195
196
|
</Button>
|
|
196
197
|
</PopoverTrigger>
|
|
197
|
-
<PopoverContent align="end"
|
|
198
|
-
<PageResourceActionItems page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} />
|
|
199
|
-
<div className="my-1 border-t border-border" />
|
|
198
|
+
<PopoverContent align="end" variant="menu">
|
|
200
199
|
<AgentActionMenuItem
|
|
201
200
|
icon={Eye}
|
|
202
201
|
label={t("agentsViewDetailsAction")}
|
|
@@ -217,6 +216,8 @@ function AgentListCard(props: {
|
|
|
217
216
|
destructive
|
|
218
217
|
/>
|
|
219
218
|
) : null}
|
|
219
|
+
<div className="my-1 h-px bg-border" />
|
|
220
|
+
<PageResourceActionItems page={pageResourceFromSystemObject('agent', agent.id, agent.displayName || agent.id)} onSelect={() => setMenuOpen(false)} />
|
|
220
221
|
</PopoverContent>
|
|
221
222
|
</Popover>
|
|
222
223
|
</div>
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { CurrentPageActions } from '@/features/right-panel-resources';
|
|
2
1
|
import { ResourcePage } from '@/features/right-panel-resources';
|
|
3
2
|
import { lazy, Suspense, useLayoutEffect } from "react";
|
|
4
3
|
import { ChatSidebar } from "@/features/chat/components/layout/chat-sidebar";
|
|
@@ -73,7 +72,6 @@ export function ChatPageLayout({ view, confirmDialog }: ChatPageLayoutProps) {
|
|
|
73
72
|
{!isMobile ? <ChatSidebar /> : null}
|
|
74
73
|
{view === 'chat' ? (isMobile ? <ChatMobileShell /> : <ChatConversationPanel />) : (
|
|
75
74
|
<section data-theme-surface="workspace" className={`${resolveManagementWorkspaceClass(view)} flex flex-col`}>
|
|
76
|
-
{view !== 'resource' && view !== 'panel-app' ? <CurrentPageActions /> : null}
|
|
77
75
|
<div className="min-h-0 flex-1 overflow-hidden"><ManagementPageContent view={view} /></div>
|
|
78
76
|
</section>
|
|
79
77
|
)}
|
|
@@ -7,7 +7,7 @@ import { ChatVoiceShortcutControl } from './chat-voice-shortcut-control';
|
|
|
7
7
|
import { voicePermissionInstructionKeys } from '@/features/chat/utils/chat-voice-permissions.utils';
|
|
8
8
|
|
|
9
9
|
const ERROR_KEYS: Record<VoiceError, string> = {
|
|
10
|
-
unsupported: 'chatInputVoiceUnsupported', permission: 'chatInputVoicePermissionDenied',
|
|
10
|
+
'insecure-context': 'chatInputVoiceInsecureContext', unsupported: 'chatInputVoiceUnsupported', permission: 'chatInputVoicePermissionDenied',
|
|
11
11
|
'service-denied': 'chatInputVoiceServiceDenied', 'no-device': 'chatInputVoiceNoDevice', 'device-busy': 'chatInputVoiceDeviceBusy',
|
|
12
12
|
network: 'chatInputVoiceNetwork', 'audio-capture': 'chatInputVoiceDevice',
|
|
13
13
|
'no-speech': 'chatInputVoiceNoSpeech', interrupted: 'chatInputVoiceInterrupted',
|
|
@@ -57,7 +57,8 @@ export function ChatVoiceInputPanel({ manager, snapshot, onStart, desktop }: {
|
|
|
57
57
|
{phase === 'starting' ? <p className='sr-only'>{t('chatInputVoicePermissionPurpose')}</p> : null}
|
|
58
58
|
{error ? <VoiceErrorDetails error={error} microphoneError={microphoneError} text={snapshot.text} /> : null}
|
|
59
59
|
</div>
|
|
60
|
-
{error ? <Button className='mt-2 shrink-0 self-start' size='sm'
|
|
60
|
+
{error ? <Button className='mt-2 shrink-0 self-start' size='sm'
|
|
61
|
+
disabled={error === 'unsupported' || error === 'insecure-context'} onClick={onStart}>
|
|
61
62
|
{t(microphoneError ? 'chatInputVoiceCheckAndRetry' : 'chatInputVoiceRetry')}
|
|
62
63
|
</Button> : null}
|
|
63
64
|
{phase === 'error' ? <Button className='mt-2 shrink-0 self-start' variant='ghost' size='sm'
|
package/src/features/chat/features/conversation/hooks/__tests__/use-chat-voice-input.test.tsx
CHANGED
|
@@ -201,6 +201,10 @@ describe('dictation lifecycle', () => {
|
|
|
201
201
|
expect(manager.getSnapshot().error).toBe('timeout');
|
|
202
202
|
});
|
|
203
203
|
it('handles unsupported APIs and thrown starts', async () => {
|
|
204
|
+
const insecure = new ChatVoiceInputManager(() => recognition, async () => null, () => false);
|
|
205
|
+
insecure.start('en', 'one', draft);
|
|
206
|
+
expect(insecure.getSnapshot().error).toBe('insecure-context');
|
|
207
|
+
expect(recognition.start).not.toHaveBeenCalled();
|
|
204
208
|
const unsupported = new ChatVoiceInputManager(() => null);
|
|
205
209
|
unsupported.start('en', 'one', draft);
|
|
206
210
|
expect(unsupported.getSnapshot().error).toBe('unsupported');
|