@nextclaw/ui 0.19.1 → 0.19.3
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 +21 -0
- package/dist/assets/{abnfDiagram-VRR7QNED-DvTjgVMf.js → abnfDiagram-VRR7QNED-DrbfiNNF.js} +1 -1
- package/dist/assets/{aiden0z-pptx-renderer.es-C1nfBAXR.js → aiden0z-pptx-renderer.es-DdLb2IVc.js} +1 -1
- package/dist/assets/{api-Cyxp93Fn.js → api-CUSlBpt_.js} +3 -3
- package/dist/assets/{appearance-settings-page-NlQIHbXh.js → appearance-settings-page-cTuZdROP.js} +1 -1
- package/dist/assets/{arc-BvhODBXv.js → arc-BXlMc9B0.js} +1 -1
- package/dist/assets/architecture-TIHT7OUA-Bq0i9WiE.js +1 -0
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-BKO9RgNS.js → architectureDiagram-ZJ3FMSHR-DXAJxxO0.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-DHpDXy7D.js → blockDiagram-677ZJIJ3-i4Kz7zU0.js} +1 -1
- package/dist/assets/{book-open-Cl5CzL0g.js → book-open-BJ-xAIp9.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-BG_iQnDr.js → c4Diagram-LMCZKHZV-BDc0TkPd.js} +1 -1
- package/dist/assets/channel-iCaZQ87u.js +1 -0
- package/dist/assets/channels-list-page-nRHOasWA.js +8 -0
- package/dist/assets/chunk-2Q5K7J3B-DFQtlnJS.js +1 -0
- package/dist/assets/{chunk-32BRIVSS-DR9M0LLx.js → chunk-32BRIVSS-DuReei0Z.js} +1 -1
- package/dist/assets/{chunk-52WLFC77-698iC3BB.js → chunk-52WLFC77-D8APq0tm.js} +1 -1
- package/dist/assets/{chunk-5FCAYU7R-DikTj9Ey.js → chunk-5FCAYU7R-BsPrNXNS.js} +1 -1
- package/dist/assets/{chunk-5HE753X5-ko0o7_q0.js → chunk-5HE753X5-BRtkOPoJ.js} +1 -1
- package/dist/assets/{chunk-5JV3BV7I-CEHufhgo.js → chunk-5JV3BV7I-ChPc8e8U.js} +1 -1
- package/dist/assets/{chunk-5TONJI2A-CGgno1cu.js → chunk-5TONJI2A-CzTjlJGb.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-DkiB4cUQ.js → chunk-5VM5RSS4-xsv_22jR.js} +1 -1
- package/dist/assets/{chunk-7BUUIJ7U-DzptcytQ.js → chunk-7BUUIJ7U-CwECujme.js} +1 -1
- package/dist/assets/{chunk-BIQX33UG-DMRSQJvT.js → chunk-BIQX33UG-DQAm173p.js} +1 -1
- package/dist/assets/{chunk-C7G6YPKG-Bw1BwwuY.js → chunk-C7G6YPKG-BkpajeQb.js} +1 -1
- package/dist/assets/{chunk-CQNSW5MT-C0z6eHBk.js → chunk-CQNSW5MT-ND65pWRA.js} +1 -1
- package/dist/assets/{chunk-CYSBUYHQ-ByPyAouO.js → chunk-CYSBUYHQ-vMu6ijxG.js} +1 -1
- package/dist/assets/{chunk-EMLP6XTP-CJlAXWZg.js → chunk-EMLP6XTP-CEaeW3gH.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-Dqq4zKJu.js → chunk-EX3LRPZG-a4ER-HDr.js} +1 -1
- package/dist/assets/{chunk-FWX5IMBZ-B0SNoCmi.js → chunk-FWX5IMBZ-C_8fQssn.js} +2 -2
- package/dist/assets/{chunk-HOUHSVGY-DG_GJih_.js → chunk-HOUHSVGY-CEvw-PEd.js} +1 -1
- package/dist/assets/{chunk-ICXQ74PX-Drxk_6bE.js → chunk-ICXQ74PX-BEtF0fGY.js} +1 -1
- package/dist/assets/{chunk-JG7HCLWE-DdLFPpnd.js → chunk-JG7HCLWE-DGRrVp8-.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-B8M4G76F.js → chunk-JWPE2WC7-DRqpp_nM.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-XP6FJHY_.js → chunk-MOJQB5TN-BDEriOXs.js} +1 -1
- package/dist/assets/{chunk-MOZMSUNE-C_6x18Qw.js → chunk-MOZMSUNE-JWRNzdnw.js} +1 -1
- package/dist/assets/{chunk-OGEWGWER-N25BzCmG.js → chunk-OGEWGWER-DS2VTgCx.js} +1 -1
- package/dist/assets/{chunk-OSBZ3O6U-ASDEm7y0.js → chunk-OSBZ3O6U-3LiYTBUB.js} +1 -1
- package/dist/assets/{chunk-PUDLZKDR-CTlvAcn7.js → chunk-PUDLZKDR-o9M2s_SO.js} +1 -1
- package/dist/assets/{chunk-Q4XR5HBZ-Da9BWfB6.js → chunk-Q4XR5HBZ-DTB7Ma2N.js} +1 -1
- package/dist/assets/{chunk-QBLGF6JB-Bi6RpTJO.js → chunk-QBLGF6JB-DpkxZJL5.js} +1 -1
- package/dist/assets/{chunk-R7FJI6CG-DkMsSPvK.js → chunk-R7FJI6CG-CRejkHJU.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DZp0eU-j.js → chunk-RYQCIY6F-B1boBjLt.js} +1 -1
- package/dist/assets/{chunk-U6XO7XAA-vfinDSrj.js → chunk-U6XO7XAA-DgKa97bj.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-C9Nksccs.js → chunk-V7JOEXUC-DE56eh0N.js} +1 -1
- package/dist/assets/chunk-VAUOI2AC-CF9A-TeE.js +1 -0
- package/dist/assets/{chunk-VR4S4FIN-Xv6zfwXs.js → chunk-VR4S4FIN-BzomPZq2.js} +1 -1
- package/dist/assets/{chunk-WYO6CB5R-mOJNzbWl.js → chunk-WYO6CB5R-C6gy8rSd.js} +2 -2
- package/dist/assets/chunk-XXDRQBXY-BRxdfVCU.js +1 -0
- package/dist/assets/{chunk-YOTPTUD7-1-aKSu4o.js → chunk-YOTPTUD7-BK98yfl9.js} +1 -1
- package/dist/assets/{chunk-ZGVPDNZ5-OJ8veMpK.js → chunk-ZGVPDNZ5-DFXAhwUT.js} +1 -1
- package/dist/assets/{chunk-ZIRB5QZD-SR_Nq_PP.js → chunk-ZIRB5QZD-Bbu6BiNC.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-Bo28fPi-.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-BOVN9wUz.js +1 -0
- package/dist/assets/{config-split-page-C-YVl2mf.js → config-split-page-DO1Oyb-r.js} +1 -1
- package/dist/assets/{confirm-dialog-Bz3ieDQ5.js → confirm-dialog-CCae9Fr4.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-NjVgz2Bw.js → cose-bilkent-JH36ORCC-BV8KR4uF.js} +1 -1
- package/dist/assets/cynefin-VYW2F7L2-B7rF3JRp.js +1 -0
- package/dist/assets/{cynefinDiagram-TSTJHNR4-B_17LDqD.js → cynefinDiagram-TSTJHNR4-Ckd6nU9t.js} +1 -1
- package/dist/assets/{dagre-CMe101gk.js → dagre-D_T-FW5i.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-qo8nLb3B.js → dagre-VKFMJZFB-CyDaQpD4.js} +1 -1
- package/dist/assets/desktop-update-config-XSV-DjJW.js +1 -0
- package/dist/assets/{diagram-FQU43EPY-Ba3XIklC.js → diagram-FQU43EPY-CghnwS0H.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-CG45TcUx.js → diagram-G47NLZAW-DK4DJ3Kx.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-2F2HrwV-.js → diagram-NH7WQ7WH-CUgDkZCJ.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-CXfWH9NZ.js → diagram-OA4YK3LP-vO2gyH6n.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-CH_4yepc.js → diagram-WEI45ONY-DbSBRDSr.js} +1 -1
- package/dist/assets/{dist-HFDWY6-K.js → dist-1N9UpL3c.js} +1 -1
- package/dist/assets/{dist-CDPl8mm7.js → dist-C-2H76Cv.js} +1 -1
- package/dist/assets/doc-browser-BHFCZIoL.js +1 -0
- package/dist/assets/{doc-browser-D6H_nPzO.js → doc-browser-CRlpqMwH.js} +1 -1
- package/dist/assets/{doc-browser-context-BKwz_j44.js → doc-browser-context-C0Bns1J6.js} +1 -1
- package/dist/assets/{docx-preview-CoM4JK7_.js → docx-preview-DfxIm9IB.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-BwiG4Ea1.js → ebnfDiagram-CCIWWBDH-W7CAcK7r.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-BML3hpnQ.js → erDiagram-Q63AITRT-LA0JWL8-.js} +1 -1
- package/dist/assets/eventmodeling-45OFAUF4-DzQLXa3s.js +1 -0
- package/dist/assets/flowDiagram-23GEKE2U-C81eexJZ.js +1 -0
- package/dist/assets/{form-actions-BUZOCfPR.js → form-actions-CMxhPact.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-80enfWbD.js → ganttDiagram-NO4QXBWP-_PiTPavJ.js} +1 -1
- package/dist/assets/gitGraph-TEB2WS4Q-Dt3ZqpFD.js +1 -0
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-CVLqXr-b.js → gitGraphDiagram-IHSO6WYX-DsRB1ZMU.js} +1 -1
- package/dist/assets/index-DdYOaKm7.js +109 -0
- package/dist/assets/index-DxCGKhAw.css +1 -0
- package/dist/assets/info-DKCQHKI2-CCCE7dXC.js +1 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-Dyvs2t0i.js → infoDiagram-FWYZ7A6U-wIRraYx5.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-sSnxDKfh.js → ishikawaDiagram-FXEZZL3T-CNzsrcrh.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-D22V71Mf.js → journeyDiagram-5HDEW3XC-Dy9huHxy.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-D3ds0p-g.js → kanban-definition-HUTT4EX6-BOCIN365.js} +1 -1
- package/dist/assets/{line-CbyFs065.js → line-BxsizOTs.js} +1 -1
- package/dist/assets/{linear-4DKtnZBS.js → linear-C_YHf92I.js} +1 -1
- package/dist/assets/loader-circle-B-UdXjl4.js +1 -0
- package/dist/assets/{map-CcZzEoz6.js → map-CobcjgZ8.js} +1 -1
- package/dist/assets/mcp-marketplace-page-BUIGtSda.js +1 -0
- package/dist/assets/mcp-marketplace-page-CStb8ml2.js +9 -0
- package/dist/assets/{mermaid-parser.core-DPmMOjXD.js → mermaid-parser.core-D7lu2RbA.js} +2 -2
- package/dist/assets/{mermaid.core-BSf-ddRa.js → mermaid.core-CbfW2Rk8.js} +3 -3
- package/dist/assets/{mindmap-definition-LN4V7U3C-BUTwWPyx.js → mindmap-definition-LN4V7U3C-DUjGXlIC.js} +1 -1
- package/dist/assets/model-config-page-BkfUYm95.js +1 -0
- package/dist/assets/{navigation-link-CDMYpkVv.js → navigation-link-v3FaWcIr.js} +1 -1
- package/dist/assets/{ordinal-BgLYtOZE.js → ordinal-CjoUCHto.js} +1 -1
- package/dist/assets/packet-7NZHBO7P-D19yoxFV.js +1 -0
- package/dist/assets/{pegDiagram-2B236MQR-BEu_ZBjc.js → pegDiagram-2B236MQR-BQY2DgiP.js} +1 -1
- package/dist/assets/pie-RZYD4A2V-hMaJbLrn.js +1 -0
- package/dist/assets/{pieDiagram-ENE6RG2P-CAwAwuBd.js → pieDiagram-ENE6RG2P-D18owe4D.js} +1 -1
- package/dist/assets/plus-Dw9QFnKr.js +1 -0
- package/dist/assets/privacy-settings-page-CYM1Dxwo.js +1 -0
- package/dist/assets/providers-config-page-fxL4I4bz.js +1 -0
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-CwE6F-_2.js → quadrantDiagram-ABIIQ3AL-B8F7YoTA.js} +1 -1
- package/dist/assets/radar-I7S5WNFK-C8BkvScA.js +1 -0
- package/dist/assets/railroad-3IZDKUUU-CozZOitC.js +1 -0
- package/dist/assets/railroad-abnf-AHOZXSZD-BqIoFXFi.js +1 -0
- package/dist/assets/railroad-ebnf-EBAXGLYW-CD2e3dng.js +1 -0
- package/dist/assets/railroad-peg-LSFZ7HO6-DoKlRUOF.js +1 -0
- package/dist/assets/{railroadDiagram-RFXS5EU6-xgLekU3B.js → railroadDiagram-RFXS5EU6-RU8GpxN5.js} +1 -1
- package/dist/assets/{react-B7Paq2b3.js → react-Dlz_IxoP.js} +1 -1
- package/dist/assets/{refresh-cw-XrnNVwuQ.js → refresh-cw-CK4I5UFv.js} +1 -1
- package/dist/assets/remote-B0pPgtC6.js +1 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-CyVUzEX5.js → requirementDiagram-TGXJPOKE-ubPOmmNi.js} +1 -1
- package/dist/assets/rotate-cw-Z48dmh13.js +1 -0
- package/dist/assets/runtime-config-page-C7vksFVD.js +1 -0
- package/dist/assets/{sankeyDiagram-HTMAVEWB-JK6bFmYB.js → sankeyDiagram-HTMAVEWB-8L_hXJWW.js} +1 -1
- package/dist/assets/{save-_nSNAYQu.js → save-Bo37cIFb.js} +1 -1
- package/dist/assets/{search-0OTHFRMx.js → search-CZiEm7YD.js} +1 -1
- package/dist/assets/search-config-page-DKdEf7m9.js +1 -0
- package/dist/assets/{secrets-config-page-KoFrETds.js → secrets-config-page-COlMqSfL.js} +2 -2
- package/dist/assets/security-config-CitLihXA.js +1 -0
- package/dist/assets/{select-BZHvnwQB.js → select-BACzapV3.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-BR5IokXV.js → sequenceDiagram-DBY2YBRQ-Dom6Qor5.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-SxG_YnMA.js → sizeCapture-X5ZJPWSS-cZcFSpLJ.js} +1 -1
- package/dist/assets/skeleton-B2PCAZJG.js +1 -0
- package/dist/assets/{src-vgz8E_-O.js → src-BE9E1xcR.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-DD4OoYhn.js → stateDiagram-2N3HPSRC-CHrpxmGO.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-b1pZQlDD.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-BWkFeyCT.js → swimlanes-5IMT3BWC-D6nJS2xQ.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-CowxgWVn.js +8 -0
- package/dist/assets/{tag-chip-Ce53PMTL.js → tag-chip-BnamTQVX.js} +1 -1
- package/dist/assets/{timeline-definition-FHXFAJF6-VTRPy6KA.js → timeline-definition-FHXFAJF6-DJNn-HQO.js} +1 -1
- package/dist/assets/treeView-QDETBFTQ-BQlYkJbz.js +1 -0
- package/dist/assets/treemap-6X3UGDF4-DzTOd1bd.js +1 -0
- package/dist/assets/{vennDiagram-L72KCM5P-Bvk42Pek.js → vennDiagram-L72KCM5P-CCEzHoXt.js} +1 -1
- package/dist/assets/wardley-OPB4EBWU-D80jQc0y.js +1 -0
- package/dist/assets/{wardleyDiagram-EHGQE667-DOFjx2s3.js → wardleyDiagram-EHGQE667-BhyVxVXt.js} +1 -1
- package/dist/assets/x-BzYEzkLA.js +1 -0
- package/dist/assets/{xychartDiagram-FW5EYKEG-DY5yRTUc.js → xychartDiagram-FW5EYKEG-CacW_246.js} +1 -1
- package/dist/index.html +70 -22
- package/index.html +49 -1
- package/package.json +9 -9
- package/src/app/configs/app-navigation.config.ts +6 -0
- package/src/app/index.tsx +9 -3
- package/src/app/managers/__tests__/viewport-layout.manager.test.ts +12 -0
- package/src/app/managers/viewport-layout.manager.ts +12 -0
- package/src/app/stores/viewport-layout.store.ts +23 -11
- package/src/features/apps/components/__tests__/app-marketplace-catalog.test.tsx +161 -0
- package/src/features/apps/components/app-marketplace-catalog.tsx +36 -7
- package/src/features/apps/components/app-marketplace-detail.tsx +29 -6
- package/src/features/apps/components/app-marketplace-dialog.tsx +71 -55
- package/src/features/apps/components/app-marketplace-operation.tsx +128 -16
- package/src/features/apps/components/app-packages-panel.tsx +1 -0
- package/src/features/apps/utils/app-marketplace-platform.utils.test.ts +59 -0
- package/src/features/apps/utils/app-marketplace-platform.utils.ts +33 -0
- package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +6 -0
- package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +6 -2
- package/src/features/chat/features/conversation/components/__tests__/session-queued-input-rows.test.tsx +46 -0
- package/src/features/chat/features/conversation/components/session-conversation-area.tsx +15 -2
- package/src/features/chat/features/conversation/components/session-conversation-input.tsx +5 -3
- package/src/features/chat/features/conversation/components/session-queued-input-rows.tsx +59 -5
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +35 -1
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-run-queue.test.tsx +25 -19
- package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +148 -134
- package/src/features/chat/features/conversation/hooks/use-session-pending-input-actions.ts +135 -0
- package/src/features/chat/features/conversation/hooks/use-session-run-queue.ts +19 -4
- package/src/features/chat/features/conversation/utils/__tests__/session-queued-input.utils.test.ts +52 -2
- package/src/features/chat/features/conversation/utils/session-queued-input.utils.ts +46 -5
- package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +1 -0
- package/src/features/chat/features/ncp/hooks/__tests__/use-hydrated-ncp-agent.test.tsx +102 -0
- package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-session-conversation.test.tsx +117 -1
- package/src/features/chat/features/ncp/hooks/use-ncp-session-conversation.ts +2 -2
- package/src/features/chat/features/ncp/hooks/use-ncp-session-message-history.ts +31 -81
- package/src/features/chat/features/ncp/hooks/use-ncp-session-seed-loader.ts +134 -0
- package/src/features/chat/features/session/utils/ncp-session-adapter.utils.ts +1 -6
- package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +8 -0
- package/src/features/panel-apps/components/__tests__/panel-app-main-sidebar-nav.test.tsx +99 -13
- package/src/features/panel-apps/components/panel-app-main-sidebar-menu-item.tsx +4 -0
- package/src/features/panel-apps/components/panel-app-main-sidebar-nav.tsx +166 -31
- package/src/features/settings/pages/__tests__/privacy-settings-page.test.tsx +33 -0
- package/src/features/settings/pages/privacy-settings-page.tsx +83 -0
- package/src/shared/hooks/use-config.ts +21 -1
- package/src/shared/lib/api/types.ts +13 -0
- package/src/shared/lib/api/utils/config.utils.ts +8 -0
- package/src/shared/lib/api/utils/ncp-attachments.utils.ts +8 -1
- package/src/shared/lib/api/utils/ncp-session.utils.ts +1 -0
- package/src/shared/lib/i18n/locales/en-US/chat.json +3 -0
- package/src/shared/lib/i18n/locales/en-US/core.json +19 -0
- package/src/shared/lib/i18n/locales/en-US/doc-browser.json +11 -1
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +3 -0
- package/src/shared/lib/i18n/locales/zh-CN/core.json +19 -0
- package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +11 -1
- package/src/vite-env.d.ts +9 -0
- package/dist/assets/architecture-TIHT7OUA-Bjp9jf0h.js +0 -1
- package/dist/assets/channel-5T3pdR-s.js +0 -1
- package/dist/assets/channels-list-page-DhXfsjxF.js +0 -8
- package/dist/assets/chat-page-C4DHLN6T.js +0 -1
- package/dist/assets/chunk-2Q5K7J3B-DTZ3tGfE.js +0 -1
- package/dist/assets/chunk-VAUOI2AC-HLGIHQ6k.js +0 -1
- package/dist/assets/chunk-XXDRQBXY-Dl0m6Ni-.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DcDnzGNX.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-BKXKMzKM.js +0 -1
- package/dist/assets/cynefin-VYW2F7L2-BWg7U2UD.js +0 -1
- package/dist/assets/desktop-update-config-CpsXBUJK.js +0 -1
- package/dist/assets/doc-browser-CWhs0JQN.js +0 -1
- package/dist/assets/eventmodeling-45OFAUF4-SB-J4tpq.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-BQ_u-eLM.js +0 -1
- package/dist/assets/gitGraph-TEB2WS4Q-DPxNwsFd.js +0 -1
- package/dist/assets/index-Bfr0I0Ga.js +0 -109
- package/dist/assets/index-DcqrfCMy.css +0 -1
- package/dist/assets/info-DKCQHKI2-DNlNGH90.js +0 -1
- package/dist/assets/loader-circle-s65a4ZzL.js +0 -1
- package/dist/assets/mcp-marketplace-page-BJvzGt7h.js +0 -9
- package/dist/assets/mcp-marketplace-page-EpFHeJzw.js +0 -1
- package/dist/assets/model-config-page-BRScCkS-.js +0 -1
- package/dist/assets/packet-7NZHBO7P-BpeiqkBZ.js +0 -1
- package/dist/assets/pie-RZYD4A2V-Cy1yxsPd.js +0 -1
- package/dist/assets/plus-XDIkqpkt.js +0 -1
- package/dist/assets/provider-scoped-model-input-CD93ZOgZ.js +0 -1
- package/dist/assets/providers-config-page-CFdgth2A.js +0 -1
- package/dist/assets/radar-I7S5WNFK-CEcPKCj8.js +0 -1
- package/dist/assets/railroad-3IZDKUUU-CW38eNDs.js +0 -1
- package/dist/assets/railroad-abnf-AHOZXSZD-ByrylcXf.js +0 -1
- package/dist/assets/railroad-ebnf-EBAXGLYW-CNB6GwP-.js +0 -1
- package/dist/assets/railroad-peg-LSFZ7HO6-x6hnqlBG.js +0 -1
- package/dist/assets/remote-DDN70hyU.js +0 -1
- package/dist/assets/rotate-cw-BhIWpLaU.js +0 -1
- package/dist/assets/runtime-config-page-BxJlm6qT.js +0 -1
- package/dist/assets/search-config-page-2VAarRcG.js +0 -1
- package/dist/assets/security-config-BgIIrg1s.js +0 -1
- package/dist/assets/settings-2-CM_PvDNk.js +0 -1
- package/dist/assets/skeleton-Bv4MMbH7.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-ZC6dFORv.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-CRkh51Im.js +0 -8
- package/dist/assets/treeView-QDETBFTQ-Bw0DSCH7.js +0 -1
- package/dist/assets/treemap-6X3UGDF4-DFWBFcfh.js +0 -1
- package/dist/assets/wardley-OPB4EBWU-CoWturk0.js +0 -1
- package/dist/assets/x-CCjWN5ys.js +0 -1
- /package/dist/assets/{array-NADKd9aU.js → array-COEOjKUv.js} +0 -0
- /package/dist/assets/{chunk-KEIR6QF5-BuyuzJJL.js → chunk-KEIR6QF5-D7oHAcry.js} +0 -0
- /package/dist/assets/{chunk-Y2CYZVJY-D_B2ZRNt.js → chunk-Y2CYZVJY-08IUpgTP.js} +0 -0
- /package/dist/assets/{config-hints-BcfVUMij.js → config-hints-BoE41XDI.js} +0 -0
- /package/dist/assets/{cytoscape.esm-BANTlgza.js → cytoscape.esm-HifWufkp.js} +0 -0
- /package/dist/assets/{defaultLocale-C4_L0aEs.js → defaultLocale-CA-_SsC1.js} +0 -0
- /package/dist/assets/{dist-DAPEIJbz.js → dist-C60rvfy8.js} +0 -0
- /package/dist/assets/{graphlib-ChqXg0dI.js → graphlib-CGYCNsoJ.js} +0 -0
- /package/dist/assets/{host-capabilities-D9C4CBK5.js → host-capabilities-DPNRAjIj.js} +0 -0
- /package/dist/assets/{init-D8wZg9xq.js → init-C3plFVsG.js} +0 -0
- /package/dist/assets/{jszip.min-CkbBfwAQ.js → jszip.min-CeYs17Gn.js} +0 -0
- /package/dist/assets/{katex-TZJFa0J_.js → katex-DRThweSG.js} +0 -0
- /package/dist/assets/{middleware-B3k-TSmZ.js → middleware-D05fK5Sb.js} +0 -0
- /package/dist/assets/{path-DodfxcX7.js → path-BKtKxQ6Y.js} +0 -0
- /package/dist/assets/{rough.esm-CUaa1Rbe.js → rough.esm-DurL7-u7.js} +0 -0
- /package/dist/assets/{xlsx-CxByi7bR.js → xlsx-Sg8fZ6nH.js} +0 -0
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
import { useMemo, useState } from "react";
|
|
2
|
-
import { MoreVertical } from "lucide-react";
|
|
2
|
+
import { ChevronDown, LayoutGrid, MoreVertical } from "lucide-react";
|
|
3
|
+
import { useLocation } from "react-router-dom";
|
|
4
|
+
import { viewportLayoutManager } from "@/app/managers/viewport-layout.manager";
|
|
5
|
+
import {
|
|
6
|
+
SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS,
|
|
7
|
+
SIDEBAR_RAIL_CONTROL_CLASS,
|
|
8
|
+
SIDEBAR_RAIL_ICON_CLASS,
|
|
9
|
+
SIDEBAR_RAIL_SURFACE_CLASS,
|
|
10
|
+
} from "@/app/components/layout/sidebar-rail.styles";
|
|
3
11
|
import { SidebarNavLinkItem } from "@/app/components/layout/sidebar-items";
|
|
4
|
-
import {
|
|
12
|
+
import { useViewportLayoutStore } from "@/app/stores/viewport-layout.store";
|
|
5
13
|
import { PanelAppIcon } from "@/features/panel-apps/components/panel-app-icon";
|
|
6
14
|
import { PanelAppMainSidebarMenuItem } from "@/features/panel-apps/components/panel-app-main-sidebar-menu-item";
|
|
7
15
|
import { usePanelApps } from "@/features/panel-apps/hooks/use-panel-apps";
|
|
8
|
-
import {
|
|
16
|
+
import { IconActionButton } from "@/shared/components/ui/actions/icon-action-button";
|
|
17
|
+
import {
|
|
18
|
+
Popover,
|
|
19
|
+
PopoverContent,
|
|
20
|
+
PopoverTrigger,
|
|
21
|
+
} from "@/shared/components/ui/popover";
|
|
22
|
+
import {
|
|
23
|
+
Tooltip,
|
|
24
|
+
TooltipContent,
|
|
25
|
+
TooltipProvider,
|
|
26
|
+
TooltipTrigger,
|
|
27
|
+
} from "@/shared/components/ui/tooltip";
|
|
9
28
|
import type { PanelAppEntryView } from "@/shared/lib/api";
|
|
10
29
|
import { t } from "@/shared/lib/i18n";
|
|
11
30
|
import { cn } from "@/shared/lib/utils";
|
|
@@ -17,10 +36,11 @@ export function getMainSidebarPanelApps(
|
|
|
17
36
|
): PanelAppEntryView[] {
|
|
18
37
|
return entries
|
|
19
38
|
.filter((entry) => entry.mainSidebar)
|
|
20
|
-
.sort(
|
|
21
|
-
(left
|
|
22
|
-
(
|
|
23
|
-
|
|
39
|
+
.sort(
|
|
40
|
+
(left, right) =>
|
|
41
|
+
(left.mainSidebarOrder ?? MAIN_SIDEBAR_FALLBACK_ORDER) -
|
|
42
|
+
(right.mainSidebarOrder ?? MAIN_SIDEBAR_FALLBACK_ORDER) ||
|
|
43
|
+
left.title.localeCompare(right.title),
|
|
24
44
|
);
|
|
25
45
|
}
|
|
26
46
|
|
|
@@ -34,62 +54,177 @@ export function PanelAppMainSidebarNav({
|
|
|
34
54
|
() => getMainSidebarPanelApps(panelApps.data?.entries ?? []),
|
|
35
55
|
[panelApps.data?.entries],
|
|
36
56
|
);
|
|
57
|
+
const isGroupCollapsed = useViewportLayoutStore(
|
|
58
|
+
(state) => state.isMainSidebarAppGroupCollapsed,
|
|
59
|
+
);
|
|
37
60
|
|
|
38
61
|
if (entries.length === 0) {
|
|
39
62
|
return null;
|
|
40
63
|
}
|
|
41
64
|
|
|
65
|
+
if (isCollapsed) {
|
|
66
|
+
return <PanelAppMainSidebarRailMenu entries={entries} />;
|
|
67
|
+
}
|
|
68
|
+
|
|
42
69
|
return (
|
|
43
70
|
<div
|
|
71
|
+
className="mt-1 border-t border-border/50 px-3 pt-1"
|
|
72
|
+
data-testid="panel-app-main-sidebar-nav"
|
|
73
|
+
>
|
|
74
|
+
<PanelAppMainSidebarGroupHeader
|
|
75
|
+
entries={entries}
|
|
76
|
+
isCollapsed={isGroupCollapsed}
|
|
77
|
+
/>
|
|
78
|
+
{!isGroupCollapsed ? (
|
|
79
|
+
<ul className="mt-0.5 space-y-0.5">
|
|
80
|
+
{entries.map((entry) => (
|
|
81
|
+
<PanelAppMainSidebarNavItem key={entry.appId} entry={entry} />
|
|
82
|
+
))}
|
|
83
|
+
</ul>
|
|
84
|
+
) : null}
|
|
85
|
+
</div>
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function getPanelAppTarget(appId: string): string {
|
|
90
|
+
return `/apps/panel/${encodeURIComponent(appId)}`;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function useHasActivePanelApp(entries: readonly PanelAppEntryView[]): boolean {
|
|
94
|
+
const { pathname } = useLocation();
|
|
95
|
+
return entries.some((entry) => pathname === getPanelAppTarget(entry.appId));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function PanelAppMainSidebarGroupHeader({
|
|
99
|
+
entries,
|
|
100
|
+
isCollapsed,
|
|
101
|
+
}: {
|
|
102
|
+
entries: readonly PanelAppEntryView[];
|
|
103
|
+
isCollapsed: boolean;
|
|
104
|
+
}) {
|
|
105
|
+
const isActive = useHasActivePanelApp(entries);
|
|
106
|
+
const actionLabel = isCollapsed
|
|
107
|
+
? t("panelAppsMainSidebarGroupExpand")
|
|
108
|
+
: t("panelAppsMainSidebarGroupCollapse");
|
|
109
|
+
return (
|
|
110
|
+
<button
|
|
111
|
+
type="button"
|
|
112
|
+
aria-label={actionLabel}
|
|
113
|
+
aria-expanded={!isCollapsed}
|
|
44
114
|
className={cn(
|
|
45
|
-
"
|
|
46
|
-
isCollapsed
|
|
115
|
+
"flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-left text-[13px] font-medium text-muted-foreground transition-colors hover:bg-gray-200/60 hover:text-gray-900 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
|
|
116
|
+
isCollapsed && isActive && "bg-gray-200/80 text-gray-900",
|
|
47
117
|
)}
|
|
118
|
+
onClick={viewportLayoutManager.toggleMainSidebarAppGroupCollapsed}
|
|
119
|
+
>
|
|
120
|
+
<ChevronDown
|
|
121
|
+
aria-hidden="true"
|
|
122
|
+
className={cn(
|
|
123
|
+
"h-3.5 w-3.5 shrink-0 transition-transform",
|
|
124
|
+
isCollapsed && "-rotate-90",
|
|
125
|
+
)}
|
|
126
|
+
/>
|
|
127
|
+
<span className="min-w-0 flex-1 truncate">
|
|
128
|
+
{t("panelAppsMainSidebarGroup")}
|
|
129
|
+
</span>
|
|
130
|
+
<span className="text-[11px] font-medium text-muted-foreground">
|
|
131
|
+
{entries.length}
|
|
132
|
+
</span>
|
|
133
|
+
</button>
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function PanelAppMainSidebarRailMenu({
|
|
138
|
+
entries,
|
|
139
|
+
}: {
|
|
140
|
+
entries: PanelAppEntryView[];
|
|
141
|
+
}) {
|
|
142
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
143
|
+
const isActive = useHasActivePanelApp(entries);
|
|
144
|
+
const label = t("panelAppsMainSidebarGroup");
|
|
145
|
+
return (
|
|
146
|
+
<div
|
|
147
|
+
className="mt-1 flex justify-center border-t border-border/50 pt-1"
|
|
48
148
|
data-testid="panel-app-main-sidebar-nav"
|
|
49
149
|
>
|
|
50
|
-
<
|
|
51
|
-
{
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
150
|
+
<Popover open={isOpen} onOpenChange={setIsOpen}>
|
|
151
|
+
<TooltipProvider delayDuration={250}>
|
|
152
|
+
<Tooltip disableHoverableContent>
|
|
153
|
+
<TooltipTrigger asChild>
|
|
154
|
+
<PopoverTrigger asChild>
|
|
155
|
+
<IconActionButton
|
|
156
|
+
icon={<LayoutGrid className={SIDEBAR_RAIL_ICON_CLASS} />}
|
|
157
|
+
label={label}
|
|
158
|
+
tooltip={false}
|
|
159
|
+
className={cn(
|
|
160
|
+
SIDEBAR_RAIL_CONTROL_CLASS,
|
|
161
|
+
isActive
|
|
162
|
+
? SIDEBAR_RAIL_ACTIVE_SURFACE_CLASS
|
|
163
|
+
: SIDEBAR_RAIL_SURFACE_CLASS,
|
|
164
|
+
)}
|
|
165
|
+
/>
|
|
166
|
+
</PopoverTrigger>
|
|
167
|
+
</TooltipTrigger>
|
|
168
|
+
<TooltipContent side="right" className="text-xs">
|
|
169
|
+
{label}
|
|
170
|
+
</TooltipContent>
|
|
171
|
+
</Tooltip>
|
|
172
|
+
</TooltipProvider>
|
|
173
|
+
<PopoverContent
|
|
174
|
+
side="right"
|
|
175
|
+
align="start"
|
|
176
|
+
className="w-60 rounded-xl p-2"
|
|
177
|
+
>
|
|
178
|
+
<div className="flex items-center justify-between px-2 py-1 text-xs font-semibold text-muted-foreground">
|
|
179
|
+
<span>{label}</span>
|
|
180
|
+
<span className="font-medium text-muted-foreground/60">
|
|
181
|
+
{entries.length}
|
|
182
|
+
</span>
|
|
183
|
+
</div>
|
|
184
|
+
<ul className="mt-1 space-y-0.5">
|
|
185
|
+
{entries.map((entry) => (
|
|
186
|
+
<PanelAppMainSidebarNavItem
|
|
187
|
+
key={entry.appId}
|
|
188
|
+
entry={entry}
|
|
189
|
+
onNavigate={() => setIsOpen(false)}
|
|
190
|
+
/>
|
|
191
|
+
))}
|
|
192
|
+
</ul>
|
|
193
|
+
</PopoverContent>
|
|
194
|
+
</Popover>
|
|
59
195
|
</div>
|
|
60
196
|
);
|
|
61
197
|
}
|
|
62
198
|
|
|
63
199
|
function PanelAppMainSidebarNavItem({
|
|
64
200
|
entry,
|
|
65
|
-
|
|
201
|
+
onNavigate,
|
|
66
202
|
}: {
|
|
67
203
|
entry: PanelAppEntryView;
|
|
68
|
-
|
|
204
|
+
onNavigate?: () => void;
|
|
69
205
|
}) {
|
|
70
206
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
71
|
-
const
|
|
207
|
+
const linkItem = (
|
|
72
208
|
<SidebarNavLinkItem
|
|
73
|
-
to={
|
|
209
|
+
to={getPanelAppTarget(entry.appId)}
|
|
74
210
|
label={entry.title}
|
|
75
|
-
iconNode={
|
|
211
|
+
iconNode={
|
|
76
212
|
<PanelAppIcon
|
|
77
213
|
icon={entry.icon}
|
|
78
214
|
title={entry.title}
|
|
79
215
|
className="h-full w-full text-[13px]"
|
|
80
216
|
imageClassName="rounded-[3px]"
|
|
81
217
|
/>
|
|
82
|
-
|
|
218
|
+
}
|
|
83
219
|
density="compact"
|
|
84
|
-
|
|
85
|
-
className={isCollapsed ? undefined : "rounded-lg py-1.5 pl-2.5 pr-9"}
|
|
220
|
+
className="rounded-lg py-1.5 pl-5 pr-9"
|
|
86
221
|
/>
|
|
87
222
|
);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
223
|
+
const link = onNavigate ? (
|
|
224
|
+
<div onClick={onNavigate}>{linkItem}</div>
|
|
225
|
+
) : (
|
|
226
|
+
linkItem
|
|
227
|
+
);
|
|
93
228
|
const menuLabel = `${t("panelAppsMoreActions")}: ${entry.title}`;
|
|
94
229
|
return (
|
|
95
230
|
<li>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { PrivacySettingsPage } from '@/features/settings/pages/privacy-settings-page';
|
|
4
|
+
|
|
5
|
+
const mocks = vi.hoisted(() => ({ mutate: vi.fn() }));
|
|
6
|
+
|
|
7
|
+
vi.mock('@/shared/hooks/use-config', () => ({
|
|
8
|
+
useConfig: () => ({
|
|
9
|
+
data: { productAnalytics: { enabled: false, audience: 'external' } },
|
|
10
|
+
isLoading: false
|
|
11
|
+
}),
|
|
12
|
+
useUpdateProductAnalytics: () => ({
|
|
13
|
+
isPending: false,
|
|
14
|
+
mutate: mocks.mutate
|
|
15
|
+
})
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
describe('PrivacySettingsPage', () => {
|
|
19
|
+
beforeEach(() => mocks.mutate.mockClear());
|
|
20
|
+
|
|
21
|
+
it('requires explicit opt-in and saves the selected test audience', () => {
|
|
22
|
+
render(<PrivacySettingsPage />);
|
|
23
|
+
|
|
24
|
+
const shareSwitch = screen.getByRole('switch', { name: 'Share product activity' });
|
|
25
|
+
expect(shareSwitch.getAttribute('aria-checked')).toBe('false');
|
|
26
|
+
fireEvent.click(shareSwitch);
|
|
27
|
+
expect(mocks.mutate).toHaveBeenCalledWith({ data: { enabled: true } });
|
|
28
|
+
|
|
29
|
+
fireEvent.click(screen.getByRole('combobox', { name: 'Analytics audience' }));
|
|
30
|
+
fireEvent.click(screen.getByRole('option', { name: 'QA testing' }));
|
|
31
|
+
expect(mocks.mutate).toHaveBeenCalledWith({ data: { audience: 'qa' } });
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { SettingsPage } from '@/shared/components/settings/settings-page';
|
|
2
|
+
import { SettingRow, SettingsGroup, SettingsSection } from '@/shared/components/settings/setting-row';
|
|
3
|
+
import { Switch } from '@/shared/components/ui/switch';
|
|
4
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/shared/components/ui/select';
|
|
5
|
+
import { useConfig, useUpdateProductAnalytics } from '@/shared/hooks/use-config';
|
|
6
|
+
import type { ProductAnalyticsAudience } from '@/shared/lib/api';
|
|
7
|
+
import { t } from '@/shared/lib/i18n';
|
|
8
|
+
|
|
9
|
+
export function PrivacySettingsPage(): JSX.Element {
|
|
10
|
+
const configQuery = useConfig();
|
|
11
|
+
const updateMutation = useUpdateProductAnalytics();
|
|
12
|
+
const enabled = configQuery.data?.productAnalytics.enabled ?? false;
|
|
13
|
+
const audience = configQuery.data?.productAnalytics.audience ?? 'external';
|
|
14
|
+
|
|
15
|
+
const updateEnabled = (nextEnabled: boolean) => {
|
|
16
|
+
updateMutation.mutate({ data: { enabled: nextEnabled } });
|
|
17
|
+
};
|
|
18
|
+
const updateAudience = (nextAudience: string) => {
|
|
19
|
+
const value = nextAudience as ProductAnalyticsAudience;
|
|
20
|
+
updateMutation.mutate({ data: { audience: value } });
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<SettingsPage title={t('privacyPageTitle')} description={t('privacyPageDescription')}>
|
|
25
|
+
<SettingsSection title={t('productAnalyticsSectionTitle')} description={t('productAnalyticsSectionDescription')}>
|
|
26
|
+
<SettingsGroup>
|
|
27
|
+
<SettingRow
|
|
28
|
+
title={t('productAnalyticsEnabledTitle')}
|
|
29
|
+
description={t('productAnalyticsEnabledDescription')}
|
|
30
|
+
control={(
|
|
31
|
+
<Switch
|
|
32
|
+
aria-label={t('productAnalyticsEnabledTitle')}
|
|
33
|
+
checked={enabled}
|
|
34
|
+
disabled={configQuery.isLoading || updateMutation.isPending}
|
|
35
|
+
onCheckedChange={updateEnabled}
|
|
36
|
+
/>
|
|
37
|
+
)}
|
|
38
|
+
/>
|
|
39
|
+
<SettingRow
|
|
40
|
+
title={t('productAnalyticsAudienceTitle')}
|
|
41
|
+
description={t('productAnalyticsAudienceDescription')}
|
|
42
|
+
control={(
|
|
43
|
+
<Select
|
|
44
|
+
value={audience}
|
|
45
|
+
onValueChange={updateAudience}
|
|
46
|
+
disabled={configQuery.isLoading || updateMutation.isPending}
|
|
47
|
+
>
|
|
48
|
+
<SelectTrigger aria-label={t('productAnalyticsAudienceTitle')} className='w-40 sm:w-48'>
|
|
49
|
+
<SelectValue />
|
|
50
|
+
</SelectTrigger>
|
|
51
|
+
<SelectContent>
|
|
52
|
+
<SelectItem value='external'>{t('productAnalyticsAudienceExternal')}</SelectItem>
|
|
53
|
+
<SelectItem value='internal'>{t('productAnalyticsAudienceInternal')}</SelectItem>
|
|
54
|
+
<SelectItem value='qa'>{t('productAnalyticsAudienceQa')}</SelectItem>
|
|
55
|
+
</SelectContent>
|
|
56
|
+
</Select>
|
|
57
|
+
)}
|
|
58
|
+
/>
|
|
59
|
+
</SettingsGroup>
|
|
60
|
+
</SettingsSection>
|
|
61
|
+
|
|
62
|
+
<SettingsSection title={t('productAnalyticsDataTitle')}>
|
|
63
|
+
<SettingsGroup>
|
|
64
|
+
<SettingRow
|
|
65
|
+
layout='stacked'
|
|
66
|
+
title={t('productAnalyticsCollectedTitle')}
|
|
67
|
+
description={t('productAnalyticsCollectedDescription')}
|
|
68
|
+
/>
|
|
69
|
+
<SettingRow
|
|
70
|
+
layout='stacked'
|
|
71
|
+
title={t('productAnalyticsExcludedTitle')}
|
|
72
|
+
description={t('productAnalyticsExcludedDescription')}
|
|
73
|
+
/>
|
|
74
|
+
<SettingRow
|
|
75
|
+
layout='stacked'
|
|
76
|
+
title={t('productAnalyticsAnonymousTitle')}
|
|
77
|
+
description={t('productAnalyticsAnonymousDescription')}
|
|
78
|
+
/>
|
|
79
|
+
</SettingsGroup>
|
|
80
|
+
</SettingsSection>
|
|
81
|
+
</SettingsPage>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
@@ -18,12 +18,13 @@ import {
|
|
|
18
18
|
importProviderAuthFromCli,
|
|
19
19
|
updateChannel,
|
|
20
20
|
updateRuntime,
|
|
21
|
+
updateProductAnalytics,
|
|
21
22
|
updateSecrets,
|
|
22
23
|
executeConfigAction
|
|
23
24
|
} from '@/shared/lib/api';
|
|
24
25
|
import { toast } from 'sonner';
|
|
25
26
|
import { t } from '@/shared/lib/i18n';
|
|
26
|
-
import type { ProvidersView } from '@/shared/lib/api';
|
|
27
|
+
import type { ConfigView, ProvidersView } from '@/shared/lib/api';
|
|
27
28
|
|
|
28
29
|
export function useConfig() {
|
|
29
30
|
return useQuery({
|
|
@@ -96,6 +97,25 @@ export function useUpdateModel() {
|
|
|
96
97
|
});
|
|
97
98
|
}
|
|
98
99
|
|
|
100
|
+
export function useUpdateProductAnalytics() {
|
|
101
|
+
const queryClient = useQueryClient();
|
|
102
|
+
|
|
103
|
+
return useMutation({
|
|
104
|
+
mutationFn: ({ data }: {
|
|
105
|
+
data: Parameters<typeof updateProductAnalytics>[0];
|
|
106
|
+
}) => updateProductAnalytics(data),
|
|
107
|
+
onSuccess: (productAnalytics) => {
|
|
108
|
+
queryClient.setQueryData<ConfigView>(['config'], (current) => current
|
|
109
|
+
? { ...current, productAnalytics }
|
|
110
|
+
: current);
|
|
111
|
+
toast.success(t('configSavedApplied'));
|
|
112
|
+
},
|
|
113
|
+
onError: (error: Error) => {
|
|
114
|
+
toast.error(`${t('configSaveFailed')}: ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
99
119
|
export function useUpdateSearch() {
|
|
100
120
|
const queryClient = useQueryClient();
|
|
101
121
|
|
|
@@ -629,12 +629,25 @@ export type SecretsConfigUpdate = {
|
|
|
629
629
|
refs?: Record<string, SecretRefView> | null;
|
|
630
630
|
};
|
|
631
631
|
|
|
632
|
+
export type ProductAnalyticsAudience = 'external' | 'internal' | 'qa';
|
|
633
|
+
|
|
634
|
+
export type ProductAnalyticsView = {
|
|
635
|
+
enabled: boolean;
|
|
636
|
+
audience: ProductAnalyticsAudience;
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
export type ProductAnalyticsConfigUpdate = {
|
|
640
|
+
enabled?: boolean;
|
|
641
|
+
audience?: ProductAnalyticsAudience;
|
|
642
|
+
};
|
|
643
|
+
|
|
632
644
|
export type ChannelConfigUpdate = Record<string, unknown>;
|
|
633
645
|
|
|
634
646
|
export type ConfigView = {
|
|
635
647
|
companion?: {
|
|
636
648
|
enabled?: boolean;
|
|
637
649
|
};
|
|
650
|
+
productAnalytics: ProductAnalyticsView;
|
|
638
651
|
agents: {
|
|
639
652
|
defaults: {
|
|
640
653
|
model: string;
|
|
@@ -30,6 +30,8 @@ import type {
|
|
|
30
30
|
ProviderCreateRequest,
|
|
31
31
|
ProviderCreateResult,
|
|
32
32
|
ProviderDeleteResult,
|
|
33
|
+
ProductAnalyticsConfigUpdate,
|
|
34
|
+
ProductAnalyticsView,
|
|
33
35
|
RuntimeConfigUpdate,
|
|
34
36
|
SecretsConfigUpdate,
|
|
35
37
|
SecretsView,
|
|
@@ -170,6 +172,12 @@ export async function updateSecrets(data: SecretsConfigUpdate): Promise<SecretsV
|
|
|
170
172
|
return await nextclawClient.config.updateSecrets(data);
|
|
171
173
|
}
|
|
172
174
|
|
|
175
|
+
export async function updateProductAnalytics(
|
|
176
|
+
data: ProductAnalyticsConfigUpdate,
|
|
177
|
+
): Promise<ProductAnalyticsView> {
|
|
178
|
+
return await nextclawClient.config.updateProductAnalytics(data);
|
|
179
|
+
}
|
|
180
|
+
|
|
173
181
|
export async function executeConfigAction(
|
|
174
182
|
actionId: string,
|
|
175
183
|
data: ConfigActionExecuteRequest
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { NcpDraftAttachment } from "@nextclaw/ncp-react";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import { API_BASE } from "@/shared/lib/api/api-base";
|
|
4
|
+
import { nextclawClient } from "@/shared/lib/api/managers/client.manager";
|
|
5
|
+
|
|
6
|
+
export function buildNcpAssetContentUrl(assetUri: string): string {
|
|
7
|
+
const query = new URLSearchParams({ uri: assetUri });
|
|
8
|
+
return `${API_BASE}/api/ncp/assets/content?${query.toString()}`;
|
|
9
|
+
}
|
|
3
10
|
|
|
4
11
|
export async function uploadNcpAssets(files: File[]): Promise<NcpDraftAttachment[]> {
|
|
5
12
|
const payload = await nextclawClient.sessions.uploadAssets(files);
|
|
@@ -417,6 +417,9 @@
|
|
|
417
417
|
"chatQueuedSubmitting": "Adding to queue…",
|
|
418
418
|
"chatQueuedEdit": "Edit queued input",
|
|
419
419
|
"chatQueuedDelete": "Delete queued input",
|
|
420
|
+
"chatQueuedSteer": "Steer into the active run at its next step",
|
|
421
|
+
"chatQueuedEditComposerNotEmpty": "Send or clear the composer before editing this queued input",
|
|
422
|
+
"chatSteeringPending": "Waiting for the next step",
|
|
420
423
|
"chatDeleteSession": "Delete Session",
|
|
421
424
|
"chatDeleteSessionConfirm": "Delete the current session?",
|
|
422
425
|
"chatSessionMoreActions": "More actions",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"sidebarCollapse": "Collapse sidebar",
|
|
25
25
|
"sidebarExpand": "Expand sidebar",
|
|
26
26
|
"security": "Sign-in Management",
|
|
27
|
+
"privacy": "Privacy & Analytics",
|
|
27
28
|
"backToMain": "Back to Main",
|
|
28
29
|
"enabled": "Enabled",
|
|
29
30
|
"disabled": "Disabled",
|
|
@@ -273,6 +274,24 @@
|
|
|
273
274
|
"authPasswordUpdating": "Updating...",
|
|
274
275
|
"authLogoutAction": "Sign Out This Tab",
|
|
275
276
|
"authSessionMemoryNotice": "Sessions are stored only in server memory for now. You will need to sign in again after the NextClaw UI process restarts.",
|
|
277
|
+
"privacyPageTitle": "Privacy & Analytics",
|
|
278
|
+
"privacyPageDescription": "Choose whether to share minimal product activity and keep team or test installations separate.",
|
|
279
|
+
"productAnalyticsSectionTitle": "Product activity analytics",
|
|
280
|
+
"productAnalyticsSectionDescription": "Disabled by default. Changes apply immediately without restarting NextClaw.",
|
|
281
|
+
"productAnalyticsEnabledTitle": "Share product activity",
|
|
282
|
+
"productAnalyticsEnabledDescription": "When enabled, share only whether an Agent request was submitted and whether it succeeded.",
|
|
283
|
+
"productAnalyticsAudienceTitle": "Analytics audience",
|
|
284
|
+
"productAnalyticsAudienceDescription": "Team members and testers should choose the matching category so they stay out of external-user metrics.",
|
|
285
|
+
"productAnalyticsAudienceExternal": "External user",
|
|
286
|
+
"productAnalyticsAudienceInternal": "Team / personal",
|
|
287
|
+
"productAnalyticsAudienceQa": "QA testing",
|
|
288
|
+
"productAnalyticsDataTitle": "Data scope",
|
|
289
|
+
"productAnalyticsCollectedTitle": "What is shared",
|
|
290
|
+
"productAnalyticsCollectedDescription": "Event type, time, random installation identifier, environment, release channel, operating-system category, and product version. Signed-in installations are linked to the platform account.",
|
|
291
|
+
"productAnalyticsExcludedTitle": "What is never shared",
|
|
292
|
+
"productAnalyticsExcludedDescription": "Messages, prompts, replies, tool arguments, session or project identifiers, file paths, URLs, device fingerprints, and diagnostic logs are never shared.",
|
|
293
|
+
"productAnalyticsAnonymousTitle": "How signed-out use is counted",
|
|
294
|
+
"productAnalyticsAnonymousDescription": "NextClaw creates a random installation identifier only after you enable sharing. It represents one installation, not an exact person, and does not use hardware identifiers.",
|
|
276
295
|
"dmScope": "DM Scope",
|
|
277
296
|
"dmScopeHelp": "Control how direct-message sessions are isolated.",
|
|
278
297
|
"defaultContextTokens": "Default Context Tokens",
|
|
@@ -68,6 +68,14 @@
|
|
|
68
68
|
"appPackagesIsolationLabel": "Runtime isolation",
|
|
69
69
|
"appPackagesPlatformsLabel": "Supported platforms",
|
|
70
70
|
"appPackagesAllPlatforms": "All platforms",
|
|
71
|
+
"appPackagesPlatformOnly": "{platforms} only",
|
|
72
|
+
"appPackagesUnavailableOnDevice": "Unavailable on this device",
|
|
73
|
+
"appPackagesUnavailable": "Unavailable",
|
|
74
|
+
"appPackagesTemporarilyUnavailable": "Temporarily unavailable",
|
|
75
|
+
"appPackagesCompatibilityUnknown": "Compatibility could not be confirmed",
|
|
76
|
+
"appPackagesCompatibilityUnknownReason": "NextClaw could not confirm whether this app supports this device. Refresh and try again.",
|
|
77
|
+
"appPackagesUnsupportedOsReason": "This app currently supports {platforms} only and cannot be installed on this device.",
|
|
78
|
+
"appPackagesUnsupportedTargetReason": "This app supports {platforms}, but no build is available for this device architecture.",
|
|
71
79
|
"appPackagesIsolationPanel": "Isolated interface",
|
|
72
80
|
"appPackagesIsolationMediated": "Host-mediated runtime",
|
|
73
81
|
"appPackagesIsolationFullUser": "Runs with your user permissions",
|
|
@@ -112,7 +120,6 @@
|
|
|
112
120
|
"appPackagesCompleted": "Completed",
|
|
113
121
|
"appPackagesSwitchingVersion": "Switching version",
|
|
114
122
|
"appPackagesUninstalling": "Uninstalling",
|
|
115
|
-
"appPackagesRetry": "Retry",
|
|
116
123
|
"appPackagesInstallCompleted": "App installed",
|
|
117
124
|
"appPackagesUpdateCompleted": "App updated",
|
|
118
125
|
"appPackagesAlreadyCurrent": "Already up to date",
|
|
@@ -165,6 +172,9 @@
|
|
|
165
172
|
"panelAppsFavorite": "Favorite panel app",
|
|
166
173
|
"panelAppsUnfavorite": "Unfavorite panel app",
|
|
167
174
|
"panelAppsMoreActions": "More panel app actions",
|
|
175
|
+
"panelAppsMainSidebarGroup": "Apps",
|
|
176
|
+
"panelAppsMainSidebarGroupCollapse": "Collapse apps",
|
|
177
|
+
"panelAppsMainSidebarGroupExpand": "Expand apps",
|
|
168
178
|
"panelAppsAddToMainSidebar": "Add to main sidebar",
|
|
169
179
|
"panelAppsRemoveFromMainSidebar": "Remove from main sidebar",
|
|
170
180
|
"panelAppsPreferenceUpdateFailed": "Could not update panel app preferences",
|
|
@@ -417,6 +417,9 @@
|
|
|
417
417
|
"chatQueuedSubmitting": "正在加入队列…",
|
|
418
418
|
"chatQueuedEdit": "编辑排队输入",
|
|
419
419
|
"chatQueuedDelete": "删除排队输入",
|
|
420
|
+
"chatQueuedSteer": "插入当前运行的下一步",
|
|
421
|
+
"chatQueuedEditComposerNotEmpty": "请先发送或清空输入框,再编辑排队内容",
|
|
422
|
+
"chatSteeringPending": "等待进入下一步",
|
|
420
423
|
"chatDeleteSession": "删除会话",
|
|
421
424
|
"chatDeleteSessionConfirm": "确认删除当前会话?",
|
|
422
425
|
"chatSessionMoreActions": "更多操作",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"sidebarCollapse": "收起侧边栏",
|
|
25
25
|
"sidebarExpand": "展开侧边栏",
|
|
26
26
|
"security": "登录管理",
|
|
27
|
+
"privacy": "隐私与统计",
|
|
27
28
|
"backToMain": "返回主界面",
|
|
28
29
|
"enabled": "启用",
|
|
29
30
|
"disabled": "禁用",
|
|
@@ -273,6 +274,24 @@
|
|
|
273
274
|
"authPasswordUpdating": "更新中...",
|
|
274
275
|
"authLogoutAction": "退出当前标签页",
|
|
275
276
|
"authSessionMemoryNotice": "当前版本的会话只保存在服务端内存里。NextClaw UI 进程重启后,需要重新登录。",
|
|
277
|
+
"privacyPageTitle": "隐私与统计",
|
|
278
|
+
"privacyPageDescription": "选择是否分享最小化的产品活跃数据,并把团队自用与测试设备分开。",
|
|
279
|
+
"productAnalyticsSectionTitle": "产品活跃统计",
|
|
280
|
+
"productAnalyticsSectionDescription": "默认关闭。修改后立即生效,不需要重启 NextClaw。",
|
|
281
|
+
"productAnalyticsEnabledTitle": "分享产品活跃数据",
|
|
282
|
+
"productAnalyticsEnabledDescription": "开启后,只分享是否提交过 Agent 请求以及请求是否成功。",
|
|
283
|
+
"productAnalyticsAudienceTitle": "统计人群",
|
|
284
|
+
"productAnalyticsAudienceDescription": "团队成员和测试人员请选择对应分类,避免进入外部用户指标。",
|
|
285
|
+
"productAnalyticsAudienceExternal": "外部用户",
|
|
286
|
+
"productAnalyticsAudienceInternal": "团队 / 自用",
|
|
287
|
+
"productAnalyticsAudienceQa": "QA 测试",
|
|
288
|
+
"productAnalyticsDataTitle": "数据范围",
|
|
289
|
+
"productAnalyticsCollectedTitle": "会分享什么",
|
|
290
|
+
"productAnalyticsCollectedDescription": "事件类型、时间、随机安装标识、运行环境、发布通道、系统类别和产品版本。登录后,安装会与平台账号归并。",
|
|
291
|
+
"productAnalyticsExcludedTitle": "不会分享什么",
|
|
292
|
+
"productAnalyticsExcludedDescription": "不会分享消息、提示词、回复、工具参数、会话与项目标识、文件路径、URL、设备指纹或诊断日志。",
|
|
293
|
+
"productAnalyticsAnonymousTitle": "未登录时如何统计",
|
|
294
|
+
"productAnalyticsAnonymousDescription": "NextClaw 使用启用后生成的随机安装标识。它只代表一个安装,不等于精确人数,也不会读取硬件标识。",
|
|
276
295
|
"dmScope": "私聊范围",
|
|
277
296
|
"dmScopeHelp": "控制私聊会话如何隔离。",
|
|
278
297
|
"defaultContextTokens": "默认上下文额度",
|
|
@@ -68,6 +68,14 @@
|
|
|
68
68
|
"appPackagesIsolationLabel": "运行隔离",
|
|
69
69
|
"appPackagesPlatformsLabel": "支持平台",
|
|
70
70
|
"appPackagesAllPlatforms": "全部平台",
|
|
71
|
+
"appPackagesPlatformOnly": "仅支持 {platforms}",
|
|
72
|
+
"appPackagesUnavailableOnDevice": "这台设备无法安装",
|
|
73
|
+
"appPackagesUnavailable": "无法安装",
|
|
74
|
+
"appPackagesTemporarilyUnavailable": "暂无法安装",
|
|
75
|
+
"appPackagesCompatibilityUnknown": "暂时无法确认兼容性",
|
|
76
|
+
"appPackagesCompatibilityUnknownReason": "NextClaw 暂时无法确认这台设备是否支持此应用,请刷新后再试。",
|
|
77
|
+
"appPackagesUnsupportedOsReason": "此应用目前仅支持 {platforms},不能安装在这台设备上。",
|
|
78
|
+
"appPackagesUnsupportedTargetReason": "此应用支持 {platforms},但没有适配这台设备的系统架构。",
|
|
71
79
|
"appPackagesIsolationPanel": "隔离界面",
|
|
72
80
|
"appPackagesIsolationMediated": "受限运行",
|
|
73
81
|
"appPackagesIsolationFullUser": "以当前用户权限运行",
|
|
@@ -112,7 +120,6 @@
|
|
|
112
120
|
"appPackagesCompleted": "已完成",
|
|
113
121
|
"appPackagesSwitchingVersion": "正在切换版本",
|
|
114
122
|
"appPackagesUninstalling": "正在卸载",
|
|
115
|
-
"appPackagesRetry": "重试",
|
|
116
123
|
"appPackagesInstallCompleted": "应用已安装",
|
|
117
124
|
"appPackagesUpdateCompleted": "应用已更新",
|
|
118
125
|
"appPackagesAlreadyCurrent": "已经是最新版本",
|
|
@@ -165,6 +172,9 @@
|
|
|
165
172
|
"panelAppsFavorite": "收藏面板应用",
|
|
166
173
|
"panelAppsUnfavorite": "取消收藏面板应用",
|
|
167
174
|
"panelAppsMoreActions": "更多面板应用操作",
|
|
175
|
+
"panelAppsMainSidebarGroup": "应用",
|
|
176
|
+
"panelAppsMainSidebarGroupCollapse": "收起应用",
|
|
177
|
+
"panelAppsMainSidebarGroupExpand": "展开应用",
|
|
168
178
|
"panelAppsAddToMainSidebar": "添加到主侧栏",
|
|
169
179
|
"panelAppsRemoveFromMainSidebar": "从主侧栏移除",
|
|
170
180
|
"panelAppsPreferenceUpdateFailed": "无法更新面板应用设置",
|
package/src/vite-env.d.ts
CHANGED
|
@@ -27,5 +27,14 @@ declare global {
|
|
|
27
27
|
|
|
28
28
|
interface Window {
|
|
29
29
|
nextclawDesktop?: NextClawDesktopBridge;
|
|
30
|
+
__NEXTCLAW_INITIAL_SESSION_MESSAGES_PREFETCH__?: {
|
|
31
|
+
consumed: boolean;
|
|
32
|
+
limit: number;
|
|
33
|
+
promise: Promise<{
|
|
34
|
+
responseOk: boolean;
|
|
35
|
+
payload: unknown;
|
|
36
|
+
} | null>;
|
|
37
|
+
sessionId: string;
|
|
38
|
+
};
|
|
30
39
|
}
|
|
31
40
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-KEIR6QF5-BuyuzJJL.js";import{n as e}from"./chunk-MOZMSUNE-C_6x18Qw.js";export{e as createArchitectureServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{at as e,ot as t}from"./chunk-WYO6CB5R-mOJNzbWl.js";var n=(n,r)=>t.lang.round(e.parse(n)[r]);export{n as t};
|