@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.
Files changed (476) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/assets/{abnfDiagram-VRR7QNED-M4g_AyR8.js → abnfDiagram-VRR7QNED-DvTjgVMf.js} +1 -1
  3. package/dist/assets/{aiden0z-pptx-renderer.es-Bd99vut2.js → aiden0z-pptx-renderer.es-C1nfBAXR.js} +1 -1
  4. package/dist/assets/api-Glw2OGXK.js +13 -0
  5. package/dist/assets/appearance-settings-page-Bl_W_9m7.js +1 -0
  6. package/dist/assets/{arc-IO7WNWOB.js → arc-BvhODBXv.js} +1 -1
  7. package/dist/assets/architecture-TIHT7OUA-Bjp9jf0h.js +1 -0
  8. package/dist/assets/{architectureDiagram-ZJ3FMSHR-Dc-lvdUh.js → architectureDiagram-ZJ3FMSHR-BKO9RgNS.js} +1 -1
  9. package/dist/assets/{blockDiagram-677ZJIJ3-CcsoWpIY.js → blockDiagram-677ZJIJ3-DHpDXy7D.js} +1 -1
  10. package/dist/assets/{c4Diagram-LMCZKHZV-Bsrtg6b2.js → c4Diagram-LMCZKHZV-BG_iQnDr.js} +1 -1
  11. package/dist/assets/channel-5T3pdR-s.js +1 -0
  12. package/dist/assets/channels-list-page-C7E4Sxwd.js +8 -0
  13. package/dist/assets/chat-page-BT6dNI-4.js +1 -0
  14. package/dist/assets/chunk-2Q5K7J3B-DTZ3tGfE.js +1 -0
  15. package/dist/assets/{chunk-32BRIVSS-Bt08t8oG.js → chunk-32BRIVSS-DR9M0LLx.js} +1 -1
  16. package/dist/assets/{chunk-52WLFC77-Ddx68Xzx.js → chunk-52WLFC77-698iC3BB.js} +1 -1
  17. package/dist/assets/{chunk-5FCAYU7R-B7p9_q55.js → chunk-5FCAYU7R-DikTj9Ey.js} +1 -1
  18. package/dist/assets/{chunk-5HE753X5-D52KvdTm.js → chunk-5HE753X5-ko0o7_q0.js} +1 -1
  19. package/dist/assets/{chunk-5JV3BV7I-C329h8nI.js → chunk-5JV3BV7I-CEHufhgo.js} +1 -1
  20. package/dist/assets/{chunk-5TONJI2A-BZyUBxWt.js → chunk-5TONJI2A-CGgno1cu.js} +1 -1
  21. package/dist/assets/{chunk-5VM5RSS4-BUiYXZmu.js → chunk-5VM5RSS4-DkiB4cUQ.js} +1 -1
  22. package/dist/assets/{chunk-7BUUIJ7U-B7o-mn4r.js → chunk-7BUUIJ7U-DzptcytQ.js} +1 -1
  23. package/dist/assets/{chunk-BIQX33UG-Bey9GoRP.js → chunk-BIQX33UG-DMRSQJvT.js} +1 -1
  24. package/dist/assets/{chunk-C7G6YPKG-C6tosszM.js → chunk-C7G6YPKG-Bw1BwwuY.js} +1 -1
  25. package/dist/assets/{chunk-CQNSW5MT-BNrdkgGQ.js → chunk-CQNSW5MT-C0z6eHBk.js} +1 -1
  26. package/dist/assets/{chunk-CYSBUYHQ-DHODFeyB.js → chunk-CYSBUYHQ-ByPyAouO.js} +1 -1
  27. package/dist/assets/{chunk-EMLP6XTP-BcmLjrcq.js → chunk-EMLP6XTP-CJlAXWZg.js} +1 -1
  28. package/dist/assets/{chunk-EX3LRPZG-r-_eEtJI.js → chunk-EX3LRPZG-Dqq4zKJu.js} +1 -1
  29. package/dist/assets/{chunk-FWX5IMBZ-DOObDWbf.js → chunk-FWX5IMBZ-B0SNoCmi.js} +2 -2
  30. package/dist/assets/{chunk-HOUHSVGY-Bd0FnbWZ.js → chunk-HOUHSVGY-DG_GJih_.js} +1 -1
  31. package/dist/assets/{chunk-ICXQ74PX-ntNwAm4_.js → chunk-ICXQ74PX-Drxk_6bE.js} +1 -1
  32. package/dist/assets/{chunk-JG7HCLWE-YtRpblZN.js → chunk-JG7HCLWE-DdLFPpnd.js} +1 -1
  33. package/dist/assets/{chunk-JWPE2WC7-De5-D9ta.js → chunk-JWPE2WC7-B8M4G76F.js} +1 -1
  34. package/dist/assets/{chunk-MOJQB5TN-CdvKhyp2.js → chunk-MOJQB5TN-XP6FJHY_.js} +1 -1
  35. package/dist/assets/{chunk-MOZMSUNE-DJMMN_lu.js → chunk-MOZMSUNE-C_6x18Qw.js} +1 -1
  36. package/dist/assets/{chunk-OGEWGWER-DOFWVw3O.js → chunk-OGEWGWER-N25BzCmG.js} +1 -1
  37. package/dist/assets/{chunk-OSBZ3O6U-DZkrIN9r.js → chunk-OSBZ3O6U-ASDEm7y0.js} +1 -1
  38. package/dist/assets/{chunk-PUDLZKDR-D1wma2Yf.js → chunk-PUDLZKDR-CTlvAcn7.js} +1 -1
  39. package/dist/assets/{chunk-Q4XR5HBZ-CjPy94Lz.js → chunk-Q4XR5HBZ-Da9BWfB6.js} +1 -1
  40. package/dist/assets/{chunk-QBLGF6JB-Hy1bEgS-.js → chunk-QBLGF6JB-Bi6RpTJO.js} +1 -1
  41. package/dist/assets/{chunk-R7FJI6CG-CUPIHyh-.js → chunk-R7FJI6CG-DkMsSPvK.js} +1 -1
  42. package/dist/assets/{chunk-RYQCIY6F-D5Ua4pcv.js → chunk-RYQCIY6F-DZp0eU-j.js} +1 -1
  43. package/dist/assets/{chunk-U6XO7XAA-DaUQcqb7.js → chunk-U6XO7XAA-vfinDSrj.js} +1 -1
  44. package/dist/assets/{chunk-V7JOEXUC-DX2zLfQe.js → chunk-V7JOEXUC-C9Nksccs.js} +1 -1
  45. package/dist/assets/chunk-VAUOI2AC-HLGIHQ6k.js +1 -0
  46. package/dist/assets/{chunk-VR4S4FIN-CFA-WQik.js → chunk-VR4S4FIN-Xv6zfwXs.js} +1 -1
  47. package/dist/assets/{chunk-WYO6CB5R-Bk2HeDvJ.js → chunk-WYO6CB5R-mOJNzbWl.js} +2 -2
  48. package/dist/assets/chunk-XXDRQBXY-Dl0m6Ni-.js +1 -0
  49. package/dist/assets/{chunk-YOTPTUD7-DUG4FpBN.js → chunk-YOTPTUD7-1-aKSu4o.js} +1 -1
  50. package/dist/assets/{chunk-ZGVPDNZ5-70JdIGo0.js → chunk-ZGVPDNZ5-OJ8veMpK.js} +1 -1
  51. package/dist/assets/{chunk-ZIRB5QZD-XZdgBt5L.js → chunk-ZIRB5QZD-SR_Nq_PP.js} +1 -1
  52. package/dist/assets/classDiagram-OUVF2IWQ-DcDnzGNX.js +1 -0
  53. package/dist/assets/classDiagram-v2-EOCWNBFH-BKXKMzKM.js +1 -0
  54. package/dist/assets/config-split-page-D5BgtKrm.js +1 -0
  55. package/dist/assets/confirm-dialog-Bf907Azu.js +5 -0
  56. package/dist/assets/{cose-bilkent-JH36ORCC-B-PQoGX-.js → cose-bilkent-JH36ORCC-NjVgz2Bw.js} +1 -1
  57. package/dist/assets/cynefin-VYW2F7L2-BWg7U2UD.js +1 -0
  58. package/dist/assets/{cynefinDiagram-TSTJHNR4-BoLCPEM0.js → cynefinDiagram-TSTJHNR4-B_17LDqD.js} +1 -1
  59. package/dist/assets/{dagre-D7Ie4eXr.js → dagre-CMe101gk.js} +1 -1
  60. package/dist/assets/{dagre-VKFMJZFB-CKRrwZA-.js → dagre-VKFMJZFB-qo8nLb3B.js} +1 -1
  61. package/dist/assets/desktop-update-config-BwuyBPJb.js +1 -0
  62. package/dist/assets/{diagram-FQU43EPY-CASL1J3_.js → diagram-FQU43EPY-Ba3XIklC.js} +1 -1
  63. package/dist/assets/{diagram-G47NLZAW-CvLPBIzf.js → diagram-G47NLZAW-CG45TcUx.js} +1 -1
  64. package/dist/assets/{diagram-NH7WQ7WH-Ba6fGdYP.js → diagram-NH7WQ7WH-2F2HrwV-.js} +1 -1
  65. package/dist/assets/{diagram-OA4YK3LP-DkpfgEjM.js → diagram-OA4YK3LP-CXfWH9NZ.js} +1 -1
  66. package/dist/assets/{diagram-WEI45ONY-BP5UMVsN.js → diagram-WEI45ONY-CH_4yepc.js} +1 -1
  67. package/dist/assets/dist-CtLyEJeO.js +1 -0
  68. package/dist/assets/dist-dv_SUR54.js +1 -0
  69. package/dist/assets/doc-browser-C23NDGh5.js +1 -0
  70. package/dist/assets/doc-browser-DlOOhBxI.js +1 -0
  71. package/dist/assets/doc-browser-context-BIBjkwfV.js +1 -0
  72. package/dist/assets/{docx-preview-D0tp3a9T.js → docx-preview-CoM4JK7_.js} +1 -1
  73. package/dist/assets/{ebnfDiagram-CCIWWBDH-TJKbUcmc.js → ebnfDiagram-CCIWWBDH-BwiG4Ea1.js} +1 -1
  74. package/dist/assets/{erDiagram-Q63AITRT-DzGPKkKH.js → erDiagram-Q63AITRT-BML3hpnQ.js} +1 -1
  75. package/dist/assets/eventmodeling-45OFAUF4-SB-J4tpq.js +1 -0
  76. package/dist/assets/flowDiagram-23GEKE2U-BQ_u-eLM.js +1 -0
  77. package/dist/assets/{form-actions-DvvxCpL4.js → form-actions-DAzi68Cn.js} +1 -1
  78. package/dist/assets/{ganttDiagram-NO4QXBWP-JhJzsGp2.js → ganttDiagram-NO4QXBWP-80enfWbD.js} +1 -1
  79. package/dist/assets/gitGraph-TEB2WS4Q-DPxNwsFd.js +1 -0
  80. package/dist/assets/{gitGraphDiagram-IHSO6WYX-DZ1CKMj8.js → gitGraphDiagram-IHSO6WYX-CVLqXr-b.js} +1 -1
  81. package/dist/assets/host-capabilities-D9C4CBK5.js +1 -0
  82. package/dist/assets/index-BLNg2yg0.css +1 -0
  83. package/dist/assets/index-D3EKjEyK.js +107 -0
  84. package/dist/assets/info-DKCQHKI2-DNlNGH90.js +1 -0
  85. package/dist/assets/{infoDiagram-FWYZ7A6U-BNXNKfRQ.js → infoDiagram-FWYZ7A6U-Dyvs2t0i.js} +1 -1
  86. package/dist/assets/{ishikawaDiagram-FXEZZL3T-DoiEfjNw.js → ishikawaDiagram-FXEZZL3T-sSnxDKfh.js} +1 -1
  87. package/dist/assets/{journeyDiagram-5HDEW3XC-D6oK2HSy.js → journeyDiagram-5HDEW3XC-D22V71Mf.js} +1 -1
  88. package/dist/assets/{kanban-definition-HUTT4EX6-B2UnLOH-.js → kanban-definition-HUTT4EX6-D3ds0p-g.js} +1 -1
  89. package/dist/assets/{line-BM7PoxY5.js → line-CbyFs065.js} +1 -1
  90. package/dist/assets/{linear-B3DiqMjk.js → linear-4DKtnZBS.js} +1 -1
  91. package/dist/assets/loader-circle-BSg5u0r4.js +1 -0
  92. package/dist/assets/{map-BAAdHTqR.js → map-CcZzEoz6.js} +1 -1
  93. package/dist/assets/mcp-marketplace-page-ByhvQQj5.js +9 -0
  94. package/dist/assets/mcp-marketplace-page-CytXwnUs.js +1 -0
  95. package/dist/assets/{mermaid-parser.core-BeMviefY.js → mermaid-parser.core-DPmMOjXD.js} +2 -2
  96. package/dist/assets/{mermaid.core-D0Q77r9I.js → mermaid.core-BSf-ddRa.js} +3 -3
  97. package/dist/assets/{mindmap-definition-LN4V7U3C-BQ7r7bR8.js → mindmap-definition-LN4V7U3C-BUTwWPyx.js} +1 -1
  98. package/dist/assets/model-config-page-bgEx3MjQ.js +1 -0
  99. package/dist/assets/navigation-link-CB0OQbnY.js +3 -0
  100. package/dist/assets/{ordinal-Bt2N4IkA.js → ordinal-BgLYtOZE.js} +1 -1
  101. package/dist/assets/packet-7NZHBO7P-BpeiqkBZ.js +1 -0
  102. package/dist/assets/{pegDiagram-2B236MQR-B-C9-LGz.js → pegDiagram-2B236MQR-BEu_ZBjc.js} +1 -1
  103. package/dist/assets/pie-RZYD4A2V-Cy1yxsPd.js +1 -0
  104. package/dist/assets/{pieDiagram-ENE6RG2P-CtirZLtn.js → pieDiagram-ENE6RG2P-CAwAwuBd.js} +1 -1
  105. package/dist/assets/plus-CNjWdLhZ.js +1 -0
  106. package/dist/assets/provider-scoped-model-input-8F6JMd2n.js +1 -0
  107. package/dist/assets/providers-config-page-CxpTjR81.js +1 -0
  108. package/dist/assets/{quadrantDiagram-ABIIQ3AL-DiBWAzDU.js → quadrantDiagram-ABIIQ3AL-CwE6F-_2.js} +1 -1
  109. package/dist/assets/radar-I7S5WNFK-CEcPKCj8.js +1 -0
  110. package/dist/assets/railroad-3IZDKUUU-CW38eNDs.js +1 -0
  111. package/dist/assets/railroad-abnf-AHOZXSZD-ByrylcXf.js +1 -0
  112. package/dist/assets/railroad-ebnf-EBAXGLYW-CNB6GwP-.js +1 -0
  113. package/dist/assets/railroad-peg-LSFZ7HO6-x6hnqlBG.js +1 -0
  114. package/dist/assets/{railroadDiagram-RFXS5EU6-CP6b3PBI.js → railroadDiagram-RFXS5EU6-xgLekU3B.js} +1 -1
  115. package/dist/assets/react-Bk2ydNTe.js +8 -0
  116. package/dist/assets/{refresh-cw-C2e94pmp.js → refresh-cw-Ba0LZou4.js} +1 -1
  117. package/dist/assets/remote-Dv38PuMV.js +1 -0
  118. package/dist/assets/{requirementDiagram-TGXJPOKE-D8YV0-Jz.js → requirementDiagram-TGXJPOKE-CyVUzEX5.js} +1 -1
  119. package/dist/assets/rotate-cw-IkYVk9JX.js +1 -0
  120. package/dist/assets/runtime-config-page-C0ByyUVr.js +1 -0
  121. package/dist/assets/{sankeyDiagram-HTMAVEWB-C2vA4ojE.js → sankeyDiagram-HTMAVEWB-JK6bFmYB.js} +1 -1
  122. package/dist/assets/{save-CkwDOgvt.js → save-DTOAvqzt.js} +1 -1
  123. package/dist/assets/{search-CLXM2reO.js → search-D4X5DNMe.js} +1 -1
  124. package/dist/assets/search-config-page-Cr6254K5.js +1 -0
  125. package/dist/assets/{secrets-config-page-DQ_Curaj.js → secrets-config-page-W2Hx332d.js} +2 -2
  126. package/dist/assets/security-config-1E8OF4kR.js +1 -0
  127. package/dist/assets/select-CDv0g2Pj.js +41 -0
  128. package/dist/assets/{sequenceDiagram-DBY2YBRQ-B9LBmpUo.js → sequenceDiagram-DBY2YBRQ-BR5IokXV.js} +1 -1
  129. package/dist/assets/{settings-2-B9IT2HGd.js → settings-2-CoxzNABp.js} +1 -1
  130. package/dist/assets/{sizeCapture-X5ZJPWSS-9UIfya9-.js → sizeCapture-X5ZJPWSS-SxG_YnMA.js} +1 -1
  131. package/dist/assets/skeleton-DW018fJv.js +1 -0
  132. package/dist/assets/{src-DKf77Yzo.js → src-vgz8E_-O.js} +1 -1
  133. package/dist/assets/{stateDiagram-2N3HPSRC-oTW44vds.js → stateDiagram-2N3HPSRC-DD4OoYhn.js} +1 -1
  134. package/dist/assets/stateDiagram-v2-6OUMAXLB-ZC6dFORv.js +1 -0
  135. package/dist/assets/{swimlanes-5IMT3BWC-Cf7lcsay.js → swimlanes-5IMT3BWC-BWkFeyCT.js} +2 -2
  136. package/dist/assets/swimlanesDiagram-G3AALYLV-CRkh51Im.js +8 -0
  137. package/dist/assets/{tag-chip-CDkB5smU.js → tag-chip-CjkZEoS2.js} +1 -1
  138. package/dist/assets/{timeline-definition-FHXFAJF6-DoCuWKDJ.js → timeline-definition-FHXFAJF6-VTRPy6KA.js} +1 -1
  139. package/dist/assets/treeView-QDETBFTQ-Bw0DSCH7.js +1 -0
  140. package/dist/assets/treemap-6X3UGDF4-DFWBFcfh.js +1 -0
  141. package/dist/assets/use-confirm-dialog-CavtY1vJ.js +1 -0
  142. package/dist/assets/{vennDiagram-L72KCM5P-CpU0pzGe.js → vennDiagram-L72KCM5P-Bvk42Pek.js} +1 -1
  143. package/dist/assets/wardley-OPB4EBWU-CoWturk0.js +1 -0
  144. package/dist/assets/{wardleyDiagram-EHGQE667-CkN6nn6-.js → wardleyDiagram-EHGQE667-DOFjx2s3.js} +1 -1
  145. package/dist/assets/x-PTXYTEwz.js +1 -0
  146. package/dist/assets/{xychartDiagram-FW5EYKEG-DATpapm2.js → xychartDiagram-FW5EYKEG-DY5yRTUc.js} +1 -1
  147. package/dist/index.html +30 -32
  148. package/index.html +8 -0
  149. package/package.json +8 -8
  150. package/src/app/components/layout/page-layout.tsx +15 -6
  151. package/src/app/components/layout/sidebar-rail.styles.ts +0 -2
  152. package/src/app/components/layout/sidebar.tsx +2 -2
  153. package/src/app/styles/charcoal-theme.css +85 -0
  154. package/src/app/styles/design-system.css +23 -13
  155. package/src/features/agents/components/__tests__/agents-page.test.tsx +36 -24
  156. package/src/features/agents/components/agent-advanced-config-fields.tsx +7 -7
  157. package/src/features/agents/components/agent-details-dialog.tsx +8 -8
  158. package/src/features/agents/components/agent-dialogs.tsx +7 -7
  159. package/src/features/agents/components/agents-page.tsx +42 -62
  160. package/src/features/chat/components/chat-sidebar-list-mode-switch.tsx +2 -2
  161. package/src/features/chat/components/conversation/__tests__/chat-conversation-content.test.tsx +46 -4
  162. package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +17 -1
  163. package/src/features/chat/components/conversation/__tests__/chat-conversation-panel.test.tsx +8 -22
  164. package/src/features/chat/components/conversation/__tests__/chat-conversation-workspace-section.test.tsx +69 -3
  165. package/src/features/chat/components/conversation/chat-conversation-content.tsx +24 -11
  166. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +30 -31
  167. package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
  168. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +1 -8
  169. package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +16 -4
  170. package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +23 -0
  171. package/src/features/chat/components/layout/__tests__/chat-sidebar-read-state.test.tsx +1 -1
  172. package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +52 -0
  173. package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +6 -0
  174. package/src/features/chat/components/layout/__tests__/chat-sidebar.test.tsx +11 -17
  175. package/src/features/chat/components/layout/chat-page-shell.tsx +7 -15
  176. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +32 -42
  177. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +16 -67
  178. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +1 -4
  179. package/src/features/chat/components/providers/chat-presenter.provider.tsx +2 -0
  180. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +84 -12
  181. package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +258 -9
  182. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +51 -34
  183. package/src/features/chat/features/conversation/components/session-conversation-input.tsx +50 -39
  184. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +128 -1
  185. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-input-state.test.tsx +67 -1
  186. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-slash-commands.test.tsx +4 -0
  187. package/src/features/chat/features/conversation/hooks/__tests__/use-session-provider-model-catalog.test.tsx +109 -0
  188. package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +46 -0
  189. package/src/features/chat/features/conversation/hooks/use-session-conversation-composer-nodes.ts +26 -0
  190. package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +45 -12
  191. package/src/features/chat/features/conversation/hooks/use-session-conversation-input-attachments.ts +1 -0
  192. package/src/features/chat/features/conversation/hooks/use-session-conversation-input-query.ts +28 -3
  193. package/src/features/chat/features/conversation/hooks/use-session-conversation-input-state.ts +91 -37
  194. package/src/features/chat/features/conversation/hooks/use-session-conversation-recovery-actions.ts +64 -0
  195. package/src/features/chat/features/conversation/hooks/use-session-conversation-slash-commands.ts +2 -0
  196. package/src/features/chat/features/conversation/hooks/use-session-provider-model-catalog.ts +84 -0
  197. package/src/features/chat/features/conversation/utils/__tests__/session-message-composer.utils.test.ts +34 -0
  198. package/src/features/chat/features/conversation/utils/session-conversation-input-toolbar.utils.ts +18 -0
  199. package/src/features/chat/features/conversation/utils/session-message-composer.utils.ts +117 -0
  200. package/src/features/chat/features/conversation/utils/session-queued-input.utils.ts +10 -97
  201. package/src/features/chat/features/input/input-surface-plugins/__tests__/slash-command-plugin.test.ts +2 -1
  202. package/src/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils.ts +3 -1
  203. package/src/features/chat/features/input/utils/__tests__/chat-composer-state.utils.test.ts +22 -1
  204. package/src/features/chat/features/input/utils/__tests__/chat-inline-token.utils.test.ts +23 -0
  205. package/src/features/chat/features/input/utils/__tests__/chat-input-bar.utils.test.ts +105 -0
  206. package/src/features/chat/features/input/utils/chat-composer-state.utils.ts +27 -2
  207. package/src/features/chat/features/input/utils/chat-composer-token-protocol.utils.ts +5 -0
  208. package/src/features/chat/features/input/utils/chat-inline-token.utils.ts +97 -32
  209. package/src/features/chat/features/input/utils/chat-input-bar.utils.ts +1 -1
  210. package/src/features/chat/features/input/utils/chat-input-toolbar.utils.ts +64 -10
  211. package/src/features/chat/features/message/components/__tests__/chat-message-assistant-header.container.test.tsx +149 -0
  212. package/src/features/chat/features/message/components/__tests__/chat-message-inline-editor.test.tsx +59 -0
  213. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +123 -90
  214. package/src/features/chat/features/message/components/__tests__/chat-message-timeline-dividers.test.tsx +43 -0
  215. package/src/features/chat/features/message/components/chat-message-inline-editor.tsx +111 -0
  216. package/src/features/chat/features/message/components/chat-message-list.container.tsx +81 -172
  217. package/src/features/chat/features/message/components/chat-message-timeline-dividers.tsx +75 -0
  218. package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +125 -0
  219. package/src/features/chat/features/message/hooks/use-chat-message-actions.tsx +187 -0
  220. package/src/features/chat/features/message/utils/__tests__/chat-message-action-targets.utils.test.ts +89 -0
  221. package/src/features/chat/features/message/utils/__tests__/chat-message-timeline-compaction.utils.test.ts +194 -0
  222. package/src/features/chat/features/message/utils/__tests__/chat-message-timeline-continuation-compaction.utils.test.ts +167 -0
  223. package/src/features/chat/features/message/utils/__tests__/chat-message-timeline.utils.test.ts +203 -0
  224. package/src/features/chat/features/message/utils/__tests__/chat-message.utils.test.ts +26 -0
  225. package/src/features/chat/features/message/utils/chat-message-action-targets.utils.ts +28 -0
  226. package/src/features/chat/features/message/utils/chat-message-part.utils.ts +38 -0
  227. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +1 -0
  228. package/src/features/chat/features/message/utils/chat-message-timeline.utils.ts +204 -7
  229. package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-agent-runtime.test.tsx +180 -1
  230. package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-session-conversation.test.tsx +184 -10
  231. package/src/features/chat/features/ncp/hooks/use-hydrated-ncp-agent.integration.test.tsx +57 -0
  232. package/src/features/chat/features/ncp/hooks/use-ncp-session-conversation.ts +90 -1
  233. package/src/features/chat/features/ncp/utils/__tests__/ncp-chat-query-derived.utils.test.ts +110 -0
  234. package/src/features/chat/features/ncp/utils/ncp-chat-query-derived.utils.ts +65 -3
  235. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +10 -10
  236. package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +2 -2
  237. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +17 -0
  238. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +63 -54
  239. package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +1 -1
  240. package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +1 -1
  241. package/src/features/chat/features/session/components/session-header/chat-session-switcher-groups.tsx +1 -1
  242. package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +1 -1
  243. package/src/features/chat/features/session/hooks/__tests__/use-selected-session-context-window-indicator.test.tsx +87 -0
  244. package/src/features/chat/features/session/utils/__tests__/chat-session-display.utils.test.ts +26 -0
  245. package/src/features/chat/features/session/utils/__tests__/ncp-session-adapter.utils.test.ts +23 -2
  246. package/src/features/chat/features/session/utils/chat-context-window-indicator.utils.ts +44 -5
  247. package/src/features/chat/features/session/utils/chat-session-display.utils.ts +48 -12
  248. package/src/features/chat/features/session/utils/ncp-session-adapter.utils.ts +23 -4
  249. package/src/features/chat/features/session/utils/ncp-session-context-metadata.utils.ts +42 -4
  250. package/src/features/chat/features/welcome/components/__tests__/chat-conversation-welcome.test.tsx +6 -0
  251. package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +27 -9
  252. package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +1 -1
  253. package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +11 -17
  254. package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +37 -0
  255. package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +1 -1
  256. package/src/features/chat/features/welcome/components/chat-welcome.tsx +35 -33
  257. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-project-options.utils.test.ts +22 -6
  258. package/src/features/chat/features/welcome/utils/chat-welcome-project-options.utils.ts +13 -0
  259. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +73 -3
  260. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +22 -2
  261. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-text-selection.test.tsx +75 -0
  262. package/src/features/chat/features/workspace/components/__tests__/workspace-text-selection-menu.test.tsx +102 -0
  263. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +145 -26
  264. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +42 -18
  265. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +50 -10
  266. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +48 -22
  267. package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +13 -2
  268. package/src/features/chat/features/workspace/components/workspace-text-selection-menu.tsx +223 -0
  269. package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +80 -0
  270. package/src/features/chat/features/workspace/utils/__tests__/workspace-text-excerpt.utils.test.ts +54 -0
  271. package/src/features/chat/features/workspace/utils/chat-thread-workspace-session.utils.ts +47 -0
  272. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +16 -0
  273. package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +22 -1
  274. package/src/features/chat/features/workspace/utils/workspace-text-excerpt.utils.ts +53 -0
  275. package/src/features/chat/index.ts +1 -0
  276. package/src/features/chat/managers/__tests__/chat-composer-intent.manager.test.ts +106 -0
  277. package/src/features/chat/managers/__tests__/chat-session-list.manager.test.ts +53 -5
  278. package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +93 -1
  279. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +3 -10
  280. package/src/features/chat/managers/__tests__/provider-model-catalog-notice.manager.test.ts +57 -0
  281. package/src/features/chat/managers/chat-composer-intent.manager.ts +145 -0
  282. package/src/features/chat/managers/chat-session-list.manager.ts +14 -25
  283. package/src/features/chat/managers/chat-thread.manager.ts +32 -16
  284. package/src/features/chat/managers/provider-model-catalog-notice.manager.ts +121 -0
  285. package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +3 -9
  286. package/src/features/chat/pages/ncp-chat-page.tsx +0 -1
  287. package/src/features/chat/presenters/chat.presenter.ts +3 -0
  288. package/src/features/chat/stores/__tests__/chat-composer-draft.store.test.ts +55 -0
  289. package/src/features/chat/stores/chat-composer-draft.store.ts +92 -0
  290. package/src/features/chat/stores/chat-thread.store.ts +2 -4
  291. package/src/features/chat/types/chat-input-bar.types.ts +6 -0
  292. package/src/features/chat/types/chat-input.types.ts +5 -0
  293. package/src/features/chat/types/chat-message.types.ts +5 -0
  294. package/src/features/cron/components/__tests__/cron-config.test.tsx +100 -19
  295. package/src/features/cron/components/cron-config.tsx +19 -33
  296. package/src/features/cron/components/cron-job-detail-dialog.tsx +42 -16
  297. package/src/features/cron/components/cron-job-row.tsx +18 -1
  298. package/src/features/cron/components/cron-task-discovery.tsx +1 -1
  299. package/src/features/inbox/components/inbox-delivery-content.test.tsx +8 -2
  300. package/src/features/inbox/components/inbox-delivery-content.tsx +1 -1
  301. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +10 -4
  302. package/src/features/inbox/components/inbox-reader-dialog.tsx +37 -61
  303. package/src/features/inbox/pages/inbox-page.tsx +90 -98
  304. package/src/features/marketplace/components/marketplace-page-parts.tsx +1 -1
  305. package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +31 -6
  306. package/src/features/notifications/components/app-notification-toast.tsx +54 -15
  307. package/src/features/notifications/managers/__tests__/app-notification.manager.test.ts +2 -0
  308. package/src/features/notifications/managers/app-notification.manager.ts +3 -0
  309. package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
  310. package/src/features/panel-apps/components/panel-app-toolbar.tsx +2 -2
  311. package/src/features/panel-apps/components/panel-apps-list.tsx +4 -4
  312. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +1 -0
  313. package/src/features/pwa/managers/__tests__/pwa-shell-theme.manager.test.ts +9 -0
  314. package/src/features/pwa/managers/pwa-shell-theme.manager.ts +1 -0
  315. package/src/features/service-apps/components/__tests__/service-apps-panel.test.tsx +5 -4
  316. package/src/features/service-apps/components/service-app-list-item.tsx +470 -0
  317. package/src/features/service-apps/components/service-apps-panel.tsx +76 -490
  318. package/src/features/settings/components/config/__tests__/provider-models-section.test.tsx +239 -0
  319. package/src/features/settings/components/config/provider-auth-section.tsx +90 -59
  320. package/src/features/settings/components/config/provider-form-detail-pane.tsx +307 -0
  321. package/src/features/settings/components/config/provider-form.tsx +149 -367
  322. package/src/features/settings/components/config/provider-model-list.tsx +293 -0
  323. package/src/features/settings/components/config/provider-model-suggestions-panel.tsx +151 -0
  324. package/src/features/settings/components/config/provider-models-section.tsx +178 -149
  325. package/src/features/settings/components/config/provider-status-badge.tsx +4 -2
  326. package/src/features/settings/hooks/__tests__/use-provider-connectivity.test.tsx +98 -0
  327. package/src/features/settings/hooks/__tests__/use-provider-model-suggestions.test.tsx +107 -0
  328. package/src/features/settings/hooks/use-provider-connectivity.ts +132 -0
  329. package/src/features/settings/hooks/use-provider-model-suggestions.ts +51 -0
  330. package/src/features/settings/pages/__tests__/appearance-settings-page.test.tsx +2 -2
  331. package/src/features/settings/pages/__tests__/providers-config-page.test.tsx +12 -0
  332. package/src/features/settings/pages/__tests__/search-config-page.test.tsx +48 -0
  333. package/src/features/settings/pages/providers-config-page.tsx +2 -1
  334. package/src/features/settings/pages/search-config-page.tsx +17 -8
  335. package/src/features/settings/utils/__tests__/provider-form-support.utils.test.ts +42 -0
  336. package/src/features/settings/utils/provider-form-context.utils.ts +2 -0
  337. package/src/features/settings/utils/provider-form-model.utils.ts +25 -0
  338. package/src/features/settings/utils/provider-form-support.utils.ts +21 -5
  339. package/src/index.css +1 -1
  340. package/src/platforms/desktop/types/desktop-update.types.ts +5 -0
  341. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +13 -7
  342. package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +18 -20
  343. package/src/shared/components/actions/__tests__/navigation-link.test.tsx +14 -3
  344. package/src/shared/components/actions/navigation-link.tsx +35 -15
  345. package/src/shared/components/common/__tests__/agent-avatar.test.tsx +3 -2
  346. package/src/shared/components/common/agent-avatar.tsx +3 -3
  347. package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +66 -0
  348. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +5 -2
  349. package/src/shared/components/doc-browser/doc-browser-renderer.types.ts +1 -0
  350. package/src/shared/components/doc-browser/doc-browser.tsx +9 -0
  351. package/src/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration.ts +126 -0
  352. package/src/shared/components/path-picker/server-path-picker-directory-list.tsx +1 -1
  353. package/src/shared/components/path-picker/server-path-picker-locations.tsx +1 -1
  354. package/src/shared/components/path-picker/server-path-picker-navigation-bar.tsx +3 -3
  355. package/src/shared/components/settings/settings-page.tsx +1 -1
  356. package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +1 -1
  357. package/src/shared/components/ui/actions/icon-action-button.tsx +1 -1
  358. package/src/shared/components/ui/button.tsx +4 -4
  359. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +103 -0
  360. package/src/shared/components/ui/context-menu/context-menu.tsx +263 -0
  361. package/src/shared/components/ui/dialog.tsx +1 -1
  362. package/src/shared/components/ui/input.tsx +1 -1
  363. package/src/shared/components/ui/scroll-area.tsx +2 -0
  364. package/src/shared/components/ui/select.tsx +1 -1
  365. package/src/shared/components/ui/switch.tsx +1 -1
  366. package/src/shared/components/ui/tab-strip/__tests__/compact-tab-strip.test.tsx +19 -6
  367. package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +28 -67
  368. package/src/shared/components/ui/tabs.tsx +1 -1
  369. package/src/shared/components/ui/textarea.tsx +1 -1
  370. package/src/shared/hooks/use-config.ts +33 -1
  371. package/src/shared/lib/api/__tests__/ncp-session-query-cache.utils.test.ts +26 -0
  372. package/src/shared/lib/api/ncp-session-query-cache.utils.ts +7 -10
  373. package/src/shared/lib/api/ncp-session.types.ts +7 -0
  374. package/src/shared/lib/api/types.ts +38 -1
  375. package/src/shared/lib/api/utils/config.utils.ts +14 -0
  376. package/src/shared/lib/cron/cron-job-view.utils.ts +4 -0
  377. package/src/shared/lib/host-capabilities/__tests__/host-capability.manager.test.ts +26 -0
  378. package/src/shared/lib/host-capabilities/host-capability.manager.ts +28 -0
  379. package/src/shared/lib/i18n/locales/en-US/chat.json +45 -17
  380. package/src/shared/lib/i18n/locales/en-US/core.json +26 -0
  381. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +1 -0
  382. package/src/shared/lib/i18n/locales/en-US/search.json +1 -0
  383. package/src/shared/lib/i18n/locales/zh-CN/chat.json +45 -17
  384. package/src/shared/lib/i18n/locales/zh-CN/core.json +26 -0
  385. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +1 -0
  386. package/src/shared/lib/i18n/locales/zh-CN/search.json +1 -0
  387. package/src/shared/lib/provider-models/__tests__/anonymous-provider-configuration.test.ts +40 -0
  388. package/src/shared/lib/provider-models/index.ts +4 -3
  389. package/src/shared/lib/session-project/__tests__/workspace-file-breadcrumb.test.ts +28 -1
  390. package/src/shared/lib/session-project/workspace-file-breadcrumb.utils.ts +23 -0
  391. package/src/shared/lib/theme/index.test.ts +11 -0
  392. package/src/shared/lib/theme/index.ts +2 -0
  393. package/dist/assets/api-CHo2gekJ.js +0 -13
  394. package/dist/assets/app-presenter-provider-2_DmWYT9.js +0 -108
  395. package/dist/assets/app-presenter-provider-D3BuuOyZ.css +0 -1
  396. package/dist/assets/appearance-settings-page-BEy2UE7R.js +0 -1
  397. package/dist/assets/architecture-TIHT7OUA-Cii4JyA2.js +0 -1
  398. package/dist/assets/book-open-BrZL4o9L.js +0 -1
  399. package/dist/assets/card-B5rRLu_6.js +0 -1
  400. package/dist/assets/channel-BSKkTPe8.js +0 -1
  401. package/dist/assets/channels-list-page-C1dnm68I.js +0 -8
  402. package/dist/assets/chat-page-Dz6tvZ91.js +0 -1
  403. package/dist/assets/chunk-2Q5K7J3B-CDMOR1xZ.js +0 -1
  404. package/dist/assets/chunk-VAUOI2AC-BRvqNW76.js +0 -1
  405. package/dist/assets/chunk-XXDRQBXY-CwX_mqJ3.js +0 -1
  406. package/dist/assets/classDiagram-OUVF2IWQ-RzbGxG77.js +0 -1
  407. package/dist/assets/classDiagram-v2-EOCWNBFH-C_gWB7WT.js +0 -1
  408. package/dist/assets/config-split-page-6y6W6dz4.js +0 -1
  409. package/dist/assets/confirm-dialog-q1CpEmR8.js +0 -5
  410. package/dist/assets/cynefin-VYW2F7L2-fSLIS0X3.js +0 -1
  411. package/dist/assets/desktop-update-config-DrdlwP4j.js +0 -1
  412. package/dist/assets/dist-C9EX46wM.js +0 -41
  413. package/dist/assets/doc-browser-BfttDSti.js +0 -1
  414. package/dist/assets/doc-browser-DH-3hDnI.js +0 -1
  415. package/dist/assets/doc-browser-context-TU2heon0.js +0 -1
  416. package/dist/assets/eventmodeling-45OFAUF4-XVcQGgha.js +0 -1
  417. package/dist/assets/eye-B-3dyZNA.js +0 -1
  418. package/dist/assets/flowDiagram-23GEKE2U-BiFSctqz.js +0 -1
  419. package/dist/assets/gitGraph-TEB2WS4Q-C014uXqS.js +0 -1
  420. package/dist/assets/host-capabilities-B-TtABsP.js +0 -1
  421. package/dist/assets/index-CXDPLDFD.css +0 -1
  422. package/dist/assets/index-k_eWScvN.js +0 -2
  423. package/dist/assets/info-DKCQHKI2-CQ2qjGhU.js +0 -1
  424. package/dist/assets/loader-circle-B35NlHTI.js +0 -1
  425. package/dist/assets/logo-badge-DB51c0cS.js +0 -1
  426. package/dist/assets/mcp-marketplace-page-CkPtwPBk.js +0 -1
  427. package/dist/assets/mcp-marketplace-page-DWtsIqml.js +0 -9
  428. package/dist/assets/model-config-page-D6cGNnMM.js +0 -1
  429. package/dist/assets/navigation-link-BSJEUiwD.js +0 -1
  430. package/dist/assets/packet-7NZHBO7P-6IFyydij.js +0 -1
  431. package/dist/assets/pie-RZYD4A2V-spXQC_wr.js +0 -1
  432. package/dist/assets/plus-BRVe5jSJ.js +0 -1
  433. package/dist/assets/popover-Bp9IpE_N.js +0 -1
  434. package/dist/assets/provider-models-CXUgDxGR.js +0 -1
  435. package/dist/assets/provider-scoped-model-input-dk7fz9NL.js +0 -1
  436. package/dist/assets/providers-config-page-DTP2YfxA.js +0 -1
  437. package/dist/assets/radar-I7S5WNFK-DWVA8lvY.js +0 -1
  438. package/dist/assets/railroad-3IZDKUUU-Ce51u8y1.js +0 -1
  439. package/dist/assets/railroad-abnf-AHOZXSZD-D7i7cqI_.js +0 -1
  440. package/dist/assets/railroad-ebnf-EBAXGLYW-BEg2hcPs.js +0 -1
  441. package/dist/assets/railroad-peg-LSFZ7HO6-CxROSzbi.js +0 -1
  442. package/dist/assets/react-D6ShNq95.js +0 -8
  443. package/dist/assets/remote-FllhXW3o.js +0 -1
  444. package/dist/assets/rotate-cw-CTC-Qszi.js +0 -1
  445. package/dist/assets/runtime-config-page-C57OLdPm.js +0 -1
  446. package/dist/assets/search-config-page-tnJXaaSr.js +0 -1
  447. package/dist/assets/security-config-S00DjFfO.js +0 -1
  448. package/dist/assets/select-CNFBf00l.js +0 -1
  449. package/dist/assets/skeleton-Dc06gatK.js +0 -1
  450. package/dist/assets/stateDiagram-v2-6OUMAXLB-Bui4RXQK.js +0 -1
  451. package/dist/assets/swimlanesDiagram-G3AALYLV-DTwUsCBz.js +0 -8
  452. package/dist/assets/tabs-BuNr8LSO.js +0 -1
  453. package/dist/assets/trash-2-GchaJuEM.js +0 -1
  454. package/dist/assets/treeView-QDETBFTQ-D5zsTiuL.js +0 -1
  455. package/dist/assets/treemap-6X3UGDF4-CR3dxqNs.js +0 -1
  456. package/dist/assets/use-config-C69rR15i.js +0 -1
  457. package/dist/assets/use-confirm-dialog-DF_EgPYx.js +0 -1
  458. package/dist/assets/use-viewport-layout-BACNZyMY.js +0 -1
  459. package/dist/assets/wardley-OPB4EBWU-LatRT_Lx.js +0 -1
  460. package/dist/assets/x-BXFquY9e.js +0 -1
  461. package/src/features/chat/features/welcome/components/chat-welcome-capability-grid.tsx +0 -59
  462. /package/dist/assets/{array-CAkJT3no.js → array-NADKd9aU.js} +0 -0
  463. /package/dist/assets/{chunk-KEIR6QF5-BgdDoWEH.js → chunk-KEIR6QF5-BuyuzJJL.js} +0 -0
  464. /package/dist/assets/{chunk-Y2CYZVJY-pTllD0P3.js → chunk-Y2CYZVJY-D_B2ZRNt.js} +0 -0
  465. /package/dist/assets/{config-hints-S3g-UVZb.js → config-hints-BcfVUMij.js} +0 -0
  466. /package/dist/assets/{cytoscape.esm-DmURt-5G.js → cytoscape.esm-BANTlgza.js} +0 -0
  467. /package/dist/assets/{defaultLocale-BKy_KP3O.js → defaultLocale-C4_L0aEs.js} +0 -0
  468. /package/dist/assets/{dist-IgNNB7K9.js → dist-DAPEIJbz.js} +0 -0
  469. /package/dist/assets/{graphlib-xw_TBHyH.js → graphlib-ChqXg0dI.js} +0 -0
  470. /package/dist/assets/{init-C9xlLIAu.js → init-D8wZg9xq.js} +0 -0
  471. /package/dist/assets/{jszip.min-Das2IAnb.js → jszip.min-CkbBfwAQ.js} +0 -0
  472. /package/dist/assets/{katex-DSy1eD2d.js → katex-TZJFa0J_.js} +0 -0
  473. /package/dist/assets/{middleware-Df-a4x-q.js → middleware-B3k-TSmZ.js} +0 -0
  474. /package/dist/assets/{path-DB0USYHi.js → path-DodfxcX7.js} +0 -0
  475. /package/dist/assets/{rough.esm-B1B52ZQS.js → rough.esm-CUaa1Rbe.js} +0 -0
  476. /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
