@nextclaw/ui 0.24.1 → 0.24.3

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 (353) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/.vite/manifest.json +2477 -0
  3. package/dist/assets/{abnfDiagram-VRR7QNED-BcFJp_1X.js → abnfDiagram-VRR7QNED-Kzlh3ZEC.js} +1 -1
  4. package/dist/assets/account-panel-BRTSwNvA.js +1 -0
  5. package/dist/assets/{aiden0z-pptx-renderer.es-Dp2ezlQn.js → aiden0z-pptx-renderer.es-k1xZLzeo.js} +1 -1
  6. package/dist/assets/api-BnUzdltV.js +13 -0
  7. package/dist/assets/app-data-Bjh_zM45.js +1 -0
  8. package/dist/assets/app-presenter-provider-CBt-lyr_.js +109 -0
  9. package/dist/assets/app-presenter-provider-D3BuuOyZ.css +1 -0
  10. package/dist/assets/appearance-settings-page-BrOYSgG0.js +1 -0
  11. package/dist/assets/{arc-CkgyPMyW.js → arc-CpivM836.js} +1 -1
  12. package/dist/assets/architecture-TIHT7OUA-CVRF_cYQ.js +1 -0
  13. package/dist/assets/{architectureDiagram-ZJ3FMSHR-CMd4cIjI.js → architectureDiagram-ZJ3FMSHR-ifjW1qjI.js} +1 -1
  14. package/dist/assets/{blockDiagram-677ZJIJ3-Bz3tbhet.js → blockDiagram-677ZJIJ3-C_zeJrKF.js} +1 -1
  15. package/dist/assets/{book-open-o2x7OLiO.js → book-open-xqEj1OLE.js} +1 -1
  16. package/dist/assets/boxes-D6uPnkGo.js +1 -0
  17. package/dist/assets/{c4Diagram-LMCZKHZV-D9hFNAGv.js → c4Diagram-LMCZKHZV-CpapRftp.js} +1 -1
  18. package/dist/assets/card-CS8su2Zh.js +1 -0
  19. package/dist/assets/channel-CBrWRr4N.js +1 -0
  20. package/dist/assets/channels-list-page-BE0TxB3B.js +8 -0
  21. package/dist/assets/chevron-down-BL-yMYcX.js +1 -0
  22. package/dist/assets/chunk-2Q5K7J3B-B8mmRk7d.js +1 -0
  23. package/dist/assets/{chunk-32BRIVSS-7NrjEITq.js → chunk-32BRIVSS-BKBwdmKR.js} +1 -1
  24. package/dist/assets/{chunk-52WLFC77-viIcqj9q.js → chunk-52WLFC77-BgZRCpDx.js} +1 -1
  25. package/dist/assets/{chunk-5FCAYU7R-Vsu4J-VM.js → chunk-5FCAYU7R-YWfOINJi.js} +1 -1
  26. package/dist/assets/{chunk-5HE753X5-C-w6CQZK.js → chunk-5HE753X5-BZ6I07d2.js} +1 -1
  27. package/dist/assets/{chunk-5JV3BV7I-CuKgJQ4W.js → chunk-5JV3BV7I-B7QYgZU5.js} +1 -1
  28. package/dist/assets/{chunk-5TONJI2A-CYeiWZKb.js → chunk-5TONJI2A-DjyQwgL2.js} +1 -1
  29. package/dist/assets/{chunk-5VM5RSS4-DRCbfwIn.js → chunk-5VM5RSS4-DheHV7X2.js} +1 -1
  30. package/dist/assets/{chunk-7BUUIJ7U-BvydOcm3.js → chunk-7BUUIJ7U-D6bq2PKF.js} +1 -1
  31. package/dist/assets/{chunk-BIQX33UG-RlppOXKo.js → chunk-BIQX33UG-CL9x0ibm.js} +1 -1
  32. package/dist/assets/{chunk-C7G6YPKG-DAizzYwr.js → chunk-C7G6YPKG-8z3B6RUH.js} +1 -1
  33. package/dist/assets/{chunk-CQNSW5MT-5eChJHca.js → chunk-CQNSW5MT-DpHkxY3n.js} +1 -1
  34. package/dist/assets/{chunk-CYSBUYHQ-YHPr53fv.js → chunk-CYSBUYHQ-DIJDLsdJ.js} +1 -1
  35. package/dist/assets/{chunk-EMLP6XTP-CK4D7Hz5.js → chunk-EMLP6XTP-B-LjAyVd.js} +1 -1
  36. package/dist/assets/{chunk-EX3LRPZG-BmlDFIRW.js → chunk-EX3LRPZG-BChuEPvO.js} +1 -1
  37. package/dist/assets/{chunk-FWX5IMBZ-D0ksHZZ9.js → chunk-FWX5IMBZ-fBFt0u3f.js} +2 -2
  38. package/dist/assets/{chunk-HOUHSVGY-DPkq8FCm.js → chunk-HOUHSVGY-MD0SpW5A.js} +1 -1
  39. package/dist/assets/{chunk-ICXQ74PX-FAatv5fC.js → chunk-ICXQ74PX-DvCcw_hz.js} +1 -1
  40. package/dist/assets/{chunk-JG7HCLWE-DLkIi4F7.js → chunk-JG7HCLWE-B8zqBnU9.js} +1 -1
  41. package/dist/assets/{chunk-JWPE2WC7-DawOjNE3.js → chunk-JWPE2WC7-C9efnkGb.js} +1 -1
  42. package/dist/assets/{chunk-MOJQB5TN-Di52TorW.js → chunk-MOJQB5TN-gXbfqoqq.js} +1 -1
  43. package/dist/assets/{chunk-MOZMSUNE-PfyK9w1-.js → chunk-MOZMSUNE-twIwdkqC.js} +1 -1
  44. package/dist/assets/{chunk-OGEWGWER-C3jdH3Ty.js → chunk-OGEWGWER-DdR0_cWK.js} +1 -1
  45. package/dist/assets/{chunk-OSBZ3O6U-CecHo-f0.js → chunk-OSBZ3O6U-D7D58Foa.js} +1 -1
  46. package/dist/assets/{chunk-PUDLZKDR-f3IJh3sN.js → chunk-PUDLZKDR-DPILgOVY.js} +1 -1
  47. package/dist/assets/{chunk-Q4XR5HBZ-DQFeUPxZ.js → chunk-Q4XR5HBZ-C0JJx7lW.js} +1 -1
  48. package/dist/assets/{chunk-QBLGF6JB-BhUeG0y2.js → chunk-QBLGF6JB-Dbsf69ng.js} +1 -1
  49. package/dist/assets/{chunk-R7FJI6CG-C3XpZ-2u.js → chunk-R7FJI6CG-Bb8n616-.js} +1 -1
  50. package/dist/assets/{chunk-RYQCIY6F-CAqa5klQ.js → chunk-RYQCIY6F-1HOsOrSl.js} +1 -1
  51. package/dist/assets/{chunk-U6XO7XAA-D_WXezeD.js → chunk-U6XO7XAA-BAFDVb1v.js} +1 -1
  52. package/dist/assets/{chunk-V7JOEXUC-CZ70oOtp.js → chunk-V7JOEXUC-8-g68lu5.js} +1 -1
  53. package/dist/assets/chunk-VAUOI2AC-Cpml0inz.js +1 -0
  54. package/dist/assets/{chunk-VR4S4FIN-B7AHEYYk.js → chunk-VR4S4FIN-P6UGmaYd.js} +1 -1
  55. package/dist/assets/{chunk-WYO6CB5R-Dn9To_OI.js → chunk-WYO6CB5R-6wjFTXNP.js} +2 -2
  56. package/dist/assets/chunk-XXDRQBXY-nCiqnCpF.js +1 -0
  57. package/dist/assets/{chunk-YOTPTUD7-BYEgRBk3.js → chunk-YOTPTUD7-CLYXVZAi.js} +1 -1
  58. package/dist/assets/{chunk-ZGVPDNZ5-C6YtZDU0.js → chunk-ZGVPDNZ5-BRTmSAhp.js} +1 -1
  59. package/dist/assets/{chunk-ZIRB5QZD-DMuYtnHF.js → chunk-ZIRB5QZD-CH_1eoSV.js} +1 -1
  60. package/dist/assets/circle-alert-lSa3LRvS.js +1 -0
  61. package/dist/assets/circle-dashed-CU3yApvP.js +1 -0
  62. package/dist/assets/classDiagram-OUVF2IWQ-C-DRqAaW.js +1 -0
  63. package/dist/assets/classDiagram-v2-EOCWNBFH-DXCcZ42U.js +1 -0
  64. package/dist/assets/client-BtGBwLTs.js +1 -0
  65. package/dist/assets/config-split-page-BxDwwAGa.js +1 -0
  66. package/dist/assets/confirm-dialog-S5JxZcS1.js +1 -0
  67. package/dist/assets/{cose-bilkent-JH36ORCC-Bc2Ex5Y3.js → cose-bilkent-JH36ORCC-L7w_qScX.js} +1 -1
  68. package/dist/assets/{createLucideIcon-rwwpqyks.js → createLucideIcon-BNKf0_kc.js} +1 -1
  69. package/dist/assets/cynefin-VYW2F7L2-2SOTgxxC.js +1 -0
  70. package/dist/assets/{cynefinDiagram-TSTJHNR4-DVysQoGz.js → cynefinDiagram-TSTJHNR4-Bay7uDSR.js} +1 -1
  71. package/dist/assets/{dagre-CMhQ1cAG.js → dagre-CJ_hX8xv.js} +1 -1
  72. package/dist/assets/{dagre-VKFMJZFB-RYyWpPJZ.js → dagre-VKFMJZFB-DDhk-2B3.js} +1 -1
  73. package/dist/assets/desktop-capabilities-page-BwHxJpbl.js +1 -0
  74. package/dist/assets/desktop-update-config-Bfg7OdJ2.js +1 -0
  75. package/dist/assets/{diagram-FQU43EPY-BD6KONdF.js → diagram-FQU43EPY-somFq5y8.js} +1 -1
  76. package/dist/assets/{diagram-G47NLZAW-CGB2ptRR.js → diagram-G47NLZAW-hzgyQsPd.js} +1 -1
  77. package/dist/assets/{diagram-NH7WQ7WH-DnkOI6cU.js → diagram-NH7WQ7WH-BkJ4gEQJ.js} +1 -1
  78. package/dist/assets/{diagram-OA4YK3LP-DF82RZ7P.js → diagram-OA4YK3LP-CS3ZkK4w.js} +1 -1
  79. package/dist/assets/{diagram-WEI45ONY-Be2v7Ck9.js → diagram-WEI45ONY-BApo-JHS.js} +1 -1
  80. package/dist/assets/dialog-Xe73hpQz.js +5 -0
  81. package/dist/assets/dist-BiIcnf9j.js +1 -0
  82. package/dist/assets/dist-C5I0v8Qn.js +1 -0
  83. package/dist/assets/{dist--ta5rX12.js → dist-Cnhwure9.js} +1 -1
  84. package/dist/assets/{dist-aNN3iQxV.js → dist-czPa8xFO.js} +1 -1
  85. package/dist/assets/doc-browser-BgRP0Wni.js +1 -0
  86. package/dist/assets/doc-browser-C8eqJLi_.js +1 -0
  87. package/dist/assets/doc-browser-context-BPCDFcC-.js +1 -0
  88. package/dist/assets/{docx-preview-BqwAjrj3.js → docx-preview-ByCKKIVT.js} +1 -1
  89. package/dist/assets/{ebnfDiagram-CCIWWBDH-CP98OYk8.js → ebnfDiagram-CCIWWBDH-DWjfeEie.js} +1 -1
  90. package/dist/assets/ellipsis-C5YXdOUx.js +1 -0
  91. package/dist/assets/{erDiagram-Q63AITRT-ZLlx8xfs.js → erDiagram-Q63AITRT-DR7vWYHM.js} +1 -1
  92. package/dist/assets/es2015-cuwbYI-l.js +41 -0
  93. package/dist/assets/eventmodeling-45OFAUF4-CXZNG56U.js +1 -0
  94. package/dist/assets/extensions-DgKQRebe.js +1 -0
  95. package/dist/assets/eye-C84inPcV.js +1 -0
  96. package/dist/assets/flowDiagram-23GEKE2U-2065oyKr.js +1 -0
  97. package/dist/assets/form-actions-AIdXOoCL.js +1 -0
  98. package/dist/assets/{ganttDiagram-NO4QXBWP-DXCDjHR2.js → ganttDiagram-NO4QXBWP-E3l9tuaL.js} +1 -1
  99. package/dist/assets/gitGraph-TEB2WS4Q-B0Ln3ZuK.js +1 -0
  100. package/dist/assets/{gitGraphDiagram-IHSO6WYX-l2HWrTJp.js → gitGraphDiagram-IHSO6WYX-DiMvbHKf.js} +1 -1
  101. package/dist/assets/i18n-CKvm9zyk.js +2 -0
  102. package/dist/assets/i18n-provider-CPV43pMX.js +1 -0
  103. package/dist/assets/info-DKCQHKI2-B06uqGM4.js +1 -0
  104. package/dist/assets/{infoDiagram-FWYZ7A6U-D-DjX-bn.js → infoDiagram-FWYZ7A6U-BZDL0NDJ.js} +1 -1
  105. package/dist/assets/{ishikawaDiagram-FXEZZL3T-y_Xy128F.js → ishikawaDiagram-FXEZZL3T-BZ9WvJb2.js} +1 -1
  106. package/dist/assets/{journeyDiagram-5HDEW3XC-DJn5xYcQ.js → journeyDiagram-5HDEW3XC-C3TZvKM8.js} +1 -1
  107. package/dist/assets/{jszip.min-8hyJpgpx.js → jszip.min-D_AtKL_8.js} +1 -1
  108. package/dist/assets/{kanban-definition-HUTT4EX6-DJVIOR21.js → kanban-definition-HUTT4EX6-9FqauDEi.js} +1 -1
  109. package/dist/assets/{line-Cos7PIOj.js → line-Ca49mj80.js} +1 -1
  110. package/dist/assets/{linear-BtDLqtzF.js → linear-DlCeG66S.js} +1 -1
  111. package/dist/assets/loader-circle-K1BDdHR5.js +1 -0
  112. package/dist/assets/login-page-ClcrvN04.js +1 -0
  113. package/dist/assets/login-page-DeDQjVxv.js +1 -0
  114. package/dist/assets/logo-badge-C-5-zim6.js +1 -0
  115. package/dist/assets/main-DGqlaAaI.css +1 -0
  116. package/dist/assets/main-i18n-catalog.config-CpNF5aVc.js +1 -0
  117. package/dist/assets/main-nMVfHb5K.js +2 -0
  118. package/dist/assets/{map-BKnQyvd0.js → map-WMnNq9UV.js} +1 -1
  119. package/dist/assets/mcp-marketplace-page-CWjJGp_D.js +10 -0
  120. package/dist/assets/mcp-marketplace-page-fvu2NcXT.js +1 -0
  121. package/dist/assets/{mermaid-parser.core-XUNZhr2W.js → mermaid-parser.core-B8xk4hpS.js} +2 -2
  122. package/dist/assets/{mermaid.core-ySrvolIe.js → mermaid.core-CFPiczKH.js} +3 -3
  123. package/dist/assets/{mindmap-definition-LN4V7U3C-BypL9tei.js → mindmap-definition-LN4V7U3C-CnxA52L6.js} +1 -1
  124. package/dist/assets/model-config-page-Dv_zE7HN.js +1 -0
  125. package/dist/assets/{navigation-link-C_6oj3zz.js → navigation-link-BAQjgx2F.js} +1 -1
  126. package/dist/assets/{ordinal-CxxVWxYU.js → ordinal-PgiFlfBJ.js} +1 -1
  127. package/dist/assets/packet-7NZHBO7P-CHx-igbz.js +1 -0
  128. package/dist/assets/panel-app-BUUle0gP.js +1 -0
  129. package/dist/assets/panel-app-i18n-catalog.config-BzxE3tZb.js +1 -0
  130. package/dist/assets/panelStandalone-CFRBHV94.js +2 -0
  131. package/dist/assets/panelStandalone-Y91OJkgV.css +1 -0
  132. package/dist/assets/{pegDiagram-2B236MQR-D-U2KBGv.js → pegDiagram-2B236MQR-A8oz7dTH.js} +1 -1
  133. package/dist/assets/pie-RZYD4A2V-DOaMc-x9.js +1 -0
  134. package/dist/assets/{pieDiagram-ENE6RG2P-CBi3GusJ.js → pieDiagram-ENE6RG2P-mtBnkYY0.js} +1 -1
  135. package/dist/assets/plus-LA8-jpxP.js +1 -0
  136. package/dist/assets/popover-NkrFlWHp.js +1 -0
  137. package/dist/assets/privacy-settings-page-D6uc9f-A.js +1 -0
  138. package/dist/assets/projects-BD1rG75R.js +1 -0
  139. package/dist/assets/provider-models-5PGHb6mP.js +1 -0
  140. package/dist/assets/provider-scoped-model-input-DUa_9uwg.js +1 -0
  141. package/dist/assets/providers-config-page-DAiqxlF_.js +1 -0
  142. package/dist/assets/puzzle-D6gulz7u.js +1 -0
  143. package/dist/assets/pwa-C_Zte1xe.js +1 -0
  144. package/dist/assets/{quadrantDiagram-ABIIQ3AL-H0ZuvnZL.js → quadrantDiagram-ABIIQ3AL-DE1VybGO.js} +1 -1
  145. package/dist/assets/radar-I7S5WNFK-CXsdndDk.js +1 -0
  146. package/dist/assets/railroad-3IZDKUUU-DxgXdrYP.js +1 -0
  147. package/dist/assets/railroad-abnf-AHOZXSZD-CR1tnyjz.js +1 -0
  148. package/dist/assets/railroad-ebnf-EBAXGLYW-CjjxZR2U.js +1 -0
  149. package/dist/assets/railroad-peg-LSFZ7HO6-DgVGJCHN.js +1 -0
  150. package/dist/assets/{railroadDiagram-RFXS5EU6-D7Y2EqSd.js → railroadDiagram-RFXS5EU6-u9EMg14B.js} +1 -1
  151. package/dist/assets/{refresh-cw-DsT2kvXi.js → refresh-cw-h9Xq3LY3.js} +1 -1
  152. package/dist/assets/remote-BO0QP7ua.js +1 -0
  153. package/dist/assets/{requirementDiagram-TGXJPOKE-BiXNX1NN.js → requirementDiagram-TGXJPOKE-BAWHAqEi.js} +1 -1
  154. package/dist/assets/{rotate-cw-BCAs6c3R.js → rotate-cw-B6xm41Wn.js} +1 -1
  155. package/dist/assets/runtime-config-page-w1UAkGF_.js +1 -0
  156. package/dist/assets/{sankeyDiagram-HTMAVEWB-qzDeLztW.js → sankeyDiagram-HTMAVEWB-aDy-jdwF.js} +1 -1
  157. package/dist/assets/{save-CadRMTMQ.js → save-fff_WpY2.js} +1 -1
  158. package/dist/assets/{search-B6tB4fzB.js → search-CUe41wjm.js} +1 -1
  159. package/dist/assets/search-config-page-3xbhRlW2.js +1 -0
  160. package/dist/assets/secrets-config-page-Dn8_rdOj.js +3 -0
  161. package/dist/assets/security-config-Y1nEGM3A.js +1 -0
  162. package/dist/assets/select-CG5YWnwe.js +1 -0
  163. package/dist/assets/{sequenceDiagram-DBY2YBRQ-BtRbPQtL.js → sequenceDiagram-DBY2YBRQ-DwHC4mbX.js} +1 -1
  164. package/dist/assets/service-apps-panel-CGc04aMn.js +1 -0
  165. package/dist/assets/settings-2-CE3ELQyk.js +1 -0
  166. package/dist/assets/{sizeCapture-X5ZJPWSS-CMYvM3SL.js → sizeCapture-X5ZJPWSS-oOMY0Fag.js} +1 -1
  167. package/dist/assets/skeleton-BL9h32W7.js +1 -0
  168. package/dist/assets/{src-Bw-mzbQb.js → src-CLPoo5iL.js} +1 -1
  169. package/dist/assets/{stateDiagram-2N3HPSRC-BJ-mFeOz.js → stateDiagram-2N3HPSRC-B0Epk-VR.js} +1 -1
  170. package/dist/assets/stateDiagram-v2-6OUMAXLB-Ct4zTw8P.js +1 -0
  171. package/dist/assets/{swimlanes-5IMT3BWC-BsucVOO2.js → swimlanes-5IMT3BWC-T0w-Iuzf.js} +2 -2
  172. package/dist/assets/swimlanesDiagram-G3AALYLV-CdmN0PBd.js +8 -0
  173. package/dist/assets/tabs-BuE0qKMh.js +1 -0
  174. package/dist/assets/{tag-chip-BZKk0UkK.js → tag-chip-BDzpHEli.js} +1 -1
  175. package/dist/assets/theme-provider-B6FinATQ.js +1 -0
  176. package/dist/assets/{timeline-definition-FHXFAJF6-Bicewlzo.js → timeline-definition-FHXFAJF6-BEonB5Np.js} +1 -1
  177. package/dist/assets/tooltip-DYcuWhuP.js +1 -0
  178. package/dist/assets/trash-2-BPPYt2NV.js +1 -0
  179. package/dist/assets/treeView-QDETBFTQ-Dad4_Wc7.js +1 -0
  180. package/dist/assets/treemap-6X3UGDF4-9_GWWZsY.js +1 -0
  181. package/dist/assets/use-config-BPUM2lbo.js +1 -0
  182. package/dist/assets/use-desktop-capabilities-BDjArQP3.js +1 -0
  183. package/dist/assets/use-panel-app-scroll-restoration-DsV1IJx-.js +1 -0
  184. package/dist/assets/use-viewport-layout-BS18drMT.js +1 -0
  185. package/dist/assets/utils-CBZPzC_b.js +8 -0
  186. package/dist/assets/{vennDiagram-L72KCM5P-BxOOnO9x.js → vennDiagram-L72KCM5P-BDvcOCo2.js} +1 -1
  187. package/dist/assets/wardley-OPB4EBWU-BXpvyee9.js +1 -0
  188. package/dist/assets/{wardleyDiagram-EHGQE667-Cl7NltMv.js → wardleyDiagram-EHGQE667-jMLMgjzE.js} +1 -1
  189. package/dist/assets/x-DdXOqLnX.js +1 -0
  190. package/dist/assets/{xychartDiagram-FW5EYKEG-DiMIxQ7N.js → xychartDiagram-FW5EYKEG-pzrpclEv.js} +1 -1
  191. package/dist/index.html +56 -25
  192. package/dist/panel-standalone.html +30 -0
  193. package/package.json +4 -4
  194. package/panel-standalone.html +13 -0
  195. package/panel-standalone.tailwind.config.js +16 -0
  196. package/src/app/components/app-presenter-provider.tsx +8 -1
  197. package/src/app/components/theme-provider.tsx +0 -5
  198. package/src/app/index.tsx +18 -4
  199. package/src/app/presenters/app.presenter.ts +4 -4
  200. package/src/app/styles/panel-app-standalone.css +31 -0
  201. package/src/app/test/vitest-setup.ts +3 -0
  202. package/src/features/account/hooks/use-auth.ts +7 -57
  203. package/src/features/account/index.ts +3 -2
  204. package/src/features/apps/components/__tests__/apps-panel.test.tsx +7 -5
  205. package/src/features/apps/components/apps-panel.tsx +9 -3
  206. package/src/features/chat/features/message/utils/__tests__/chat-message-timeline.utils.test.ts +10 -0
  207. package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +90 -6
  208. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +64 -2
  209. package/src/features/chat/features/session/utils/__tests__/chat-sidebar-session-groups.utils.test.ts +27 -2
  210. package/src/features/chat/features/session/utils/chat-sidebar-session-groups.utils.ts +0 -11
  211. package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +18 -0
  212. package/src/features/panel-apps/components/__tests__/panel-app-open-standalone-menu-item.test.tsx +57 -0
  213. package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +15 -0
  214. package/src/features/panel-apps/components/panel-app-list-item.tsx +5 -0
  215. package/src/features/panel-apps/components/panel-app-open-standalone-menu-item.tsx +32 -0
  216. package/src/features/panel-apps/components/panel-app-runtime-surface.tsx +141 -0
  217. package/src/features/{service-apps/components/service-action-authorization-dialog.tsx → panel-apps/components/panel-app-service-action-authorization-dialog.tsx} +4 -4
  218. package/src/features/panel-apps/components/panel-app-toolbar.tsx +5 -0
  219. package/src/features/panel-apps/hooks/use-panel-app-client-grant.ts +2 -2
  220. package/src/features/panel-apps/hooks/{use-panel-app-main-runtime.ts → use-panel-app-runtime.ts} +7 -5
  221. package/src/features/panel-apps/hooks/use-panel-apps.ts +14 -0
  222. package/src/features/panel-apps/index.ts +5 -0
  223. package/src/features/panel-apps/managers/__tests__/panel-app-bridge.manager.test.ts +2 -2
  224. package/src/features/panel-apps/managers/panel-app-bridge.manager.ts +2 -2
  225. package/src/features/panel-apps/managers/panel-app-service-action-authorization.manager.ts +10 -0
  226. package/src/features/panel-apps/pages/__tests__/panel-app-main-page.test.tsx +12 -3
  227. package/src/features/panel-apps/pages/__tests__/panel-app-standalone-page.test.tsx +63 -0
  228. package/src/features/panel-apps/pages/panel-app-main-page.tsx +9 -121
  229. package/src/features/panel-apps/pages/panel-app-standalone-page.tsx +29 -0
  230. package/src/features/panel-apps/presenters/panel-app-host.presenter.ts +9 -0
  231. package/src/features/panel-apps/providers/panel-app-host.provider.tsx +45 -0
  232. package/src/features/panel-apps/routes/__tests__/panel-app-standalone.route.test.tsx +50 -0
  233. package/src/features/panel-apps/routes/panel-app-standalone.route.tsx +94 -0
  234. package/src/features/{service-apps/stores/service-action-authorization.store.ts → panel-apps/stores/panel-app-service-action-authorization.store.ts} +6 -6
  235. package/src/features/projects/AGENTS.md +1 -2
  236. package/src/features/projects/components/project-agreement.tsx +36 -77
  237. package/src/features/projects/components/project-artifacts.test.tsx +90 -62
  238. package/src/features/projects/components/project-artifacts.tsx +81 -160
  239. package/src/features/projects/components/project-materials.test.tsx +80 -0
  240. package/src/features/projects/components/project-overview.test.tsx +80 -0
  241. package/src/features/projects/components/project-overview.tsx +115 -56
  242. package/src/features/projects/components/project-skills.tsx +24 -14
  243. package/src/features/projects/components/work/project-work-item-drawer.test.tsx +3 -2
  244. package/src/features/projects/components/work/project-work-item-drawer.tsx +8 -10
  245. package/src/features/projects/components/work/project-work-items.test.tsx +180 -4
  246. package/src/features/projects/components/work/project-work-items.tsx +278 -50
  247. package/src/features/projects/components/work/project-work-state-settings.tsx +7 -3
  248. package/src/features/projects/hooks/use-project-materials.test.tsx +65 -0
  249. package/src/features/projects/hooks/use-project-materials.ts +24 -0
  250. package/src/features/projects/hooks/use-project-work.test.tsx +165 -7
  251. package/src/features/projects/hooks/use-project-work.ts +88 -9
  252. package/src/features/projects/pages/project-home-page.tsx +52 -89
  253. package/src/features/projects/pages/projects-page.test.tsx +81 -32
  254. package/src/features/projects/presenters/project-home.presenter.test.ts +1 -64
  255. package/src/features/projects/presenters/project-home.presenter.ts +17 -54
  256. package/src/features/projects/utils/project-artifact-view.utils.test.ts +19 -53
  257. package/src/features/projects/utils/project-artifact-view.utils.ts +17 -47
  258. package/src/features/projects/utils/project-work-state-label.utils.test.ts +28 -0
  259. package/src/features/projects/utils/project-work-state-label.utils.ts +20 -0
  260. package/src/features/service-apps/index.ts +3 -3
  261. package/src/main.tsx +3 -0
  262. package/src/shared/hooks/use-auth-status.ts +49 -0
  263. package/src/shared/hooks/use-projects.ts +15 -1
  264. package/src/shared/lib/api/projects/project.utils.ts +4 -0
  265. package/src/shared/lib/i18n/configs/main-i18n-catalog.config.ts +78 -0
  266. package/src/shared/lib/i18n/configs/panel-app-i18n-catalog.config.ts +12 -0
  267. package/src/shared/lib/i18n/index.ts +30 -82
  268. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +0 -55
  269. package/src/shared/lib/i18n/locales/en-US/panel-app.json +59 -0
  270. package/src/shared/lib/i18n/locales/en-US/projects.json +24 -59
  271. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +0 -55
  272. package/src/shared/lib/i18n/locales/zh-CN/panel-app.json +59 -0
  273. package/src/shared/lib/i18n/locales/zh-CN/projects.json +24 -59
  274. package/vite.config.ts +36 -1
  275. package/dist/assets/api-BqVIq0lF.js +0 -13
  276. package/dist/assets/appearance-settings-page-CTWn1eAT.js +0 -1
  277. package/dist/assets/architecture-TIHT7OUA-DO2x53FK.js +0 -1
  278. package/dist/assets/channel-nBvMaVyP.js +0 -1
  279. package/dist/assets/channels-list-page-Bzn-pzyJ.js +0 -8
  280. package/dist/assets/chunk-2Q5K7J3B-CJgqFDS4.js +0 -1
  281. package/dist/assets/chunk-VAUOI2AC-BGvh3yIx.js +0 -1
  282. package/dist/assets/chunk-XXDRQBXY-DaBxG5gs.js +0 -1
  283. package/dist/assets/classDiagram-OUVF2IWQ-P6N03G2R.js +0 -1
  284. package/dist/assets/classDiagram-v2-EOCWNBFH-B1_uLvMv.js +0 -1
  285. package/dist/assets/config-split-page-CnRbXXlh.js +0 -1
  286. package/dist/assets/confirm-dialog-B_Hbcra2.js +0 -5
  287. package/dist/assets/cynefin-VYW2F7L2-B-H8Qp-n.js +0 -1
  288. package/dist/assets/desktop-capabilities-page-C2ayYQTr.js +0 -1
  289. package/dist/assets/desktop-update-config-C13czpyL.js +0 -1
  290. package/dist/assets/dist-BsF3hfOi.js +0 -1
  291. package/dist/assets/doc-browser-D8dIOo9E.js +0 -1
  292. package/dist/assets/doc-browser-DcuOOtpP.js +0 -1
  293. package/dist/assets/doc-browser-context-Dhsit2Ma.js +0 -1
  294. package/dist/assets/eventmodeling-45OFAUF4-YVtShyFA.js +0 -1
  295. package/dist/assets/extensions-CD6xvKF_.js +0 -1
  296. package/dist/assets/flowDiagram-23GEKE2U-BeKXabVO.js +0 -1
  297. package/dist/assets/form-actions-CC4Wz_lL.js +0 -1
  298. package/dist/assets/gitGraph-TEB2WS4Q-jTSiBj-p.js +0 -1
  299. package/dist/assets/index-BTsbdtv6.js +0 -109
  300. package/dist/assets/index-Bcfy2kTh.css +0 -1
  301. package/dist/assets/info-DKCQHKI2-BIporNWb.js +0 -1
  302. package/dist/assets/loader-circle-B6aFbB-8.js +0 -1
  303. package/dist/assets/mcp-marketplace-page-BtUAypA7.js +0 -1
  304. package/dist/assets/mcp-marketplace-page-r2MmD9xO.js +0 -10
  305. package/dist/assets/model-config-page-DboxoT-I.js +0 -1
  306. package/dist/assets/packet-7NZHBO7P-CuFMADV0.js +0 -1
  307. package/dist/assets/pie-RZYD4A2V-XUeIXhM9.js +0 -1
  308. package/dist/assets/plus-DRsq9Kvs.js +0 -1
  309. package/dist/assets/privacy-settings-page-C2sDBqhb.js +0 -1
  310. package/dist/assets/projects-BcPcx-uD.js +0 -1
  311. package/dist/assets/providers-config-page-CmUFl9RF.js +0 -1
  312. package/dist/assets/radar-I7S5WNFK-D-NNGh1k.js +0 -1
  313. package/dist/assets/railroad-3IZDKUUU-C67_uDaM.js +0 -1
  314. package/dist/assets/railroad-abnf-AHOZXSZD-BZ8Yflnd.js +0 -1
  315. package/dist/assets/railroad-ebnf-EBAXGLYW-B7zO7RoK.js +0 -1
  316. package/dist/assets/railroad-peg-LSFZ7HO6-R63PTgLz.js +0 -1
  317. package/dist/assets/react-BjO9I4WZ.js +0 -8
  318. package/dist/assets/remote-Ci6x91ES.js +0 -1
  319. package/dist/assets/runtime-config-page-cQKNeAjL.js +0 -1
  320. package/dist/assets/search-config-page-C8lOIkxn.js +0 -1
  321. package/dist/assets/secrets-config-page-8clzAag2.js +0 -3
  322. package/dist/assets/security-config-DPbM6IVT.js +0 -1
  323. package/dist/assets/select-CO9S_C2C.js +0 -41
  324. package/dist/assets/skeleton-IHILNhIW.js +0 -1
  325. package/dist/assets/stateDiagram-v2-6OUMAXLB-BE-HqxOK.js +0 -1
  326. package/dist/assets/swimlanesDiagram-G3AALYLV-Dr1H9LJH.js +0 -8
  327. package/dist/assets/treeView-QDETBFTQ-npJ5dbqS.js +0 -1
  328. package/dist/assets/treemap-6X3UGDF4-pYrBx6oa.js +0 -1
  329. package/dist/assets/wardley-OPB4EBWU-CmSRKLR8.js +0 -1
  330. package/dist/assets/x-BuvHIb1d.js +0 -1
  331. package/src/features/projects/components/project-requests.tsx +0 -57
  332. package/src/features/projects/components/project-runs.tsx +0 -60
  333. package/src/features/projects/hooks/use-project-observation.test.tsx +0 -93
  334. package/src/features/projects/hooks/use-project-observation.ts +0 -115
  335. package/src/features/projects/utils/project-request-response.utils.test.ts +0 -44
  336. package/src/features/projects/utils/project-request-response.utils.ts +0 -39
  337. package/src/features/service-apps/managers/service-action-authorization.manager.ts +0 -10
  338. /package/dist/assets/{array-BQVzeGRt.js → array-BHDgItFN.js} +0 -0
  339. /package/dist/assets/{chunk-DseTPa7n.js → chunk-DF37yw5_.js} +0 -0
  340. /package/dist/assets/{chunk-KEIR6QF5-f9psyCXK.js → chunk-KEIR6QF5-DstBw0Hk.js} +0 -0
  341. /package/dist/assets/{chunk-Y2CYZVJY-D1mAU_Po.js → chunk-Y2CYZVJY-CA3ymQuH.js} +0 -0
  342. /package/dist/assets/{config-hints-nV5HPOvq.js → config-hints-CBPHrfYk.js} +0 -0
  343. /package/dist/assets/{cytoscape.esm-0uDtdD0l.js → cytoscape.esm-C7xr90o_.js} +0 -0
  344. /package/dist/assets/{defaultLocale-DSWXGgt0.js → defaultLocale-BG1oDVag.js} +0 -0
  345. /package/dist/assets/{graphlib-CQ6QV4yP.js → graphlib-CNMGfuTb.js} +0 -0
  346. /package/dist/assets/{host-capabilities-Tk038i04.js → host-capabilities-B107nwS3.js} +0 -0
  347. /package/dist/assets/{init-Y6h9jGtZ.js → init-wQIZuRSH.js} +0 -0
  348. /package/dist/assets/{katex-ARhY9PS1.js → katex-J8JuvgNl.js} +0 -0
  349. /package/dist/assets/{middleware-DXsbf9xI.js → middleware-0o3JF3tS.js} +0 -0
  350. /package/dist/assets/{path-10BjdyLh.js → path-N-C4MRP0.js} +0 -0
  351. /package/dist/assets/{preload-helper-D4M6sveU.js → preload-helper-ca-nBW7U.js} +0 -0
  352. /package/dist/assets/{rough.esm-DxgC_14r.js → rough.esm-BeWA068d.js} +0 -0
  353. /package/dist/assets/{xlsx-DrDuDNAa.js → xlsx-CwUXNtD3.js} +0 -0
