@nextclaw/ui 0.15.10 → 0.15.12

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 (360) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/assets/{abnfDiagram-VRR7QNED-BYpK0F5F.js → abnfDiagram-VRR7QNED-M4g_AyR8.js} +1 -1
  3. package/dist/assets/{aiden0z-pptx-renderer.es-D87ywFdC.js → aiden0z-pptx-renderer.es-Bd99vut2.js} +1 -1
  4. package/dist/assets/api-Bw1oLhwf.js +13 -0
  5. package/dist/assets/app-presenter-provider-DSN90VJw.js +106 -0
  6. package/dist/assets/appearance-settings-page-BDpels6a.js +1 -0
  7. package/dist/assets/{arc-DFELHWM2.js → arc-IO7WNWOB.js} +1 -1
  8. package/dist/assets/architecture-TIHT7OUA-Cii4JyA2.js +1 -0
  9. package/dist/assets/{architectureDiagram-ZJ3FMSHR-CvRhdovL.js → architectureDiagram-ZJ3FMSHR-Dc-lvdUh.js} +1 -1
  10. package/dist/assets/{blockDiagram-677ZJIJ3-DVYNkbR_.js → blockDiagram-677ZJIJ3-CcsoWpIY.js} +1 -1
  11. package/dist/assets/{book-open-w3160PZf.js → book-open-D-oLp0QJ.js} +1 -1
  12. package/dist/assets/{c4Diagram-LMCZKHZV-B1w-iwRe.js → c4Diagram-LMCZKHZV-Bsrtg6b2.js} +1 -1
  13. package/dist/assets/card-CA3ozZwW.js +1 -0
  14. package/dist/assets/channel-BSKkTPe8.js +1 -0
  15. package/dist/assets/channels-list-page-B44EWctT.js +8 -0
  16. package/dist/assets/chat-page-CH8ypOKO.js +1 -0
  17. package/dist/assets/chunk-2Q5K7J3B-CDMOR1xZ.js +1 -0
  18. package/dist/assets/{chunk-32BRIVSS-kG3lg0bC.js → chunk-32BRIVSS-Bt08t8oG.js} +1 -1
  19. package/dist/assets/{chunk-52WLFC77-BLeB7iGk.js → chunk-52WLFC77-Ddx68Xzx.js} +1 -1
  20. package/dist/assets/{chunk-5FCAYU7R-BQga1Rr7.js → chunk-5FCAYU7R-B7p9_q55.js} +1 -1
  21. package/dist/assets/{chunk-5HE753X5-DU81hkcF.js → chunk-5HE753X5-D52KvdTm.js} +1 -1
  22. package/dist/assets/{chunk-5JV3BV7I-C2bAx0m7.js → chunk-5JV3BV7I-C329h8nI.js} +1 -1
  23. package/dist/assets/{chunk-5TONJI2A-BExIIgWY.js → chunk-5TONJI2A-BZyUBxWt.js} +1 -1
  24. package/dist/assets/{chunk-5VM5RSS4-C3XB05yh.js → chunk-5VM5RSS4-BUiYXZmu.js} +1 -1
  25. package/dist/assets/{chunk-7BUUIJ7U-JiyRtrGu.js → chunk-7BUUIJ7U-B7o-mn4r.js} +1 -1
  26. package/dist/assets/{chunk-BIQX33UG-BZRV20pI.js → chunk-BIQX33UG-Bey9GoRP.js} +1 -1
  27. package/dist/assets/{chunk-C7G6YPKG-AsyDSQ9j.js → chunk-C7G6YPKG-C6tosszM.js} +1 -1
  28. package/dist/assets/{chunk-CQNSW5MT-iN-fiXVA.js → chunk-CQNSW5MT-BNrdkgGQ.js} +1 -1
  29. package/dist/assets/{chunk-CYSBUYHQ-DhC_TRzI.js → chunk-CYSBUYHQ-DHODFeyB.js} +1 -1
  30. package/dist/assets/{chunk-EMLP6XTP-QFLK8R6d.js → chunk-EMLP6XTP-BcmLjrcq.js} +1 -1
  31. package/dist/assets/{chunk-EX3LRPZG-DzUwhkCz.js → chunk-EX3LRPZG-r-_eEtJI.js} +1 -1
  32. package/dist/assets/{chunk-FWX5IMBZ-DFelpZBy.js → chunk-FWX5IMBZ-DOObDWbf.js} +2 -2
  33. package/dist/assets/{chunk-HOUHSVGY-BMPwFEwN.js → chunk-HOUHSVGY-Bd0FnbWZ.js} +1 -1
  34. package/dist/assets/{chunk-ICXQ74PX-DH8NJMok.js → chunk-ICXQ74PX-ntNwAm4_.js} +1 -1
  35. package/dist/assets/{chunk-JG7HCLWE-D-95AsO4.js → chunk-JG7HCLWE-YtRpblZN.js} +1 -1
  36. package/dist/assets/{chunk-JWPE2WC7-DIaTv8kx.js → chunk-JWPE2WC7-De5-D9ta.js} +1 -1
  37. package/dist/assets/{chunk-MOJQB5TN-BPFLzWgj.js → chunk-MOJQB5TN-CdvKhyp2.js} +1 -1
  38. package/dist/assets/{chunk-MOZMSUNE-DR_fzxG0.js → chunk-MOZMSUNE-DJMMN_lu.js} +1 -1
  39. package/dist/assets/{chunk-OGEWGWER-TIcEoPPH.js → chunk-OGEWGWER-DOFWVw3O.js} +1 -1
  40. package/dist/assets/{chunk-OSBZ3O6U-BALNvSfG.js → chunk-OSBZ3O6U-DZkrIN9r.js} +1 -1
  41. package/dist/assets/{chunk-PUDLZKDR-I-EXhf_k.js → chunk-PUDLZKDR-D1wma2Yf.js} +1 -1
  42. package/dist/assets/{chunk-Q4XR5HBZ-uvIGstBS.js → chunk-Q4XR5HBZ-CjPy94Lz.js} +1 -1
  43. package/dist/assets/{chunk-QBLGF6JB-r-TjLdxa.js → chunk-QBLGF6JB-Hy1bEgS-.js} +1 -1
  44. package/dist/assets/{chunk-R7FJI6CG-N-1LDgvy.js → chunk-R7FJI6CG-CUPIHyh-.js} +1 -1
  45. package/dist/assets/{chunk-RYQCIY6F-jxNASx65.js → chunk-RYQCIY6F-D5Ua4pcv.js} +1 -1
  46. package/dist/assets/{chunk-U6XO7XAA-Cphbuc7q.js → chunk-U6XO7XAA-DaUQcqb7.js} +1 -1
  47. package/dist/assets/{chunk-V7JOEXUC-BLEuBf1s.js → chunk-V7JOEXUC-DX2zLfQe.js} +1 -1
  48. package/dist/assets/chunk-VAUOI2AC-BRvqNW76.js +1 -0
  49. package/dist/assets/{chunk-VR4S4FIN-BAUbR0ke.js → chunk-VR4S4FIN-CFA-WQik.js} +1 -1
  50. package/dist/assets/{chunk-WYO6CB5R-Do6SJrnY.js → chunk-WYO6CB5R-Bk2HeDvJ.js} +2 -2
  51. package/dist/assets/chunk-XXDRQBXY-CwX_mqJ3.js +1 -0
  52. package/dist/assets/{chunk-YOTPTUD7-CQqvMTCr.js → chunk-YOTPTUD7-DUG4FpBN.js} +1 -1
  53. package/dist/assets/{chunk-ZGVPDNZ5-B7kWWaXv.js → chunk-ZGVPDNZ5-70JdIGo0.js} +1 -1
  54. package/dist/assets/{chunk-ZIRB5QZD-DTU0cDNh.js → chunk-ZIRB5QZD-XZdgBt5L.js} +1 -1
  55. package/dist/assets/classDiagram-OUVF2IWQ-RzbGxG77.js +1 -0
  56. package/dist/assets/classDiagram-v2-EOCWNBFH-C_gWB7WT.js +1 -0
  57. package/dist/assets/config-split-page-DskB5yAV.js +1 -0
  58. package/dist/assets/confirm-dialog-BRQpFnvD.js +5 -0
  59. package/dist/assets/{cose-bilkent-JH36ORCC-B9LrtV-q.js → cose-bilkent-JH36ORCC-B-PQoGX-.js} +1 -1
  60. package/dist/assets/cynefin-VYW2F7L2-fSLIS0X3.js +1 -0
  61. package/dist/assets/{cynefinDiagram-TSTJHNR4-BfjvW4su.js → cynefinDiagram-TSTJHNR4-BoLCPEM0.js} +1 -1
  62. package/dist/assets/{dagre-DkiXZKkL.js → dagre-D7Ie4eXr.js} +1 -1
  63. package/dist/assets/{dagre-VKFMJZFB-B1pQKQSY.js → dagre-VKFMJZFB-CKRrwZA-.js} +1 -1
  64. package/dist/assets/desktop-update-config-se0OEu06.js +1 -0
  65. package/dist/assets/{diagram-FQU43EPY-cB4EZdaP.js → diagram-FQU43EPY-CASL1J3_.js} +1 -1
  66. package/dist/assets/{diagram-G47NLZAW-CtW8im1B.js → diagram-G47NLZAW-CvLPBIzf.js} +1 -1
  67. package/dist/assets/{diagram-NH7WQ7WH-BDCtrCCm.js → diagram-NH7WQ7WH-Ba6fGdYP.js} +1 -1
  68. package/dist/assets/{diagram-OA4YK3LP-DEMJ42Gt.js → diagram-OA4YK3LP-DkpfgEjM.js} +1 -1
  69. package/dist/assets/{diagram-WEI45ONY-CdCcxSYU.js → diagram-WEI45ONY-BP5UMVsN.js} +1 -1
  70. package/dist/assets/{dist-DEJlYi0E.js → dist-f6aZEsu8.js} +1 -1
  71. package/dist/assets/doc-browser-BRiAfy_N.js +1 -0
  72. package/dist/assets/doc-browser-DW7afLXs.js +1 -0
  73. package/dist/assets/{doc-browser-context-CpvHiuQG.js → doc-browser-context-DhTa-zP_.js} +1 -1
  74. package/dist/assets/{docx-preview-zis3U0Fa.js → docx-preview-D0tp3a9T.js} +1 -1
  75. package/dist/assets/{ebnfDiagram-CCIWWBDH-DBZETBwE.js → ebnfDiagram-CCIWWBDH-TJKbUcmc.js} +1 -1
  76. package/dist/assets/{erDiagram-Q63AITRT-y2zDXprP.js → erDiagram-Q63AITRT-DzGPKkKH.js} +1 -1
  77. package/dist/assets/eventmodeling-45OFAUF4-XVcQGgha.js +1 -0
  78. package/dist/assets/eye-DMGpISEo.js +1 -0
  79. package/dist/assets/flowDiagram-23GEKE2U-BiFSctqz.js +1 -0
  80. package/dist/assets/{form-actions-5OsDRt0g.js → form-actions-SgP78YnZ.js} +1 -1
  81. package/dist/assets/{ganttDiagram-NO4QXBWP-D2DP344e.js → ganttDiagram-NO4QXBWP-JhJzsGp2.js} +1 -1
  82. package/dist/assets/gitGraph-TEB2WS4Q-C014uXqS.js +1 -0
  83. package/dist/assets/{gitGraphDiagram-IHSO6WYX-D37uiwA2.js → gitGraphDiagram-IHSO6WYX-DZ1CKMj8.js} +1 -1
  84. package/dist/assets/index-B2YF-7Yw.css +1 -0
  85. package/dist/assets/index-CBD4zQ_A.js +2 -0
  86. package/dist/assets/info-DKCQHKI2-CQ2qjGhU.js +1 -0
  87. package/dist/assets/{infoDiagram-FWYZ7A6U-CG-WAIRi.js → infoDiagram-FWYZ7A6U-BNXNKfRQ.js} +1 -1
  88. package/dist/assets/{ishikawaDiagram-FXEZZL3T-WeCTnW0f.js → ishikawaDiagram-FXEZZL3T-DoiEfjNw.js} +1 -1
  89. package/dist/assets/{journeyDiagram-5HDEW3XC-DUFBW9Td.js → journeyDiagram-5HDEW3XC-D6oK2HSy.js} +1 -1
  90. package/dist/assets/{kanban-definition-HUTT4EX6-B0lxgMpg.js → kanban-definition-HUTT4EX6-B2UnLOH-.js} +1 -1
  91. package/dist/assets/{line-B78frP_c.js → line-BM7PoxY5.js} +1 -1
  92. package/dist/assets/{linear-C6lVEcb2.js → linear-B3DiqMjk.js} +1 -1
  93. package/dist/assets/loader-circle-DEQ2CflP.js +1 -0
  94. package/dist/assets/{logo-badge-TdPa95AC.js → logo-badge-BZnxuJYW.js} +1 -1
  95. package/dist/assets/{map-Bdri5UL5.js → map-BAAdHTqR.js} +1 -1
  96. package/dist/assets/mcp-marketplace-page-B8eWiT9H.js +1 -0
  97. package/dist/assets/{mcp-marketplace-page-cm3ifaKu.js → mcp-marketplace-page-Dm08nf11.js} +2 -2
  98. package/dist/assets/{mermaid-parser.core-Cue18vLo.js → mermaid-parser.core-BeMviefY.js} +2 -2
  99. package/dist/assets/{mermaid.core-CXwWRh5i.js → mermaid.core-D0Q77r9I.js} +3 -3
  100. package/dist/assets/{mindmap-definition-LN4V7U3C-CFxz0P0-.js → mindmap-definition-LN4V7U3C-BQ7r7bR8.js} +1 -1
  101. package/dist/assets/model-config-page-k_tCjGlK.js +1 -0
  102. package/dist/assets/navigation-link-CJ3fpUBN.js +1 -0
  103. package/dist/assets/{ordinal-Cbd8t4LB.js → ordinal-Bt2N4IkA.js} +1 -1
  104. package/dist/assets/packet-7NZHBO7P-6IFyydij.js +1 -0
  105. package/dist/assets/{pegDiagram-2B236MQR-B_Qt9zyT.js → pegDiagram-2B236MQR-B-C9-LGz.js} +1 -1
  106. package/dist/assets/pie-RZYD4A2V-spXQC_wr.js +1 -0
  107. package/dist/assets/{pieDiagram-ENE6RG2P-CRQdSuwS.js → pieDiagram-ENE6RG2P-CtirZLtn.js} +1 -1
  108. package/dist/assets/plus-9_9Q74qc.js +1 -0
  109. package/dist/assets/{popover-EulxhA0q.js → popover-Cq_oB7HI.js} +1 -1
  110. package/dist/assets/provider-scoped-model-input-Cwv5zw0Z.js +1 -0
  111. package/dist/assets/providers-config-page-D82jX13I.js +1 -0
  112. package/dist/assets/{quadrantDiagram-ABIIQ3AL-D5kPpttq.js → quadrantDiagram-ABIIQ3AL-DiBWAzDU.js} +1 -1
  113. package/dist/assets/radar-I7S5WNFK-DWVA8lvY.js +1 -0
  114. package/dist/assets/railroad-3IZDKUUU-Ce51u8y1.js +1 -0
  115. package/dist/assets/railroad-abnf-AHOZXSZD-D7i7cqI_.js +1 -0
  116. package/dist/assets/railroad-ebnf-EBAXGLYW-BEg2hcPs.js +1 -0
  117. package/dist/assets/railroad-peg-LSFZ7HO6-CxROSzbi.js +1 -0
  118. package/dist/assets/{railroadDiagram-RFXS5EU6-DGh_TGlQ.js → railroadDiagram-RFXS5EU6-CP6b3PBI.js} +1 -1
  119. package/dist/assets/{react-Bb0EYsLS.js → react-BjpVlGAu.js} +1 -1
  120. package/dist/assets/{refresh-cw-CexL11m1.js → refresh-cw-CYyWovQ1.js} +1 -1
  121. package/dist/assets/remote-C2MGMI2j.js +1 -0
  122. package/dist/assets/{requirementDiagram-TGXJPOKE-EmFph0H_.js → requirementDiagram-TGXJPOKE-D8YV0-Jz.js} +1 -1
  123. package/dist/assets/rotate-cw-BkGMTudQ.js +1 -0
  124. package/dist/assets/runtime-config-page-OS6ZT2b0.js +1 -0
  125. package/dist/assets/{sankeyDiagram-HTMAVEWB-BXWB5Ugi.js → sankeyDiagram-HTMAVEWB-C2vA4ojE.js} +1 -1
  126. package/dist/assets/{save-DtccrZld.js → save-B0V_M-kz.js} +1 -1
  127. package/dist/assets/search-config-page-IzK1hMQX.js +1 -0
  128. package/dist/assets/{search-BArc_WOX.js → search-vFYD1SOf.js} +1 -1
  129. package/dist/assets/secrets-config-page-Cm3IXYpK.js +3 -0
  130. package/dist/assets/security-config-DfzQ8txL.js +1 -0
  131. package/dist/assets/{select-C9FB0jlt.js → select-BAYdPRVG.js} +1 -1
  132. package/dist/assets/{sequenceDiagram-DBY2YBRQ-ClKnO7v0.js → sequenceDiagram-DBY2YBRQ-B9LBmpUo.js} +1 -1
  133. package/dist/assets/settings-2-QX-FHs_i.js +1 -0
  134. package/dist/assets/{sizeCapture-X5ZJPWSS-DSo-t5ou.js → sizeCapture-X5ZJPWSS-9UIfya9-.js} +1 -1
  135. package/dist/assets/skeleton-2eczb2co.js +1 -0
  136. package/dist/assets/{src-Dad2ZbCt.js → src-DKf77Yzo.js} +1 -1
  137. package/dist/assets/{stateDiagram-2N3HPSRC-BvAalBfz.js → stateDiagram-2N3HPSRC-oTW44vds.js} +1 -1
  138. package/dist/assets/stateDiagram-v2-6OUMAXLB-Bui4RXQK.js +1 -0
  139. package/dist/assets/{swimlanes-5IMT3BWC-DdVqVa1a.js → swimlanes-5IMT3BWC-Cf7lcsay.js} +2 -2
  140. package/dist/assets/swimlanesDiagram-G3AALYLV-DTwUsCBz.js +8 -0
  141. package/dist/assets/{tabs-D_mjyOOf.js → tabs-Ddprun22.js} +1 -1
  142. package/dist/assets/{tag-chip-C011rd9q.js → tag-chip-C9SLhljq.js} +1 -1
  143. package/dist/assets/{timeline-definition-FHXFAJF6-D4ar8IQY.js → timeline-definition-FHXFAJF6-DoCuWKDJ.js} +1 -1
  144. package/dist/assets/{trash-2-bDhfsO1O.js → trash-2-CODUwc31.js} +1 -1
  145. package/dist/assets/treeView-QDETBFTQ-D5zsTiuL.js +1 -0
  146. package/dist/assets/treemap-6X3UGDF4-CR3dxqNs.js +1 -0
  147. package/dist/assets/{use-config-BNrlfEck.js → use-config-C5OKT3lk.js} +1 -1
  148. package/dist/assets/use-confirm-dialog-B_ZW-WgC.js +1 -0
  149. package/dist/assets/{use-viewport-layout-P0q6Nt_N.js → use-viewport-layout-OtzTlg5U.js} +1 -1
  150. package/dist/assets/{vennDiagram-L72KCM5P-CDXJ_i3p.js → vennDiagram-L72KCM5P-CpU0pzGe.js} +1 -1
  151. package/dist/assets/wardley-OPB4EBWU-LatRT_Lx.js +1 -0
  152. package/dist/assets/{wardleyDiagram-EHGQE667-D-dSuT_7.js → wardleyDiagram-EHGQE667-CkN6nn6-.js} +1 -1
  153. package/dist/assets/x-Cbfpb-Zm.js +1 -0
  154. package/dist/assets/{xychartDiagram-FW5EYKEG-C9JCzsZF.js → xychartDiagram-FW5EYKEG-DATpapm2.js} +1 -1
  155. package/dist/index.html +31 -32
  156. package/dist/runtime-icons/opencode.svg +16 -0
  157. package/package.json +10 -9
  158. package/public/runtime-icons/opencode.svg +16 -0
  159. package/src/app/components/layout/__tests__/settings-entry-page.test.tsx +6 -4
  160. package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +24 -12
  161. package/src/app/components/layout/sidebar-items.tsx +11 -2
  162. package/src/app/components/layout/sidebar.tsx +33 -234
  163. package/src/app/configs/app-navigation.config.ts +10 -24
  164. package/src/app/index.tsx +0 -5
  165. package/src/features/channels/components/config/channel-form.tsx +26 -26
  166. package/src/features/channels/components/config/weixin-channel-auth-section.tsx +6 -7
  167. package/src/features/channels/pages/__tests__/channels-list-page.test.tsx +2 -2
  168. package/src/features/channels/pages/channels-list-page.tsx +33 -32
  169. package/src/features/chat/components/conversation/__tests__/chat-conversation-content.test.tsx +68 -7
  170. package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +27 -0
  171. package/src/features/chat/components/conversation/__tests__/chat-conversation-panel.test.tsx +0 -8
  172. package/src/features/chat/components/conversation/chat-conversation-content.tsx +65 -21
  173. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +36 -12
  174. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +0 -7
  175. package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +0 -1
  176. package/src/features/chat/components/layout/__tests__/chat-sidebar.test.tsx +17 -8
  177. package/src/features/chat/components/layout/chat-page-shell.tsx +2 -2
  178. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +2 -23
  179. package/src/features/chat/components/layout/chat-sidebar.tsx +3 -12
  180. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +155 -93
  181. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +126 -93
  182. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-input-state.test.tsx +8 -0
  183. package/src/features/chat/features/conversation/hooks/use-session-conversation-input-state.ts +27 -13
  184. package/src/features/chat/features/message/components/__tests__/chat-inline-file-preview.test.tsx +15 -9
  185. package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +127 -49
  186. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +186 -20
  187. package/src/features/chat/features/message/components/chat-inline-content-surface.tsx +55 -0
  188. package/src/features/chat/features/message/components/chat-inline-file-preview.tsx +49 -71
  189. package/src/features/chat/features/message/components/chat-inline-panel-app-card.tsx +65 -55
  190. package/src/features/chat/features/message/components/chat-message-list.container.tsx +275 -267
  191. package/src/features/chat/features/message/hooks/__tests__/use-chat-message-virtualizer.test.tsx +163 -0
  192. package/src/features/chat/features/message/hooks/use-chat-message-virtualizer.ts +68 -0
  193. package/src/features/chat/features/message/utils/__tests__/chat-message-execution-summary.utils.test.ts +200 -0
  194. package/src/features/chat/features/message/utils/__tests__/chat-message-texts.utils.test.ts +14 -1
  195. package/src/features/chat/features/message/utils/__tests__/chat-message.utils.test.ts +33 -0
  196. package/src/features/chat/features/message/utils/chat-inline-panel-app-card.utils.ts +24 -9
  197. package/src/features/chat/features/message/utils/chat-message-execution-summary.utils.ts +173 -0
  198. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +43 -0
  199. package/src/features/chat/features/message/utils/chat-message-timeline.utils.ts +194 -0
  200. package/src/features/chat/features/message/utils/chat-message.utils.ts +5 -0
  201. package/src/features/chat/features/ncp/hooks/__tests__/use-ncp-session-conversation.test.tsx +151 -13
  202. package/src/features/chat/features/ncp/hooks/use-ncp-session-conversation.ts +44 -70
  203. package/src/features/chat/features/ncp/hooks/use-ncp-session-message-history.ts +197 -0
  204. package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +21 -3
  205. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +7 -7
  206. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +2 -2
  207. package/src/features/chat/features/session/components/session-context-icon.tsx +1 -1
  208. package/src/features/chat/features/session-type/components/__tests__/chat-session-type-option-item.test.tsx +5 -1
  209. package/src/features/chat/features/session-type/components/chat-session-type-option-item.tsx +1 -1
  210. package/src/features/chat/features/workspace/components/__tests__/workspace-file-content-preview.test.tsx +32 -10
  211. package/src/features/chat/features/workspace/components/workspace-file-content-preview.tsx +5 -15
  212. package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +62 -9
  213. package/src/features/chat/features/workspace/utils/chat-thread-workspace-session.utils.ts +6 -1
  214. package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +1 -25
  215. package/src/features/chat/managers/__tests__/chat-session-list.manager.test.ts +190 -109
  216. package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +9 -10
  217. package/src/features/chat/managers/chat-session-list.manager.ts +68 -27
  218. package/src/features/cron/components/__tests__/cron-config.test.tsx +260 -0
  219. package/src/features/cron/components/cron-config.tsx +392 -388
  220. package/src/features/cron/components/cron-job-detail-dialog.tsx +210 -0
  221. package/src/features/cron/components/cron-job-row.tsx +271 -0
  222. package/src/features/cron/components/cron-task-discovery.tsx +152 -0
  223. package/src/features/cron/hooks/use-cron-jobs.ts +3 -1
  224. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +3 -2
  225. package/src/features/marketplace/components/marketplace-external-skill-source-action.tsx +8 -6
  226. package/src/features/marketplace/components/mcp/mcp-marketplace-page.tsx +26 -40
  227. package/src/features/pwa/components/pwa-install-entry.tsx +45 -58
  228. package/src/features/remote/components/remote-access-page.tsx +128 -208
  229. package/src/features/settings/components/config/provider-auth-section.tsx +32 -17
  230. package/src/features/settings/components/config/provider-form.tsx +6 -6
  231. package/src/features/settings/components/config/provider-models-section.tsx +52 -46
  232. package/src/features/settings/components/config/secrets-config-form.tsx +78 -84
  233. package/src/features/settings/index.ts +0 -1
  234. package/src/features/settings/pages/__tests__/appearance-settings-page.test.tsx +35 -1
  235. package/src/features/settings/pages/__tests__/model-config-page.test.tsx +18 -1
  236. package/src/features/settings/pages/__tests__/search-config-page.test.tsx +8 -0
  237. package/src/features/settings/pages/__tests__/secrets-config-page.test.tsx +18 -17
  238. package/src/features/settings/pages/appearance-settings-page.tsx +87 -64
  239. package/src/features/settings/pages/model-config-page.tsx +75 -70
  240. package/src/features/settings/pages/providers-config-page.tsx +107 -73
  241. package/src/features/settings/pages/search-config-page.tsx +159 -152
  242. package/src/features/settings/pages/secrets-config-page.tsx +6 -1
  243. package/src/features/system-status/components/config/runtime-agent-list-card.tsx +23 -22
  244. package/src/features/system-status/components/config/runtime-binding-list-card.tsx +23 -22
  245. package/src/features/system-status/components/config/runtime-config-editor.tsx +17 -7
  246. package/src/features/system-status/components/config/runtime-config-overview.tsx +0 -3
  247. package/src/features/system-status/components/config/runtime-entry-list-card.tsx +24 -23
  248. package/src/features/system-status/components/config/runtime-settings-card.tsx +59 -52
  249. package/src/features/system-status/components/desktop-update-config.tsx +117 -112
  250. package/src/features/system-status/components/runtime-control-card.tsx +62 -59
  251. package/src/features/system-status/components/runtime-presence-card.tsx +79 -98
  252. package/src/features/system-status/components/runtime-security-card.tsx +74 -62
  253. package/src/features/system-status/components/security-config.tsx +3 -4
  254. package/src/features/system-status/pages/runtime-config-page.tsx +6 -1
  255. package/src/platforms/desktop/components/desktop-app-shell.tsx +1 -1
  256. package/src/platforms/mobile/components/mobile-settings-shell.tsx +2 -2
  257. package/src/shared/components/__tests__/config-split-page.test.tsx +15 -3
  258. package/src/shared/components/__tests__/settings-page.test.tsx +31 -0
  259. package/src/shared/components/actions/__tests__/navigation-link.test.tsx +47 -0
  260. package/src/shared/components/actions/navigation-link.tsx +116 -0
  261. package/src/shared/components/common/__tests__/brand-header.test.tsx +5 -5
  262. package/src/shared/components/common/__tests__/searchable-model-input.test.tsx +24 -0
  263. package/src/shared/components/common/brand-header.tsx +12 -10
  264. package/src/shared/components/common/searchable-model-input.tsx +9 -10
  265. package/src/shared/components/config-split-page.tsx +70 -65
  266. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +6 -7
  267. package/src/shared/components/settings/setting-row.tsx +61 -30
  268. package/src/shared/components/settings/settings-page.tsx +34 -0
  269. package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +23 -2
  270. package/src/shared/components/ui/actions/icon-action-button.tsx +9 -2
  271. package/src/shared/components/ui/overlays/sheet.tsx +142 -0
  272. package/src/shared/lib/api/ncp-session.types.ts +8 -2
  273. package/src/shared/lib/api/types.ts +22 -1
  274. package/src/shared/lib/api/utils/config.utils.ts +2 -1
  275. package/src/shared/lib/api/utils/ncp-session.utils.ts +25 -11
  276. package/src/shared/lib/i18n/locales/en-US/chat.json +31 -1
  277. package/src/shared/lib/i18n/locales/en-US/core.json +3 -3
  278. package/src/shared/lib/i18n/locales/en-US/cron.json +87 -17
  279. package/src/shared/lib/i18n/locales/zh-CN/chat.json +33 -3
  280. package/src/shared/lib/i18n/locales/zh-CN/core.json +6 -6
  281. package/src/shared/lib/i18n/locales/zh-CN/cron.json +80 -10
  282. package/src/shared/lib/transport/__tests__/remote.transport.test.ts +16 -4
  283. package/dist/assets/api-D0U10BcF.js +0 -13
  284. package/dist/assets/app-presenter-provider-Dffdm_Ek.js +0 -106
  285. package/dist/assets/appearance-settings-page-sfusZc2d.js +0 -1
  286. package/dist/assets/architecture-TIHT7OUA-ClwVFq-K.js +0 -1
  287. package/dist/assets/channel-BEHOSFc5.js +0 -1
  288. package/dist/assets/channels-list-page-Dkfe87Zq.js +0 -8
  289. package/dist/assets/chat-page-CeapbQnG.js +0 -1
  290. package/dist/assets/chunk-2Q5K7J3B-DrIhesSX.js +0 -1
  291. package/dist/assets/chunk-VAUOI2AC-Dpcz6BhT.js +0 -1
  292. package/dist/assets/chunk-XXDRQBXY-C2QjjwYX.js +0 -1
  293. package/dist/assets/classDiagram-OUVF2IWQ-DESMaY3_.js +0 -1
  294. package/dist/assets/classDiagram-v2-EOCWNBFH-DwOlByYH.js +0 -1
  295. package/dist/assets/config-split-page-CnQI8cKT.js +0 -1
  296. package/dist/assets/confirm-dialog-RZUWA_j9.js +0 -5
  297. package/dist/assets/cynefin-VYW2F7L2-CzjeeOq9.js +0 -1
  298. package/dist/assets/desktop-update-config-CbSYQMYz.js +0 -1
  299. package/dist/assets/doc-browser-DwXHr-mm.js +0 -1
  300. package/dist/assets/doc-browser-jVTq8iY_2.js +0 -1
  301. package/dist/assets/download-BP7ZxrwI.js +0 -1
  302. package/dist/assets/eventmodeling-45OFAUF4-C38BqG8w.js +0 -1
  303. package/dist/assets/external-link-DvHCEe3h.js +0 -1
  304. package/dist/assets/eye-C--6dxv_.js +0 -1
  305. package/dist/assets/flowDiagram-23GEKE2U-BoKk8RRq.js +0 -1
  306. package/dist/assets/folder-BfeO1zCY.js +0 -1
  307. package/dist/assets/gitGraph-TEB2WS4Q-IsQHHJuS.js +0 -1
  308. package/dist/assets/index-BlKbckX4.css +0 -1
  309. package/dist/assets/index-DoZR11Nh.js +0 -2
  310. package/dist/assets/info-DKCQHKI2-ofy2qlHI.js +0 -1
  311. package/dist/assets/loader-circle-BWdgwVnn.js +0 -1
  312. package/dist/assets/mcp-marketplace-page-XnRWiC8c.js +0 -1
  313. package/dist/assets/model-config-page-CXnqSbSI.js +0 -1
  314. package/dist/assets/packet-7NZHBO7P-Rfopfa1o.js +0 -1
  315. package/dist/assets/pie-RZYD4A2V-CJR1xKEv.js +0 -1
  316. package/dist/assets/plus-BeApS21t.js +0 -1
  317. package/dist/assets/provider-scoped-model-input-ll_Btc9h.js +0 -1
  318. package/dist/assets/providers-config-page-Bcuhqkdl.js +0 -1
  319. package/dist/assets/radar-I7S5WNFK-CDg8Z-1r.js +0 -1
  320. package/dist/assets/railroad-3IZDKUUU-BHnNmjxO.js +0 -1
  321. package/dist/assets/railroad-abnf-AHOZXSZD-DGtNcusW.js +0 -1
  322. package/dist/assets/railroad-ebnf-EBAXGLYW-BRFtsQmm.js +0 -1
  323. package/dist/assets/railroad-peg-LSFZ7HO6-Bj5IypCA.js +0 -1
  324. package/dist/assets/remote-CqKpuOP9.js +0 -1
  325. package/dist/assets/rotate-cw-DHXoiqFB.js +0 -1
  326. package/dist/assets/runtime-config-page-D-Aqxizs.js +0 -1
  327. package/dist/assets/search-config-page-XTKf5rc0.js +0 -1
  328. package/dist/assets/secrets-config-page-Cx-qptcj.js +0 -3
  329. package/dist/assets/security-config-DWGFM2u9.js +0 -1
  330. package/dist/assets/setting-row-DFvioO2a.js +0 -1
  331. package/dist/assets/settings-2-RMWqf-ey.js +0 -1
  332. package/dist/assets/skeleton-DQ5WhuDG.js +0 -1
  333. package/dist/assets/stateDiagram-v2-6OUMAXLB-CfMU38yc.js +0 -1
  334. package/dist/assets/swimlanesDiagram-G3AALYLV-D9Zb9X57.js +0 -8
  335. package/dist/assets/treeView-QDETBFTQ-Uy7M0WvH.js +0 -1
  336. package/dist/assets/treemap-6X3UGDF4-BJfGV7KX.js +0 -1
  337. package/dist/assets/use-confirm-dialog-CTNA1PC0.js +0 -1
  338. package/dist/assets/wardley-OPB4EBWU-q263iF3K.js +0 -1
  339. package/dist/assets/x-qvh05iyu.js +0 -1
  340. package/src/features/chat/components/conversation/chat-conversation-skeleton.tsx +0 -86
  341. package/src/features/settings/pages/__tests__/language-settings-page.test.tsx +0 -36
  342. package/src/features/settings/pages/language-settings-page.tsx +0 -56
  343. package/src/shared/components/actions/action-link.tsx +0 -49
  344. /package/dist/assets/{array-BqYdCIE6.js → array-CAkJT3no.js} +0 -0
  345. /package/dist/assets/{chunk-KEIR6QF5-A3jEqwzn.js → chunk-KEIR6QF5-BgdDoWEH.js} +0 -0
  346. /package/dist/assets/{chunk-Y2CYZVJY-BGrd8tLy.js → chunk-Y2CYZVJY-pTllD0P3.js} +0 -0
  347. /package/dist/assets/{config-hints-LxG80Uj5.js → config-hints-S3g-UVZb.js} +0 -0
  348. /package/dist/assets/{cytoscape.esm-CRW8q92n.js → cytoscape.esm-DmURt-5G.js} +0 -0
  349. /package/dist/assets/{defaultLocale-Cdv9x6q7.js → defaultLocale-BKy_KP3O.js} +0 -0
  350. /package/dist/assets/{dist-dw-gAfM_.js → dist-IgNNB7K9.js} +0 -0
  351. /package/dist/assets/{graphlib-BcNFQr5y.js → graphlib-xw_TBHyH.js} +0 -0
  352. /package/dist/assets/{host-capabilities-CFbAfrrA.js → host-capabilities-B-TtABsP.js} +0 -0
  353. /package/dist/assets/{init-D8TjIqfm.js → init-C9xlLIAu.js} +0 -0
  354. /package/dist/assets/{jszip.min-CP5uPNQa.js → jszip.min-Das2IAnb.js} +0 -0
  355. /package/dist/assets/{katex-wEmrEFTg.js → katex-DSy1eD2d.js} +0 -0
  356. /package/dist/assets/{middleware-CAXxl-af.js → middleware-Df-a4x-q.js} +0 -0
  357. /package/dist/assets/{path-DzBnMI1r.js → path-DB0USYHi.js} +0 -0
  358. /package/dist/assets/{provider-models-BoUhFo9R.js → provider-models-CXUgDxGR.js} +0 -0
  359. /package/dist/assets/{rough.esm-wJ1d3nQl.js → rough.esm-B1B52ZQS.js} +0 -0
  360. /package/dist/assets/{xlsx-DUqJhg5u.js → xlsx-DfjC_iml.js} +0 -0