- expect(mocks.createSession).toHaveBeenCalledWith("codex", undefined);
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
- expect(mocks.createSession).toHaveBeenCalledWith("codex", undefined);
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.getByText("Sessions")).not.toBeNull();
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
- expect(mocks.createSession).toHaveBeenCalledWith("codex", undefined);
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
- expect(mocks.createSession).toHaveBeenCalledWith("native", undefined);
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
- expect(mocks.createSession).toHaveBeenCalledWith(
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
- expect(mocks.createSession).toHaveBeenCalledWith(
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
- expect(mocks.createSession).toHaveBeenCalledWith(
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: (params: {
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="mx-auto flex h-full min-h-0 w-full max-w-[min(1180px,100%)] flex-col py-4 sm:px-6 sm:py-5">
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="mx-auto w-full max-w-[min(1120px,100%)] px-4 py-4 sm:px-6 sm:py-5">
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="mx-auto w-full max-w-[min(1180px,100%)] px-4 py-4 sm:px-6 sm:py-5">
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="mx-auto flex h-full min-h-0 w-full max-w-[min(1120px,100%)] flex-col px-4 py-4 sm:px-6 sm:py-5">
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
- Plus,
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-5 py-2",
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
- <div className={cn("pb-2", isCollapsed ? "px-0" : "px-3")}>
113
- <ul className={isCollapsed ? SIDEBAR_RAIL_STACK_CLASS : "space-y-0.5"}>
114
- {navItems.map((item) => (
115
- <li
116
- key={item.target}
117
- className={isCollapsed ? "flex justify-center" : undefined}
118
- >
119
- <SidebarNavLinkItem
120
- to={item.target}
121
- label={item.label()}
122
- icon={item.icon}
123
- density="compact"
124
- collapsed={isCollapsed}
125
- indicator={item.target === "/inbox" && unreadCount > 0}
126
- trailing={item.target === "/inbox" && unreadCount > 0
127
- ? unreadCount > 99 ? "99+" : unreadCount
128
- : undefined}
129
- />
130
- </li>
131
- ))}
132
- </ul>
133
- </div>
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-between px-5 pb-2 pt-3">
176
- <div className="text-[11px] font-medium uppercase tracking-wider text-muted-foreground/75">
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={<Plus className="h-3.5 w-3.5" />}
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-7 pt-2",
197
- SIDEBAR_SCROLL_EDGE_FADE_CLASS,
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-3",
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, type ButtonProps } from "@/shared/components/ui/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-3">
187
- <div className="flex items-center gap-2">
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={actionStyle.leftVariant}
142
+ variant="ghost"
190
143
  className={cn(
191
- "min-w-0 rounded-xl",
192
- actionStyle.leftClassName,
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-2 h-4 w-4" />
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-0.5">
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-60" />
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={cn(
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-3">
193
+ <div className="px-4 pb-2">
245
194
  <div className="relative">
246
- <Search className="pointer-events-none absolute left-3 top-2.5 h-3.5 w-3.5 text-muted-foreground/70" />
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-9 rounded-lg pl-8 text-xs"
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-transparent bg-muted pl-9 pr-3 text-[13px] shadow-none focus:border-border focus:bg-card"
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-accent hover:text-accent-foreground"
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-accent hover:text-accent-foreground"
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-xl px-3 py-2 text-[13px] font-medium text-muted-foreground transition-colors duration-base hover:bg-gray-200/60 hover:text-gray-900 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
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: (initialPrompt?: string | null) => {
210
- mocks.initialPromptSpy(initialPrompt);
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("does not replace the welcome composer just because draft send starts", () => {
323
- renderArea(null);
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
- expect(screen.getByTestId("welcome")).toBeTruthy();
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: "Run failed: Invalid API Key",
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(/出错了|Something went wrong/)).toBeTruthy();
392
- expect(screen.getByText("Run failed: Invalid API Key")).toBeTruthy();
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
  });