@@ -1,19 +1,30 @@
1
1
  import type { ReactNode } from "react";
2
2
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3
- import { renderHook, waitFor } from "@testing-library/react";
3
+ import { act, renderHook, waitFor } from "@testing-library/react";
4
4
  import { beforeEach, describe, expect, it, vi } from "vitest";
5
- import { useProjectWork } from "./use-project-work";
5
+ import type { ProjectWorkState } from "@nextclaw/client-sdk";
6
+ import {
7
+ sortProjectWorkStates,
8
+ sortProjectWorkStatesForList,
9
+ useProjectArtifacts,
10
+ useProjectWork,
11
+ useProjectWorkEvents,
12
+ } from "./use-project-work";
6
13
 
7
14
  const mocks = vi.hoisted(() => ({
8
15
  handler: null as
9
16
  | null
10
17
  | ((event: { projectId: string; workItemId?: string }) => void),
11
18
  listWork: vi.fn(),
19
+ listRecentWorkArtifacts: vi.fn(),
12
20
  }));
13
21
 
14
22
  vi.mock("@/shared/lib/api", () => ({
15
23
  nextclawClient: {
16
- projects: { listWork: mocks.listWork },
24
+ projects: {
25
+ listWork: mocks.listWork,
26
+ listRecentWorkArtifacts: mocks.listRecentWorkArtifacts,
27
+ },
17
28
  eventBus: {
18
29
  on: (
19
30
  _key: unknown,
@@ -31,7 +42,13 @@ vi.mock("@/shared/lib/api", () => ({
31
42
  describe("useProjectWork", () => {
32
43
  beforeEach(() => {
33
44
  mocks.listWork.mockReset();
34
- mocks.listWork.mockResolvedValue({ items: [], states: [], total: 0 });
45
+ mocks.listWork.mockResolvedValue({ items: [], nextCursor: null, total: 0 });
46
+ mocks.listRecentWorkArtifacts.mockReset();
47
+ mocks.listRecentWorkArtifacts.mockResolvedValue({
48
+ artifacts: [],
49
+ nextCursor: null,
50
+ total: 0,
51
+ });
35
52
  });
36
53
 
37
54
  it("refreshes the project query from committed work events only for the matching project", async () => {
@@ -41,9 +58,15 @@ describe("useProjectWork", () => {
41
58
  const wrapper = ({ children }: { children: ReactNode }) => (
42
59
  <QueryClientProvider client={client}>{children}</QueryClientProvider>
43
60
  );
44
- const { unmount } = renderHook(() => useProjectWork("project-1"), {
45
- wrapper,
46
- });
61
+ const { unmount } = renderHook(
62
+ () => {
63
+ useProjectWorkEvents("project-1");
64
+ return useProjectWork("project-1", { stateId: "planned", limit: 20 });
65
+ },
66
+ {
67
+ wrapper,
68
+ },
69
+ );
47
70
  await waitFor(() => expect(mocks.listWork).toHaveBeenCalledTimes(1));
48
71
 
49
72
  mocks.handler?.({ projectId: "project-2" });
@@ -55,4 +78,139 @@ describe("useProjectWork", () => {
55
78
  unmount();
56
79
  expect(mocks.handler).toBeNull();
57
80
  });
81
+
82
+ it("loads the next opaque cursor without changing the state-scoped query", async () => {
83
+ mocks.listWork
84
+ .mockResolvedValueOnce({
85
+ items: [{ id: "one" }],
86
+ nextCursor: "next",
87
+ total: 2,
88
+ })
89
+ .mockResolvedValueOnce({
90
+ items: [{ id: "two" }],
91
+ nextCursor: null,
92
+ total: 2,
93
+ });
94
+ const client = new QueryClient({
95
+ defaultOptions: { queries: { retry: false } },
96
+ });
97
+ const wrapper = ({ children }: { children: ReactNode }) => (
98
+ <QueryClientProvider client={client}>{children}</QueryClientProvider>
99
+ );
100
+ const { result } = renderHook(
101
+ () => useProjectWork("project-1", { stateId: "planned", limit: 20 }),
102
+ { wrapper },
103
+ );
104
+ await waitFor(() => expect(result.current.hasNextPage).toBe(true));
105
+
106
+ await act(async () => await result.current.fetchNextPage());
107
+
108
+ expect(mocks.listWork).toHaveBeenNthCalledWith(1, "project-1", {
109
+ stateId: "planned",
110
+ limit: 20,
111
+ });
112
+ expect(mocks.listWork).toHaveBeenNthCalledWith(2, "project-1", {
113
+ stateId: "planned",
114
+ limit: 20,
115
+ cursor: "next",
116
+ });
117
+ await waitFor(() => expect(result.current.data?.pages).toHaveLength(2));
118
+ });
119
+
120
+ it("loads filtered artifacts through the paginated project-work owner", async () => {
121
+ mocks.listRecentWorkArtifacts
122
+ .mockResolvedValueOnce({
123
+ artifacts: [{ id: "one", path: "docs/report.md" }],
124
+ nextCursor: "artifact-next",
125
+ total: 2,
126
+ })
127
+ .mockResolvedValueOnce({
128
+ artifacts: [{ id: "two", path: "docs/report-final.md" }],
129
+ nextCursor: null,
130
+ total: 2,
131
+ });
132
+ const client = new QueryClient({
133
+ defaultOptions: { queries: { retry: false } },
134
+ });
135
+ const wrapper = ({ children }: { children: ReactNode }) => (
136
+ <QueryClientProvider client={client}>{children}</QueryClientProvider>
137
+ );
138
+ const { result } = renderHook(
139
+ () => useProjectArtifacts("project-1", { limit: 20, query: "report" }),
140
+ { wrapper },
141
+ );
142
+ await waitFor(() => expect(result.current.hasNextPage).toBe(true));
143
+
144
+ await act(async () => await result.current.fetchNextPage());
145
+
146
+ expect(mocks.listRecentWorkArtifacts).toHaveBeenNthCalledWith(
147
+ 1,
148
+ "project-1",
149
+ {
150
+ limit: 20,
151
+ query: "report",
152
+ },
153
+ );
154
+ expect(mocks.listRecentWorkArtifacts).toHaveBeenNthCalledWith(
155
+ 2,
156
+ "project-1",
157
+ {
158
+ limit: 20,
159
+ query: "report",
160
+ cursor: "artifact-next",
161
+ },
162
+ );
163
+ });
164
+ });
165
+
166
+ describe("project work state ordering", () => {
167
+ const state = (
168
+ name: string,
169
+ category: ProjectWorkState["category"],
170
+ position: number,
171
+ ): ProjectWorkState => ({
172
+ id: name,
173
+ projectId: "project-1",
174
+ name,
175
+ category,
176
+ position,
177
+ isDefault: false,
178
+ createdAt: "2026-09-01T00:00:00.000Z",
179
+ updatedAt: "2026-09-01T00:00:00.000Z",
180
+ });
181
+ const states = [
182
+ state("Backlog", "backlog", 0),
183
+ state("Planned", "unstarted", 1),
184
+ state("In Progress", "started", 2),
185
+ state("In Review", "started", 3),
186
+ state("Awaiting Acceptance", "started", 4),
187
+ state("Completed", "completed", 5),
188
+ state("Canceled", "canceled", 6),
189
+ ];
190
+
191
+ it("surfaces active states closest to done in list view", () => {
192
+ expect(
193
+ sortProjectWorkStatesForList(states).map(({ name }) => name),
194
+ ).toEqual([
195
+ "Awaiting Acceptance",
196
+ "In Review",
197
+ "In Progress",
198
+ "Planned",
199
+ "Backlog",
200
+ "Completed",
201
+ "Canceled",
202
+ ]);
203
+ });
204
+
205
+ it("keeps workflow order for board and state settings", () => {
206
+ expect(sortProjectWorkStates(states).map(({ name }) => name)).toEqual([
207
+ "Backlog",
208
+ "Planned",
209
+ "In Progress",
210
+ "In Review",
211
+ "Awaiting Acceptance",
212
+ "Completed",
213
+ "Canceled",
214
+ ]);
215
+ });
58
216
  });
@@ -1,9 +1,15 @@
1
1
  import { useEffect } from "react";
2
- import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2
+ import {
3
+ useInfiniteQuery,
4
+ useMutation,
5
+ useQuery,
6
+ useQueryClient,
7
+ } from "@tanstack/react-query";
3
8
  import type {
4
9
  CreateProjectWorkItemInput,
5
10
  CreateProjectWorkStateInput,
6
11
  ProjectWorkState,
12
+ ProjectWorkListInput,
7
13
  UpdateProjectWorkItemInput,
8
14
  UpdateProjectWorkStateInput,
9
15
  } from "@nextclaw/client-sdk";
@@ -14,6 +20,10 @@ export const projectWorkQueryKey = (projectId: string) =>
14
20
  ["project-work", projectId] as const;
15
21
  export const projectWorkSummaryQueryKey = (projectId: string) =>
16
22
  ["project-work-summary", projectId] as const;
23
+ export const projectWorkStatesQueryKey = (projectId: string) =>
24
+ ["project-work-states", projectId] as const;
25
+ export const projectWorkArtifactsQueryKey = (projectId: string) =>
26
+ ["project-work-artifacts", projectId] as const;
17
27
  export const projectWorkItemQueryKey = (
18
28
  projectId: string,
19
29
  workItemId: string,
@@ -25,19 +35,22 @@ export const projectWorkActivityQueryKey = (
25
35
 
26
36
  export function useProjectWork(
27
37
  projectId: string | null,
28
- includeDeleted = false,
38
+ input: Omit<ProjectWorkListInput, "cursor"> = {},
29
39
  ) {
30
- useProjectWorkEvents(projectId);
31
- return useQuery({
32
- queryKey: [...projectWorkQueryKey(projectId ?? ""), includeDeleted],
40
+ return useInfiniteQuery({
41
+ queryKey: [...projectWorkQueryKey(projectId ?? ""), input],
33
42
  enabled: Boolean(projectId),
34
- queryFn: async () =>
35
- await nextclawClient.projects.listWork(projectId!, includeDeleted),
43
+ initialPageParam: null as string | null,
44
+ queryFn: async ({ pageParam }) =>
45
+ await nextclawClient.projects.listWork(projectId!, {
46
+ ...input,
47
+ ...(pageParam ? { cursor: pageParam } : {}),
48
+ }),
49
+ getNextPageParam: (lastPage) => lastPage.nextCursor,
36
50
  });
37
51
  }
38
52
 
39
53
  export function useProjectWorkSummary(projectId: string | null) {
40
- useProjectWorkEvents(projectId);
41
54
  return useQuery({
42
55
  queryKey: projectWorkSummaryQueryKey(projectId ?? ""),
43
56
  enabled: Boolean(projectId),
@@ -46,6 +59,32 @@ export function useProjectWorkSummary(projectId: string | null) {
46
59
  });
47
60
  }
48
61
 
62
+ export function useProjectWorkStates(projectId: string | null) {
63
+ return useQuery({
64
+ queryKey: projectWorkStatesQueryKey(projectId ?? ""),
65
+ enabled: Boolean(projectId),
66
+ queryFn: async () =>
67
+ await nextclawClient.projects.listWorkStates(projectId!),
68
+ });
69
+ }
70
+
71
+ export function useProjectArtifacts(
72
+ projectId: string | null,
73
+ input: { limit?: number; query?: string } = {},
74
+ ) {
75
+ return useInfiniteQuery({
76
+ queryKey: [...projectWorkArtifactsQueryKey(projectId ?? ""), input],
77
+ enabled: Boolean(projectId),
78
+ initialPageParam: null as string | null,
79
+ queryFn: async ({ pageParam }) =>
80
+ await nextclawClient.projects.listRecentWorkArtifacts(projectId!, {
81
+ ...input,
82
+ ...(pageParam ? { cursor: pageParam } : {}),
83
+ }),
84
+ getNextPageParam: (lastPage) => lastPage.nextCursor,
85
+ });
86
+ }
87
+
49
88
  export function useProjectWorkItem(
50
89
  projectId: string | null,
51
90
  workItemId: string | null,
@@ -84,6 +123,12 @@ export function useProjectWorkActions(projectId: string) {
84
123
  queryClient.invalidateQueries({
85
124
  queryKey: projectWorkSummaryQueryKey(projectId),
86
125
  }),
126
+ queryClient.invalidateQueries({
127
+ queryKey: projectWorkStatesQueryKey(projectId),
128
+ }),
129
+ queryClient.invalidateQueries({
130
+ queryKey: projectWorkArtifactsQueryKey(projectId),
131
+ }),
87
132
  ...(workItemId
88
133
  ? [
89
134
  queryClient.invalidateQueries({
@@ -181,7 +226,7 @@ export function useProjectWorkActions(projectId: string) {
181
226
  };
182
227
  }
183
228
 
184
- function useProjectWorkEvents(projectId: string | null): void {
229
+ export function useProjectWorkEvents(projectId: string | null): void {
185
230
  const queryClient = useQueryClient();
186
231
  useEffect(() => {
187
232
  if (!projectId) return;
@@ -193,6 +238,12 @@ function useProjectWorkEvents(projectId: string | null): void {
193
238
  void queryClient.invalidateQueries({
194
239
  queryKey: projectWorkSummaryQueryKey(projectId),
195
240
  });
241
+ void queryClient.invalidateQueries({
242
+ queryKey: projectWorkStatesQueryKey(projectId),
243
+ });
244
+ void queryClient.invalidateQueries({
245
+ queryKey: projectWorkArtifactsQueryKey(projectId),
246
+ });
196
247
  if (event.workItemId) {
197
248
  void queryClient.invalidateQueries({
198
249
  queryKey: projectWorkItemQueryKey(projectId, event.workItemId),
@@ -213,3 +264,31 @@ export function sortProjectWorkStates(
213
264
  left.position - right.position || left.name.localeCompare(right.name),
214
265
  );
215
266
  }
267
+
268
+ const LIST_CATEGORY_ORDER: Readonly<
269
+ Record<ProjectWorkState["category"], number>
270
+ > = {
271
+ started: 0,
272
+ unstarted: 1,
273
+ backlog: 2,
274
+ completed: 3,
275
+ canceled: 4,
276
+ };
277
+
278
+ export function sortProjectWorkStatesForList(
279
+ states: ProjectWorkState[],
280
+ ): ProjectWorkState[] {
281
+ return [...states].sort((left, right) => {
282
+ const categoryOrder =
283
+ LIST_CATEGORY_ORDER[left.category] - LIST_CATEGORY_ORDER[right.category];
284
+ if (categoryOrder !== 0) return categoryOrder;
285
+ if (left.category === "completed" || left.category === "canceled") {
286
+ return (
287
+ left.position - right.position || left.name.localeCompare(right.name)
288
+ );
289
+ }
290
+ return (
291
+ right.position - left.position || left.name.localeCompare(right.name)
292
+ );
293
+ });
294
+ }
@@ -1,8 +1,5 @@
1
1
  import { useState } from "react";
2
2
  import { useNavigate, useParams } from "react-router-dom";
3
- import { useMutation, useQueryClient } from "@tanstack/react-query";
4
- import type { ObservedRequest } from "@nextclaw/client-sdk";
5
- import { toast } from "sonner";
6
3
  import { useProjects } from "@/shared/hooks/use-projects";
7
4
  import { useViewportLayout } from "@/app/hooks/use-viewport-layout";
8
5
  import { t } from "@/shared/lib/i18n";
@@ -15,7 +12,6 @@ import {
15
12
  import { ProjectAgreement } from "@/features/projects/components/project-agreement";
16
13
  import { ProjectArtifacts } from "@/features/projects/components/project-artifacts";
17
14
  import { ProjectOverview } from "@/features/projects/components/project-overview";
18
- import { ProjectRequests } from "@/features/projects/components/project-requests";
19
15
  import { ProjectSkills } from "@/features/projects/components/project-skills";
20
16
  import { ProjectWorkItemDrawer } from "@/features/projects/components/work/project-work-item-drawer";
21
17
  import { ProjectWorkItems } from "@/features/projects/components/work/project-work-items";
@@ -24,18 +20,14 @@ import {
24
20
  usePresenter,
25
21
  } from "@/features/chat";
26
22
  import {
27
- projectObservationQueryKey,
28
- useProjectObservation,
29
- } from "@/features/projects/hooks/use-project-observation";
23
+ useProjectAgreement,
24
+ useProjectSkills,
25
+ } from "@/features/projects/hooks/use-project-materials";
30
26
  import {
31
- getOpenProjectRequests,
32
27
  isProjectHomeTab,
33
28
  type ProjectHomeTab,
34
29
  } from "@/features/projects/presenters/project-home.presenter";
35
- import {
36
- sendProjectRequestResponse,
37
- type ProjectRequestDecision,
38
- } from "@/features/projects/utils/project-request-response.utils";
30
+ import { joinProjectPath } from "@/features/projects/utils/project-artifact-view.utils";
39
31
 
40
32
  const PROJECT_TABS: ProjectHomeTab[] = [
41
33
  "overview",
@@ -52,55 +44,23 @@ export function ProjectsPage() {
52
44
  }>();
53
45
  const navigate = useNavigate();
54
46
  const presenter = usePresenter();
55
- const queryClient = useQueryClient();
56
47
  const { isMobile } = useViewportLayout();
57
48
  const projects = useProjects();
58
49
  const [selectedWorkItemId, setSelectedWorkItemId] = useState<string | null>(
59
50
  null,
60
51
  );
61
- const [pendingRequestId, setPendingRequestId] = useState<string | null>(null);
62
52
  const registered = projects.data?.projects ?? [];
63
53
  const selectedProject =
64
54
  registered.find((project) => project.id === projectId) ?? null;
65
55
  const tab: ProjectHomeTab | null = isProjectHomeTab(tabParam)
66
56
  ? tabParam
67
57
  : null;
68
- const needsObservation =
69
- tab === "artifacts" || tab === "skills" || tab === "agreement";
70
- const observation = useProjectObservation(
71
- selectedProject?.id ?? null,
72
- selectedProject?.rootPath ?? null,
73
- needsObservation,
58
+ const agreement = useProjectAgreement(
59
+ tab === "agreement" ? (selectedProject?.id ?? null) : null,
60
+ );
61
+ const skills = useProjectSkills(
62
+ tab === "skills" ? (selectedProject?.id ?? null) : null,
74
63
  );
75
- const response = useMutation({
76
- mutationFn: sendProjectRequestResponse,
77
- onMutate: (input) => setPendingRequestId(input.requestId),
78
- onSuccess: async () => {
79
- if (selectedProject)
80
- await queryClient.invalidateQueries({
81
- queryKey: projectObservationQueryKey(selectedProject.id),
82
- });
83
- toast.success(t("projectsResponseSent"));
84
- },
85
- onError: (error) =>
86
- toast.error(
87
- `${t("projectsResponseFailed")}: ${error instanceof Error ? error.message : String(error)}`,
88
- ),
89
- onSettled: () => setPendingRequestId(null),
90
- });
91
- const reply = (
92
- request: ObservedRequest,
93
- decision: ProjectRequestDecision,
94
- ) => {
95
- if (!request.reference.sessionId) return;
96
- response.mutate({
97
- requestId: request.id,
98
- sessionId: request.reference.sessionId,
99
- decision,
100
- prompt: request.prompt,
101
- });
102
- };
103
-
104
64
  if (projects.isLoading)
105
65
  return (
106
66
  <main className="flex h-full items-center justify-center p-6 text-sm text-muted-foreground">
@@ -133,7 +93,6 @@ export function ProjectsPage() {
133
93
  viewMode: "preview",
134
94
  previewViewer: "rendered",
135
95
  });
136
- const snapshot = observation.data;
137
96
  return (
138
97
  <>
139
98
  <main className="h-full min-w-0 flex-1 overflow-y-auto p-3 sm:p-4 md:p-6">
@@ -144,13 +103,6 @@ export function ProjectsPage() {
144
103
  {selectedProject.rootPath}
145
104
  </p>
146
105
  </header>
147
- {snapshot ? (
148
- <ProjectRequests
149
- requests={getOpenProjectRequests(snapshot)}
150
- pendingRequestId={pendingRequestId}
151
- onReply={reply}
152
- />
153
- ) : null}
154
106
  <Tabs
155
107
  value={tab}
156
108
  onValueChange={(value) =>
@@ -171,6 +123,12 @@ export function ProjectsPage() {
171
123
  <TabsContent value="overview" className="mt-4">
172
124
  <ProjectOverview
173
125
  projectId={selectedProject.id}
126
+ onOpenArtifact={(path, label) =>
127
+ openProjectFile(
128
+ joinProjectPath(selectedProject.rootPath, path),
129
+ label,
130
+ )
131
+ }
174
132
  onOpenWorkItem={setSelectedWorkItemId}
175
133
  />
176
134
  </TabsContent>
@@ -180,38 +138,43 @@ export function ProjectsPage() {
180
138
  onOpenWorkItem={setSelectedWorkItemId}
181
139
  />
182
140
  </TabsContent>
183
- {needsObservation && observation.isLoading ? (
184
- <div className="mt-4 rounded-xl border border-border/60 p-5 text-sm text-muted-foreground">
185
- {t("projectsLoading")}
186
- </div>
187
- ) : null}
188
- {needsObservation && observation.isError ? (
189
- <div className="mt-4 rounded-xl border border-destructive/40 p-5 text-sm text-destructive">
190
- {t("projectsLoadFailed")}: {observation.error.message}
191
- </div>
192
- ) : null}
193
- {snapshot ? (
194
- <>
195
- <TabsContent value="artifacts" className="mt-4">
196
- <ProjectArtifacts
197
- snapshot={snapshot}
198
- onOpenFile={openProjectFile}
199
- />
200
- </TabsContent>
201
- <TabsContent value="skills" className="mt-4">
202
- <ProjectSkills
203
- snapshot={snapshot}
204
- onOpen={(skill) => openProjectFile(skill.path, skill.name)}
205
- />
206
- </TabsContent>
207
- <TabsContent value="agreement" className="mt-4">
208
- <ProjectAgreement
209
- snapshot={snapshot}
210
- onOpenFile={openProjectFile}
211
- />
212
- </TabsContent>
213
- </>
214
- ) : null}
141
+ <TabsContent value="artifacts" className="mt-4">
142
+ <ProjectArtifacts
143
+ projectId={selectedProject.id}
144
+ onOpenFile={(path, label) =>
145
+ openProjectFile(
146
+ joinProjectPath(selectedProject.rootPath, path),
147
+ label,
148
+ )
149
+ }
150
+ />
151
+ </TabsContent>
152
+ <TabsContent value="skills" className="mt-4">
153
+ <ProjectSkills
154
+ skills={skills.data ?? []}
155
+ isLoading={skills.isLoading}
156
+ isError={skills.isError}
157
+ onOpen={(skill) =>
158
+ openProjectFile(
159
+ joinProjectPath(selectedProject.rootPath, skill.path),
160
+ skill.name,
161
+ )
162
+ }
163
+ />
164
+ </TabsContent>
165
+ <TabsContent value="agreement" className="mt-4">
166
+ <ProjectAgreement
167
+ agreement={agreement.data}
168
+ isLoading={agreement.isLoading}
169
+ isError={agreement.isError}
170
+ onOpenFile={(path, label) =>
171
+ openProjectFile(
172
+ joinProjectPath(selectedProject.rootPath, path),
173
+ label,
174
+ )
175
+ }
176
+ />
177
+ </TabsContent>
215
178
  </Tabs>
216
179
  </div>
217
180
  </main>