@@ -1,51 +1,82 @@
1
- import * as React from "react";
2
- import { cva, type VariantProps } from "class-variance-authority";
3
- import { cn } from "@/shared/lib/utils";
1
+ import * as React from 'react';
2
+ import { cva, type VariantProps } from 'class-variance-authority';
3
+ import { cn } from '@/shared/lib/utils';
4
4
 
5
5
  const settingRowVariants = cva(
6
- "flex items-start justify-between gap-4 rounded-xl border p-4",
6
+ 'grid min-h-16 grid-cols-1 gap-3 px-4 py-3.5 sm:grid-cols-[minmax(0,1fr)_auto] sm:items-center sm:gap-6',
7
7
  {
8
8
  variants: {
9
9
  tone: {
10
- default: "border-gray-200 bg-white",
11
- muted: "border-gray-200 bg-gray-50",
10
+ default: '',
11
+ muted: 'bg-muted/55'
12
12
  },
13
+ layout: {
14
+ responsive: '',
15
+ stacked: 'sm:grid-cols-1 sm:items-start sm:gap-3'
16
+ }
13
17
  },
14
18
  defaultVariants: {
15
- tone: "default",
16
- },
17
- },
19
+ tone: 'default',
20
+ layout: 'responsive'
21
+ }
22
+ }
23
+ );
24
+
25
+ export interface SettingsSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
26
+ title?: React.ReactNode;
27
+ description?: React.ReactNode;
28
+ actions?: React.ReactNode;
29
+ }
30
+
31
+ export const SettingsSection = React.forwardRef<HTMLElement, SettingsSectionProps>(
32
+ ({ actions, children, className, description, title, ...props }, ref) => (
33
+ <section ref={ref} className={cn('space-y-2.5', className)} {...props}>
34
+ {title || description || actions ? (
35
+ <div className='flex items-end justify-between gap-4 px-1'>
36
+ <div className='min-w-0'>
37
+ {title ? <h3 className='text-sm font-semibold text-foreground'>{title}</h3> : null}
38
+ {description ? <p className='mt-0.5 text-xs leading-5 text-muted-foreground'>{description}</p> : null}
39
+ </div>
40
+ {actions ? <div className='shrink-0'>{actions}</div> : null}
41
+ </div>
42
+ ) : null}
43
+ {children}
44
+ </section>
45
+ )
46
+ );
47
+
48
+ SettingsSection.displayName = 'SettingsSection';
49
+
50
+ export const SettingsGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
51
+ ({ className, ...props }, ref) => (
52
+ <div
53
+ ref={ref}
54
+ className={cn('divide-y divide-border/55 overflow-hidden rounded-2xl bg-muted/45 text-foreground', className)}
55
+ {...props}
56
+ />
57
+ )
18
58
  );
