@nextclaw/ui 0.15.22 → 0.15.24
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 +66 -0
- package/dist/assets/{abnfDiagram-VRR7QNED-M4g_AyR8.js → abnfDiagram-VRR7QNED-DvTjgVMf.js} +1 -1
- package/dist/assets/{aiden0z-pptx-renderer.es-Bd99vut2.js → aiden0z-pptx-renderer.es-C1nfBAXR.js} +1 -1
- package/dist/assets/api-BxPNDp30.js +13 -0
- package/dist/assets/appearance-settings-page-DpVJjvkB.js +1 -0
- package/dist/assets/{arc-IO7WNWOB.js → arc-BvhODBXv.js} +1 -1
- package/dist/assets/architecture-TIHT7OUA-Bjp9jf0h.js +1 -0
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-Dc-lvdUh.js → architectureDiagram-ZJ3FMSHR-BKO9RgNS.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-CcsoWpIY.js → blockDiagram-677ZJIJ3-DHpDXy7D.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-Bsrtg6b2.js → c4Diagram-LMCZKHZV-BG_iQnDr.js} +1 -1
- package/dist/assets/channel-5T3pdR-s.js +1 -0
- package/dist/assets/channels-list-page-DRaNWAxC.js +8 -0
- package/dist/assets/chat-page-BuFDmG5_.js +1 -0
- package/dist/assets/chunk-2Q5K7J3B-DTZ3tGfE.js +1 -0
- package/dist/assets/{chunk-32BRIVSS-Bt08t8oG.js → chunk-32BRIVSS-DR9M0LLx.js} +1 -1
- package/dist/assets/{chunk-52WLFC77-Ddx68Xzx.js → chunk-52WLFC77-698iC3BB.js} +1 -1
- package/dist/assets/{chunk-5FCAYU7R-B7p9_q55.js → chunk-5FCAYU7R-DikTj9Ey.js} +1 -1
- package/dist/assets/{chunk-5HE753X5-D52KvdTm.js → chunk-5HE753X5-ko0o7_q0.js} +1 -1
- package/dist/assets/{chunk-5JV3BV7I-C329h8nI.js → chunk-5JV3BV7I-CEHufhgo.js} +1 -1
- package/dist/assets/{chunk-5TONJI2A-BZyUBxWt.js → chunk-5TONJI2A-CGgno1cu.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-BUiYXZmu.js → chunk-5VM5RSS4-DkiB4cUQ.js} +1 -1
- package/dist/assets/{chunk-7BUUIJ7U-B7o-mn4r.js → chunk-7BUUIJ7U-DzptcytQ.js} +1 -1
- package/dist/assets/{chunk-BIQX33UG-Bey9GoRP.js → chunk-BIQX33UG-DMRSQJvT.js} +1 -1
- package/dist/assets/{chunk-C7G6YPKG-C6tosszM.js → chunk-C7G6YPKG-Bw1BwwuY.js} +1 -1
- package/dist/assets/{chunk-CQNSW5MT-BNrdkgGQ.js → chunk-CQNSW5MT-C0z6eHBk.js} +1 -1
- package/dist/assets/{chunk-CYSBUYHQ-DHODFeyB.js → chunk-CYSBUYHQ-ByPyAouO.js} +1 -1
- package/dist/assets/{chunk-EMLP6XTP-BcmLjrcq.js → chunk-EMLP6XTP-CJlAXWZg.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-r-_eEtJI.js → chunk-EX3LRPZG-Dqq4zKJu.js} +1 -1
- package/dist/assets/{chunk-FWX5IMBZ-DOObDWbf.js → chunk-FWX5IMBZ-B0SNoCmi.js} +2 -2
- package/dist/assets/{chunk-HOUHSVGY-Bd0FnbWZ.js → chunk-HOUHSVGY-DG_GJih_.js} +1 -1
- package/dist/assets/{chunk-ICXQ74PX-ntNwAm4_.js → chunk-ICXQ74PX-Drxk_6bE.js} +1 -1
- package/dist/assets/{chunk-JG7HCLWE-YtRpblZN.js → chunk-JG7HCLWE-DdLFPpnd.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-De5-D9ta.js → chunk-JWPE2WC7-B8M4G76F.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-CdvKhyp2.js → chunk-MOJQB5TN-XP6FJHY_.js} +1 -1
- package/dist/assets/{chunk-MOZMSUNE-DJMMN_lu.js → chunk-MOZMSUNE-C_6x18Qw.js} +1 -1
- package/dist/assets/{chunk-OGEWGWER-DOFWVw3O.js → chunk-OGEWGWER-N25BzCmG.js} +1 -1
- package/dist/assets/{chunk-OSBZ3O6U-DZkrIN9r.js → chunk-OSBZ3O6U-ASDEm7y0.js} +1 -1
- package/dist/assets/{chunk-PUDLZKDR-D1wma2Yf.js → chunk-PUDLZKDR-CTlvAcn7.js} +1 -1
- package/dist/assets/{chunk-Q4XR5HBZ-CjPy94Lz.js → chunk-Q4XR5HBZ-Da9BWfB6.js} +1 -1
- package/dist/assets/{chunk-QBLGF6JB-Hy1bEgS-.js → chunk-QBLGF6JB-Bi6RpTJO.js} +1 -1
- package/dist/assets/{chunk-R7FJI6CG-CUPIHyh-.js → chunk-R7FJI6CG-DkMsSPvK.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-D5Ua4pcv.js → chunk-RYQCIY6F-DZp0eU-j.js} +1 -1
- package/dist/assets/{chunk-U6XO7XAA-DaUQcqb7.js → chunk-U6XO7XAA-vfinDSrj.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-DX2zLfQe.js → chunk-V7JOEXUC-C9Nksccs.js} +1 -1
- package/dist/assets/chunk-VAUOI2AC-HLGIHQ6k.js +1 -0
- package/dist/assets/{chunk-VR4S4FIN-CFA-WQik.js → chunk-VR4S4FIN-Xv6zfwXs.js} +1 -1
- package/dist/assets/{chunk-WYO6CB5R-Bk2HeDvJ.js → chunk-WYO6CB5R-mOJNzbWl.js} +2 -2
- package/dist/assets/chunk-XXDRQBXY-Dl0m6Ni-.js +1 -0
- package/dist/assets/{chunk-YOTPTUD7-DUG4FpBN.js → chunk-YOTPTUD7-1-aKSu4o.js} +1 -1
- package/dist/assets/{chunk-ZGVPDNZ5-70JdIGo0.js → chunk-ZGVPDNZ5-OJ8veMpK.js} +1 -1
- package/dist/assets/{chunk-ZIRB5QZD-XZdgBt5L.js → chunk-ZIRB5QZD-SR_Nq_PP.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DcDnzGNX.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-BKXKMzKM.js +1 -0
- package/dist/assets/config-split-page-BVWVDbvG.js +1 -0
- package/dist/assets/confirm-dialog-mA2iVzxh.js +5 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-B-PQoGX-.js → cose-bilkent-JH36ORCC-NjVgz2Bw.js} +1 -1
- package/dist/assets/cynefin-VYW2F7L2-BWg7U2UD.js +1 -0
- package/dist/assets/{cynefinDiagram-TSTJHNR4-BoLCPEM0.js → cynefinDiagram-TSTJHNR4-B_17LDqD.js} +1 -1
- package/dist/assets/{dagre-D7Ie4eXr.js → dagre-CMe101gk.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-CKRrwZA-.js → dagre-VKFMJZFB-qo8nLb3B.js} +1 -1
- package/dist/assets/desktop-update-config-DyQb1LXr.js +1 -0
- package/dist/assets/{diagram-FQU43EPY-CASL1J3_.js → diagram-FQU43EPY-Ba3XIklC.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-CvLPBIzf.js → diagram-G47NLZAW-CG45TcUx.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-Ba6fGdYP.js → diagram-NH7WQ7WH-2F2HrwV-.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-DkpfgEjM.js → diagram-OA4YK3LP-CXfWH9NZ.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-BP5UMVsN.js → diagram-WEI45ONY-CH_4yepc.js} +1 -1
- package/dist/assets/dist-B4Pf5X3Q.js +1 -0
- package/dist/assets/dist-DHEWkGWX.js +1 -0
- package/dist/assets/doc-browser-CtO_HtRy.js +1 -0
- package/dist/assets/doc-browser-context-CuGI6PQc.js +1 -0
- package/dist/assets/doc-browser-eMUagyBV.js +1 -0
- package/dist/assets/{docx-preview-D0tp3a9T.js → docx-preview-CoM4JK7_.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-TJKbUcmc.js → ebnfDiagram-CCIWWBDH-BwiG4Ea1.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-DzGPKkKH.js → erDiagram-Q63AITRT-BML3hpnQ.js} +1 -1
- package/dist/assets/eventmodeling-45OFAUF4-SB-J4tpq.js +1 -0
- package/dist/assets/flowDiagram-23GEKE2U-BQ_u-eLM.js +1 -0
- package/dist/assets/form-actions-BOfIyG3O.js +1 -0
- package/dist/assets/{ganttDiagram-NO4QXBWP-JhJzsGp2.js → ganttDiagram-NO4QXBWP-80enfWbD.js} +1 -1
- package/dist/assets/gitGraph-TEB2WS4Q-DPxNwsFd.js +1 -0
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-DZ1CKMj8.js → gitGraphDiagram-IHSO6WYX-CVLqXr-b.js} +1 -1
- package/dist/assets/host-capabilities-D9C4CBK5.js +1 -0
- package/dist/assets/index-BjBdWHV1.js +107 -0
- package/dist/assets/index-DmpmjAGQ.css +1 -0
- package/dist/assets/info-DKCQHKI2-DNlNGH90.js +1 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-BNXNKfRQ.js → infoDiagram-FWYZ7A6U-Dyvs2t0i.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-DoiEfjNw.js → ishikawaDiagram-FXEZZL3T-sSnxDKfh.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-D6oK2HSy.js → journeyDiagram-5HDEW3XC-D22V71Mf.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-B2UnLOH-.js → kanban-definition-HUTT4EX6-D3ds0p-g.js} +1 -1
- package/dist/assets/{line-BM7PoxY5.js → line-CbyFs065.js} +1 -1
- package/dist/assets/{linear-B3DiqMjk.js → linear-4DKtnZBS.js} +1 -1
- package/dist/assets/loader-circle-Df8wF2Pr.js +1 -0
- package/dist/assets/{map-BAAdHTqR.js → map-CcZzEoz6.js} +1 -1
- package/dist/assets/mcp-marketplace-page-DI49IKxp.js +1 -0
- package/dist/assets/mcp-marketplace-page-ofDqbOIF.js +9 -0
- package/dist/assets/{mermaid-parser.core-BeMviefY.js → mermaid-parser.core-DPmMOjXD.js} +2 -2
- package/dist/assets/{mermaid.core-D0Q77r9I.js → mermaid.core-BSf-ddRa.js} +3 -3
- package/dist/assets/{mindmap-definition-LN4V7U3C-BQ7r7bR8.js → mindmap-definition-LN4V7U3C-BUTwWPyx.js} +1 -1
- package/dist/assets/model-config-page-D73Tu3jW.js +1 -0
- package/dist/assets/navigation-link-CAFOcXNg.js +3 -0
- package/dist/assets/{ordinal-Bt2N4IkA.js → ordinal-BgLYtOZE.js} +1 -1
- package/dist/assets/packet-7NZHBO7P-BpeiqkBZ.js +1 -0
- package/dist/assets/{pegDiagram-2B236MQR-B-C9-LGz.js → pegDiagram-2B236MQR-BEu_ZBjc.js} +1 -1
- package/dist/assets/pie-RZYD4A2V-Cy1yxsPd.js +1 -0
- package/dist/assets/{pieDiagram-ENE6RG2P-CtirZLtn.js → pieDiagram-ENE6RG2P-CAwAwuBd.js} +1 -1
- package/dist/assets/plus-DVU5RLCS.js +1 -0
- package/dist/assets/provider-scoped-model-input-BaJJJYMX.js +1 -0
- package/dist/assets/providers-config-page-BL6IRVBm.js +1 -0
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-DiBWAzDU.js → quadrantDiagram-ABIIQ3AL-CwE6F-_2.js} +1 -1
- package/dist/assets/radar-I7S5WNFK-CEcPKCj8.js +1 -0
- package/dist/assets/railroad-3IZDKUUU-CW38eNDs.js +1 -0
- package/dist/assets/railroad-abnf-AHOZXSZD-ByrylcXf.js +1 -0
- package/dist/assets/railroad-ebnf-EBAXGLYW-CNB6GwP-.js +1 -0
- package/dist/assets/railroad-peg-LSFZ7HO6-x6hnqlBG.js +1 -0
- package/dist/assets/{railroadDiagram-RFXS5EU6-CP6b3PBI.js → railroadDiagram-RFXS5EU6-xgLekU3B.js} +1 -1
- package/dist/assets/react-BC_orpAj.js +8 -0
- package/dist/assets/{refresh-cw-CkKwPztT.js → refresh-cw-CWDp_JnN.js} +1 -1
- package/dist/assets/remote-T24O58lH.js +1 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-D8YV0-Jz.js → requirementDiagram-TGXJPOKE-CyVUzEX5.js} +1 -1
- package/dist/assets/rotate-cw-BqhwSV5p.js +1 -0
- package/dist/assets/runtime-config-page-CXUx017t.js +1 -0
- package/dist/assets/{sankeyDiagram-HTMAVEWB-C2vA4ojE.js → sankeyDiagram-HTMAVEWB-JK6bFmYB.js} +1 -1
- package/dist/assets/{save-BINMWate.js → save-Cnr71JON.js} +1 -1
- package/dist/assets/{search-7M38azRp.js → search-CCX11X2m.js} +1 -1
- package/dist/assets/search-config-page-BB6d5gT7.js +1 -0
- package/dist/assets/{secrets-config-page-2mVejXf2.js → secrets-config-page-DYsDeT9K.js} +2 -2
- package/dist/assets/security-config-CVPgqL7G.js +1 -0
- package/dist/assets/select-DvwBu99K.js +41 -0
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-B9LBmpUo.js → sequenceDiagram-DBY2YBRQ-BR5IokXV.js} +1 -1
- package/dist/assets/{settings-2-DqZstREV.js → settings-2-Dmv6zMne.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-9UIfya9-.js → sizeCapture-X5ZJPWSS-SxG_YnMA.js} +1 -1
- package/dist/assets/skeleton-C5tWata3.js +1 -0
- package/dist/assets/{src-DKf77Yzo.js → src-vgz8E_-O.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-oTW44vds.js → stateDiagram-2N3HPSRC-DD4OoYhn.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-ZC6dFORv.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-Cf7lcsay.js → swimlanes-5IMT3BWC-BWkFeyCT.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-CRkh51Im.js +8 -0
- package/dist/assets/{tag-chip-BoDaLnWt.js → tag-chip-gMPvx7n_.js} +1 -1
- package/dist/assets/{timeline-definition-FHXFAJF6-DoCuWKDJ.js → timeline-definition-FHXFAJF6-VTRPy6KA.js} +1 -1
- package/dist/assets/treeView-QDETBFTQ-Bw0DSCH7.js +1 -0
- package/dist/assets/treemap-6X3UGDF4-DFWBFcfh.js +1 -0
- package/dist/assets/use-confirm-dialog-D_3-QpZU.js +1 -0
- package/dist/assets/{vennDiagram-L72KCM5P-CpU0pzGe.js → vennDiagram-L72KCM5P-Bvk42Pek.js} +1 -1
- package/dist/assets/wardley-OPB4EBWU-CoWturk0.js +1 -0
- package/dist/assets/{wardleyDiagram-EHGQE667-CkN6nn6-.js → wardleyDiagram-EHGQE667-DOFjx2s3.js} +1 -1
- package/dist/assets/x-BEWSqeux.js +1 -0
- package/dist/assets/{xychartDiagram-FW5EYKEG-DATpapm2.js → xychartDiagram-FW5EYKEG-DY5yRTUc.js} +1 -1
- package/dist/index.html +30 -32
- package/index.html +8 -0
- package/package.json +9 -9
- package/src/app/components/layout/page-layout.tsx +15 -6
- package/src/app/styles/charcoal-theme.css +85 -0
- package/src/app/styles/design-system.css +11 -13
- package/src/features/agents/components/__tests__/agents-page.test.tsx +36 -24
- package/src/features/agents/components/agent-advanced-config-fields.tsx +7 -7
- package/src/features/agents/components/agent-details-dialog.tsx +8 -8
- package/src/features/agents/components/agent-dialogs.tsx +7 -7
- package/src/features/agents/components/agents-page.tsx +42 -62
- package/src/features/chat/components/conversation/__tests__/chat-conversation-content.test.tsx +27 -3
- package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +16 -0
- package/src/features/chat/components/conversation/__tests__/chat-conversation-panel.test.tsx +8 -22
- package/src/features/chat/components/conversation/__tests__/chat-conversation-workspace-section.test.tsx +69 -3
- package/src/features/chat/components/conversation/chat-conversation-content.tsx +20 -6
- package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +30 -31
- package/src/features/chat/components/conversation/chat-conversation-panel.tsx +1 -8
- package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +16 -4
- package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +23 -0
- package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +6 -0
- package/src/features/chat/components/layout/chat-page-shell.tsx +5 -4
- package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +4 -4
- package/src/features/chat/components/providers/chat-presenter.provider.tsx +2 -0
- package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +84 -12
- package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +243 -5
- package/src/features/chat/features/conversation/components/session-conversation-area.tsx +48 -31
- package/src/features/chat/features/conversation/components/session-conversation-input.tsx +46 -37
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +128 -1
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-input-state.test.tsx +67 -1
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-slash-commands.test.tsx +4 -0
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-provider-model-catalog.test.tsx +161 -0
- package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +55 -0
- package/src/features/chat/features/conversation/hooks/use-session-conversation-composer-nodes.ts +26 -0
- package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +45 -12
- package/src/features/chat/features/conversation/hooks/use-session-conversation-input-query.ts +28 -3
- package/src/features/chat/features/conversation/hooks/use-session-conversation-input-state.ts +91 -37
- package/src/features/chat/features/conversation/hooks/use-session-conversation-recovery-actions.ts +64 -0
- package/src/features/chat/features/conversation/hooks/use-session-conversation-slash-commands.ts +2 -0
- package/src/features/chat/features/conversation/hooks/use-session-provider-model-catalog.ts +159 -0
- package/src/features/chat/features/conversation/utils/__tests__/session-message-composer.utils.test.ts +34 -0
- package/src/features/chat/features/conversation/utils/session-conversation-input-toolbar.utils.ts +23 -1
- package/src/features/chat/features/conversation/utils/session-message-composer.utils.ts +117 -0
- package/src/features/chat/features/conversation/utils/session-queued-input.utils.ts +10 -98
- package/src/features/chat/features/input/input-surface-plugins/__tests__/slash-command-plugin.test.ts +2 -1
- package/src/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils.ts +3 -1
- package/src/features/chat/features/input/utils/__tests__/chat-composer-state.utils.test.ts +22 -1
- package/src/features/chat/features/input/utils/__tests__/chat-inline-token.utils.test.ts +52 -0
- package/src/features/chat/features/input/utils/__tests__/chat-input-bar.utils.test.ts +111 -0
- package/src/features/chat/features/input/utils/chat-composer-state.utils.ts +27 -2
- package/src/features/chat/features/input/utils/chat-composer-token-protocol.utils.ts +10 -0
- package/src/features/chat/features/input/utils/chat-conversation-excerpt-token.utils.ts +59 -0
- package/src/features/chat/features/input/utils/chat-inline-token.utils.ts +123 -32
- package/src/features/chat/features/input/utils/chat-input-bar.utils.ts +1 -0
- package/src/features/chat/features/input/utils/chat-input-toolbar.utils.ts +97 -10
- package/src/features/chat/features/message/components/__tests__/chat-message-assistant-header.container.test.tsx +149 -0
- package/src/features/chat/features/message/components/__tests__/chat-message-inline-editor.test.tsx +59 -0
- package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +123 -90
- package/src/features/chat/features/message/components/__tests__/chat-message-timeline-dividers.test.tsx +43 -0
- package/src/features/chat/features/message/components/chat-message-inline-editor.tsx +111 -0
- package/src/features/chat/features/message/components/chat-message-list.container.tsx +120 -171
- package/src/features/chat/features/message/components/chat-message-timeline-dividers.tsx +75 -0
- package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +125 -0
- package/src/features/chat/features/message/hooks/use-chat-message-actions.tsx +187 -0
- package/src/features/chat/features/message/utils/__tests__/chat-message-action-targets.utils.test.ts +89 -0
- package/src/features/chat/features/message/utils/__tests__/chat-message-timeline-compaction.utils.test.ts +194 -0
- package/src/features/chat/features/message/utils/__tests__/chat-message-timeline-continuation-compaction.utils.test.ts +167 -0
- package/src/features/chat/features/message/utils/__tests__/chat-message-timeline.utils.test.ts +175 -1
- package/src/features/chat/features/message/utils/__tests__/chat-message.utils.test.ts +26 -0
- package/src/features/chat/features/message/utils/chat-message-action-targets.utils.ts +28 -0
- package/src/features/chat/features/message/utils/chat-message-part.utils.ts +38 -0
- package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +6 -0
- package/src/features/chat/features/message/utils/chat-message-timeline.utils.ts +201 -7
- package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-agent-runtime.test.tsx +180 -1
- package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-session-conversation.test.tsx +184 -10
- package/src/features/chat/features/ncp/hooks/use-hydrated-ncp-agent.integration.test.tsx +57 -0
- package/src/features/chat/features/ncp/hooks/use-ncp-session-conversation.ts +90 -1
- package/src/features/chat/features/ncp/utils/__tests__/ncp-chat-query-derived.utils.test.ts +110 -0
- package/src/features/chat/features/ncp/utils/ncp-chat-query-derived.utils.ts +65 -3
- package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +17 -0
- package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +63 -54
- package/src/features/chat/features/session/hooks/__tests__/use-selected-session-context-window-indicator.test.tsx +87 -0
- package/src/features/chat/features/session/utils/__tests__/ncp-session-adapter.utils.test.ts +19 -0
- package/src/features/chat/features/session/utils/chat-context-window-indicator.utils.ts +44 -5
- package/src/features/chat/features/session/utils/ncp-session-adapter.utils.ts +10 -0
- package/src/features/chat/features/session/utils/ncp-session-context-metadata.utils.ts +42 -4
- package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +17 -2
- package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +8 -3
- package/src/features/chat/features/welcome/components/chat-welcome.tsx +2 -2
- package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-project-options.utils.test.ts +22 -6
- package/src/features/chat/features/welcome/utils/chat-welcome-project-options.utils.ts +13 -0
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +72 -2
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +21 -1
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-text-selection.test.tsx +75 -0
- package/src/features/chat/features/workspace/components/__tests__/workspace-text-selection-menu.test.tsx +109 -0
- package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +145 -26
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +42 -18
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +50 -10
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +48 -22
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +13 -2
- package/src/features/chat/features/workspace/components/workspace-text-selection-menu.tsx +45 -0
- package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +80 -0
- package/src/features/chat/features/workspace/utils/__tests__/workspace-text-excerpt.utils.test.ts +54 -0
- package/src/features/chat/features/workspace/utils/chat-thread-workspace-session.utils.ts +47 -0
- package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +16 -0
- package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +22 -1
- package/src/features/chat/features/workspace/utils/workspace-text-excerpt.utils.ts +53 -0
- package/src/features/chat/index.ts +1 -0
- package/src/features/chat/managers/__tests__/chat-composer-intent.manager.test.ts +129 -0
- package/src/features/chat/managers/__tests__/chat-session-list.manager.test.ts +38 -2
- package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +93 -1
- package/src/features/chat/managers/__tests__/provider-model-catalog-notice.manager.test.ts +57 -0
- package/src/features/chat/managers/chat-composer-intent.manager.ts +190 -0
- package/src/features/chat/managers/chat-session-list.manager.ts +13 -4
- package/src/features/chat/managers/chat-thread.manager.ts +30 -11
- package/src/features/chat/managers/provider-model-catalog-notice.manager.ts +121 -0
- package/src/features/chat/presenters/chat.presenter.ts +3 -0
- package/src/features/chat/stores/__tests__/chat-composer-draft.store.test.ts +55 -0
- package/src/features/chat/stores/chat-composer-draft.store.ts +92 -0
- package/src/features/chat/stores/chat-thread.store.ts +2 -4
- package/src/features/chat/types/chat-input-bar.types.ts +8 -0
- package/src/features/chat/types/chat-input.types.ts +5 -0
- package/src/features/chat/types/chat-message.types.ts +5 -0
- package/src/features/cron/components/__tests__/cron-config.test.tsx +100 -19
- package/src/features/cron/components/cron-config.tsx +19 -33
- package/src/features/cron/components/cron-job-detail-dialog.tsx +42 -16
- package/src/features/cron/components/cron-job-row.tsx +18 -1
- package/src/features/inbox/components/inbox-delivery-content.test.tsx +8 -2
- package/src/features/inbox/components/inbox-delivery-content.tsx +1 -1
- package/src/features/inbox/components/inbox-reader-dialog.test.tsx +10 -4
- package/src/features/inbox/components/inbox-reader-dialog.tsx +37 -61
- package/src/features/inbox/pages/inbox-page.tsx +90 -98
- package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +28 -6
- package/src/features/notifications/components/app-notification-toast.tsx +54 -15
- package/src/features/notifications/managers/__tests__/app-notification.manager.test.ts +2 -0
- package/src/features/notifications/managers/app-notification.manager.ts +3 -0
- package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +1 -0
- package/src/features/pwa/managers/__tests__/pwa-shell-theme.manager.test.ts +9 -0
- package/src/features/pwa/managers/pwa-shell-theme.manager.ts +1 -0
- package/src/features/service-apps/components/__tests__/service-apps-panel.test.tsx +5 -4
- package/src/features/service-apps/components/service-app-list-item.tsx +470 -0
- package/src/features/service-apps/components/service-apps-panel.tsx +76 -490
- package/src/features/settings/components/config/__tests__/provider-models-section.test.tsx +239 -0
- package/src/features/settings/components/config/provider-form-detail-pane.tsx +307 -0
- package/src/features/settings/components/config/provider-form.tsx +149 -360
- package/src/features/settings/components/config/provider-model-list.tsx +293 -0
- package/src/features/settings/components/config/provider-model-suggestions-panel.tsx +151 -0
- package/src/features/settings/components/config/provider-models-section.tsx +178 -149
- package/src/features/settings/hooks/__tests__/use-provider-connectivity.test.tsx +98 -0
- package/src/features/settings/hooks/__tests__/use-provider-model-suggestions.test.tsx +107 -0
- package/src/features/settings/hooks/use-provider-connectivity.ts +132 -0
- package/src/features/settings/hooks/use-provider-model-suggestions.ts +51 -0
- package/src/features/settings/pages/__tests__/appearance-settings-page.test.tsx +2 -2
- package/src/features/settings/pages/__tests__/search-config-page.test.tsx +48 -0
- package/src/features/settings/pages/search-config-page.tsx +17 -8
- package/src/features/settings/utils/__tests__/provider-form-support.utils.test.ts +42 -0
- package/src/features/settings/utils/provider-form-context.utils.ts +2 -0
- package/src/features/settings/utils/provider-form-model.utils.ts +25 -0
- package/src/features/settings/utils/provider-form-support.utils.ts +21 -5
- package/src/features/side-dock/components/__tests__/side-dock.test.tsx +1 -0
- package/src/features/side-dock/configs/side-dock-built-in-items.config.ts +0 -9
- package/src/index.css +1 -1
- package/src/platforms/desktop/types/desktop-update.types.ts +5 -0
- package/src/shared/components/actions/__tests__/navigation-link.test.tsx +14 -3
- package/src/shared/components/actions/navigation-link.tsx +35 -15
- package/src/shared/components/common/__tests__/agent-avatar.test.tsx +3 -2
- package/src/shared/components/common/agent-avatar.tsx +3 -3
- package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +66 -0
- package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +4 -1
- package/src/shared/components/doc-browser/doc-browser-renderer.types.ts +1 -0
- package/src/shared/components/doc-browser/doc-browser.tsx +9 -0
- package/src/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration.ts +126 -0
- package/src/shared/components/settings/settings-page.tsx +1 -1
- package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +103 -0
- package/src/shared/components/ui/context-menu/context-menu.tsx +263 -0
- package/src/shared/components/ui/tab-strip/__tests__/compact-tab-strip.test.tsx +19 -6
- package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +28 -67
- package/src/shared/hooks/use-config.ts +33 -1
- package/src/shared/lib/api/__tests__/ncp-session-query-cache.utils.test.ts +26 -0
- package/src/shared/lib/api/ncp-session-query-cache.utils.ts +7 -10
- package/src/shared/lib/api/ncp-session.types.ts +6 -0
- package/src/shared/lib/api/types.ts +36 -1
- package/src/shared/lib/api/utils/config.utils.ts +14 -0
- package/src/shared/lib/cron/cron-job-view.utils.ts +4 -0
- package/src/shared/lib/host-capabilities/__tests__/host-capability.manager.test.ts +26 -0
- package/src/shared/lib/host-capabilities/host-capability.manager.ts +28 -0
- package/src/shared/lib/i18n/locales/en-US/chat.json +39 -4
- package/src/shared/lib/i18n/locales/en-US/core.json +26 -0
- package/src/shared/lib/i18n/locales/en-US/doc-browser.json +1 -0
- package/src/shared/lib/i18n/locales/en-US/search.json +1 -0
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +39 -4
- package/src/shared/lib/i18n/locales/zh-CN/core.json +26 -0
- package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +1 -0
- package/src/shared/lib/i18n/locales/zh-CN/search.json +1 -0
- package/src/shared/lib/session-project/__tests__/workspace-file-breadcrumb.test.ts +28 -1
- package/src/shared/lib/session-project/workspace-file-breadcrumb.utils.ts +23 -0
- package/src/shared/lib/theme/index.test.ts +11 -0
- package/src/shared/lib/theme/index.ts +2 -0
- package/dist/assets/api-B1yHQYs-.js +0 -13
- package/dist/assets/app-presenter-provider-D3BuuOyZ.css +0 -1
- package/dist/assets/app-presenter-provider-uP9waOzv.js +0 -108
- package/dist/assets/appearance-settings-page-C9Zq3hP9.js +0 -1
- package/dist/assets/architecture-TIHT7OUA-Cii4JyA2.js +0 -1
- package/dist/assets/book-open-oSmyVXea.js +0 -1
- package/dist/assets/card-CGvJZTZp.js +0 -1
- package/dist/assets/channel-BSKkTPe8.js +0 -1
- package/dist/assets/channels-list-page-5BTxpQHw.js +0 -8
- package/dist/assets/chat-page-jTvli8Jp.js +0 -1
- package/dist/assets/chunk-2Q5K7J3B-CDMOR1xZ.js +0 -1
- package/dist/assets/chunk-VAUOI2AC-BRvqNW76.js +0 -1
- package/dist/assets/chunk-XXDRQBXY-CwX_mqJ3.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-RzbGxG77.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-C_gWB7WT.js +0 -1
- package/dist/assets/config-split-page-BgBsUmp1.js +0 -1
- package/dist/assets/confirm-dialog-h849QRWO.js +0 -5
- package/dist/assets/cynefin-VYW2F7L2-fSLIS0X3.js +0 -1
- package/dist/assets/desktop-update-config-BGGHxClR.js +0 -1
- package/dist/assets/dist-CxUhurq9.js +0 -41
- package/dist/assets/doc-browser-0eL8AX42.js +0 -1
- package/dist/assets/doc-browser-DEqE9lsh.js +0 -1
- package/dist/assets/doc-browser-context-DkzFIUoK.js +0 -1
- package/dist/assets/eventmodeling-45OFAUF4-XVcQGgha.js +0 -1
- package/dist/assets/eye-gOWQGt8N.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-BiFSctqz.js +0 -1
- package/dist/assets/form-actions-CgjYZUzM.js +0 -1
- package/dist/assets/gitGraph-TEB2WS4Q-C014uXqS.js +0 -1
- package/dist/assets/host-capabilities-B-TtABsP.js +0 -1
- package/dist/assets/index-DSAUWCfl.js +0 -2
- package/dist/assets/index-G7cBryJ4.css +0 -1
- package/dist/assets/info-DKCQHKI2-CQ2qjGhU.js +0 -1
- package/dist/assets/loader-circle-BAuycGf6.js +0 -1
- package/dist/assets/logo-badge-BNcsDsUM.js +0 -1
- package/dist/assets/mcp-marketplace-page-BX39MtPa.js +0 -9
- package/dist/assets/mcp-marketplace-page-CkDtOEA4.js +0 -1
- package/dist/assets/model-config-page-7MIXg2fQ.js +0 -1
- package/dist/assets/navigation-link-B3iFOdxx.js +0 -1
- package/dist/assets/packet-7NZHBO7P-6IFyydij.js +0 -1
- package/dist/assets/pie-RZYD4A2V-spXQC_wr.js +0 -1
- package/dist/assets/plus-yvhFgfal.js +0 -1
- package/dist/assets/popover-Cpep_rJe.js +0 -1
- package/dist/assets/provider-models-CUrptZ-o.js +0 -1
- package/dist/assets/provider-scoped-model-input-CHmOzz7x.js +0 -1
- package/dist/assets/providers-config-page-A6J7Y0II.js +0 -1
- package/dist/assets/radar-I7S5WNFK-DWVA8lvY.js +0 -1
- package/dist/assets/railroad-3IZDKUUU-Ce51u8y1.js +0 -1
- package/dist/assets/railroad-abnf-AHOZXSZD-D7i7cqI_.js +0 -1
- package/dist/assets/railroad-ebnf-EBAXGLYW-BEg2hcPs.js +0 -1
- package/dist/assets/railroad-peg-LSFZ7HO6-CxROSzbi.js +0 -1
- package/dist/assets/react-BCJGCjrP.js +0 -8
- package/dist/assets/remote-FD-ZfSIn.js +0 -1
- package/dist/assets/rotate-cw-DrJMfHhp.js +0 -1
- package/dist/assets/runtime-config-page-DwjO-Vs6.js +0 -1
- package/dist/assets/search-config-page-T6tMhXbP.js +0 -1
- package/dist/assets/security-config-DD5RrjDe.js +0 -1
- package/dist/assets/select-BvidP5Oa.js +0 -1
- package/dist/assets/skeleton-BEQW2Dva.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-Bui4RXQK.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-DTwUsCBz.js +0 -8
- package/dist/assets/tabs-BeLxVmkt.js +0 -1
- package/dist/assets/trash-2-CYUskMMN.js +0 -1
- package/dist/assets/treeView-QDETBFTQ-D5zsTiuL.js +0 -1
- package/dist/assets/treemap-6X3UGDF4-CR3dxqNs.js +0 -1
- package/dist/assets/use-config-CxKRXXCl.js +0 -1
- package/dist/assets/use-confirm-dialog-HASTvOP2.js +0 -1
- package/dist/assets/use-viewport-layout-CJxkjoRz.js +0 -1
- package/dist/assets/wardley-OPB4EBWU-LatRT_Lx.js +0 -1
- package/dist/assets/x-DdUwjre5.js +0 -1
- /package/dist/assets/{array-CAkJT3no.js → array-NADKd9aU.js} +0 -0
- /package/dist/assets/{chunk-KEIR6QF5-BgdDoWEH.js → chunk-KEIR6QF5-BuyuzJJL.js} +0 -0
- /package/dist/assets/{chunk-Y2CYZVJY-pTllD0P3.js → chunk-Y2CYZVJY-D_B2ZRNt.js} +0 -0
- /package/dist/assets/{config-hints-S3g-UVZb.js → config-hints-BcfVUMij.js} +0 -0
- /package/dist/assets/{cytoscape.esm-DmURt-5G.js → cytoscape.esm-BANTlgza.js} +0 -0
- /package/dist/assets/{defaultLocale-BKy_KP3O.js → defaultLocale-C4_L0aEs.js} +0 -0
- /package/dist/assets/{dist-IgNNB7K9.js → dist-DAPEIJbz.js} +0 -0
- /package/dist/assets/{graphlib-xw_TBHyH.js → graphlib-ChqXg0dI.js} +0 -0
- /package/dist/assets/{init-C9xlLIAu.js → init-D8wZg9xq.js} +0 -0
- /package/dist/assets/{jszip.min-Das2IAnb.js → jszip.min-CkbBfwAQ.js} +0 -0
- /package/dist/assets/{katex-DSy1eD2d.js → katex-TZJFa0J_.js} +0 -0
- /package/dist/assets/{middleware-Df-a4x-q.js → middleware-B3k-TSmZ.js} +0 -0
- /package/dist/assets/{path-DB0USYHi.js → path-DodfxcX7.js} +0 -0
- /package/dist/assets/{rough.esm-B1B52ZQS.js → rough.esm-CUaa1Rbe.js} +0 -0
- /package/dist/assets/{xlsx-DfjC_iml.js → xlsx-CxByi7bR.js} +0 -0
|
@@ -17,6 +17,9 @@ import type {
|
|
|
17
17
|
ProviderConfigUpdate,
|
|
18
18
|
ProviderConnectionTestRequest,
|
|
19
19
|
ProviderConnectionTestResult,
|
|
20
|
+
ProviderModelDiscoveryRequest,
|
|
21
|
+
ProviderModelDiscoveryResult,
|
|
22
|
+
ProviderModelCatalogView,
|
|
20
23
|
ProviderAuthStartRequest,
|
|
21
24
|
ProviderAuthStartResult,
|
|
22
25
|
ProviderAuthPollRequest,
|
|
@@ -90,6 +93,10 @@ export async function fetchProviderTemplates(): Promise<ProviderTemplatesView> {
|
|
|
90
93
|
return await nextclawClient.providers.listTemplates();
|
|
91
94
|
}
|
|
92
95
|
|
|
96
|
+
export async function fetchProviderModelCatalog(): Promise<ProviderModelCatalogView> {
|
|
97
|
+
return await nextclawClient.providers.listModelCatalog();
|
|
98
|
+
}
|
|
99
|
+
|
|
93
100
|
export async function fetchConfigSchema(): Promise<ConfigSchemaResponse> {
|
|
94
101
|
return await nextclawClient.config.fetchSchema();
|
|
95
102
|
}
|
|
@@ -121,6 +128,13 @@ export async function testProviderConnection(
|
|
|
121
128
|
return await nextclawClient.providers.testConnection(provider, data);
|
|
122
129
|
}
|
|
123
130
|
|
|
131
|
+
export async function discoverProviderModels(
|
|
132
|
+
provider: string,
|
|
133
|
+
data: ProviderModelDiscoveryRequest
|
|
134
|
+
): Promise<ProviderModelDiscoveryResult> {
|
|
135
|
+
return await nextclawClient.providers.discoverModels(provider, data);
|
|
136
|
+
}
|
|
137
|
+
|
|
124
138
|
export async function startProviderAuth(
|
|
125
139
|
provider: string,
|
|
126
140
|
data: ProviderAuthStartRequest = {}
|
|
@@ -156,6 +156,10 @@ export function describeCronSession(job: CronJobView): string {
|
|
|
156
156
|
return job.payload.sessionId?.trim() || `cron:${job.id}`;
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
+
export function canOpenCronSession(job: CronJobView): boolean {
|
|
160
|
+
return Boolean(job.payload.sessionId?.trim() || job.state.lastRunAt);
|
|
161
|
+
}
|
|
162
|
+
|
|
159
163
|
export function isCronJobForSession(
|
|
160
164
|
job: CronJobView,
|
|
161
165
|
sessionKey: string | null | undefined,
|
|
@@ -47,4 +47,30 @@ describe("HostCapabilityManager", () => {
|
|
|
47
47
|
reason: "popup-blocked"
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
|
+
|
|
51
|
+
it("reveals a path only through the explicit desktop bridge", async () => {
|
|
52
|
+
const revealPath = vi.fn(async () => ({ revealed: true as const }));
|
|
53
|
+
const manager = new HostCapabilityManager(() => ({
|
|
54
|
+
open: vi.fn(),
|
|
55
|
+
nextclawDesktop: {
|
|
56
|
+
host: { revealPath }
|
|
57
|
+
}
|
|
58
|
+
} as unknown as Window));
|
|
59
|
+
|
|
60
|
+
expect(manager.canRevealPath()).toBe(true);
|
|
61
|
+
await expect(manager.revealPath(" /tmp/demo.txt ")).resolves.toEqual({ revealed: true });
|
|
62
|
+
expect(revealPath).toHaveBeenCalledWith("/tmp/demo.txt");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("does not invent a web fallback for revealing local paths", async () => {
|
|
66
|
+
const manager = new HostCapabilityManager(() => ({
|
|
67
|
+
open: vi.fn()
|
|
68
|
+
} as unknown as Window));
|
|
69
|
+
|
|
70
|
+
expect(manager.canRevealPath()).toBe(false);
|
|
71
|
+
await expect(manager.revealPath("/tmp/demo.txt")).resolves.toEqual({
|
|
72
|
+
revealed: false,
|
|
73
|
+
reason: "host-unavailable"
|
|
74
|
+
});
|
|
75
|
+
});
|
|
50
76
|
});
|
|
@@ -7,10 +7,18 @@ export type OpenExternalUrlResult =
|
|
|
7
7
|
| { opened: true }
|
|
8
8
|
| { opened: false; reason: OpenExternalUrlFailureReason };
|
|
9
9
|
|
|
10
|
+
export type RevealPathResult =
|
|
11
|
+
| { revealed: true }
|
|
12
|
+
| {
|
|
13
|
+
revealed: false;
|
|
14
|
+
reason: "unsupported-path" | "host-unavailable" | "bridge-failed";
|
|
15
|
+
};
|
|
16
|
+
|
|
10
17
|
type HostWindow = Pick<Window, "open"> & {
|
|
11
18
|
nextclawDesktop?: {
|
|
12
19
|
host?: {
|
|
13
20
|
openExternalUrl?: (url: string) => Promise<OpenExternalUrlResult>;
|
|
21
|
+
revealPath?: (path: string) => Promise<RevealPathResult>;
|
|
14
22
|
};
|
|
15
23
|
};
|
|
16
24
|
};
|
|
@@ -45,6 +53,26 @@ export class HostCapabilityManager {
|
|
|
45
53
|
return { opened: false, reason: "bridge-failed" };
|
|
46
54
|
}
|
|
47
55
|
};
|
|
56
|
+
|
|
57
|
+
canRevealPath = (): boolean => {
|
|
58
|
+
return Boolean(this.getWindow()?.nextclawDesktop?.host?.revealPath);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
revealPath = async (rawPath: string): Promise<RevealPathResult> => {
|
|
62
|
+
const path = rawPath.trim();
|
|
63
|
+
if (!path) {
|
|
64
|
+
return { revealed: false, reason: "unsupported-path" };
|
|
65
|
+
}
|
|
66
|
+
const revealPath = this.getWindow()?.nextclawDesktop?.host?.revealPath;
|
|
67
|
+
if (!revealPath) {
|
|
68
|
+
return { revealed: false, reason: "host-unavailable" };
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
return await revealPath(path);
|
|
72
|
+
} catch {
|
|
73
|
+
return { revealed: false, reason: "bridge-failed" };
|
|
74
|
+
}
|
|
75
|
+
};
|
|
48
76
|
}
|
|
49
77
|
|
|
50
78
|
export const hostCapabilityManager = new HostCapabilityManager();
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"chatWorkspaceChildSessionsEmpty": "No child sessions yet.",
|
|
54
54
|
"chatWorkspaceSessionCronJobsDescription": "Review scheduled tasks associated with this session.",
|
|
55
55
|
"chatWorkspaceProjectFiles": "Project files",
|
|
56
|
-
"chatWorkspaceProjectFilesDescription": "Browse files from
|
|
57
|
-
"chatWorkspaceProjectFilesUnavailable": "
|
|
56
|
+
"chatWorkspaceProjectFilesDescription": "Browse files from the selected project directory.",
|
|
57
|
+
"chatWorkspaceProjectFilesUnavailable": "Select a project directory to browse its files.",
|
|
58
58
|
"chatWorkspaceSideChatDraftTitle": "Side chat",
|
|
59
59
|
"chatWorkspaceSideChatDraftSubtitle": "This draft will inherit the parent session context when you send the first message.",
|
|
60
60
|
"chatWorkspaceChildSessions": "Child sessions",
|
|
@@ -73,6 +73,14 @@
|
|
|
73
73
|
"chatWorkspaceOpenFile": "Open file",
|
|
74
74
|
"chatWorkspaceDirectoryEmpty": "This directory is empty.",
|
|
75
75
|
"chatWorkspaceDirectoryLoadFailed": "Failed to load directory",
|
|
76
|
+
"chatWorkspaceFileContextMenu": "Project file actions",
|
|
77
|
+
"chatWorkspaceAddToChat": "Add to chat",
|
|
78
|
+
"chatWorkspaceExcerptSelectionTooLong": "Selection is too long",
|
|
79
|
+
"chatWorkspaceRevealInFileManager": "Reveal in file manager",
|
|
80
|
+
"chatWorkspaceCopyPath": "Copy path",
|
|
81
|
+
"chatWorkspaceCopyRelativePath": "Copy relative path",
|
|
82
|
+
"chatWorkspaceCopyPathFailed": "Could not copy the path.",
|
|
83
|
+
"chatWorkspaceRevealPathFailed": "Could not reveal this item in the file manager.",
|
|
76
84
|
"chatWorkspacePreviewUnsupported": "This file is not supported in the sidebar preview yet.",
|
|
77
85
|
"chatWorkspacePreviewUnsupportedHint": "Legacy Word or PowerPoint files, archives, and other unsupported formats can be downloaded and opened with a local app.",
|
|
78
86
|
"chatWorkspacePreviewFailed": "The file could not be previewed. You can still download it and open it with a local app.",
|
|
@@ -285,21 +293,43 @@
|
|
|
285
293
|
"chatFavoriteModel": "Add to favorites",
|
|
286
294
|
"chatUnfavoriteModel": "Remove from favorites",
|
|
287
295
|
"chatManageModels": "Manage models and providers",
|
|
296
|
+
"chatDiscoveredModelsSummary": "{count} new models available",
|
|
297
|
+
"chatDiscoveredModelsView": "View",
|
|
298
|
+
"chatDiscoveredModelsGroup": "New models",
|
|
299
|
+
"chatDiscoveredModelsDismiss": "Dismiss this batch",
|
|
300
|
+
"chatDiscoveredModelsDone": "Done",
|
|
301
|
+
"chatDiscoveredModelsClose": "Close new models",
|
|
302
|
+
"chatDiscoveredModelAdd": "Add",
|
|
303
|
+
"chatDiscoveredModelAddedShort": "Added",
|
|
304
|
+
"chatDiscoveredModelAdded": "Added {model}",
|
|
305
|
+
"chatDiscoveredModelUnavailable": "This model is no longer available. Reopen the model selector.",
|
|
288
306
|
"chatPickerAllSkills": "All skills",
|
|
289
307
|
"chatSend": "Send",
|
|
308
|
+
"chatContinueRun": "Continue",
|
|
309
|
+
"chatEditMessage": "Edit message",
|
|
310
|
+
"chatEditMessageCancel": "Cancel",
|
|
311
|
+
"chatEditMessagePlaceholder": "Edit your message",
|
|
312
|
+
"chatEditMessageSubmit": "Send",
|
|
290
313
|
"chatStop": "Stop",
|
|
291
314
|
"chatStopPreparing": "Preparing stoppable run…",
|
|
292
315
|
"chatStopUnavailable": "Manual stop is not supported by the current backend engine.",
|
|
293
316
|
"chatContextWindow": "Context window",
|
|
294
317
|
"chatContextWindowUsed": "Projected use",
|
|
318
|
+
"chatContextWindowFixed": "System and tools",
|
|
319
|
+
"chatContextWindowDynamic": "Conversation",
|
|
320
|
+
"chatContextWindowTrigger": "Auto-compaction threshold",
|
|
321
|
+
"chatContextWindowReserve": "Output reserve",
|
|
295
322
|
"chatContextWindowTotal": "Total",
|
|
296
323
|
"chatContextWindowAvailable": "Available",
|
|
324
|
+
"chatContextWindowAvailableBeforeCompaction": "Until auto-compaction",
|
|
297
325
|
"chatContextWindowPruned": "After safety pruning",
|
|
298
326
|
"chatContextWindowDroppedHistory": "Dropped history",
|
|
299
327
|
"chatContextWindowTruncatedTools": "Truncated tool results",
|
|
300
328
|
"chatContextWindowUpdatedAt": "Updated",
|
|
301
329
|
"chatContextCompactionCompressing": "Compressing earlier context",
|
|
302
330
|
"chatContextCompactionCompressed": "Earlier context was auto-compacted",
|
|
331
|
+
"chatContextCompactionCancelled": "Context compaction was cancelled",
|
|
332
|
+
"chatContextCompactionFailed": "Context compaction failed",
|
|
303
333
|
"chatContextCompactionCoveredMessages": "Covered messages",
|
|
304
334
|
"chatContextCompactionOriginalTokens": "Estimated before compaction",
|
|
305
335
|
"chatContextCompactionProjectedTokens": "Estimated after compaction",
|
|
@@ -357,7 +387,6 @@
|
|
|
357
387
|
"chatSessionErrorTitle": "Something went wrong",
|
|
358
388
|
"chatSessionActivityInterrupted": "The run was interrupted. Send the message again.",
|
|
359
389
|
"chatSendFailed": "Failed to send message",
|
|
360
|
-
"chatErrorDetails": "Details",
|
|
361
390
|
"chatRoleUser": "You",
|
|
362
391
|
"chatRoleAssistant": "Assistant",
|
|
363
392
|
"chatRoleTool": "Tool",
|
|
@@ -403,6 +432,9 @@
|
|
|
403
432
|
"chatMermaidExpand": "Expand diagram",
|
|
404
433
|
"chatMermaidLoading": "Rendering diagram…",
|
|
405
434
|
"chatMermaidRenderError": "Diagram could not be rendered; showing source instead",
|
|
435
|
+
"chatPreviewZoomIn": "Zoom in",
|
|
436
|
+
"chatPreviewZoomOut": "Zoom out",
|
|
437
|
+
"chatPreviewResetZoom": "Reset zoom",
|
|
406
438
|
"chatSidebarNewTask": "New Task",
|
|
407
439
|
"chatSidebarSearchPlaceholder": "Search conversations...",
|
|
408
440
|
"chatSidebarScheduledTasks": "Scheduled Tasks",
|
|
@@ -429,7 +461,8 @@
|
|
|
429
461
|
"chatWelcomeContextLabel": "Task context",
|
|
430
462
|
"chatWelcomeProjectPickerLabel": "Choose working directory",
|
|
431
463
|
"chatWelcomeProjectPickerPlaceholder": "Choose working directory",
|
|
432
|
-
"chatWelcomeProjectRecentTitle": "
|
|
464
|
+
"chatWelcomeProjectRecentTitle": "Working directories",
|
|
465
|
+
"chatWelcomeProjectDefaultBadge": "Default",
|
|
433
466
|
"chatWelcomeProjectNoRecent": "No recent projects yet",
|
|
434
467
|
"chatWelcomeProjectOpenFolder": "Open folder",
|
|
435
468
|
"chatWelcomeSessionTypePickerLabel": "Choose session type",
|
|
@@ -448,6 +481,8 @@
|
|
|
448
481
|
"chatSkillPreviewUnavailable": "This skill file is unavailable. It may have been moved or removed.",
|
|
449
482
|
"chatInputAdd": "Add content",
|
|
450
483
|
"chatInputAttach": "Attach file",
|
|
484
|
+
"chatInputRemoveReference": "Remove reference",
|
|
485
|
+
"chatWorkspaceExcerptCharacterCount": "{count} characters",
|
|
451
486
|
"chatInputAttachmentUnsupported": "This file type is not supported in the current upload flow.",
|
|
452
487
|
"chatInputAttachmentTooLarge": "Files must be {maxMb} MB or smaller.",
|
|
453
488
|
"chatInputAttachmentReadFailed": "Failed to read the file. Please try again."
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"saving": "Saving...",
|
|
41
41
|
"remove": "Remove",
|
|
42
42
|
"more": "More",
|
|
43
|
+
"notificationDismiss": "Dismiss notification",
|
|
43
44
|
"all": "All",
|
|
44
45
|
"yes": "Yes",
|
|
45
46
|
"no": "No",
|
|
@@ -56,6 +57,7 @@
|
|
|
56
57
|
"themeDawn": "Dawn",
|
|
57
58
|
"themeGraphite": "Graphite",
|
|
58
59
|
"themeNight": "Night",
|
|
60
|
+
"themeCharcoal": "Charcoal",
|
|
59
61
|
"themeProbe": "Probe",
|
|
60
62
|
"isRequired": "is required",
|
|
61
63
|
"duplicate": "duplicate",
|
|
@@ -115,6 +117,30 @@
|
|
|
115
117
|
"providerTestConnectionSuccess": "Connection test passed",
|
|
116
118
|
"providerTestConnectionFailed": "Connection test failed",
|
|
117
119
|
"providerModelsTitle": "Available Models",
|
|
120
|
+
"providerModelsFetch": "Fetch model list",
|
|
121
|
+
"providerModelsFetching": "Fetching...",
|
|
122
|
+
"providerModelsFetchSuccess": "Model list fetched",
|
|
123
|
+
"providerModelsFetchFailed": "Failed to fetch model list",
|
|
124
|
+
"providerModelsApiKeyRequired": "Please enter an API Key before fetching the model list",
|
|
125
|
+
"providerModelsAuthorizationFailed": "Authentication failed. Check the API Key and API address",
|
|
126
|
+
"providerModelsSuggestionsChecking": "Loading the model catalog…",
|
|
127
|
+
"providerModelsSuggestionsFailed": "Unable to load the model catalog. Check the API Key, API address, or network connection; you can still add models manually.",
|
|
128
|
+
"providerModelsSuggestionsSummary": "Catalog models not added: {count}",
|
|
129
|
+
"providerModelsFetchedSuggestionsSummary": "{count} fetched models available to add",
|
|
130
|
+
"providerModelsFetchedAllConfigured": "Fetched {count} models; all are already in the current list",
|
|
131
|
+
"providerModelsSuggestionsAddAll": "Add all",
|
|
132
|
+
"providerModelsSuggestionSelect": "Select model {model}",
|
|
133
|
+
"providerModelsSuggestionsSelected": "{count} selected",
|
|
134
|
+
"providerModelsSuggestionsAddSelected": "Add selected",
|
|
135
|
+
"providerModelsSuggestionsSaveHint": "Save to apply the added models.",
|
|
136
|
+
"providerModelsSuggestionsSearchPlaceholder": "Search catalog models",
|
|
137
|
+
"providerModelsSuggestionsSearchEmpty": "No matching models",
|
|
138
|
+
"providerModelsSuggestionsShowing": "Showing the first {visible} of {count} matches; refine your search to narrow the list",
|
|
139
|
+
"providerModelsBulkRemove": "Bulk delete",
|
|
140
|
+
"providerModelsSelectAll": "Select all",
|
|
141
|
+
"providerModelsClearSelection": "Clear selection",
|
|
142
|
+
"providerModelsRemoveSelected": "Delete selected",
|
|
143
|
+
"providerModelsRemoveSaveHint": "Deletion only changes this draft and applies after you save.",
|
|
118
144
|
"providerModelInputPlaceholder": "Enter provider-local model id (may contain /)",
|
|
119
145
|
"providerModelInputHint": "The list is only a reference. You can type and add models that are not listed.",
|
|
120
146
|
"providerAddModel": "Add Model",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"serviceAppsEmptyTitle": "No service apps",
|
|
69
69
|
"serviceAppsEmptyDescription": "Service apps expose local runtimes and actions that panel apps can call.",
|
|
70
70
|
"serviceAppsRefresh": "Refresh service apps",
|
|
71
|
+
"serviceAppsConnect": "Connect",
|
|
71
72
|
"serviceAppsDiscoverActions": "Connect and discover actions",
|
|
72
73
|
"serviceAppsDiscoverActionsHint": "Connect to the service app runtime and discover its available actions.",
|
|
73
74
|
"serviceAppsDisconnectRuntime": "Disconnect runtime",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"searchProviderBochaDescription": "AI-ready search that works better for mainland China users.",
|
|
16
16
|
"searchProviderTavilyDescription": "Research-focused search with configurable answer synthesis.",
|
|
17
17
|
"searchProviderBraveDescription": "Keep Brave as an optional provider.",
|
|
18
|
+
"searchProviderExaDescription": "Semantic search with page content for research and discovery.",
|
|
18
19
|
"searchStatusConfigured": "Configured",
|
|
19
20
|
"searchStatusNeedsSetup": "Needs Setup",
|
|
20
21
|
"searchFreshnessNoLimit": "No Limit",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"chatWorkspaceChildSessionsEmpty": "当前还没有子会话。",
|
|
54
54
|
"chatWorkspaceSessionCronJobsDescription": "查看与当前会话关联的定时任务。",
|
|
55
55
|
"chatWorkspaceProjectFiles": "项目文件",
|
|
56
|
-
"chatWorkspaceProjectFilesDescription": "
|
|
57
|
-
"chatWorkspaceProjectFilesUnavailable": "
|
|
56
|
+
"chatWorkspaceProjectFilesDescription": "浏览已选项目目录中的文件。",
|
|
57
|
+
"chatWorkspaceProjectFilesUnavailable": "请先选择项目目录,再浏览其中的文件。",
|
|
58
58
|
"chatWorkspaceSideChatDraftTitle": "侧边对话",
|
|
59
59
|
"chatWorkspaceSideChatDraftSubtitle": "发送第一条消息后,会继承父会话上下文并创建真实 child 会话。",
|
|
60
60
|
"chatWorkspaceChildSessions": "子会话",
|
|
@@ -73,6 +73,14 @@
|
|
|
73
73
|
"chatWorkspaceOpenFile": "打开文件",
|
|
74
74
|
"chatWorkspaceDirectoryEmpty": "这个目录为空。",
|
|
75
75
|
"chatWorkspaceDirectoryLoadFailed": "读取目录失败",
|
|
76
|
+
"chatWorkspaceFileContextMenu": "项目文件操作",
|
|
77
|
+
"chatWorkspaceAddToChat": "添加到聊天",
|
|
78
|
+
"chatWorkspaceExcerptSelectionTooLong": "选择内容过长",
|
|
79
|
+
"chatWorkspaceRevealInFileManager": "在文件管理器中显示",
|
|
80
|
+
"chatWorkspaceCopyPath": "复制路径",
|
|
81
|
+
"chatWorkspaceCopyRelativePath": "复制相对路径",
|
|
82
|
+
"chatWorkspaceCopyPathFailed": "无法复制路径。",
|
|
83
|
+
"chatWorkspaceRevealPathFailed": "无法在文件管理器中显示该项目。",
|
|
76
84
|
"chatWorkspacePreviewUnsupported": "该文件暂不支持在侧栏预览。",
|
|
77
85
|
"chatWorkspacePreviewUnsupportedHint": "旧版 Word、PowerPoint、压缩包等暂不支持的格式,可以下载后用本机应用打开。",
|
|
78
86
|
"chatWorkspacePreviewFailed": "文件预览失败。你仍可以下载后用本机应用打开。",
|
|
@@ -285,21 +293,43 @@
|
|
|
285
293
|
"chatFavoriteModel": "收藏模型",
|
|
286
294
|
"chatUnfavoriteModel": "取消收藏",
|
|
287
295
|
"chatManageModels": "管理模型与提供商",
|
|
296
|
+
"chatDiscoveredModelsSummary": "发现 {count} 个可添加的新模型",
|
|
297
|
+
"chatDiscoveredModelsView": "查看",
|
|
298
|
+
"chatDiscoveredModelsGroup": "新模型",
|
|
299
|
+
"chatDiscoveredModelsDismiss": "忽略这批提醒",
|
|
300
|
+
"chatDiscoveredModelsDone": "完成",
|
|
301
|
+
"chatDiscoveredModelsClose": "关闭新模型窗口",
|
|
302
|
+
"chatDiscoveredModelAdd": "添加",
|
|
303
|
+
"chatDiscoveredModelAddedShort": "已添加",
|
|
304
|
+
"chatDiscoveredModelAdded": "已添加 {model}",
|
|
305
|
+
"chatDiscoveredModelUnavailable": "这个模型已不可用,请重新打开模型选择器",
|
|
288
306
|
"chatPickerAllSkills": "全部技能",
|
|
289
307
|
"chatSend": "发送",
|
|
308
|
+
"chatContinueRun": "继续运行",
|
|
309
|
+
"chatEditMessage": "编辑消息",
|
|
310
|
+
"chatEditMessageCancel": "取消",
|
|
311
|
+
"chatEditMessagePlaceholder": "编辑消息",
|
|
312
|
+
"chatEditMessageSubmit": "发送",
|
|
290
313
|
"chatStop": "停止",
|
|
291
314
|
"chatStopPreparing": "正在建立可停止会话,请稍候…",
|
|
292
315
|
"chatStopUnavailable": "当前后端引擎不支持手动停止。",
|
|
293
316
|
"chatContextWindow": "上下文窗口",
|
|
294
317
|
"chatContextWindowUsed": "预计占用",
|
|
318
|
+
"chatContextWindowFixed": "系统与工具",
|
|
319
|
+
"chatContextWindowDynamic": "会话内容",
|
|
320
|
+
"chatContextWindowTrigger": "自动压缩线",
|
|
321
|
+
"chatContextWindowReserve": "输出预留",
|
|
295
322
|
"chatContextWindowTotal": "总窗口",
|
|
296
323
|
"chatContextWindowAvailable": "剩余",
|
|
324
|
+
"chatContextWindowAvailableBeforeCompaction": "距自动压缩",
|
|
297
325
|
"chatContextWindowPruned": "安全裁剪后",
|
|
298
326
|
"chatContextWindowDroppedHistory": "已丢弃历史消息",
|
|
299
327
|
"chatContextWindowTruncatedTools": "已截断工具结果",
|
|
300
328
|
"chatContextWindowUpdatedAt": "更新时间",
|
|
301
329
|
"chatContextCompactionCompressing": "正在压缩较早上下文",
|
|
302
330
|
"chatContextCompactionCompressed": "较早上下文已自动压缩",
|
|
331
|
+
"chatContextCompactionCancelled": "上下文压缩已取消",
|
|
332
|
+
"chatContextCompactionFailed": "上下文压缩失败",
|
|
303
333
|
"chatContextCompactionCoveredMessages": "覆盖消息数",
|
|
304
334
|
"chatContextCompactionOriginalTokens": "压缩前估算",
|
|
305
335
|
"chatContextCompactionProjectedTokens": "压缩后估算",
|
|
@@ -357,7 +387,6 @@
|
|
|
357
387
|
"chatSessionErrorTitle": "出错了",
|
|
358
388
|
"chatSessionActivityInterrupted": "运行意外中断,请重新发送消息。",
|
|
359
389
|
"chatSendFailed": "发送消息失败",
|
|
360
|
-
"chatErrorDetails": "查看详情",
|
|
361
390
|
"chatRoleUser": "你",
|
|
362
391
|
"chatRoleAssistant": "助手",
|
|
363
392
|
"chatRoleTool": "工具",
|
|
@@ -403,6 +432,9 @@
|
|
|
403
432
|
"chatMermaidExpand": "放大图表",
|
|
404
433
|
"chatMermaidLoading": "正在渲染图表…",
|
|
405
434
|
"chatMermaidRenderError": "图表无法渲染,已显示源代码",
|
|
435
|
+
"chatPreviewZoomIn": "放大",
|
|
436
|
+
"chatPreviewZoomOut": "缩小",
|
|
437
|
+
"chatPreviewResetZoom": "重置缩放",
|
|
406
438
|
"chatSidebarNewTask": "新任务",
|
|
407
439
|
"chatSidebarSearchPlaceholder": "搜索对话...",
|
|
408
440
|
"chatSidebarScheduledTasks": "定时任务",
|
|
@@ -429,7 +461,8 @@
|
|
|
429
461
|
"chatWelcomeContextLabel": "任务上下文",
|
|
430
462
|
"chatWelcomeProjectPickerLabel": "选择工作目录",
|
|
431
463
|
"chatWelcomeProjectPickerPlaceholder": "选择工作目录",
|
|
432
|
-
"chatWelcomeProjectRecentTitle": "
|
|
464
|
+
"chatWelcomeProjectRecentTitle": "工作目录",
|
|
465
|
+
"chatWelcomeProjectDefaultBadge": "默认",
|
|
433
466
|
"chatWelcomeProjectNoRecent": "暂无最近项目",
|
|
434
467
|
"chatWelcomeProjectOpenFolder": "打开文件夹",
|
|
435
468
|
"chatWelcomeSessionTypePickerLabel": "选择会话类型",
|
|
@@ -448,6 +481,8 @@
|
|
|
448
481
|
"chatSkillPreviewUnavailable": "无法打开这个技能文件,它可能已被移动或删除。",
|
|
449
482
|
"chatInputAdd": "添加内容",
|
|
450
483
|
"chatInputAttach": "添加附件",
|
|
484
|
+
"chatInputRemoveReference": "移除引用",
|
|
485
|
+
"chatWorkspaceExcerptCharacterCount": "{count} 个字符",
|
|
451
486
|
"chatInputAttachmentUnsupported": "当前上传流程不支持该文件类型。",
|
|
452
487
|
"chatInputAttachmentTooLarge": "文件不能超过 {maxMb} MB。",
|
|
453
488
|
"chatInputAttachmentReadFailed": "读取文件失败,请重试。"
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"saving": "保存中...",
|
|
41
41
|
"remove": "移除",
|
|
42
42
|
"more": "更多",
|
|
43
|
+
"notificationDismiss": "关闭通知",
|
|
43
44
|
"all": "全部",
|
|
44
45
|
"yes": "是",
|
|
45
46
|
"no": "否",
|
|
@@ -56,6 +57,7 @@
|
|
|
56
57
|
"themeDawn": "晨砂",
|
|
57
58
|
"themeGraphite": "石墨",
|
|
58
59
|
"themeNight": "暗夜",
|
|
60
|
+
"themeCharcoal": "炭夜",
|
|
59
61
|
"themeProbe": "探针",
|
|
60
62
|
"isRequired": "必填",
|
|
61
63
|
"duplicate": "重复",
|
|
@@ -115,6 +117,30 @@
|
|
|
115
117
|
"providerTestConnectionSuccess": "连接测试通过",
|
|
116
118
|
"providerTestConnectionFailed": "连接测试失败",
|
|
117
119
|
"providerModelsTitle": "可用模型列表",
|
|
120
|
+
"providerModelsFetch": "获取模型列表",
|
|
121
|
+
"providerModelsFetching": "获取中...",
|
|
122
|
+
"providerModelsFetchSuccess": "模型列表获取成功",
|
|
123
|
+
"providerModelsFetchFailed": "获取模型列表失败",
|
|
124
|
+
"providerModelsApiKeyRequired": "请先填写 API Key,再获取模型列表",
|
|
125
|
+
"providerModelsAuthorizationFailed": "认证失败,请检查 API Key 是否正确,以及 API 地址是否匹配",
|
|
126
|
+
"providerModelsSuggestionsChecking": "正在读取模型目录…",
|
|
127
|
+
"providerModelsSuggestionsFailed": "模型目录读取失败。请检查 API Key、API 地址或网络连接;你仍可手动添加模型。",
|
|
128
|
+
"providerModelsSuggestionsSummary": "目录中有 {count} 个未添加模型",
|
|
129
|
+
"providerModelsFetchedSuggestionsSummary": "已获取 {count} 个可添加模型",
|
|
130
|
+
"providerModelsFetchedAllConfigured": "已获取 {count} 个模型,当前列表已全部包含",
|
|
131
|
+
"providerModelsSuggestionsAddAll": "全部添加",
|
|
132
|
+
"providerModelsSuggestionSelect": "选择模型 {model}",
|
|
133
|
+
"providerModelsSuggestionsSelected": "已选择 {count} 个",
|
|
134
|
+
"providerModelsSuggestionsAddSelected": "添加所选",
|
|
135
|
+
"providerModelsSuggestionsSaveHint": "添加后请保存以应用配置。",
|
|
136
|
+
"providerModelsSuggestionsSearchPlaceholder": "搜索目录模型",
|
|
137
|
+
"providerModelsSuggestionsSearchEmpty": "没有匹配的模型",
|
|
138
|
+
"providerModelsSuggestionsShowing": "显示前 {visible} 个匹配项,共 {count} 个;继续搜索可缩小范围",
|
|
139
|
+
"providerModelsBulkRemove": "批量删除",
|
|
140
|
+
"providerModelsSelectAll": "全选",
|
|
141
|
+
"providerModelsClearSelection": "取消全选",
|
|
142
|
+
"providerModelsRemoveSelected": "删除所选",
|
|
143
|
+
"providerModelsRemoveSaveHint": "删除只会修改当前草稿,保存后才会应用。",
|
|
118
144
|
"providerModelInputPlaceholder": "输入 provider 本地模型 ID(可包含 /)",
|
|
119
145
|
"providerModelInputHint": "列表仅作参考,不在列表也可直接输入并添加。",
|
|
120
146
|
"providerAddModel": "添加模型",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"serviceAppsEmptyTitle": "暂无服务应用",
|
|
69
69
|
"serviceAppsEmptyDescription": "服务应用提供本地运行时与动作,供面板应用调用。",
|
|
70
70
|
"serviceAppsRefresh": "刷新服务应用",
|
|
71
|
+
"serviceAppsConnect": "连接",
|
|
71
72
|
"serviceAppsDiscoverActions": "连接并发现动作",
|
|
72
73
|
"serviceAppsDiscoverActionsHint": "连接服务应用运行时,并发现它当前可用的动作。",
|
|
73
74
|
"serviceAppsDisconnectRuntime": "断开连接",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"searchProviderBochaDescription": "更适合中国大陆用户的 AI 搜索。",
|
|
16
16
|
"searchProviderTavilyDescription": "更适合调研和网页信息整合的搜索 provider。",
|
|
17
17
|
"searchProviderBraveDescription": "保留 Brave 作为可选 provider。",
|
|
18
|
+
"searchProviderExaDescription": "语义搜索并提取网页正文,适合调研和资料发现。",
|
|
18
19
|
"searchStatusConfigured": "已配置",
|
|
19
20
|
"searchStatusNeedsSetup": "待配置",
|
|
20
21
|
"searchFreshnessNoLimit": "不限",
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
buildWorkspaceFileBreadcrumb,
|
|
4
|
+
resolveWorkspaceRelativePath,
|
|
5
|
+
} from "@/shared/lib/session-project";
|
|
3
6
|
|
|
4
7
|
describe("buildWorkspaceFileBreadcrumb", () => {
|
|
5
8
|
it("builds project-relative breadcrumbs for files inside the active workspace", () => {
|
|
@@ -92,3 +95,27 @@ describe("buildWorkspaceFileBreadcrumb", () => {
|
|
|
92
95
|
expect(breadcrumb.segments[1]?.label).toBe("README.md");
|
|
93
96
|
});
|
|
94
97
|
});
|
|
98
|
+
|
|
99
|
+
describe("resolveWorkspaceRelativePath", () => {
|
|
100
|
+
it("normalizes relative and project-contained absolute file paths", () => {
|
|
101
|
+
expect(resolveWorkspaceRelativePath({
|
|
102
|
+
path: "src\\chat\\example.tsx",
|
|
103
|
+
sessionProjectRoot: "C:\\work\\nextclaw",
|
|
104
|
+
})).toBe("src/chat/example.tsx");
|
|
105
|
+
expect(resolveWorkspaceRelativePath({
|
|
106
|
+
path: "/Users/demo/project-alpha/src/chat/example.tsx",
|
|
107
|
+
sessionProjectRoot: "/Users/demo/project-alpha",
|
|
108
|
+
})).toBe("src/chat/example.tsx");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("rejects project-external and parent-traversing paths", () => {
|
|
112
|
+
expect(resolveWorkspaceRelativePath({
|
|
113
|
+
path: "/tmp/example.ts",
|
|
114
|
+
sessionProjectRoot: "/Users/demo/project-alpha",
|
|
115
|
+
})).toBeNull();
|
|
116
|
+
expect(resolveWorkspaceRelativePath({
|
|
117
|
+
path: "../secrets.txt",
|
|
118
|
+
sessionProjectRoot: "/Users/demo/project-alpha",
|
|
119
|
+
})).toBeNull();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -127,6 +127,29 @@ function readRelativeSegments(params: {
|
|
|
127
127
|
return normalizedPath.slice(rootPrefix.length).split("/").filter(Boolean);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
export function resolveWorkspaceRelativePath(params: {
|
|
131
|
+
path: string;
|
|
132
|
+
sessionProjectRoot: string | null;
|
|
133
|
+
}): string | null {
|
|
134
|
+
const projectRoot = params.sessionProjectRoot?.trim();
|
|
135
|
+
if (!projectRoot) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const segments = readRelativeSegments({
|
|
140
|
+
path: params.path,
|
|
141
|
+
sessionProjectRoot: projectRoot,
|
|
142
|
+
});
|
|
143
|
+
if (
|
|
144
|
+
!segments?.length ||
|
|
145
|
+
segments.some((segment) => segment === "." || segment === "..")
|
|
146
|
+
) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return segments.join("/");
|
|
151
|
+
}
|
|
152
|
+
|
|
130
153
|
function buildSegmentsFromLabels(params: {
|
|
131
154
|
labels: string[];
|
|
132
155
|
basePath?: string | null;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
2
|
import {
|
|
3
3
|
DEFAULT_UI_THEME,
|
|
4
|
+
getThemeAppearance,
|
|
5
|
+
normalizeTheme,
|
|
4
6
|
resolveInitialTheme,
|
|
5
7
|
THEME_OPTIONS,
|
|
6
8
|
} from './index';
|
|
@@ -18,4 +20,13 @@ describe('ui theme defaults', () => {
|
|
|
18
20
|
it('lists the default theme first', () => {
|
|
19
21
|
expect(THEME_OPTIONS[0]?.value).toBe(DEFAULT_UI_THEME);
|
|
20
22
|
});
|
|
23
|
+
|
|
24
|
+
it('recognizes charcoal as a dark theme', () => {
|
|
25
|
+
expect(normalizeTheme('charcoal')).toBe('charcoal');
|
|
26
|
+
expect(getThemeAppearance('charcoal')).toBe('dark');
|
|
27
|
+
expect(THEME_OPTIONS).toContainEqual({
|
|
28
|
+
value: 'charcoal',
|
|
29
|
+
labelKey: 'themeCharcoal',
|
|
30
|
+
});
|
|
31
|
+
});
|
|
21
32
|
});
|
|
@@ -7,6 +7,7 @@ export type UiTheme =
|
|
|
7
7
|
| 'dawn'
|
|
8
8
|
| 'graphite'
|
|
9
9
|
| 'night'
|
|
10
|
+
| 'charcoal'
|
|
10
11
|
| 'probe';
|
|
11
12
|
export type UiThemeAppearance = 'light' | 'dark';
|
|
12
13
|
|
|
@@ -22,6 +23,7 @@ export const DEFAULT_UI_THEME: UiTheme = 'work';
|
|
|
22
23
|
const THEME_DEFINITIONS: readonly UiThemeDefinition[] = [
|
|
23
24
|
{ value: 'work', labelKey: 'themeWork', appearance: 'light' },
|
|
24
25
|
{ value: 'night', labelKey: 'themeNight', appearance: 'dark' },
|
|
26
|
+
{ value: 'charcoal', labelKey: 'themeCharcoal', appearance: 'dark' },
|
|
25
27
|
{ value: 'natural', labelKey: 'themeNatural', appearance: 'light' },
|
|
26
28
|
{ value: 'minimal', labelKey: 'themeMinimal', appearance: 'light' },
|
|
27
29
|
{ value: 'warm', labelKey: 'themeWarm', appearance: 'light' },
|