@nextclaw/ui 0.15.21 → 0.15.23
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 +69 -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-Glw2OGXK.js +13 -0
- package/dist/assets/appearance-settings-page-Bl_W_9m7.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-C7E4Sxwd.js +8 -0
- package/dist/assets/chat-page-BT6dNI-4.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-D5BgtKrm.js +1 -0
- package/dist/assets/confirm-dialog-Bf907Azu.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-BwuyBPJb.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-CtLyEJeO.js +1 -0
- package/dist/assets/dist-dv_SUR54.js +1 -0
- package/dist/assets/doc-browser-C23NDGh5.js +1 -0
- package/dist/assets/doc-browser-DlOOhBxI.js +1 -0
- package/dist/assets/doc-browser-context-BIBjkwfV.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-DvvxCpL4.js → form-actions-DAzi68Cn.js} +1 -1
- 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-BLNg2yg0.css +1 -0
- package/dist/assets/index-D3EKjEyK.js +107 -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-BSg5u0r4.js +1 -0
- package/dist/assets/{map-BAAdHTqR.js → map-CcZzEoz6.js} +1 -1
- package/dist/assets/mcp-marketplace-page-ByhvQQj5.js +9 -0
- package/dist/assets/mcp-marketplace-page-CytXwnUs.js +1 -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-bgEx3MjQ.js +1 -0
- package/dist/assets/navigation-link-CB0OQbnY.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-CNjWdLhZ.js +1 -0
- package/dist/assets/provider-scoped-model-input-8F6JMd2n.js +1 -0
- package/dist/assets/providers-config-page-CxpTjR81.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-Bk2ydNTe.js +8 -0
- package/dist/assets/{refresh-cw-C2e94pmp.js → refresh-cw-Ba0LZou4.js} +1 -1
- package/dist/assets/remote-Dv38PuMV.js +1 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-D8YV0-Jz.js → requirementDiagram-TGXJPOKE-CyVUzEX5.js} +1 -1
- package/dist/assets/rotate-cw-IkYVk9JX.js +1 -0
- package/dist/assets/runtime-config-page-C0ByyUVr.js +1 -0
- package/dist/assets/{sankeyDiagram-HTMAVEWB-C2vA4ojE.js → sankeyDiagram-HTMAVEWB-JK6bFmYB.js} +1 -1
- package/dist/assets/{save-CkwDOgvt.js → save-DTOAvqzt.js} +1 -1
- package/dist/assets/{search-CLXM2reO.js → search-D4X5DNMe.js} +1 -1
- package/dist/assets/search-config-page-Cr6254K5.js +1 -0
- package/dist/assets/{secrets-config-page-DQ_Curaj.js → secrets-config-page-W2Hx332d.js} +2 -2
- package/dist/assets/security-config-1E8OF4kR.js +1 -0
- package/dist/assets/select-CDv0g2Pj.js +41 -0
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-B9LBmpUo.js → sequenceDiagram-DBY2YBRQ-BR5IokXV.js} +1 -1
- package/dist/assets/{settings-2-B9IT2HGd.js → settings-2-CoxzNABp.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-9UIfya9-.js → sizeCapture-X5ZJPWSS-SxG_YnMA.js} +1 -1
- package/dist/assets/skeleton-DW018fJv.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-CDkB5smU.js → tag-chip-CjkZEoS2.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-CavtY1vJ.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-PTXYTEwz.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 +8 -8
- package/src/app/components/layout/page-layout.tsx +15 -6
- package/src/app/components/layout/sidebar-rail.styles.ts +0 -2
- package/src/app/components/layout/sidebar.tsx +2 -2
- package/src/app/styles/charcoal-theme.css +85 -0
- package/src/app/styles/design-system.css +23 -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/chat-sidebar-list-mode-switch.tsx +2 -2
- package/src/features/chat/components/conversation/__tests__/chat-conversation-content.test.tsx +46 -4
- package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +17 -1
- 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 +24 -11
- package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +30 -31
- package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
- 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-read-state.test.tsx +1 -1
- package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +52 -0
- package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +6 -0
- package/src/features/chat/components/layout/__tests__/chat-sidebar.test.tsx +11 -17
- package/src/features/chat/components/layout/chat-page-shell.tsx +7 -15
- package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +32 -42
- package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +16 -67
- package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +1 -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 +258 -9
- package/src/features/chat/features/conversation/components/session-conversation-area.tsx +51 -34
- package/src/features/chat/features/conversation/components/session-conversation-input.tsx +50 -39
- 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 +109 -0
- package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +46 -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-attachments.ts +1 -0
- 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 +84 -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 +18 -0
- 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 -97
- 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 +23 -0
- package/src/features/chat/features/input/utils/__tests__/chat-input-bar.utils.test.ts +105 -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 +5 -0
- package/src/features/chat/features/input/utils/chat-inline-token.utils.ts +97 -32
- package/src/features/chat/features/input/utils/chat-input-bar.utils.ts +1 -1
- package/src/features/chat/features/input/utils/chat-input-toolbar.utils.ts +64 -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 +81 -172
- 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 +203 -0
- 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 +1 -0
- package/src/features/chat/features/message/utils/chat-message-timeline.utils.ts +204 -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/chat-sidebar-session-item.tsx +10 -10
- package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +2 -2
- 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/components/session-header/chat-session-header-menu-item.tsx +1 -1
- package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +1 -1
- package/src/features/chat/features/session/components/session-header/chat-session-switcher-groups.tsx +1 -1
- package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +1 -1
- 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__/chat-session-display.utils.test.ts +26 -0
- package/src/features/chat/features/session/utils/__tests__/ncp-session-adapter.utils.test.ts +23 -2
- package/src/features/chat/features/session/utils/chat-context-window-indicator.utils.ts +44 -5
- package/src/features/chat/features/session/utils/chat-session-display.utils.ts +48 -12
- package/src/features/chat/features/session/utils/ncp-session-adapter.utils.ts +23 -4
- package/src/features/chat/features/session/utils/ncp-session-context-metadata.utils.ts +42 -4
- package/src/features/chat/features/welcome/components/__tests__/chat-conversation-welcome.test.tsx +6 -0
- package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +27 -9
- package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +11 -17
- package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +37 -0
- package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome.tsx +35 -33
- 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 +73 -3
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +22 -2
- 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 +102 -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 +223 -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 +106 -0
- package/src/features/chat/managers/__tests__/chat-session-list.manager.test.ts +53 -5
- package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +93 -1
- package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +3 -10
- 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 +145 -0
- package/src/features/chat/managers/chat-session-list.manager.ts +14 -25
- package/src/features/chat/managers/chat-thread.manager.ts +32 -16
- package/src/features/chat/managers/provider-model-catalog-notice.manager.ts +121 -0
- package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +3 -9
- package/src/features/chat/pages/ncp-chat-page.tsx +0 -1
- 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 +6 -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/cron/components/cron-task-discovery.tsx +1 -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/marketplace/components/marketplace-page-parts.tsx +1 -1
- package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +31 -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/components/panel-app-list-item.tsx +1 -1
- package/src/features/panel-apps/components/panel-app-toolbar.tsx +2 -2
- package/src/features/panel-apps/components/panel-apps-list.tsx +4 -4
- 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-auth-section.tsx +90 -59
- package/src/features/settings/components/config/provider-form-detail-pane.tsx +307 -0
- package/src/features/settings/components/config/provider-form.tsx +149 -367
- 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/components/config/provider-status-badge.tsx +4 -2
- 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__/providers-config-page.test.tsx +12 -0
- package/src/features/settings/pages/__tests__/search-config-page.test.tsx +48 -0
- package/src/features/settings/pages/providers-config-page.tsx +2 -1
- 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/index.css +1 -1
- package/src/platforms/desktop/types/desktop-update.types.ts +5 -0
- package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +13 -7
- package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +18 -20
- 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 +5 -2
- 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/path-picker/server-path-picker-directory-list.tsx +1 -1
- package/src/shared/components/path-picker/server-path-picker-locations.tsx +1 -1
- package/src/shared/components/path-picker/server-path-picker-navigation-bar.tsx +3 -3
- package/src/shared/components/settings/settings-page.tsx +1 -1
- package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +1 -1
- package/src/shared/components/ui/actions/icon-action-button.tsx +1 -1
- package/src/shared/components/ui/button.tsx +4 -4
- 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/dialog.tsx +1 -1
- package/src/shared/components/ui/input.tsx +1 -1
- package/src/shared/components/ui/scroll-area.tsx +2 -0
- package/src/shared/components/ui/select.tsx +1 -1
- package/src/shared/components/ui/switch.tsx +1 -1
- 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/components/ui/tabs.tsx +1 -1
- package/src/shared/components/ui/textarea.tsx +1 -1
- 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 +7 -0
- package/src/shared/lib/api/types.ts +38 -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 +45 -17
- 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 +45 -17
- 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/provider-models/__tests__/anonymous-provider-configuration.test.ts +40 -0
- package/src/shared/lib/provider-models/index.ts +4 -3
- 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-CHo2gekJ.js +0 -13
- package/dist/assets/app-presenter-provider-2_DmWYT9.js +0 -108
- package/dist/assets/app-presenter-provider-D3BuuOyZ.css +0 -1
- package/dist/assets/appearance-settings-page-BEy2UE7R.js +0 -1
- package/dist/assets/architecture-TIHT7OUA-Cii4JyA2.js +0 -1
- package/dist/assets/book-open-BrZL4o9L.js +0 -1
- package/dist/assets/card-B5rRLu_6.js +0 -1
- package/dist/assets/channel-BSKkTPe8.js +0 -1
- package/dist/assets/channels-list-page-C1dnm68I.js +0 -8
- package/dist/assets/chat-page-Dz6tvZ91.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-6y6W6dz4.js +0 -1
- package/dist/assets/confirm-dialog-q1CpEmR8.js +0 -5
- package/dist/assets/cynefin-VYW2F7L2-fSLIS0X3.js +0 -1
- package/dist/assets/desktop-update-config-DrdlwP4j.js +0 -1
- package/dist/assets/dist-C9EX46wM.js +0 -41
- package/dist/assets/doc-browser-BfttDSti.js +0 -1
- package/dist/assets/doc-browser-DH-3hDnI.js +0 -1
- package/dist/assets/doc-browser-context-TU2heon0.js +0 -1
- package/dist/assets/eventmodeling-45OFAUF4-XVcQGgha.js +0 -1
- package/dist/assets/eye-B-3dyZNA.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-BiFSctqz.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-CXDPLDFD.css +0 -1
- package/dist/assets/index-k_eWScvN.js +0 -2
- package/dist/assets/info-DKCQHKI2-CQ2qjGhU.js +0 -1
- package/dist/assets/loader-circle-B35NlHTI.js +0 -1
- package/dist/assets/logo-badge-DB51c0cS.js +0 -1
- package/dist/assets/mcp-marketplace-page-CkPtwPBk.js +0 -1
- package/dist/assets/mcp-marketplace-page-DWtsIqml.js +0 -9
- package/dist/assets/model-config-page-D6cGNnMM.js +0 -1
- package/dist/assets/navigation-link-BSJEUiwD.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-BRVe5jSJ.js +0 -1
- package/dist/assets/popover-Bp9IpE_N.js +0 -1
- package/dist/assets/provider-models-CXUgDxGR.js +0 -1
- package/dist/assets/provider-scoped-model-input-dk7fz9NL.js +0 -1
- package/dist/assets/providers-config-page-DTP2YfxA.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-D6ShNq95.js +0 -8
- package/dist/assets/remote-FllhXW3o.js +0 -1
- package/dist/assets/rotate-cw-CTC-Qszi.js +0 -1
- package/dist/assets/runtime-config-page-C57OLdPm.js +0 -1
- package/dist/assets/search-config-page-tnJXaaSr.js +0 -1
- package/dist/assets/security-config-S00DjFfO.js +0 -1
- package/dist/assets/select-CNFBf00l.js +0 -1
- package/dist/assets/skeleton-Dc06gatK.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-BuNr8LSO.js +0 -1
- package/dist/assets/trash-2-GchaJuEM.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-C69rR15i.js +0 -1
- package/dist/assets/use-confirm-dialog-DF_EgPYx.js +0 -1
- package/dist/assets/use-viewport-layout-BACNZyMY.js +0 -1
- package/dist/assets/wardley-OPB4EBWU-LatRT_Lx.js +0 -1
- package/dist/assets/x-BXFquY9e.js +0 -1
- package/src/features/chat/features/welcome/components/chat-welcome-capability-grid.tsx +0 -59
- /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
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
@layer base {
|
|
8
|
+
input:focus,
|
|
9
|
+
textarea:focus {
|
|
10
|
+
outline: none;
|
|
11
|
+
box-shadow: none;
|
|
12
|
+
}
|
|
13
|
+
|
|
8
14
|
:root {
|
|
9
15
|
color-scheme: light;
|
|
10
16
|
|
|
@@ -56,6 +62,10 @@
|
|
|
56
62
|
--foreground-tertiary: var(--gray-500);
|
|
57
63
|
--foreground-muted: var(--gray-400);
|
|
58
64
|
|
|
65
|
+
/* Links */
|
|
66
|
+
--link-foreground: 211 73% 45%;
|
|
67
|
+
--link-foreground-hover: 211 73% 38%;
|
|
68
|
+
|
|
59
69
|
/* Primary (Brand) */
|
|
60
70
|
--primary: var(--brand-500);
|
|
61
71
|
--primary-hover: var(--brand-600);
|
|
@@ -70,6 +80,9 @@
|
|
|
70
80
|
/* Accent */
|
|
71
81
|
--accent: var(--brand-50);
|
|
72
82
|
--accent-foreground: var(--brand-700);
|
|
83
|
+
--interaction-hover: hsl(0 0% 96%);
|
|
84
|
+
--interaction-selection: hsl(211 100% 92%);
|
|
85
|
+
--interaction-selection-border: hsl(211 75% 84%);
|
|
73
86
|
|
|
74
87
|
/* Muted */
|
|
75
88
|
--muted: var(--gray-100);
|
|
@@ -364,19 +377,6 @@
|
|
|
364
377
|
color: hsl(var(--gray-800));
|
|
365
378
|
}
|
|
366
379
|
|
|
367
|
-
/* User bubble is light in work theme; keep clickable skill tokens as link-colored text. */
|
|
368
|
-
:root[data-theme="work"] .nextclaw-chat-message-user .nextclaw-chat-inline-token {
|
|
369
|
-
border-color: transparent;
|
|
370
|
-
background-color: transparent;
|
|
371
|
-
color: var(--md-link, #1f73c9);
|
|
372
|
-
box-shadow: none;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
:root[data-theme="work"] .nextclaw-chat-message-user .nextclaw-chat-inline-token > span:first-child {
|
|
376
|
-
color: currentColor;
|
|
377
|
-
opacity: 0.8;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
380
|
}
|
|
381
381
|
|
|
382
382
|
@layer base {
|
|
@@ -717,6 +717,9 @@
|
|
|
717
717
|
--secondary-foreground: var(--gray-800);
|
|
718
718
|
--accent: 151 32% 18%;
|
|
719
719
|
--accent-foreground: 148 34% 84%;
|
|
720
|
+
--interaction-hover: hsl(var(--gray-200));
|
|
721
|
+
--interaction-selection: hsl(211 48% 30%);
|
|
722
|
+
--interaction-selection-border: hsl(211 48% 42%);
|
|
720
723
|
--muted: var(--gray-100);
|
|
721
724
|
--muted-foreground: var(--gray-500);
|
|
722
725
|
--destructive: 0 70% 52%;
|
|
@@ -823,6 +826,13 @@
|
|
|
823
826
|
}
|
|
824
827
|
}
|
|
825
828
|
|
|
829
|
+
@layer base {
|
|
830
|
+
:root[data-theme-appearance="dark"] {
|
|
831
|
+
--link-foreground: 213 94% 68%;
|
|
832
|
+
--link-foreground-hover: 213 97% 79%;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
|
|
826
836
|
@layer utilities {
|
|
827
837
|
/* ========================================
|
|
828
838
|
UTILITY CLASSES
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { fireEvent, render, screen } from "@testing-library/react";
|
|
2
2
|
import userEvent from "@testing-library/user-event";
|
|
3
3
|
import { MemoryRouter } from "react-router-dom";
|
|
4
|
-
import type * as ReactRouterDom from "react-router-dom";
|
|
5
4
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
5
|
import { AgentsPage } from "@/features/agents";
|
|
7
6
|
import {
|
|
@@ -14,8 +13,7 @@ const mocks = vi.hoisted(() => ({
|
|
|
14
13
|
createAgent: vi.fn(),
|
|
15
14
|
updateAgent: vi.fn(),
|
|
16
15
|
deleteAgent: vi.fn(),
|
|
17
|
-
|
|
18
|
-
requestDraft: vi.fn(),
|
|
16
|
+
startAgentDraftChat: vi.fn(),
|
|
19
17
|
sessionTypesQuery: {
|
|
20
18
|
data: {
|
|
21
19
|
defaultType: "native",
|
|
@@ -117,22 +115,6 @@ function createPersistStorage() {
|
|
|
117
115
|
};
|
|
118
116
|
}
|
|
119
117
|
|
|
120
|
-
vi.mock("react-router-dom", async (importOriginal) => {
|
|
121
|
-
const actual = await importOriginal<typeof ReactRouterDom>();
|
|
122
|
-
return {
|
|
123
|
-
...actual,
|
|
124
|
-
useNavigate: () => mocks.navigate,
|
|
125
|
-
};
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
vi.mock("@/app/components/app-presenter-provider", () => ({
|
|
129
|
-
useAppPresenter: () => ({
|
|
130
|
-
chatDraftIntentManager: {
|
|
131
|
-
requestDraft: mocks.requestDraft,
|
|
132
|
-
},
|
|
133
|
-
}),
|
|
134
|
-
}));
|
|
135
|
-
|
|
136
118
|
vi.mock("@/shared/hooks/use-agents", () => ({
|
|
137
119
|
useAgents: () => mocks.agentsQuery,
|
|
138
120
|
useCreateAgent: () => ({
|
|
@@ -197,7 +179,12 @@ vi.mock("@/features/chat", async () => {
|
|
|
197
179
|
...sessionTypeUtils,
|
|
198
180
|
usePresenter: () => ({
|
|
199
181
|
chatSessionListManager: {
|
|
200
|
-
startAgentDraftChat: (
|
|
182
|
+
startAgentDraftChat: (
|
|
183
|
+
agentId: string,
|
|
184
|
+
sessionType: string,
|
|
185
|
+
prompt?: string,
|
|
186
|
+
) => {
|
|
187
|
+
mocks.startAgentDraftChat(agentId, sessionType, prompt);
|
|
201
188
|
sessionListStore.useChatSessionListStore.getState().setSnapshot({
|
|
202
189
|
selectedAgentId: agentId,
|
|
203
190
|
selectedSessionKey: null,
|
|
@@ -231,8 +218,7 @@ describe("AgentsPage", () => {
|
|
|
231
218
|
mocks.createAgent.mockReset();
|
|
232
219
|
mocks.updateAgent.mockReset();
|
|
233
220
|
mocks.deleteAgent.mockReset();
|
|
234
|
-
mocks.
|
|
235
|
-
mocks.requestDraft.mockReset();
|
|
221
|
+
mocks.startAgentDraftChat.mockReset();
|
|
236
222
|
if (!HTMLElement.prototype.hasPointerCapture) {
|
|
237
223
|
HTMLElement.prototype.hasPointerCapture = () => false;
|
|
238
224
|
}
|
|
@@ -263,6 +249,9 @@ describe("AgentsPage", () => {
|
|
|
263
249
|
renderAgentsPage();
|
|
264
250
|
|
|
265
251
|
expect(screen.getByText("Agent 管理台")).toBeTruthy();
|
|
252
|
+
expect(
|
|
253
|
+
screen.getByRole("heading", { level: 1, name: "Agent 管理台" }),
|
|
254
|
+
).toBeTruthy();
|
|
266
255
|
expect(screen.getByText("~/.nextclaw/workspace")).toBeTruthy();
|
|
267
256
|
expect(screen.getAllByRole("button", { name: "开始对话" })).toHaveLength(2);
|
|
268
257
|
expect(screen.getAllByRole("button", { name: "更多操作" })).toHaveLength(2);
|
|
@@ -276,8 +265,9 @@ describe("AgentsPage", () => {
|
|
|
276
265
|
|
|
277
266
|
await user.click(screen.getByRole("button", { name: "新增 Agent" }));
|
|
278
267
|
|
|
279
|
-
expect(mocks.
|
|
280
|
-
|
|
268
|
+
expect(mocks.startAgentDraftChat).toHaveBeenCalledWith(
|
|
269
|
+
"main",
|
|
270
|
+
"native",
|
|
281
271
|
expect.stringContaining("请直接创建一个默认示例 Agent,不要问我问题"),
|
|
282
272
|
);
|
|
283
273
|
expect(mocks.createAgent).not.toHaveBeenCalled();
|
|
@@ -288,6 +278,9 @@ describe("AgentsPage", () => {
|
|
|
288
278
|
await user.click(detailsEditButtons[detailsEditButtons.length - 1]);
|
|
289
279
|
|
|
290
280
|
expect(screen.getByText("编辑 Agent 身份")).toBeTruthy();
|
|
281
|
+
const editDialog = screen.getByText("编辑 Agent 身份").closest("[role='dialog']");
|
|
282
|
+
expect(editDialog?.className).toContain("bg-popover");
|
|
283
|
+
expect(editDialog?.className).not.toContain("linear-gradient");
|
|
291
284
|
expect(screen.getByText("主目录保持不变")).toBeTruthy();
|
|
292
285
|
expect(screen.getByDisplayValue("Researcher")).toBeTruthy();
|
|
293
286
|
expect(
|
|
@@ -310,6 +303,7 @@ describe("AgentsPage", () => {
|
|
|
310
303
|
expect(screen.queryByRole("button", { name: "保存编辑" })).toBeNull();
|
|
311
304
|
const detailsDialog = screen.getByText("身份").closest("[role='dialog']");
|
|
312
305
|
expect(detailsDialog?.className).toContain("sm:max-w-2xl");
|
|
306
|
+
expect(detailsDialog?.className).toContain("bg-popover");
|
|
313
307
|
const detailLists = Array.from(detailsDialog?.querySelectorAll("dl") ?? []);
|
|
314
308
|
expect(detailLists.length).toBeGreaterThan(0);
|
|
315
309
|
expect(
|
|
@@ -444,6 +438,24 @@ describe("AgentsPage", () => {
|
|
|
444
438
|
});
|
|
445
439
|
});
|
|
446
440
|
|
|
441
|
+
it("does not silently clamp an undersized context window before saving", async () => {
|
|
442
|
+
const user = userEvent.setup();
|
|
443
|
+
renderAgentsPage();
|
|
444
|
+
|
|
445
|
+
await user.click(screen.getAllByRole("button", { name: "更多操作" })[1]);
|
|
446
|
+
await user.click(screen.getByRole("button", { name: "编辑" }));
|
|
447
|
+
await user.click(screen.getByText("高级配置"));
|
|
448
|
+
fireEvent.change(screen.getByLabelText("上下文窗口大小"), {
|
|
449
|
+
target: { value: "100" },
|
|
450
|
+
});
|
|
451
|
+
await user.click(screen.getByRole("button", { name: "保存编辑" }));
|
|
452
|
+
|
|
453
|
+
expect(mocks.updateAgent).toHaveBeenCalledWith({
|
|
454
|
+
agentId: "researcher",
|
|
455
|
+
data: expect.objectContaining({ contextTokens: 100 }),
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
|
|
447
459
|
it("starts a draft chat with the agent selected through the session list owner", async () => {
|
|
448
460
|
const user = userEvent.setup();
|
|
449
461
|
|
|
@@ -15,16 +15,16 @@ export function AgentAdvancedConfigFields({
|
|
|
15
15
|
onChange,
|
|
16
16
|
}: AgentAdvancedConfigFieldsProps) {
|
|
17
17
|
return (
|
|
18
|
-
<details className="group rounded-2xl border border-
|
|
19
|
-
<summary className="flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold text-
|
|
18
|
+
<details className="group rounded-2xl border border-border bg-card">
|
|
19
|
+
<summary className="flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold text-foreground [&::-webkit-details-marker]:hidden">
|
|
20
20
|
<span className="flex min-w-0 items-center gap-2">
|
|
21
|
-
<Settings2 className="h-4 w-4 shrink-0 text-
|
|
21
|
+
<Settings2 className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
22
22
|
<span className="truncate">{t("agentsAdvancedConfigToggle")}</span>
|
|
23
23
|
</span>
|
|
24
|
-
<ChevronDown className="h-4 w-4 shrink-0 text-
|
|
24
|
+
<ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180" />
|
|
25
25
|
</summary>
|
|
26
|
-
<div className="space-y-4 border-t border-
|
|
27
|
-
<p className="text-xs leading-5 text-
|
|
26
|
+
<div className="space-y-4 border-t border-border/60 px-4 py-4">
|
|
27
|
+
<p className="text-xs leading-5 text-muted-foreground">
|
|
28
28
|
{t("agentsAdvancedConfigDescription")}
|
|
29
29
|
</p>
|
|
30
30
|
<div className="grid gap-4 md:grid-cols-2">
|
|
@@ -53,7 +53,7 @@ function AgentNumberField(props: {
|
|
|
53
53
|
const { label, value, min, step, disabled, onChange } = props;
|
|
54
54
|
|
|
55
55
|
return (
|
|
56
|
-
<label className="space-y-2 text-sm font-medium text-
|
|
56
|
+
<label className="space-y-2 text-sm font-medium text-foreground">
|
|
57
57
|
<span>{label}</span>
|
|
58
58
|
<Input
|
|
59
59
|
type="number"
|
|
@@ -74,7 +74,7 @@ export function AgentDetailsDialog({
|
|
|
74
74
|
|
|
75
75
|
return (
|
|
76
76
|
<Dialog open={agent !== null} onOpenChange={onOpenChange}>
|
|
77
|
-
<DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-
|
|
77
|
+
<DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[720px] sm:max-w-2xl">
|
|
78
78
|
<div className="shrink-0 px-5 pb-3 pt-5">
|
|
79
79
|
<DialogHeader className="text-left">
|
|
80
80
|
<div className="flex min-w-0 items-center gap-3">
|
|
@@ -321,9 +321,9 @@ function DetailSection(props: {
|
|
|
321
321
|
const { icon: Icon, title, children } = props;
|
|
322
322
|
|
|
323
323
|
return (
|
|
324
|
-
<section className="space-y-2 border-t border-
|
|
325
|
-
<h3 className="flex items-center gap-1.5 text-xs font-semibold leading-5 text-
|
|
326
|
-
<Icon className="h-3.5 w-3.5 text-
|
|
324
|
+
<section className="space-y-2 border-t border-border/60 pt-3 first:border-t-0 first:pt-0">
|
|
325
|
+
<h3 className="flex items-center gap-1.5 text-xs font-semibold leading-5 text-foreground">
|
|
326
|
+
<Icon className="h-3.5 w-3.5 text-muted-foreground" />
|
|
327
327
|
{title}
|
|
328
328
|
</h3>
|
|
329
329
|
<dl className="grid min-w-0 gap-x-6 gap-y-2.5 pl-5 sm:grid-cols-2">
|
|
@@ -361,15 +361,15 @@ function DetailItem(props: {
|
|
|
361
361
|
)}
|
|
362
362
|
>
|
|
363
363
|
<dt className="flex min-w-0 items-baseline leading-5">
|
|
364
|
-
<span className="whitespace-nowrap text-xs font-medium text-
|
|
364
|
+
<span className="whitespace-nowrap text-xs font-medium text-muted-foreground">
|
|
365
365
|
{label}
|
|
366
366
|
</span>
|
|
367
367
|
</dt>
|
|
368
368
|
<dd
|
|
369
369
|
className={cn(
|
|
370
|
-
"min-w-0 break-words text-xs leading-5 text-
|
|
370
|
+
"min-w-0 break-words text-xs leading-5 text-foreground",
|
|
371
371
|
isStructuredValue
|
|
372
|
-
? "max-h-28 overflow-auto whitespace-pre-wrap rounded bg-
|
|
372
|
+
? "max-h-28 overflow-auto whitespace-pre-wrap rounded bg-muted/50 px-2 py-1.5 text-left"
|
|
373
373
|
: "",
|
|
374
374
|
)}
|
|
375
375
|
>
|
|
@@ -387,7 +387,7 @@ function SourceBadge({ source }: { source: DetailSource }) {
|
|
|
387
387
|
<span
|
|
388
388
|
className={cn(
|
|
389
389
|
"ml-1 whitespace-nowrap text-xs font-normal leading-5",
|
|
390
|
-
source === "override" ? "text-blue-500" : "text-
|
|
390
|
+
source === "override" ? "text-blue-500" : "text-muted-foreground",
|
|
391
391
|
)}
|
|
392
392
|
>
|
|
393
393
|
({source === "override"
|
|
@@ -138,7 +138,7 @@ function AgentRuntimeSelectField({
|
|
|
138
138
|
</SelectContent>
|
|
139
139
|
</Select>
|
|
140
140
|
{helperText ? (
|
|
141
|
-
<p className="text-xs text-
|
|
141
|
+
<p className="text-xs text-muted-foreground">{helperText}</p>
|
|
142
142
|
) : null}
|
|
143
143
|
</div>
|
|
144
144
|
);
|
|
@@ -238,8 +238,8 @@ function AgentCreateDialogContent(props: {
|
|
|
238
238
|
);
|
|
239
239
|
|
|
240
240
|
return (
|
|
241
|
-
<DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-
|
|
242
|
-
<div className="shrink-0 border-b border-
|
|
241
|
+
<DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[760px] sm:max-w-xl">
|
|
242
|
+
<div className="shrink-0 border-b border-border px-6 py-6">
|
|
243
243
|
<DialogHeader className="text-left">
|
|
244
244
|
<DialogTitle>{t("agentsCreateDialogTitle")}</DialogTitle>
|
|
245
245
|
<DialogDescription>
|
|
@@ -319,7 +319,7 @@ function AgentCreateDialogContent(props: {
|
|
|
319
319
|
/>
|
|
320
320
|
</div>
|
|
321
321
|
</div>
|
|
322
|
-
<DialogFooter className="shrink-0 border-t border-
|
|
322
|
+
<DialogFooter className="shrink-0 border-t border-border px-6 py-5">
|
|
323
323
|
<Button
|
|
324
324
|
type="button"
|
|
325
325
|
variant="ghost"
|
|
@@ -366,8 +366,8 @@ function AgentEditDialogContent(props: {
|
|
|
366
366
|
);
|
|
367
367
|
|
|
368
368
|
return (
|
|
369
|
-
<DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-
|
|
370
|
-
<div className="shrink-0 border-b border-
|
|
369
|
+
<DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[760px] sm:max-w-xl">
|
|
370
|
+
<div className="shrink-0 border-b border-border px-6 py-6">
|
|
371
371
|
<DialogHeader className="text-left">
|
|
372
372
|
<DialogTitle>{t("agentsEditDialogTitle")}</DialogTitle>
|
|
373
373
|
<DialogDescription>
|
|
@@ -447,7 +447,7 @@ function AgentEditDialogContent(props: {
|
|
|
447
447
|
/>
|
|
448
448
|
</div>
|
|
449
449
|
</div>
|
|
450
|
-
<DialogFooter className="shrink-0 border-t border-
|
|
450
|
+
<DialogFooter className="shrink-0 border-t border-border px-6 py-5">
|
|
451
451
|
<Button
|
|
452
452
|
type="button"
|
|
453
453
|
variant="ghost"
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { useMemo, useState } from "react";
|
|
2
|
-
import { useNavigate } from "react-router-dom";
|
|
3
2
|
import {
|
|
4
3
|
useDeleteAgent,
|
|
5
4
|
useAgents,
|
|
@@ -20,7 +19,6 @@ import {
|
|
|
20
19
|
usePresenter,
|
|
21
20
|
useNcpChatSessionTypes,
|
|
22
21
|
} from "@/features/chat";
|
|
23
|
-
import { useAppPresenter } from "@/app/components/app-presenter-provider";
|
|
24
22
|
import { AgentAvatar } from "@/shared/components/common/agent-avatar";
|
|
25
23
|
import { Button } from "@/shared/components/ui/button";
|
|
26
24
|
import { Card, CardContent } from "@/shared/components/ui/card";
|
|
@@ -30,7 +28,7 @@ import {
|
|
|
30
28
|
PopoverTrigger,
|
|
31
29
|
} from "@/shared/components/ui/popover";
|
|
32
30
|
import { TagChip } from "@/shared/components/tags/tag-chip";
|
|
33
|
-
import { PageLayout } from "@/app/components/layout/page-layout";
|
|
31
|
+
import { PageHeader, PageLayout } from "@/app/components/layout/page-layout";
|
|
34
32
|
import { t } from "@/shared/lib/i18n";
|
|
35
33
|
import { buildProviderModelCatalog } from "@/shared/lib/provider-models";
|
|
36
34
|
import { cn } from "@/shared/lib/utils";
|
|
@@ -51,7 +49,7 @@ import { toast } from "sonner";
|
|
|
51
49
|
const AGENT_CREATION_PROMPT =
|
|
52
50
|
"请直接创建一个默认示例 Agent,不要问我问题。创建完成后,简单告诉我它能做什么。";
|
|
53
51
|
|
|
54
|
-
function parseOptionalIntegerField(value: string
|
|
52
|
+
function parseOptionalIntegerField(value: string): number | null {
|
|
55
53
|
const trimmed = value.trim();
|
|
56
54
|
if (!trimmed) {
|
|
57
55
|
return null;
|
|
@@ -60,7 +58,7 @@ function parseOptionalIntegerField(value: string, min: number): number | null {
|
|
|
60
58
|
if (!Number.isFinite(parsed)) {
|
|
61
59
|
throw new Error(t("agentsAdvancedInvalidNumberError"));
|
|
62
60
|
}
|
|
63
|
-
return Math.
|
|
61
|
+
return Math.trunc(parsed);
|
|
64
62
|
}
|
|
65
63
|
|
|
66
64
|
function buildAgentUpdateRequest(
|
|
@@ -74,41 +72,10 @@ function buildAgentUpdateRequest(
|
|
|
74
72
|
...(form.runtime.trim()
|
|
75
73
|
? { runtime: form.runtime.trim() }
|
|
76
74
|
: { runtime: "" }),
|
|
77
|
-
contextTokens: parseOptionalIntegerField(form.contextTokens
|
|
75
|
+
contextTokens: parseOptionalIntegerField(form.contextTokens),
|
|
78
76
|
};
|
|
79
77
|
}
|
|
80
78
|
|
|
81
|
-
function AgentsHero(props: { agentCount: number; onCreate: () => void }) {
|
|
82
|
-
const { agentCount, onCreate } = props;
|
|
83
|
-
|
|
84
|
-
return (
|
|
85
|
-
<section className="flex flex-col gap-3 border-b border-gray-200 pb-4 sm:flex-row sm:items-end sm:justify-between">
|
|
86
|
-
<div className="min-w-0 space-y-1">
|
|
87
|
-
<div className="flex flex-wrap items-center gap-2">
|
|
88
|
-
<h1 className="text-xl font-semibold text-gray-950">
|
|
89
|
-
{t("agentsHeroEyebrow")}
|
|
90
|
-
</h1>
|
|
91
|
-
<span className="rounded-full border border-gray-200 bg-white px-2 py-0.5 text-xs font-medium text-gray-500">
|
|
92
|
-
{agentCount}
|
|
93
|
-
</span>
|
|
94
|
-
</div>
|
|
95
|
-
<p className="max-w-2xl text-sm leading-6 text-gray-500">
|
|
96
|
-
{t("agentsHeroDescription")}
|
|
97
|
-
</p>
|
|
98
|
-
</div>
|
|
99
|
-
<Button
|
|
100
|
-
type="button"
|
|
101
|
-
variant="primary"
|
|
102
|
-
className="h-9 shrink-0 rounded-xl px-4 text-sm font-semibold"
|
|
103
|
-
onClick={onCreate}
|
|
104
|
-
>
|
|
105
|
-
<Plus className="mr-2 h-4 w-4" />
|
|
106
|
-
{t("agentsCreateButton")}
|
|
107
|
-
</Button>
|
|
108
|
-
</section>
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
79
|
function AgentActionMenuItem(props: {
|
|
113
80
|
icon: typeof Pencil;
|
|
114
81
|
label: string;
|
|
@@ -131,7 +98,7 @@ function AgentActionMenuItem(props: {
|
|
|
131
98
|
"flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50",
|
|
132
99
|
destructive
|
|
133
100
|
? "text-destructive hover:bg-destructive/10"
|
|
134
|
-
: "text-
|
|
101
|
+
: "text-foreground hover:bg-muted",
|
|
135
102
|
)}
|
|
136
103
|
onClick={onClick}
|
|
137
104
|
disabled={disabled}
|
|
@@ -172,7 +139,7 @@ function AgentListCard(props: {
|
|
|
172
139
|
: defaultRuntimeLabel;
|
|
173
140
|
|
|
174
141
|
return (
|
|
175
|
-
<Card className="group overflow-hidden border border-
|
|
142
|
+
<Card className="group overflow-hidden border border-border bg-card shadow-none transition-colors duration-200 hover:border-border/80">
|
|
176
143
|
<CardContent className="relative flex h-full flex-col gap-3 px-3.5 py-3.5">
|
|
177
144
|
<div className="flex items-start gap-2.5 pr-16">
|
|
178
145
|
<AgentAvatar
|
|
@@ -183,7 +150,7 @@ function AgentListCard(props: {
|
|
|
183
150
|
/>
|
|
184
151
|
<div className="min-w-0 flex-1 space-y-0.5">
|
|
185
152
|
<div className="flex min-w-0 items-center gap-2">
|
|
186
|
-
<div className="truncate text-sm font-semibold text-
|
|
153
|
+
<div className="truncate text-sm font-semibold text-foreground">
|
|
187
154
|
{agent.displayName?.trim() || agent.id}
|
|
188
155
|
</div>
|
|
189
156
|
{agent.builtIn ? (
|
|
@@ -196,7 +163,7 @@ function AgentListCard(props: {
|
|
|
196
163
|
</TagChip>
|
|
197
164
|
) : null}
|
|
198
165
|
</div>
|
|
199
|
-
<div className="truncate text-xs text-
|
|
166
|
+
<div className="truncate text-xs text-muted-foreground">@{agent.id}</div>
|
|
200
167
|
</div>
|
|
201
168
|
</div>
|
|
202
169
|
|
|
@@ -205,7 +172,7 @@ function AgentListCard(props: {
|
|
|
205
172
|
type="button"
|
|
206
173
|
variant="ghost"
|
|
207
174
|
size="icon"
|
|
208
|
-
className="h-8 w-8 rounded-lg text-
|
|
175
|
+
className="h-8 w-8 rounded-lg text-muted-foreground hover:text-foreground"
|
|
209
176
|
aria-label={t("agentsCardStartChat")}
|
|
210
177
|
title={t("agentsCardStartChat")}
|
|
211
178
|
onClick={onStartChat}
|
|
@@ -218,7 +185,7 @@ function AgentListCard(props: {
|
|
|
218
185
|
type="button"
|
|
219
186
|
variant="ghost"
|
|
220
187
|
size="icon"
|
|
221
|
-
className="h-8 w-8 rounded-lg text-
|
|
188
|
+
className="h-8 w-8 rounded-lg text-muted-foreground hover:text-foreground"
|
|
222
189
|
aria-label={t("chatSessionMoreActions")}
|
|
223
190
|
title={t("chatSessionMoreActions")}
|
|
224
191
|
>
|
|
@@ -250,20 +217,20 @@ function AgentListCard(props: {
|
|
|
250
217
|
</Popover>
|
|
251
218
|
</div>
|
|
252
219
|
|
|
253
|
-
<p className="line-clamp-2 min-h-10 text-sm leading-5 text-
|
|
220
|
+
<p className="line-clamp-2 min-h-10 text-sm leading-5 text-muted-foreground">
|
|
254
221
|
{agent.description?.trim() ||
|
|
255
222
|
(agent.builtIn
|
|
256
223
|
? t("agentsCardBuiltInSummary")
|
|
257
224
|
: t("agentsCardCustomSummary"))}
|
|
258
225
|
</p>
|
|
259
226
|
|
|
260
|
-
<div className="mt-auto grid gap-2 border-t border-
|
|
227
|
+
<div className="mt-auto grid gap-2 border-t border-border/60 pt-2 text-xs text-muted-foreground">
|
|
261
228
|
<div className="flex min-w-0 items-center gap-2">
|
|
262
|
-
<Sparkles className="h-3.5 w-3.5 shrink-0 text-
|
|
229
|
+
<Sparkles className="h-3.5 w-3.5 shrink-0 text-muted-foreground/60" />
|
|
263
230
|
<span className="truncate">{runtimeLabel}</span>
|
|
264
231
|
</div>
|
|
265
232
|
<div className="flex min-w-0 items-center gap-2">
|
|
266
|
-
<House className="h-3.5 w-3.5 shrink-0 text-
|
|
233
|
+
<House className="h-3.5 w-3.5 shrink-0 text-muted-foreground/60" />
|
|
267
234
|
<span className="truncate">{agent.workspace ?? "-"}</span>
|
|
268
235
|
</div>
|
|
269
236
|
</div>
|
|
@@ -274,8 +241,6 @@ function AgentListCard(props: {
|
|
|
274
241
|
|
|
275
242
|
export function AgentsPage() {
|
|
276
243
|
const presenter = usePresenter();
|
|
277
|
-
const appPresenter = useAppPresenter();
|
|
278
|
-
const navigate = useNavigate();
|
|
279
244
|
const agentsQuery = useAgents();
|
|
280
245
|
const configQuery = useConfig();
|
|
281
246
|
const providersQuery = useProviders();
|
|
@@ -362,34 +327,49 @@ export function AgentsPage() {
|
|
|
362
327
|
);
|
|
363
328
|
};
|
|
364
329
|
const requestAgentCreationDraft = () => {
|
|
365
|
-
|
|
366
|
-
|
|
330
|
+
presenter.chatSessionListManager.startAgentDraftChat(
|
|
331
|
+
"main",
|
|
332
|
+
defaultRuntime,
|
|
333
|
+
AGENT_CREATION_PROMPT,
|
|
334
|
+
);
|
|
367
335
|
};
|
|
368
336
|
|
|
369
337
|
return (
|
|
370
|
-
<PageLayout className="space-y-
|
|
371
|
-
<
|
|
372
|
-
|
|
373
|
-
|
|
338
|
+
<PageLayout className="space-y-6">
|
|
339
|
+
<PageHeader
|
|
340
|
+
headingLevel={1}
|
|
341
|
+
title={t("agentsHeroEyebrow")}
|
|
342
|
+
description={t("agentsHeroDescription")}
|
|
343
|
+
actions={(
|
|
344
|
+
<Button
|
|
345
|
+
type="button"
|
|
346
|
+
variant="primary"
|
|
347
|
+
className="h-9 shrink-0 rounded-xl px-4 text-sm font-semibold"
|
|
348
|
+
onClick={requestAgentCreationDraft}
|
|
349
|
+
>
|
|
350
|
+
<Plus className="mr-2 h-4 w-4" />
|
|
351
|
+
{t("agentsCreateButton")}
|
|
352
|
+
</Button>
|
|
353
|
+
)}
|
|
374
354
|
/>
|
|
375
355
|
|
|
376
356
|
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
|
|
377
357
|
{agentsQuery.isLoading ? (
|
|
378
|
-
<Card className="md:col-span-2 xl:col-span-3 border-dashed border-
|
|
379
|
-
<CardContent className="py-14 text-center text-sm text-
|
|
358
|
+
<Card className="md:col-span-2 xl:col-span-3 border-dashed border-border bg-card/70">
|
|
359
|
+
<CardContent className="py-14 text-center text-sm text-muted-foreground">
|
|
380
360
|
{t("agentsLoading")}
|
|
381
361
|
</CardContent>
|
|
382
362
|
</Card>
|
|
383
363
|
) : sortedAgents.length === 0 ? (
|
|
384
|
-
<Card className="md:col-span-2 xl:col-span-3 overflow-hidden border-dashed border-
|
|
364
|
+
<Card className="md:col-span-2 xl:col-span-3 overflow-hidden border-dashed border-border bg-gradient-subtle">
|
|
385
365
|
<CardContent className="flex min-h-[240px] flex-col items-center justify-center px-6 py-14 text-center">
|
|
386
|
-
<div className="mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-
|
|
387
|
-
<Bot className="h-8 w-8 text-
|
|
366
|
+
<div className="mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-card/80 shadow-[0_18px_44px_rgba(0,0,0,0.08)]">
|
|
367
|
+
<Bot className="h-8 w-8 text-warning" />
|
|
388
368
|
</div>
|
|
389
|
-
<div className="text-lg font-semibold text-
|
|
369
|
+
<div className="text-lg font-semibold text-foreground">
|
|
390
370
|
{t("agentsEmpty")}
|
|
391
371
|
</div>
|
|
392
|
-
<p className="mt-2 max-w-md text-sm leading-6 text-
|
|
372
|
+
<p className="mt-2 max-w-md text-sm leading-6 text-muted-foreground">
|
|
393
373
|
{t("agentsEmptyDescription")}
|
|
394
374
|
</p>
|
|
395
375
|
<Button
|
|
@@ -10,7 +10,7 @@ export function ChatSidebarListModeSwitch({ isProjectFirstView, onSelectMode }:
|
|
|
10
10
|
type="button"
|
|
11
11
|
aria-pressed={!isProjectFirstView}
|
|
12
12
|
onClick={() => onSelectMode('time-first')}
|
|
13
|
-
className={cn('transition-colors', isProjectFirstView ? 'text-muted-foreground/65 hover:text-muted-foreground' : 'font-medium text-foreground')}
|
|
13
|
+
className={cn('rounded-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border', isProjectFirstView ? 'text-muted-foreground/65 hover:text-muted-foreground' : 'font-medium text-foreground')}
|
|
14
14
|
>
|
|
15
15
|
{t('chatSidebarViewTime')}
|
|
16
16
|
</button>
|
|
@@ -19,7 +19,7 @@ export function ChatSidebarListModeSwitch({ isProjectFirstView, onSelectMode }:
|
|
|
19
19
|
type="button"
|
|
20
20
|
aria-pressed={isProjectFirstView}
|
|
21
21
|
onClick={() => onSelectMode('project-first')}
|
|
22
|
-
className={cn('transition-colors', isProjectFirstView ? 'font-medium text-foreground' : 'text-muted-foreground/65 hover:text-muted-foreground')}
|
|
22
|
+
className={cn('rounded-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border', isProjectFirstView ? 'font-medium text-foreground' : 'text-muted-foreground/65 hover:text-muted-foreground')}
|
|
23
23
|
>
|
|
24
24
|
{t('chatSidebarViewProject')}
|
|
25
25
|
</button>
|