19
59
 
60
+ SettingsGroup.displayName = 'SettingsGroup';
61
+
20
62
  export interface SettingRowProps
21
- extends
22
- Omit<React.HTMLAttributes<HTMLDivElement>, "title">,
23
- VariantProps<typeof settingRowVariants> {
63
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof settingRowVariants> {
24
64
  title: React.ReactNode;
25
65
  description?: React.ReactNode;
26
66
  control?: React.ReactNode;
27
67
  }
28
68
 
29
69
  export const SettingRow = React.forwardRef<HTMLDivElement, SettingRowProps>(
30
- (
31
- { className, tone, title, description, control, children, ...props },
32
- ref,
33
- ) => (
34
- <div
35
- ref={ref}
36
- className={cn(settingRowVariants({ tone }), className)}
37
- {...props}
38
- >
39
- <div className="min-w-0 flex-1 space-y-2">
40
- <div className="text-sm font-medium text-gray-900">{title}</div>
41
- {description ? (
42
- <p className="text-sm leading-6 text-gray-500">{description}</p>
43
- ) : null}
44
- {children}
70
+ ({ className, layout, tone, title, description, control, children, ...props }, ref) => (
71
+ <div ref={ref} className={cn(settingRowVariants({ layout, tone }), className)} {...props}>
72
+ <div className='min-w-0'>
73
+ <div className='text-sm font-medium text-foreground'>{title}</div>
74
+ {description ? <p className='mt-0.5 text-xs leading-5 text-muted-foreground'>{description}</p> : null}
75
+ {children ? <div className='mt-3'>{children}</div> : null}
45
76
  </div>
46
- {control ? <div className="shrink-0">{control}</div> : null}
77
+ {control ? <div className='min-w-0 sm:shrink-0'>{control}</div> : null}
47
78
  </div>
48
- ),
79
+ )
49
80
  );
50
81
 
51
- SettingRow.displayName = "SettingRow";
82
+ SettingRow.displayName = 'SettingRow';
@@ -0,0 +1,34 @@
1
+ import type { ReactNode } from 'react';
2
+ import { PageHeader, PageLayout } from '@/app/components/layout/page-layout';
3
+ import { cn } from '@/shared/lib/utils';
4
+
5
+ export interface SettingsPageProps {
6
+ title: string;
7
+ description?: string;
8
+ actions?: ReactNode;
9
+ children: ReactNode;
10
+ layout?: 'standard' | 'split';
11
+ className?: string;
12
+ }
13
+
14
+ export function SettingsPage({
15
+ actions,
16
+ children,
17
+ className,
18
+ description,
19
+ layout = 'standard',
20
+ title
21
+ }: SettingsPageProps) {
22
+ return (
23
+ <PageLayout
24
+ className={cn(
25
+ 'w-full space-y-6',
26
+ layout === 'split' && 'pb-0 md:flex md:h-full md:min-h-0 md:flex-col',
27
+ className
28
+ )}
29
+ >
30
+ <PageHeader title={title} description={description} actions={actions} className='mb-0' />
31
+ {children}
32
+ </PageLayout>
33
+ );
34
+ }
@@ -1,5 +1,5 @@
1
- import { render, screen } from '@testing-library/react';
2
- import { describe, expect, it } from 'vitest';
1
+ import { fireEvent, render, screen } from '@testing-library/react';
2
+ import { describe, expect, it, vi } from 'vitest';
3
3
  import { IconActionButton } from '@/shared/components/ui/actions/icon-action-button';
4
4
 
5
5
  describe('IconActionButton', () => {
@@ -33,4 +33,25 @@ describe('IconActionButton', () => {
33
33
  expect(button.className).toContain('w-7');
34
34
  expect(button.className).toContain('hover:bg-accent');
35
35
  });
36
+
37
+ it('ignores restored pointer focus while preserving keyboard tooltip focus', () => {
38
+ render(
39
+ <IconActionButton
40
+ icon={<span data-testid="icon" />}
41
+ label="Session Type"
42
+ />,
43
+ );
44
+
45
+ const button = screen.getByRole('button', { name: 'Session Type' });
46
+ const matches = vi.spyOn(button, 'matches');
47
+
48
+ matches.mockReturnValue(false);
49
+ fireEvent.focus(button);
50
+ expect(screen.queryByRole('tooltip')).toBeNull();
51
+
52
+ fireEvent.blur(button);
53
+ matches.mockReturnValue(true);
54
+ fireEvent.focus(button);
55
+ expect(screen.getByRole('tooltip').textContent).toBe('Session Type');
56
+ });
36
57
  });
@@ -72,8 +72,15 @@ const IconActionButton = React.forwardRef<HTMLButtonElement, IconActionButtonPro
72
72
  if (!content) return button;
73
73
  return (
74
74
  <TooltipProvider delayDuration={250}>
75
- <Tooltip>
76
- <TooltipTrigger asChild>
75
+ <Tooltip disableHoverableContent>
76
+ <TooltipTrigger
77
+ asChild
78
+ onFocus={(event) => {
79
+ if (!event.currentTarget.matches(':focus-visible')) {
80
+ event.preventDefault();
81
+ }
82
+ }}
83
+ >
77
84
  {disabled ? <span className="inline-flex">{button}</span> : button}
78
85
  </TooltipTrigger>
79
86
  <TooltipContent side={tooltipSide} className="text-xs">{content}</TooltipContent>
@@ -0,0 +1,142 @@
1
+ import * as React from "react";
2
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
3
+ import { cva, type VariantProps } from "class-variance-authority";
4
+ import { X } from "lucide-react";
5
+
6
+ import { cn } from "@/shared/lib/utils";
7
+
8
+ const Sheet = SheetPrimitive.Root;
9
+ const SheetTrigger = SheetPrimitive.Trigger;
10
+ const SheetClose = SheetPrimitive.Close;
11
+ const SheetPortal = SheetPrimitive.Portal;
12
+
13
+ const SheetOverlay = React.forwardRef<
14
+ React.ElementRef<typeof SheetPrimitive.Overlay>,
15
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
16
+ >(({ className, ...props }, ref) => (
17
+ <SheetPrimitive.Overlay
18
+ ref={ref}
19
+ className={cn(
20
+ "fixed inset-0 z-[var(--z-modal-backdrop,10000)] bg-black/35 backdrop-blur-[1px] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
21
+ className,
22
+ )}
23
+ {...props}
24
+ />
25
+ ));
26
+ SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
27
+
28
+ const sheetVariants = cva(
29
+ "fixed z-[var(--z-modal,10050)] bg-background shadow-2xl transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
30
+ {
31
+ variants: {
32
+ side: {
33
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
34
+ bottom:
35
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
36
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
37
+ right:
38
+ "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
39
+ },
40
+ },
41
+ defaultVariants: {
42
+ side: "right",
43
+ },
44
+ },
45
+ );
46
+
47
+ type SheetContentProps = React.ComponentPropsWithoutRef<
48
+ typeof SheetPrimitive.Content
49
+ > &
50
+ VariantProps<typeof sheetVariants> & {
51
+ readonly closeLabel?: string;
52
+ };
53
+
54
+ const SheetContent = React.forwardRef<
55
+ React.ElementRef<typeof SheetPrimitive.Content>,
56
+ SheetContentProps
57
+ >(({ children, className, closeLabel = "Close", side, ...props }, ref) => (
58
+ <SheetPortal>
59
+ <SheetOverlay />
60
+ <SheetPrimitive.Content
61
+ ref={ref}
62
+ className={cn(sheetVariants({ side }), className)}
63
+ {...props}
64
+ >
65
+ {children}
66
+ <SheetPrimitive.Close className="absolute right-4 top-4 rounded-lg p-1.5 text-muted-foreground opacity-75 transition-colors hover:bg-muted hover:text-foreground hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none">
67
+ <X className="h-4 w-4" />
68
+ <span className="sr-only">{closeLabel}</span>
69
+ </SheetPrimitive.Close>
70
+ </SheetPrimitive.Content>
71
+ </SheetPortal>
72
+ ));
73
+ SheetContent.displayName = SheetPrimitive.Content.displayName;
74
+
75
+ function SheetHeader({
76
+ className,
77
+ ...props
78
+ }: React.HTMLAttributes<HTMLDivElement>) {
79
+ return (
80
+ <div
81
+ className={cn("flex flex-col space-y-2 text-left", className)}
82
+ {...props}
83
+ />
84
+ );
85
+ }
86
+ SheetHeader.displayName = "SheetHeader";
87
+
88
+ function SheetFooter({
89
+ className,
90
+ ...props
91
+ }: React.HTMLAttributes<HTMLDivElement>) {
92
+ return (
93
+ <div
94
+ className={cn(
95
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
96
+ className,
97
+ )}
98
+ {...props}
99
+ />
100
+ );
101
+ }
102
+ SheetFooter.displayName = "SheetFooter";
103
+
104
+ const SheetTitle = React.forwardRef<
105
+ React.ElementRef<typeof SheetPrimitive.Title>,
106
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
107
+ >(({ className, ...props }, ref) => (
108
+ <SheetPrimitive.Title
109
+ ref={ref}
110
+ className={cn(
111
+ "text-lg font-semibold tracking-tight text-foreground",
112
+ className,
113
+ )}
114
+ {...props}
115
+ />
116
+ ));
117
+ SheetTitle.displayName = SheetPrimitive.Title.displayName;
118
+
119
+ const SheetDescription = React.forwardRef<
120
+ React.ElementRef<typeof SheetPrimitive.Description>,
121
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
122
+ >(({ className, ...props }, ref) => (
123
+ <SheetPrimitive.Description
124
+ ref={ref}
125
+ className={cn("text-sm leading-relaxed text-muted-foreground", className)}
126
+ {...props}
127
+ />
128
+ ));
129
+ SheetDescription.displayName = SheetPrimitive.Description.displayName;
130
+
131
+ export {
132
+ Sheet,
133
+ SheetClose,
134
+ SheetContent,
135
+ SheetDescription,
136
+ SheetFooter,
137
+ SheetHeader,
138
+ SheetOverlay,
139
+ SheetPortal,
140
+ SheetTitle,
141
+ SheetTrigger,
142
+ };
@@ -1,5 +1,10 @@
1
- import type { NcpMessage, NcpSessionStatus, NcpSessionSummary } from '@nextclaw/ncp';
2
- import type { ThinkingLevel } from './types';
1
+ import type {
2
+ NcpMessage,
3
+ NcpSessionMessagePageInfo,
4
+ NcpSessionStatus,
5
+ NcpSessionSummary,
6
+ } from "@nextclaw/ncp";
7
+ import type { ThinkingLevel } from "./types";
3
8
 
4
9
  export type SessionTypeIconView = {
5
10
  kind: "image";
@@ -100,4 +105,5 @@ export type NcpSessionMessagesView = {
100
105
  messages: NcpMessageView[];
101
106
  contextWindow?: SessionContextWindowView | null;
102
107
  total: number;
108
+ pageInfo: NcpSessionMessagePageInfo;
103
109
  };
@@ -462,7 +462,28 @@ export type CronJobView = {
462
462
  deleteAfterRun: boolean;
463
463
  };
464
464
 
465
- export type CronListView = { jobs: CronJobView[]; total: number };
465
+ export type CronListStatus = "all" | "enabled" | "disabled" | "attention";
466
+
467
+ export type CronListQuery = {
468
+ all?: boolean;
469
+ limit?: number;
470
+ offset?: number;
471
+ query?: string;
472
+ status?: CronListStatus;
473
+ };
474
+
475
+ export type CronListSummaryView = {
476
+ total: number;
477
+ enabled: number;
478
+ disabled: number;
479
+ attention: number;
480
+ };
481
+
482
+ export type CronListView = {
483
+ jobs: CronJobView[];
484
+ total: number;
485
+ summary: CronListSummaryView;
486
+ };
466
487
 
467
488
  export type CronEnableRequest = { enabled: boolean };
468
489
 
@@ -34,6 +34,7 @@ import type {
34
34
  ConfigActionExecuteResult,
35
35
  ChatSessionTypesView,
36
36
  CronListView,
37
+ CronListQuery,
37
38
  CronEnableRequest,
38
39
  CronRunRequest,
39
40
  CronActionResult
@@ -166,7 +167,7 @@ export async function fetchNcpChatSessionTypes(): Promise<ChatSessionTypesView>
166
167
  return await nextclawClient.config.fetchChatSessionTypes();
167
168
  }
168
169
 
169
- export async function fetchCronJobs(params?: { all?: boolean }): Promise<CronListView> {
170
+ export async function fetchCronJobs(params?: CronListQuery): Promise<CronListView> {
170
171
  return await nextclawClient.config.fetchCronJobs(params);
171
172
  }
172
173
 
@@ -1,26 +1,35 @@
1
- import { nextclawClient } from '@/shared/lib/api/managers/client.manager';
1
+ import { nextclawClient } from "@/shared/lib/api/managers/client.manager";
2
2
  import type {
3
3
  NcpSessionMessagesView,
4
4
  NcpSessionSkillsView,
5
5
  NcpSessionsListView,
6
6
  NcpSessionSummaryView,
7
- SessionPatchUpdate
8
- } from '@/shared/lib/api/types';
7
+ SessionPatchUpdate,
8
+ } from "@/shared/lib/api/types";
9
9
 
10
10
  // GET /api/ncp/sessions
11
- export async function fetchNcpSessions(params?: { limit?: number; peerId?: string }): Promise<NcpSessionsListView> {
12
- return await nextclawClient.sessions.list(params) as NcpSessionsListView;
11
+ export async function fetchNcpSessions(params?: {
12
+ limit?: number;
13
+ peerId?: string;
14
+ }): Promise<NcpSessionsListView> {
15
+ return (await nextclawClient.sessions.list(params)) as NcpSessionsListView;
13
16
  }
14
17
 
15
18
  // GET /api/ncp/sessions/:sessionId/messages
16
- export async function fetchNcpSessionMessages(sessionId: string, limit = 200): Promise<NcpSessionMessagesView> {
17
- return await nextclawClient.sessions.listMessages(sessionId, limit) as NcpSessionMessagesView;
19
+ export async function fetchNcpSessionMessages(
20
+ sessionId: string,
21
+ options: { limit?: number; cursor?: string; signal?: AbortSignal } = {},
22
+ ): Promise<NcpSessionMessagesView> {
23
+ return (await nextclawClient.sessions.listMessages(
24
+ sessionId,
25
+ options,
26
+ )) as NcpSessionMessagesView;
18
27
  }
19
28
 
20
29
  // GET /api/ncp/sessions/:sessionId/skills
21
30
  export async function fetchNcpSessionSkills(
22
31
  sessionId: string,
23
- params?: { projectRoot?: string | null }
32
+ params?: { projectRoot?: string | null },
24
33
  ): Promise<NcpSessionSkillsView> {
25
34
  return await nextclawClient.sessions.listSkills(sessionId, params);
26
35
  }
@@ -28,12 +37,17 @@ export async function fetchNcpSessionSkills(
28
37
  // PUT /api/ncp/sessions/:sessionId
29
38
  export async function updateNcpSession(
30
39
  sessionId: string,
31
- data: SessionPatchUpdate
40
+ data: SessionPatchUpdate,
32
41
  ): Promise<NcpSessionSummaryView> {
33
- return await nextclawClient.sessions.update(sessionId, data) as NcpSessionSummaryView;
42
+ return (await nextclawClient.sessions.update(
43
+ sessionId,
44
+ data,
45
+ )) as NcpSessionSummaryView;
34
46
  }
35
47
 
36
48
  // DELETE /api/ncp/sessions/:sessionId
37
- export async function deleteNcpSession(sessionId: string): Promise<{ deleted: boolean; sessionId: string }> {
49
+ export async function deleteNcpSession(
50
+ sessionId: string,
51
+ ): Promise<{ deleted: boolean; sessionId: string }> {
38
52
  return await nextclawClient.sessions.delete(sessionId);
39
53
  }
@@ -83,7 +83,7 @@
83
83
  "chatWorkspaceDiffEmpty": "No diff content is available.",
84
84
  "chatWorkspaceHtmlPreviewTitle": "Rendered HTML preview",
85
85
  "chatWorkspacePreviewTruncated": "Preview truncated",
86
- "chatWorkspaceSessionCronJobs": "Session cron jobs",
86
+ "chatWorkspaceSessionCronJobs": "Scheduled tasks",
87
87
  "chatWorkspaceCronJobEmpty": "This session has no cron jobs.",
88
88
  "chatSessionUnread": "Session has unread updates",
89
89
  "chatTyping": "Agent is thinking...",
@@ -146,7 +146,37 @@
146
146
  "chatToolDisplayError": "Display failed",
147
147
  "chatToolDisplayCancelled": "Display cancelled",
148
148
  "chatScrollToBottom": "Scroll to bottom",
149
+ "chatHistoryLoadFailed": "Couldn’t load earlier messages",
150
+ "chatHistoryRetry": "Retry",
149
151
  "chatProcessSummaryProcessed": "Processed",
152
+ "chatAiExecutionInput": "input",
153
+ "chatAiExecutionOutput": "output",
154
+ "chatAiExecutionTokens": "tokens",
155
+ "chatAiExecutionPartial": "partial usage",
156
+ "chatMessageMoreActions": "More actions",
157
+ "chatAiExecutionViewMetadata": "View run metadata",
158
+ "chatAiExecutionMetadataTitle": "AI run metadata",
159
+ "chatAiExecutionMetadataDescription": "Runtime facts persisted with this assistant message for inspection and debugging.",
160
+ "chatAiExecutionMetadataClose": "Close run metadata",
161
+ "chatAiExecutionNotAvailable": "Not available",
162
+ "chatAiExecutionRunId": "Run ID",
163
+ "chatAiExecutionRuntime": "Runtime",
164
+ "chatAiExecutionModel": "Model",
165
+ "chatAiExecutionRequestedModel": "Requested model",
166
+ "chatAiExecutionOutcome": "Outcome",
167
+ "chatAiExecutionInputTokens": "Input tokens",
168
+ "chatAiExecutionOutputTokens": "Output tokens",
169
+ "chatAiExecutionCachedInputTokens": "Cached input tokens",
170
+ "chatAiExecutionTotalTokens": "Total tokens",
171
+ "chatAiExecutionModelCallCount": "Model calls",
172
+ "chatAiExecutionReportedModelCallCount": "Calls with reported usage",
173
+ "chatAiExecutionUsageStatus": "Usage status",
174
+ "chatAiExecutionOutcomeCompleted": "Completed",
175
+ "chatAiExecutionOutcomeFailed": "Failed",
176
+ "chatAiExecutionOutcomeAborted": "Aborted",
177
+ "chatAiExecutionUsageReported": "Reported",
178
+ "chatAiExecutionUsagePartial": "Partial",
179
+ "chatAiExecutionUsageUnavailable": "Unavailable",
150
180
  "chatToolActivityReadOne": "Read 1 file",
151
181
  "chatToolActivityReadOther": "Read {count} files",
152
182
  "chatToolActivityEditOne": "Edit 1 file",
@@ -23,7 +23,7 @@
23
23
  "settingsMenu": "Settings menu",
24
24
  "sidebarCollapse": "Collapse sidebar",
25
25
  "sidebarExpand": "Expand sidebar",
26
- "security": "Security",
26
+ "security": "Sign-in Management",
27
27
  "backToMain": "Back to Main",
28
28
  "enabled": "Enabled",
29
29
  "disabled": "Disabled",
@@ -227,8 +227,8 @@
227
227
  "authDisabledSuccess": "Authentication disabled",
228
228
  "authRetryStatus": "Retry",
229
229
  "authStatusLoadFailed": "Failed to load authentication status. Check whether the UI server is healthy.",
230
- "authSecurityTitle": "Security",
231
- "authSecurityDescription": "Keep the local console simple by default, and add a lightweight login gate only when you expose the UI remotely.",
230
+ "authSecurityTitle": "Sign-in Management",
231
+ "authSecurityDescription": "Choose whether opening NextClaw requires sign-in, and manage the admin username and password.",
232
232
  "authSetupTitle": "Enable Lightweight Authentication",
233
233
  "authSetupDescription": "Create the single admin account the first time you enable authentication. This tab will be signed in automatically.",
234
234
  "authSetupAction": "Enable Authentication",