@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
@@ -5,6 +5,12 @@
5
5
  */
6
6
 
7
7
  @layer base {
8
+ input:focus,
9
+ textarea:focus {
10
+ outline: none;
11
+ box-shadow: none;
12
+ }
13
+
8
14
  :root {
9
15
  color-scheme: light;
10
16
 
@@ -56,6 +62,10 @@
56
62
  --foreground-tertiary: var(--gray-500);
57
63
  --foreground-muted: var(--gray-400);
58
64
 
65
+ /* Links */
66
+ --link-foreground: 211 73% 45%;
67
+ --link-foreground-hover: 211 73% 38%;
68
+
59
69
  /* Primary (Brand) */
60
70
  --primary: var(--brand-500);
61
71
  --primary-hover: var(--brand-600);
@@ -70,6 +80,9 @@
70
80
  /* Accent */
71
81
  --accent: var(--brand-50);
72
82
  --accent-foreground: var(--brand-700);
83
+ --interaction-hover: hsl(0 0% 96%);
84
+ --interaction-selection: hsl(211 100% 92%);
85
+ --interaction-selection-border: hsl(211 75% 84%);
73
86
 
74
87
  /* Muted */
75
88
  --muted: var(--gray-100);
@@ -364,19 +377,6 @@
364
377
  color: hsl(var(--gray-800));
365
378
  }
366
379
 
367
- /* User bubble is light in work theme; keep clickable skill tokens as link-colored text. */
368
- :root[data-theme="work"] .nextclaw-chat-message-user .nextclaw-chat-inline-token {
369
- border-color: transparent;
370
- background-color: transparent;
371
- color: var(--md-link, #1f73c9);
372
- box-shadow: none;
373
- }
374
-
375
- :root[data-theme="work"] .nextclaw-chat-message-user .nextclaw-chat-inline-token > span:first-child {
376
- color: currentColor;
377
- opacity: 0.8;
378
- }
379
-
380
380
  }
381
381
 
382
382
  @layer base {
@@ -717,6 +717,9 @@
717
717
  --secondary-foreground: var(--gray-800);
718
718
  --accent: 151 32% 18%;
719
719
  --accent-foreground: 148 34% 84%;
720
+ --interaction-hover: hsl(var(--gray-200));
721
+ --interaction-selection: hsl(211 48% 30%);
722
+ --interaction-selection-border: hsl(211 48% 42%);
720
723
  --muted: var(--gray-100);
721
724
  --muted-foreground: var(--gray-500);
722
725
  --destructive: 0 70% 52%;
@@ -823,6 +826,13 @@
823
826
  }
824
827
  }
825
828
 
