@nextclaw/ui 0.15.24 → 0.15.26

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 (312) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/assets/{abnfDiagram-VRR7QNED-DvTjgVMf.js → abnfDiagram-VRR7QNED-BcFJp_1X.js} +1 -1
  3. package/dist/assets/{aiden0z-pptx-renderer.es-C1nfBAXR.js → aiden0z-pptx-renderer.es-Dp2ezlQn.js} +1 -1
  4. package/dist/assets/{api-BxPNDp30.js → api-CK3Fro7z.js} +6 -6
  5. package/dist/assets/appearance-settings-page-zqwWO8Dy.js +1 -0
  6. package/dist/assets/{arc-BvhODBXv.js → arc-CkgyPMyW.js} +1 -1
  7. package/dist/assets/architecture-TIHT7OUA-DO2x53FK.js +1 -0
  8. package/dist/assets/{architectureDiagram-ZJ3FMSHR-BKO9RgNS.js → architectureDiagram-ZJ3FMSHR-CMd4cIjI.js} +1 -1
  9. package/dist/assets/{blockDiagram-677ZJIJ3-DHpDXy7D.js → blockDiagram-677ZJIJ3-Bz3tbhet.js} +1 -1
  10. package/dist/assets/{c4Diagram-LMCZKHZV-BG_iQnDr.js → c4Diagram-LMCZKHZV-D9hFNAGv.js} +1 -1
  11. package/dist/assets/channel-nBvMaVyP.js +1 -0
  12. package/dist/assets/{channels-list-page-DRaNWAxC.js → channels-list-page-CVCZBlCL.js} +2 -2
  13. package/dist/assets/chat-page-D4wehRTz.js +1 -0
  14. package/dist/assets/chunk-2Q5K7J3B-CJgqFDS4.js +1 -0
  15. package/dist/assets/{chunk-32BRIVSS-DR9M0LLx.js → chunk-32BRIVSS-7NrjEITq.js} +1 -1
  16. package/dist/assets/{chunk-52WLFC77-698iC3BB.js → chunk-52WLFC77-viIcqj9q.js} +1 -1
  17. package/dist/assets/{chunk-5FCAYU7R-DikTj9Ey.js → chunk-5FCAYU7R-Vsu4J-VM.js} +1 -1
  18. package/dist/assets/{chunk-5HE753X5-ko0o7_q0.js → chunk-5HE753X5-C-w6CQZK.js} +1 -1
  19. package/dist/assets/{chunk-5JV3BV7I-CEHufhgo.js → chunk-5JV3BV7I-CuKgJQ4W.js} +1 -1
  20. package/dist/assets/{chunk-5TONJI2A-CGgno1cu.js → chunk-5TONJI2A-CYeiWZKb.js} +1 -1
  21. package/dist/assets/{chunk-5VM5RSS4-DkiB4cUQ.js → chunk-5VM5RSS4-DRCbfwIn.js} +1 -1
  22. package/dist/assets/{chunk-7BUUIJ7U-DzptcytQ.js → chunk-7BUUIJ7U-BvydOcm3.js} +1 -1
  23. package/dist/assets/{chunk-BIQX33UG-DMRSQJvT.js → chunk-BIQX33UG-RlppOXKo.js} +1 -1
  24. package/dist/assets/{chunk-C7G6YPKG-Bw1BwwuY.js → chunk-C7G6YPKG-DAizzYwr.js} +1 -1
  25. package/dist/assets/{chunk-CQNSW5MT-C0z6eHBk.js → chunk-CQNSW5MT-5eChJHca.js} +1 -1
  26. package/dist/assets/{chunk-CYSBUYHQ-ByPyAouO.js → chunk-CYSBUYHQ-YHPr53fv.js} +1 -1
  27. package/dist/assets/{chunk-EMLP6XTP-CJlAXWZg.js → chunk-EMLP6XTP-CK4D7Hz5.js} +1 -1
  28. package/dist/assets/{chunk-EX3LRPZG-Dqq4zKJu.js → chunk-EX3LRPZG-BmlDFIRW.js} +1 -1
  29. package/dist/assets/{chunk-FWX5IMBZ-B0SNoCmi.js → chunk-FWX5IMBZ-D0ksHZZ9.js} +2 -2
  30. package/dist/assets/{chunk-HOUHSVGY-DG_GJih_.js → chunk-HOUHSVGY-DPkq8FCm.js} +1 -1
  31. package/dist/assets/{chunk-ICXQ74PX-Drxk_6bE.js → chunk-ICXQ74PX-FAatv5fC.js} +1 -1
  32. package/dist/assets/{chunk-JG7HCLWE-DdLFPpnd.js → chunk-JG7HCLWE-DLkIi4F7.js} +1 -1
  33. package/dist/assets/{chunk-JWPE2WC7-B8M4G76F.js → chunk-JWPE2WC7-DawOjNE3.js} +1 -1
  34. package/dist/assets/{chunk-MOJQB5TN-XP6FJHY_.js → chunk-MOJQB5TN-Di52TorW.js} +1 -1
  35. package/dist/assets/{chunk-MOZMSUNE-C_6x18Qw.js → chunk-MOZMSUNE-PfyK9w1-.js} +1 -1
  36. package/dist/assets/{chunk-OGEWGWER-N25BzCmG.js → chunk-OGEWGWER-C3jdH3Ty.js} +1 -1
  37. package/dist/assets/{chunk-OSBZ3O6U-ASDEm7y0.js → chunk-OSBZ3O6U-CecHo-f0.js} +1 -1
  38. package/dist/assets/{chunk-PUDLZKDR-CTlvAcn7.js → chunk-PUDLZKDR-f3IJh3sN.js} +1 -1
  39. package/dist/assets/{chunk-Q4XR5HBZ-Da9BWfB6.js → chunk-Q4XR5HBZ-DQFeUPxZ.js} +1 -1
  40. package/dist/assets/{chunk-QBLGF6JB-Bi6RpTJO.js → chunk-QBLGF6JB-BhUeG0y2.js} +1 -1
  41. package/dist/assets/{chunk-R7FJI6CG-DkMsSPvK.js → chunk-R7FJI6CG-C3XpZ-2u.js} +1 -1
  42. package/dist/assets/{chunk-RYQCIY6F-DZp0eU-j.js → chunk-RYQCIY6F-CAqa5klQ.js} +1 -1
  43. package/dist/assets/{chunk-U6XO7XAA-vfinDSrj.js → chunk-U6XO7XAA-D_WXezeD.js} +1 -1
  44. package/dist/assets/{chunk-V7JOEXUC-C9Nksccs.js → chunk-V7JOEXUC-CZ70oOtp.js} +1 -1
  45. package/dist/assets/chunk-VAUOI2AC-BGvh3yIx.js +1 -0
  46. package/dist/assets/{chunk-VR4S4FIN-Xv6zfwXs.js → chunk-VR4S4FIN-B7AHEYYk.js} +1 -1
  47. package/dist/assets/{chunk-WYO6CB5R-mOJNzbWl.js → chunk-WYO6CB5R-Dn9To_OI.js} +2 -2
  48. package/dist/assets/chunk-XXDRQBXY-DaBxG5gs.js +1 -0
  49. package/dist/assets/{chunk-YOTPTUD7-1-aKSu4o.js → chunk-YOTPTUD7-BYEgRBk3.js} +1 -1
  50. package/dist/assets/{chunk-ZGVPDNZ5-OJ8veMpK.js → chunk-ZGVPDNZ5-C6YtZDU0.js} +1 -1
  51. package/dist/assets/{chunk-ZIRB5QZD-SR_Nq_PP.js → chunk-ZIRB5QZD-DMuYtnHF.js} +1 -1
  52. package/dist/assets/classDiagram-OUVF2IWQ-P6N03G2R.js +1 -0
  53. package/dist/assets/classDiagram-v2-EOCWNBFH-B1_uLvMv.js +1 -0
  54. package/dist/assets/config-split-page-CceNFvlY.js +1 -0
  55. package/dist/assets/confirm-dialog-CWeNYWZY.js +5 -0
  56. package/dist/assets/{cose-bilkent-JH36ORCC-NjVgz2Bw.js → cose-bilkent-JH36ORCC-Bc2Ex5Y3.js} +1 -1
  57. package/dist/assets/cynefin-VYW2F7L2-B-H8Qp-n.js +1 -0
  58. package/dist/assets/{cynefinDiagram-TSTJHNR4-B_17LDqD.js → cynefinDiagram-TSTJHNR4-DVysQoGz.js} +1 -1
  59. package/dist/assets/{dagre-CMe101gk.js → dagre-CMhQ1cAG.js} +1 -1
  60. package/dist/assets/{dagre-VKFMJZFB-qo8nLb3B.js → dagre-VKFMJZFB-RYyWpPJZ.js} +1 -1
  61. package/dist/assets/desktop-update-config-Dirc3bpt.js +1 -0
  62. package/dist/assets/{diagram-FQU43EPY-Ba3XIklC.js → diagram-FQU43EPY-BD6KONdF.js} +1 -1
  63. package/dist/assets/{diagram-G47NLZAW-CG45TcUx.js → diagram-G47NLZAW-CGB2ptRR.js} +1 -1
  64. package/dist/assets/{diagram-NH7WQ7WH-2F2HrwV-.js → diagram-NH7WQ7WH-DnkOI6cU.js} +1 -1
  65. package/dist/assets/{diagram-OA4YK3LP-CXfWH9NZ.js → diagram-OA4YK3LP-DF82RZ7P.js} +1 -1
  66. package/dist/assets/{diagram-WEI45ONY-CH_4yepc.js → diagram-WEI45ONY-Be2v7Ck9.js} +1 -1
  67. package/dist/assets/{dist-B4Pf5X3Q.js → dist-AYxkFx2B.js} +1 -1
  68. package/dist/assets/{dist-DHEWkGWX.js → dist-D9xtGgdL.js} +1 -1
  69. package/dist/assets/doc-browser-4Sud6dWw.js +1 -0
  70. package/dist/assets/doc-browser-D4x_yH5F.js +1 -0
  71. package/dist/assets/doc-browser-context-Cb7Z0j90.js +1 -0
  72. package/dist/assets/{docx-preview-CoM4JK7_.js → docx-preview-BqwAjrj3.js} +1 -1
  73. package/dist/assets/{ebnfDiagram-CCIWWBDH-BwiG4Ea1.js → ebnfDiagram-CCIWWBDH-CP98OYk8.js} +1 -1
  74. package/dist/assets/{erDiagram-Q63AITRT-BML3hpnQ.js → erDiagram-Q63AITRT-ZLlx8xfs.js} +1 -1
  75. package/dist/assets/eventmodeling-45OFAUF4-YVtShyFA.js +1 -0
  76. package/dist/assets/flowDiagram-23GEKE2U-BeKXabVO.js +1 -0
  77. package/dist/assets/form-actions-B2q4jgjE.js +1 -0
  78. package/dist/assets/{ganttDiagram-NO4QXBWP-80enfWbD.js → ganttDiagram-NO4QXBWP-DXCDjHR2.js} +1 -1
  79. package/dist/assets/gitGraph-TEB2WS4Q-jTSiBj-p.js +1 -0
  80. package/dist/assets/{gitGraphDiagram-IHSO6WYX-CVLqXr-b.js → gitGraphDiagram-IHSO6WYX-l2HWrTJp.js} +1 -1
  81. package/dist/assets/index-CdyTsSBu.css +1 -0
  82. package/dist/assets/index-Das_bw2h.js +107 -0
  83. package/dist/assets/info-DKCQHKI2-BIporNWb.js +1 -0
  84. package/dist/assets/{infoDiagram-FWYZ7A6U-Dyvs2t0i.js → infoDiagram-FWYZ7A6U-D-DjX-bn.js} +1 -1
  85. package/dist/assets/{ishikawaDiagram-FXEZZL3T-sSnxDKfh.js → ishikawaDiagram-FXEZZL3T-y_Xy128F.js} +1 -1
  86. package/dist/assets/{journeyDiagram-5HDEW3XC-D22V71Mf.js → journeyDiagram-5HDEW3XC-DJn5xYcQ.js} +1 -1
  87. package/dist/assets/{kanban-definition-HUTT4EX6-D3ds0p-g.js → kanban-definition-HUTT4EX6-DJVIOR21.js} +1 -1
  88. package/dist/assets/{line-CbyFs065.js → line-Cos7PIOj.js} +1 -1
  89. package/dist/assets/{linear-4DKtnZBS.js → linear-BtDLqtzF.js} +1 -1
  90. package/dist/assets/loader-circle-CpmBdaon.js +1 -0
  91. package/dist/assets/{map-CcZzEoz6.js → map-BKnQyvd0.js} +1 -1
  92. package/dist/assets/mcp-marketplace-page-CdOY3Sop.js +1 -0
  93. package/dist/assets/mcp-marketplace-page-DvjrfqEt.js +9 -0
  94. package/dist/assets/{mermaid-parser.core-DPmMOjXD.js → mermaid-parser.core-XUNZhr2W.js} +2 -2
  95. package/dist/assets/{mermaid.core-BSf-ddRa.js → mermaid.core-ySrvolIe.js} +3 -3
  96. package/dist/assets/{mindmap-definition-LN4V7U3C-BUTwWPyx.js → mindmap-definition-LN4V7U3C-BypL9tei.js} +1 -1
  97. package/dist/assets/model-config-page-DfOLyQqR.js +1 -0
  98. package/dist/assets/{navigation-link-CAFOcXNg.js → navigation-link-MiiyoIjH.js} +2 -2
  99. package/dist/assets/{ordinal-BgLYtOZE.js → ordinal-CxxVWxYU.js} +1 -1
  100. package/dist/assets/packet-7NZHBO7P-CuFMADV0.js +1 -0
  101. package/dist/assets/{pegDiagram-2B236MQR-BEu_ZBjc.js → pegDiagram-2B236MQR-D-U2KBGv.js} +1 -1
  102. package/dist/assets/pie-RZYD4A2V-XUeIXhM9.js +1 -0
  103. package/dist/assets/{pieDiagram-ENE6RG2P-CAwAwuBd.js → pieDiagram-ENE6RG2P-CBi3GusJ.js} +1 -1
  104. package/dist/assets/plus-C8FkjpSZ.js +1 -0
  105. package/dist/assets/provider-scoped-model-input-DXzjr5l0.js +1 -0
  106. package/dist/assets/providers-config-page-CaO8WfZH.js +1 -0
  107. package/dist/assets/{quadrantDiagram-ABIIQ3AL-CwE6F-_2.js → quadrantDiagram-ABIIQ3AL-H0ZuvnZL.js} +1 -1
  108. package/dist/assets/radar-I7S5WNFK-D-NNGh1k.js +1 -0
  109. package/dist/assets/railroad-3IZDKUUU-C67_uDaM.js +1 -0
  110. package/dist/assets/railroad-abnf-AHOZXSZD-BZ8Yflnd.js +1 -0
  111. package/dist/assets/railroad-ebnf-EBAXGLYW-B7zO7RoK.js +1 -0
  112. package/dist/assets/railroad-peg-LSFZ7HO6-R63PTgLz.js +1 -0
  113. package/dist/assets/{railroadDiagram-RFXS5EU6-xgLekU3B.js → railroadDiagram-RFXS5EU6-D7Y2EqSd.js} +1 -1
  114. package/dist/assets/react-C8XFFvuz.js +8 -0
  115. package/dist/assets/{refresh-cw-CWDp_JnN.js → refresh-cw-a2VVeeAF.js} +1 -1
  116. package/dist/assets/remote-BJHXa4mB.js +1 -0
  117. package/dist/assets/{requirementDiagram-TGXJPOKE-CyVUzEX5.js → requirementDiagram-TGXJPOKE-BiXNX1NN.js} +1 -1
  118. package/dist/assets/rotate-cw-DJ7UF3F2.js +1 -0
  119. package/dist/assets/runtime-config-page-BuA4A02z.js +1 -0
  120. package/dist/assets/{sankeyDiagram-HTMAVEWB-JK6bFmYB.js → sankeyDiagram-HTMAVEWB-qzDeLztW.js} +1 -1
  121. package/dist/assets/{save-Cnr71JON.js → save-CGm23Yww.js} +1 -1
  122. package/dist/assets/{search-CCX11X2m.js → search-CH2t--sH.js} +1 -1
  123. package/dist/assets/search-config-page-BAmYqoAz.js +1 -0
  124. package/dist/assets/secrets-config-page-BlPOuql_.js +3 -0
  125. package/dist/assets/security-config-CbDiY2xr.js +1 -0
  126. package/dist/assets/{select-DvwBu99K.js → select-DnxxDpcV.js} +2 -2
  127. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BR5IokXV.js → sequenceDiagram-DBY2YBRQ-BtRbPQtL.js} +1 -1
  128. package/dist/assets/{settings-2-Dmv6zMne.js → settings-2-agnMYc8a.js} +1 -1
  129. package/dist/assets/{sizeCapture-X5ZJPWSS-SxG_YnMA.js → sizeCapture-X5ZJPWSS-CMYvM3SL.js} +1 -1
  130. package/dist/assets/skeleton-XpqeWL62.js +1 -0
  131. package/dist/assets/{src-vgz8E_-O.js → src-Bw-mzbQb.js} +1 -1
  132. package/dist/assets/{stateDiagram-2N3HPSRC-DD4OoYhn.js → stateDiagram-2N3HPSRC-BJ-mFeOz.js} +1 -1
  133. package/dist/assets/stateDiagram-v2-6OUMAXLB-BE-HqxOK.js +1 -0
  134. package/dist/assets/{swimlanes-5IMT3BWC-BWkFeyCT.js → swimlanes-5IMT3BWC-BsucVOO2.js} +2 -2
  135. package/dist/assets/swimlanesDiagram-G3AALYLV-Dr1H9LJH.js +8 -0
  136. package/dist/assets/{tag-chip-gMPvx7n_.js → tag-chip-CPOc8b2N.js} +1 -1
  137. package/dist/assets/{timeline-definition-FHXFAJF6-VTRPy6KA.js → timeline-definition-FHXFAJF6-Bicewlzo.js} +1 -1
  138. package/dist/assets/treeView-QDETBFTQ-npJ5dbqS.js +1 -0
  139. package/dist/assets/treemap-6X3UGDF4-pYrBx6oa.js +1 -0
  140. package/dist/assets/{vennDiagram-L72KCM5P-Bvk42Pek.js → vennDiagram-L72KCM5P-BxOOnO9x.js} +1 -1
  141. package/dist/assets/wardley-OPB4EBWU-CmSRKLR8.js +1 -0
  142. package/dist/assets/{wardleyDiagram-EHGQE667-DOFjx2s3.js → wardleyDiagram-EHGQE667-Cl7NltMv.js} +1 -1
  143. package/dist/assets/x-odTHAtLZ.js +1 -0
  144. package/dist/assets/{xychartDiagram-FW5EYKEG-DY5yRTUc.js → xychartDiagram-FW5EYKEG-DiMIxQ7N.js} +1 -1
  145. package/dist/index.html +21 -22
  146. package/package.json +8 -8
  147. package/src/features/apps/components/__tests__/app-packages-panel.test.tsx +234 -0
  148. package/src/features/apps/components/app-marketplace-dialog.tsx +262 -0
  149. package/src/features/apps/components/app-package-card.tsx +268 -0
  150. package/src/features/apps/components/app-packages-panel.tsx +301 -0
  151. package/src/features/apps/components/apps-panel.tsx +11 -4
  152. package/src/features/apps/hooks/use-app-marketplace.ts +95 -0
  153. package/src/features/apps/hooks/use-app-packages.ts +59 -0
  154. package/src/features/chat/components/chat-sidebar-list-mode-switch.tsx +27 -4
  155. package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +36 -5
  156. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +12 -13
  157. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +79 -2
  158. package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +4 -4
  159. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +26 -5
  160. package/src/features/chat/features/conversation/components/session-conversation-input.tsx +3 -0
  161. package/src/features/chat/features/conversation/hooks/use-system-object-reference-select.ts +27 -0
  162. package/src/features/chat/features/conversation/utils/session-message-composer.utils.ts +5 -0
  163. package/src/features/chat/features/input/hooks/__tests__/use-chat-input-surface-state.test.tsx +102 -0
  164. package/src/features/chat/features/input/hooks/use-chat-input-surface-state.ts +71 -120
  165. package/src/features/chat/features/input/input-surface-plugins/__tests__/context-reference-plugin.test.ts +265 -18
  166. package/src/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.types.ts +7 -2
  167. package/src/features/chat/features/input/input-surface-plugins/chat-input-product-plugin-adapters.utils.ts +124 -0
  168. package/src/features/chat/features/input/input-surface-plugins/context-reference-items.utils.ts +99 -15
  169. package/src/features/chat/features/input/input-surface-plugins/context-reference-plugin.utils.ts +143 -139
  170. package/src/features/chat/features/input/input-surface-plugins/panel-app-input-surface-items.utils.ts +116 -0
  171. package/src/features/chat/features/input/input-surface-plugins/slash-command-plugin.utils.ts +1 -1
  172. package/src/features/chat/features/input/utils/__tests__/chat-inline-token.utils.test.ts +53 -1
  173. package/src/features/chat/features/input/utils/chat-composer-token-protocol.utils.ts +5 -0
  174. package/src/features/chat/features/input/utils/chat-inline-token-composer.utils.ts +134 -0
  175. package/src/features/chat/features/input/utils/chat-inline-token.utils.ts +30 -101
  176. package/src/features/chat/features/input/utils/chat-system-object-reference.utils.test.ts +44 -0
  177. package/src/features/chat/features/input/utils/chat-system-object-reference.utils.ts +46 -0
  178. package/src/features/chat/features/ncp/hooks/__tests__/use-hydrated-ncp-agent.test.tsx +40 -3
  179. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.selection.test.tsx +66 -0
  180. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +13 -1
  181. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +653 -90
  182. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-text-selection.test.tsx +12 -8
  183. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +401 -288
  184. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +54 -35
  185. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +79 -148
  186. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +156 -94
  187. package/src/features/chat/features/workspace/components/project-files/__tests__/workspace-directory-entry-menu.test.tsx +50 -0
  188. package/src/features/chat/features/workspace/components/project-files/workspace-directory-entry-menu.tsx +209 -0
  189. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +459 -0
  190. package/src/features/chat/features/workspace/components/project-files/workspace-new-folder-tree-item.tsx +112 -0
  191. package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +64 -0
  192. package/src/features/chat/features/workspace/hooks/use-workspace-explorer-layout.ts +85 -0
  193. package/src/features/chat/features/workspace/hooks/use-workspace-file-actions.ts +357 -0
  194. package/src/features/chat/features/workspace/utils/chat-workspace-file-path-mutation.utils.ts +58 -0
  195. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +23 -22
  196. package/src/features/chat/features/workspace/utils/chat-workspace-panel-layout.utils.ts +13 -4
  197. package/src/features/chat/index.ts +1 -1
  198. package/src/features/chat/managers/__tests__/chat-composer-intent.manager.test.ts +86 -60
  199. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +103 -99
  200. package/src/features/chat/managers/chat-composer-intent.manager.ts +37 -33
  201. package/src/features/chat/managers/chat-draft-intent.manager.ts +18 -2
  202. package/src/features/chat/managers/chat-thread.manager.ts +132 -128
  203. package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +26 -40
  204. package/src/features/chat/stores/chat-thread.store.ts +53 -74
  205. package/src/features/inbox/components/inbox-reader-dialog.test.tsx +38 -5
  206. package/src/features/inbox/components/inbox-reader-dialog.tsx +5 -3
  207. package/src/features/inbox/managers/inbox.manager.test.ts +28 -3
  208. package/src/features/inbox/managers/inbox.manager.ts +14 -4
  209. package/src/features/inbox/pages/inbox-page.test.ts +121 -2
  210. package/src/features/inbox/pages/inbox-page.tsx +5 -3
  211. package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +85 -1
  212. package/src/features/marketplace/hooks/__tests__/use-marketplace.test.tsx +44 -1
  213. package/src/features/marketplace/hooks/use-marketplace-item-actions.ts +23 -2
  214. package/src/features/marketplace/hooks/use-marketplace.ts +10 -0
  215. package/src/features/marketplace/index.ts +4 -0
  216. package/src/features/panel-apps/index.ts +5 -1
  217. package/src/features/panel-apps/utils/__tests__/panel-app-doc-browser.utils.test.ts +13 -6
  218. package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +6 -3
  219. package/src/features/right-panel-resources/index.ts +1 -0
  220. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +7 -4
  221. package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +20 -1
  222. package/src/features/system-status/components/desktop-update-config.tsx +14 -13
  223. package/src/features/system-status/managers/__tests__/runtime-update.manager.test.ts +99 -0
  224. package/src/features/system-status/managers/runtime-update.manager.ts +22 -0
  225. package/src/features/system-status/stores/runtime-update.store.ts +1 -0
  226. package/src/shared/components/resizable-right-panel/__tests__/resizable-right-panel.test.tsx +35 -38
  227. package/src/shared/components/resizable-right-panel/resizable-right-panel.tsx +25 -19
  228. package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +15 -0
  229. package/src/shared/components/ui/actions/icon-action-button.tsx +4 -2
  230. package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +60 -34
  231. package/src/shared/components/ui/context-menu/context-menu.tsx +95 -68
  232. package/src/shared/hooks/use-system-object-references.ts +22 -0
  233. package/src/shared/lib/api/managers/client.manager.ts +31 -17
  234. package/src/shared/lib/api/server-path/server-path.types.ts +66 -0
  235. package/src/shared/lib/api/types.ts +155 -116
  236. package/src/shared/lib/api/utils/server-path.utils.ts +35 -11
  237. package/src/shared/lib/i18n/locales/en-US/chat.json +58 -9
  238. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +7 -4
  239. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +40 -0
  240. package/src/shared/lib/i18n/locales/en-US/marketplace.json +3 -0
  241. package/src/shared/lib/i18n/locales/zh-CN/chat.json +60 -11
  242. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +7 -4
  243. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +40 -0
  244. package/src/shared/lib/i18n/locales/zh-CN/marketplace.json +3 -0
  245. package/dist/assets/appearance-settings-page-DpVJjvkB.js +0 -1
  246. package/dist/assets/architecture-TIHT7OUA-Bjp9jf0h.js +0 -1
  247. package/dist/assets/channel-5T3pdR-s.js +0 -1
  248. package/dist/assets/chat-page-BuFDmG5_.js +0 -1
  249. package/dist/assets/chunk-2Q5K7J3B-DTZ3tGfE.js +0 -1
  250. package/dist/assets/chunk-VAUOI2AC-HLGIHQ6k.js +0 -1
  251. package/dist/assets/chunk-XXDRQBXY-Dl0m6Ni-.js +0 -1
  252. package/dist/assets/classDiagram-OUVF2IWQ-DcDnzGNX.js +0 -1
  253. package/dist/assets/classDiagram-v2-EOCWNBFH-BKXKMzKM.js +0 -1
  254. package/dist/assets/config-split-page-BVWVDbvG.js +0 -1
  255. package/dist/assets/confirm-dialog-mA2iVzxh.js +0 -5
  256. package/dist/assets/cynefin-VYW2F7L2-BWg7U2UD.js +0 -1
  257. package/dist/assets/desktop-update-config-DyQb1LXr.js +0 -1
  258. package/dist/assets/doc-browser-CtO_HtRy.js +0 -1
  259. package/dist/assets/doc-browser-context-CuGI6PQc.js +0 -1
  260. package/dist/assets/doc-browser-eMUagyBV.js +0 -1
  261. package/dist/assets/eventmodeling-45OFAUF4-SB-J4tpq.js +0 -1
  262. package/dist/assets/flowDiagram-23GEKE2U-BQ_u-eLM.js +0 -1
  263. package/dist/assets/form-actions-BOfIyG3O.js +0 -1
  264. package/dist/assets/gitGraph-TEB2WS4Q-DPxNwsFd.js +0 -1
  265. package/dist/assets/index-BjBdWHV1.js +0 -107
  266. package/dist/assets/index-DmpmjAGQ.css +0 -1
  267. package/dist/assets/info-DKCQHKI2-DNlNGH90.js +0 -1
  268. package/dist/assets/loader-circle-Df8wF2Pr.js +0 -1
  269. package/dist/assets/mcp-marketplace-page-DI49IKxp.js +0 -1
  270. package/dist/assets/mcp-marketplace-page-ofDqbOIF.js +0 -9
  271. package/dist/assets/model-config-page-D73Tu3jW.js +0 -1
  272. package/dist/assets/packet-7NZHBO7P-BpeiqkBZ.js +0 -1
  273. package/dist/assets/pie-RZYD4A2V-Cy1yxsPd.js +0 -1
  274. package/dist/assets/plus-DVU5RLCS.js +0 -1
  275. package/dist/assets/provider-scoped-model-input-BaJJJYMX.js +0 -1
  276. package/dist/assets/providers-config-page-BL6IRVBm.js +0 -1
  277. package/dist/assets/radar-I7S5WNFK-CEcPKCj8.js +0 -1
  278. package/dist/assets/railroad-3IZDKUUU-CW38eNDs.js +0 -1
  279. package/dist/assets/railroad-abnf-AHOZXSZD-ByrylcXf.js +0 -1
  280. package/dist/assets/railroad-ebnf-EBAXGLYW-CNB6GwP-.js +0 -1
  281. package/dist/assets/railroad-peg-LSFZ7HO6-x6hnqlBG.js +0 -1
  282. package/dist/assets/react-BC_orpAj.js +0 -8
  283. package/dist/assets/remote-T24O58lH.js +0 -1
  284. package/dist/assets/rotate-cw-BqhwSV5p.js +0 -1
  285. package/dist/assets/runtime-config-page-CXUx017t.js +0 -1
  286. package/dist/assets/search-config-page-BB6d5gT7.js +0 -1
  287. package/dist/assets/secrets-config-page-DYsDeT9K.js +0 -3
  288. package/dist/assets/security-config-CVPgqL7G.js +0 -1
  289. package/dist/assets/skeleton-C5tWata3.js +0 -1
  290. package/dist/assets/stateDiagram-v2-6OUMAXLB-ZC6dFORv.js +0 -1
  291. package/dist/assets/swimlanesDiagram-G3AALYLV-CRkh51Im.js +0 -8
  292. package/dist/assets/treeView-QDETBFTQ-Bw0DSCH7.js +0 -1
  293. package/dist/assets/treemap-6X3UGDF4-DFWBFcfh.js +0 -1
  294. package/dist/assets/use-confirm-dialog-D_3-QpZU.js +0 -1
  295. package/dist/assets/wardley-OPB4EBWU-CoWturk0.js +0 -1
  296. package/dist/assets/x-BEWSqeux.js +0 -1
  297. /package/dist/assets/{array-NADKd9aU.js → array-BQVzeGRt.js} +0 -0
  298. /package/dist/assets/{chunk-KEIR6QF5-BuyuzJJL.js → chunk-KEIR6QF5-f9psyCXK.js} +0 -0
  299. /package/dist/assets/{chunk-Y2CYZVJY-D_B2ZRNt.js → chunk-Y2CYZVJY-D1mAU_Po.js} +0 -0
  300. /package/dist/assets/{config-hints-BcfVUMij.js → config-hints-nV5HPOvq.js} +0 -0
  301. /package/dist/assets/{cytoscape.esm-BANTlgza.js → cytoscape.esm-0uDtdD0l.js} +0 -0
  302. /package/dist/assets/{defaultLocale-C4_L0aEs.js → defaultLocale-DSWXGgt0.js} +0 -0
  303. /package/dist/assets/{dist-DAPEIJbz.js → dist--ta5rX12.js} +0 -0
  304. /package/dist/assets/{graphlib-ChqXg0dI.js → graphlib-CQ6QV4yP.js} +0 -0
  305. /package/dist/assets/{host-capabilities-D9C4CBK5.js → host-capabilities-Tk038i04.js} +0 -0
  306. /package/dist/assets/{init-D8wZg9xq.js → init-Y6h9jGtZ.js} +0 -0
  307. /package/dist/assets/{jszip.min-CkbBfwAQ.js → jszip.min-8hyJpgpx.js} +0 -0
  308. /package/dist/assets/{katex-TZJFa0J_.js → katex-ARhY9PS1.js} +0 -0
  309. /package/dist/assets/{middleware-B3k-TSmZ.js → middleware-DXsbf9xI.js} +0 -0
  310. /package/dist/assets/{path-DodfxcX7.js → path-10BjdyLh.js} +0 -0
  311. /package/dist/assets/{rough.esm-CUaa1Rbe.js → rough.esm-DxgC_14r.js} +0 -0
  312. /package/dist/assets/{xlsx-CxByi7bR.js → xlsx-DrDuDNAa.js} +0 -0
