@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
|
@@ -37,11 +37,17 @@ describe("ChatSidebarToolbar", () => {
|
|
|
37
37
|
render(<ChatSidebarDesktopToolbar {...toolbarProps} />);
|
|
38
38
|
|
|
39
39
|
expect(searchIconClassName()).toContain("pointer-events-none");
|
|
40
|
+
expect(
|
|
41
|
+
screen.getByPlaceholderText("Search conversations...").className,
|
|
42
|
+
).toContain("border-0");
|
|
40
43
|
});
|
|
41
44
|
|
|
42
45
|
it("keeps mobile search icon transparent to pointer input", () => {
|
|
43
46
|
render(<ChatSidebarMobileToolbar {...toolbarProps} />);
|
|
44
47
|
|
|
45
48
|
expect(searchIconClassName()).toContain("pointer-events-none");
|
|
49
|
+
expect(
|
|
50
|
+
screen.getByPlaceholderText("Search conversations...").className,
|
|
51
|
+
).toContain("border-0");
|
|
46
52
|
});
|
|
47
53
|
});
|
|
@@ -81,6 +81,9 @@ function expectCodexSelectedInSessionTypeMenu() {
|
|
|
81
81
|
screen.getByRole("button", { name: /Codex/i }).getAttribute("aria-pressed"),
|
|
82
82
|
).toBe("true");
|
|
83
83
|
}
|
|
84
|
+
function expectSessionCreated(sessionType: string, projectRoot?: string) {
|
|
85
|
+
expect(mocks.createSession).toHaveBeenCalledWith({ projectRoot, sessionType });
|
|
86
|
+
}
|
|
84
87
|
|
|
85
88
|
vi.mock("@/features/chat/components/providers/chat-presenter.provider", () => ({
|
|
86
89
|
usePresenter: () => ({
|
|
@@ -249,7 +252,7 @@ describe("ChatSidebar create and list basics", () => {
|
|
|
249
252
|
|
|
250
253
|
fireEvent.click(screen.getByRole("button", { name: "New Task" }));
|
|
251
254
|
|
|
252
|
-
|
|
255
|
+
expectSessionCreated("codex");
|
|
253
256
|
});
|
|
254
257
|
|
|
255
258
|
it("hydrates the desktop new-session type from stored preferences", async () => {
|
|
@@ -265,7 +268,7 @@ describe("ChatSidebar create and list basics", () => {
|
|
|
265
268
|
|
|
266
269
|
fireEvent.click(screen.getByRole("button", { name: "New Task" }));
|
|
267
270
|
|
|
268
|
-
|
|
271
|
+
expectSessionCreated("codex");
|
|
269
272
|
});
|
|
270
273
|
|
|
271
274
|
it("does not animate the desktop create task button width during runtime option hydration", () => {
|
|
@@ -311,7 +314,7 @@ describe("ChatSidebar create and list basics", () => {
|
|
|
311
314
|
it("renders the lightweight list mode switch in the session header row and toggles to project view", () => {
|
|
312
315
|
renderSidebar();
|
|
313
316
|
|
|
314
|
-
expect(screen.
|
|
317
|
+
expect(screen.queryByText("Sessions")).toBeNull();
|
|
315
318
|
fireEvent.click(screen.getByRole("button", { name: "Project" }));
|
|
316
319
|
|
|
317
320
|
expect(mocks.setListMode).toHaveBeenCalledWith("project-first");
|
|
@@ -332,7 +335,7 @@ describe("ChatSidebar create and list basics", () => {
|
|
|
332
335
|
fireEvent.click(screen.getByText("Codex"));
|
|
333
336
|
|
|
334
337
|
expect(mocks.setQuery).toHaveBeenCalledWith("release notes");
|
|
335
|
-
|
|
338
|
+
expectSessionCreated("codex");
|
|
336
339
|
expect(mocks.goToChatRoot).not.toHaveBeenCalled();
|
|
337
340
|
});
|
|
338
341
|
|
|
@@ -377,7 +380,7 @@ describe("ChatSidebar create and list basics", () => {
|
|
|
377
380
|
|
|
378
381
|
fireEvent.click(screen.getByRole("button", { name: "New Task" }));
|
|
379
382
|
|
|
380
|
-
|
|
383
|
+
expectSessionCreated("native");
|
|
381
384
|
expect(mocks.goToChatRoot).not.toHaveBeenCalled();
|
|
382
385
|
});
|
|
383
386
|
|
|
@@ -582,10 +585,7 @@ describe("ChatSidebar project-first mode", () => {
|
|
|
582
585
|
);
|
|
583
586
|
fireEvent.click(screen.getByText("Codex"));
|
|
584
587
|
|
|
585
|
-
|
|
586
|
-
"codex",
|
|
587
|
-
"/tmp/project-beta",
|
|
588
|
-
);
|
|
588
|
+
expectSessionCreated("codex", "/tmp/project-beta");
|
|
589
589
|
expect(mocks.goToSession).not.toHaveBeenCalled();
|
|
590
590
|
});
|
|
591
591
|
|
|
@@ -617,10 +617,7 @@ describe("ChatSidebar project-first mode", () => {
|
|
|
617
617
|
screen.getByRole("button", { name: "New Task · project-gamma" }),
|
|
618
618
|
);
|
|
619
619
|
|
|
620
|
-
|
|
621
|
-
"native",
|
|
622
|
-
"/tmp/project-gamma",
|
|
623
|
-
);
|
|
620
|
+
expectSessionCreated("native", "/tmp/project-gamma");
|
|
624
621
|
expect(mocks.goToSession).not.toHaveBeenCalled();
|
|
625
622
|
});
|
|
626
623
|
|
|
@@ -652,10 +649,7 @@ describe("ChatSidebar project-first mode", () => {
|
|
|
652
649
|
);
|
|
653
650
|
fireEvent.click(screen.getByText("Codex"));
|
|
654
651
|
|
|
655
|
-
|
|
656
|
-
"codex",
|
|
657
|
-
"/tmp/project-mobile",
|
|
658
|
-
);
|
|
652
|
+
expectSessionCreated("codex", "/tmp/project-mobile");
|
|
659
653
|
expect(mocks.goToChatRoot).not.toHaveBeenCalled();
|
|
660
654
|
});
|
|
661
655
|
});
|
|
@@ -11,30 +11,22 @@ export type MainPanelView = "chat" | "cron" | "skills" | "agents" | "inbox";
|
|
|
11
11
|
export type ChatPageProps = {
|
|
12
12
|
view: MainPanelView;
|
|
13
13
|
};
|
|
14
|
+
const MANAGEMENT_PAGE_CANVAS_WIDTH_CLASS = "max-w-[min(1180px,100%)]";
|
|
14
15
|
type UseChatSessionSyncParams = {
|
|
15
|
-
view: MainPanelView;
|
|
16
16
|
routeSessionKey: string | null;
|
|
17
|
-
syncRouteSessionSelection: (
|
|
18
|
-
isChatView: boolean;
|
|
19
|
-
routeSessionKey: string | null;
|
|
20
|
-
}) => void;
|
|
17
|
+
syncRouteSessionSelection: (routeSessionKey: string | null) => void;
|
|
21
18
|
};
|
|
22
19
|
export function useChatSessionSync(params: UseChatSessionSyncParams): void {
|
|
23
20
|
const {
|
|
24
|
-
view,
|
|
25
21
|
routeSessionKey,
|
|
26
22
|
syncRouteSessionSelection,
|
|
27
23
|
} = params;
|
|
28
24
|
|
|
29
25
|
useLayoutEffect(() => {
|
|
30
|
-
syncRouteSessionSelection(
|
|
31
|
-
isChatView: view === "chat",
|
|
32
|
-
routeSessionKey,
|
|
33
|
-
});
|
|
26
|
+
syncRouteSessionSelection(routeSessionKey);
|
|
34
27
|
}, [
|
|
35
28
|
routeSessionKey,
|
|
36
29
|
syncRouteSessionSelection,
|
|
37
|
-
view,
|
|
38
30
|
]);
|
|
39
31
|
}
|
|
40
32
|
type ChatPageLayoutProps = {
|
|
@@ -53,24 +45,24 @@ export function ChatPageLayout({ view, confirmDialog }: ChatPageLayoutProps) {
|
|
|
53
45
|
) : (
|
|
54
46
|
<section className="flex-1 min-h-0 overflow-hidden bg-background">
|
|
55
47
|
{view === "inbox" ? (
|
|
56
|
-
<div className=
|
|
48
|
+
<div className={`mx-auto flex h-full min-h-0 w-full flex-col py-4 sm:px-6 sm:py-5 ${MANAGEMENT_PAGE_CANVAS_WIDTH_CLASS}`}>
|
|
57
49
|
<InboxPage />
|
|
58
50
|
</div>
|
|
59
51
|
) : view === "cron" ? (
|
|
60
52
|
<div className="h-full overflow-auto custom-scrollbar">
|
|
61
|
-
<div className=
|
|
53
|
+
<div className={`mx-auto w-full px-4 py-4 sm:px-6 sm:py-5 ${MANAGEMENT_PAGE_CANVAS_WIDTH_CLASS}`}>
|
|
62
54
|
<CronConfig />
|
|
63
55
|
</div>
|
|
64
56
|
</div>
|
|
65
57
|
) : view === "agents" ? (
|
|
66
58
|
<div className="h-full overflow-auto custom-scrollbar">
|
|
67
|
-
<div className=
|
|
59
|
+
<div className={`mx-auto w-full px-4 py-4 sm:px-6 sm:py-5 ${MANAGEMENT_PAGE_CANVAS_WIDTH_CLASS}`}>
|
|
68
60
|
<AgentsPage />
|
|
69
61
|
</div>
|
|
70
62
|
</div>
|
|
71
63
|
) : (
|
|
72
64
|
<div className="h-full overflow-hidden">
|
|
73
|
-
<div className=
|
|
65
|
+
<div className={`mx-auto flex h-full min-h-0 w-full flex-col px-4 py-4 sm:px-6 sm:py-5 ${MANAGEMENT_PAGE_CANVAS_WIDTH_CLASS}`}>
|
|
74
66
|
<MarketplacePage forcedType="skills" />
|
|
75
67
|
</div>
|
|
76
68
|
</div>
|
|
@@ -12,6 +12,7 @@ import { t, type I18nLanguage } from "@/shared/lib/i18n";
|
|
|
12
12
|
import type { UiTheme } from "@/shared/lib/theme";
|
|
13
13
|
import { SidebarNavLinkItem } from "@/app/components/layout/sidebar-items";
|
|
14
14
|
import { IconActionButton } from "@/shared/components/ui/actions/icon-action-button";
|
|
15
|
+
import { SCROLL_BOTTOM_EDGE_FADE_CLASS } from "@/shared/components/ui/scroll-area";
|
|
15
16
|
import {
|
|
16
17
|
AlarmClock,
|
|
17
18
|
Bot,
|
|
@@ -19,7 +20,7 @@ import {
|
|
|
19
20
|
Inbox,
|
|
20
21
|
PanelLeftClose,
|
|
21
22
|
PanelLeftOpen,
|
|
22
|
-
|
|
23
|
+
FolderPlus,
|
|
23
24
|
} from "lucide-react";
|
|
24
25
|
import { useInboxUnreadCount } from "@/features/inbox";
|
|
25
26
|
import { ChatSidebarSessionList } from "@/features/chat/features/session/components/chat-sidebar-session-list";
|
|
@@ -32,7 +33,6 @@ import {
|
|
|
32
33
|
SIDEBAR_RAIL_PADDING_X_CLASS,
|
|
33
34
|
SIDEBAR_RAIL_STACK_CLASS,
|
|
34
35
|
SIDEBAR_RAIL_SURFACE_CLASS,
|
|
35
|
-
SIDEBAR_SCROLL_EDGE_FADE_CLASS,
|
|
36
36
|
} from "@/app/components/layout/sidebar-rail.styles";
|
|
37
37
|
|
|
38
38
|
const navItems = [
|
|
@@ -86,7 +86,7 @@ export function ChatSidebarDesktopHeader({
|
|
|
86
86
|
? "justify-center px-2 py-1.5"
|
|
87
87
|
: isWindowsHost
|
|
88
88
|
? "justify-end px-3 py-1.5"
|
|
89
|
-
: "gap-2 px-
|
|
89
|
+
: "gap-2 px-4 py-2",
|
|
90
90
|
isCollapsed && shouldReserveMacWindowControls ? "pt-8" : null,
|
|
91
91
|
)}
|
|
92
92
|
>
|
|
@@ -108,36 +108,29 @@ export function ChatSidebarDesktopNav({
|
|
|
108
108
|
}) {
|
|
109
109
|
const unreadCount = useInboxUnreadCount();
|
|
110
110
|
return (
|
|
111
|
-
|
|
112
|
-
<
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
<div
|
|
135
|
-
className={cn(
|
|
136
|
-
"border-t border-border/70",
|
|
137
|
-
isCollapsed ? "mx-2 my-1.5" : "mx-4",
|
|
138
|
-
)}
|
|
139
|
-
/>
|
|
140
|
-
</>
|
|
111
|
+
<div className={cn("pb-1", isCollapsed ? "px-0" : "px-3")}>
|
|
112
|
+
<ul className={isCollapsed ? SIDEBAR_RAIL_STACK_CLASS : "space-y-0.5"}>
|
|
113
|
+
{navItems.map((item) => (
|
|
114
|
+
<li
|
|
115
|
+
key={item.target}
|
|
116
|
+
className={isCollapsed ? "flex justify-center" : undefined}
|
|
117
|
+
>
|
|
118
|
+
<SidebarNavLinkItem
|
|
119
|
+
to={item.target}
|
|
120
|
+
label={item.label()}
|
|
121
|
+
icon={item.icon}
|
|
122
|
+
density="compact"
|
|
123
|
+
collapsed={isCollapsed}
|
|
124
|
+
indicator={item.target === "/inbox" && unreadCount > 0}
|
|
125
|
+
trailing={item.target === "/inbox" && unreadCount > 0
|
|
126
|
+
? unreadCount > 99 ? "99+" : unreadCount
|
|
127
|
+
: undefined}
|
|
128
|
+
className={isCollapsed ? undefined : "rounded-lg px-2.5 py-1.5"}
|
|
129
|
+
/>
|
|
130
|
+
</li>
|
|
131
|
+
))}
|
|
132
|
+
</ul>
|
|
133
|
+
</div>
|
|
141
134
|
);
|
|
142
135
|
}
|
|
143
136
|
|
|
@@ -172,14 +165,11 @@ export function ChatSidebarSessionArea({
|
|
|
172
165
|
|
|
173
166
|
return (
|
|
174
167
|
<>
|
|
175
|
-
<div className="flex items-center justify-
|
|
176
|
-
<div className="
|
|
177
|
-
{t("chatSidebarTaskRecords")}
|
|
178
|
-
</div>
|
|
179
|
-
<div className="flex items-center gap-1">
|
|
168
|
+
<div className="flex items-center justify-end px-4 pb-1 pt-2">
|
|
169
|
+
<div className="flex h-7 items-center gap-1.5">
|
|
180
170
|
{isProjectFirstView ? (
|
|
181
171
|
<IconActionButton
|
|
182
|
-
icon={<
|
|
172
|
+
icon={<FolderPlus className="h-3.5 w-3.5" />}
|
|
183
173
|
label={t("chatProjectAdd")}
|
|
184
174
|
onClick={onAddProject}
|
|
185
175
|
/>
|
|
@@ -193,8 +183,8 @@ export function ChatSidebarSessionArea({
|
|
|
193
183
|
|
|
194
184
|
<div
|
|
195
185
|
className={cn(
|
|
196
|
-
"custom-scrollbar min-h-0 flex-1 overflow-y-auto px-3 pb-
|
|
197
|
-
|
|
186
|
+
"custom-scrollbar min-h-0 flex-1 overflow-y-auto px-3 pb-4 pt-1",
|
|
187
|
+
SCROLL_BOTTOM_EDGE_FADE_CLASS,
|
|
198
188
|
)}
|
|
199
189
|
>
|
|
200
190
|
<ChatSidebarSessionList
|
|
@@ -246,7 +236,7 @@ export function ChatSidebarDesktopFooter({
|
|
|
246
236
|
return (
|
|
247
237
|
<div
|
|
248
238
|
className={cn(
|
|
249
|
-
"py-
|
|
239
|
+
"py-2",
|
|
250
240
|
isCollapsed
|
|
251
241
|
? cn("flex justify-center", SIDEBAR_RAIL_PADDING_X_CLASS)
|
|
252
242
|
: "px-3",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Button
|
|
1
|
+
import { Button } from "@/shared/components/ui/button";
|
|
2
2
|
import { IconActionButton } from "@/shared/components/ui/actions/icon-action-button";
|
|
3
3
|
import { Input } from "@/shared/components/ui/input";
|
|
4
4
|
import {
|
|
@@ -20,51 +20,6 @@ import {
|
|
|
20
20
|
} from "@/app/components/layout/sidebar-rail.styles";
|
|
21
21
|
|
|
22
22
|
type SessionTypeOption = ChatSessionTypeOption;
|
|
23
|
-
type NewSessionActionStyleVariant =
|
|
24
|
-
| "neutralSurface"
|
|
25
|
-
| "brandSoft"
|
|
26
|
-
| "brandTextSurface"
|
|
27
|
-
| "brandSolid";
|
|
28
|
-
|
|
29
|
-
const NEW_SESSION_ACTION_STYLE_VARIANT: NewSessionActionStyleVariant =
|
|
30
|
-
"brandSoft";
|
|
31
|
-
|
|
32
|
-
const NEW_SESSION_ACTION_STYLE_CLASSES: Record<
|
|
33
|
-
NewSessionActionStyleVariant,
|
|
34
|
-
{
|
|
35
|
-
leftVariant: ButtonProps["variant"];
|
|
36
|
-
leftClassName: string;
|
|
37
|
-
rightClassName: string;
|
|
38
|
-
}
|
|
39
|
-
> = {
|
|
40
|
-
neutralSurface: {
|
|
41
|
-
leftVariant: "ghost",
|
|
42
|
-
leftClassName:
|
|
43
|
-
"bg-card text-foreground shadow-none transition-[background-color,color,box-shadow] hover:bg-accent hover:text-accent-foreground hover:shadow-sm active:bg-accent",
|
|
44
|
-
rightClassName:
|
|
45
|
-
"bg-card text-muted-foreground shadow-none transition-[background-color,color,box-shadow] hover:bg-accent hover:text-accent-foreground hover:shadow-sm active:bg-accent",
|
|
46
|
-
},
|
|
47
|
-
brandSoft: {
|
|
48
|
-
leftVariant: "ghost",
|
|
49
|
-
leftClassName:
|
|
50
|
-
"bg-primary/10 text-primary shadow-none ring-1 ring-primary/10 transition-[background-color,color,box-shadow] hover:bg-primary/15 hover:text-primary-700 hover:shadow-sm active:bg-primary/20",
|
|
51
|
-
rightClassName:
|
|
52
|
-
"bg-primary/10 text-primary shadow-none ring-1 ring-primary/10 transition-[background-color,color,box-shadow] hover:bg-primary/15 hover:text-primary-700 hover:shadow-sm active:bg-primary/20",
|
|
53
|
-
},
|
|
54
|
-
brandTextSurface: {
|
|
55
|
-
leftVariant: "ghost",
|
|
56
|
-
leftClassName:
|
|
57
|
-
"bg-card text-primary shadow-none transition-[background-color,color,box-shadow] hover:bg-accent hover:text-primary-700 hover:shadow-sm active:bg-primary/15",
|
|
58
|
-
rightClassName:
|
|
59
|
-
"bg-card text-primary shadow-none transition-[background-color,color,box-shadow] hover:bg-accent hover:text-primary-700 hover:shadow-sm active:bg-primary/15",
|
|
60
|
-
},
|
|
61
|
-
brandSolid: {
|
|
62
|
-
leftVariant: "primary",
|
|
63
|
-
leftClassName: "",
|
|
64
|
-
rightClassName:
|
|
65
|
-
"bg-primary text-primary-foreground shadow-sm hover:bg-primary-600 hover:text-primary-foreground active:bg-primary-700",
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
23
|
|
|
69
24
|
type ChatSidebarToolbarProps = {
|
|
70
25
|
query: string;
|
|
@@ -117,8 +72,6 @@ export function ChatSidebarDesktopToolbar(props: ChatSidebarToolbarProps) {
|
|
|
117
72
|
collapsed = false,
|
|
118
73
|
} = props;
|
|
119
74
|
const supportsSessionTypeSwitch = sessionTypeOptions.length > 1;
|
|
120
|
-
const actionStyle =
|
|
121
|
-
NEW_SESSION_ACTION_STYLE_CLASSES[NEW_SESSION_ACTION_STYLE_VARIANT];
|
|
122
75
|
|
|
123
76
|
if (collapsed) {
|
|
124
77
|
return (
|
|
@@ -183,21 +136,20 @@ export function ChatSidebarDesktopToolbar(props: ChatSidebarToolbarProps) {
|
|
|
183
136
|
|
|
184
137
|
return (
|
|
185
138
|
<>
|
|
186
|
-
<div className="px-4 pb-
|
|
187
|
-
<div className="flex
|
|
139
|
+
<div className="px-4 pb-2">
|
|
140
|
+
<div className="flex overflow-hidden rounded-lg bg-primary/10 text-primary ring-1 ring-primary/10">
|
|
188
141
|
<Button
|
|
189
|
-
variant=
|
|
142
|
+
variant="ghost"
|
|
190
143
|
className={cn(
|
|
191
|
-
"min-w-0 rounded-
|
|
192
|
-
|
|
193
|
-
supportsSessionTypeSwitch ? "flex-1 rounded-r-md" : "w-full",
|
|
144
|
+
"min-w-0 rounded-none bg-transparent px-3 text-primary shadow-none hover:bg-primary/10 hover:text-primary-700 active:bg-primary/15",
|
|
145
|
+
supportsSessionTypeSwitch ? "flex-1" : "w-full",
|
|
194
146
|
)}
|
|
195
147
|
onClick={() => {
|
|
196
148
|
onCreateMenuOpenChange(false);
|
|
197
149
|
onCreateSession(selectedNewSessionType);
|
|
198
150
|
}}
|
|
199
151
|
>
|
|
200
|
-
<Plus className="mr-
|
|
152
|
+
<Plus className="mr-1.5 h-4 w-4" />
|
|
201
153
|
{t("chatSidebarNewTask")}
|
|
202
154
|
</Button>
|
|
203
155
|
{supportsSessionTypeSwitch ? (
|
|
@@ -208,19 +160,16 @@ export function ChatSidebarDesktopToolbar(props: ChatSidebarToolbarProps) {
|
|
|
208
160
|
<PopoverTrigger asChild>
|
|
209
161
|
<IconActionButton
|
|
210
162
|
icon={
|
|
211
|
-
<span className="inline-flex items-center gap-
|
|
163
|
+
<span className="inline-flex items-center gap-1">
|
|
212
164
|
<SessionTypeTriggerIcon
|
|
213
165
|
option={selectedNewSessionTypeOption}
|
|
214
166
|
/>
|
|
215
|
-
<ChevronDown className="h-3 w-3 opacity-
|
|
167
|
+
<ChevronDown className="h-3 w-3 opacity-50" />
|
|
216
168
|
</span>
|
|
217
169
|
}
|
|
218
170
|
label={t("chatSessionTypeLabel")}
|
|
219
171
|
tooltip={t("chatSessionTypeLabel")}
|
|
220
|
-
className=
|
|
221
|
-
"h-9 w-12 shrink-0 rounded-xl rounded-l-md",
|
|
222
|
-
actionStyle.rightClassName,
|
|
223
|
-
)}
|
|
172
|
+
className="h-9 w-12 shrink-0 rounded-none border-l border-primary/10 bg-transparent text-primary shadow-none hover:bg-primary/10 hover:text-primary-700 active:bg-primary/15"
|
|
224
173
|
/>
|
|
225
174
|
</PopoverTrigger>
|
|
226
175
|
<ChatPopoverContent
|
|
@@ -241,14 +190,14 @@ export function ChatSidebarDesktopToolbar(props: ChatSidebarToolbarProps) {
|
|
|
241
190
|
</div>
|
|
242
191
|
</div>
|
|
243
192
|
|
|
244
|
-
<div className="px-4 pb-
|
|
193
|
+
<div className="px-4 pb-2">
|
|
245
194
|
<div className="relative">
|
|
246
|
-
<Search className="pointer-events-none absolute left-
|
|
195
|
+
<Search className="pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground/60" />
|
|
247
196
|
<Input
|
|
248
197
|
value={query}
|
|
249
198
|
onChange={(event) => onQueryChange(event.target.value)}
|
|
250
199
|
placeholder={t("chatSidebarSearchPlaceholder")}
|
|
251
|
-
className="h-
|
|
200
|
+
className="h-8 rounded-lg border-0 bg-background/55 pl-8 text-xs shadow-none hover:bg-background/75"
|
|
252
201
|
/>
|
|
253
202
|
</div>
|
|
254
203
|
</div>
|
|
@@ -277,7 +226,7 @@ export function ChatSidebarMobileToolbar(props: ChatSidebarToolbarProps) {
|
|
|
277
226
|
value={query}
|
|
278
227
|
onChange={(event) => onQueryChange(event.target.value)}
|
|
279
228
|
placeholder={t("chatSidebarSearchPlaceholder")}
|
|
280
|
-
className="h-9 rounded-full border-
|
|
229
|
+
className="h-9 rounded-full border-0 bg-muted pl-9 pr-3 text-[13px] shadow-none"
|
|
281
230
|
/>
|
|
282
231
|
</div>
|
|
283
232
|
|
|
@@ -291,7 +240,7 @@ export function ChatSidebarMobileToolbar(props: ChatSidebarToolbarProps) {
|
|
|
291
240
|
icon={<Plus className="h-4 w-4" />}
|
|
292
241
|
label={t("chatSidebarNewTask")}
|
|
293
242
|
tooltip={false}
|
|
294
|
-
className="h-9 w-9 shrink-0 rounded-full bg-muted text-foreground shadow-none hover:bg-
|
|
243
|
+
className="h-9 w-9 shrink-0 rounded-full bg-muted text-foreground shadow-none hover:bg-[var(--interaction-hover)] hover:text-accent-foreground"
|
|
295
244
|
/>
|
|
296
245
|
</PopoverTrigger>
|
|
297
246
|
<ChatPopoverContent
|
|
@@ -314,7 +263,7 @@ export function ChatSidebarMobileToolbar(props: ChatSidebarToolbarProps) {
|
|
|
314
263
|
<IconActionButton
|
|
315
264
|
icon={<Plus className="h-4 w-4" />}
|
|
316
265
|
label={t("chatSidebarNewTask")}
|
|
317
|
-
className="h-9 w-9 shrink-0 rounded-full bg-muted text-foreground shadow-none hover:bg-
|
|
266
|
+
className="h-9 w-9 shrink-0 rounded-full bg-muted text-foreground shadow-none hover:bg-[var(--interaction-hover)] hover:text-accent-foreground"
|
|
318
267
|
onClick={() => onCreateSession(defaultSessionType)}
|
|
319
268
|
/>
|
|
320
269
|
)}
|
|
@@ -102,13 +102,10 @@ export function ChatSidebarUtilityMenu({
|
|
|
102
102
|
<button
|
|
103
103
|
type="button"
|
|
104
104
|
aria-label={t("settingsMenu")}
|
|
105
|
-
className="flex w-full items-center gap-2.5 rounded-
|
|
105
|
+
className="flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] font-medium text-muted-foreground transition-colors duration-base hover:bg-background/70 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
|
|
106
106
|
>
|
|
107
107
|
<Settings className="h-4 w-4 shrink-0 text-muted-foreground/70" />
|
|
108
108
|
<span className="min-w-0 flex-1 text-left">{t("settings")}</span>
|
|
109
|
-
<span className="max-w-[112px] truncate text-[13px] text-muted-foreground">
|
|
110
|
-
{currentThemeLabel} / {currentLanguageLabel}
|
|
111
|
-
</span>
|
|
112
109
|
</button>
|
|
113
110
|
</PopoverTrigger>
|
|
114
111
|
)}
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
import type { ChatUiManager } from '@/features/chat/managers/chat-ui.manager';
|
|
6
6
|
import type { ChatQueryManager } from '@/features/chat/managers/chat-query.manager';
|
|
7
7
|
import type { ChatThreadManager } from '@/features/chat/managers/chat-thread.manager';
|
|
8
|
+
import type { ChatComposerIntentManager } from '@/features/chat/managers/chat-composer-intent.manager';
|
|
8
9
|
|
|
9
10
|
type PublicManager<T extends object> = Pick<T, keyof T>;
|
|
10
11
|
|
|
@@ -15,6 +16,7 @@ export type ChatPresenterLike = {
|
|
|
15
16
|
chatQueryManager: ChatQueryManager;
|
|
16
17
|
chatSessionListManager: ChatSessionListManager;
|
|
17
18
|
chatThreadManager: ChatThreadManagerLike;
|
|
19
|
+
chatComposerIntentManager: ChatComposerIntentManager;
|
|
18
20
|
};
|
|
19
21
|
|
|
20
22
|
const ChatPresenterContext = createContext<ChatPresenterLike | null>(null);
|
|
@@ -39,7 +39,7 @@ const mocks = vi.hoisted(() => {
|
|
|
39
39
|
selectedSessionType: "default",
|
|
40
40
|
pendingProjectRoot: null,
|
|
41
41
|
composerFocusRequestId: 0,
|
|
42
|
-
sendError: null,
|
|
42
|
+
sendError: null as string | null,
|
|
43
43
|
};
|
|
44
44
|
const inputQuery = {
|
|
45
45
|
defaultModel: undefined as string | undefined,
|
|
@@ -52,6 +52,7 @@ const mocks = vi.hoisted(() => {
|
|
|
52
52
|
selectedSession: null as null | {
|
|
53
53
|
activityPreview?: {
|
|
54
54
|
state: "running" | "completed" | "failed" | "cancelled" | "idle";
|
|
55
|
+
statusKind?: "run-failed" | "run-interrupted";
|
|
55
56
|
statusText?: string;
|
|
56
57
|
replyText?: string;
|
|
57
58
|
};
|
|
@@ -86,11 +87,11 @@ const mocks = vi.hoisted(() => {
|
|
|
86
87
|
isHydrating: false,
|
|
87
88
|
isRunning: true,
|
|
88
89
|
isSending: true,
|
|
89
|
-
hydrateError: null,
|
|
90
|
+
hydrateError: null as Error | null,
|
|
90
91
|
snapshot: {
|
|
91
92
|
activeRun: null,
|
|
92
93
|
contextWindow: null,
|
|
93
|
-
error: null,
|
|
94
|
+
error: null as { code?: string; message: string } | null,
|
|
94
95
|
},
|
|
95
96
|
send: vi.fn(),
|
|
96
97
|
abort: vi.fn(),
|
|
@@ -206,8 +207,11 @@ vi.mock(
|
|
|
206
207
|
vi.mock(
|
|
207
208
|
"@/features/chat/features/conversation/hooks/use-session-conversation-input-state",
|
|
208
209
|
() => ({
|
|
209
|
-
useSessionConversationInputState: (
|
|
210
|
-
|
|
210
|
+
useSessionConversationInputState: (
|
|
211
|
+
initialPrompt?: string | null,
|
|
212
|
+
sessionKey?: string | null,
|
|
213
|
+
) => {
|
|
214
|
+
mocks.initialPromptSpy(initialPrompt, sessionKey);
|
|
211
215
|
return {
|
|
212
216
|
inputActions: mocks.inputActions,
|
|
213
217
|
inputSnapshot: mocks.inputSnapshot,
|
|
@@ -265,7 +269,11 @@ describe("SessionConversationArea input boundary", () => {
|
|
|
265
269
|
mocks.agent.isHydrating = false;
|
|
266
270
|
mocks.agent.isRunning = true;
|
|
267
271
|
mocks.agent.isSending = true;
|
|
272
|
+
mocks.agent.hydrateError = null;
|
|
268
273
|
mocks.agent.snapshot.contextWindow = null;
|
|
274
|
+
mocks.agent.snapshot.error = null;
|
|
275
|
+
mocks.controller.isSending = true;
|
|
276
|
+
mocks.inputSnapshot.sendError = null;
|
|
269
277
|
mocks.inputQuery.defaultModel = undefined;
|
|
270
278
|
mocks.inputQuery.fallbackPreferredModel = undefined;
|
|
271
279
|
mocks.inputQuery.selectedSession = null;
|
|
@@ -319,13 +327,27 @@ describe("SessionConversationArea input boundary", () => {
|
|
|
319
327
|
.toBe("false");
|
|
320
328
|
});
|
|
321
329
|
|
|
322
|
-
it("
|
|
323
|
-
|
|
330
|
+
it("leaves the welcome surface on the first local sending render", () => {
|
|
331
|
+
mocks.agent.isRunning = false;
|
|
332
|
+
mocks.agent.isSending = false;
|
|
333
|
+
mocks.controller.isSending = false;
|
|
334
|
+
const rendered = renderArea(null);
|
|
324
335
|
|
|
325
336
|
expect(screen.getByTestId("conversation-content").dataset.showWelcome).toBe(
|
|
326
337
|
"true",
|
|
327
338
|
);
|
|
328
|
-
|
|
339
|
+
|
|
340
|
+
mocks.controller.isSending = true;
|
|
341
|
+
rendered.rerender(
|
|
342
|
+
<MemoryRouter>
|
|
343
|
+
<SessionConversationArea sessionKey={null} />
|
|
344
|
+
</MemoryRouter>,
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
expect(screen.getByTestId("conversation-content").dataset.showWelcome).toBe(
|
|
348
|
+
"false",
|
|
349
|
+
);
|
|
350
|
+
expect(screen.queryByTestId("welcome")).toBeNull();
|
|
329
351
|
expect(screen.getByTestId("conversation-input")).toBeTruthy();
|
|
330
352
|
});
|
|
331
353
|
|
|
@@ -349,7 +371,13 @@ describe("SessionConversationArea input boundary", () => {
|
|
|
349
371
|
</MemoryRouter>,
|
|
350
372
|
);
|
|
351
373
|
|
|
352
|
-
expect(mocks.initialPromptSpy).toHaveBeenCalledWith(
|
|
374
|
+
expect(mocks.initialPromptSpy).toHaveBeenCalledWith(
|
|
375
|
+
"每天整理项目风险",
|
|
376
|
+
null,
|
|
377
|
+
);
|
|
378
|
+
expect(mocks.inputActions.applyPromptSuggestion).toHaveBeenCalledWith(
|
|
379
|
+
"每天整理项目风险",
|
|
380
|
+
);
|
|
353
381
|
});
|
|
354
382
|
|
|
355
383
|
it("syncs draft preferences with the selected runtime context", () => {
|
|
@@ -380,7 +408,7 @@ describe("SessionConversationArea input boundary", () => {
|
|
|
380
408
|
mocks.inputQuery.selectedSession = {
|
|
381
409
|
activityPreview: {
|
|
382
410
|
state: "failed",
|
|
383
|
-
statusText: "
|
|
411
|
+
statusText: "Invalid API Key",
|
|
384
412
|
},
|
|
385
413
|
status: "idle",
|
|
386
414
|
};
|
|
@@ -388,8 +416,31 @@ describe("SessionConversationArea input boundary", () => {
|
|
|
388
416
|
renderArea("session-1");
|
|
389
417
|
|
|
390
418
|
expect(screen.getByTestId("conversation-bottom-slot")).toBeTruthy();
|
|
391
|
-
expect(screen.getByText(
|
|
392
|
-
|
|
419
|
+
expect(screen.getByText("Invalid API Key")).toBeTruthy();
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
it("renders overlapping runtime failures once with a subdued diagnostic surface", () => {
|
|
423
|
+
const providerError = `Chat Completions API failed (402): {\n "error": "${"x".repeat(240)} END_OF_PROVIDER_ERROR"\n}`;
|
|
424
|
+
mocks.inputSnapshot.sendError = providerError;
|
|
425
|
+
mocks.agent.snapshot.error = { message: providerError };
|
|
426
|
+
mocks.inputQuery.selectedSession = {
|
|
427
|
+
activityPreview: {
|
|
428
|
+
state: "failed",
|
|
429
|
+
statusText: providerError,
|
|
430
|
+
},
|
|
431
|
+
status: "idle",
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
renderArea("session-1");
|
|
435
|
+
|
|
436
|
+
expect(screen.getAllByRole("status")).toHaveLength(1);
|
|
437
|
+
const failureStatus = screen.getByRole("status");
|
|
438
|
+
expect(failureStatus.className).toContain("bg-muted/45");
|
|
439
|
+
expect(failureStatus.className).not.toContain("bg-red");
|
|
440
|
+
const errorDetail = failureStatus.querySelector("pre");
|
|
441
|
+
expect(errorDetail?.className).toContain("max-h-32");
|
|
442
|
+
expect(errorDetail?.className).toContain("overflow-auto");
|
|
443
|
+
expect(errorDetail?.textContent).toBe(providerError);
|
|
393
444
|
});
|
|
394
445
|
|
|
395
446
|
it("does not surface user-cancelled previews as conversation errors", () => {
|
|
@@ -406,4 +457,25 @@ describe("SessionConversationArea input boundary", () => {
|
|
|
406
457
|
expect(screen.queryByTestId("conversation-bottom-slot")).toBeNull();
|
|
407
458
|
expect(screen.queryByText(/出错了|Something went wrong/)).toBeNull();
|
|
408
459
|
});
|
|
460
|
+
|
|
461
|
+
it("does not expose recovered runtime interruption diagnostics as task errors", () => {
|
|
462
|
+
const recoveryDetail = "Run interrupted: internal recovery detail.";
|
|
463
|
+
mocks.agent.snapshot.error = {
|
|
464
|
+
code: "run-interrupted",
|
|
465
|
+
message: recoveryDetail,
|
|
466
|
+
};
|
|
467
|
+
mocks.inputQuery.selectedSession = {
|
|
468
|
+
activityPreview: {
|
|
469
|
+
state: "failed",
|
|
470
|
+
statusKind: "run-interrupted",
|
|
471
|
+
statusText: recoveryDetail,
|
|
472
|
+
},
|
|
473
|
+
status: "idle",
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
renderArea("session-1");
|
|
477
|
+
|
|
478
|
+
expect(screen.queryByTestId("conversation-bottom-slot")).toBeNull();
|
|
479
|
+
expect(screen.queryByText(recoveryDetail)).toBeNull();
|
|
480
|
+
});
|
|
409
481
|
});
|