829
+ @layer base {
830
+ :root[data-theme-appearance="dark"] {
831
+ --link-foreground: 213 94% 68%;
832
+ --link-foreground-hover: 213 97% 79%;
833
+ }
834
+ }
835
+
826
836
  @layer utilities {
827
837
  /* ========================================
828
838
  UTILITY CLASSES
@@ -1,7 +1,6 @@
1
1
  import { fireEvent, render, screen } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
3
  import { MemoryRouter } from "react-router-dom";
4
- import type * as ReactRouterDom from "react-router-dom";
5
4
  import { beforeEach, describe, expect, it, vi } from "vitest";
6
5
  import { AgentsPage } from "@/features/agents";
7
6
  import {
@@ -14,8 +13,7 @@ const mocks = vi.hoisted(() => ({
14
13
  createAgent: vi.fn(),
15
14
  updateAgent: vi.fn(),
16
15
  deleteAgent: vi.fn(),
17
- navigate: vi.fn(),
18
- requestDraft: vi.fn(),
16
+ startAgentDraftChat: vi.fn(),
19
17
  sessionTypesQuery: {
20
18
  data: {
21
19
  defaultType: "native",
@@ -117,22 +115,6 @@ function createPersistStorage() {
117
115
  };
118
116
  }
119
117
 
120
- vi.mock("react-router-dom", async (importOriginal) => {
121
- const actual = await importOriginal<typeof ReactRouterDom>();
122
- return {
123
- ...actual,
124
- useNavigate: () => mocks.navigate,
125
- };
126
- });
127
-
128
- vi.mock("@/app/components/app-presenter-provider", () => ({
129
- useAppPresenter: () => ({
130
- chatDraftIntentManager: {
131
- requestDraft: mocks.requestDraft,
132
- },
133
- }),
134
- }));
135
-
136
118
  vi.mock("@/shared/hooks/use-agents", () => ({
137
119
  useAgents: () => mocks.agentsQuery,
138
120
  useCreateAgent: () => ({
@@ -197,7 +179,12 @@ vi.mock("@/features/chat", async () => {
197
179
  ...sessionTypeUtils,
198
180
  usePresenter: () => ({
199
181
  chatSessionListManager: {
200
- startAgentDraftChat: (agentId: string) => {
182
+ startAgentDraftChat: (
183
+ agentId: string,
184
+ sessionType: string,
185
+ prompt?: string,
186
+ ) => {
187
+ mocks.startAgentDraftChat(agentId, sessionType, prompt);
201
188
  sessionListStore.useChatSessionListStore.getState().setSnapshot({
202
189
  selectedAgentId: agentId,
203
190
  selectedSessionKey: null,
@@ -231,8 +218,7 @@ describe("AgentsPage", () => {
231
218
  mocks.createAgent.mockReset();
232
219
  mocks.updateAgent.mockReset();
233
220
  mocks.deleteAgent.mockReset();
234
- mocks.navigate.mockReset();
235
- mocks.requestDraft.mockReset();
221
+ mocks.startAgentDraftChat.mockReset();
236
222
  if (!HTMLElement.prototype.hasPointerCapture) {
237
223
  HTMLElement.prototype.hasPointerCapture = () => false;
238
224
  }
@@ -263,6 +249,9 @@ describe("AgentsPage", () => {
263
249
  renderAgentsPage();
264
250
 
265
251
  expect(screen.getByText("Agent 管理台")).toBeTruthy();
252
+ expect(
253
+ screen.getByRole("heading", { level: 1, name: "Agent 管理台" }),
254
+ ).toBeTruthy();
266
255
  expect(screen.getByText("~/.nextclaw/workspace")).toBeTruthy();
267
256
  expect(screen.getAllByRole("button", { name: "开始对话" })).toHaveLength(2);
268
257
  expect(screen.getAllByRole("button", { name: "更多操作" })).toHaveLength(2);
@@ -276,8 +265,9 @@ describe("AgentsPage", () => {
276
265
 
277
266
  await user.click(screen.getByRole("button", { name: "新增 Agent" }));
278
267
 
279
- expect(mocks.navigate).toHaveBeenCalledWith("/chat");
280
- expect(mocks.requestDraft).toHaveBeenCalledWith(
268
+ expect(mocks.startAgentDraftChat).toHaveBeenCalledWith(
269
+ "main",
270
+ "native",
281
271
  expect.stringContaining("请直接创建一个默认示例 Agent,不要问我问题"),
282
272
  );
283
273
  expect(mocks.createAgent).not.toHaveBeenCalled();
@@ -288,6 +278,9 @@ describe("AgentsPage", () => {
288
278
  await user.click(detailsEditButtons[detailsEditButtons.length - 1]);
289
279
 
290
280
  expect(screen.getByText("编辑 Agent 身份")).toBeTruthy();
281
+ const editDialog = screen.getByText("编辑 Agent 身份").closest("[role='dialog']");
282
+ expect(editDialog?.className).toContain("bg-popover");
283
+ expect(editDialog?.className).not.toContain("linear-gradient");
291
284
  expect(screen.getByText("主目录保持不变")).toBeTruthy();
292
285
  expect(screen.getByDisplayValue("Researcher")).toBeTruthy();
293
286
  expect(
@@ -310,6 +303,7 @@ describe("AgentsPage", () => {
310
303
  expect(screen.queryByRole("button", { name: "保存编辑" })).toBeNull();
311
304
  const detailsDialog = screen.getByText("身份").closest("[role='dialog']");
312
305
  expect(detailsDialog?.className).toContain("sm:max-w-2xl");
306
+ expect(detailsDialog?.className).toContain("bg-popover");
313
307
  const detailLists = Array.from(detailsDialog?.querySelectorAll("dl") ?? []);
314
308
  expect(detailLists.length).toBeGreaterThan(0);
315
309
  expect(
@@ -444,6 +438,24 @@ describe("AgentsPage", () => {
444
438
  });
445
439
  });
446
440
 
441
+ it("does not silently clamp an undersized context window before saving", async () => {
442
+ const user = userEvent.setup();
443
+ renderAgentsPage();
444
+
445
+ await user.click(screen.getAllByRole("button", { name: "更多操作" })[1]);
446
+ await user.click(screen.getByRole("button", { name: "编辑" }));
447
+ await user.click(screen.getByText("高级配置"));
448
+ fireEvent.change(screen.getByLabelText("上下文窗口大小"), {
449
+ target: { value: "100" },
450
+ });
451
+ await user.click(screen.getByRole("button", { name: "保存编辑" }));
452
+
453
+ expect(mocks.updateAgent).toHaveBeenCalledWith({
454
+ agentId: "researcher",
455
+ data: expect.objectContaining({ contextTokens: 100 }),
456
+ });
457
+ });
458
+
447
459
  it("starts a draft chat with the agent selected through the session list owner", async () => {
448
460
  const user = userEvent.setup();
449
461
 
@@ -15,16 +15,16 @@ export function AgentAdvancedConfigFields({
15
15
  onChange,
16
16
  }: AgentAdvancedConfigFieldsProps) {
17
17
  return (
18
- <details className="group rounded-2xl border border-gray-200 bg-white">
19
- <summary className="flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold text-gray-800 [&::-webkit-details-marker]:hidden">
18
+ <details className="group rounded-2xl border border-border bg-card">
19
+ <summary className="flex cursor-pointer list-none items-center justify-between gap-3 px-4 py-3 text-sm font-semibold text-foreground [&::-webkit-details-marker]:hidden">
20
20
  <span className="flex min-w-0 items-center gap-2">
21
- <Settings2 className="h-4 w-4 shrink-0 text-gray-400" />
21
+ <Settings2 className="h-4 w-4 shrink-0 text-muted-foreground" />
22
22
  <span className="truncate">{t("agentsAdvancedConfigToggle")}</span>
23
23
  </span>
24
- <ChevronDown className="h-4 w-4 shrink-0 text-gray-400 transition-transform group-open:rotate-180" />
24
+ <ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground transition-transform group-open:rotate-180" />
25
25
  </summary>
26
- <div className="space-y-4 border-t border-gray-100 px-4 py-4">
27
- <p className="text-xs leading-5 text-gray-500">
26
+ <div className="space-y-4 border-t border-border/60 px-4 py-4">
27
+ <p className="text-xs leading-5 text-muted-foreground">
28
28
  {t("agentsAdvancedConfigDescription")}
29
29
  </p>
30
30
  <div className="grid gap-4 md:grid-cols-2">
@@ -53,7 +53,7 @@ function AgentNumberField(props: {
53
53
  const { label, value, min, step, disabled, onChange } = props;
54
54
 
55
55
  return (
56
- <label className="space-y-2 text-sm font-medium text-gray-700">
56
+ <label className="space-y-2 text-sm font-medium text-foreground">
57
57
  <span>{label}</span>
58
58
  <Input
59
59
  type="number"
@@ -74,7 +74,7 @@ export function AgentDetailsDialog({
74
74
 
75
75
  return (
76
76
  <Dialog open={agent !== null} onOpenChange={onOpenChange}>
77
- <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-white p-0 sm:max-h-[720px] sm:max-w-2xl">
77
+ <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[720px] sm:max-w-2xl">
78
78
  <div className="shrink-0 px-5 pb-3 pt-5">
79
79
  <DialogHeader className="text-left">
80
80
  <div className="flex min-w-0 items-center gap-3">
@@ -321,9 +321,9 @@ function DetailSection(props: {
321
321
  const { icon: Icon, title, children } = props;
322
322
 
323
323
  return (
324
- <section className="space-y-2 border-t border-gray-100 pt-3 first:border-t-0 first:pt-0">
325
- <h3 className="flex items-center gap-1.5 text-xs font-semibold leading-5 text-gray-900">
326
- <Icon className="h-3.5 w-3.5 text-gray-400" />
324
+ <section className="space-y-2 border-t border-border/60 pt-3 first:border-t-0 first:pt-0">
325
+ <h3 className="flex items-center gap-1.5 text-xs font-semibold leading-5 text-foreground">
326
+ <Icon className="h-3.5 w-3.5 text-muted-foreground" />
327
327
  {title}
328
328
  </h3>
329
329
  <dl className="grid min-w-0 gap-x-6 gap-y-2.5 pl-5 sm:grid-cols-2">
@@ -361,15 +361,15 @@ function DetailItem(props: {
361
361
  )}
362
362
  >
363
363
  <dt className="flex min-w-0 items-baseline leading-5">
364
- <span className="whitespace-nowrap text-xs font-medium text-gray-500">
364
+ <span className="whitespace-nowrap text-xs font-medium text-muted-foreground">
365
365
  {label}
366
366
  </span>
367
367
  </dt>
368
368
  <dd
369
369
  className={cn(
370
- "min-w-0 break-words text-xs leading-5 text-gray-900",
370
+ "min-w-0 break-words text-xs leading-5 text-foreground",
371
371
  isStructuredValue
372
- ? "max-h-28 overflow-auto whitespace-pre-wrap rounded bg-gray-50/70 px-2 py-1.5 text-left"
372
+ ? "max-h-28 overflow-auto whitespace-pre-wrap rounded bg-muted/50 px-2 py-1.5 text-left"
373
373
  : "",
374
374
  )}
375
375
  >
@@ -387,7 +387,7 @@ function SourceBadge({ source }: { source: DetailSource }) {
387
387
  <span
388
388
  className={cn(
389
389
  "ml-1 whitespace-nowrap text-xs font-normal leading-5",
390
- source === "override" ? "text-blue-500" : "text-gray-400",
390
+ source === "override" ? "text-blue-500" : "text-muted-foreground",
391
391
  )}
392
392
  >
393
393
  ({source === "override"
@@ -138,7 +138,7 @@ function AgentRuntimeSelectField({
138
138
  </SelectContent>
139
139
  </Select>
140
140
  {helperText ? (
141
- <p className="text-xs text-gray-500">{helperText}</p>
141
+ <p className="text-xs text-muted-foreground">{helperText}</p>
142
142
  ) : null}
143
143
  </div>
144
144
  );
@@ -238,8 +238,8 @@ function AgentCreateDialogContent(props: {
238
238
  );
239
239
 
240
240
  return (
241
- <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-[linear-gradient(180deg,#fff9f1_0%,#ffffff_24%)] p-0 sm:max-h-[760px] sm:max-w-xl">
242
- <div className="shrink-0 border-b border-[#f0e2c8] px-6 py-6">
241
+ <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[760px] sm:max-w-xl">
242
+ <div className="shrink-0 border-b border-border px-6 py-6">
243
243
  <DialogHeader className="text-left">
244
244
  <DialogTitle>{t("agentsCreateDialogTitle")}</DialogTitle>
245
245
  <DialogDescription>
@@ -319,7 +319,7 @@ function AgentCreateDialogContent(props: {
319
319
  />
320
320
  </div>
321
321
  </div>
322
- <DialogFooter className="shrink-0 border-t border-[#f1e7d4] px-6 py-5">
322
+ <DialogFooter className="shrink-0 border-t border-border px-6 py-5">
323
323
  <Button
324
324
  type="button"
325
325
  variant="ghost"
@@ -366,8 +366,8 @@ function AgentEditDialogContent(props: {
366
366
  );
367
367
 
368
368
  return (
369
- <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-[linear-gradient(180deg,#fff9f1_0%,#ffffff_24%)] p-0 sm:max-h-[760px] sm:max-w-xl">
370
- <div className="shrink-0 border-b border-[#f0e2c8] px-6 py-6">
369
+ <DialogContent className="flex max-h-[calc(100vh-2rem)] flex-col overflow-hidden border-none bg-popover p-0 sm:max-h-[760px] sm:max-w-xl">
370
+ <div className="shrink-0 border-b border-border px-6 py-6">
371
371
  <DialogHeader className="text-left">
372
372
  <DialogTitle>{t("agentsEditDialogTitle")}</DialogTitle>
373
373
  <DialogDescription>
@@ -447,7 +447,7 @@ function AgentEditDialogContent(props: {
447
447
  />
448
448
  </div>
449
449
  </div>
450
- <DialogFooter className="shrink-0 border-t border-[#f1e7d4] px-6 py-5">
450
+ <DialogFooter className="shrink-0 border-t border-border px-6 py-5">
451
451
  <Button
452
452
  type="button"
453
453
  variant="ghost"
@@ -1,5 +1,4 @@
1
1
  import { useMemo, useState } from "react";
2
- import { useNavigate } from "react-router-dom";
3
2
  import {
4
3
  useDeleteAgent,
5
4
  useAgents,
@@ -20,7 +19,6 @@ import {
20
19
  usePresenter,
21
20
  useNcpChatSessionTypes,
22
21
  } from "@/features/chat";
23
- import { useAppPresenter } from "@/app/components/app-presenter-provider";
24
22
  import { AgentAvatar } from "@/shared/components/common/agent-avatar";
25
23
  import { Button } from "@/shared/components/ui/button";
26
24
  import { Card, CardContent } from "@/shared/components/ui/card";
@@ -30,7 +28,7 @@ import {
30
28
  PopoverTrigger,
31
29
  } from "@/shared/components/ui/popover";
32
30
  import { TagChip } from "@/shared/components/tags/tag-chip";
33
- import { PageLayout } from "@/app/components/layout/page-layout";
31
+ import { PageHeader, PageLayout } from "@/app/components/layout/page-layout";
34
32
  import { t } from "@/shared/lib/i18n";
35
33
  import { buildProviderModelCatalog } from "@/shared/lib/provider-models";
36
34
  import { cn } from "@/shared/lib/utils";
@@ -51,7 +49,7 @@ import { toast } from "sonner";
51
49
  const AGENT_CREATION_PROMPT =
52
50
  "请直接创建一个默认示例 Agent,不要问我问题。创建完成后,简单告诉我它能做什么。";
53
51
 
54
- function parseOptionalIntegerField(value: string, min: number): number | null {
52
+ function parseOptionalIntegerField(value: string): number | null {
55
53
  const trimmed = value.trim();
56
54
  if (!trimmed) {
57
55
  return null;
@@ -60,7 +58,7 @@ function parseOptionalIntegerField(value: string, min: number): number | null {
60
58
  if (!Number.isFinite(parsed)) {
61
59
  throw new Error(t("agentsAdvancedInvalidNumberError"));
62
60
  }
63
- return Math.max(min, Math.trunc(parsed));
61
+ return Math.trunc(parsed);
64
62
  }
65
63
 
66
64
  function buildAgentUpdateRequest(
@@ -74,41 +72,10 @@ function buildAgentUpdateRequest(
74
72
  ...(form.runtime.trim()
75
73
  ? { runtime: form.runtime.trim() }
76
74
  : { runtime: "" }),
77
- contextTokens: parseOptionalIntegerField(form.contextTokens, 1000),
75
+ contextTokens: parseOptionalIntegerField(form.contextTokens),
78
76
  };
79
77
  }
80
78
 
81
- function AgentsHero(props: { agentCount: number; onCreate: () => void }) {
82
- const { agentCount, onCreate } = props;
83
-
84
- return (
85
- <section className="flex flex-col gap-3 border-b border-gray-200 pb-4 sm:flex-row sm:items-end sm:justify-between">
86
- <div className="min-w-0 space-y-1">
87
- <div className="flex flex-wrap items-center gap-2">
88
- <h1 className="text-xl font-semibold text-gray-950">
89
- {t("agentsHeroEyebrow")}
90
- </h1>
91
- <span className="rounded-full border border-gray-200 bg-white px-2 py-0.5 text-xs font-medium text-gray-500">
92
- {agentCount}
93
- </span>
94
- </div>
95
- <p className="max-w-2xl text-sm leading-6 text-gray-500">
96
- {t("agentsHeroDescription")}
97
- </p>
98
- </div>
99
- <Button
100
- type="button"
101
- variant="primary"
102
- className="h-9 shrink-0 rounded-xl px-4 text-sm font-semibold"
103
- onClick={onCreate}
104
- >
105
- <Plus className="mr-2 h-4 w-4" />
106
- {t("agentsCreateButton")}
107
- </Button>
108
- </section>
109
- );
110
- }
111
-
112
79
  function AgentActionMenuItem(props: {
113
80
  icon: typeof Pencil;
114
81
  label: string;
@@ -131,7 +98,7 @@ function AgentActionMenuItem(props: {
131
98
  "flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50",
132
99
  destructive
133
100
  ? "text-destructive hover:bg-destructive/10"
134
- : "text-gray-700 hover:bg-gray-100",
101
+ : "text-foreground hover:bg-muted",
135
102
  )}
136
103
  onClick={onClick}
137
104
  disabled={disabled}
@@ -172,7 +139,7 @@ function AgentListCard(props: {
172
139
  : defaultRuntimeLabel;
173
140
 
174
141
  return (
175
- <Card className="group overflow-hidden border border-gray-200 bg-white shadow-none transition-colors duration-200 hover:border-gray-300">
142
+ <Card className="group overflow-hidden border border-border bg-card shadow-none transition-colors duration-200 hover:border-border/80">
176
143
  <CardContent className="relative flex h-full flex-col gap-3 px-3.5 py-3.5">
177
144
  <div className="flex items-start gap-2.5 pr-16">
178
145
  <AgentAvatar
@@ -183,7 +150,7 @@ function AgentListCard(props: {
183
150
  />
184
151
  <div className="min-w-0 flex-1 space-y-0.5">
185
152
  <div className="flex min-w-0 items-center gap-2">
186
- <div className="truncate text-sm font-semibold text-gray-950">
153
+ <div className="truncate text-sm font-semibold text-foreground">
187
154
  {agent.displayName?.trim() || agent.id}
188
155
  </div>
189
156
  {agent.builtIn ? (
@@ -196,7 +163,7 @@ function AgentListCard(props: {
196
163
  </TagChip>
197
164
  ) : null}
198
165
  </div>
199
- <div className="truncate text-xs text-gray-400">@{agent.id}</div>
166
+ <div className="truncate text-xs text-muted-foreground">@{agent.id}</div>
200
167
  </div>
201
168
  </div>
202
169
 
@@ -205,7 +172,7 @@ function AgentListCard(props: {
205
172
  type="button"
206
173
  variant="ghost"
207
174
  size="icon"
208
- className="h-8 w-8 rounded-lg text-gray-400 hover:text-gray-800"
175
+ className="h-8 w-8 rounded-lg text-muted-foreground hover:text-foreground"
209
176
  aria-label={t("agentsCardStartChat")}
210
177
  title={t("agentsCardStartChat")}
211
178
  onClick={onStartChat}
@@ -218,7 +185,7 @@ function AgentListCard(props: {
218
185
  type="button"
219
186
  variant="ghost"
220
187
  size="icon"
221
- className="h-8 w-8 rounded-lg text-gray-400 hover:text-gray-800"
188
+ className="h-8 w-8 rounded-lg text-muted-foreground hover:text-foreground"
222
189
  aria-label={t("chatSessionMoreActions")}
223
190
  title={t("chatSessionMoreActions")}
224
191
  >
@@ -250,20 +217,20 @@ function AgentListCard(props: {
250
217
  </Popover>
251
218
  </div>
252
219
 
253
- <p className="line-clamp-2 min-h-10 text-sm leading-5 text-gray-600">
220
+ <p className="line-clamp-2 min-h-10 text-sm leading-5 text-muted-foreground">
254
221
  {agent.description?.trim() ||
255
222
  (agent.builtIn
256
223
  ? t("agentsCardBuiltInSummary")
257
224
  : t("agentsCardCustomSummary"))}
258
225
  </p>
259
226
 
260
- <div className="mt-auto grid gap-2 border-t border-gray-100 pt-2 text-xs text-gray-500">
227
+ <div className="mt-auto grid gap-2 border-t border-border/60 pt-2 text-xs text-muted-foreground">
261
228
  <div className="flex min-w-0 items-center gap-2">
262
- <Sparkles className="h-3.5 w-3.5 shrink-0 text-gray-300" />
229
+ <Sparkles className="h-3.5 w-3.5 shrink-0 text-muted-foreground/60" />
263
230
  <span className="truncate">{runtimeLabel}</span>
264
231
  </div>
265
232
  <div className="flex min-w-0 items-center gap-2">
266
- <House className="h-3.5 w-3.5 shrink-0 text-gray-300" />
233
+ <House className="h-3.5 w-3.5 shrink-0 text-muted-foreground/60" />
267
234
  <span className="truncate">{agent.workspace ?? "-"}</span>
268
235
  </div>
269
236
  </div>
@@ -274,8 +241,6 @@ function AgentListCard(props: {
274
241
 
275
242
  export function AgentsPage() {
276
243
  const presenter = usePresenter();
277
- const appPresenter = useAppPresenter();
278
- const navigate = useNavigate();
279
244
  const agentsQuery = useAgents();
280
245
  const configQuery = useConfig();
281
246
  const providersQuery = useProviders();
@@ -362,34 +327,49 @@ export function AgentsPage() {
362
327
  );
363
328
  };
364
329
  const requestAgentCreationDraft = () => {
365
- navigate("/chat");
366
- appPresenter.chatDraftIntentManager.requestDraft(AGENT_CREATION_PROMPT);
330
+ presenter.chatSessionListManager.startAgentDraftChat(
331
+ "main",
332
+ defaultRuntime,
333
+ AGENT_CREATION_PROMPT,
334
+ );
367
335
  };
368
336
 
369
337
  return (
370
- <PageLayout className="space-y-5">
371
- <AgentsHero
372
- agentCount={agents.length}
373
- onCreate={requestAgentCreationDraft}
338
+ <PageLayout className="space-y-6">
339
+ <PageHeader
340
+ headingLevel={1}
341
+ title={t("agentsHeroEyebrow")}
342
+ description={t("agentsHeroDescription")}
343
+ actions={(
344
+ <Button
345
+ type="button"
346
+ variant="primary"
347
+ className="h-9 shrink-0 rounded-xl px-4 text-sm font-semibold"
348
+ onClick={requestAgentCreationDraft}
349
+ >
350
+ <Plus className="mr-2 h-4 w-4" />
351
+ {t("agentsCreateButton")}
352
+ </Button>
353
+ )}
374
354
  />
375
355
 
376
356
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
377
357
  {agentsQuery.isLoading ? (
378
- <Card className="md:col-span-2 xl:col-span-3 border-dashed border-[#d9dce3] bg-white/70">
379
- <CardContent className="py-14 text-center text-sm text-gray-500">
358
+ <Card className="md:col-span-2 xl:col-span-3 border-dashed border-border bg-card/70">
359
+ <CardContent className="py-14 text-center text-sm text-muted-foreground">
380
360
  {t("agentsLoading")}
381
361
  </CardContent>
382
362
  </Card>
383
363
  ) : sortedAgents.length === 0 ? (
384
- <Card className="md:col-span-2 xl:col-span-3 overflow-hidden border-dashed border-[#d9dce3] bg-[linear-gradient(135deg,#fff7ea_0%,#f4fbff_100%)]">
364
+ <Card className="md:col-span-2 xl:col-span-3 overflow-hidden border-dashed border-border bg-gradient-subtle">
385
365
  <CardContent className="flex min-h-[240px] flex-col items-center justify-center px-6 py-14 text-center">
386
- <div className="mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-white/80 shadow-[0_18px_44px_rgba(0,0,0,0.08)]">
387
- <Bot className="h-8 w-8 text-[#d39a3b]" />
366
+ <div className="mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-card/80 shadow-[0_18px_44px_rgba(0,0,0,0.08)]">
367
+ <Bot className="h-8 w-8 text-warning" />
388
368
  </div>
389
- <div className="text-lg font-semibold text-[#2f2212]">
369
+ <div className="text-lg font-semibold text-foreground">
390
370
  {t("agentsEmpty")}
391
371
  </div>
392
- <p className="mt-2 max-w-md text-sm leading-6 text-[#78644d]">
372
+ <p className="mt-2 max-w-md text-sm leading-6 text-muted-foreground">
393
373
  {t("agentsEmptyDescription")}
394
374
  </p>
395
375
  <Button
@@ -10,7 +10,7 @@ export function ChatSidebarListModeSwitch({ isProjectFirstView, onSelectMode }:
10
10
  type="button"
11
11
  aria-pressed={!isProjectFirstView}
12
12
  onClick={() => onSelectMode('time-first')}
13
- className={cn('transition-colors', isProjectFirstView ? 'text-muted-foreground/65 hover:text-muted-foreground' : 'font-medium text-foreground')}
13
+ className={cn('rounded-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border', isProjectFirstView ? 'text-muted-foreground/65 hover:text-muted-foreground' : 'font-medium text-foreground')}
14
14
  >
15
15
  {t('chatSidebarViewTime')}
16
16
  </button>
@@ -19,7 +19,7 @@ export function ChatSidebarListModeSwitch({ isProjectFirstView, onSelectMode }:
19
19
  type="button"
20
20
  aria-pressed={isProjectFirstView}
21
21
  onClick={() => onSelectMode('project-first')}
22
- className={cn('transition-colors', isProjectFirstView ? 'font-medium text-foreground' : 'text-muted-foreground/65 hover:text-muted-foreground')}
22
+ className={cn('rounded-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border', isProjectFirstView ? 'font-medium text-foreground' : 'text-muted-foreground/65 hover:text-muted-foreground')}
23
23
  >
24
24
  {t('chatSidebarViewProject')}
25
25
  </button>