@@ -8,26 +8,40 @@ import {
8
8
  type MouseEvent,
9
9
  type ReactElement,
10
10
  type ReactNode,
11
- } from "react";
12
- import { createPortal } from "react-dom";
13
- import { cn } from "@/shared/lib/utils";
11
+ } from 'react';
12
+ import { createPortal } from 'react-dom';
13
+ import { cn } from '@/shared/lib/utils';
14
14
 
15
- export type ContextMenuItem = {
15
+ type ContextMenuItemBase = {
16
16
  key: string;
17
17
  label: string;
18
18
  icon?: ReactNode;
19
+ destructive?: boolean;
19
20
  disabled?: boolean;
20
21
  restoreFocus?: boolean;
21
- onSelect: () => void;
22
22
  };
23
23
 
24
+ export type ContextMenuItem = ContextMenuItemBase &
25
+ (
26
+ | {
27
+ download?: string;
28
+ href: string;
29
+ onSelect?: () => void;
30
+ }
31
+ | {
32
+ download?: never;
33
+ href?: never;
34
+ onSelect: () => void;
35
+ }
36
+ );
37
+
24
38
  export type ContextMenuGroup = {
25
39
  key: string;
26
40
  items: readonly ContextMenuItem[];
27
41
  };
28
42
 
29
43
  type ContextMenuPosition = {
30
- align: "start" | "end";
44
+ align: 'start' | 'end';
31
45
  x: number;
32
46
  y: number;
33
47
  trigger: HTMLElement;
@@ -61,9 +75,7 @@ function ContextMenuSurface({
61
75
  return;
62
76
  }
63
77
  const rect = menu.getBoundingClientRect();
64
- const preferredLeft = position.align === "end"
65
- ? position.x - rect.width
66
- : position.x;
78
+ const preferredLeft = position.align === 'end' ? position.x - rect.width : position.x;
67
79
  const left = Math.max(
68
80
  CONTEXT_MENU_EDGE_GAP,
69
81
  Math.min(preferredLeft, window.innerWidth - rect.width - CONTEXT_MENU_EDGE_GAP),
@@ -74,22 +86,16 @@ function ContextMenuSurface({
74
86
  );
75
87
  menu.style.left = `${left}px`;
76
88
  menu.style.top = `${top}px`;
77
- menu.querySelector<HTMLButtonElement>('[role="menuitem"]:not(:disabled)')?.focus();
89
+ menu.querySelector<HTMLElement>('[role="menuitem"]:not(:disabled)')?.focus();
78
90
  }, [position]);
79
91
 
80
92
  const moveFocus = (direction: 1 | -1) => {
81
- const items = Array.from(
82
- menuRef.current?.querySelectorAll<HTMLButtonElement>(
83
- '[role="menuitem"]:not(:disabled)',
84
- ) ?? [],
85
- );
93
+ const items = Array.from(menuRef.current?.querySelectorAll<HTMLElement>('[role="menuitem"]:not(:disabled)') ?? []);
86
94
  if (items.length === 0) {
87
95
  return;
88
96
  }
89
- const currentIndex = items.indexOf(document.activeElement as HTMLButtonElement);
90
- const nextIndex = currentIndex < 0
91
- ? 0
92
- : (currentIndex + direction + items.length) % items.length;
97
+ const currentIndex = items.indexOf(document.activeElement as HTMLElement);
98
+ const nextIndex = currentIndex < 0 ? 0 : (currentIndex + direction + items.length) % items.length;
93
99
  items[nextIndex]?.focus();
94
100
  };
95
101
 
@@ -107,50 +113,78 @@ function ContextMenuSurface({
107
113
  style={{ left: position.x, top: position.y }}
108
114
  onPointerDown={(event) => event.stopPropagation()}
109
115
  onKeyDown={(event) => {
110
- if (event.key === "Escape") {
116
+ if (event.key === 'Escape') {
111
117
  event.preventDefault();
112
118
  onClose(true);
113
- } else if (event.key === "ArrowDown") {
119
+ } else if (event.key === 'ArrowDown') {
114
120
  event.preventDefault();
115
121
  moveFocus(1);
116
- } else if (event.key === "ArrowUp") {
122
+ } else if (event.key === 'ArrowUp') {
117
123
  event.preventDefault();
118
124
  moveFocus(-1);
119
- } else if (event.key === "Home" || event.key === "End") {
125
+ } else if (event.key === 'Home' || event.key === 'End') {
120
126
  event.preventDefault();
121
- const items = menuRef.current?.querySelectorAll<HTMLButtonElement>(
122
- '[role="menuitem"]:not(:disabled)',
123
- );
124
- items?.[event.key === "Home" ? 0 : items.length - 1]?.focus();
127
+ const items = menuRef.current?.querySelectorAll<HTMLElement>('[role="menuitem"]:not(:disabled)');
128
+ items?.[event.key === 'Home' ? 0 : items.length - 1]?.focus();
125
129
  }
126
130
  }}
127
131
  >
128
132
  {groups.map((group, groupIndex) => (
129
133
  <div key={group.key} role="group">
130
134
  {groupIndex > 0 ? <div className="my-1 h-px bg-border" /> : null}
131
- {group.items.map((item) => (
132
- <button
133
- key={item.key}
134
- type="button"
135
- role="menuitem"
136
- disabled={item.disabled}
137
- className={cn(
138
- "flex h-8 w-full items-center gap-2 rounded-lg px-2.5 text-left text-[13px] font-medium text-foreground outline-none transition-colors",
139
- "hover:bg-muted focus-visible:bg-muted disabled:pointer-events-none disabled:opacity-45",
140
- )}
141
- onClick={() => {
142
- item.onSelect();
143
- onClose(item.restoreFocus !== false);
144
- }}
145
- >
146
- {item.icon ? (
147
- <span className="inline-flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground">
148
- {item.icon}
149
- </span>
150
- ) : null}
151
- <span className="min-w-0 flex-1 truncate">{item.label}</span>
152
- </button>
153
- ))}
135
+ {group.items.map((item) => {
136
+ const itemClassName = cn(
137
+ 'flex h-8 w-full items-center gap-2 rounded-lg px-2.5 text-left text-[13px] font-medium outline-none transition-colors',
138
+ item.destructive
139
+ ? 'text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10'
140
+ : 'text-foreground hover:bg-muted focus-visible:bg-muted',
141
+ 'disabled:pointer-events-none disabled:opacity-45',
142
+ );
143
+ const content = (
144
+ <>
145
+ {item.icon ? (
146
+ <span
147
+ className={cn(
148
+ 'inline-flex h-4 w-4 shrink-0 items-center justify-center',
149
+ item.destructive ? 'text-destructive' : 'text-muted-foreground',
150
+ )}
151
+ >
152
+ {item.icon}
153
+ </span>
154
+ ) : null}
155
+ <span className="min-w-0 flex-1 truncate">{item.label}</span>
156
+ </>
157
+ );
158
+ return item.href ? (
159
+ <a
160
+ key={item.key}
161
+ role="menuitem"
162
+ className={itemClassName}
163
+ href={item.href}
164
+ download={item.download}
165
+ onClick={() => {
166
+ item.onSelect?.();
167
+ onClose(false);
168
+ }}
169
+ >
170
+ {content}
171
+ </a>
172
+ ) : (
173
+ <button
174
+ key={item.key}
175
+ type="button"
176
+ role="menuitem"
177
+ disabled={item.disabled}
178
+ className={itemClassName}
179
+ onClick={() => {
180
+ item.onSelect?.();
181
+ onClose(item.restoreFocus !== false);
182
+ }}
183
+ >
184
+ {content}
185
+ </button>
186
+ );
187
+ })}
154
188
  </div>
155
189
  ))}
156
190
  </div>
@@ -165,7 +199,7 @@ export function ContextMenu({
165
199
  label,
166
200
  }: {
167
201
  children: ReactElement<{
168
- "data-context-menu-open"?: string;
202
+ 'data-context-menu-open'?: string;
169
203
  onContextMenu?: (event: MouseEvent) => void;
170
204
  }>;
171
205
  groups: readonly ContextMenuGroup[];
@@ -191,7 +225,7 @@ export function ContextMenu({
191
225
  }
192
226
  const bounds = trigger.getBoundingClientRect();
193
227
  setPosition({
194
- align: "end",
228
+ align: 'end',
195
229
  x: bounds.right,
196
230
  y: bounds.bottom,
197
231
  trigger,
@@ -199,7 +233,7 @@ export function ContextMenu({
199
233
  };
200
234
 
201
235
  const child = cloneElement(children, {
202
- "data-context-menu-open": position ? "" : undefined,
236
+ 'data-context-menu-open': position ? '' : undefined,
203
237
  onContextMenu: (event: MouseEvent) => {
204
238
  children.props.onContextMenu?.(event);
205
239
  if (event.defaultPrevented || visibleGroups.length === 0) {
@@ -209,7 +243,7 @@ export function ContextMenu({
209
243
  const trigger = event.currentTarget as HTMLElement;
210
244
  const bounds = trigger.getBoundingClientRect();
211
245
  setPosition({
212
- align: "start",
246
+ align: 'start',
213
247
  x: event.clientX || bounds.left,
214
248
  y: event.clientY || bounds.bottom,
215
249
  trigger,
@@ -218,17 +252,10 @@ export function ContextMenu({
218
252
  });
219
253
 
220
254
  return (
221
- <ContextMenuControllerContext.Provider
222
- value={{ isOpen: Boolean(position), toggleFromButton }}
223
- >
255
+ <ContextMenuControllerContext.Provider value={{ isOpen: Boolean(position), toggleFromButton }}>
224
256
  {child}
225
257
  {position ? (
226
- <ContextMenuSurface
227
- groups={visibleGroups}
228
- label={label}
229
- position={position}
230
- onClose={closeMenu}
231
- />
258
+ <ContextMenuSurface groups={visibleGroups} label={label} position={position} onClose={closeMenu} />
232
259
  ) : null}
233
260
  </ContextMenuControllerContext.Provider>
234
261
  );
@@ -238,19 +265,19 @@ export function ContextMenuTrigger({
238
265
  children,
239
266
  }: {
240
267
  children: ReactElement<{
241
- "aria-expanded"?: boolean;
242
- "aria-haspopup"?: "menu";
268
+ 'aria-expanded'?: boolean;
269
+ 'aria-haspopup'?: 'menu';
243
270
  onClick?: (event: MouseEvent) => void;
244
271
  }>;
245
272
  }) {
246
273
  const controller = useContext(ContextMenuControllerContext);
247
274
  if (!controller) {
248
- throw new Error("ContextMenuTrigger must be rendered inside ContextMenu");
275
+ throw new Error('ContextMenuTrigger must be rendered inside ContextMenu');
249
276
  }
250
277
 
251
278
  return cloneElement(children, {
252
- "aria-expanded": controller.isOpen,
253
- "aria-haspopup": "menu",
279
+ 'aria-expanded': controller.isOpen,
280
+ 'aria-haspopup': 'menu',
254
281
  onClick: (event: MouseEvent) => {
255
282
  children.props.onClick?.(event);
256
283
  if (event.defaultPrevented) {
@@ -0,0 +1,22 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { nextclawClient } from '@/shared/lib/api';
3
+
4
+ export function useSystemObjectReferences(params: {
5
+ enabled: boolean;
6
+ query: string;
7
+ limit?: number;
8
+ objectType?: string;
9
+ }) {
10
+ const { enabled, limit, objectType } = params;
11
+ const query = params.query.trim();
12
+ return useQuery({
13
+ queryKey: ['system-object-references', objectType ?? null, query, limit ?? null],
14
+ queryFn: () => nextclawClient.systemObjectReferences.list({
15
+ query: query || undefined,
16
+ limit,
17
+ objectType,
18
+ }),
19
+ enabled,
20
+ staleTime: 10_000,
21
+ });
22
+ }
@@ -1,24 +1,33 @@
1
1
  import {
2
2
  NextClawClient,
3
+ NextClawClientError,
3
4
  type NextClawRealtimeEvent,
4
5
  type NextClawQueryParams,
5
6
  type NextClawTransport,
6
7
  type NextClawTransportRequestInput,
7
- type NextClawTransportUploadInput
8
+ type NextClawTransportUploadInput,
8
9
  } from '@nextclaw/client-sdk';
9
10
  import { API_BASE } from '@/shared/lib/api/api-base';
10
11
  import { appClient } from '@/shared/lib/transport';
11
12
  import type { ApiResponse } from '@/shared/lib/api/types';
12
13
 
13
14
  const nextclawUiTransport: NextClawTransport = {
14
- request: async <T>({ body, headers, method, path, query, signal, timeoutMs }: NextClawTransportRequestInput): Promise<T> => {
15
+ request: async <T>({
16
+ body,
17
+ headers,
18
+ method,
19
+ path,
20
+ query,
21
+ signal,
22
+ timeoutMs,
23
+ }: NextClawTransportRequestInput): Promise<T> => {
15
24
  return await appClient.request({
16
25
  method,
17
26
  path: appendQueryToPath(path, serializeQuery(query)),
18
27
  ...(body !== undefined ? { body } : {}),
19
28
  ...(headers ? { headers } : {}),
20
29
  ...(signal ? { signal } : {}),
21
- ...(timeoutMs !== undefined ? { timeoutMs } : {})
30
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
22
31
  });
23
32
  },
24
33
  upload: async <T>({ formData, headers, path, signal }: NextClawTransportUploadInput): Promise<T> => {
@@ -27,25 +36,30 @@ const nextclawUiTransport: NextClawTransport = {
27
36
  body: formData,
28
37
  credentials: 'include',
29
38
  ...(headers ? { headers } : {}),
30
- ...(signal ? { signal } : {})
39
+ ...(signal ? { signal } : {}),
31
40
  });
32
41
  const payload = (await response.json()) as ApiResponse<unknown>;
33
42
  if (!response.ok || !payload.ok) {
34
- throw new Error(readApiErrorMessage(payload, `Upload failed for ${path}`));
43
+ throw new NextClawClientError({
44
+ message: readApiErrorMessage(payload, `Upload failed for ${path}`),
45
+ status: response.status,
46
+ code: !payload.ok ? payload.error.code : undefined,
47
+ details: !payload.ok ? payload.error.details : undefined,
48
+ });
35
49
  }
36
50
  return payload.data as T;
37
51
  },
38
- subscribe: (handler: (event: NextClawRealtimeEvent) => void) => appClient.subscribe(handler)
52
+ subscribe: (handler: (event: NextClawRealtimeEvent) => void) => appClient.subscribe(handler),
39
53
  };
40
54
 
41
55
  export const nextclawClient = new NextClawClient({
42
56
  baseUrl: API_BASE,
43
- transport: nextclawUiTransport
57
+ transport: nextclawUiTransport,
44
58
  });
45
59
 
46
60
  export async function requestApiResponse<T>(
47
61
  endpoint: string,
48
- options: RequestInit & { timeoutMs?: number } = {}
62
+ options: RequestInit & { timeoutMs?: number } = {},
49
63
  ): Promise<ApiResponse<T>> {
50
64
  const method = (options.method || 'GET').toUpperCase();
51
65
  try {
@@ -53,11 +67,11 @@ export async function requestApiResponse<T>(
53
67
  method: method as 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',
54
68
  path: endpoint,
55
69
  ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
56
- ...(options.body !== undefined ? { body: parseRequestBody(options.body) } : {})
70
+ ...(options.body !== undefined ? { body: parseRequestBody(options.body) } : {}),
57
71
  });
58
72
  return {
59
73
  ok: true,
60
- data
74
+ data,
61
75
  };
62
76
  } catch (error) {
63
77
  return {
@@ -67,9 +81,9 @@ export async function requestApiResponse<T>(
67
81
  message: error instanceof Error ? error.message : String(error),
68
82
  details: {
69
83
  method,
70
- endpoint
71
- }
72
- }
84
+ endpoint,
85
+ },
86
+ },
73
87
  };
74
88
  }
75
89
  }
@@ -80,17 +94,17 @@ export const api = {
80
94
  put: <T>(path: string, body: unknown) =>
81
95
  requestApiResponse<T>(path, {
82
96
  method: 'PUT',
83
- body: JSON.stringify(body)
97
+ body: JSON.stringify(body),
84
98
  }),
85
99
  post: <T>(path: string, body: unknown) =>
86
100
  requestApiResponse<T>(path, {
87
101
  method: 'POST',
88
- body: JSON.stringify(body)
102
+ body: JSON.stringify(body),
89
103
  }),
90
104
  delete: <T>(path: string) =>
91
105
  requestApiResponse<T>(path, {
92
- method: 'DELETE'
93
- })
106
+ method: 'DELETE',
107
+ }),
94
108
  };
95
109
 
96
110
  function parseRequestBody(body: BodyInit | null | undefined): unknown {
@@ -0,0 +1,66 @@
1
+ export type ServerPathEntryView = {
2
+ name: string;
3
+ path: string;
4
+ kind: 'directory' | 'file';
5
+ hidden: boolean;
6
+ };
7
+
8
+ export type ServerPathBreadcrumbView = { label: string; path: string };
9
+
10
+ export type ServerPathLocationView = {
11
+ kind: 'desktop' | 'documents' | 'downloads' | 'icloud-drive' | 'applications' | 'volumes';
12
+ path: string;
13
+ };
14
+
15
+ export type ServerPathBrowseView = {
16
+ currentPath: string;
17
+ parentPath: string | null;
18
+ homePath: string;
19
+ breadcrumbs: ServerPathBreadcrumbView[];
20
+ entries: ServerPathEntryView[];
21
+ locations: ServerPathLocationView[];
22
+ };
23
+
24
+ export type ServerPathSearchEntryView = {
25
+ name: string;
26
+ path: string;
27
+ relativePath: string;
28
+ parentRelativePath: string;
29
+ kind: 'directory' | 'file';
30
+ hidden: boolean;
31
+ };
32
+
33
+ export type ServerPathSearchView = {
34
+ basePath: string;
35
+ query: string;
36
+ entries: ServerPathSearchEntryView[];
37
+ truncated: boolean;
38
+ };
39
+
40
+ export type ServerPathDirectoryCreateRequest = { basePath?: string; parentPath: string; name: string };
41
+ export type ServerPathDirectoryCreateView = { path: string };
42
+ export type ServerPathFileCreateRequest = { basePath: string; parentPath: string; name: string };
43
+ export type ServerPathFileCreateView = { name: string; path: string; kind: 'file' };
44
+ export type ServerPathEntryRenameRequest = { basePath: string; path: string; name: string };
45
+ export type ServerPathEntryRenameView = {
46
+ oldPath: string;
47
+ path: string;
48
+ name: string;
49
+ kind: 'directory' | 'file';
50
+ };
51
+ export type ServerPathEntryDeleteView = { path: string; kind: 'directory' | 'file' };
52
+ export type ServerPathFilesUploadView = {
53
+ files: Array<{ name: string; path: string; sizeBytes: number }>;
54
+ overwritten: boolean;
55
+ };
56
+
57
+ export type ServerPathReadView = {
58
+ requestedPath: string;
59
+ resolvedPath: string;
60
+ kind: 'text' | 'markdown' | 'binary';
61
+ sizeBytes: number;
62
+ startLine?: number;
63
+ truncated: boolean;
64
+ text?: string;
65
+ languageHint?: string | null;
66
+ };