@atlashub/smartstack 3.21.0 → 3.25.0

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 (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-Cuwn2q-f.js","sources":["../../src/pages/platform/administration/ai/AiDashboardPage.tsx","../../src/components/platform/administration/ai/AiProfilesTab.tsx","../../src/components/platform/administration/ai/AiProvidersTab.tsx","../../src/components/platform/administration/ai/AiModelsTab.tsx","../../src/hooks/useAiInstances.ts","../../src/hooks/useAiProviders.ts","../../src/hooks/useAiModels.ts","../../src/hooks/useInstanceAccess.ts","../../src/pages/platform/administration/ai/AiSettingsPage.tsx","../../src/components/platform/administration/ai/PromptTestPanel.tsx","../../src/pages/platform/administration/ai/AiPromptsListPage.tsx","../../src/pages/platform/administration/ai/AiSkillsDetailPage.tsx","../../src/pages/platform/administration/ai/AiSkillsEditPage.tsx","../../src/pages/platform/administration/ai/AiBlockDefinitionsListPage.tsx","../../src/pages/platform/administration/ai/AiBlockDefinitionDetailPage.tsx","../../src/pages/platform/administration/ai/AiBlockDefinitionEditPage.tsx","../../src/pages/platform/administration/ai/AiMonitoringPage.tsx","../../src/pages/platform/administration/ai/AiAgentsPage.tsx","../../src/pages/platform/administration/ai/AiAgentDetailPage.tsx","../../src/pages/platform/administration/ai/AiAgentEditPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Brain,\r\n RefreshCw,\r\n Loader2,\r\n AlertTriangle,\r\n Zap,\r\n DollarSign,\r\n Activity,\r\n CheckCircle,\r\n Clock,\r\n Server,\r\n TrendingUp,\r\n TrendingDown,\r\n} from 'lucide-react';\r\nimport {\r\n ResponsiveContainer,\r\n AreaChart,\r\n Area,\r\n BarChart,\r\n Bar,\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ComposedChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n} from 'recharts';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n aiApi,\r\n type DashboardOverviewDto,\r\n type ProviderUsageDto,\r\n type ModelUsageDto,\r\n type DailyCostDto,\r\n} from '@/services/api/aiApi';\r\n\r\nconst CHART_COLORS = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444', '#06b6d4', '#ec4899', '#14b8a6'];\r\n\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n yellow: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n red: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\nexport function AiDashboardPage(): ReactElement | null {\r\n const { t } = useTranslation(['ai']);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [period, setPeriod] = useState(30);\r\n const [selectedProvider, setSelectedProvider] = useState<string>('');\r\n\r\n const [overview, setOverview] = useState<DashboardOverviewDto | null>(null);\r\n const [providerUsage, setProviderUsage] = useState<ProviderUsageDto[]>([]);\r\n const [modelUsage, setModelUsage] = useState<ModelUsageDto[]>([]);\r\n const [dailyCosts, setDailyCosts] = useState<DailyCostDto[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const providerId = selectedProvider || undefined;\r\n\r\n const [overviewRes, providerRes, modelRes, dailyRes] = await Promise.all([\r\n aiApi.dashboard.getOverview(period),\r\n aiApi.dashboard.getByProvider(),\r\n aiApi.dashboard.getByModel(undefined, undefined, providerId),\r\n aiApi.dashboard.getDailyCosts(period, providerId),\r\n ]);\r\n\r\n setOverview(overviewRes ?? null);\r\n setProviderUsage(providerRes ?? []);\r\n setModelUsage(modelRes ?? []);\r\n setDailyCosts(dailyRes ?? []);\r\n } catch (err: unknown) {\r\n console.error('Failed to load AI dashboard data:', err);\r\n const appError = err as { statusCode?: number };\r\n if (appError.statusCode === 401) {\r\n setError(t('dashboard.errors.sessionExpired'));\r\n } else if (appError.statusCode === 403) {\r\n setError(t('dashboard.errors.forbidden'));\r\n } else {\r\n setError(t('dashboard.errors.loadFailed'));\r\n }\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, selectedProvider, t]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatCost = (value: number) => {\r\n const abs = Math.abs(value);\r\n const getFractionDigits = () => {\r\n if (abs === 0 || abs >= 0.01) return 2;\r\n if (abs >= 0.0001) return 4;\r\n return 6;\r\n };\r\n const fractionDigits = getFractionDigits();\r\n return new Intl.NumberFormat('fr-FR', {\r\n style: 'currency',\r\n currency: 'USD',\r\n minimumFractionDigits: fractionDigits,\r\n maximumFractionDigits: fractionDigits,\r\n }).format(value);\r\n };\r\n\r\n const formatNumber = (value: number) =>\r\n new Intl.NumberFormat('fr-FR').format(value);\r\n\r\n // --- Derived chart data ---\r\n\r\n // Daily cost trend: pivot by date, one series per provider\r\n const dailyCostTrend = useMemo(() => {\r\n const byDate = new Map<string, Record<string, string | number>>();\r\n const providers = new Set<string>();\r\n\r\n for (const item of dailyCosts) {\r\n providers.add(item.providerName);\r\n if (!byDate.has(item.date)) {\r\n byDate.set(item.date, { date: item.date });\r\n }\r\n const row = byDate.get(item.date)!;\r\n row[item.providerName] = ((row[item.providerName] as number) ?? 0) + item.totalCost;\r\n }\r\n\r\n return {\r\n data: Array.from(byDate.values()).sort((a, b) =>\r\n String(a.date).localeCompare(String(b.date))),\r\n providers: Array.from(providers),\r\n };\r\n }, [dailyCosts]);\r\n\r\n // Daily requests trend: aggregate requests + success per day\r\n const dailyRequestsTrend = useMemo(() => {\r\n const byDate = new Map<string, { date: string; requests: number; success: number; errors: number }>();\r\n\r\n for (const item of dailyCosts) {\r\n const existing = byDate.get(item.date);\r\n if (existing) {\r\n existing.requests += item.requestCount;\r\n existing.success += item.successCount;\r\n existing.errors += item.errorCount;\r\n } else {\r\n byDate.set(item.date, {\r\n date: item.date,\r\n requests: item.requestCount,\r\n success: item.successCount,\r\n errors: item.errorCount,\r\n });\r\n }\r\n }\r\n\r\n return Array.from(byDate.values())\r\n .sort((a, b) => a.date.localeCompare(b.date))\r\n .map(d => ({\r\n ...d,\r\n successRate: d.requests > 0 ? (d.success / d.requests) * 100 : 0,\r\n }));\r\n }, [dailyCosts]);\r\n\r\n // Provider donut: from overview breakdown\r\n const providerDonut = useMemo(() => {\r\n return (overview?.providerBreakdown ?? []).map((p, i) => ({\r\n name: p.providerName,\r\n value: Number(p.totalCost),\r\n color: CHART_COLORS[i % CHART_COLORS.length],\r\n }));\r\n }, [overview]);\r\n\r\n // Model bar chart: top 8 by cost\r\n const modelBars = useMemo(() => {\r\n return [...modelUsage]\r\n .sort((a, b) => b.totalCost - a.totalCost)\r\n .slice(0, 8)\r\n .map(m => ({\r\n name: m.modelName.length > 20 ? m.modelName.slice(0, 18) + '...' : m.modelName,\r\n fullName: m.modelName,\r\n tokens: m.totalTokens,\r\n cost: Number(m.totalCost),\r\n requests: m.requestCount,\r\n latency: Math.round(m.avgLatencyMs),\r\n }));\r\n }, [modelUsage]);\r\n\r\n // Token split: input vs output\r\n const tokenSplit = useMemo(() => {\r\n const input = dailyCosts.reduce((s, d) => s + d.totalInputTokens, 0);\r\n const output = dailyCosts.reduce((s, d) => s + d.totalOutputTokens, 0);\r\n if (input === 0 && output === 0) return [];\r\n return [\r\n { name: t('dashboard.charts.inputTokens'), value: input, color: '#3b82f6' },\r\n { name: t('dashboard.charts.outputTokens'), value: output, color: '#8b5cf6' },\r\n ];\r\n }, [dailyCosts, t]);\r\n\r\n // Cost trend direction\r\n const costTrend = useMemo(() => {\r\n if (dailyCostTrend.data.length < 2) return null;\r\n const mid = Math.floor(dailyCostTrend.data.length / 2);\r\n const firstHalf = dailyCostTrend.data.slice(0, mid);\r\n const secondHalf = dailyCostTrend.data.slice(mid);\r\n\r\n const sumCost = (rows: Record<string, unknown>[]) =>\r\n rows.reduce((total, row) => {\r\n let s = 0;\r\n for (const [k, v] of Object.entries(row)) {\r\n if (k !== 'date' && typeof v === 'number') s += v;\r\n }\r\n return total + s;\r\n }, 0);\r\n\r\n const first = sumCost(firstHalf);\r\n const second = sumCost(secondHalf);\r\n if (first === 0) return null;\r\n return ((second - first) / first) * 100;\r\n }, [dailyCostTrend]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('ai.dashboard', 'Dashboard') },\r\n ]}\r\n />\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <p className=\"flex-1 text-[var(--error-text)] font-medium\">{error}</p>\r\n <button onClick={handleRefresh} className=\"text-[var(--error-text)] hover:opacity-80\">\r\n <RefreshCw className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Brain className=\"w-6 h-6\" />\r\n {t('dashboard.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('dashboard.subtitle')}</p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <select\r\n value={selectedProvider}\r\n onChange={(e) => setSelectedProvider(e.target.value)}\r\n className=\"input\"\r\n >\r\n <option value=\"\">{t('dashboard.allProviders')}</option>\r\n {providerUsage.map((p) => (\r\n <option key={p.providerId} value={p.providerId}>{p.providerName}</option>\r\n ))}\r\n </select>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"input\"\r\n >\r\n <option value={7}>{t('dashboard.period.7days')}</option>\r\n <option value={30}>{t('dashboard.period.30days')}</option>\r\n <option value={90}>{t('dashboard.period.90days')}</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n {t('dashboard.refresh')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n title={t('dashboard.kpis.totalCost')}\r\n value={formatCost(overview?.totalCost ?? 0)}\r\n icon={<DollarSign className=\"w-5 h-5\" />}\r\n color=\"green\"\r\n trend={costTrend}\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.totalTokens')}\r\n value={formatNumber(overview?.totalTokens ?? 0)}\r\n icon={<Zap className=\"w-5 h-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.totalRequests')}\r\n value={formatNumber(overview?.totalRequests ?? 0)}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n color=\"neutral\"\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.successRate')}\r\n value={`${(overview?.successRate ?? 0).toFixed(1)}%`}\r\n icon={<CheckCircle className=\"w-5 h-5\" />}\r\n color={(() => {\r\n const rate = overview?.successRate ?? 0;\r\n if (rate >= 95) return 'green' as const;\r\n if (rate >= 80) return 'yellow' as const;\r\n return 'red' as const;\r\n })()}\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.avgLatency')}\r\n value={`${(overview?.avgLatencyMs ?? 0).toFixed(0)} ms`}\r\n icon={<Clock className=\"w-5 h-5\" />}\r\n color={(() => {\r\n const latency = overview?.avgLatencyMs ?? 0;\r\n if (latency <= 1000) return 'green' as const;\r\n if (latency <= 3000) return 'yellow' as const;\r\n return 'red' as const;\r\n })()}\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.activeProviders')}\r\n value={`${overview?.activeProviders ?? 0} / ${overview?.totalProviders ?? 0}`}\r\n icon={<Server className=\"w-5 h-5\" />}\r\n color=\"blue\"\r\n />\r\n </div>\r\n\r\n {/* Row 2: Daily Cost Trend (full width) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <DollarSign className=\"w-5 h-5\" />\r\n {t('dashboard.charts.dailyCosts')}\r\n </h3>\r\n {dailyCostTrend.data.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <AreaChart data={dailyCostTrend.data} margin={{ top: 5, right: 20, bottom: 5, left: 10 }}>\r\n <defs>\r\n {dailyCostTrend.providers.map((name, i) => (\r\n <linearGradient key={name} id={`grad-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\r\n <stop offset=\"5%\" stopColor={CHART_COLORS[i % CHART_COLORS.length]} stopOpacity={0.4} />\r\n <stop offset=\"95%\" stopColor={CHART_COLORS[i % CHART_COLORS.length]} stopOpacity={0.05} />\r\n </linearGradient>\r\n ))}\r\n </defs>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: string) => v.slice(5)}\r\n />\r\n <YAxis\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => `$${v}`}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined) => [formatCost(value ?? 0), undefined]}\r\n labelFormatter={(label: string | number) => String(label)}\r\n />\r\n <Legend />\r\n {dailyCostTrend.providers.map((name, i) => (\r\n <Area\r\n key={name}\r\n type=\"monotone\"\r\n dataKey={name}\r\n stackId=\"1\"\r\n stroke={CHART_COLORS[i % CHART_COLORS.length]}\r\n fill={`url(#grad-${i})`}\r\n strokeWidth={2}\r\n />\r\n ))}\r\n </AreaChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Row 3: Cost Distribution + Model Usage */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Cost Distribution (Donut) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <DollarSign className=\"w-5 h-5\" />\r\n {t('dashboard.charts.costByProvider')}\r\n </h3>\r\n {providerDonut.length > 0 ? (\r\n <div className=\"flex items-center gap-4\">\r\n <ResponsiveContainer width=\"50%\" height={220}>\r\n <PieChart>\r\n <Pie\r\n data={providerDonut}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={55}\r\n outerRadius={90}\r\n paddingAngle={2}\r\n dataKey=\"value\"\r\n >\r\n {providerDonut.map((entry, i) => (\r\n <Cell key={`${entry.name}-${i}`} fill={entry.color} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined) => [formatCost(value ?? 0), undefined]}\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n <div className=\"flex-1 space-y-2\">\r\n {providerDonut.map((p) => (\r\n <div key={p.name} className=\"flex items-center gap-2 text-sm\">\r\n <div className=\"w-3 h-3 rounded-full flex-shrink-0\" style={{ backgroundColor: p.color }} />\r\n <span className=\"flex-1 truncate text-[var(--text-primary)]\">{p.name}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{formatCost(p.value)}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Token Distribution (Donut) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Zap className=\"w-5 h-5\" />\r\n {t('dashboard.charts.tokenDistribution')}\r\n </h3>\r\n {tokenSplit.length > 0 ? (\r\n <div className=\"flex items-center gap-4\">\r\n <ResponsiveContainer width=\"50%\" height={220}>\r\n <PieChart>\r\n <Pie\r\n data={tokenSplit}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={55}\r\n outerRadius={90}\r\n paddingAngle={2}\r\n dataKey=\"value\"\r\n >\r\n {tokenSplit.map((entry, i) => (\r\n <Cell key={`${entry.name}-${i}`} fill={entry.color} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined) => [formatNumber(value ?? 0), undefined]}\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n <div className=\"flex-1 space-y-3\">\r\n {tokenSplit.map((entry) => {\r\n const total = tokenSplit.reduce((s, e) => s + e.value, 0);\r\n const pct = total > 0 ? ((entry.value / total) * 100).toFixed(1) : '0';\r\n return (\r\n <div key={entry.name} className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2 text-sm\">\r\n <div className=\"w-3 h-3 rounded-full flex-shrink-0\" style={{ backgroundColor: entry.color }} />\r\n <span className=\"flex-1 text-[var(--text-primary)]\">{entry.name}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{pct}%</span>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-secondary)] ml-5\">{formatNumber(entry.value)} tokens</p>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Row 4: Usage by Model (full width horizontal bar chart) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Activity className=\"w-5 h-5\" />\r\n {t('dashboard.charts.usageByModel')}\r\n </h3>\r\n {modelBars.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height={Math.max(200, modelBars.length * 44)}>\r\n <BarChart data={modelBars} layout=\"vertical\" margin={{ top: 5, right: 30, bottom: 5, left: 120 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" horizontal={false} />\r\n <XAxis\r\n type=\"number\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => formatNumber(v)}\r\n />\r\n <YAxis\r\n type=\"category\"\r\n dataKey=\"name\"\r\n tick={{ fontSize: 11, fill: 'var(--text-primary)' }}\r\n width={115}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name?: string) => {\r\n const v = value ?? 0;\r\n if (name === 'tokens') return [formatNumber(v), 'Tokens'];\r\n if (name === 'cost') return [formatCost(v), t('dashboard.charts.costLabel')];\r\n return [v, name ?? ''];\r\n }}\r\n labelFormatter={(_: string | number, payload?: readonly { payload?: { fullName?: string } }[]) =>\r\n payload?.[0]?.payload?.fullName ?? String(_)\r\n }\r\n />\r\n <Legend />\r\n <Bar dataKey=\"tokens\" name=\"Tokens\" fill=\"#3b82f6\" radius={[0, 4, 4, 0]} />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Row 5: Daily Requests + Success Rate */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Activity className=\"w-5 h-5\" />\r\n {t('dashboard.charts.requestsAndSuccess')}\r\n </h3>\r\n {dailyRequestsTrend.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height={260}>\r\n <ComposedChart data={dailyRequestsTrend} margin={{ top: 5, right: 20, bottom: 5, left: 10 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: string) => v.slice(5)}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => formatNumber(v)}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n domain={[0, 100]}\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => `${v}%`}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name?: string) => {\r\n const v = value ?? 0;\r\n if (name === 'successRate') return [`${v.toFixed(1)}%`, t('dashboard.kpis.successRate')];\r\n if (name === 'errors') return [formatNumber(v), t('dashboard.charts.errors')];\r\n return [formatNumber(v), t('dashboard.charts.requests')];\r\n }}\r\n />\r\n <Legend />\r\n <Bar yAxisId=\"left\" dataKey=\"success\" name={t('dashboard.charts.successRequests')} stackId=\"req\" fill=\"#22c55e\" />\r\n <Bar yAxisId=\"left\" dataKey=\"errors\" name={t('dashboard.charts.errors')} stackId=\"req\" fill=\"#ef4444\" radius={[4, 4, 0, 0]} />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"successRate\"\r\n name={t('dashboard.kpis.successRate')}\r\n stroke=\"#f59e0b\"\r\n strokeWidth={2}\r\n dot={false}\r\n />\r\n </ComposedChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Row 6: Model Performance Table */}\r\n {modelUsage.length > 0 && (\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Clock className=\"w-5 h-5\" />\r\n {t('dashboard.charts.modelPerformance')}\r\n </h3>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.model')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.provider')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.kpis.totalTokens')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.kpis.totalCost')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.requests')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.kpis.avgLatency')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.costPerRequest')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {[...modelUsage].sort((a, b) => b.totalCost - a.totalCost).map((model) => (\r\n <tr key={`${model.providerId}-${model.modelName}`} className=\"border-b border-[var(--border-color)] hover:bg-[var(--bg-hover)]\">\r\n <td className=\"p-3 font-mono text-[var(--text-primary)]\">{model.modelName}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{model.providerCode}</td>\r\n <td className=\"p-3 text-right font-mono\">{formatNumber(model.totalTokens)}</td>\r\n <td className=\"p-3 text-right font-medium\">{formatCost(model.totalCost)}</td>\r\n <td className=\"p-3 text-right\">{formatNumber(model.requestCount)}</td>\r\n <td className=\"p-3 text-right\">{Math.round(model.avgLatencyMs)} ms</td>\r\n <td className=\"p-3 text-right text-[var(--text-secondary)]\">\r\n {model.requestCount > 0 ? formatCost(model.totalCost / model.requestCount) : '—'}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// --- Sub-components ---\r\n\r\nfunction KpiCard({\r\n title,\r\n value,\r\n icon,\r\n color,\r\n trend,\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n color: keyof typeof colorClasses;\r\n trend?: number | null;\r\n}) {\r\n return (\r\n <div className={`card p-4 border ${colorClasses[color]}`}>\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {trend != null && (\r\n <div className={`flex items-center gap-1 mt-1 text-xs font-medium ${trend > 0 ? 'text-red-500' : 'text-green-500'}`}>\r\n {trend > 0 ? <TrendingUp className=\"w-3 h-3\" /> : <TrendingDown className=\"w-3 h-3\" />}\r\n <span>{Math.abs(trend).toFixed(1)}%</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction NoDataPlaceholder({ message }: { message: string }) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12 text-[var(--text-secondary)]\">\r\n {message}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ntype TFunction = ReturnType<typeof useTranslation>['t'];\r\nimport {\r\n Layers,\r\n Building2,\r\n Key,\r\n CheckCircle,\r\n XCircle,\r\n Trash2,\r\n Plus,\r\n Globe,\r\n BookOpen,\r\n Clock,\r\n AlertCircle,\r\n DollarSign,\r\n Loader2,\r\n Eye,\r\n EyeOff,\r\n KeyRound,\r\n ShieldCheck,\r\n ExternalLink,\r\n Pencil,\r\n Save,\r\n X,\r\n Search,\r\n ToggleLeft,\r\n ToggleRight,\r\n Pin,\r\n PinOff,\r\n} from 'lucide-react';\r\nimport type {\r\n ProviderInstanceListDto,\r\n ProviderInstanceDetailDto,\r\n UpdateProviderInstanceRequest,\r\n ModelListDto,\r\n} from '@/services/api/aiApi';\r\nimport { adminApi } from '@/services/api/adminApi';\r\n\r\nconst formatCurrency = (value: number) =>\r\n new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2 }).format(value);\r\n\r\n// Provider Logo component with error handling\r\nfunction ProviderLogo({\r\n logoUrl,\r\n providerCode,\r\n size = 'md',\r\n}: {\r\n logoUrl: string | null;\r\n providerCode: string;\r\n size?: 'sm' | 'md' | 'lg';\r\n}) {\r\n const [hasError, setHasError] = useState(false);\r\n\r\n const sizeMap = {\r\n sm: { size: 'w-8 h-8 text-sm', img: 'w-8 h-8' },\r\n md: { size: 'w-10 h-10 text-base', img: 'w-10 h-10' },\r\n lg: { size: 'w-12 h-12 text-lg', img: 'w-12 h-12' },\r\n };\r\n\r\n if (!logoUrl || hasError) {\r\n return (\r\n <div className={`${sizeMap[size].size} bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] rounded-lg flex items-center justify-center font-bold text-[var(--color-accent-600)]`}>\r\n {providerCode.charAt(0).toUpperCase()}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <img\r\n src={logoUrl}\r\n alt={providerCode}\r\n className={`${sizeMap[size].img} rounded-lg object-contain`}\r\n onError={() => setHasError(true)}\r\n />\r\n );\r\n}\r\n\r\ninterface AiProfilesTabProps {\r\n readonly instances: ProviderInstanceListDto[];\r\n readonly selectedInstance: ProviderInstanceDetailDto | null;\r\n readonly onSelectInstance: (id: string) => void;\r\n readonly onToggleActive: (id: string) => void;\r\n readonly onDelete: (id: string) => void;\r\n readonly onUpdate: (data: UpdateProviderInstanceRequest) => Promise<void>;\r\n readonly models: ModelListDto[];\r\n readonly onSetApiKey: (key: string) => Promise<void>;\r\n readonly onSetAdminKey: (key: string) => Promise<void>;\r\n readonly providerApiKeyUrl?: string | null;\r\n readonly providerAdminApiKeyUrl?: string | null;\r\n readonly onAddTenant: (tenantId: string) => Promise<void>;\r\n readonly onRemoveTenant: (tenantId: string) => Promise<void>;\r\n readonly onSetAllTenants: (isAllTenants: boolean) => Promise<void>;\r\n readonly onAddPrompt: (promptId: string) => Promise<void>;\r\n readonly onRemovePrompt: (promptId: string) => void;\r\n}\r\n\r\nfunction EmptyInstancesState({ t }: Readonly<{ t: TFunction }>) {\r\n return (\r\n <div className=\"card p-12 text-center\">\r\n <Layers className=\"w-16 h-16 mx-auto mb-4 text-[var(--text-secondary)] opacity-50\" />\r\n <h3 className=\"text-lg font-medium mb-2\">{t('settings.profiles.noInstances')}</h3>\r\n <p className=\"text-[var(--text-secondary)]\">{t('settings.profiles.subtitle')}</p>\r\n </div>\r\n );\r\n}\r\n\r\nfunction NoDetailsState({ t }: Readonly<{ t: TFunction }>) {\r\n return (\r\n <div className=\"card p-12 text-center\">\r\n <Layers className=\"w-16 h-16 mx-auto mb-4 text-[var(--text-secondary)] opacity-50\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('settings.profiles.actions.viewDetails')}</p>\r\n </div>\r\n );\r\n}\r\n\r\ninterface InstanceBadgeProps {\r\n readonly isActive: boolean;\r\n readonly isOverBudget: boolean;\r\n readonly t: TFunction;\r\n}\r\n\r\nconst getActiveBadgeClass = (isActive: boolean): string => {\r\n if (isActive) return 'bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]';\r\n return 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]';\r\n};\r\n\r\nconst getActiveText = (isActive: boolean, t: TFunction): string => {\r\n return isActive ? t('settings.profiles.status.active') : t('settings.profiles.status.inactive');\r\n};\r\n\r\nfunction InstanceBadges({ isActive, isOverBudget, t }: Readonly<InstanceBadgeProps>) {\r\n return (\r\n <div className=\"flex flex-col items-end gap-1\">\r\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${getActiveBadgeClass(isActive)}`}>\r\n {getActiveText(isActive, t)}\r\n </span>\r\n {isOverBudget && (\r\n <span className=\"px-2 py-0.5 rounded text-xs font-medium bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-center gap-1\">\r\n <AlertCircle className=\"w-3 h-3\" />\r\n {t('settings.profiles.usage.overBudget')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ApiKeyCardProps {\r\n readonly type: 'api' | 'admin';\r\n readonly hasKey: boolean;\r\n readonly onSave: (key: string) => Promise<void>;\r\n readonly placeholder: string;\r\n readonly providerKeyUrl?: string | null;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction getProfileCardBorderClass(editing: boolean, hasKey: boolean): string {\r\n if (editing) return 'border-[var(--color-accent-500)] shadow-[0_0_0_1px_var(--color-accent-500)]';\r\n if (hasKey) return 'border-[var(--success-border)]';\r\n return 'border-[var(--border-color)]';\r\n}\r\n\r\nfunction ApiKeyCard({ type, hasKey, onSave, placeholder, providerKeyUrl, t }: Readonly<ApiKeyCardProps>) {\r\n const [editing, setEditing] = useState(false);\r\n const [value, setValue] = useState('');\r\n const [saving, setSaving] = useState(false);\r\n const [showValue, setShowValue] = useState(false);\r\n\r\n const isApi = type === 'api';\r\n const Icon = isApi ? KeyRound : ShieldCheck;\r\n\r\n const handleSave = async () => {\r\n if (!value.trim()) return;\r\n setSaving(true);\r\n try {\r\n await onSave(value);\r\n setValue('');\r\n setShowValue(false);\r\n setEditing(false);\r\n } catch {\r\n // Error handled by parent\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setValue('');\r\n setShowValue(false);\r\n setEditing(false);\r\n };\r\n\r\n return (\r\n <div className={`relative rounded-[var(--radius-card)] border overflow-hidden transition-all ${\r\n getProfileCardBorderClass(editing, hasKey)\r\n }`}>\r\n {/* Card header */}\r\n <div className={`px-4 py-3 flex items-center justify-between ${\r\n hasKey\r\n ? 'bg-[var(--success-bg)]'\r\n : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-9 h-9 rounded-lg flex items-center justify-center ${\r\n hasKey\r\n ? 'bg-[var(--success-dot)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {isApi ? t('settings.profiles.fields.apiKey') : t('settings.profiles.fields.adminKey')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {hasKey ? t('settings.profiles.status.hasApiKey') : t('settings.profiles.status.noApiKey')}\r\n </p>\r\n </div>\r\n </div>\r\n {hasKey && !editing && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('settings.profiles.status.active')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Card body */}\r\n <div className=\"px-4 py-3 bg-[var(--bg-primary)]\">\r\n {providerKeyUrl && (\r\n <a\r\n href={providerKeyUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"flex items-center gap-1.5 text-xs text-[var(--color-accent-600)] hover:text-[var(--color-accent-700)] mb-3 transition-colors\"\r\n >\r\n <ExternalLink className=\"w-3 h-3\" />\r\n {t('settings.profiles.fields.getKeyFromProvider')}\r\n </a>\r\n )}\r\n {editing ? (\r\n <ApiKeyCardEditing\r\n showValue={showValue}\r\n onShowValueChange={setShowValue}\r\n value={value}\r\n onValueChange={setValue}\r\n placeholder={placeholder}\r\n saving={saving}\r\n onCancel={handleCancel}\r\n onSave={handleSave}\r\n hasKey={hasKey}\r\n isApi={isApi}\r\n t={t}\r\n />\r\n ) : (\r\n <ApiKeyCardDisplay\r\n hasKey={hasKey}\r\n onEdit={() => setEditing(true)}\r\n isApi={isApi}\r\n t={t}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface SearchResult {\r\n id: string;\r\n label: string;\r\n sublabel?: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface InlineSearchPanelProps {\r\n readonly placeholder: string;\r\n readonly onSearch: (query: string) => Promise<SearchResult[]>;\r\n readonly onSelect: (id: string) => Promise<void>;\r\n readonly onClose: () => void;\r\n}\r\n\r\ninterface BudgetGaugeProps {\r\n readonly budget: number | null | undefined;\r\n readonly usage: number;\r\n readonly isOver: boolean;\r\n readonly t: TFunction;\r\n readonly budgetPeriodType?: string | null;\r\n readonly nextResetDate?: string | null;\r\n}\r\n\r\nfunction BudgetGauge({ budget, usage, isOver, t, budgetPeriodType, nextResetDate }: Readonly<BudgetGaugeProps>) {\r\n if (budget == null) {\r\n return (\r\n <div className=\"flex-1 p-6 bg-[var(--bg-primary)] flex flex-col items-center justify-center\">\r\n <DollarSign className=\"w-10 h-10 text-[var(--text-tertiary)] opacity-30 mb-2\" />\r\n <p className=\"text-sm text-[var(--text-tertiary)] italic\">{t('common:notSet', '—')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const radius = 50;\r\n const circumference = 2 * Math.PI * radius;\r\n const pct = Math.min(100, (usage / budget) * 100);\r\n const strokeOffset = circumference - (circumference * pct) / 100;\r\n const gaugeColor = isOver\r\n ? 'var(--error-dot)'\r\n : pct > 80\r\n ? 'var(--warning-dot)'\r\n : 'var(--success-dot)';\r\n\r\n return (\r\n <div className=\"flex-1 p-4 bg-[var(--bg-primary)] flex flex-col items-center justify-center\">\r\n <div className=\"relative\" style={{ width: 120, height: 120 }}>\r\n <svg viewBox=\"0 0 120 120\" className=\"w-full h-full -rotate-90\">\r\n <circle\r\n cx=\"60\" cy=\"60\" r={radius}\r\n fill=\"none\"\r\n stroke=\"var(--bg-tertiary)\"\r\n strokeWidth=\"9\"\r\n strokeLinecap=\"round\"\r\n />\r\n <circle\r\n cx=\"60\" cy=\"60\" r={radius}\r\n fill=\"none\"\r\n stroke={gaugeColor}\r\n strokeWidth=\"9\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray={circumference}\r\n strokeDashoffset={strokeOffset}\r\n className=\"transition-all duration-700 ease-out\"\r\n />\r\n </svg>\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <span className={`text-xl font-bold ${\r\n isOver ? 'text-[var(--error-text)]' : 'text-[var(--text-primary)]'\r\n }`}>\r\n {Math.round(pct)}%\r\n </span>\r\n <span className=\"text-[10px] text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('settings.profiles.usage.used', 'used')}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full mt-3 space-y-1.5\">\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.currentPeriod')}</span>\r\n <span className={`font-semibold ${isOver ? 'text-[var(--error-text)]' : 'text-[var(--text-primary)]'}`}>\r\n {formatCurrency(usage)}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.fields.budgetLimit')}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{formatCurrency(budget)}</span>\r\n </div>\r\n <div className=\"h-px bg-[var(--border-color)]\" />\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.remaining', 'Remaining')}</span>\r\n <span className={`font-semibold ${isOver ? 'text-[var(--error-text)]' : 'text-[var(--success-text)]'}`}>\r\n {isOver ? '- ' : ''}{formatCurrency(Math.abs(budget - usage))}\r\n </span>\r\n </div>\r\n {budgetPeriodType && budgetPeriodType !== 'Fixed' && nextResetDate ? (\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.nextReset')}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {new Date(nextResetDate).toLocaleDateString()}\r\n </span>\r\n </div>\r\n ) : budgetPeriodType === 'Fixed' || !budgetPeriodType ? (\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.nextReset')}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t('settings.profiles.usage.noAutoReset')}\r\n </span>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ApiKeyCardEditingProps {\r\n readonly showValue: boolean;\r\n readonly onShowValueChange: (show: boolean) => void;\r\n readonly value: string;\r\n readonly onValueChange: (val: string) => void;\r\n readonly placeholder: string;\r\n readonly saving: boolean;\r\n readonly onCancel: () => void;\r\n readonly onSave: () => void;\r\n readonly hasKey: boolean;\r\n readonly isApi: boolean;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ApiKeyCardEditing({\r\n showValue,\r\n onShowValueChange,\r\n value,\r\n onValueChange,\r\n placeholder,\r\n saving,\r\n onCancel,\r\n onSave,\r\n hasKey,\r\n isApi: _isApi,\r\n t,\r\n}: Readonly<ApiKeyCardEditingProps>) {\r\n return (\r\n <div className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <input\r\n type={showValue ? 'text' : 'password'}\r\n value={value}\r\n onChange={(e) => onValueChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"input w-full pr-10 font-mono text-sm\"\r\n autoFocus\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' && value.trim()) onSave();\r\n if (e.key === 'Escape') onCancel();\r\n }}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => onShowValueChange(!showValue)}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 rounded-md text-[var(--text-tertiary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n tabIndex={-1}\r\n >\r\n {showValue ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={onCancel}\r\n disabled={saving}\r\n className=\"btn btn-ghost btn-sm\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={onSave}\r\n disabled={!value.trim() || saving}\r\n className=\"btn btn-primary btn-sm disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {hasKey ? t('settings.profiles.actions.changeKey') : t('common:save')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ApiKeyCardDisplayProps {\r\n readonly hasKey: boolean;\r\n readonly onEdit: () => void;\r\n readonly isApi: boolean;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ApiKeyCardDisplay({\r\n hasKey,\r\n onEdit,\r\n isApi,\r\n t,\r\n}: Readonly<ApiKeyCardDisplayProps>) {\r\n return (\r\n <button\r\n onClick={onEdit}\r\n className=\"w-full group flex items-center justify-between py-1 text-left\"\r\n >\r\n {hasKey ? (\r\n <>\r\n <span className=\"font-mono text-sm text-[var(--text-tertiary)] tracking-widest\">{'•'.repeat(24)}</span>\r\n <span className=\"text-xs font-medium text-[var(--color-accent-600)] group-hover:text-[var(--color-accent-700)] transition-colors\">\r\n {t('settings.profiles.actions.changeKey')}\r\n </span>\r\n </>\r\n ) : (\r\n <span className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)] group-hover:text-[var(--color-accent-600)] transition-colors\">\r\n <Plus className=\"w-4 h-4\" />\r\n {isApi ? t('settings.profiles.actions.setApiKey') : t('settings.profiles.actions.setAdminKey')}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\ninterface InstanceListItemProps {\r\n readonly instance: ProviderInstanceListDto;\r\n readonly isSelected: boolean;\r\n readonly onSelect: (id: string) => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction InstanceListItem({ instance, isSelected, onSelect, t }: Readonly<InstanceListItemProps>) {\r\n return (\r\n <button\r\n onClick={() => onSelect(instance.id)}\r\n className={`w-full text-left p-4 rounded-lg border transition-all ${\r\n isSelected\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 shadow-sm'\r\n : 'border-[var(--border-color)] bg-[var(--bg-primary)] hover:border-[var(--color-accent-300)] hover:shadow-sm'\r\n }`}\r\n >\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <ProviderLogo\r\n logoUrl={instance.providerLogoUrl}\r\n providerCode={instance.providerCode}\r\n size=\"sm\"\r\n />\r\n <div>\r\n <h4 className=\"font-medium\">{instance.name}</h4>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {instance.providerName}\r\n </p>\r\n </div>\r\n </div>\r\n <InstanceBadges isActive={instance.isActive} isOverBudget={instance.isOverBudget} t={t} />\r\n </div>\r\n\r\n <div className=\"mt-3 flex flex-wrap gap-2 text-xs text-[var(--text-secondary)]\">\r\n {instance.department && (\r\n <span className=\"flex items-center gap-1 bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n <Building2 className=\"w-3 h-3\" />\r\n {instance.department}\r\n </span>\r\n )}\r\n {instance.hasApiKey && (\r\n <span className=\"flex items-center gap-1 bg-[var(--success-bg)] text-[var(--success-text)] px-2 py-1 rounded\">\r\n <Key className=\"w-3 h-3\" />\r\n API\r\n </span>\r\n )}\r\n {instance.isAllTenants ? (\r\n <span className=\"flex items-center gap-1 bg-[var(--success-bg)] text-[var(--success-text)] px-2 py-1 rounded\">\r\n <Globe className=\"w-3 h-3\" />\r\n {t('settings.profiles.allTenants')}\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1 bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n <Building2 className=\"w-3 h-3\" />\r\n {t('settings.profiles.tenantCount', { count: instance.tenantCount })}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {instance.budgetLimit && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex justify-between text-xs mb-1\">\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {t('settings.profiles.usage.budget')}\r\n </span>\r\n <span\r\n className={instance.isOverBudget ? 'text-[var(--error-text)]' : ''}\r\n >\r\n {formatCurrency(instance.currentPeriodUsage)} / {formatCurrency(instance.budgetLimit)}\r\n </span>\r\n </div>\r\n <div className=\"h-1.5 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className={`h-full rounded-full transition-all ${\r\n instance.isOverBudget\r\n ? 'bg-[var(--error-dot)]'\r\n : 'bg-[var(--color-accent-500)]'\r\n }`}\r\n style={{\r\n width: `${Math.min(100, (instance.currentPeriodUsage / instance.budgetLimit) * 100)}%`,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\nfunction InlineSearchPanel({ placeholder, onSearch, onSelect, onClose }: Readonly<InlineSearchPanelProps>) {\r\n const [query, setQuery] = useState('');\r\n const [results, setResults] = useState<SearchResult[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [adding, setAdding] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (query.length < 2) {\r\n setResults([]);\r\n return;\r\n }\r\n const timer = setTimeout(async () => {\r\n setLoading(true);\r\n try {\r\n const items = await onSearch(query);\r\n setResults(items);\r\n } catch {\r\n setResults([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, 300);\r\n return () => clearTimeout(timer);\r\n }, [query, onSearch]);\r\n\r\n const handleSelect = async (id: string) => {\r\n setAdding(id);\r\n try {\r\n await onSelect(id);\r\n onClose();\r\n } catch {\r\n // keep panel open on error\r\n } finally {\r\n setAdding(null);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"p-3 border-t border-[var(--border-color)] bg-[var(--bg-primary)]\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"w-full pl-9 pr-8 py-2 text-sm border border-[var(--border-color)] bg-[var(--bg-card)] text-[var(--text-primary)] rounded-[var(--radius-input)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n autoFocus\r\n />\r\n <button\r\n onClick={onClose}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-3\">\r\n <Loader2 className=\"w-4 h-4 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && results.length > 0 && (\r\n <div className=\"mt-2 max-h-48 overflow-y-auto space-y-1\">\r\n {results.map((result) => (\r\n <button\r\n key={result.id}\r\n onClick={() => handleSelect(result.id)}\r\n disabled={adding === result.id}\r\n className=\"w-full flex items-center gap-2.5 p-2 rounded-md text-left hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50\"\r\n >\r\n {result.icon || (\r\n <div className=\"w-7 h-7 rounded-md bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <Building2 className=\"w-3.5 h-3.5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">{result.label}</div>\r\n {result.sublabel && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{result.sublabel}</div>\r\n )}\r\n </div>\r\n {adding === result.id && <Loader2 className=\"w-4 h-4 animate-spin text-[var(--color-accent-500)]\" />}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && query.length >= 2 && results.length === 0 && (\r\n <p className=\"text-xs text-[var(--text-secondary)] text-center py-3\">\r\n {query.length >= 2 ? 'No results found' : ''}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport function AiProfilesTab({\r\n instances,\r\n selectedInstance,\r\n onSelectInstance,\r\n onToggleActive,\r\n onDelete,\r\n onUpdate,\r\n models,\r\n onSetApiKey,\r\n onSetAdminKey,\r\n providerApiKeyUrl,\r\n providerAdminApiKeyUrl,\r\n onAddTenant,\r\n onRemoveTenant,\r\n onSetAllTenants,\r\n onAddPrompt,\r\n onRemovePrompt,\r\n}: AiProfilesTabProps): ReactElement {\r\n const { t } = useTranslation('ai');\r\n\r\n // Inline edit state\r\n const [editing, setEditing] = useState(false);\r\n const [editForm, setEditForm] = useState<UpdateProviderInstanceRequest>({ name: '' });\r\n const [saving, setSaving] = useState(false);\r\n\r\n // Search panels state\r\n const [showTenantSearch, setShowTenantSearch] = useState(false);\r\n const [showPromptSearch, setShowPromptSearch] = useState(false);\r\n const [togglingAllTenants, setTogglingAllTenants] = useState(false);\r\n\r\n const startEditing = useCallback(() => {\r\n if (!selectedInstance) return;\r\n setEditForm({\r\n name: selectedInstance.name,\r\n description: selectedInstance.description || '',\r\n systemContext: selectedInstance.systemContext || '',\r\n department: selectedInstance.department || '',\r\n costCenter: selectedInstance.costCenter || '',\r\n defaultModel: selectedInstance.defaultModel || '',\r\n maxTokensPerRequest: selectedInstance.maxTokensPerRequest || undefined,\r\n budgetLimit: selectedInstance.budgetLimit || undefined,\r\n budgetPeriodType: selectedInstance.budgetPeriodType || undefined,\r\n budgetPeriodStart: selectedInstance.budgetPeriodStart || undefined,\r\n });\r\n setEditing(true);\r\n }, [selectedInstance]);\r\n\r\n const cancelEditing = useCallback(() => {\r\n setEditing(false);\r\n setEditForm({ name: '' });\r\n }, []);\r\n\r\n const handleSaveEdit = useCallback(async () => {\r\n if (!editForm.name.trim()) return;\r\n setSaving(true);\r\n try {\r\n await onUpdate(editForm);\r\n setEditing(false);\r\n } catch {\r\n // Error handled by parent\r\n } finally {\r\n setSaving(false);\r\n }\r\n }, [editForm, onUpdate]);\r\n\r\n const searchTenants = useCallback(async (query: string): Promise<SearchResult[]> => {\r\n const result = await adminApi.tenants.getAll({ search: query, pageSize: 10 });\r\n const existingIds = new Set(selectedInstance?.tenants?.map(t => t.tenantId) || []);\r\n return result.items\r\n .filter(t => !existingIds.has(t.id))\r\n .map(t => ({\r\n id: t.id,\r\n label: t.name,\r\n sublabel: t.slug || undefined,\r\n }));\r\n }, [selectedInstance]);\r\n\r\n const searchPrompts = useCallback(async (query: string): Promise<SearchResult[]> => {\r\n const { aiApi } = await import('@/services/api/aiApi');\r\n const prompts = await aiApi.skills.getAll();\r\n const existingIds = new Set(selectedInstance?.skills?.map(p => p.skillId) || []);\r\n return prompts\r\n .filter((p: any) => !existingIds.has(p.id) && (p.name.toLowerCase().includes(query.toLowerCase()) || p.code.toLowerCase().includes(query.toLowerCase())))\r\n .slice(0, 10)\r\n .map((p: any) => ({\r\n id: p.id,\r\n label: p.name,\r\n sublabel: `${p.code} (v${p.version})`,\r\n }));\r\n }, [selectedInstance]);\r\n\r\n // Cancel editing when selected instance changes\r\n useEffect(() => {\r\n setEditing(false);\r\n }, [selectedInstance?.id]);\r\n\r\n const handleToggleAllTenants = useCallback(async () => {\r\n if (!selectedInstance) return;\r\n setTogglingAllTenants(true);\r\n try {\r\n await onSetAllTenants(!selectedInstance.isAllTenants);\r\n } catch {\r\n // Error handled by parent\r\n } finally {\r\n setTogglingAllTenants(false);\r\n }\r\n }, [selectedInstance, onSetAllTenants]);\r\n\r\n if (instances.length === 0) {\r\n return <EmptyInstancesState t={t} />;\r\n }\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* Instances List */}\r\n <div className=\"lg:col-span-1 space-y-3\">\r\n {instances.map((instance) => (\r\n <InstanceListItem\r\n key={instance.id}\r\n instance={instance}\r\n isSelected={selectedInstance?.id === instance.id}\r\n onSelect={onSelectInstance}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Instance Details */}\r\n <div className=\"lg:col-span-2\">\r\n {selectedInstance ? (\r\n <div className=\"card p-6 space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <ProviderLogo\r\n logoUrl={selectedInstance.providerLogoUrl}\r\n providerCode={selectedInstance.providerCode}\r\n size=\"lg\"\r\n />\r\n <div>\r\n <h3 className=\"text-xl font-semibold\">\r\n {editing ? t('settings.profiles.editTitle') : selectedInstance.name}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {selectedInstance.providerName} -{' '}\r\n <code className=\"text-xs\">{selectedInstance.code}</code>\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {editing ? (\r\n <>\r\n <button\r\n onClick={cancelEditing}\r\n disabled={saving}\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveEdit}\r\n disabled={!editForm.name.trim() || saving}\r\n className=\"btn btn-primary btn-sm disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common:save')}\r\n </button>\r\n </>\r\n ) : (\r\n <>\r\n {selectedInstance.providerDocumentationUrl && (\r\n <a\r\n href={selectedInstance.providerDocumentationUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n <BookOpen className=\"w-4 h-4\" />\r\n {t('settings.profiles.metadata.docs')}\r\n </a>\r\n )}\r\n <button onClick={startEditing} className=\"btn btn-secondary btn-sm\">\r\n <Pencil className=\"w-4 h-4\" />\r\n {t('settings.profiles.actions.edit')}\r\n </button>\r\n <button\r\n onClick={() => onToggleActive(selectedInstance.id)}\r\n className={`btn btn-sm ${selectedInstance.isActive ? 'btn-secondary' : 'btn-primary'}`}\r\n title={t('settings.profiles.actions.toggleActive')}\r\n >\r\n {selectedInstance.isActive ? (\r\n <XCircle className=\"w-4 h-4\" />\r\n ) : (\r\n <CheckCircle className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => onDelete(selectedInstance.id)}\r\n className=\"btn btn-sm text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n title={t('settings.profiles.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {editing ? (\r\n /* Inline Edit Form */\r\n <div className=\"space-y-4 bg-[var(--bg-secondary)] rounded-lg p-5 border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n {/* Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.name}\r\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\r\n placeholder={t('settings.profiles.fields.namePlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n {/* Description */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.description')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.description || ''}\r\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.descriptionPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n {/* Department + Cost Center row */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.department')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.department || ''}\r\n onChange={(e) => setEditForm({ ...editForm, department: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.departmentPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.costCenter')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.costCenter || ''}\r\n onChange={(e) => setEditForm({ ...editForm, costCenter: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.costCenterPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Default Model + Max Tokens row */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.defaultModel')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-muted)] mb-2\">\r\n {t('settings.profiles.fields.modelFamilyDescription')}\r\n </p>\r\n {(() => {\r\n const providerModels = models.filter(\r\n (m) => m.providerId === selectedInstance.providerId && m.modelFamily\r\n );\r\n const familyGroups = new Map<string, typeof models>();\r\n providerModels.forEach((m) => {\r\n const family = m.modelFamily!;\r\n if (!familyGroups.has(family)) familyGroups.set(family, []);\r\n familyGroups.get(family)!.push(m);\r\n });\r\n familyGroups.forEach((fModels) =>\r\n fModels.sort((a, b) => {\r\n const da = a.deprecationDate ? new Date(a.deprecationDate).getTime() : 0;\r\n const db = b.deprecationDate ? new Date(b.deprecationDate).getTime() : 0;\r\n return db - da || (a.inputCostPerMillionTokens > b.inputCostPerMillionTokens ? -1 : 1);\r\n })\r\n );\r\n\r\n const currentValue = editForm.defaultModel ?? '';\r\n const isFamily = familyGroups.has(currentValue);\r\n const isPinned = !isFamily && !!currentValue;\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <select\r\n value={isFamily ? currentValue : isPinned ? '__pinned__' : ''}\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n if (val === '__pinned__') return;\r\n setEditForm({ ...editForm, defaultModel: val || undefined });\r\n }}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('settings.profiles.fields.defaultModelPlaceholder')}</option>\r\n {Array.from(familyGroups.entries()).map(([family, fModels]) => {\r\n const latest = fModels[0];\r\n const minInput = Math.min(...fModels.map((m) => m.inputCostPerMillionTokens));\r\n const maxOutput = Math.max(...fModels.map((m) => m.outputCostPerMillionTokens));\r\n return (\r\n <option key={family} value={family}>\r\n {family.charAt(0).toUpperCase() + family.slice(1)} — {t('settings.profiles.fields.latestVersion', { modelName: latest.name })} (${minInput}/${maxOutput} {t('settings.models.perMillionTokens')}) — {t('settings.profiles.fields.familyModels', { count: fModels.length })}\r\n </option>\r\n );\r\n })}\r\n {isPinned && (\r\n <option value=\"__pinned__\" disabled>\r\n ✦ {t('settings.profiles.fields.pinVersion')}: {models.find((m) => m.code === currentValue)?.name ?? currentValue}\r\n </option>\r\n )}\r\n </select>\r\n\r\n {/* Pin specific version toggle */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (isPinned) {\r\n // Unpin: find family of current model and set family\r\n const currentModel = models.find((m) => m.code === currentValue);\r\n const family = currentModel?.modelFamily;\r\n setEditForm({ ...editForm, defaultModel: family || undefined });\r\n } else if (isFamily) {\r\n // Pin: set to latest model code in family\r\n const fModels = familyGroups.get(currentValue);\r\n if (fModels && fModels.length > 0) {\r\n setEditForm({ ...editForm, defaultModel: fModels[0].code });\r\n }\r\n }\r\n }}\r\n className={`flex items-center gap-1.5 text-xs px-2 py-1 rounded transition-colors ${\r\n isPinned\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-muted)] border border-[var(--border-color)] hover:border-[var(--text-muted)]'\r\n }`}\r\n disabled={!currentValue}\r\n >\r\n {isPinned ? <Pin className=\"w-3 h-3\" /> : <PinOff className=\"w-3 h-3\" />}\r\n {isPinned ? t('settings.profiles.fields.pinVersion') : t('settings.profiles.fields.latestVersion', { modelName: '' }).replace(': ', '')}\r\n </button>\r\n </div>\r\n\r\n {/* Pinned version picker */}\r\n {isPinned && (\r\n <select\r\n value={currentValue}\r\n onChange={(e) => setEditForm({ ...editForm, defaultModel: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n >\r\n {models\r\n .filter((m) => m.providerId === selectedInstance.providerId)\r\n .map((model) => (\r\n <option key={model.id} value={model.code}>\r\n {model.name} {model.modelFamily ? `(${model.modelFamily})` : ''}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.maxTokensPerRequest')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={editForm.maxTokensPerRequest ?? ''}\r\n onChange={(e) => setEditForm({ ...editForm, maxTokensPerRequest: e.target.value ? Number(e.target.value) : undefined })}\r\n placeholder={t('settings.profiles.fields.maxTokensPerRequestPlaceholder', 'e.g. 4096')}\r\n className=\"input w-full\"\r\n min={0}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Budget Limit */}\r\n <div className=\"md:w-1/2\">\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.budgetLimit')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={editForm.budgetLimit ?? ''}\r\n onChange={(e) => setEditForm({ ...editForm, budgetLimit: e.target.value ? Number(e.target.value) : undefined })}\r\n placeholder={t('settings.profiles.fields.budgetLimitPlaceholder', 'e.g. 100.00')}\r\n className=\"input w-full\"\r\n min={0}\r\n step={0.01}\r\n />\r\n </div>\r\n\r\n {/* Budget Period Type + Budget Period Start row */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.budgetPeriodType')}\r\n </label>\r\n <select\r\n value={editForm.budgetPeriodType || ''}\r\n onChange={(e) => setEditForm({ ...editForm, budgetPeriodType: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">Select period type</option>\r\n <option value=\"Monthly\">Monthly</option>\r\n <option value=\"Quarterly\">Quarterly</option>\r\n <option value=\"Annual\">Annual</option>\r\n <option value=\"Fixed\">Fixed</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.budgetPeriodStart')}\r\n </label>\r\n <input\r\n type=\"date\"\r\n value={editForm.budgetPeriodStart || ''}\r\n onChange={(e) => setEditForm({ ...editForm, budgetPeriodStart: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* System Context */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.systemContext')}\r\n </label>\r\n <textarea\r\n value={editForm.systemContext || ''}\r\n onChange={(e) => setEditForm({ ...editForm, systemContext: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.systemContextPlaceholder', 'Enter system instructions...')}\r\n className=\"input w-full font-mono text-sm min-h-[120px] resize-y\"\r\n rows={5}\r\n />\r\n </div>\r\n </div>\r\n ) : (\r\n /* Read-only display */\r\n <>\r\n {/* Description */}\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {selectedInstance.description || <span className=\"italic\">{t('common:notSet', '—')}</span>}\r\n </p>\r\n\r\n {/* Info + Budget — 2 column layout */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-5 gap-4\">\r\n {/* Left — Info cards + System Context */}\r\n <div className=\"lg:col-span-3 flex flex-col gap-3\">\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-secondary)] mb-1\">\r\n <Building2 className=\"w-3 h-3\" />\r\n {t('settings.profiles.fields.department')}\r\n </div>\r\n <div className=\"font-medium\">\r\n {selectedInstance.department || <span className=\"text-[var(--text-tertiary)]\">—</span>}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-secondary)] mb-1\">\r\n <DollarSign className=\"w-3 h-3\" />\r\n {t('settings.profiles.fields.costCenter')}\r\n </div>\r\n <div className=\"font-medium\">\r\n {selectedInstance.costCenter || <span className=\"text-[var(--text-tertiary)]\">—</span>}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('settings.profiles.fields.defaultModel')}\r\n </div>\r\n <div className=\"font-medium font-mono text-sm\">\r\n {selectedInstance.defaultModel || <span className=\"text-[var(--text-tertiary)] font-sans\">—</span>}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('settings.profiles.fields.maxTokensPerRequest')}\r\n </div>\r\n <div className=\"font-medium\">\r\n {selectedInstance.maxTokensPerRequest\r\n ? selectedInstance.maxTokensPerRequest.toLocaleString()\r\n : <span className=\"text-[var(--text-tertiary)]\">—</span>}\r\n </div>\r\n </div>\r\n </div>\r\n {/* System Context */}\r\n <div className=\"flex-1 flex flex-col min-h-0\">\r\n <h4 className=\"font-medium mb-1.5 text-sm\">\r\n {t('settings.profiles.fields.systemContext')}\r\n </h4>\r\n {selectedInstance.systemContext ? (\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg text-sm font-mono whitespace-pre-wrap overflow-y-auto flex-1\">\r\n {selectedInstance.systemContext}\r\n </div>\r\n ) : (\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg text-sm text-[var(--text-tertiary)] italic flex-1 flex items-center justify-center\">\r\n —\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right — Budget Gauge */}\r\n <div className={`lg:col-span-2 rounded-[var(--radius-card)] border overflow-hidden flex flex-col ${\r\n selectedInstance.isOverBudget ? 'border-[var(--error-border)]' : 'border-[var(--border-color)]'\r\n }`}>\r\n <div className={`px-4 py-2.5 flex items-center gap-2 text-sm font-medium ${\r\n selectedInstance.isOverBudget ? 'bg-[var(--error-bg)] text-[var(--error-text)]' : 'bg-[var(--bg-secondary)] text-[var(--text-primary)]'\r\n }`}>\r\n <DollarSign className=\"w-4 h-4\" />\r\n {t('settings.profiles.usage.budget')}\r\n {selectedInstance.isOverBudget && (\r\n <span className=\"ml-auto flex items-center gap-1 text-xs font-medium\">\r\n <AlertCircle className=\"w-3.5 h-3.5\" />\r\n {t('settings.profiles.usage.overBudget')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n <BudgetGauge\r\n budget={selectedInstance.budgetLimit}\r\n usage={selectedInstance.currentPeriodUsage}\r\n isOver={selectedInstance.isOverBudget}\r\n t={t}\r\n budgetPeriodType={selectedInstance.budgetPeriodType}\r\n nextResetDate={selectedInstance.nextResetDate}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* API Keys Section */}\r\n <div>\r\n <h4 className=\"font-medium mb-3 flex items-center gap-2\">\r\n <Key className=\"w-4 h-4\" />\r\n {t('settings.profiles.fields.apiKeys')}\r\n </h4>\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\">\r\n <ApiKeyCard\r\n type=\"api\"\r\n hasKey={selectedInstance.hasApiKey}\r\n onSave={onSetApiKey}\r\n placeholder={t('settings.profiles.fields.apiKeyPlaceholder')}\r\n providerKeyUrl={providerApiKeyUrl}\r\n t={t}\r\n />\r\n <ApiKeyCard\r\n type=\"admin\"\r\n hasKey={selectedInstance.hasAdminKey}\r\n onSave={onSetAdminKey}\r\n placeholder={t('settings.profiles.fields.adminKeyPlaceholder')}\r\n providerKeyUrl={providerAdminApiKeyUrl}\r\n t={t}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Tenant Access Section */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h4 className=\"font-medium flex items-center gap-2\">\r\n <Building2 className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n {t('settings.profiles.tenantAccess')}\r\n </h4>\r\n </div>\r\n\r\n {/* All Tenants Toggle */}\r\n <div className=\"flex items-center justify-between p-4 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('settings.profiles.allTenants')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-0.5\">\r\n {t('settings.profiles.allTenantsDescription')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={handleToggleAllTenants}\r\n disabled={togglingAllTenants}\r\n className=\"flex-shrink-0 transition-colors\"\r\n title={t('settings.profiles.allTenants')}\r\n >\r\n {togglingAllTenants && (\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n )}\r\n {!togglingAllTenants && selectedInstance.isAllTenants && (\r\n <ToggleRight className=\"w-10 h-10 text-[var(--success-dot)]\" />\r\n )}\r\n {!togglingAllTenants && !selectedInstance.isAllTenants && (\r\n <ToggleLeft className=\"w-10 h-10 text-[var(--text-tertiary)]\" />\r\n )}\r\n </button>\r\n </div>\r\n\r\n {/* Individual Tenant List (only shown when not isAllTenants) */}\r\n {!selectedInstance.isAllTenants && (\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] overflow-hidden\">\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-[var(--bg-tertiary)]\">\r\n <h5 className=\"text-sm font-medium text-[var(--text-primary)] flex items-center gap-2\">\r\n <Building2 className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n {t('settings.profiles.tenantCount', { count: selectedInstance.tenants?.length ?? 0 })}\r\n </h5>\r\n <button\r\n onClick={() => setShowTenantSearch(!showTenantSearch)}\r\n className=\"p-1.5 rounded-md hover:bg-[var(--bg-primary)] text-[var(--color-accent-500)] transition-colors\"\r\n title={t('settings.profiles.addTenant')}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n {showTenantSearch && (\r\n <InlineSearchPanel\r\n placeholder={t('settings.profiles.addTenant')}\r\n onSearch={searchTenants}\r\n onSelect={async (id) => { await onAddTenant(id); }}\r\n onClose={() => setShowTenantSearch(false)}\r\n />\r\n )}\r\n <div className=\"p-3\">\r\n {(selectedInstance.tenants?.length ?? 0) > 0 ? (\r\n <div className=\"space-y-2\">\r\n {selectedInstance.tenants.map((tenant) => (\r\n <div\r\n key={tenant.id}\r\n className=\"group flex items-center gap-3 p-2.5 rounded-lg bg-[var(--bg-primary)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <div className=\"w-8 h-8 rounded-md bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <Building2 className=\"w-4 h-4 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)] truncate\">\r\n {tenant.tenantName}\r\n </div>\r\n {tenant.tenantSlug && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">\r\n {tenant.tenantSlug}\r\n </div>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => onRemoveTenant(tenant.tenantId)}\r\n className=\"p-1.5 rounded-md text-[var(--text-secondary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] opacity-0 group-hover:opacity-100 transition-all\"\r\n title={t('settings.profiles.removeTenant')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-4\">\r\n <Building2 className=\"w-7 h-7 mx-auto text-[var(--text-tertiary)] mb-1.5\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.profiles.noTenants')}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Prompts Section */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h4 className=\"font-medium flex items-center gap-2\">\r\n <BookOpen className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n {t('settings.profiles.prompts.title')}\r\n </h4>\r\n <button\r\n onClick={() => setShowPromptSearch(!showPromptSearch)}\r\n className=\"p-1.5 rounded-md hover:bg-[var(--bg-tertiary)] text-[var(--color-accent-500)] transition-colors\"\r\n title={t('settings.profiles.prompts.addPrompt')}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n {showPromptSearch && (\r\n <InlineSearchPanel\r\n placeholder={t('settings.profiles.prompts.addPrompt')}\r\n onSearch={searchPrompts}\r\n onSelect={async (id) => { await onAddPrompt(id); }}\r\n onClose={() => setShowPromptSearch(false)}\r\n />\r\n )}\r\n\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg overflow-hidden\">\r\n <div className=\"p-3 min-h-[100px]\">\r\n {selectedInstance?.skills && selectedInstance.skills.length > 0 ? (\r\n <div className=\"space-y-2\">\r\n {selectedInstance.skills.map((skill) => (\r\n <div\r\n key={skill.id}\r\n className=\"group flex items-center gap-3 p-2.5 rounded-lg bg-[var(--bg-primary)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <div className=\"w-8 h-8 rounded-md bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <BookOpen className=\"w-4 h-4 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)] truncate\">\r\n {skill.skillName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">\r\n {skill.skillCode} <span className=\"text-xs opacity-75\">v{skill.skillVersion}</span>\r\n </div>\r\n </div>\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] whitespace-nowrap\">\r\n {skill.skillStatus}\r\n </span>\r\n <button\r\n onClick={() => onRemovePrompt(skill.skillId)}\r\n className=\"p-1.5 rounded-md text-[var(--text-secondary)] hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 opacity-0 group-hover:opacity-100 transition-all\"\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)] text-center py-6\">\r\n {t('settings.profiles.prompts.noPrompts')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Metadata */}\r\n <div className=\"text-xs text-[var(--text-secondary)] flex items-center gap-4 pt-4 border-t border-[var(--border-color)]\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.profiles.metadata.created')}: {new Date(selectedInstance.createdAt).toLocaleDateString()}\r\n {selectedInstance.createdBy && ` ${t('settings.profiles.metadata.by')} ${selectedInstance.createdBy}`}\r\n </span>\r\n {selectedInstance.updatedAt && (\r\n <span>\r\n {t('settings.profiles.metadata.updated')}:{' '}\r\n {new Date(selectedInstance.updatedAt).toLocaleDateString()}\r\n {selectedInstance.updatedBy &&\r\n ` ${t('settings.profiles.metadata.by')} ${selectedInstance.updatedBy}`}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <NoDetailsState t={t} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Shield } from 'lucide-react';\r\nimport { ProviderCard } from '@/components/ui/EntityCard';\r\nimport type { ProviderListDto } from '@/services/api/aiApi';\r\n\r\ninterface AiProvidersTabProps {\r\n readonly providers: ProviderListDto[];\r\n}\r\n\r\nexport function AiProvidersTab({ providers }: AiProvidersTabProps): ReactElement {\r\n const { t } = useTranslation('ai');\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('settings.providers.subtitle')}\r\n </p>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n {providers.map((provider) => (\r\n <ProviderCard\r\n key={provider.id}\r\n name={provider.name}\r\n code={provider.code}\r\n description={provider.description || ''}\r\n modelCount={provider.modelCount}\r\n color=\"var(--color-accent-500)\"\r\n websiteUrl={provider.websiteUrl ?? undefined}\r\n docsUrl={provider.documentationUrl ?? undefined}\r\n apiKeyUrl={provider.apiKeyUrl ?? undefined}\r\n adminApiKeyUrl={provider.adminApiKeyUrl ?? undefined}\r\n hasAdminKey={provider.supportsAdminApi}\r\n badgeIcon={provider.supportsAdminApi ? Shield : undefined}\r\n badgeTooltip={\r\n provider.supportsAdminApi\r\n ? t('settings.providers.adminApiSupported')\r\n : undefined\r\n }\r\n labels={{\r\n websiteLabel: t('settings.providers.officialSite'),\r\n docsLabel: t('settings.providers.apiDocumentation'),\r\n apiKeyLabel: t('settings.providers.getApiKey'),\r\n adminApiKeyLabel: t('settings.providers.getAdminApiKey'),\r\n modelsLabel: t('settings.providers.models'),\r\n }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Eye,\r\n ImagePlus,\r\n Mic,\r\n Volume2,\r\n Zap,\r\n Radio,\r\n Terminal,\r\n LayoutGrid,\r\n List,\r\n Filter,\r\n Brain,\r\n ArrowDownUp,\r\n ArrowUpDown,\r\n Cpu,\r\n CheckCircle,\r\n XCircle,\r\n AlertOctagon,\r\n} from 'lucide-react';\r\nimport type { ModelListDto, ProviderListDto } from '@/services/api/aiApi';\r\n\r\nconst formatCurrency = (value: number) =>\r\n new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2 }).format(value);\r\n\r\ntype CapabilityKey =\r\n | 'supportsVision'\r\n | 'supportsImageGeneration'\r\n | 'supportsAudioInput'\r\n | 'supportsAudioOutput'\r\n | 'supportsFunctionCalling'\r\n | 'supportsStreaming'\r\n | 'supportsCodeExecution';\r\n\r\nconst CAPABILITIES: {\r\n key: CapabilityKey;\r\n icon: React.ComponentType<{ className?: string }>;\r\n color: string;\r\n bgLight: string;\r\n bgDark: string;\r\n}[] = [\r\n {\r\n key: 'supportsVision',\r\n icon: Eye,\r\n color: 'text-blue-700 dark:text-blue-400',\r\n bgLight: 'bg-blue-100',\r\n bgDark: 'dark:bg-blue-900/30',\r\n },\r\n {\r\n key: 'supportsImageGeneration',\r\n icon: ImagePlus,\r\n color: 'text-pink-700 dark:text-pink-400',\r\n bgLight: 'bg-pink-100',\r\n bgDark: 'dark:bg-pink-900/30',\r\n },\r\n {\r\n key: 'supportsAudioInput',\r\n icon: Mic,\r\n color: 'text-amber-700 dark:text-amber-400',\r\n bgLight: 'bg-amber-100',\r\n bgDark: 'dark:bg-amber-900/30',\r\n },\r\n {\r\n key: 'supportsAudioOutput',\r\n icon: Volume2,\r\n color: 'text-orange-700 dark:text-orange-400',\r\n bgLight: 'bg-orange-100',\r\n bgDark: 'dark:bg-orange-900/30',\r\n },\r\n {\r\n key: 'supportsFunctionCalling',\r\n icon: Zap,\r\n color: 'text-purple-700 dark:text-purple-400',\r\n bgLight: 'bg-purple-100',\r\n bgDark: 'dark:bg-purple-900/30',\r\n },\r\n {\r\n key: 'supportsStreaming',\r\n icon: Radio,\r\n color: 'text-green-700 dark:text-green-400',\r\n bgLight: 'bg-green-100',\r\n bgDark: 'dark:bg-green-900/30',\r\n },\r\n {\r\n key: 'supportsCodeExecution',\r\n icon: Terminal,\r\n color: 'text-cyan-700 dark:text-cyan-400',\r\n bgLight: 'bg-cyan-100',\r\n bgDark: 'dark:bg-cyan-900/30',\r\n },\r\n];\r\n\r\nconst getProviderInitial = (providerCode: string | null | undefined) => {\r\n return providerCode?.charAt(0).toUpperCase() || 'M';\r\n};\r\n\r\nconst getModelStatusBadge = (model: ModelListDto, t: (key: string) => string) => {\r\n if (model.isDeprecated) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-400 rounded text-xs\">\r\n <AlertOctagon className=\"w-3 h-3\" />\r\n {t('settings.models.deprecated')}\r\n </span>\r\n );\r\n }\r\n if (model.isActive) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400 rounded text-xs\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('settings.models.statusActive')}\r\n </span>\r\n );\r\n }\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 bg-gray-100 dark:bg-gray-900/30 text-gray-700 dark:text-gray-400 rounded text-xs\">\r\n <XCircle className=\"w-3 h-3\" />\r\n {t('settings.models.statusInactive')}\r\n </span>\r\n );\r\n};\r\n\r\ninterface AiModelsTabProps {\r\n readonly models: ModelListDto[];\r\n readonly providers: ProviderListDto[];\r\n readonly filter: { category?: string; providerId?: string };\r\n readonly onFilterChange: (filter: { category?: string; providerId?: string }) => void;\r\n}\r\n\r\nexport function AiModelsTab({\r\n models,\r\n providers,\r\n filter,\r\n onFilterChange,\r\n}: AiModelsTabProps): ReactElement {\r\n const { t } = useTranslation('ai');\r\n\r\n const categories = [\r\n 'TextGeneration',\r\n 'Embedding',\r\n 'ImageGeneration',\r\n 'AudioGeneration',\r\n 'VideoGeneration',\r\n ];\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [viewMode, setViewMode] = useState<'grid' | 'table'>('grid');\r\n const [selectedCapabilities, setSelectedCapabilities] = useState<\r\n Set<CapabilityKey>\r\n >(new Set());\r\n const [filterMode, setFilterMode] = useState<'or' | 'and'>('or');\r\n const pageSize = viewMode === 'grid' ? 12 : 10;\r\n\r\n // Filter models by capabilities\r\n const filteredModels = models.filter((model) => {\r\n if (selectedCapabilities.size === 0) return true;\r\n\r\n const caps = Array.from(selectedCapabilities);\r\n if (filterMode === 'or') {\r\n return caps.some((cap) => model[cap]);\r\n } else {\r\n return caps.every((cap) => model[cap]);\r\n }\r\n });\r\n\r\n const totalPages = Math.ceil(filteredModels.length / pageSize);\r\n const paginatedModels = filteredModels.slice(\r\n (currentPage - 1) * pageSize,\r\n currentPage * pageSize\r\n );\r\n\r\n useEffect(() => {\r\n setCurrentPage(1);\r\n }, [filter, selectedCapabilities, filterMode, viewMode]);\r\n\r\n const toggleCapability = (cap: CapabilityKey) => {\r\n setSelectedCapabilities((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(cap)) {\r\n next.delete(cap);\r\n } else {\r\n next.add(cap);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const clearCapabilityFilters = () => {\r\n setSelectedCapabilities(new Set());\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Header with view toggle */}\r\n <div className=\"flex items-center justify-between\">\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('settings.models.subtitle')}\r\n </p>\r\n {/* View mode toggle */}\r\n <div className=\"flex items-center gap-1 p-1 bg-[var(--bg-secondary)] rounded-lg\">\r\n <button\r\n onClick={() => setViewMode('grid')}\r\n className={`p-2 rounded transition-colors ${viewMode === 'grid' ? 'bg-[var(--bg-primary)] shadow-sm' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n title={t('settings.models.viewGrid')}\r\n >\r\n <LayoutGrid className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`p-2 rounded transition-colors ${viewMode === 'table' ? 'bg-[var(--bg-primary)] shadow-sm' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n title={t('settings.models.viewTable')}\r\n >\r\n <List className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* 2. Category & Provider Filters */}\r\n <div className=\"flex flex-wrap gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.models.category')}\r\n </label>\r\n <select\r\n value={filter.category || ''}\r\n onChange={(e) =>\r\n onFilterChange({\r\n ...filter,\r\n category: e.target.value || undefined,\r\n })\r\n }\r\n className=\"input min-w-[150px]\"\r\n >\r\n <option value=\"\">{t('prompts.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {t(`settings.models.categories.${cat}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.profiles.fields.provider')}\r\n </label>\r\n <select\r\n value={filter.providerId || ''}\r\n onChange={(e) =>\r\n onFilterChange({\r\n ...filter,\r\n providerId: e.target.value || undefined,\r\n })\r\n }\r\n className=\"input min-w-[150px]\"\r\n >\r\n <option value=\"\">{t('dashboard.allProviders')}</option>\r\n {providers.map((p) => (\r\n <option key={p.id} value={p.id}>\r\n {p.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* 3. Capabilities Filter Bar - CLICKABLE LEGEND */}\r\n <div className=\"card p-4 space-y-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium\">\r\n {t('settings.models.filterByCapabilities')}\r\n </span>\r\n {selectedCapabilities.size > 0 && (\r\n <span className=\"px-2 py-0.5 bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] text-[var(--color-accent-600)] text-xs rounded-full\">\r\n {selectedCapabilities.size}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {selectedCapabilities.size > 0 && (\r\n <>\r\n <div className=\"flex items-center gap-1 p-1 bg-[var(--bg-secondary)] rounded-lg text-xs\">\r\n <button\r\n onClick={() => setFilterMode('or')}\r\n className={`px-2 py-1 rounded transition-colors ${filterMode === 'or' ? 'bg-[var(--bg-primary)] shadow-sm font-medium' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n >\r\n {t('settings.models.filterOr')}\r\n </button>\r\n <button\r\n onClick={() => setFilterMode('and')}\r\n className={`px-2 py-1 rounded transition-colors ${filterMode === 'and' ? 'bg-[var(--bg-primary)] shadow-sm font-medium' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n >\r\n {t('settings.models.filterAnd')}\r\n </button>\r\n </div>\r\n <button\r\n onClick={clearCapabilityFilters}\r\n className=\"text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] underline\"\r\n >\r\n {t('common:clear')}\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {CAPABILITIES.map(({ key, icon: Icon, color, bgLight, bgDark }) => {\r\n const isSelected = selectedCapabilities.has(key);\r\n return (\r\n <button\r\n key={key}\r\n onClick={() => toggleCapability(key)}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-medium transition-all ${bgLight} ${bgDark} ${color} ${\r\n isSelected\r\n ? 'ring-2 ring-offset-1 ring-current shadow-sm'\r\n : 'opacity-60 hover:opacity-100'\r\n }`}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n {t(`settings.models.${key}`)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n {selectedCapabilities.size > 0 && (\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {filterMode === 'or'\r\n ? t('settings.models.filterOrDescription', {\r\n count: filteredModels.length,\r\n })\r\n : t('settings.models.filterAndDescription', {\r\n count: filteredModels.length,\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Models Display */}\r\n {filteredModels.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Cpu className=\"w-16 h-16 mx-auto mb-4 text-[var(--text-secondary)] opacity-50\" />\r\n <h3 className=\"text-lg font-medium mb-2\">\r\n {t('settings.models.noModels')}\r\n </h3>\r\n {selectedCapabilities.size > 0 && (\r\n <button\r\n onClick={clearCapabilityFilters}\r\n className=\"btn btn-secondary mt-2\"\r\n >\r\n {t('settings.models.clearFilters')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {filteredModels.length > 0 && viewMode === 'grid' && (\r\n /* GRID VIEW - Modern Cards */\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\r\n {paginatedModels.map((model) => (\r\n <div\r\n key={model.id}\r\n className={`bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:-translate-y-0.5 hover:border-[var(--color-accent-400)] ${model.isDeprecated ? 'opacity-60' : ''}`}\r\n >\r\n {/* Header with user's accent color */}\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 bg-[var(--color-accent-500)] rounded-lg flex items-center justify-center text-white font-bold shadow-lg\">\r\n {getProviderInitial(model.providerCode)}\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {model.name}\r\n </h3>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {model.providerName}\r\n </p>\r\n </div>\r\n </div>\r\n {model.isDeprecated && (\r\n <span className=\"px-2 py-0.5 bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-400 rounded text-xs flex items-center gap-1\">\r\n <AlertOctagon className=\"w-3 h-3\" />\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Card Body */}\r\n <div className=\"p-4 space-y-4\">\r\n {/* Category Badge */}\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"px-2 py-1 bg-[var(--bg-secondary)] rounded text-xs font-medium\">\r\n {t(`settings.models.categories.${model.category}`)}\r\n </span>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">\r\n {model.code}\r\n </code>\r\n </div>\r\n\r\n {/* Pricing */}\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-3 text-center\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1 flex items-center justify-center gap-1\">\r\n <ArrowDownUp className=\"w-3 h-3\" />\r\n {t('settings.models.inputCost')}\r\n </div>\r\n <div className=\"font-mono font-bold text-lg\">\r\n {formatCurrency(model.inputCostPerMillionTokens)}\r\n </div>\r\n <div className=\"text-[10px] text-[var(--text-tertiary)]\">\r\n {t('settings.models.perMillionTokens')}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-3 text-center\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1 flex items-center justify-center gap-1\">\r\n <ArrowUpDown className=\"w-3 h-3\" />\r\n {t('settings.models.outputCost')}\r\n </div>\r\n <div className=\"font-mono font-bold text-lg\">\r\n {formatCurrency(model.outputCostPerMillionTokens)}\r\n </div>\r\n <div className=\"text-[10px] text-[var(--text-tertiary)]\">\r\n {t('settings.models.perMillionTokens')}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Context Window */}\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)] flex items-center gap-1\">\r\n <Brain className=\"w-4 h-4\" />\r\n {t('settings.models.contextWindow')}\r\n </span>\r\n <span className=\"font-mono font-medium\">\r\n {model.contextWindow >= 1000000\r\n ? `${(model.contextWindow / 1000000).toFixed(1)}M`\r\n : `${(model.contextWindow / 1000).toFixed(0)}K`}\r\n </span>\r\n </div>\r\n\r\n {/* Capabilities */}\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {CAPABILITIES.map(({ key, icon: Icon, color, bgLight, bgDark }) =>\r\n model[key] && (\r\n <span\r\n key={key}\r\n className={`p-1.5 ${bgLight} ${bgDark} ${color} rounded-md`}\r\n title={t(`settings.models.${key}`)}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )\r\n )}\r\n {!CAPABILITIES.some(({ key }) => model[key]) && (\r\n <span className=\"text-xs text-[var(--text-tertiary)] italic\">\r\n {t('settings.models.noCapabilities')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {filteredModels.length > 0 && viewMode !== 'grid' && (\r\n /* TABLE VIEW */\r\n <div className=\"card overflow-hidden\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"text-left p-4 font-medium text-sm\">{t('settings.models.model')}</th>\r\n <th className=\"text-left p-4 font-medium text-sm\">\r\n {t('settings.models.category')}\r\n </th>\r\n <th className=\"text-right p-4 font-medium text-sm\">\r\n {t('settings.models.inputCost')} $/M\r\n </th>\r\n <th className=\"text-right p-4 font-medium text-sm\">\r\n {t('settings.models.outputCost')} $/M\r\n </th>\r\n <th className=\"text-right p-4 font-medium text-sm\">\r\n {t('settings.models.contextWindow')}\r\n </th>\r\n <th className=\"text-center p-4 font-medium text-sm\">\r\n {t('settings.models.capabilities')}\r\n </th>\r\n <th className=\"text-center p-4 font-medium text-sm\">{t('settings.models.status')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {paginatedModels.map((model) => (\r\n <tr\r\n key={model.id}\r\n className={`hover:bg-[var(--bg-secondary)]/50 ${model.isDeprecated ? 'opacity-60' : ''}`}\r\n >\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 bg-[var(--color-accent-500)] rounded flex items-center justify-center text-xs font-bold text-white\">\r\n {getProviderInitial(model.providerCode)}\r\n </div>\r\n <div>\r\n <div className=\"font-medium\">{model.name}</div>\r\n <code className=\"text-xs text-[var(--text-secondary)]\">\r\n {model.code}\r\n </code>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"px-2 py-1 bg-[var(--bg-secondary)] rounded text-sm\">\r\n {t(`settings.models.categories.${model.category}`)}\r\n </span>\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <span className=\"font-mono font-medium\">\r\n {formatCurrency(model.inputCostPerMillionTokens)}\r\n </span>\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <span className=\"font-mono font-medium\">\r\n {formatCurrency(model.outputCostPerMillionTokens)}\r\n </span>\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <div className=\"font-mono text-sm\">\r\n {model.contextWindow >= 1000000\r\n ? `${(model.contextWindow / 1000000).toFixed(1)}M`\r\n : `${(model.contextWindow / 1000).toFixed(0)}K`}\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center justify-center gap-1 flex-wrap\">\r\n {CAPABILITIES.map(\r\n ({ key, icon: Icon, color, bgLight, bgDark }) =>\r\n model[key] && (\r\n <span\r\n key={key}\r\n className={`p-1 ${bgLight} ${bgDark} ${color} rounded`}\r\n title={t(`settings.models.${key}`)}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"p-4 text-center\">\r\n {getModelStatusBadge(model, t)}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('common.showingOf', {\r\n from: (currentPage - 1) * pageSize + 1,\r\n to: Math.min(currentPage * pageSize, filteredModels.length),\r\n total: filteredModels.length,\r\n })}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\r\n disabled={currentPage === 1}\r\n className=\"btn btn-sm btn-secondary disabled:opacity-50\"\r\n >\r\n {t('common.previous')}\r\n </button>\r\n <div className=\"flex items-center gap-1\">\r\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\r\n let page: number;\r\n if (totalPages <= 5) {\r\n page = i + 1;\r\n } else if (currentPage <= 3) {\r\n page = i + 1;\r\n } else if (currentPage >= totalPages - 2) {\r\n page = totalPages - 4 + i;\r\n } else {\r\n page = currentPage - 2 + i;\r\n }\r\n return (\r\n <button\r\n key={page}\r\n onClick={() => setCurrentPage(page)}\r\n className={`w-8 h-8 rounded text-sm font-medium ${\r\n currentPage === page\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'hover:bg-[var(--bg-secondary)]'\r\n }`}\r\n >\r\n {page}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n <button\r\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\r\n disabled={currentPage === totalPages}\r\n className=\"btn btn-sm btn-secondary disabled:opacity-50\"\r\n >\r\n {t('common.next')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport {\r\n aiApi,\r\n type ProviderInstanceListDto,\r\n type ProviderInstanceDetailDto,\r\n type CreateProviderInstanceRequest,\r\n type UpdateProviderInstanceRequest,\r\n type SetKeyRequest,\r\n} from '@/services/api/aiApi';\r\n\r\nexport interface UseAiInstancesReturn {\r\n instances: ProviderInstanceListDto[];\r\n selectedInstance: ProviderInstanceDetailDto | null;\r\n loading: boolean;\r\n error: string | null;\r\n\r\n loadInstances: () => Promise<void>;\r\n loadInstanceDetail: (instanceId: string) => Promise<void>;\r\n refreshInstance: () => Promise<void>;\r\n createInstance: (data: CreateProviderInstanceRequest) => Promise<ProviderInstanceDetailDto | null>;\r\n updateInstance: (instanceId: string, data: UpdateProviderInstanceRequest) => Promise<ProviderInstanceDetailDto | null>;\r\n deleteInstance: (instanceId: string) => Promise<void>;\r\n toggleInstanceActive: (instanceId: string) => Promise<void>;\r\n setApiKey: (instanceId: string, apiKey: string) => Promise<void>;\r\n setAdminKey: (instanceId: string, adminKey: string) => Promise<void>;\r\n selectInstance: (instance: ProviderInstanceDetailDto | null) => void;\r\n clearError: () => void;\r\n}\r\n\r\nexport function useAiInstances(): UseAiInstancesReturn {\r\n const [instances, setInstances] = useState<ProviderInstanceListDto[]>([]);\r\n const [selectedInstance, setSelectedInstance] = useState<ProviderInstanceDetailDto | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadInstances = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await aiApi.instances.getAll();\r\n setInstances(data ?? []);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load instances';\r\n setError(message);\r\n console.error('Failed to load instances:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadInstanceDetail = useCallback(async (instanceId: string) => {\r\n setError(null);\r\n try {\r\n const data = await aiApi.instances.getById(instanceId);\r\n setSelectedInstance(data ?? null);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load instance details';\r\n setError(message);\r\n console.error('Failed to load instance details:', err);\r\n }\r\n }, []);\r\n\r\n const refreshInstance = useCallback(async () => {\r\n if (!selectedInstance) return;\r\n await loadInstanceDetail(selectedInstance.id);\r\n }, [selectedInstance, loadInstanceDetail]);\r\n\r\n const createInstance = useCallback(\r\n async (data: CreateProviderInstanceRequest): Promise<ProviderInstanceDetailDto | null> => {\r\n setError(null);\r\n try {\r\n const result = await aiApi.instances.create(data);\r\n await loadInstances();\r\n return result ?? null;\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to create instance';\r\n setError(message);\r\n console.error('Failed to create instance:', err);\r\n return null;\r\n }\r\n },\r\n [loadInstances]\r\n );\r\n\r\n const updateInstance = useCallback(\r\n async (instanceId: string, data: UpdateProviderInstanceRequest): Promise<ProviderInstanceDetailDto | null> => {\r\n setError(null);\r\n try {\r\n const result = await aiApi.instances.update(instanceId, data);\r\n await loadInstances();\r\n if (selectedInstance?.id === instanceId) {\r\n setSelectedInstance(result ?? null);\r\n }\r\n return result ?? null;\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to update instance';\r\n setError(message);\r\n console.error('Failed to update instance:', err);\r\n return null;\r\n }\r\n },\r\n [loadInstances, selectedInstance?.id]\r\n );\r\n\r\n const deleteInstance = useCallback(\r\n async (instanceId: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n await aiApi.instances.delete(instanceId);\r\n await loadInstances();\r\n if (selectedInstance?.id === instanceId) {\r\n setSelectedInstance(null);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to delete instance';\r\n setError(message);\r\n console.error('Failed to delete instance:', err);\r\n }\r\n },\r\n [loadInstances, selectedInstance?.id]\r\n );\r\n\r\n const toggleInstanceActive = useCallback(\r\n async (instanceId: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n await aiApi.instances.toggleActive(instanceId);\r\n await loadInstances();\r\n if (selectedInstance?.id === instanceId) {\r\n await loadInstanceDetail(instanceId);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to toggle instance';\r\n setError(message);\r\n console.error('Failed to toggle instance:', err);\r\n }\r\n },\r\n [loadInstances, selectedInstance?.id, loadInstanceDetail]\r\n );\r\n\r\n const setApiKey = useCallback(\r\n async (instanceId: string, apiKey: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n const request: SetKeyRequest = { value: apiKey };\r\n await aiApi.instances.setApiKey(instanceId, request);\r\n if (selectedInstance?.id === instanceId) {\r\n await loadInstanceDetail(instanceId);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to set API key';\r\n setError(message);\r\n console.error('Failed to set API key:', err);\r\n }\r\n },\r\n [selectedInstance?.id, loadInstanceDetail]\r\n );\r\n\r\n const setAdminKey = useCallback(\r\n async (instanceId: string, adminKey: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n const request: SetKeyRequest = { value: adminKey };\r\n await aiApi.instances.setAdminKey(instanceId, request);\r\n if (selectedInstance?.id === instanceId) {\r\n await loadInstanceDetail(instanceId);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to set admin key';\r\n setError(message);\r\n console.error('Failed to set admin key:', err);\r\n }\r\n },\r\n [selectedInstance?.id, loadInstanceDetail]\r\n );\r\n\r\n const selectInstance = useCallback((instance: ProviderInstanceDetailDto | null) => {\r\n setSelectedInstance(instance);\r\n setError(null);\r\n }, []);\r\n\r\n const clearError = useCallback(() => {\r\n setError(null);\r\n }, []);\r\n\r\n return {\r\n instances,\r\n selectedInstance,\r\n loading,\r\n error,\r\n loadInstances,\r\n loadInstanceDetail,\r\n refreshInstance,\r\n createInstance,\r\n updateInstance,\r\n deleteInstance,\r\n toggleInstanceActive,\r\n setApiKey,\r\n setAdminKey,\r\n selectInstance,\r\n clearError,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { aiApi, type ProviderListDto } from '@/services/api/aiApi';\r\n\r\nexport interface UseAiProvidersReturn {\r\n providers: ProviderListDto[];\r\n loading: boolean;\r\n error: string | null;\r\n\r\n loadProviders: () => Promise<void>;\r\n clearError: () => void;\r\n}\r\n\r\nexport function useAiProviders(): UseAiProvidersReturn {\r\n const [providers, setProviders] = useState<ProviderListDto[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const setError_ = useCallback((message: string | null) => {\r\n setError(message);\r\n }, []);\r\n\r\n const loadProviders = useCallback(async () => {\r\n setLoading(true);\r\n setError_(null);\r\n try {\r\n const data = await aiApi.settings.getProviders();\r\n setProviders(data ?? []);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load providers';\r\n setError_(message);\r\n console.error('Failed to load providers:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [setError_]);\r\n\r\n const clearError = useCallback(() => {\r\n setError_(null);\r\n }, [setError_]);\r\n\r\n return {\r\n providers,\r\n loading,\r\n error,\r\n loadProviders,\r\n clearError,\r\n };\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { aiApi, type ModelListDto } from '@/services/api/aiApi';\r\n\r\nexport interface ModelFilter {\r\n category?: string;\r\n providerId?: string;\r\n}\r\n\r\nexport interface UseAiModelsReturn {\r\n models: ModelListDto[];\r\n filteredModels: ModelListDto[];\r\n modelFilter: ModelFilter;\r\n loading: boolean;\r\n error: string | null;\r\n\r\n loadModels: (category?: string, providerId?: string) => Promise<void>;\r\n setModelFilter: (filter: ModelFilter) => Promise<void>;\r\n clearFilters: () => Promise<void>;\r\n clearError: () => void;\r\n}\r\n\r\nexport function useAiModels(): UseAiModelsReturn {\r\n const [models, setModels] = useState<ModelListDto[]>([]);\r\n const [modelFilter, setModelFilterState] = useState<ModelFilter>({});\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const setError_ = useCallback((message: string | null) => {\r\n setError(message);\r\n }, []);\r\n\r\n const loadModels = useCallback(\r\n async (category?: string, providerId?: string) => {\r\n setLoading(true);\r\n setError_(null);\r\n try {\r\n const data = await aiApi.settings.getModels(category, providerId);\r\n setModels(data ?? []);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load models';\r\n setError_(message);\r\n console.error('Failed to load models:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [setError_]\r\n );\r\n\r\n const setModelFilter = useCallback(\r\n async (filter: ModelFilter) => {\r\n setModelFilterState(filter);\r\n await loadModels(filter.category, filter.providerId);\r\n },\r\n [loadModels]\r\n );\r\n\r\n const clearFilters = useCallback(async () => {\r\n setModelFilterState({});\r\n await loadModels();\r\n }, [loadModels]);\r\n\r\n const clearError = useCallback(() => {\r\n setError_(null);\r\n }, [setError_]);\r\n\r\n const filteredModels = useMemo(() => {\r\n let result = models;\r\n\r\n if (modelFilter.providerId) {\r\n result = result.filter((model) => model.providerId === modelFilter.providerId);\r\n }\r\n\r\n if (modelFilter.category) {\r\n result = result.filter((model) => model.category === modelFilter.category);\r\n }\r\n\r\n return result;\r\n }, [models, modelFilter]);\r\n\r\n return {\r\n models,\r\n filteredModels,\r\n modelFilter,\r\n loading,\r\n error,\r\n loadModels,\r\n setModelFilter,\r\n clearFilters,\r\n clearError,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { aiApi } from '@/services/api/aiApi';\r\n\r\nexport interface AccessTenant {\r\n id: string;\r\n tenantId: string;\r\n tenantName: string;\r\n tenantSlug: string | null;\r\n}\r\n\r\nexport interface UseInstanceAccessReturn {\r\n tenants: AccessTenant[];\r\n showAddTenantModal: boolean;\r\n openAddTenantModal: () => void;\r\n closeAddTenantModal: () => void;\r\n addTenant: (instanceId: string, tenantId: string) => Promise<void>;\r\n removeTenant: (instanceId: string, tenantId: string) => Promise<void>;\r\n loadAccessData: (tenants?: AccessTenant[]) => void;\r\n}\r\n\r\nexport function useInstanceAccess(): UseInstanceAccessReturn {\r\n const [tenants, setTenants] = useState<AccessTenant[]>([]);\r\n const [showAddTenantModal, setShowAddTenantModal] = useState(false);\r\n\r\n const openAddTenantModal = useCallback(() => setShowAddTenantModal(true), []);\r\n const closeAddTenantModal = useCallback(() => setShowAddTenantModal(false), []);\r\n\r\n const addTenant = useCallback(\r\n async (instanceId: string, tenantId: string): Promise<void> => {\r\n try {\r\n await aiApi.instances.addTenant(instanceId, { tenantId });\r\n } catch (err) {\r\n console.error('Failed to add tenant:', err);\r\n throw err;\r\n }\r\n },\r\n []\r\n );\r\n\r\n const removeTenant = useCallback(\r\n async (instanceId: string, tenantId: string): Promise<void> => {\r\n try {\r\n await aiApi.instances.removeTenant(instanceId, tenantId);\r\n setTenants((prev) => prev.filter((t) => t.tenantId !== tenantId));\r\n } catch (err) {\r\n console.error('Failed to remove tenant:', err);\r\n throw err;\r\n }\r\n },\r\n []\r\n );\r\n\r\n const loadAccessData = useCallback(\r\n (tenants?: AccessTenant[]) => {\r\n if (tenants) setTenants(tenants);\r\n },\r\n []\r\n );\r\n\r\n return {\r\n tenants,\r\n showAddTenantModal,\r\n openAddTenantModal,\r\n closeAddTenantModal,\r\n addTenant,\r\n removeTenant,\r\n loadAccessData,\r\n };\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Settings,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n X,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport {\r\n AiProfilesTab,\r\n AiProvidersTab,\r\n AiModelsTab,\r\n} from '@/components/platform/administration/ai';\r\nimport {\r\n aiApi,\r\n type CreateProviderInstanceRequest,\r\n} from '@/services/api/aiApi';\r\nimport { useAiInstances } from '@/hooks/useAiInstances';\r\nimport { useAiProviders } from '@/hooks/useAiProviders';\r\nimport { useAiModels } from '@/hooks/useAiModels';\r\nimport { useInstanceAccess } from '@/hooks/useInstanceAccess';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst VALID_TABS = ['profiles', 'providers', 'models'] as const;\r\ntype TabType = typeof VALID_TABS[number];\r\n\r\nexport function AiSettingsPage(): ReactElement {\r\n const { t } = useTranslation(['ai']);\r\n const { activeTab, setActiveTab } = useTabNavigation<TabType>('profiles', VALID_TABS);\r\n\r\n // Data hooks\r\n const aiInstances = useAiInstances();\r\n const aiProviders = useAiProviders();\r\n const aiModels = useAiModels();\r\n const instanceAccess = useInstanceAccess();\r\n\r\n // Page-level modal states\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [formData, setFormData] = useState<CreateProviderInstanceRequest>({\r\n name: '',\r\n code: '',\r\n providerId: '',\r\n });\r\n const [loadingCode, setLoadingCode] = useState(false);\r\n const [deleteConfirm, setDeleteConfirm] = useState<{ show: boolean; instanceId: string | null }>({ show: false, instanceId: null });\r\n\r\n // Initial data load\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(() => {\r\n const loadAllData = async () => {\r\n await Promise.all([\r\n aiInstances.loadInstances(),\r\n aiProviders.loadProviders(),\r\n aiModels.loadModels(),\r\n ]);\r\n };\r\n loadAllData();\r\n }, []);\r\n\r\n // Load instance details and access data when selected\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(() => {\r\n if (aiInstances.selectedInstance) {\r\n const { tenants } = aiInstances.selectedInstance;\r\n instanceAccess.loadAccessData(tenants);\r\n }\r\n }, [aiInstances.selectedInstance]);\r\n\r\n // Handlers for Profiles tab\r\n const handleSelectInstance = async (instanceId: string) => {\r\n await aiInstances.loadInstanceDetail(instanceId);\r\n };\r\n\r\n const handleDeleteInstance = (instanceId: string) => {\r\n setDeleteConfirm({ show: true, instanceId });\r\n };\r\n\r\n const confirmDeleteInstance = async () => {\r\n if (!deleteConfirm.instanceId) return;\r\n await aiInstances.deleteInstance(deleteConfirm.instanceId);\r\n setDeleteConfirm({ show: false, instanceId: null });\r\n };\r\n\r\n const handleToggleActive = async (instanceId: string) => {\r\n await aiInstances.toggleInstanceActive(instanceId);\r\n };\r\n\r\n const handleCreateInstance = async () => {\r\n try {\r\n const result = await aiInstances.createInstance(formData);\r\n if (result) {\r\n setShowCreateModal(false);\r\n setFormData({\r\n name: '',\r\n code: '',\r\n providerId: '',\r\n });\r\n }\r\n } catch (err) {\r\n console.error('Failed to create instance:', err);\r\n }\r\n };\r\n\r\n const handleUpdateInstance = async (data: Parameters<typeof aiInstances.updateInstance>[1]) => {\r\n if (!aiInstances.selectedInstance) return;\r\n await aiInstances.updateInstance(aiInstances.selectedInstance.id, data);\r\n };\r\n\r\n const handleGenerateCode = async () => {\r\n if (!formData.providerId) return;\r\n setLoadingCode(true);\r\n try {\r\n const response = await aiApi.instances.generateCode(formData.providerId);\r\n setFormData({ ...formData, code: response.code });\r\n } catch (err) {\r\n console.error('Failed to generate code:', err);\r\n } finally {\r\n setLoadingCode(false);\r\n }\r\n };\r\n\r\n // Determine loading state\r\n const isLoading = aiInstances.loading || aiProviders.loading || aiModels.loading;\r\n\r\n if (isLoading && !aiInstances.instances.length) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('settings.title', 'Settings') },\r\n ]}\r\n />\r\n\r\n {/* Error Banner */}\r\n {aiInstances.error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{aiInstances.error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Settings className=\"w-6 h-6\" />\r\n {t('settings.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">{t('settings.description')}</p>\r\n </div>\r\n </div>\r\n {activeTab === 'profiles' && (\r\n <button\r\n onClick={() => {\r\n setFormData({\r\n name: '',\r\n code: '',\r\n providerId: '',\r\n });\r\n setShowCreateModal(true);\r\n }}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('settings.profiles.createButton')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-8\">\r\n {(['profiles', 'providers', 'models'] as const).map((tab) => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`pb-4 px-1 border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-accent-600)] text-[var(--text-primary)] font-medium'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`settings.tabs.${tab}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div>\r\n {activeTab === 'profiles' && (\r\n <AiProfilesTab\r\n instances={aiInstances.instances}\r\n selectedInstance={aiInstances.selectedInstance}\r\n onSelectInstance={handleSelectInstance}\r\n onToggleActive={handleToggleActive}\r\n onDelete={handleDeleteInstance}\r\n onUpdate={handleUpdateInstance}\r\n models={aiModels.models}\r\n onSetApiKey={async (key) => { if (aiInstances.selectedInstance) await aiInstances.setApiKey(aiInstances.selectedInstance.id, key); }}\r\n onSetAdminKey={async (key) => { if (aiInstances.selectedInstance) await aiInstances.setAdminKey(aiInstances.selectedInstance.id, key); }}\r\n providerApiKeyUrl={aiProviders.providers.find(p => p.id === aiInstances.selectedInstance?.providerId)?.apiKeyUrl}\r\n providerAdminApiKeyUrl={aiProviders.providers.find(p => p.id === aiInstances.selectedInstance?.providerId)?.adminApiKeyUrl}\r\n onAddTenant={async (tenantId) => { if (aiInstances.selectedInstance) { await instanceAccess.addTenant(aiInstances.selectedInstance.id, tenantId); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onRemoveTenant={async (tenantId) => { if (aiInstances.selectedInstance) { await instanceAccess.removeTenant(aiInstances.selectedInstance.id, tenantId); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onSetAllTenants={async (isAllTenants) => { if (aiInstances.selectedInstance) { await aiApi.instances.setAllTenants(aiInstances.selectedInstance.id, { isAllTenants }); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onAddPrompt={async (skillId) => { if (aiInstances.selectedInstance) { await aiApi.instances.addSkill(aiInstances.selectedInstance.id, { skillId }); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onRemovePrompt={async (skillId) => { if (aiInstances.selectedInstance) { await aiApi.instances.removeSkill(aiInstances.selectedInstance.id, skillId); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n />\r\n )}\r\n\r\n {activeTab === 'providers' && <AiProvidersTab providers={aiProviders.providers} />}\r\n\r\n {activeTab === 'models' && (\r\n <AiModelsTab\r\n models={aiModels.filteredModels}\r\n providers={aiProviders.providers}\r\n filter={aiModels.modelFilter}\r\n onFilterChange={(filter) => aiModels.setModelFilter(filter)}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Create Instance Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\" role=\"dialog\" aria-modal=\"true\" onKeyDown={(e) => { if (e.key === 'Escape') setShowCreateModal(false); }}>\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-lg max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between p-6 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-xl font-bold\">{t('settings.profiles.createTitle')}</h2>\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-6 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('settings.profiles.fields.name')}</label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\r\n placeholder={t('settings.profiles.fields.namePlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('settings.profiles.fields.provider')}</label>\r\n <select\r\n value={formData.providerId}\r\n onChange={(e) => setFormData({ ...formData, providerId: e.target.value, defaultModel: undefined })}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('settings.profiles.fields.selectProvider')}</option>\r\n {aiProviders.providers.map((provider) => (\r\n <option key={provider.id} value={provider.id}>\r\n {provider.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.profiles.fields.defaultModel')}\r\n </label>\r\n <select\r\n value={formData.defaultModel || ''}\r\n onChange={(e) => setFormData({ ...formData, defaultModel: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n disabled={!formData.providerId}\r\n >\r\n <option value=\"\">{t('settings.profiles.fields.defaultModelPlaceholder')}</option>\r\n {aiModels.models\r\n .filter((m) => m.providerId === formData.providerId)\r\n .map((model) => (\r\n <option key={model.id} value={model.code}>\r\n {model.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.profiles.fields.code')}\r\n <span className=\"text-xs text-[var(--text-secondary)] ml-2\">({t('settings.profiles.fields.autoGenerated')})</span>\r\n </label>\r\n <div className=\"flex gap-2\">\r\n <input\r\n type=\"text\"\r\n value={loadingCode ? '...' : formData.code || ''}\r\n readOnly\r\n className=\"input w-full bg-[var(--bg-secondary)] font-mono text-sm\"\r\n placeholder={t('settings.profiles.fields.codePlaceholder')}\r\n />\r\n <button\r\n onClick={handleGenerateCode}\r\n disabled={!formData.providerId || loadingCode}\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n {loadingCode ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : t('settings.profiles.fields.generate')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex gap-3 justify-end p-6 border-t border-[var(--border-color)]\">\r\n <button onClick={() => setShowCreateModal(false)} className=\"btn btn-secondary\">\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreateInstance}\r\n disabled={!formData.name.trim() || !formData.providerId}\r\n className=\"btn btn-primary disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common:save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Delete Confirmation Modal */}\r\n <ConfirmModal\r\n isOpen={deleteConfirm.show}\r\n title={t('settings.profiles.actions.delete')}\r\n message={t('settings.profiles.confirmDelete')}\r\n variant=\"danger\"\r\n confirmLabel={t('common:delete')}\r\n onConfirm={confirmDeleteInstance}\r\n onCancel={() => setDeleteConfirm({ show: false, instanceId: null })}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n X,\r\n Play,\r\n Loader2,\r\n Clock,\r\n Coins,\r\n CheckCircle,\r\n XCircle,\r\n ChevronDown,\r\n ChevronUp,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport {\r\n aiApi,\r\n type AiSkillDetailDto,\r\n type AiSkillExecutionResponse,\r\n type ProviderListDto,\r\n type ModelListDto,\r\n} from '@/services/api/aiApi';\r\n\r\ninterface PromptTestPanelProps {\r\n readonly prompt: AiSkillDetailDto;\r\n readonly onClose: () => void;\r\n}\r\n\r\nexport function PromptTestPanel({ prompt, onClose }: PromptTestPanelProps): ReactElement {\r\n const { t } = useTranslation(['ai']);\r\n const [variables, setVariables] = useState<Record<string, string>>({});\r\n const [providers, setProviders] = useState<ProviderListDto[]>([]);\r\n const [models, setModels] = useState<ModelListDto[]>([]);\r\n const [selectedProviderId, setSelectedProviderId] = useState<string>('');\r\n const [selectedModelId, setSelectedModelId] = useState<string>('');\r\n const [executing, setExecuting] = useState(false);\r\n const [result, setResult] = useState<AiSkillExecutionResponse | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showDebug, setShowDebug] = useState(false);\r\n const [copied, setCopied] = useState(false);\r\n\r\n // Initialize variables from prompt\r\n useEffect(() => {\r\n const initialVars: Record<string, string> = {};\r\n prompt.variables.forEach((v) => {\r\n initialVars[v] = '';\r\n });\r\n setVariables(initialVars);\r\n }, [prompt.variables]);\r\n\r\n // Load providers\r\n useEffect(() => {\r\n const loadProviders = async () => {\r\n try {\r\n const providersData = await aiApi.settings.getProviders();\r\n // Filter out system providers for manual testing\r\n const activeProviders = (providersData ?? []).filter((p) => p.isActive);\r\n setProviders(activeProviders);\r\n } catch (err) {\r\n console.error('Failed to load providers:', err);\r\n }\r\n };\r\n loadProviders();\r\n }, []);\r\n\r\n // Load models when provider changes\r\n useEffect(() => {\r\n const loadModels = async () => {\r\n if (!selectedProviderId) {\r\n setModels([]);\r\n return;\r\n }\r\n try {\r\n const modelsData = await aiApi.settings.getModels(undefined, selectedProviderId);\r\n const activeModels = (modelsData ?? []).filter((m) => m.isActive && !m.isDeprecated);\r\n setModels(activeModels);\r\n // Auto-select first model\r\n if (activeModels.length > 0) {\r\n setSelectedModelId(activeModels[0].id);\r\n }\r\n } catch (err) {\r\n console.error('Failed to load models:', err);\r\n }\r\n };\r\n loadModels();\r\n }, [selectedProviderId]);\r\n\r\n const handleExecute = async () => {\r\n setExecuting(true);\r\n setError(null);\r\n setResult(null);\r\n\r\n try {\r\n const response = await aiApi.skills.execute(prompt.id, {\r\n variables: Object.keys(variables).length > 0 ? variables : undefined,\r\n providerId: selectedProviderId || undefined,\r\n modelId: selectedModelId || undefined,\r\n });\r\n\r\n if (response) {\r\n setResult(response);\r\n if (!response.success && response.error) {\r\n setError(response.error);\r\n }\r\n }\r\n } catch (err: unknown) {\r\n console.error('Failed to execute prompt:', err);\r\n const errorMessage = err instanceof Error ? err.message : 'Une erreur est survenue';\r\n setError(errorMessage);\r\n } finally {\r\n setExecuting(false);\r\n }\r\n };\r\n\r\n const handleCopyResponse = async () => {\r\n if (result?.response) {\r\n await navigator.clipboard.writeText(result.response);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n }\r\n };\r\n\r\n // Build preview from blocks with variable substitution\r\n const getPreview = () => {\r\n return prompt.blocks\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .filter((b) => b.isEnabled)\r\n .map((block) => {\r\n let content = block.content;\r\n Object.entries(variables).forEach(([key, value]) => {\r\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value || `{${key}}`);\r\n });\r\n return `# ${block.label}\\n${content}`;\r\n })\r\n .join('\\n\\n');\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-4xl p-6 max-h-[90vh] overflow-hidden flex flex-col\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div>\r\n <h3 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <Play className=\"w-5 h-5 text-[var(--color-primary-600)]\" />\r\n {t('skills.test.title')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{prompt.name}</p>\r\n </div>\r\n <button onClick={onClose} className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex-1 overflow-y-auto space-y-4\">\r\n {/* Variables Section */}\r\n {prompt.variables.length > 0 && (\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-3\">{t('skills.test.variables')}</h4>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n {prompt.variables.map((variable) => (\r\n <div key={variable}>\r\n <label className=\"block text-xs text-[var(--text-secondary)] mb-1 font-mono\">\r\n {`{${variable}}`}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={variables[variable] || ''}\r\n onChange={(e) => setVariables({ ...variables, [variable]: e.target.value })}\r\n className=\"input w-full text-sm\"\r\n placeholder={t('skills.test.enterValue')}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Provider & Model Selection */}\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-3\">{t('skills.test.configuration')}</h4>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('skills.test.provider')}\r\n </label>\r\n <select\r\n value={selectedProviderId}\r\n onChange={(e) => {\r\n setSelectedProviderId(e.target.value);\r\n setSelectedModelId('');\r\n }}\r\n className=\"input w-full text-sm\"\r\n >\r\n <option value=\"\">{t('skills.test.defaultProvider')}</option>\r\n {providers.map((provider) => (\r\n <option key={provider.id} value={provider.id}>\r\n {provider.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('skills.test.model')}\r\n </label>\r\n <select\r\n value={selectedModelId}\r\n onChange={(e) => setSelectedModelId(e.target.value)}\r\n className=\"input w-full text-sm\"\r\n disabled={!selectedProviderId}\r\n >\r\n <option value=\"\">{t('skills.test.defaultModel')}</option>\r\n {models.map((model) => (\r\n <option key={model.id} value={model.id}>\r\n {model.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Prompt Preview */}\r\n <div className=\"p-4 border border-[var(--border-color)] rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-2\">{t('skills.test.promptPreview')}</h4>\r\n <pre className=\"whitespace-pre-wrap font-mono text-xs bg-[var(--bg-secondary)] p-3 rounded max-h-40 overflow-y-auto\">\r\n {getPreview() || t('skills.test.noContent')}\r\n </pre>\r\n </div>\r\n\r\n {/* Execute Button */}\r\n <div className=\"flex justify-center\">\r\n <button\r\n onClick={handleExecute}\r\n disabled={executing}\r\n className=\"btn btn-primary flex items-center gap-2 px-8\"\r\n >\r\n {executing ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n {executing ? t('skills.test.executing') : t('skills.test.execute')}\r\n </button>\r\n </div>\r\n\r\n {/* Error Display */}\r\n {error && (\r\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-red-800 dark:text-red-200\">\r\n <XCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span className=\"font-medium\">{t('skills.test.error')}</span>\r\n </div>\r\n <p className=\"mt-2 text-sm text-red-700 dark:text-red-300\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Result Display */}\r\n {result?.success && (\r\n <div className=\"space-y-3\">\r\n {/* Success Header */}\r\n <div className=\"flex items-center justify-between p-3 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-green-800 dark:text-green-200\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{t('skills.test.success')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-4 text-sm text-green-700 dark:text-green-300\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"w-4 h-4\" />\r\n {result.latencyMs}ms\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Coins className=\"w-4 h-4\" />\r\n {result.totalTokens} tokens\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Response */}\r\n <div className=\"p-4 border border-[var(--border-color)] rounded-lg\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <h4 className=\"text-sm font-medium\">{t('skills.test.response')}</h4>\r\n <button\r\n onClick={handleCopyResponse}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n {copied ? <Check className=\"w-3 h-3\" /> : <Copy className=\"w-3 h-3\" />}\r\n {copied ? t('skills.test.copied') : t('skills.test.copy')}\r\n </button>\r\n </div>\r\n <pre className=\"whitespace-pre-wrap font-mono text-sm bg-[var(--bg-secondary)] p-3 rounded max-h-60 overflow-y-auto\">\r\n {result.response}\r\n </pre>\r\n </div>\r\n\r\n {/* Debug Info Toggle */}\r\n <button\r\n onClick={() => setShowDebug(!showDebug)}\r\n className=\"w-full flex items-center justify-center gap-2 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] py-2\"\r\n >\r\n {showDebug ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\r\n {t('skills.test.debugInfo')}\r\n </button>\r\n\r\n {/* Debug Details */}\r\n {showDebug && (\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"grid grid-cols-2 gap-3 text-sm\">\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.inputTokens')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.inputTokens}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.outputTokens')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.outputTokens}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.totalTokens')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.totalTokens}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.latency')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.latencyMs}ms</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.modelUsed')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.modelName}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.promptId')}:</span>\r\n <span className=\"ml-2 font-mono text-xs\">{result.skillId}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"flex justify-end gap-2 pt-4 mt-4 border-t border-[var(--border-color)]\">\r\n <button onClick={onClose} className=\"btn btn-secondary\">\r\n {t('common.close')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n FileText,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n Search,\r\n Eye,\r\n Edit2,\r\n Trash2,\r\n Copy,\r\n CheckCircle,\r\n XCircle,\r\n Blocks,\r\n Tag,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ViewToggle, type ViewMode, StatusBadge, Pagination } from '@/components/ui/DataView';\r\nimport { aiApi, type AiSkillListDto } from '@/services/api/aiApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\nconst statusColors: Record<string, 'active' | 'inactive' | 'warning'> = {\r\n Draft: 'inactive',\r\n Active: 'active',\r\n Deprecated: 'warning',\r\n};\r\n\r\nexport function AiPromptsListPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n\r\n const [prompts, setPrompts] = useState<AiSkillListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [search, setSearch] = useState('');\r\n const [filterCategory, setFilterCategory] = useState('');\r\n const [filterStatus, setFilterStatus] = useState('');\r\n\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadPrompts = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const params: Record<string, string> = {};\r\n if (search) params.search = search;\r\n if (filterCategory) params.category = filterCategory;\r\n if (filterStatus) params.status = filterStatus;\r\n\r\n const result = await aiApi.skills.getAll(params);\r\n setPrompts(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load prompts:', err);\r\n setError(t('skills.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [search, filterCategory, filterStatus, t, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadPrompts();\r\n }, [loadPrompts]);\r\n\r\n const handleDelete = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!confirm(t('skills.confirmDelete'))) return;\r\n try {\r\n await aiApi.skills.delete(prompt.id);\r\n await loadPrompts();\r\n } catch (err) {\r\n console.error('Failed to delete prompt:', err);\r\n }\r\n };\r\n\r\n const handleClone = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n const cloned = await aiApi.skills.clone(prompt.id);\r\n await loadPrompts();\r\n if (cloned) {\r\n navigate(`/administration/ai/skills/${cloned.id}/edit`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to clone prompt:', err);\r\n }\r\n };\r\n\r\n const handleActivate = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n await aiApi.skills.activate(prompt.id);\r\n await loadPrompts();\r\n } catch (err) {\r\n console.error('Failed to activate prompt:', err);\r\n }\r\n };\r\n\r\n const handleDeprecate = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n await aiApi.skills.deprecate(prompt.id);\r\n await loadPrompts();\r\n } catch (err) {\r\n console.error('Failed to deprecate prompt:', err);\r\n }\r\n };\r\n\r\n const categories = Array.from(new Set(prompts.map((p) => p.tags).filter((tag): tag is string => Boolean(tag))));\r\n\r\n const filteredPrompts = prompts;\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedPrompts = filteredPrompts.slice(startIndex, startIndex + pageSize);\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.category')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.version')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.blocks')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.status')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-primary-600)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedPrompts.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center text-[var(--text-secondary)]\">\r\n {t('skills.list.noSkills')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedPrompts.length > 0 && (\r\n paginatedPrompts.map((prompt) => (\r\n <tr\r\n key={prompt.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}`)}\r\n >\r\n <td className=\"px-4 py-3\" onClick={(e) => e.stopPropagation()}>\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{prompt.name}</p>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Tag className=\"w-3 h-3\" />\r\n {prompt.tags || '-'}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">v{prompt.version}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n <Blocks className=\"w-3.5 h-3.5\" />\r\n {prompt.blockCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={statusColors[prompt.status] || 'inactive'}\r\n label={t(`skills.status.${prompt.status}`)}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('skills.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}/edit`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('skills.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleClone(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('skills.actions.clone')}\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {prompt.status === 'Draft' && (\r\n <button\r\n onClick={(e) => handleActivate(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--success-text)] hover:bg-[var(--success-bg)] transition-all\"\r\n title={t('skills.actions.activate')}\r\n >\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n {prompt.status === 'Active' && (\r\n <button\r\n onClick={(e) => handleDeprecate(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--warning-text)] hover:bg-[var(--warning-bg)] transition-all\"\r\n title={t('skills.actions.deprecate')}\r\n >\r\n <XCircle className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={(e) => handleDelete(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('skills.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && paginatedPrompts.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--color-accent-50)] flex items-center justify-center mb-3\">\r\n <FileText className=\"w-8 h-8 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.list.noSkills')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedPrompts.length > 0 && (\r\n paginatedPrompts.map((prompt) => (\r\n <button\r\n key={prompt.id}\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n >\r\n {/* Header with colored background */}\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-[var(--color-accent-500)] flex items-center justify-center shadow-lg\">\r\n <FileText className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div>\r\n <h4 className=\"font-semibold text-[var(--text-primary)] truncate\">{prompt.name}</h4>\r\n </div>\r\n </div>\r\n <StatusBadge\r\n status={statusColors[prompt.status] || 'inactive'}\r\n label={t(`skills.status.${prompt.status}`)}\r\n size=\"sm\"\r\n />\r\n </div>\r\n </div>\r\n {/* Body */}\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {/* Tags */}\r\n <div className=\"flex flex-wrap gap-2\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Tag className=\"w-3 h-3\" />\r\n {prompt.tags || '-'}\r\n </span>\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Blocks className=\"w-3 h-3\" />\r\n {prompt.blockCount} blocs\r\n </span>\r\n <span className=\"px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n v{prompt.version}\r\n </span>\r\n </div>\r\n\r\n {/* Spacer */}\r\n <div className=\"flex-1 min-h-4\" />\r\n\r\n {/* Actions */}\r\n <div\r\n className=\"flex items-center justify-end gap-1 mt-3 pt-3 border-t border-[var(--border-color)]\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}/edit`)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] transition-all\"\r\n title={t('skills.actions.edit')}\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleClone(prompt, e)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] transition-all\"\r\n title={t('skills.actions.clone')}\r\n >\r\n <Copy className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(prompt, e)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('skills.actions.delete')}\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title') }\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <FileText className=\"w-6 h-6\" />\r\n {t('skills.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">\r\n {prompts.length} {t('skills.list.skillsCount')}\r\n </p>\r\n </div>\r\n <button onClick={() => navigate('/administration/ai/skills/create')} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('skills.createSkill')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n <div className=\"flex flex-wrap items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder={t('skills.search')}\r\n className=\"input pl-10 w-full\"\r\n />\r\n </div>\r\n <select value={filterCategory} onChange={(e) => setFilterCategory(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('skills.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {cat}\r\n </option>\r\n ))}\r\n </select>\r\n <select value={filterStatus} onChange={(e) => setFilterStatus(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('skills.allStatuses')}</option>\r\n <option value=\"Draft\">{t('skills.status.Draft')}</option>\r\n <option value=\"Active\">{t('skills.status.Active')}</option>\r\n <option value=\"Deprecated\">{t('skills.status.Deprecated')}</option>\r\n </select>\r\n </div>\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n showKanban={false}\r\n tableLabel={t('skills.list.tableView')}\r\n cardsLabel={t('skills.list.cardsView')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n\r\n {!loading && filteredPrompts.length > pageSize && (\r\n <Pagination\r\n page={page}\r\n totalPages={Math.ceil(filteredPrompts.length / pageSize)}\r\n totalCount={filteredPrompts.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel=\"skills\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n FileText,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Edit2,\r\n Trash2,\r\n Copy,\r\n CheckCircle,\r\n XCircle,\r\n Play,\r\n Eye,\r\n Blocks,\r\n Tag,\r\n Calendar,\r\n User,\r\n GripVertical,\r\n ChevronDown,\r\n ChevronRight,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { StatusBadge } from '@/components/ui/DataView';\r\nimport { aiApi, type AiSkillDetailDto, type AiSkillBlockDto } from '@/services/api/aiApi';\r\nimport { PromptTestPanel } from '@/components/platform/administration/ai/PromptTestPanel';\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400 border-purple-200 dark:border-purple-800',\r\n Context: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400 border-blue-200 dark:border-blue-800',\r\n Task: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400 border-green-200 dark:border-green-800',\r\n Output: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400 border-orange-200 dark:border-orange-800',\r\n Examples: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-400 border-cyan-200 dark:border-cyan-800',\r\n Validation: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400 border-red-200 dark:border-red-800',\r\n};\r\n\r\nconst statusMap: Record<string, 'active' | 'inactive' | 'warning'> = {\r\n Draft: 'inactive',\r\n Active: 'active',\r\n Deprecated: 'warning',\r\n};\r\n\r\nexport function AiSkillsDetailPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: skillId } = useParams<{ id: string }>();\r\n\r\n const [skill, setSkill] = useState<AiSkillDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showTestPanel, setShowTestPanel] = useState(false);\r\n const [showPreview, setShowPreview] = useState(false);\r\n const [previewVariables, setPreviewVariables] = useState<Record<string, string>>({});\r\n\r\n const loadSkill = useCallback(async () => {\r\n if (!skillId) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.skills.getById(skillId);\r\n setSkill(result ?? null);\r\n if (result?.variables) {\r\n const vars: Record<string, string> = {};\r\n result.variables.forEach((v) => {\r\n vars[v] = '';\r\n });\r\n setPreviewVariables(vars);\r\n }\r\n } catch (err) {\r\n console.error('Failed to load skill:', err);\r\n setError(t('skills.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [skillId, t]);\r\n\r\n useEffect(() => {\r\n loadSkill();\r\n }, [loadSkill]);\r\n\r\n const handleDelete = async () => {\r\n if (!skill || !confirm(t('skills.confirmDelete', { name: skill.name }))) return;\r\n try {\r\n await aiApi.skills.delete(skill.id);\r\n navigate('/administration/ai/skills');\r\n } catch (err) {\r\n console.error('Failed to delete skill:', err);\r\n }\r\n };\r\n\r\n const handleClone = async () => {\r\n if (!skill) return;\r\n try {\r\n const cloned = await aiApi.skills.clone(skill.id);\r\n if (cloned) {\r\n navigate(`/administration/ai/skills/${cloned.id}/edit`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to clone skill:', err);\r\n }\r\n };\r\n\r\n const handleActivate = async () => {\r\n if (!skill) return;\r\n try {\r\n await aiApi.skills.activate(skill.id);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to activate skill:', err);\r\n }\r\n };\r\n\r\n const handleDeprecate = async () => {\r\n if (!skill) return;\r\n try {\r\n await aiApi.skills.deprecate(skill.id);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to deprecate skill:', err);\r\n }\r\n };\r\n\r\n const getPreviewContent = () => {\r\n if (!skill) return '';\r\n return skill.blocks\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .filter((b) => b.isEnabled)\r\n .map((block) => {\r\n let content = block.content;\r\n Object.entries(previewVariables).forEach(([key, value]) => {\r\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value || `{${key}}`);\r\n });\r\n return `## ${block.label}\\n${content}`;\r\n })\r\n .join('\\n\\n');\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !skill) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('skills.backToList')}\r\n </button>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">\r\n {error || t('skills.detail.notFound')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: skill?.name || 'Detail' }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('skills.backToList')}\r\n </button>\r\n <div className=\"flex items-center gap-2\">\r\n <button onClick={() => setShowTestPanel(true)} className=\"btn btn-primary flex items-center gap-2\">\r\n <Play className=\"w-4 h-4\" />\r\n {t('skills.test.title')}\r\n </button>\r\n <button onClick={() => setShowPreview(!showPreview)} className=\"btn btn-secondary flex items-center gap-2\">\r\n <Eye className=\"w-4 h-4\" />\r\n {t('skills.actions.preview')}\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${skill.id}/edit`)}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('skills.actions.edit')}\r\n </button>\r\n <button onClick={handleClone} className=\"btn btn-secondary flex items-center gap-2\">\r\n <Copy className=\"w-4 h-4\" />\r\n {t('skills.actions.clone')}\r\n </button>\r\n {skill.status === 'Draft' && (\r\n <button onClick={handleActivate} className=\"btn btn-primary flex items-center gap-2\">\r\n <CheckCircle className=\"w-4 h-4\" />\r\n {t('skills.actions.activate')}\r\n </button>\r\n )}\r\n {skill.status === 'Active' && (\r\n <button onClick={handleDeprecate} className=\"btn btn-secondary flex items-center gap-2\">\r\n <XCircle className=\"w-4 h-4\" />\r\n {t('skills.actions.deprecate')}\r\n </button>\r\n )}\r\n <button onClick={handleDelete} className=\"btn btn-danger flex items-center gap-2\">\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n <div className=\"lg:col-span-2 space-y-6\">\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-start gap-4 mb-6\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center shadow-lg\">\r\n <FileText className=\"w-7 h-7 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3 mb-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{skill.name}</h1>\r\n <StatusBadge status={statusMap[skill.status]} label={t(`skills.status.${skill.status}`)} />\r\n </div>\r\n {skill.description && (\r\n <p className=\"text-[var(--text-secondary)] mt-2\">{skill.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Tag className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.list.columns.category')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{skill.tags || '-'}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Blocks className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.list.columns.blocks')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{skill.blocks.length}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Calendar className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.detail.version')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">v{skill.version}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <User className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.detail.createdBy')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{skill.createdBy || 'System'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {skill.variables.length > 0 && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('skills.detail.variables')}</h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {skill.variables.map((variable) => (\r\n <span\r\n key={variable}\r\n className=\"px-3 py-1.5 bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-lg font-mono text-sm\"\r\n >\r\n {`{${variable}}`}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Blocks className=\"w-5 h-5\" />\r\n {t('skills.blocks.title')} ({skill.blocks.length})\r\n </h3>\r\n </div>\r\n\r\n {skill.blocks.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {skill.blocks\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block, index) => (\r\n <BlockDisplay key={block.id} block={block} index={index} t={t} />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)] border border-dashed border-[var(--border-color)] rounded-lg\">\r\n {t('skills.blocks.noBlocks')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n {showPreview && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('skills.editor.preview')}</h3>\r\n\r\n {skill.variables.length > 0 && (\r\n <div className=\"mb-4 space-y-2\">\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('skills.test.variables')}</p>\r\n <div className=\"grid grid-cols-1 gap-2\">\r\n {skill.variables.map((variable) => (\r\n <div key={variable}>\r\n <label className=\"block text-xs text-[var(--text-tertiary)] mb-1\">{`{${variable}}`}</label>\r\n <input\r\n type=\"text\"\r\n value={previewVariables[variable] || ''}\r\n onChange={(e) => setPreviewVariables({ ...previewVariables, [variable]: e.target.value })}\r\n className=\"input w-full text-sm\"\r\n placeholder={t('skills.test.enterValue')}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"border border-[var(--border-color)] rounded-lg p-4 bg-[var(--bg-secondary)] max-h-[400px] overflow-y-auto\">\r\n <pre className=\"whitespace-pre-wrap font-mono text-sm text-[var(--text-primary)]\">\r\n {getPreviewContent() || t('skills.blocks.noBlocks')}\r\n </pre>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('skills.detail.info')}</h3>\r\n <dl className=\"space-y-3 text-sm\">\r\n <div className=\"flex justify-between\">\r\n <dt className=\"text-[var(--text-secondary)]\">{t('skills.detail.createdAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {skill.createdAt ? new Date(skill.createdAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <dt className=\"text-[var(--text-secondary)]\">{t('skills.detail.updatedAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {skill.updatedAt ? new Date(skill.updatedAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n </dl>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showTestPanel && skill && (\r\n <PromptTestPanel prompt={skill} onClose={() => setShowTestPanel(false)} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction BlockDisplay({\r\n block,\r\n index,\r\n t,\r\n}: {\r\n block: AiSkillBlockDto;\r\n index: number;\r\n t: ReturnType<typeof useTranslation>['t'];\r\n}) {\r\n const [expanded, setExpanded] = useState(index === 0);\r\n\r\n return (\r\n <div className={`border rounded-lg overflow-hidden ${blockTypeColors[block.blockType] || 'border-[var(--border-color)]'}`}>\r\n <button\r\n type=\"button\"\r\n className=\"w-full flex items-center gap-3 p-3 cursor-pointer bg-white/50 dark:bg-black/20 hover:bg-white/70 dark:hover:bg-black/30 transition-colors text-left\"\r\n onClick={() => setExpanded(!expanded)}\r\n >\r\n <GripVertical className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"w-6 h-6 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-xs font-medium\">\r\n {index + 1}\r\n </span>\r\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${blockTypeColors[block.blockType]}`}>\r\n {t(`skills.blocks.types.${block.blockType}`)}\r\n </span>\r\n <span className=\"font-medium flex-1 truncate\">{block.label}</span>\r\n {block.blockDefinitionCode && (\r\n <span className=\"text-xs text-[var(--text-secondary)] bg-[var(--bg-secondary)] px-2 py-0.5 rounded\">\r\n {block.blockDefinitionCode}\r\n </span>\r\n )}\r\n {!block.isEnabled && (\r\n <span className=\"text-xs text-orange-600 bg-orange-100 dark:bg-orange-900/30 px-2 py-0.5 rounded\">\r\n {t('skills.blocks.inactive')}\r\n </span>\r\n )}\r\n {expanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n </button>\r\n {expanded && (\r\n <div className=\"p-4 border-t border-[var(--border-color)] bg-white dark:bg-[var(--bg-primary)]\">\r\n <pre className=\"whitespace-pre-wrap text-sm font-mono text-[var(--text-primary)]\">{block.content}</pre>\r\n {(block.variables?.length ?? 0) > 0 && (\r\n <div className=\"mt-3 pt-3 border-t border-[var(--border-color)]\">\r\n <span className=\"text-xs text-[var(--text-secondary)]\">{t('skills.detail.variables')}: </span>\r\n {block.variables.map((v) => (\r\n <span key={v} className=\"ml-1 text-xs font-mono bg-[var(--bg-secondary)] px-1.5 py-0.5 rounded\">\r\n {`{${v}}`}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n FileText,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Save,\r\n Plus,\r\n Trash2,\r\n ChevronUp,\r\n ChevronDown,\r\n X,\r\n Eye,\r\n Play,\r\n GripVertical,\r\n Blocks,\r\n Settings,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n aiApi,\r\n type AiSkillDetailDto,\r\n type AiSkillBlockDto,\r\n type AiSkillBlockDefinitionListDto,\r\n type CreateAiSkillRequest,\r\n type UpdateAiSkillRequest,\r\n type CreateAiSkillBlockRequest,\r\n type UpdateAiSkillBlockRequest,\r\n} from '@/services/api/aiApi';\r\nimport { PromptTestPanel } from '@/components/platform/administration/ai/PromptTestPanel';\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'border-l-purple-500 bg-purple-50/50 dark:bg-purple-900/10',\r\n Context: 'border-l-blue-500 bg-blue-50/50 dark:bg-blue-900/10',\r\n Task: 'border-l-green-500 bg-green-50/50 dark:bg-green-900/10',\r\n Output: 'border-l-orange-500 bg-orange-50/50 dark:bg-orange-900/10',\r\n Examples: 'border-l-cyan-500 bg-cyan-50/50 dark:bg-cyan-900/10',\r\n Validation: 'border-l-red-500 bg-red-50/50 dark:bg-red-900/10',\r\n};\r\n\r\nconst blockTypeBadge: Record<string, string> = {\r\n System: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400',\r\n Context: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400',\r\n Task: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400',\r\n Output: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400',\r\n Examples: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-400',\r\n Validation: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400',\r\n};\r\n\r\nconst BLOCK_TYPES = ['System', 'Context', 'Task', 'Output', 'Examples', 'Validation'];\r\n\r\nexport function AiSkillsEditPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: skillId } = useParams<{ id: string }>();\r\n const isCreate = !skillId || skillId === 'create';\r\n\r\n const [loading, setLoading] = useState(!isCreate);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [category, setCategory] = useState('');\r\n const [skill, setSkill] = useState<AiSkillDetailDto | null>(null);\r\n\r\n const [blocks, setBlocks] = useState<AiSkillBlockDto[]>([]);\r\n const [definitions, setDefinitions] = useState<AiSkillBlockDefinitionListDto[]>([]);\r\n\r\n const [showAddBlockModal, setShowAddBlockModal] = useState(false);\r\n const [editingBlockId, setEditingBlockId] = useState<string | null>(null);\r\n const [showTestPanel, setShowTestPanel] = useState(false);\r\n\r\n const [previewVariables, setPreviewVariables] = useState<Record<string, string>>({});\r\n const [showSettings, setShowSettings] = useState(false);\r\n\r\n const loadSkill = useCallback(async () => {\r\n if (isCreate) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.skills.getById(skillId!);\r\n if (result) {\r\n setSkill(result);\r\n setName(result.name);\r\n setDescription(result.description || '');\r\n setCategory(result.tags || '');\r\n setBlocks(result.blocks.sort((a, b) => a.displayOrder - b.displayOrder));\r\n }\r\n } catch (err) {\r\n console.error('Failed to load skill:', err);\r\n setError(t('skills.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [skillId, isCreate, t]);\r\n\r\n const loadDefinitions = async () => {\r\n try {\r\n const defs = await aiApi.blockDefinitions.getAll();\r\n setDefinitions(defs ?? []);\r\n } catch (err) {\r\n console.error('Failed to load definitions:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadSkill();\r\n loadDefinitions();\r\n }, [loadSkill]);\r\n\r\n const extractVariables = (content: string): string[] => {\r\n const matches = content.match(/\\{([^}]+)\\}/g);\r\n if (!matches) return [];\r\n return Array.from(new Set(matches.map((m) => m.slice(1, -1))));\r\n };\r\n\r\n const allVariables = blocks.flatMap((b) => extractVariables(b.content));\r\n const uniqueVariables = Array.from(new Set(allVariables));\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n if (isCreate) {\r\n const data: CreateAiSkillRequest = {\r\n name,\r\n description: description || undefined,\r\n code: name.toLowerCase().replace(/\\s+/g, '-'),\r\n tags: category || undefined,\r\n };\r\n const created = await aiApi.skills.create(data);\r\n if (created) {\r\n for (const block of blocks) {\r\n await aiApi.skills.addBlock(created.id, {\r\n blockType: block.blockType,\r\n label: block.label ?? '',\r\n content: block.content,\r\n displayOrder: block.displayOrder,\r\n });\r\n }\r\n navigate(`/administration/ai/skills/${created.id}`);\r\n }\r\n } else {\r\n const data: UpdateAiSkillRequest = {\r\n name,\r\n description: description || undefined,\r\n tags: category || undefined,\r\n };\r\n await aiApi.skills.update(skillId!, data);\r\n navigate(`/administration/ai/skills/${skillId}`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to save skill:', err);\r\n setError(t('skills.messages.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleAddBlock = async (blockData: CreateAiSkillBlockRequest) => {\r\n if (isCreate) {\r\n const newBlock: AiSkillBlockDto = {\r\n id: `temp-${Date.now()}`,\r\n blockDefinitionId: blockData.blockDefinitionId || null,\r\n blockDefinitionCode: null,\r\n blockType: blockData.blockType,\r\n label: blockData.label,\r\n content: blockData.content,\r\n displayOrder: blocks.length + 1,\r\n isRequired: blockData.isRequired ?? false,\r\n isEnabled: true,\r\n condition: blockData.condition ?? null,\r\n variables: extractVariables(blockData.content),\r\n };\r\n setBlocks([...blocks, newBlock]);\r\n } else {\r\n try {\r\n await aiApi.skills.addBlock(skillId!, blockData);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to add block:', err);\r\n }\r\n }\r\n setShowAddBlockModal(false);\r\n };\r\n\r\n const handleUpdateBlock = async (blockId: string, data: UpdateAiSkillBlockRequest) => {\r\n if (isCreate || blockId.startsWith('temp-')) {\r\n setBlocks(\r\n blocks.map((b) =>\r\n b.id === blockId\r\n ? { ...b, ...data, variables: extractVariables(data.content || b.content) }\r\n : b\r\n )\r\n );\r\n } else {\r\n try {\r\n await aiApi.skills.updateBlock(skillId!, blockId, data);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to update block:', err);\r\n }\r\n }\r\n setEditingBlockId(null);\r\n };\r\n\r\n const handleDeleteBlock = async (blockId: string) => {\r\n if (!confirm(t('skills.confirmDeleteBlock'))) return;\r\n if (isCreate || blockId.startsWith('temp-')) {\r\n setBlocks(blocks.filter((b) => b.id !== blockId));\r\n } else {\r\n try {\r\n await aiApi.skills.deleteBlock(skillId!, blockId);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to delete block:', err);\r\n }\r\n }\r\n };\r\n\r\n const handleMoveBlock = async (blockId: string, direction: 'up' | 'down') => {\r\n const index = blocks.findIndex((b) => b.id === blockId);\r\n if (index === -1) return;\r\n if (direction === 'up' && index === 0) return;\r\n if (direction === 'down' && index === blocks.length - 1) return;\r\n\r\n const newBlocks = [...blocks];\r\n const swapIndex = direction === 'up' ? index - 1 : index + 1;\r\n [newBlocks[index], newBlocks[swapIndex]] = [newBlocks[swapIndex], newBlocks[index]];\r\n\r\n const reordered = newBlocks.map((b, i) => ({ ...b, displayOrder: i + 1 }));\r\n setBlocks(reordered);\r\n\r\n if (!isCreate && !blockId.startsWith('temp-')) {\r\n try {\r\n await aiApi.skills.reorderBlocks(skillId!, { blockIds: reordered.map((b) => b.id) });\r\n } catch (err) {\r\n console.error('Failed to reorder blocks:', err);\r\n }\r\n }\r\n };\r\n\r\n const getPreviewContent = () => {\r\n return blocks\r\n .filter((b) => b.isEnabled)\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block) => {\r\n let content = block.content;\r\n Object.entries(previewVariables).forEach(([key, value]) => {\r\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value || `{${key}}`);\r\n });\r\n return `## ${block.label}\\n${content}`;\r\n })\r\n .join('\\n\\n');\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: isCreate ? t('common:create') : (skill?.name || 'Edit') }\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate(isCreate ? '/administration/ai/skills' : `/administration/ai/skills/${skillId}`)}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('common.back')}\r\n </button>\r\n <div className=\"flex items-center gap-2\">\r\n {!isCreate && skill && (\r\n <button onClick={() => setShowTestPanel(true)} className=\"btn btn-secondary flex items-center gap-2\">\r\n <Play className=\"w-4 h-4\" />\r\n {t('skills.test.title')}\r\n </button>\r\n )}\r\n <button onClick={handleSave} disabled={saving || !name || !category} className=\"btn btn-primary flex items-center gap-2\">\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 mb-2\">\r\n <div className=\"w-12 h-12 rounded-xl bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center shadow-lg\">\r\n <FileText className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {isCreate ? t('skills.createSkill') : t('skills.builder.editTitle')}\r\n </h1>\r\n </div>\r\n <button\r\n onClick={() => setShowSettings(!showSettings)}\r\n className={`btn btn-secondary flex items-center gap-2 ${showSettings ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('skills.builder.settings')}\r\n </button>\r\n </div>\r\n\r\n {showSettings && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold mb-4\">{t('skills.builder.skillInfo')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.list.columns.name')} *</label>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.list.columns.category')} *</label>\r\n <input\r\n type=\"text\"\r\n value={category}\r\n onChange={(e) => setCategory(e.target.value)}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n <div className=\"md:col-span-2\">\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.detail.description')}</label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n className=\"input w-full\"\r\n rows={2}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-5 gap-6\">\r\n <div className=\"lg:col-span-3 space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Blocks className=\"w-5 h-5\" />\r\n {t('skills.blocks.title')} ({blocks.length})\r\n </h3>\r\n <button onClick={() => setShowAddBlockModal(true)} className=\"btn btn-primary btn-sm flex items-center gap-1\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('skills.blocks.addBlock')}\r\n </button>\r\n </div>\r\n\r\n {blocks.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {blocks.map((block, index) => (\r\n <BlockEditor\r\n key={block.id}\r\n block={block}\r\n index={index}\r\n isFirst={index === 0}\r\n isLast={index === blocks.length - 1}\r\n isEditing={editingBlockId === block.id}\r\n onEdit={() => setEditingBlockId(block.id)}\r\n onCancelEdit={() => setEditingBlockId(null)}\r\n onSave={(data) => handleUpdateBlock(block.id, data)}\r\n onDelete={() => handleDeleteBlock(block.id)}\r\n onMoveUp={() => handleMoveBlock(block.id, 'up')}\r\n onMoveDown={() => handleMoveBlock(block.id, 'down')}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Blocks className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('skills.blocks.noBlocks')}</p>\r\n <button onClick={() => setShowAddBlockModal(true)} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('skills.blocks.addFirstBlock')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"lg:col-span-2\">\r\n <div className=\"card p-6 sticky top-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Eye className=\"w-5 h-5\" />\r\n {t('skills.editor.preview')}\r\n </h3>\r\n </div>\r\n\r\n {uniqueVariables.length > 0 && (\r\n <div className=\"mb-4 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <p className=\"text-sm font-medium mb-2\">{t('skills.test.variables')}</p>\r\n <div className=\"grid grid-cols-1 gap-2\">\r\n {uniqueVariables.map((variable) => (\r\n <div key={variable}>\r\n <label className=\"block text-xs text-[var(--text-tertiary)] mb-1\">{`{${variable}}`}</label>\r\n <input\r\n type=\"text\"\r\n value={previewVariables[variable] || ''}\r\n onChange={(e) => setPreviewVariables({ ...previewVariables, [variable]: e.target.value })}\r\n className=\"input w-full text-sm\"\r\n placeholder={t('skills.test.enterValue')}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"border border-[var(--border-color)] rounded-lg p-4 bg-[var(--bg-secondary)] max-h-[500px] overflow-y-auto\">\r\n <pre className=\"whitespace-pre-wrap font-mono text-sm text-[var(--text-primary)]\">\r\n {getPreviewContent() || t('skills.blocks.noBlocks')}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showAddBlockModal && (\r\n <AddBlockModal\r\n definitions={definitions}\r\n existingBlocksCount={blocks.length}\r\n onClose={() => setShowAddBlockModal(false)}\r\n onAdd={handleAddBlock}\r\n t={t}\r\n />\r\n )}\r\n\r\n {showTestPanel && skill && (\r\n <PromptTestPanel prompt={skill} onClose={() => setShowTestPanel(false)} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction BlockEditor({\r\n block,\r\n index,\r\n isFirst,\r\n isLast,\r\n isEditing,\r\n onEdit,\r\n onCancelEdit,\r\n onSave,\r\n onDelete,\r\n onMoveUp,\r\n onMoveDown,\r\n t,\r\n}: {\r\n block: AiSkillBlockDto;\r\n index: number;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n isEditing: boolean;\r\n onEdit: () => void;\r\n onCancelEdit: () => void;\r\n onSave: (data: UpdateAiSkillBlockRequest) => void;\r\n onDelete: () => void;\r\n onMoveUp: () => void;\r\n onMoveDown: () => void;\r\n t: ReturnType<typeof useTranslation>['t'];\r\n}) {\r\n const [label, setLabel] = useState(block.label ?? '');\r\n const [content, setContent] = useState(block.content);\r\n const [blockType, setBlockType] = useState(block.blockType);\r\n const [isEnabled, setIsEnabled] = useState(block.isEnabled);\r\n\r\n useEffect(() => {\r\n setLabel(block.label || '');\r\n setContent(block.content);\r\n setBlockType(block.blockType);\r\n setIsEnabled(block.isEnabled);\r\n }, [block]);\r\n\r\n const handleSave = () => {\r\n onSave({ label: label || undefined, content, isEnabled });\r\n };\r\n\r\n if (isEditing) {\r\n return (\r\n <div className={`card border-l-4 ${blockTypeColors[blockType]} p-4`}>\r\n <div className=\"space-y-3\">\r\n <div className=\"flex gap-3\">\r\n <div className=\"flex-1\">\r\n <label className=\"block text-xs font-medium mb-1\">{t('skills.editor.title')}</label>\r\n <input\r\n type=\"text\"\r\n value={label}\r\n onChange={(e) => setLabel(e.target.value)}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n <div className=\"w-40\">\r\n <label className=\"block text-xs font-medium mb-1\">{t('skills.blocks.type')}</label>\r\n <select value={blockType} onChange={(e) => setBlockType(e.target.value)} className=\"input w-full\">\r\n {BLOCK_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`skills.blocks.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('skills.editor.content')}</label>\r\n <textarea\r\n value={content}\r\n onChange={(e) => setContent(e.target.value)}\r\n className=\"input w-full font-mono text-sm\"\r\n rows={6}\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">{t('skills.editor.variableFormat')}</p>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isEnabled}\r\n onChange={(e) => setIsEnabled(e.target.checked)}\r\n className=\"rounded\"\r\n />\r\n {t('skills.blocks.active')}\r\n </label>\r\n <div className=\"flex gap-2\">\r\n <button onClick={onCancelEdit} className=\"btn btn-secondary btn-sm\">\r\n {t('common.cancel')}\r\n </button>\r\n <button onClick={handleSave} className=\"btn btn-primary btn-sm\">\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={`card border-l-4 ${blockTypeColors[block.blockType]} p-4 cursor-pointer hover:shadow-md transition-shadow text-left w-full ${\r\n !block.isEnabled ? 'opacity-60' : ''\r\n }`}\r\n onClick={onEdit}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"flex flex-col items-center gap-1\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onMoveUp();\r\n }}\r\n disabled={isFirst}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronUp className=\"w-4 h-4\" />\r\n </button>\r\n <GripVertical className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onMoveDown();\r\n }}\r\n disabled={isLast}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <span className=\"w-6 h-6 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-xs font-medium\">\r\n {index + 1}\r\n </span>\r\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${blockTypeBadge[block.blockType]}`}>\r\n {t(`skills.blocks.types.${block.blockType}`)}\r\n </span>\r\n <span className=\"font-medium truncate\">{block.label}</span>\r\n {!block.isEnabled && (\r\n <span className=\"text-xs text-orange-600 bg-orange-100 dark:bg-orange-900/30 px-2 py-0.5 rounded\">\r\n {t('skills.blocks.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 font-mono\">{block.content}</p>\r\n {(block.variables?.length ?? 0) > 0 && (\r\n <div className=\"mt-2 flex flex-wrap gap-1\">\r\n {block.variables.map((v) => (\r\n <span key={v} className=\"text-xs font-mono bg-[var(--bg-secondary)] px-1.5 py-0.5 rounded\">\r\n {`{${v}}`}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete();\r\n }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </button>\r\n );\r\n}\r\n\r\nfunction AddBlockModal({\r\n definitions,\r\n existingBlocksCount,\r\n onClose,\r\n onAdd,\r\n t,\r\n}: {\r\n definitions: AiSkillBlockDefinitionListDto[];\r\n existingBlocksCount: number;\r\n onClose: () => void;\r\n onAdd: (data: CreateAiSkillBlockRequest) => void;\r\n t: ReturnType<typeof useTranslation>['t'];\r\n}) {\r\n const [mode, setMode] = useState<'custom' | 'definition'>('custom');\r\n const [selectedDefinitionId, setSelectedDefinitionId] = useState('');\r\n const [blockType, setBlockType] = useState('Task');\r\n const [label, setLabel] = useState('');\r\n const [content, setContent] = useState('');\r\n\r\n const handleDefinitionChange = async (defId: string) => {\r\n setSelectedDefinitionId(defId);\r\n if (defId) {\r\n try {\r\n const def = await aiApi.blockDefinitions.getById(defId);\r\n if (def) {\r\n setBlockType(def.blockType);\r\n setLabel(def.defaultTitle || '');\r\n setContent(def.defaultContent || '');\r\n }\r\n } catch (err) {\r\n console.error('Failed to load definition:', err);\r\n }\r\n }\r\n };\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n onAdd({\r\n blockDefinitionId: mode === 'definition' && selectedDefinitionId ? selectedDefinitionId : undefined,\r\n blockType,\r\n label,\r\n content,\r\n displayOrder: existingBlocksCount + 1,\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-lg p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('skills.blocks.addBlock')}</h3>\r\n <button onClick={onClose} className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex gap-2 mb-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setMode('custom')}\r\n className={`flex-1 py-2 px-4 rounded-lg border transition-colors ${\r\n mode === 'custom'\r\n ? 'border-[var(--color-primary-500)] bg-[var(--color-primary-50)] dark:bg-[var(--color-primary-900)]/20'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-secondary)]'\r\n }`}\r\n >\r\n {t('skills.blocks.custom')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setMode('definition')}\r\n className={`flex-1 py-2 px-4 rounded-lg border transition-colors ${\r\n mode === 'definition'\r\n ? 'border-[var(--color-primary-500)] bg-[var(--color-primary-50)] dark:bg-[var(--color-primary-900)]/20'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-secondary)]'\r\n }`}\r\n >\r\n {t('skills.blocks.fromDefinition')}\r\n </button>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {mode === 'definition' && (\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.definitions.title')}</label>\r\n <select\r\n value={selectedDefinitionId}\r\n onChange={(e) => handleDefinitionChange(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('skills.definitions.selectDefinition')}</option>\r\n {definitions.map((def) => (\r\n <option key={def.id} value={def.id}>\r\n {def.name} ({t(`skills.blocks.types.${def.blockType}`)})\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.blocks.type')}</label>\r\n <select value={blockType} onChange={(e) => setBlockType(e.target.value)} className=\"input w-full\">\r\n {BLOCK_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`skills.blocks.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.editor.title')}</label>\r\n <input\r\n type=\"text\"\r\n value={label}\r\n onChange={(e) => setLabel(e.target.value)}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.editor.content')}</label>\r\n <textarea\r\n value={content}\r\n onChange={(e) => setContent(e.target.value)}\r\n className=\"input w-full font-mono text-sm\"\r\n rows={6}\r\n required\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">{t('skills.editor.variableFormat')}</p>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button type=\"button\" onClick={onClose} className=\"btn btn-secondary\">\r\n {t('common.cancel')}\r\n </button>\r\n <button type=\"submit\" className=\"btn btn-primary\">\r\n {t('common.create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Blocks,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n Search,\r\n Eye,\r\n Edit2,\r\n Trash2,\r\n Shield,\r\n FileText,\r\n Target,\r\n MessageSquare,\r\n ListChecks,\r\n Sparkles,\r\n Globe,\r\n Lock,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ViewToggle, type ViewMode, StatusBadge, Pagination } from '@/components/ui/DataView';\r\nimport { aiApi, type AiSkillBlockDefinitionListDto } from '@/services/api/aiApi';\r\n\r\nconst blockTypeIcons: Record<string, React.ReactNode> = {\r\n System: <Shield className=\"w-4 h-4\" />,\r\n Context: <FileText className=\"w-4 h-4\" />,\r\n Task: <Target className=\"w-4 h-4\" />,\r\n Output: <MessageSquare className=\"w-4 h-4\" />,\r\n Examples: <ListChecks className=\"w-4 h-4\" />,\r\n Validation: <Sparkles className=\"w-4 h-4\" />,\r\n};\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'from-red-500 to-rose-500',\r\n Context: 'from-blue-500 to-cyan-500',\r\n Task: 'from-amber-500 to-orange-500',\r\n Output: 'from-green-500 to-emerald-500',\r\n Examples: 'from-purple-500 to-violet-500',\r\n Validation: 'from-pink-500 to-fuchsia-500',\r\n};\r\n\r\nexport function AiBlockDefinitionsListPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n\r\n const [definitions, setDefinitions] = useState<AiSkillBlockDefinitionListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [search, setSearch] = useState('');\r\n const [filterType, setFilterType] = useState('');\r\n\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadDefinitions = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const params: Record<string, string> = {};\r\n if (search) params.search = search;\r\n if (filterType) params.blockType = filterType;\r\n\r\n const result = await aiApi.blockDefinitions.getAll(params);\r\n setDefinitions(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load block definitions:', err);\r\n setError(t('definitions.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search, filterType, t]);\r\n\r\n useEffect(() => {\r\n loadDefinitions();\r\n }, [loadDefinitions]);\r\n\r\n const handleDelete = async (definition: AiSkillBlockDefinitionListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (definition.isSystem) {\r\n alert(t('definitions.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (definition.usageCount > 0) {\r\n alert(t('definitions.messages.cannotDeleteInUse', { count: definition.usageCount }));\r\n return;\r\n }\r\n if (!confirm(t('definitions.confirmDelete', { name: definition.name }))) return;\r\n try {\r\n await aiApi.blockDefinitions.delete(definition.id);\r\n await loadDefinitions();\r\n } catch (err) {\r\n console.error('Failed to delete definition:', err);\r\n }\r\n };\r\n\r\n const filteredDefinitions = definitions.filter((d) => {\r\n if (search && !d.name.toLowerCase().includes(search.toLowerCase())) return false;\r\n if (filterType && d.blockType !== filterType) return false;\r\n return true;\r\n });\r\n\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedDefinitions = filteredDefinitions.slice(startIndex, startIndex + pageSize);\r\n\r\n const blockTypes = ['System', 'Context', 'Task', 'Output', 'Examples', 'Validation'];\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.type')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.description')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.scope')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.usage')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={6} className=\"px-4 py-12 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-primary-600)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedDefinitions.length === 0 && (\r\n <tr>\r\n <td colSpan={6} className=\"px-4 py-12 text-center text-[var(--text-secondary)]\">\r\n {t('definitions.noDefinitions')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedDefinitions.length > 0 && (\r\n paginatedDefinitions.map((definition) => (\r\n <tr\r\n key={definition.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={`w-8 h-8 rounded-lg bg-gradient-to-br ${blockTypeColors[definition.blockType] || 'from-gray-500 to-slate-500'} flex items-center justify-center text-white`}\r\n >\r\n {blockTypeIcons[definition.blockType] || <Blocks className=\"w-4 h-4\" />}\r\n </div>\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{definition.name}</p>\r\n {definition.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.systemBadge')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {blockTypeIcons[definition.blockType]}\r\n {t(`definitions.blockTypes.${definition.blockType}`)}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <p className=\"text-sm text-[var(--text-secondary)] truncate max-w-xs\">\r\n {definition.description || '-'}\r\n </p>\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n {definition.isGlobal ? (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--success-text)]\">\r\n <Globe className=\"w-3.5 h-3.5\" />\r\n {t('definitions.scope.global')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3.5 h-3.5\" />\r\n {t('definitions.scope.restricted')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <StatusBadge\r\n status={definition.usageCount > 0 ? 'active' : 'inactive'}\r\n label={`${definition.usageCount}`}\r\n size=\"sm\"\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('definitions.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n {!definition.isSystem && (\r\n <>\r\n <button\r\n onClick={() =>\r\n navigate(`/administration/ai/skills/blocks/${definition.id}/edit`)\r\n }\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('definitions.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(definition, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('definitions.actions.delete')}\r\n disabled={definition.usageCount > 0}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && paginatedDefinitions.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Blocks className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('definitions.noDefinitions')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedDefinitions.length > 0 && (\r\n paginatedDefinitions.map((definition) => (\r\n <button\r\n key={definition.id}\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={`w-10 h-10 rounded-lg bg-gradient-to-br ${blockTypeColors[definition.blockType] || 'from-gray-500 to-slate-500'} flex items-center justify-center text-white shadow-lg`}\r\n >\r\n {blockTypeIcons[definition.blockType] || <Blocks className=\"w-5 h-5\" />}\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] truncate\">{definition.name}</h3>\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n {blockTypeIcons[definition.blockType]}\r\n {t(`definitions.blockTypes.${definition.blockType}`)}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {definition.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-400\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.systemBadge')}\r\n </span>\r\n )}\r\n {definition.isGlobal ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400\">\r\n <Globe className=\"w-3 h-3\" />\r\n {t('definitions.scope.global')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400\">\r\n <Lock className=\"w-3 h-3\" />\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {definition.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 mb-3\">{definition.description}</p>\r\n )}\r\n <div className=\"flex-1\" />\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-tertiary)] mb-3\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-[var(--bg-secondary)]\">\r\n {t('definitions.usedIn', { count: definition.usageCount })}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-1 pt-3 border-t border-[var(--border-color)]\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('definitions.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n {!definition.isSystem && (\r\n <>\r\n <button\r\n onClick={() =>\r\n navigate(`/administration/ai/skills/blocks/${definition.id}/edit`)\r\n }\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('definitions.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(definition, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('definitions.actions.delete')}\r\n disabled={definition.usageCount > 0}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: t('definitions.title') },\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Blocks className=\"w-6 h-6\" />\r\n {t('definitions.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">{t('definitions.subtitle')}</p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks/create')}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('definitions.createDefinition')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n <div className=\"flex flex-wrap items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder={t('definitions.search')}\r\n className=\"input pl-10 w-full\"\r\n />\r\n </div>\r\n <select value={filterType} onChange={(e) => setFilterType(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('definitions.allTypes')}</option>\r\n {blockTypes.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`definitions.blockTypes.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n showKanban={false}\r\n tableLabel={t('definitions.tableView')}\r\n cardsLabel={t('definitions.cardsView')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n\r\n {!loading && filteredDefinitions.length > pageSize && (\r\n <Pagination\r\n page={page}\r\n totalPages={Math.ceil(filteredDefinitions.length / pageSize)}\r\n totalCount={filteredDefinitions.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel={t('definitions.definitionsCount')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Blocks,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Edit2,\r\n Trash2,\r\n Shield,\r\n FileText,\r\n Target,\r\n MessageSquare,\r\n ListChecks,\r\n Sparkles,\r\n Globe,\r\n Lock,\r\n Calendar,\r\n Hash,\r\n Code,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { aiApi, type AiSkillBlockDefinitionDetailDto } from '@/services/api/aiApi';\r\n\r\nconst blockTypeIcons: Record<string, React.ReactNode> = {\r\n System: <Shield className=\"w-5 h-5\" />,\r\n Context: <FileText className=\"w-5 h-5\" />,\r\n Task: <Target className=\"w-5 h-5\" />,\r\n Output: <MessageSquare className=\"w-5 h-5\" />,\r\n Examples: <ListChecks className=\"w-5 h-5\" />,\r\n Validation: <Sparkles className=\"w-5 h-5\" />,\r\n};\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'from-red-500 to-rose-500',\r\n Context: 'from-blue-500 to-cyan-500',\r\n Task: 'from-amber-500 to-orange-500',\r\n Output: 'from-green-500 to-emerald-500',\r\n Examples: 'from-purple-500 to-violet-500',\r\n Validation: 'from-pink-500 to-fuchsia-500',\r\n};\r\n\r\nexport function AiBlockDefinitionDetailPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: definitionId } = useParams<{ id: string }>();\r\n\r\n const [definition, setDefinition] = useState<AiSkillBlockDefinitionDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const loadDefinition = async () => {\r\n if (!definitionId) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.blockDefinitions.getById(definitionId);\r\n setDefinition(result);\r\n } catch (err) {\r\n console.error('Failed to load block definition:', err);\r\n setError(t('definitions.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n loadDefinition();\r\n }, [definitionId, t]);\r\n\r\n const handleDelete = async () => {\r\n if (!definition) return;\r\n if (definition.isSystem) {\r\n alert(t('definitions.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (!confirm(t('definitions.confirmDelete', { name: definition.name }))) return;\r\n try {\r\n await aiApi.blockDefinitions.delete(definition.id);\r\n navigate('/administration/ai/skills/blocks');\r\n } catch (err) {\r\n console.error('Failed to delete definition:', err);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !definition) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-6 text-center\">\r\n <AlertTriangle className=\"w-12 h-12 text-red-600 dark:text-red-400 mx-auto mb-3\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium\">\r\n {error || t('definitions.detail.notFound')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: t('definitions.title'), href: '/administration/ai/skills/blocks' },\r\n { label: definition?.name || 'Detail' }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n {!definition.isSystem && (\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}/edit`)}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button onClick={handleDelete} className=\"btn btn-danger\">\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-start gap-6 mb-6\">\r\n <div\r\n className={`w-16 h-16 rounded-xl bg-gradient-to-br ${blockTypeColors[definition.blockType] || 'from-gray-500 to-slate-500'} flex items-center justify-center text-white shadow-lg`}\r\n >\r\n {blockTypeIcons[definition.blockType] || <Blocks className=\"w-8 h-8\" />}\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{definition.name}</h1>\r\n {definition.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.systemBadge')}\r\n </span>\r\n )}\r\n {definition.isGlobal ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300\">\r\n <Globe className=\"w-3 h-3\" />\r\n {t('definitions.scope.global')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.scope.restricted')}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-sm font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {blockTypeIcons[definition.blockType]}\r\n {t(`definitions.blockTypes.${definition.blockType}`)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {definition.description && (\r\n <div className=\"mb-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('definitions.columns.description')}\r\n </h3>\r\n <p className=\"text-[var(--text-primary)]\">{definition.description}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-6 pb-6 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <Code className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{t('definitions.fields.code')}</p>\r\n <p className=\"font-mono text-sm text-[var(--text-primary)]\">{definition.code}</p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <Hash className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{t('definitions.fields.usageCount')}</p>\r\n <p className=\"font-semibold text-[var(--text-primary)]\">{definition.usageCount ?? 0}</p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{t('skills.detail.createdAt')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)]\">\r\n {definition.createdAt ? new Date(definition.createdAt).toLocaleDateString() : '-'}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n {definition.isActive ? (\r\n <>\r\n <div className=\"w-2 h-2 rounded-full bg-green-500\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{t('skills.blocks.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"w-2 h-2 rounded-full bg-gray-400\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('skills.blocks.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {definition.defaultTitle && (\r\n <div className=\"mb-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('definitions.fields.defaultTitle')}\r\n </h3>\r\n <p className=\"text-[var(--text-primary)] font-medium\">{definition.defaultTitle}</p>\r\n </div>\r\n )}\r\n\r\n <div>\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('definitions.fields.defaultContent')}\r\n </h3>\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-4 font-mono text-sm whitespace-pre-wrap text-[var(--text-primary)] border border-[var(--border-color)]\">\r\n {definition.defaultContent || t('common.noData')}\r\n </div>\r\n </div>\r\n\r\n {(definition.variables?.length ?? 0) > 0 && (\r\n <div className=\"mt-6 pt-6 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('skills.detail.variables')}\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {definition.variables.map((variable: string) => (\r\n <span\r\n key={variable}\r\n className=\"inline-flex items-center px-3 py-1.5 rounded-full text-xs font-mono bg-[var(--accent-bg)] text-[var(--accent-text)] border border-[var(--accent-border)]\"\r\n >\r\n {`{${variable}}`}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Blocks,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Save,\r\n Shield,\r\n FileText,\r\n Target,\r\n MessageSquare,\r\n ListChecks,\r\n Sparkles,\r\n Globe,\r\n Lock,\r\n Eye,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { aiApi, type AiSkillBlockDefinitionDetailDto } from '@/services/api/aiApi';\r\n\r\nconst blockTypeIcons: Record<string, React.ReactNode> = {\r\n System: <Shield className=\"w-4 h-4\" />,\r\n Context: <FileText className=\"w-4 h-4\" />,\r\n Task: <Target className=\"w-4 h-4\" />,\r\n Output: <MessageSquare className=\"w-4 h-4\" />,\r\n Examples: <ListChecks className=\"w-4 h-4\" />,\r\n Validation: <Sparkles className=\"w-4 h-4\" />,\r\n};\r\n\r\nconst blockTypes = ['System', 'Context', 'Task', 'Output', 'Examples', 'Validation'];\r\n\r\ninterface FormData {\r\n code: string;\r\n name: string;\r\n description: string;\r\n blockType: string;\r\n defaultTitle: string;\r\n defaultContent: string;\r\n isGlobal: boolean;\r\n}\r\n\r\nexport function AiBlockDefinitionEditPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: definitionId } = useParams<{ id: string }>();\r\n const isEditMode = !!definitionId;\r\n\r\n const [loading, setLoading] = useState(isEditMode);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [definition, setDefinition] = useState<AiSkillBlockDefinitionDetailDto | null>(null);\r\n const [showPreview, setShowPreview] = useState(false);\r\n\r\n const [formData, setFormData] = useState<FormData>({\r\n code: '',\r\n name: '',\r\n description: '',\r\n blockType: 'System',\r\n defaultTitle: '',\r\n defaultContent: '',\r\n isGlobal: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isEditMode) return;\r\n const loadDefinition = async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.blockDefinitions.getById(definitionId!);\r\n setDefinition(result);\r\n setFormData({\r\n code: result.code || '',\r\n name: result.name || '',\r\n description: result.description || '',\r\n blockType: result.blockType || 'System',\r\n defaultTitle: result.defaultTitle || '',\r\n defaultContent: result.defaultContent || '',\r\n isGlobal: result.isGlobal ?? true,\r\n });\r\n } catch (err) {\r\n console.error('Failed to load definition:', err);\r\n setError(t('definitions.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n loadDefinition();\r\n }, [definitionId, isEditMode, t]);\r\n\r\n const handleChange = (field: keyof FormData, value: string | boolean) => {\r\n setFormData((prev) => ({ ...prev, [field]: value }));\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!formData.name.trim() || !formData.defaultContent.trim()) {\r\n setError(t('definitions.errors.requiredFields'));\r\n return;\r\n }\r\n\r\n try {\r\n setError(null);\r\n setSaving(true);\r\n\r\n if (isEditMode) {\r\n await aiApi.blockDefinitions.update(definitionId!, {\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n defaultTitle: formData.defaultTitle || undefined,\r\n defaultContent: formData.defaultContent,\r\n });\r\n } else {\r\n await aiApi.blockDefinitions.create({\r\n name: formData.name,\r\n blockType: formData.blockType,\r\n description: formData.description || undefined,\r\n defaultTitle: formData.defaultTitle || undefined,\r\n defaultContent: formData.defaultContent,\r\n });\r\n }\r\n\r\n navigate('/administration/ai/skills/blocks');\r\n } catch (err) {\r\n console.error('Failed to save definition:', err);\r\n setError(t('definitions.messages.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n // Extract variables from content\r\n const extractedVariables = (formData.defaultContent.match(/\\{([^}]+)\\}/g) || []).map((v) =>\r\n v.replace(/[{}]/g, '')\r\n );\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (isEditMode && definition?.isSystem) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n <div className=\"bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg p-6 text-center\">\r\n <Lock className=\"w-12 h-12 text-amber-600 dark:text-amber-400 mx-auto mb-3\" />\r\n <p className=\"text-amber-800 dark:text-amber-200 font-medium\">\r\n {t('definitions.cannotEditSystem')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: t('definitions.title'), href: '/administration/ai/skills/blocks' },\r\n { label: isEditMode ? (definition?.name || 'Edit') : t('common:create') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3 mb-6\">\r\n <div className=\"w-12 h-12 rounded-xl bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center text-white shadow-lg\">\r\n <Blocks className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {isEditMode ? t('definitions.edit.title') : t('definitions.create.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('definitions.edit.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"grid grid-cols-1 lg:grid-cols-5 gap-6\">\r\n {/* Left: Form */}\r\n <div className=\"lg:col-span-3 space-y-6\">\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('definitions.edit.basicInfo')}\r\n </h2>\r\n\r\n <div className=\"space-y-4\">\r\n {!isEditMode && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.code')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.code}\r\n onChange={(e) => handleChange('code', e.target.value)}\r\n placeholder=\"my-block-definition\"\r\n className=\"input w-full font-mono\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">{t('definitions.fields.codeHelp')}</p>\r\n </div>\r\n )}\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => handleChange('name', e.target.value)}\r\n placeholder={t('definitions.fields.namePlaceholder')}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => handleChange('description', e.target.value)}\r\n placeholder={t('definitions.fields.descriptionPlaceholder')}\r\n rows={2}\r\n className=\"input w-full resize-none\"\r\n />\r\n </div>\r\n\r\n {!isEditMode && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.columns.type')} *\r\n </label>\r\n <div className=\"grid grid-cols-3 gap-2\">\r\n {blockTypes.map((type) => (\r\n <button\r\n key={type}\r\n type=\"button\"\r\n onClick={() => handleChange('blockType', type)}\r\n className={`p-3 rounded-lg border-2 transition-all flex flex-col items-center gap-2 ${\r\n formData.blockType === type\r\n ? 'border-[var(--color-primary-500)] bg-[var(--accent-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-primary-300)]'\r\n }`}\r\n >\r\n <span\r\n className={\r\n formData.blockType === type ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-tertiary)]'\r\n }\r\n >\r\n {blockTypeIcons[type]}\r\n </span>\r\n <span className=\"text-xs font-medium\">{t(`definitions.blockTypes.${type}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3 pt-2\">\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={formData.isGlobal}\r\n onChange={(e) => handleChange('isGlobal', e.target.checked)}\r\n className=\"w-4 h-4 rounded border-[var(--border-color)]\"\r\n />\r\n <Globe className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{t('definitions.fields.isGlobal')}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('definitions.edit.content')}\r\n </h2>\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPreview(!showPreview)}\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n {showPreview ? t('definitions.edit.hidePreview') : t('definitions.edit.showPreview')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.defaultTitle')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.defaultTitle}\r\n onChange={(e) => handleChange('defaultTitle', e.target.value)}\r\n placeholder={t('definitions.fields.defaultTitlePlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.defaultContent')} *\r\n </label>\r\n <textarea\r\n value={formData.defaultContent}\r\n onChange={(e) => handleChange('defaultContent', e.target.value)}\r\n placeholder={t('definitions.fields.defaultContentPlaceholder')}\r\n rows={12}\r\n className=\"input w-full font-mono text-sm resize-none\"\r\n required\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('definitions.fields.variablesHelp')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right: Preview & Variables */}\r\n <div className=\"lg:col-span-2 space-y-6\">\r\n {extractedVariables.length > 0 && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('skills.detail.variables')} ({extractedVariables.length})\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {extractedVariables.map((variable: string) => (\r\n <span\r\n key={variable}\r\n className=\"inline-flex items-center px-3 py-1.5 rounded-full text-xs font-mono bg-[var(--accent-bg)] text-[var(--accent-text)] border border-[var(--accent-border)]\"\r\n >\r\n {`{${variable}}`}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showPreview && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('skills.editor.preview')}\r\n </h3>\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-4 font-mono text-sm whitespace-pre-wrap text-[var(--text-primary)] border border-[var(--border-color)] max-h-96 overflow-y-auto\">\r\n {formData.defaultContent || t('common.noData')}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6 bg-[var(--bg-secondary)]\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('definitions.edit.tips')}\r\n </h3>\r\n <ul className=\"space-y-2 text-sm text-[var(--text-tertiary)]\">\r\n <li className=\"flex items-start gap-2\">\r\n <span className=\"text-[var(--color-primary-500)]\">•</span>\r\n {t('definitions.edit.tip1')}\r\n </li>\r\n <li className=\"flex items-start gap-2\">\r\n <span className=\"text-[var(--color-primary-500)]\">•</span>\r\n {t('definitions.edit.tip2')}\r\n </li>\r\n <li className=\"flex items-start gap-2\">\r\n <span className=\"text-[var(--color-primary-500)]\">•</span>\r\n {t('definitions.edit.tip3')}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div className=\"flex gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"btn btn-secondary flex-1\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button type=\"submit\" disabled={saving} className=\"btn btn-primary flex-1\">\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <>\r\n <Save className=\"w-4 h-4\" />\r\n {t('common.save')}\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useMemo, memo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n DollarSign,\r\n Zap,\r\n Users,\r\n Loader2,\r\n AlertCircle,\r\n RefreshCw,\r\n ChevronDown,\r\n ChevronRight,\r\n CheckCircle,\r\n XCircle,\r\n} from 'lucide-react';\r\nimport {\r\n aiApi,\r\n type InstanceUsageDto,\r\n type InstanceEventDto,\r\n} from '@/services/api/aiApi';\r\n\r\n// Color classes pattern from CLAUDE.md\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n yellow: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n red: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\ninterface StatCardProps {\r\n readonly title: string;\r\n readonly value: string | number;\r\n readonly icon: React.ReactNode;\r\n readonly color: keyof typeof colorClasses;\r\n}\r\n\r\nconst StatCard = memo(function StatCard({ title, value, icon, color }: StatCardProps) {\r\n return (\r\n <div className={`card p-4 border ${colorClasses[color]}`}>\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n </div>\r\n );\r\n});\r\n\r\ntype SortField = 'instanceName' | 'providerName' | 'totalTokens' | 'totalCost' | 'requestCount' | 'avgLatencyMs' | 'lastUsedAt';\r\ntype SortDirection = 'asc' | 'desc';\r\n\r\nexport function AiMonitoringPage(): ReactElement {\r\n const { t } = useTranslation(['ai']);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [data, setData] = useState<InstanceUsageDto[]>([]);\r\n const [expandedInstance, setExpandedInstance] = useState<string | null>(null);\r\n const [events, setEvents] = useState<InstanceEventDto[]>([]);\r\n const [eventsLoading, setEventsLoading] = useState(false);\r\n const [sortField, setSortField] = useState<SortField>('totalCost');\r\n const [sortDirection, setSortDirection] = useState<SortDirection>('desc');\r\n\r\n const getDateRange = useCallback((days: number) => {\r\n const end = new Date();\r\n const start = new Date();\r\n start.setDate(start.getDate() - days);\r\n return {\r\n startDate: start.toISOString().split('T')[0],\r\n endDate: end.toISOString(),\r\n };\r\n }, []);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const { startDate, endDate } = getDateRange(period);\r\n const result = await aiApi.usage.getByInstance(startDate, endDate);\r\n setData(result ?? []);\r\n } catch (err: unknown) {\r\n console.error('Failed to load AI usage data:', err);\r\n setError(t('ai:common.error', 'Failed to load data'));\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, getDateRange, t]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = useCallback(() => {\r\n setRefreshing(true);\r\n loadData();\r\n }, [loadData]);\r\n\r\n const loadInstanceEvents = useCallback(async (instanceId: string) => {\r\n try {\r\n setEventsLoading(true);\r\n const { startDate, endDate } = getDateRange(period);\r\n const result = await aiApi.usage.getInstanceEvents(instanceId, startDate, endDate, 100);\r\n setEvents(result ?? []);\r\n } catch {\r\n setEvents([]);\r\n } finally {\r\n setEventsLoading(false);\r\n }\r\n }, [period, getDateRange]);\r\n\r\n const handleToggleInstance = useCallback((instanceId: string) => {\r\n if (expandedInstance === instanceId) {\r\n setExpandedInstance(null);\r\n setEvents([]);\r\n } else {\r\n setExpandedInstance(instanceId);\r\n loadInstanceEvents(instanceId);\r\n }\r\n }, [expandedInstance, loadInstanceEvents]);\r\n\r\n const handleSort = useCallback((field: SortField) => {\r\n if (sortField === field) {\r\n setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');\r\n } else {\r\n setSortField(field);\r\n setSortDirection('desc');\r\n }\r\n }, [sortField]);\r\n\r\n const sortedData = useMemo(() => {\r\n return [...data].sort((a, b) => {\r\n const aVal = a[sortField];\r\n const bVal = b[sortField];\r\n if (aVal == null && bVal == null) return 0;\r\n if (aVal == null) return 1;\r\n if (bVal == null) return -1;\r\n const cmp = typeof aVal === 'string'\r\n ? aVal.localeCompare(bVal as string)\r\n : (aVal as number) - (bVal as number);\r\n return sortDirection === 'asc' ? cmp : -cmp;\r\n });\r\n }, [data, sortField, sortDirection]);\r\n\r\n const kpis = useMemo(() => {\r\n const activeProfiles = data.length;\r\n const totalCost = data.reduce((sum, d) => sum + d.totalCost, 0);\r\n const totalRequests = data.reduce((sum, d) => sum + d.requestCount, 0);\r\n const totalTokens = data.reduce((sum, d) => sum + d.totalTokens, 0);\r\n return { activeProfiles, totalCost, totalRequests, totalTokens };\r\n }, [data]);\r\n\r\n const formatCurrency = (value: number) => {\r\n const abs = Math.abs(value);\r\n const getFractionDigits = () => {\r\n if (abs === 0 || abs >= 0.01) return 2;\r\n if (abs >= 0.0001) return 4;\r\n return 6;\r\n };\r\n const fractionDigits = getFractionDigits();\r\n return new Intl.NumberFormat('en-US', {\r\n style: 'currency',\r\n currency: 'USD',\r\n minimumFractionDigits: fractionDigits,\r\n maximumFractionDigits: fractionDigits,\r\n }).format(value);\r\n };\r\n\r\n const formatNumber = (value: number) =>\r\n new Intl.NumberFormat('en-US').format(value);\r\n\r\n const formatLatency = (ms: number) => `${Math.round(ms)} ms`;\r\n\r\n const formatSuccessRate = (item: InstanceUsageDto) => {\r\n if (item.requestCount === 0) return '—';\r\n return `${((item.successCount / item.requestCount) * 100).toFixed(1)}%`;\r\n };\r\n\r\n const formatDate = (dateStr: string | null) => {\r\n if (!dateStr) return '—';\r\n return new Date(dateStr).toLocaleString();\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('ai:monitoring.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('ai:monitoring.subtitle')}</p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"px-3 py-2 border border-[var(--border-color)] bg-[var(--bg-card)] text-[var(--text-primary)] rounded-[var(--radius-input)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value={7}>{t('ai:monitoring.period.7days')}</option>\r\n <option value={30}>{t('ai:monitoring.period.30days')}</option>\r\n <option value={90}>{t('ai:monitoring.period.90days')}</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)] flex items-center gap-2\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n {t('ai:monitoring.refresh')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)]\">\r\n <div className=\"flex items-center\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <span className=\"ml-2 text-[var(--error-text)]\">{error}</span>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('ai:monitoring.refresh')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalProfiles')}\r\n value={kpis.activeProfiles}\r\n icon={<Users className=\"w-5 h-5\" />}\r\n color=\"blue\"\r\n />\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalCost')}\r\n value={formatCurrency(kpis.totalCost)}\r\n icon={<DollarSign className=\"w-5 h-5\" />}\r\n color=\"green\"\r\n />\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalRequests')}\r\n value={formatNumber(kpis.totalRequests)}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n color=\"yellow\"\r\n />\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalTokens')}\r\n value={formatNumber(kpis.totalTokens)}\r\n icon={<Zap className=\"w-5 h-5\" />}\r\n color=\"neutral\"\r\n />\r\n </div>\r\n\r\n {/* Main Table */}\r\n {data.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('ai:monitoring.empty')}\r\n </div>\r\n ) : (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] overflow-hidden\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"w-8 p-3\" />\r\n <SortableHeader field=\"instanceName\" label={t('ai:monitoring.table.instance')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} />\r\n <SortableHeader field=\"providerName\" label={t('ai:monitoring.table.provider')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} />\r\n <th className=\"text-left p-3 text-sm font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.table.department')}</th>\r\n <th className=\"text-left p-3 text-sm font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.table.costCenter')}</th>\r\n <SortableHeader field=\"totalTokens\" label={t('ai:monitoring.table.totalTokens')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <SortableHeader field=\"totalCost\" label={t('ai:monitoring.table.totalCost')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <SortableHeader field=\"requestCount\" label={t('ai:monitoring.table.requests')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <th className=\"text-right p-3 text-sm font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.table.successRate')}</th>\r\n <SortableHeader field=\"avgLatencyMs\" label={t('ai:monitoring.table.avgLatency')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <SortableHeader field=\"lastUsedAt\" label={t('ai:monitoring.table.lastUsed')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} />\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {sortedData.map((item) => (\r\n <InstanceRow\r\n key={item.instanceId}\r\n item={item}\r\n isExpanded={expandedInstance === item.instanceId}\r\n onToggle={handleToggleInstance}\r\n events={expandedInstance === item.instanceId ? events : []}\r\n eventsLoading={expandedInstance === item.instanceId && eventsLoading}\r\n formatCurrency={formatCurrency}\r\n formatNumber={formatNumber}\r\n formatLatency={formatLatency}\r\n formatSuccessRate={formatSuccessRate}\r\n formatDate={formatDate}\r\n />\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Sortable header component\r\ninterface SortableHeaderProps {\r\n readonly field: SortField;\r\n readonly label: string;\r\n readonly sortField: SortField;\r\n readonly sortDirection: SortDirection;\r\n readonly onSort: (field: SortField) => void;\r\n readonly align?: 'left' | 'right';\r\n}\r\n\r\nconst SortableHeader = memo(function SortableHeader({ field, label, sortField, sortDirection, onSort, align = 'left' }: SortableHeaderProps) {\r\n const isActive = sortField === field;\r\n return (\r\n <th\r\n className={`p-3 text-sm font-medium text-[var(--text-secondary)] cursor-pointer hover:text-[var(--text-primary)] select-none ${align === 'right' ? 'text-right' : 'text-left'}`}\r\n onClick={() => onSort(field)}\r\n >\r\n <span className=\"inline-flex items-center gap-1\">\r\n {label}\r\n {isActive && (\r\n <span className=\"text-[var(--color-accent-500)]\">\r\n {sortDirection === 'asc' ? '↑' : '↓'}\r\n </span>\r\n )}\r\n </span>\r\n </th>\r\n );\r\n});\r\n\r\n// Instance row with expandable detail\r\ninterface InstanceRowProps {\r\n readonly item: InstanceUsageDto;\r\n readonly isExpanded: boolean;\r\n readonly onToggle: (id: string) => void;\r\n readonly events: InstanceEventDto[];\r\n readonly eventsLoading: boolean;\r\n readonly formatCurrency: (v: number) => string;\r\n readonly formatNumber: (v: number) => string;\r\n readonly formatLatency: (v: number) => string;\r\n readonly formatSuccessRate: (item: InstanceUsageDto) => string;\r\n readonly formatDate: (d: string | null) => string;\r\n}\r\n\r\nconst InstanceRow = memo(function InstanceRow({\r\n item, isExpanded, onToggle, events, eventsLoading,\r\n formatCurrency, formatNumber, formatLatency, formatSuccessRate, formatDate,\r\n}: InstanceRowProps) {\r\n const { t } = useTranslation(['ai']);\r\n return (\r\n <>\r\n <tr\r\n className=\"border-b border-[var(--border-color)] hover:bg-[var(--bg-hover)] cursor-pointer\"\r\n onClick={() => onToggle(item.instanceId)}\r\n >\r\n <td className=\"p-3 text-center\">\r\n {isExpanded\r\n ? <ChevronDown className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n : <ChevronRight className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n }\r\n </td>\r\n <td className=\"p-3 font-medium text-[var(--text-primary)]\">{item.instanceName}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{item.providerName}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{item.department ?? '—'}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{item.costCenter ?? '—'}</td>\r\n <td className=\"p-3 text-right font-mono text-sm\">{formatNumber(item.totalTokens)}</td>\r\n <td className=\"p-3 text-right font-medium\">{formatCurrency(item.totalCost)}</td>\r\n <td className=\"p-3 text-right\">{formatNumber(item.requestCount)}</td>\r\n <td className=\"p-3 text-right\">{formatSuccessRate(item)}</td>\r\n <td className=\"p-3 text-right text-sm\">{formatLatency(item.avgLatencyMs)}</td>\r\n <td className=\"p-3 text-sm text-[var(--text-secondary)]\">{formatDate(item.lastUsedAt)}</td>\r\n </tr>\r\n {isExpanded && (\r\n <tr>\r\n <td colSpan={11} className=\"p-0\">\r\n <div className=\"bg-[var(--bg-secondary)] border-t border-[var(--border-color)] p-4\">\r\n <h4 className=\"text-sm font-semibold text-[var(--text-primary)] mb-3\">\r\n {t('ai:monitoring.detail.title', { name: item.instanceName })}\r\n </h4>\r\n {eventsLoading && (\r\n <div className=\"flex items-center justify-center py-6\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!eventsLoading && events.length === 0 && (\r\n <div className=\"text-center py-4 text-[var(--text-secondary)] text-sm\">\r\n {t('ai:monitoring.detail.noEvents')}\r\n </div>\r\n )}\r\n {!eventsLoading && events.length > 0 && (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.timestamp')}</th>\r\n <th className=\"text-left p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.model')}</th>\r\n <th className=\"text-left p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.feature')}</th>\r\n <th className=\"text-right p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.tokens')}</th>\r\n <th className=\"text-right p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.cost')}</th>\r\n <th className=\"text-right p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.latency')}</th>\r\n <th className=\"text-center p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.status')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {events.map((event) => (\r\n <tr key={event.id} className=\"border-b border-[var(--border-color)] last:border-0\">\r\n <td className=\"p-2 text-[var(--text-secondary)]\">\r\n {new Date(event.timestamp).toLocaleString()}\r\n </td>\r\n <td className=\"p-2 font-mono\">{event.modelName}</td>\r\n <td className=\"p-2 text-[var(--text-secondary)]\">{event.featureName ?? '—'}</td>\r\n <td className=\"p-2 text-right font-mono\">\r\n <span title={`In: ${formatNumber(event.inputTokens)} / Out: ${formatNumber(event.outputTokens)}`}>\r\n {formatNumber(event.totalTokens)}\r\n </span>\r\n </td>\r\n <td className=\"p-2 text-right\">{formatCurrency(event.costAmount)}</td>\r\n <td className=\"p-2 text-right\">{event.latencyMs} ms</td>\r\n <td className=\"p-2 text-center\">\r\n {event.statusCode >= 200 && event.statusCode < 300 ? (\r\n <CheckCircle className=\"w-4 h-4 text-[var(--success-text)] inline\" />\r\n ) : (\r\n <span title={event.errorMessage ?? ''}>\r\n <XCircle className=\"w-4 h-4 text-[var(--error-text)] inline\" />\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Bot,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n Search,\r\n Eye,\r\n Edit2,\r\n Trash2,\r\n Workflow,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ViewToggle, type ViewMode, StatusBadge, Pagination } from '@/components/ui/DataView';\r\nimport { aiApi, type AiAgentListDto } from '@/services/api/aiApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\nexport function AiAgentsPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n\r\n const [agents, setAgents] = useState<AiAgentListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [search, setSearch] = useState('');\r\n const [filterStatus, setFilterStatus] = useState('');\r\n\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadAgents = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.agents.getAll();\r\n setAgents(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load agents:', err);\r\n setError(t('agents.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [t, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadAgents();\r\n }, [loadAgents]);\r\n\r\n const handleDelete = async (agent: AiAgentListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!confirm(t('agents.confirmDelete'))) return;\r\n try {\r\n await aiApi.agents.delete(agent.id);\r\n await loadAgents();\r\n } catch (err) {\r\n console.error('Failed to delete agent:', err);\r\n }\r\n };\r\n\r\n const filteredAgents = agents.filter((agent) => {\r\n const matchesSearch =\r\n !search ||\r\n agent.name.toLowerCase().includes(search.toLowerCase()) ||\r\n agent.agentCode.toLowerCase().includes(search.toLowerCase());\r\n const matchesStatus =\r\n !filterStatus ||\r\n (filterStatus === 'active' && agent.isActive) ||\r\n (filterStatus === 'inactive' && !agent.isActive);\r\n return matchesSearch && matchesStatus;\r\n });\r\n\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedAgents = filteredAgents.slice(startIndex, startIndex + pageSize);\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.code')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.steps')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.maxParallelism')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.timeout')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.status')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-primary-600)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedAgents.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center text-[var(--text-secondary)]\">\r\n {t('agents.noAgents')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedAgents.length > 0 && (\r\n paginatedAgents.map((agent) => (\r\n <tr\r\n key={agent.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}`)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <Bot className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.name}</p>\r\n {agent.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] truncate max-w-[300px]\">\r\n {agent.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"font-mono text-sm text-[var(--text-secondary)]\">\r\n {agent.agentCode}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n <Workflow className=\"w-3.5 h-3.5\" />\r\n {agent.stepCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{agent.maxParallelism}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{agent.timeoutSeconds}s</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={agent.isActive ? 'active' : 'inactive'}\r\n label={t(`agents.status.${agent.isActive ? 'active' : 'inactive'}`)}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('agents.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}/edit`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('agents.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(agent, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('agents.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && paginatedAgents.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--color-accent-50)] flex items-center justify-center mb-3\">\r\n <Bot className=\"w-8 h-8 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('agents.noAgents')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedAgents.length > 0 && (\r\n paginatedAgents.map((agent) => (\r\n <button\r\n key={agent.id}\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-[var(--color-accent-500)] flex items-center justify-center shadow-lg\">\r\n <Bot className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div>\r\n <h4 className=\"font-semibold text-[var(--text-primary)] truncate\">{agent.name}</h4>\r\n <p className=\"text-xs font-mono text-[var(--text-tertiary)]\">{agent.agentCode}</p>\r\n </div>\r\n </div>\r\n <StatusBadge\r\n status={agent.isActive ? 'active' : 'inactive'}\r\n label={t(`agents.status.${agent.isActive ? 'active' : 'inactive'}`)}\r\n size=\"sm\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {agent.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 mb-3\">{agent.description}</p>\r\n )}\r\n <div className=\"flex flex-wrap gap-2\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Workflow className=\"w-3 h-3\" />\r\n {agent.stepCount} {t('agents.columns.steps').toLowerCase()}\r\n </span>\r\n <span className=\"px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {t('agents.columns.maxParallelism')}: {agent.maxParallelism}\r\n </span>\r\n <span className=\"px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {agent.timeoutSeconds}s\r\n </span>\r\n </div>\r\n <div className=\"flex-1 min-h-4\" />\r\n <div\r\n className=\"flex items-center justify-end gap-1 mt-3 pt-3 border-t border-[var(--border-color)]\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}/edit`)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] transition-all\"\r\n title={t('agents.actions.edit')}\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(agent, e)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('agents.actions.delete')}\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('agents.title') },\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Bot className=\"w-6 h-6\" />\r\n {t('agents.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">\r\n {agents.length} {t('agents.agentsCount')}\r\n </p>\r\n </div>\r\n <button onClick={() => navigate('/administration/ai/agents/create')} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('agents.createAgent')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n <div className=\"flex flex-wrap items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder={t('agents.search')}\r\n className=\"input pl-10 w-full\"\r\n />\r\n </div>\r\n <select value={filterStatus} onChange={(e) => setFilterStatus(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('agents.allStatuses')}</option>\r\n <option value=\"active\">{t('agents.status.active')}</option>\r\n <option value=\"inactive\">{t('agents.status.inactive')}</option>\r\n </select>\r\n </div>\r\n <ViewToggle viewMode={viewMode} onChange={setViewMode} showKanban={false} />\r\n </div>\r\n </div>\r\n\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n\r\n {!loading && filteredAgents.length > pageSize && (\r\n <Pagination\r\n page={page}\r\n totalPages={Math.ceil(filteredAgents.length / pageSize)}\r\n totalCount={filteredAgents.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel={t('agents.agentsCount')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Bot,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Edit2,\r\n Trash2,\r\n Play,\r\n Workflow,\r\n Clock,\r\n Layers,\r\n User,\r\n AlertCircle,\r\n Timer,\r\n Coins,\r\n ChevronDown,\r\n ChevronRight,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { StatusBadge } from '@/components/ui/DataView';\r\nimport {\r\n aiApi,\r\n type AiAgentDetailDto,\r\n type AiAgentExecutionListDto,\r\n type AiAgentExecutionDetailDto,\r\n} from '@/services/api/aiApi';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['steps', 'executions'] as const;\r\ntype TabId = (typeof TABS)[number];\r\n\r\nconst executionStatusColors: Record<number, 'active' | 'inactive' | 'warning'> = {\r\n 0: 'inactive', // Pending\r\n 1: 'active', // Running\r\n 2: 'active', // Completed\r\n 3: 'warning', // Failed\r\n 4: 'warning', // PartiallyCompleted\r\n 5: 'inactive', // Cancelled\r\n};\r\n\r\nexport function AiAgentDetailPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: agentId } = useParams<{ id: string }>();\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('steps', TABS);\r\n\r\n const [agent, setAgent] = useState<AiAgentDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [executions, setExecutions] = useState<AiAgentExecutionListDto[]>([]);\r\n const [executionsLoading, setExecutionsLoading] = useState(false);\r\n const [selectedExecution, setSelectedExecution] = useState<AiAgentExecutionDetailDto | null>(null);\r\n\r\n const loadAgent = useCallback(async () => {\r\n if (!agentId) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.agents.getById(agentId);\r\n setAgent(result ?? null);\r\n } catch (err) {\r\n console.error('Failed to load agent:', err);\r\n setError(t('agents.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [agentId, t]);\r\n\r\n const loadExecutions = useCallback(async () => {\r\n if (!agentId) return;\r\n try {\r\n setExecutionsLoading(true);\r\n const result = await aiApi.agents.getExecutions(agentId);\r\n setExecutions(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load executions:', err);\r\n } finally {\r\n setExecutionsLoading(false);\r\n }\r\n }, [agentId]);\r\n\r\n useEffect(() => {\r\n loadAgent();\r\n }, [loadAgent]);\r\n\r\n useEffect(() => {\r\n if (activeTab === 'executions') {\r\n loadExecutions();\r\n }\r\n }, [activeTab, loadExecutions]);\r\n\r\n const handleDelete = async () => {\r\n if (!agent || !confirm(t('agents.confirmDelete'))) return;\r\n try {\r\n await aiApi.agents.delete(agent.id);\r\n navigate('/administration/ai/agents');\r\n } catch (err) {\r\n console.error('Failed to delete agent:', err);\r\n }\r\n };\r\n\r\n const handleViewExecution = async (executionId: string) => {\r\n try {\r\n const detail = await aiApi.agents.getExecutionDetail(executionId);\r\n setSelectedExecution(detail ?? null);\r\n } catch (err) {\r\n console.error('Failed to load execution detail:', err);\r\n }\r\n };\r\n\r\n const formatDuration = (ms: number) => {\r\n if (ms < 1000) return `${ms}ms`;\r\n return `${(ms / 1000).toFixed(1)}s`;\r\n };\r\n\r\n const formatCost = (cost: number) => `$${cost.toFixed(4)}`;\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !agent) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/agents')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('agents.backToList')}\r\n </button>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">\r\n {error || t('common.noData')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('agents.title'), href: '/administration/ai/agents' },\r\n { label: agent.name },\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/agents')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('agents.backToList')}\r\n </button>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}/edit`)}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('agents.actions.edit')}\r\n </button>\r\n <button onClick={handleDelete} className=\"btn btn-danger flex items-center gap-2\">\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Agent Info Card */}\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-start gap-4 mb-6\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-500 flex items-center justify-center shadow-lg\">\r\n <Bot className=\"w-7 h-7 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3 mb-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{agent.name}</h1>\r\n <StatusBadge\r\n status={agent.isActive ? 'active' : 'inactive'}\r\n label={t(`agents.status.${agent.isActive ? 'active' : 'inactive'}`)}\r\n />\r\n </div>\r\n <p className=\"font-mono text-sm text-[var(--text-tertiary)]\">{agent.agentCode}</p>\r\n {agent.description && (\r\n <p className=\"text-[var(--text-secondary)] mt-2\">{agent.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Workflow className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.columns.steps')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.steps.length}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Layers className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.columns.maxParallelism')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.maxParallelism}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Clock className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.columns.timeout')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.timeoutSeconds}s</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <User className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.detail.createdBy')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.createdBy || 'System'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <nav className=\"flex gap-4\">\r\n {TABS.map((tab) => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`pb-3 px-1 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`agents.detail.${tab}`)}\r\n </button>\r\n ))}\r\n </nav>\r\n </div>\r\n\r\n {/* Tab Content: Steps */}\r\n {activeTab === 'steps' && (\r\n <div className=\"space-y-3\">\r\n {agent.steps.length > 0 ? (\r\n agent.steps.map((step) => (\r\n <div\r\n key={step.id}\r\n className={`card p-4 border-l-4 ${\r\n step.isActive\r\n ? 'border-l-blue-500 bg-blue-50/30 dark:bg-blue-900/10'\r\n : 'border-l-gray-300 opacity-60'\r\n }`}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <span className=\"w-8 h-8 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-sm font-bold\">\r\n {step.stepOrder}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">{step.name}</span>\r\n {step.continueOnFailure && (\r\n <span className=\"text-xs px-2 py-0.5 rounded bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n {t('agents.detail.continueOnFailure')}\r\n </span>\r\n )}\r\n {!step.isActive && (\r\n <span className=\"text-xs px-2 py-0.5 rounded bg-orange-100 text-orange-600 dark:bg-orange-900/30\">\r\n {t('agents.status.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-2 text-sm text-[var(--text-secondary)]\">\r\n <div>\r\n <span className=\"text-[var(--text-tertiary)]\">{t('agents.detail.stepSkill')}: </span>\r\n <span className=\"font-mono\">\r\n {step.skill ? step.skill.name : step.skillId}\r\n </span>\r\n </div>\r\n {step.outputStateKey && (\r\n <div>\r\n <span className=\"text-[var(--text-tertiary)]\">{t('agents.detail.stepOutputKey')}: </span>\r\n <span className=\"font-mono\">{step.outputStateKey}</span>\r\n </div>\r\n )}\r\n {step.inputMappingJson && (\r\n <div>\r\n <span className=\"text-[var(--text-tertiary)]\">{t('agents.detail.stepInputMapping')}: </span>\r\n <span className=\"font-mono text-xs\">{step.inputMappingJson}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Workflow className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('agents.detail.noSteps')}</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Tab Content: Executions */}\r\n {activeTab === 'executions' && (\r\n <div className=\"space-y-4\">\r\n {executionsLoading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!executionsLoading && executions.length === 0 && (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Play className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('agents.executions.noExecutions')}</p>\r\n </div>\r\n )}\r\n {!executionsLoading && executions.length > 0 && (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.status')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.startedAt')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.steps')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.tokens')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.cost')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.duration')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {executions.map((exec) => (\r\n <ExecutionRow\r\n key={exec.id}\r\n execution={exec}\r\n t={t}\r\n formatDuration={formatDuration}\r\n formatCost={formatCost}\r\n selectedExecution={selectedExecution}\r\n onViewDetail={handleViewExecution}\r\n />\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Info Sidebar */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n <div className=\"lg:col-span-3\">\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('agents.detail.info')}</h3>\r\n <dl className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.createdAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {agent.createdAt ? new Date(agent.createdAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.createdBy')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">{agent.createdBy || '-'}</dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.updatedAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {agent.updatedAt ? new Date(agent.updatedAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.updatedBy')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">{agent.updatedBy || '-'}</dd>\r\n </div>\r\n </dl>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ExecutionRow({\r\n execution,\r\n t,\r\n formatDuration,\r\n formatCost,\r\n selectedExecution,\r\n onViewDetail,\r\n}: {\r\n execution: AiAgentExecutionListDto;\r\n t: ReturnType<typeof import('react-i18next').useTranslation>['t'];\r\n formatDuration: (ms: number) => string;\r\n formatCost: (cost: number) => string;\r\n selectedExecution: AiAgentExecutionDetailDto | null;\r\n onViewDetail: (id: string) => Promise<void>;\r\n}) {\r\n const [expanded, setExpanded] = useState(false);\r\n const isSelected = selectedExecution?.id === execution.id;\r\n\r\n const handleToggle = async () => {\r\n if (!expanded && !isSelected) {\r\n await onViewDetail(execution.id);\r\n }\r\n setExpanded(!expanded);\r\n };\r\n\r\n return (\r\n <>\r\n <tr\r\n className=\"hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={handleToggle}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {expanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n <StatusBadge\r\n status={executionStatusColors[execution.status] || 'inactive'}\r\n label={t(`agents.executions.status.${execution.status}`)}\r\n />\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {new Date(execution.startedAt).toLocaleString()}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {execution.executedSteps}/{execution.totalSteps}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {(execution.totalInputTokens + execution.totalOutputTokens).toLocaleString()}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {formatCost(execution.totalCost)}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {formatDuration(execution.totalExecutionTimeMs)}\r\n </td>\r\n <td className=\"px-4 py-3 text-right\">\r\n {execution.errorMessage && (\r\n <div title={execution.errorMessage}>\r\n <AlertCircle className=\"w-4 h-4 text-[var(--error-text)] inline-block\" />\r\n </div>\r\n )}\r\n </td>\r\n </tr>\r\n {expanded && isSelected && selectedExecution && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-4 bg-[var(--bg-secondary)]\">\r\n <div className=\"space-y-3\">\r\n <h4 className=\"font-medium text-sm\">{t('agents.executions.stepDetail')}</h4>\r\n {selectedExecution.stepExecutions.map((step) => (\r\n <div\r\n key={step.id}\r\n className=\"flex items-center gap-4 p-3 bg-[var(--bg-primary)] rounded-lg border border-[var(--border-color)]\"\r\n >\r\n <span className=\"w-6 h-6 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-xs font-bold\">\r\n {step.stepOrder}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm\">{step.stepName}</p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] font-mono\">{step.skillCode}</p>\r\n </div>\r\n <StatusBadge\r\n status={executionStatusColors[step.status] || 'inactive'}\r\n label={t(`agents.executions.status.${step.status}`)}\r\n size=\"sm\"\r\n />\r\n <div className=\"text-xs text-[var(--text-secondary)] flex items-center gap-3\">\r\n <span className=\"flex items-center gap-1\">\r\n <Timer className=\"w-3 h-3\" />\r\n {formatDuration(step.executionTimeMs)}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Coins className=\"w-3 h-3\" />\r\n {formatCost(step.cost)}\r\n </span>\r\n <span>{(step.inputTokens + step.outputTokens).toLocaleString()} tokens</span>\r\n </div>\r\n {step.errorMessage && (\r\n <span className=\"text-xs text-[var(--error-text)] max-w-[200px] truncate\" title={step.errorMessage}>\r\n {step.errorMessage}\r\n </span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Bot,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Save,\r\n Plus,\r\n Trash2,\r\n ChevronUp,\r\n ChevronDown,\r\n Workflow,\r\n Settings,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n aiApi,\r\n type AiAgentDetailDto,\r\n type AiSkillListDto,\r\n type UpdateAgentStepRequest,\r\n} from '@/services/api/aiApi';\r\n\r\ninterface StepFormData {\r\n tempId: string;\r\n id?: string;\r\n skillId: string;\r\n name: string;\r\n stepOrder: number;\r\n inputMappingJson: string;\r\n outputStateKey: string;\r\n continueOnFailure: boolean;\r\n}\r\n\r\nexport function AiAgentEditPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: agentId } = useParams<{ id: string }>();\r\n const isCreate = !agentId || agentId === 'create';\r\n\r\n const [loading, setLoading] = useState(!isCreate);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [agent, setAgent] = useState<AiAgentDetailDto | null>(null);\r\n\r\n // Agent form fields\r\n const [agentCode, setAgentCode] = useState('');\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [maxParallelism, setMaxParallelism] = useState(5);\r\n const [timeoutSeconds, setTimeoutSeconds] = useState(120);\r\n\r\n // Steps\r\n const [steps, setSteps] = useState<StepFormData[]>([]);\r\n const [showSettings, setShowSettings] = useState(true);\r\n\r\n // Available skills for dropdown\r\n const [skills, setSkills] = useState<AiSkillListDto[]>([]);\r\n\r\n const loadAgent = useCallback(async () => {\r\n if (isCreate) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.agents.getById(agentId!);\r\n if (result) {\r\n setAgent(result);\r\n setAgentCode(result.agentCode);\r\n setName(result.name);\r\n setDescription(result.description || '');\r\n setMaxParallelism(result.maxParallelism);\r\n setTimeoutSeconds(result.timeoutSeconds);\r\n setSteps(\r\n result.steps\r\n .sort((a, b) => a.stepOrder - b.stepOrder)\r\n .map((s) => ({\r\n tempId: s.id,\r\n id: s.id,\r\n skillId: s.skillId,\r\n name: s.name,\r\n stepOrder: s.stepOrder,\r\n inputMappingJson: s.inputMappingJson || '',\r\n outputStateKey: s.outputStateKey || '',\r\n continueOnFailure: s.continueOnFailure,\r\n }))\r\n );\r\n }\r\n } catch (err) {\r\n console.error('Failed to load agent:', err);\r\n setError(t('agents.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [agentId, isCreate, t]);\r\n\r\n const loadSkills = useCallback(async () => {\r\n try {\r\n const result = await aiApi.skills.getAll({ status: 'Active' });\r\n setSkills(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load skills:', err);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadAgent();\r\n loadSkills();\r\n }, [loadAgent, loadSkills]);\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n if (isCreate) {\r\n const created = await aiApi.agents.create({\r\n agentCode,\r\n name,\r\n moduleId: 'c3d4e5f6-7a8b-9c0d-1e2f-3a4b5c6d7e8f', // TODO: module selector\r\n description: description || undefined,\r\n maxParallelism,\r\n timeoutSeconds,\r\n });\r\n if (created) {\r\n // If steps were added, update with steps\r\n if (steps.length > 0) {\r\n const stepsData: UpdateAgentStepRequest[] = steps.map((s, i) => ({\r\n skillId: s.skillId,\r\n name: s.name,\r\n stepOrder: i + 1,\r\n inputMappingJson: s.inputMappingJson || undefined,\r\n outputStateKey: s.outputStateKey || undefined,\r\n continueOnFailure: s.continueOnFailure,\r\n }));\r\n await aiApi.agents.update(created.id, {\r\n name,\r\n description: description || undefined,\r\n maxParallelism,\r\n timeoutSeconds,\r\n steps: stepsData,\r\n });\r\n }\r\n navigate(`/administration/ai/agents/${created.id}`);\r\n }\r\n } else {\r\n const stepsData: UpdateAgentStepRequest[] = steps.map((s, i) => ({\r\n id: s.id,\r\n skillId: s.skillId,\r\n name: s.name,\r\n stepOrder: i + 1,\r\n inputMappingJson: s.inputMappingJson || undefined,\r\n outputStateKey: s.outputStateKey || undefined,\r\n continueOnFailure: s.continueOnFailure,\r\n }));\r\n await aiApi.agents.update(agentId!, {\r\n name,\r\n description: description || undefined,\r\n maxParallelism,\r\n timeoutSeconds,\r\n steps: stepsData,\r\n });\r\n navigate(`/administration/ai/agents/${agentId}`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to save agent:', err);\r\n setError(t('agents.messages.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleAddStep = () => {\r\n const newStep: StepFormData = {\r\n tempId: `temp-${Date.now()}`,\r\n skillId: '',\r\n name: '',\r\n stepOrder: steps.length + 1,\r\n inputMappingJson: '',\r\n outputStateKey: '',\r\n continueOnFailure: false,\r\n };\r\n setSteps([...steps, newStep]);\r\n };\r\n\r\n const handleRemoveStep = (tempId: string) => {\r\n setSteps(steps.filter((s) => s.tempId !== tempId));\r\n };\r\n\r\n const handleStepChange = (tempId: string, field: keyof StepFormData, value: string | boolean) => {\r\n setSteps(\r\n steps.map((s) =>\r\n s.tempId === tempId ? { ...s, [field]: value } : s\r\n )\r\n );\r\n };\r\n\r\n const handleMoveStep = (tempId: string, direction: 'up' | 'down') => {\r\n const index = steps.findIndex((s) => s.tempId === tempId);\r\n if (index === -1) return;\r\n if (direction === 'up' && index === 0) return;\r\n if (direction === 'down' && index === steps.length - 1) return;\r\n\r\n const newSteps = [...steps];\r\n const swapIndex = direction === 'up' ? index - 1 : index + 1;\r\n [newSteps[index], newSteps[swapIndex]] = [newSteps[swapIndex], newSteps[index]];\r\n setSteps(newSteps.map((s, i) => ({ ...s, stepOrder: i + 1 })));\r\n };\r\n\r\n const canSave = name.trim() && (isCreate ? agentCode.trim() : true);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('agents.title'), href: '/administration/ai/agents' },\r\n { label: isCreate ? t('agents.edit.create') : (agent?.name || t('agents.edit.title')) },\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() =>\r\n navigate(isCreate ? '/administration/ai/agents' : `/administration/ai/agents/${agentId}`)\r\n }\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('common.back')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving || !canSave}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 mb-2\">\r\n <div className=\"w-12 h-12 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-500 flex items-center justify-center shadow-lg\">\r\n <Bot className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {isCreate ? t('agents.edit.create') : t('agents.edit.title')}\r\n </h1>\r\n </div>\r\n <button\r\n onClick={() => setShowSettings(!showSettings)}\r\n className={`btn btn-secondary flex items-center gap-2 ${showSettings ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('agents.edit.agentInfo')}\r\n </button>\r\n </div>\r\n\r\n {/* Agent Settings Form */}\r\n {showSettings && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold mb-4\">{t('agents.edit.agentInfo')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {isCreate && (\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.agentCode')} *</label>\r\n <input\r\n type=\"text\"\r\n value={agentCode}\r\n onChange={(e) => setAgentCode(e.target.value)}\r\n className=\"input w-full font-mono\"\r\n placeholder={t('agents.fields.agentCodePlaceholder')}\r\n required\r\n />\r\n </div>\r\n )}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.name')} *</label>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n className=\"input w-full\"\r\n placeholder={t('agents.fields.namePlaceholder')}\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.maxParallelism')}</label>\r\n <input\r\n type=\"number\"\r\n value={maxParallelism}\r\n onChange={(e) => setMaxParallelism(Math.min(20, Math.max(1, parseInt(e.target.value) || 1)))}\r\n className=\"input w-full\"\r\n min={1}\r\n max={20}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.timeoutSeconds')}</label>\r\n <input\r\n type=\"number\"\r\n value={timeoutSeconds}\r\n onChange={(e) => setTimeoutSeconds(Math.min(600, Math.max(10, parseInt(e.target.value) || 10)))}\r\n className=\"input w-full\"\r\n min={10}\r\n max={600}\r\n />\r\n </div>\r\n <div className=\"md:col-span-2\">\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.description')}</label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n className=\"input w-full\"\r\n rows={2}\r\n placeholder={t('agents.fields.descriptionPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Steps Builder */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Workflow className=\"w-5 h-5\" />\r\n {t('agents.edit.stepsBuilder')} ({steps.length})\r\n </h3>\r\n <button onClick={handleAddStep} className=\"btn btn-primary btn-sm flex items-center gap-1\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('agents.edit.addStep')}\r\n </button>\r\n </div>\r\n\r\n {steps.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {steps.map((step, index) => (\r\n <StepEditor\r\n key={step.tempId}\r\n step={step}\r\n index={index}\r\n isFirst={index === 0}\r\n isLast={index === steps.length - 1}\r\n skills={skills}\r\n onChange={(field, value) => handleStepChange(step.tempId, field, value)}\r\n onDelete={() => handleRemoveStep(step.tempId)}\r\n onMoveUp={() => handleMoveStep(step.tempId, 'up')}\r\n onMoveDown={() => handleMoveStep(step.tempId, 'down')}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Workflow className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('agents.edit.addFirstStep')}</p>\r\n <button onClick={handleAddStep} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('agents.edit.addStep')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StepEditor({\r\n step,\r\n index,\r\n isFirst,\r\n isLast,\r\n skills,\r\n onChange,\r\n onDelete,\r\n onMoveUp,\r\n onMoveDown,\r\n t,\r\n}: {\r\n step: StepFormData;\r\n index: number;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n skills: AiSkillListDto[];\r\n onChange: (field: keyof StepFormData, value: string | boolean) => void;\r\n onDelete: () => void;\r\n onMoveUp: () => void;\r\n onMoveDown: () => void;\r\n t: ReturnType<typeof import('react-i18next').useTranslation>['t'];\r\n}) {\r\n return (\r\n <div className=\"card border-l-4 border-l-blue-500 bg-blue-50/30 dark:bg-blue-900/10 p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"flex flex-col items-center gap-1 pt-2\">\r\n <button\r\n onClick={onMoveUp}\r\n disabled={isFirst}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronUp className=\"w-4 h-4\" />\r\n </button>\r\n <span className=\"w-8 h-8 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-sm font-bold\">\r\n {index + 1}\r\n </span>\r\n <button\r\n onClick={onMoveDown}\r\n disabled={isLast}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex-1 space-y-3\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.stepName')} *</label>\r\n <input\r\n type=\"text\"\r\n value={step.name}\r\n onChange={(e) => onChange('name', e.target.value)}\r\n className=\"input w-full\"\r\n placeholder={t('agents.fields.stepNamePlaceholder')}\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.skill')} *</label>\r\n <select\r\n value={step.skillId}\r\n onChange={(e) => onChange('skillId', e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('agents.fields.selectSkill')}</option>\r\n {skills.map((skill) => (\r\n <option key={skill.id} value={skill.id}>\r\n {skill.name} ({skill.code})\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.outputStateKey')}</label>\r\n <input\r\n type=\"text\"\r\n value={step.outputStateKey}\r\n onChange={(e) => onChange('outputStateKey', e.target.value)}\r\n className=\"input w-full font-mono\"\r\n placeholder={t('agents.fields.outputStateKeyPlaceholder')}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.inputMapping')}</label>\r\n <input\r\n type=\"text\"\r\n value={step.inputMappingJson}\r\n onChange={(e) => onChange('inputMappingJson', e.target.value)}\r\n className=\"input w-full font-mono text-sm\"\r\n placeholder={t('agents.fields.inputMappingPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={step.continueOnFailure}\r\n onChange={(e) => onChange('continueOnFailure', e.target.checked)}\r\n className=\"rounded\"\r\n />\r\n {t('agents.fields.continueOnFailure')}\r\n </label>\r\n </div>\r\n\r\n <button\r\n onClick={onDelete}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('agents.edit.removeStep')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["CHART_COLORS","colorClasses","AiDashboardPage","t","useTranslation","loading","setLoading","useState","refreshing","setRefreshing","period","setPeriod","selectedProvider","setSelectedProvider","overview","setOverview","providerUsage","setProviderUsage","modelUsage","setModelUsage","dailyCosts","setDailyCosts","error","setError","loadData","useCallback","providerId","overviewRes","providerRes","modelRes","dailyRes","aiApi","err","appError","useEffect","handleRefresh","formatCost","value","abs","fractionDigits","formatNumber","dailyCostTrend","useMemo","byDate","providers","item","row","a","b","dailyRequestsTrend","existing","d","providerDonut","p","i","modelBars","m","tokenSplit","input","s","output","costTrend","mid","firstHalf","secondHalf","sumCost","rows","total","k","v","first","second","jsx","Loader2","jsxs","Breadcrumb","AlertTriangle","RefreshCw","Brain","e","KpiCard","DollarSign","Zap","Activity","CheckCircle","rate","Clock","latency","Server","ResponsiveContainer","AreaChart","name","CartesianGrid","XAxis","YAxis","Tooltip","label","Legend","Area","NoDataPlaceholder","PieChart","Pie","entry","Cell","pct","BarChart","_","payload","Bar","ComposedChart","Line","model","title","icon","color","trend","TrendingUp","TrendingDown","message","formatCurrency","ProviderLogo","logoUrl","providerCode","size","hasError","setHasError","sizeMap","EmptyInstancesState","Layers","NoDetailsState","getActiveBadgeClass","isActive","getActiveText","InstanceBadges","isOverBudget","AlertCircle","getProfileCardBorderClass","editing","hasKey","ApiKeyCard","type","onSave","placeholder","providerKeyUrl","setEditing","setValue","saving","setSaving","showValue","setShowValue","isApi","Icon","KeyRound","ShieldCheck","handleSave","handleCancel","ExternalLink","ApiKeyCardEditing","ApiKeyCardDisplay","BudgetGauge","budget","usage","isOver","budgetPeriodType","nextResetDate","radius","circumference","strokeOffset","gaugeColor","onShowValueChange","onValueChange","onCancel","_isApi","EyeOff","Eye","onEdit","Fragment","Plus","InstanceListItem","instance","isSelected","onSelect","Building2","Key","Globe","InlineSearchPanel","onSearch","onClose","query","setQuery","results","setResults","adding","setAdding","timer","items","handleSelect","id","Search","X","result","AiProfilesTab","instances","selectedInstance","onSelectInstance","onToggleActive","onDelete","onUpdate","models","onSetApiKey","onSetAdminKey","providerApiKeyUrl","providerAdminApiKeyUrl","onAddTenant","onRemoveTenant","onSetAllTenants","onAddPrompt","onRemovePrompt","editForm","setEditForm","showTenantSearch","setShowTenantSearch","showPromptSearch","setShowPromptSearch","togglingAllTenants","setTogglingAllTenants","startEditing","cancelEditing","handleSaveEdit","searchTenants","adminApi","existingIds","searchPrompts","prompts","handleToggleAllTenants","Save","BookOpen","Pencil","XCircle","Trash2","providerModels","familyGroups","family","fModels","da","currentValue","isFamily","isPinned","val","latest","minInput","maxOutput","Pin","PinOff","ToggleRight","ToggleLeft","tenant","skill","AiProvidersTab","provider","ProviderCard","Shield","CAPABILITIES","ImagePlus","Mic","Volume2","Radio","Terminal","getProviderInitial","getModelStatusBadge","AlertOctagon","AiModelsTab","filter","onFilterChange","categories","currentPage","setCurrentPage","viewMode","setViewMode","selectedCapabilities","setSelectedCapabilities","filterMode","setFilterMode","pageSize","filteredModels","caps","cap","totalPages","paginatedModels","toggleCapability","prev","next","clearCapabilityFilters","LayoutGrid","List","cat","Filter","key","bgLight","bgDark","Cpu","ArrowDownUp","ArrowUpDown","page","useAiInstances","setInstances","setSelectedInstance","loadInstances","data","loadInstanceDetail","instanceId","refreshInstance","createInstance","updateInstance","deleteInstance","toggleInstanceActive","setApiKey","apiKey","request","setAdminKey","adminKey","selectInstance","clearError","useAiProviders","setProviders","setError_","loadProviders","useAiModels","setModels","modelFilter","setModelFilterState","loadModels","category","setModelFilter","clearFilters","useInstanceAccess","tenants","setTenants","showAddTenantModal","setShowAddTenantModal","openAddTenantModal","closeAddTenantModal","addTenant","tenantId","removeTenant","loadAccessData","VALID_TABS","AiSettingsPage","activeTab","setActiveTab","useTabNavigation","aiInstances","aiProviders","aiModels","instanceAccess","showCreateModal","setShowCreateModal","formData","setFormData","loadingCode","setLoadingCode","deleteConfirm","setDeleteConfirm","handleSelectInstance","handleDeleteInstance","confirmDeleteInstance","handleToggleActive","handleCreateInstance","handleUpdateInstance","handleGenerateCode","response","Settings","tab","isAllTenants","skillId","ConfirmModal","PromptTestPanel","prompt","variables","setVariables","selectedProviderId","setSelectedProviderId","selectedModelId","setSelectedModelId","executing","setExecuting","setResult","showDebug","setShowDebug","copied","setCopied","initialVars","activeProviders","activeModels","handleExecute","errorMessage","handleCopyResponse","getPreview","block","content","Play","variable","Coins","Check","Copy","ChevronUp","ChevronDown","statusColors","AiPromptsListPage","navigate","useNavigate","currentTenant","isGlobalView","useTenant","setPrompts","search","setSearch","filterCategory","setFilterCategory","filterStatus","setFilterStatus","setPage","loadPrompts","params","handleDelete","handleClone","cloned","handleActivate","handleDeprecate","tag","filteredPrompts","startIndex","paginatedPrompts","renderTableView","FileText","Tag","Blocks","StatusBadge","Edit2","renderCardsView","ViewToggle","Pagination","blockTypeColors","statusMap","AiSkillsDetailPage","useParams","setSkill","showTestPanel","setShowTestPanel","showPreview","setShowPreview","previewVariables","setPreviewVariables","loadSkill","vars","getPreviewContent","ArrowLeft","Calendar","User","index","BlockDisplay","expanded","setExpanded","GripVertical","ChevronRight","blockTypeBadge","BLOCK_TYPES","AiSkillsEditPage","isCreate","setName","description","setDescription","setCategory","blocks","setBlocks","definitions","setDefinitions","showAddBlockModal","setShowAddBlockModal","editingBlockId","setEditingBlockId","showSettings","setShowSettings","loadDefinitions","defs","extractVariables","matches","allVariables","uniqueVariables","created","handleAddBlock","blockData","newBlock","handleUpdateBlock","blockId","handleDeleteBlock","handleMoveBlock","direction","newBlocks","swapIndex","reordered","BlockEditor","AddBlockModal","isFirst","isLast","isEditing","onCancelEdit","onMoveUp","onMoveDown","setLabel","setContent","blockType","setBlockType","isEnabled","setIsEnabled","existingBlocksCount","onAdd","mode","setMode","selectedDefinitionId","setSelectedDefinitionId","handleDefinitionChange","defId","def","handleSubmit","blockTypeIcons","Target","MessageSquare","ListChecks","Sparkles","AiBlockDefinitionsListPage","filterType","setFilterType","definition","filteredDefinitions","paginatedDefinitions","blockTypes","Lock","AiBlockDefinitionDetailPage","definitionId","setDefinition","Code","Hash","AiBlockDefinitionEditPage","isEditMode","handleChange","field","extractedVariables","StatCard","memo","AiMonitoringPage","setData","expandedInstance","setExpandedInstance","events","setEvents","eventsLoading","setEventsLoading","sortField","setSortField","sortDirection","setSortDirection","getDateRange","days","end","start","startDate","endDate","loadInstanceEvents","handleToggleInstance","handleSort","sortedData","aVal","bVal","cmp","kpis","activeProfiles","totalCost","sum","totalRequests","totalTokens","formatLatency","ms","formatSuccessRate","formatDate","dateStr","Users","SortableHeader","InstanceRow","onSort","align","isExpanded","onToggle","event","AiAgentsPage","agents","setAgents","loadAgents","agent","filteredAgents","matchesSearch","matchesStatus","paginatedAgents","Bot","Workflow","TABS","executionStatusColors","AiAgentDetailPage","agentId","setAgent","executions","setExecutions","executionsLoading","setExecutionsLoading","selectedExecution","setSelectedExecution","loadAgent","loadExecutions","handleViewExecution","executionId","detail","formatDuration","cost","step","exec","ExecutionRow","execution","onViewDetail","Timer","AiAgentEditPage","agentCode","setAgentCode","maxParallelism","setMaxParallelism","timeoutSeconds","setTimeoutSeconds","steps","setSteps","skills","setSkills","loadSkills","stepsData","handleAddStep","newStep","handleRemoveStep","tempId","handleStepChange","handleMoveStep","newSteps","canSave","StepEditor","onChange"],"mappings":"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"}
1
+ {"version":3,"file":"index-mLUKwbGl.js","sources":["../../src/pages/platform/administration/ai/AiDashboardPage.tsx","../../src/components/platform/administration/ai/AiProfilesTab.tsx","../../src/components/platform/administration/ai/AiProvidersTab.tsx","../../src/components/platform/administration/ai/AiModelsTab.tsx","../../src/hooks/useAiInstances.ts","../../src/hooks/useAiProviders.ts","../../src/hooks/useAiModels.ts","../../src/hooks/useInstanceAccess.ts","../../src/pages/platform/administration/ai/AiSettingsPage.tsx","../../src/components/platform/administration/ai/PromptTestPanel.tsx","../../src/pages/platform/administration/ai/AiPromptsListPage.tsx","../../src/pages/platform/administration/ai/AiSkillsDetailPage.tsx","../../src/pages/platform/administration/ai/AiSkillsEditPage.tsx","../../src/pages/platform/administration/ai/AiBlockDefinitionsListPage.tsx","../../src/pages/platform/administration/ai/AiBlockDefinitionDetailPage.tsx","../../src/pages/platform/administration/ai/AiBlockDefinitionEditPage.tsx","../../src/pages/platform/administration/ai/AiMonitoringPage.tsx","../../src/pages/platform/administration/ai/AiAgentsPage.tsx","../../src/pages/platform/administration/ai/AiAgentDetailPage.tsx","../../src/pages/platform/administration/ai/AiAgentEditPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Brain,\r\n RefreshCw,\r\n Loader2,\r\n AlertTriangle,\r\n Zap,\r\n DollarSign,\r\n Activity,\r\n CheckCircle,\r\n Clock,\r\n Server,\r\n TrendingUp,\r\n TrendingDown,\r\n} from 'lucide-react';\r\nimport {\r\n ResponsiveContainer,\r\n AreaChart,\r\n Area,\r\n BarChart,\r\n Bar,\r\n PieChart,\r\n Pie,\r\n Cell,\r\n ComposedChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n} from 'recharts';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n aiApi,\r\n type DashboardOverviewDto,\r\n type ProviderUsageDto,\r\n type ModelUsageDto,\r\n type DailyCostDto,\r\n} from '@/services/api/aiApi';\r\n\r\nconst CHART_COLORS = ['#3b82f6', '#8b5cf6', '#22c55e', '#f59e0b', '#ef4444', '#06b6d4', '#ec4899', '#14b8a6'];\r\n\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n yellow: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n red: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\nexport function AiDashboardPage(): ReactElement | null {\r\n const { t } = useTranslation(['ai']);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [period, setPeriod] = useState(30);\r\n const [selectedProvider, setSelectedProvider] = useState<string>('');\r\n\r\n const [overview, setOverview] = useState<DashboardOverviewDto | null>(null);\r\n const [providerUsage, setProviderUsage] = useState<ProviderUsageDto[]>([]);\r\n const [modelUsage, setModelUsage] = useState<ModelUsageDto[]>([]);\r\n const [dailyCosts, setDailyCosts] = useState<DailyCostDto[]>([]);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const providerId = selectedProvider || undefined;\r\n\r\n const [overviewRes, providerRes, modelRes, dailyRes] = await Promise.all([\r\n aiApi.dashboard.getOverview(period),\r\n aiApi.dashboard.getByProvider(),\r\n aiApi.dashboard.getByModel(undefined, undefined, providerId),\r\n aiApi.dashboard.getDailyCosts(period, providerId),\r\n ]);\r\n\r\n setOverview(overviewRes ?? null);\r\n setProviderUsage(providerRes ?? []);\r\n setModelUsage(modelRes ?? []);\r\n setDailyCosts(dailyRes ?? []);\r\n } catch (err: unknown) {\r\n console.error('Failed to load AI dashboard data:', err);\r\n const appError = err as { statusCode?: number };\r\n if (appError.statusCode === 401) {\r\n setError(t('dashboard.errors.sessionExpired'));\r\n } else if (appError.statusCode === 403) {\r\n setError(t('dashboard.errors.forbidden'));\r\n } else {\r\n setError(t('dashboard.errors.loadFailed'));\r\n }\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, selectedProvider, t]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = () => {\r\n setRefreshing(true);\r\n loadData();\r\n };\r\n\r\n const formatCost = (value: number) => {\r\n const abs = Math.abs(value);\r\n const getFractionDigits = () => {\r\n if (abs === 0 || abs >= 0.01) return 2;\r\n if (abs >= 0.0001) return 4;\r\n return 6;\r\n };\r\n const fractionDigits = getFractionDigits();\r\n return new Intl.NumberFormat('fr-FR', {\r\n style: 'currency',\r\n currency: 'USD',\r\n minimumFractionDigits: fractionDigits,\r\n maximumFractionDigits: fractionDigits,\r\n }).format(value);\r\n };\r\n\r\n const formatNumber = (value: number) =>\r\n new Intl.NumberFormat('fr-FR').format(value);\r\n\r\n // --- Derived chart data ---\r\n\r\n // Daily cost trend: pivot by date, one series per provider\r\n const dailyCostTrend = useMemo(() => {\r\n const byDate = new Map<string, Record<string, string | number>>();\r\n const providers = new Set<string>();\r\n\r\n for (const item of dailyCosts) {\r\n providers.add(item.providerName);\r\n if (!byDate.has(item.date)) {\r\n byDate.set(item.date, { date: item.date });\r\n }\r\n const row = byDate.get(item.date)!;\r\n row[item.providerName] = ((row[item.providerName] as number) ?? 0) + item.totalCost;\r\n }\r\n\r\n return {\r\n data: Array.from(byDate.values()).sort((a, b) =>\r\n String(a.date).localeCompare(String(b.date))),\r\n providers: Array.from(providers),\r\n };\r\n }, [dailyCosts]);\r\n\r\n // Daily requests trend: aggregate requests + success per day\r\n const dailyRequestsTrend = useMemo(() => {\r\n const byDate = new Map<string, { date: string; requests: number; success: number; errors: number }>();\r\n\r\n for (const item of dailyCosts) {\r\n const existing = byDate.get(item.date);\r\n if (existing) {\r\n existing.requests += item.requestCount;\r\n existing.success += item.successCount;\r\n existing.errors += item.errorCount;\r\n } else {\r\n byDate.set(item.date, {\r\n date: item.date,\r\n requests: item.requestCount,\r\n success: item.successCount,\r\n errors: item.errorCount,\r\n });\r\n }\r\n }\r\n\r\n return Array.from(byDate.values())\r\n .sort((a, b) => a.date.localeCompare(b.date))\r\n .map(d => ({\r\n ...d,\r\n successRate: d.requests > 0 ? (d.success / d.requests) * 100 : 0,\r\n }));\r\n }, [dailyCosts]);\r\n\r\n // Provider donut: from overview breakdown\r\n const providerDonut = useMemo(() => {\r\n return (overview?.providerBreakdown ?? []).map((p, i) => ({\r\n name: p.providerName,\r\n value: Number(p.totalCost),\r\n color: CHART_COLORS[i % CHART_COLORS.length],\r\n }));\r\n }, [overview]);\r\n\r\n // Model bar chart: top 8 by cost\r\n const modelBars = useMemo(() => {\r\n return [...modelUsage]\r\n .sort((a, b) => b.totalCost - a.totalCost)\r\n .slice(0, 8)\r\n .map(m => ({\r\n name: m.modelName.length > 20 ? m.modelName.slice(0, 18) + '...' : m.modelName,\r\n fullName: m.modelName,\r\n tokens: m.totalTokens,\r\n cost: Number(m.totalCost),\r\n requests: m.requestCount,\r\n latency: Math.round(m.avgLatencyMs),\r\n }));\r\n }, [modelUsage]);\r\n\r\n // Token split: input vs output\r\n const tokenSplit = useMemo(() => {\r\n const input = dailyCosts.reduce((s, d) => s + d.totalInputTokens, 0);\r\n const output = dailyCosts.reduce((s, d) => s + d.totalOutputTokens, 0);\r\n if (input === 0 && output === 0) return [];\r\n return [\r\n { name: t('dashboard.charts.inputTokens'), value: input, color: '#3b82f6' },\r\n { name: t('dashboard.charts.outputTokens'), value: output, color: '#8b5cf6' },\r\n ];\r\n }, [dailyCosts, t]);\r\n\r\n // Cost trend direction\r\n const costTrend = useMemo(() => {\r\n if (dailyCostTrend.data.length < 2) return null;\r\n const mid = Math.floor(dailyCostTrend.data.length / 2);\r\n const firstHalf = dailyCostTrend.data.slice(0, mid);\r\n const secondHalf = dailyCostTrend.data.slice(mid);\r\n\r\n const sumCost = (rows: Record<string, unknown>[]) =>\r\n rows.reduce((total, row) => {\r\n let s = 0;\r\n for (const [k, v] of Object.entries(row)) {\r\n if (k !== 'date' && typeof v === 'number') s += v;\r\n }\r\n return total + s;\r\n }, 0);\r\n\r\n const first = sumCost(firstHalf);\r\n const second = sumCost(secondHalf);\r\n if (first === 0) return null;\r\n return ((second - first) / first) * 100;\r\n }, [dailyCostTrend]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('ai.dashboard', 'Dashboard') },\r\n ]}\r\n />\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)] p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--error-text)] flex-shrink-0\" />\r\n <p className=\"flex-1 text-[var(--error-text)] font-medium\">{error}</p>\r\n <button onClick={handleRefresh} className=\"text-[var(--error-text)] hover:opacity-80\">\r\n <RefreshCw className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Brain className=\"w-6 h-6\" />\r\n {t('dashboard.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('dashboard.subtitle')}</p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <select\r\n value={selectedProvider}\r\n onChange={(e) => setSelectedProvider(e.target.value)}\r\n className=\"input\"\r\n >\r\n <option value=\"\">{t('dashboard.allProviders')}</option>\r\n {providerUsage.map((p) => (\r\n <option key={p.providerId} value={p.providerId}>{p.providerName}</option>\r\n ))}\r\n </select>\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"input\"\r\n >\r\n <option value={7}>{t('dashboard.period.7days')}</option>\r\n <option value={30}>{t('dashboard.period.30days')}</option>\r\n <option value={90}>{t('dashboard.period.90days')}</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n {t('dashboard.refresh')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\r\n <KpiCard\r\n title={t('dashboard.kpis.totalCost')}\r\n value={formatCost(overview?.totalCost ?? 0)}\r\n icon={<DollarSign className=\"w-5 h-5\" />}\r\n color=\"green\"\r\n trend={costTrend}\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.totalTokens')}\r\n value={formatNumber(overview?.totalTokens ?? 0)}\r\n icon={<Zap className=\"w-5 h-5\" />}\r\n color=\"blue\"\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.totalRequests')}\r\n value={formatNumber(overview?.totalRequests ?? 0)}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n color=\"neutral\"\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.successRate')}\r\n value={`${(overview?.successRate ?? 0).toFixed(1)}%`}\r\n icon={<CheckCircle className=\"w-5 h-5\" />}\r\n color={(() => {\r\n const rate = overview?.successRate ?? 0;\r\n if (rate >= 95) return 'green' as const;\r\n if (rate >= 80) return 'yellow' as const;\r\n return 'red' as const;\r\n })()}\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.avgLatency')}\r\n value={`${(overview?.avgLatencyMs ?? 0).toFixed(0)} ms`}\r\n icon={<Clock className=\"w-5 h-5\" />}\r\n color={(() => {\r\n const latency = overview?.avgLatencyMs ?? 0;\r\n if (latency <= 1000) return 'green' as const;\r\n if (latency <= 3000) return 'yellow' as const;\r\n return 'red' as const;\r\n })()}\r\n />\r\n <KpiCard\r\n title={t('dashboard.kpis.activeProviders')}\r\n value={`${overview?.activeProviders ?? 0} / ${overview?.totalProviders ?? 0}`}\r\n icon={<Server className=\"w-5 h-5\" />}\r\n color=\"blue\"\r\n />\r\n </div>\r\n\r\n {/* Row 2: Daily Cost Trend (full width) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <DollarSign className=\"w-5 h-5\" />\r\n {t('dashboard.charts.dailyCosts')}\r\n </h3>\r\n {dailyCostTrend.data.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height={280}>\r\n <AreaChart data={dailyCostTrend.data} margin={{ top: 5, right: 20, bottom: 5, left: 10 }}>\r\n <defs>\r\n {dailyCostTrend.providers.map((name, i) => (\r\n <linearGradient key={name} id={`grad-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\r\n <stop offset=\"5%\" stopColor={CHART_COLORS[i % CHART_COLORS.length]} stopOpacity={0.4} />\r\n <stop offset=\"95%\" stopColor={CHART_COLORS[i % CHART_COLORS.length]} stopOpacity={0.05} />\r\n </linearGradient>\r\n ))}\r\n </defs>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: string) => v.slice(5)}\r\n />\r\n <YAxis\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => `$${v}`}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined) => [formatCost(value ?? 0), undefined]}\r\n labelFormatter={(label: string | number) => String(label)}\r\n />\r\n <Legend />\r\n {dailyCostTrend.providers.map((name, i) => (\r\n <Area\r\n key={name}\r\n type=\"monotone\"\r\n dataKey={name}\r\n stackId=\"1\"\r\n stroke={CHART_COLORS[i % CHART_COLORS.length]}\r\n fill={`url(#grad-${i})`}\r\n strokeWidth={2}\r\n />\r\n ))}\r\n </AreaChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Row 3: Cost Distribution + Model Usage */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Cost Distribution (Donut) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <DollarSign className=\"w-5 h-5\" />\r\n {t('dashboard.charts.costByProvider')}\r\n </h3>\r\n {providerDonut.length > 0 ? (\r\n <div className=\"flex items-center gap-4\">\r\n <ResponsiveContainer width=\"50%\" height={220}>\r\n <PieChart>\r\n <Pie\r\n data={providerDonut}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={55}\r\n outerRadius={90}\r\n paddingAngle={2}\r\n dataKey=\"value\"\r\n >\r\n {providerDonut.map((entry, i) => (\r\n <Cell key={`${entry.name}-${i}`} fill={entry.color} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined) => [formatCost(value ?? 0), undefined]}\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n <div className=\"flex-1 space-y-2\">\r\n {providerDonut.map((p) => (\r\n <div key={p.name} className=\"flex items-center gap-2 text-sm\">\r\n <div className=\"w-3 h-3 rounded-full flex-shrink-0\" style={{ backgroundColor: p.color }} />\r\n <span className=\"flex-1 truncate text-[var(--text-primary)]\">{p.name}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{formatCost(p.value)}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Token Distribution (Donut) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Zap className=\"w-5 h-5\" />\r\n {t('dashboard.charts.tokenDistribution')}\r\n </h3>\r\n {tokenSplit.length > 0 ? (\r\n <div className=\"flex items-center gap-4\">\r\n <ResponsiveContainer width=\"50%\" height={220}>\r\n <PieChart>\r\n <Pie\r\n data={tokenSplit}\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n innerRadius={55}\r\n outerRadius={90}\r\n paddingAngle={2}\r\n dataKey=\"value\"\r\n >\r\n {tokenSplit.map((entry, i) => (\r\n <Cell key={`${entry.name}-${i}`} fill={entry.color} />\r\n ))}\r\n </Pie>\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined) => [formatNumber(value ?? 0), undefined]}\r\n />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n <div className=\"flex-1 space-y-3\">\r\n {tokenSplit.map((entry) => {\r\n const total = tokenSplit.reduce((s, e) => s + e.value, 0);\r\n const pct = total > 0 ? ((entry.value / total) * 100).toFixed(1) : '0';\r\n return (\r\n <div key={entry.name} className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2 text-sm\">\r\n <div className=\"w-3 h-3 rounded-full flex-shrink-0\" style={{ backgroundColor: entry.color }} />\r\n <span className=\"flex-1 text-[var(--text-primary)]\">{entry.name}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{pct}%</span>\r\n </div>\r\n <p className=\"text-xs text-[var(--text-secondary)] ml-5\">{formatNumber(entry.value)} tokens</p>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Row 4: Usage by Model (full width horizontal bar chart) */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Activity className=\"w-5 h-5\" />\r\n {t('dashboard.charts.usageByModel')}\r\n </h3>\r\n {modelBars.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height={Math.max(200, modelBars.length * 44)}>\r\n <BarChart data={modelBars} layout=\"vertical\" margin={{ top: 5, right: 30, bottom: 5, left: 120 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" horizontal={false} />\r\n <XAxis\r\n type=\"number\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => formatNumber(v)}\r\n />\r\n <YAxis\r\n type=\"category\"\r\n dataKey=\"name\"\r\n tick={{ fontSize: 11, fill: 'var(--text-primary)' }}\r\n width={115}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name?: string) => {\r\n const v = value ?? 0;\r\n if (name === 'tokens') return [formatNumber(v), 'Tokens'];\r\n if (name === 'cost') return [formatCost(v), t('dashboard.charts.costLabel')];\r\n return [v, name ?? ''];\r\n }}\r\n labelFormatter={(_: string | number, payload?: readonly { payload?: { fullName?: string } }[]) =>\r\n payload?.[0]?.payload?.fullName ?? String(_)\r\n }\r\n />\r\n <Legend />\r\n <Bar dataKey=\"tokens\" name=\"Tokens\" fill=\"#3b82f6\" radius={[0, 4, 4, 0]} />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Row 5: Daily Requests + Success Rate */}\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Activity className=\"w-5 h-5\" />\r\n {t('dashboard.charts.requestsAndSuccess')}\r\n </h3>\r\n {dailyRequestsTrend.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height={260}>\r\n <ComposedChart data={dailyRequestsTrend} margin={{ top: 5, right: 20, bottom: 5, left: 10 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--border-color)\" />\r\n <XAxis\r\n dataKey=\"date\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: string) => v.slice(5)}\r\n />\r\n <YAxis\r\n yAxisId=\"left\"\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => formatNumber(v)}\r\n />\r\n <YAxis\r\n yAxisId=\"right\"\r\n orientation=\"right\"\r\n domain={[0, 100]}\r\n tick={{ fontSize: 11, fill: 'var(--text-secondary)' }}\r\n tickFormatter={(v: number) => `${v}%`}\r\n />\r\n <Tooltip\r\n contentStyle={{\r\n backgroundColor: 'var(--bg-card)',\r\n border: '1px solid var(--border-color)',\r\n borderRadius: '8px',\r\n color: 'var(--text-primary)',\r\n }}\r\n formatter={(value: number | undefined, name?: string) => {\r\n const v = value ?? 0;\r\n if (name === 'successRate') return [`${v.toFixed(1)}%`, t('dashboard.kpis.successRate')];\r\n if (name === 'errors') return [formatNumber(v), t('dashboard.charts.errors')];\r\n return [formatNumber(v), t('dashboard.charts.requests')];\r\n }}\r\n />\r\n <Legend />\r\n <Bar yAxisId=\"left\" dataKey=\"success\" name={t('dashboard.charts.successRequests')} stackId=\"req\" fill=\"#22c55e\" />\r\n <Bar yAxisId=\"left\" dataKey=\"errors\" name={t('dashboard.charts.errors')} stackId=\"req\" fill=\"#ef4444\" radius={[4, 4, 0, 0]} />\r\n <Line\r\n yAxisId=\"right\"\r\n type=\"monotone\"\r\n dataKey=\"successRate\"\r\n name={t('dashboard.kpis.successRate')}\r\n stroke=\"#f59e0b\"\r\n strokeWidth={2}\r\n dot={false}\r\n />\r\n </ComposedChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <NoDataPlaceholder message={t('dashboard.charts.noData')} />\r\n )}\r\n </div>\r\n\r\n {/* Row 6: Model Performance Table */}\r\n {modelUsage.length > 0 && (\r\n <div className=\"card p-5 border border-[var(--border-color)]\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4 flex items-center gap-2\">\r\n <Clock className=\"w-5 h-5\" />\r\n {t('dashboard.charts.modelPerformance')}\r\n </h3>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.model')}</th>\r\n <th className=\"text-left p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.provider')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.kpis.totalTokens')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.kpis.totalCost')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.requests')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.kpis.avgLatency')}</th>\r\n <th className=\"text-right p-3 font-medium text-[var(--text-secondary)]\">{t('dashboard.charts.costPerRequest')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {[...modelUsage].sort((a, b) => b.totalCost - a.totalCost).map((model) => (\r\n <tr key={`${model.providerId}-${model.modelName}`} className=\"border-b border-[var(--border-color)] hover:bg-[var(--bg-hover)]\">\r\n <td className=\"p-3 font-mono text-[var(--text-primary)]\">{model.modelName}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{model.providerCode}</td>\r\n <td className=\"p-3 text-right font-mono\">{formatNumber(model.totalTokens)}</td>\r\n <td className=\"p-3 text-right font-medium\">{formatCost(model.totalCost)}</td>\r\n <td className=\"p-3 text-right\">{formatNumber(model.requestCount)}</td>\r\n <td className=\"p-3 text-right\">{Math.round(model.avgLatencyMs)} ms</td>\r\n <td className=\"p-3 text-right text-[var(--text-secondary)]\">\r\n {model.requestCount > 0 ? formatCost(model.totalCost / model.requestCount) : '—'}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// --- Sub-components ---\r\n\r\nfunction KpiCard({\r\n title,\r\n value,\r\n icon,\r\n color,\r\n trend,\r\n}: {\r\n title: string;\r\n value: string | number;\r\n icon: React.ReactNode;\r\n color: keyof typeof colorClasses;\r\n trend?: number | null;\r\n}) {\r\n return (\r\n <div className={`card p-4 border ${colorClasses[color]}`}>\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n {trend != null && (\r\n <div className={`flex items-center gap-1 mt-1 text-xs font-medium ${trend > 0 ? 'text-red-500' : 'text-green-500'}`}>\r\n {trend > 0 ? <TrendingUp className=\"w-3 h-3\" /> : <TrendingDown className=\"w-3 h-3\" />}\r\n <span>{Math.abs(trend).toFixed(1)}%</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction NoDataPlaceholder({ message }: { message: string }) {\r\n return (\r\n <div className=\"flex items-center justify-center py-12 text-[var(--text-secondary)]\">\r\n {message}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ntype TFunction = ReturnType<typeof useTranslation>['t'];\r\nimport {\r\n Layers,\r\n Building2,\r\n Key,\r\n CheckCircle,\r\n XCircle,\r\n Trash2,\r\n Plus,\r\n Globe,\r\n BookOpen,\r\n Clock,\r\n AlertCircle,\r\n DollarSign,\r\n Loader2,\r\n Eye,\r\n EyeOff,\r\n KeyRound,\r\n ShieldCheck,\r\n ExternalLink,\r\n Pencil,\r\n Save,\r\n X,\r\n Search,\r\n ToggleLeft,\r\n ToggleRight,\r\n Pin,\r\n PinOff,\r\n} from 'lucide-react';\r\nimport type {\r\n ProviderInstanceListDto,\r\n ProviderInstanceDetailDto,\r\n UpdateProviderInstanceRequest,\r\n ModelListDto,\r\n} from '@/services/api/aiApi';\r\nimport { adminApi } from '@/services/api/adminApi';\r\n\r\nconst formatCurrency = (value: number) =>\r\n new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2 }).format(value);\r\n\r\n// Provider Logo component with error handling\r\nfunction ProviderLogo({\r\n logoUrl,\r\n providerCode,\r\n size = 'md',\r\n}: {\r\n logoUrl: string | null;\r\n providerCode: string;\r\n size?: 'sm' | 'md' | 'lg';\r\n}) {\r\n const [hasError, setHasError] = useState(false);\r\n\r\n const sizeMap = {\r\n sm: { size: 'w-8 h-8 text-sm', img: 'w-8 h-8' },\r\n md: { size: 'w-10 h-10 text-base', img: 'w-10 h-10' },\r\n lg: { size: 'w-12 h-12 text-lg', img: 'w-12 h-12' },\r\n };\r\n\r\n if (!logoUrl || hasError) {\r\n return (\r\n <div className={`${sizeMap[size].size} bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] rounded-lg flex items-center justify-center font-bold text-[var(--color-accent-600)]`}>\r\n {providerCode.charAt(0).toUpperCase()}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <img\r\n src={logoUrl}\r\n alt={providerCode}\r\n className={`${sizeMap[size].img} rounded-lg object-contain`}\r\n onError={() => setHasError(true)}\r\n />\r\n );\r\n}\r\n\r\ninterface AiProfilesTabProps {\r\n readonly instances: ProviderInstanceListDto[];\r\n readonly selectedInstance: ProviderInstanceDetailDto | null;\r\n readonly onSelectInstance: (id: string) => void;\r\n readonly onToggleActive: (id: string) => void;\r\n readonly onDelete: (id: string) => void;\r\n readonly onUpdate: (data: UpdateProviderInstanceRequest) => Promise<void>;\r\n readonly models: ModelListDto[];\r\n readonly onSetApiKey: (key: string) => Promise<void>;\r\n readonly onSetAdminKey: (key: string) => Promise<void>;\r\n readonly providerApiKeyUrl?: string | null;\r\n readonly providerAdminApiKeyUrl?: string | null;\r\n readonly onAddTenant: (tenantId: string) => Promise<void>;\r\n readonly onRemoveTenant: (tenantId: string) => Promise<void>;\r\n readonly onSetAllTenants: (isAllTenants: boolean) => Promise<void>;\r\n readonly onAddPrompt: (promptId: string) => Promise<void>;\r\n readonly onRemovePrompt: (promptId: string) => void;\r\n}\r\n\r\nfunction EmptyInstancesState({ t }: Readonly<{ t: TFunction }>) {\r\n return (\r\n <div className=\"card p-12 text-center\">\r\n <Layers className=\"w-16 h-16 mx-auto mb-4 text-[var(--text-secondary)] opacity-50\" />\r\n <h3 className=\"text-lg font-medium mb-2\">{t('settings.profiles.noInstances')}</h3>\r\n <p className=\"text-[var(--text-secondary)]\">{t('settings.profiles.subtitle')}</p>\r\n </div>\r\n );\r\n}\r\n\r\nfunction NoDetailsState({ t }: Readonly<{ t: TFunction }>) {\r\n return (\r\n <div className=\"card p-12 text-center\">\r\n <Layers className=\"w-16 h-16 mx-auto mb-4 text-[var(--text-secondary)] opacity-50\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('settings.profiles.actions.viewDetails')}</p>\r\n </div>\r\n );\r\n}\r\n\r\ninterface InstanceBadgeProps {\r\n readonly isActive: boolean;\r\n readonly isOverBudget: boolean;\r\n readonly t: TFunction;\r\n}\r\n\r\nconst getActiveBadgeClass = (isActive: boolean): string => {\r\n if (isActive) return 'bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]';\r\n return 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] border border-[var(--border-color)]';\r\n};\r\n\r\nconst getActiveText = (isActive: boolean, t: TFunction): string => {\r\n return isActive ? t('settings.profiles.status.active') : t('settings.profiles.status.inactive');\r\n};\r\n\r\nfunction InstanceBadges({ isActive, isOverBudget, t }: Readonly<InstanceBadgeProps>) {\r\n return (\r\n <div className=\"flex flex-col items-end gap-1\">\r\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${getActiveBadgeClass(isActive)}`}>\r\n {getActiveText(isActive, t)}\r\n </span>\r\n {isOverBudget && (\r\n <span className=\"px-2 py-0.5 rounded text-xs font-medium bg-[var(--error-bg)] text-[var(--error-text)] border border-[var(--error-border)] flex items-center gap-1\">\r\n <AlertCircle className=\"w-3 h-3\" />\r\n {t('settings.profiles.usage.overBudget')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ApiKeyCardProps {\r\n readonly type: 'api' | 'admin';\r\n readonly hasKey: boolean;\r\n readonly onSave: (key: string) => Promise<void>;\r\n readonly placeholder: string;\r\n readonly providerKeyUrl?: string | null;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction getProfileCardBorderClass(editing: boolean, hasKey: boolean): string {\r\n if (editing) return 'border-[var(--color-accent-500)] shadow-[0_0_0_1px_var(--color-accent-500)]';\r\n if (hasKey) return 'border-[var(--success-border)]';\r\n return 'border-[var(--border-color)]';\r\n}\r\n\r\nfunction ApiKeyCard({ type, hasKey, onSave, placeholder, providerKeyUrl, t }: Readonly<ApiKeyCardProps>) {\r\n const [editing, setEditing] = useState(false);\r\n const [value, setValue] = useState('');\r\n const [saving, setSaving] = useState(false);\r\n const [showValue, setShowValue] = useState(false);\r\n\r\n const isApi = type === 'api';\r\n const Icon = isApi ? KeyRound : ShieldCheck;\r\n\r\n const handleSave = async () => {\r\n if (!value.trim()) return;\r\n setSaving(true);\r\n try {\r\n await onSave(value);\r\n setValue('');\r\n setShowValue(false);\r\n setEditing(false);\r\n } catch {\r\n // Error handled by parent\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setValue('');\r\n setShowValue(false);\r\n setEditing(false);\r\n };\r\n\r\n return (\r\n <div className={`relative rounded-[var(--radius-card)] border overflow-hidden transition-all ${\r\n getProfileCardBorderClass(editing, hasKey)\r\n }`}>\r\n {/* Card header */}\r\n <div className={`px-4 py-3 flex items-center justify-between ${\r\n hasKey\r\n ? 'bg-[var(--success-bg)]'\r\n : 'bg-[var(--bg-secondary)]'\r\n }`}>\r\n <div className=\"flex items-center gap-3\">\r\n <div className={`w-9 h-9 rounded-lg flex items-center justify-center ${\r\n hasKey\r\n ? 'bg-[var(--success-dot)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}>\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {isApi ? t('settings.profiles.fields.apiKey') : t('settings.profiles.fields.adminKey')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {hasKey ? t('settings.profiles.status.hasApiKey') : t('settings.profiles.status.noApiKey')}\r\n </p>\r\n </div>\r\n </div>\r\n {hasKey && !editing && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-[var(--success-bg)] text-[var(--success-text)] border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('settings.profiles.status.active')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Card body */}\r\n <div className=\"px-4 py-3 bg-[var(--bg-primary)]\">\r\n {providerKeyUrl && (\r\n <a\r\n href={providerKeyUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"flex items-center gap-1.5 text-xs text-[var(--color-accent-600)] hover:text-[var(--color-accent-700)] mb-3 transition-colors\"\r\n >\r\n <ExternalLink className=\"w-3 h-3\" />\r\n {t('settings.profiles.fields.getKeyFromProvider')}\r\n </a>\r\n )}\r\n {editing ? (\r\n <ApiKeyCardEditing\r\n showValue={showValue}\r\n onShowValueChange={setShowValue}\r\n value={value}\r\n onValueChange={setValue}\r\n placeholder={placeholder}\r\n saving={saving}\r\n onCancel={handleCancel}\r\n onSave={handleSave}\r\n hasKey={hasKey}\r\n isApi={isApi}\r\n t={t}\r\n />\r\n ) : (\r\n <ApiKeyCardDisplay\r\n hasKey={hasKey}\r\n onEdit={() => setEditing(true)}\r\n isApi={isApi}\r\n t={t}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface SearchResult {\r\n id: string;\r\n label: string;\r\n sublabel?: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface InlineSearchPanelProps {\r\n readonly placeholder: string;\r\n readonly onSearch: (query: string) => Promise<SearchResult[]>;\r\n readonly onSelect: (id: string) => Promise<void>;\r\n readonly onClose: () => void;\r\n}\r\n\r\ninterface BudgetGaugeProps {\r\n readonly budget: number | null | undefined;\r\n readonly usage: number;\r\n readonly isOver: boolean;\r\n readonly t: TFunction;\r\n readonly budgetPeriodType?: string | null;\r\n readonly nextResetDate?: string | null;\r\n}\r\n\r\nfunction BudgetGauge({ budget, usage, isOver, t, budgetPeriodType, nextResetDate }: Readonly<BudgetGaugeProps>) {\r\n if (budget == null) {\r\n return (\r\n <div className=\"flex-1 p-6 bg-[var(--bg-primary)] flex flex-col items-center justify-center\">\r\n <DollarSign className=\"w-10 h-10 text-[var(--text-tertiary)] opacity-30 mb-2\" />\r\n <p className=\"text-sm text-[var(--text-tertiary)] italic\">{t('common:notSet', '—')}</p>\r\n </div>\r\n );\r\n }\r\n\r\n const radius = 50;\r\n const circumference = 2 * Math.PI * radius;\r\n const pct = Math.min(100, (usage / budget) * 100);\r\n const strokeOffset = circumference - (circumference * pct) / 100;\r\n const gaugeColor = isOver\r\n ? 'var(--error-dot)'\r\n : pct > 80\r\n ? 'var(--warning-dot)'\r\n : 'var(--success-dot)';\r\n\r\n return (\r\n <div className=\"flex-1 p-4 bg-[var(--bg-primary)] flex flex-col items-center justify-center\">\r\n <div className=\"relative\" style={{ width: 120, height: 120 }}>\r\n <svg viewBox=\"0 0 120 120\" className=\"w-full h-full -rotate-90\">\r\n <circle\r\n cx=\"60\" cy=\"60\" r={radius}\r\n fill=\"none\"\r\n stroke=\"var(--bg-tertiary)\"\r\n strokeWidth=\"9\"\r\n strokeLinecap=\"round\"\r\n />\r\n <circle\r\n cx=\"60\" cy=\"60\" r={radius}\r\n fill=\"none\"\r\n stroke={gaugeColor}\r\n strokeWidth=\"9\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray={circumference}\r\n strokeDashoffset={strokeOffset}\r\n className=\"transition-all duration-700 ease-out\"\r\n />\r\n </svg>\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <span className={`text-xl font-bold ${\r\n isOver ? 'text-[var(--error-text)]' : 'text-[var(--text-primary)]'\r\n }`}>\r\n {Math.round(pct)}%\r\n </span>\r\n <span className=\"text-[10px] text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('settings.profiles.usage.used', 'used')}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full mt-3 space-y-1.5\">\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.currentPeriod')}</span>\r\n <span className={`font-semibold ${isOver ? 'text-[var(--error-text)]' : 'text-[var(--text-primary)]'}`}>\r\n {formatCurrency(usage)}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.fields.budgetLimit')}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">{formatCurrency(budget)}</span>\r\n </div>\r\n <div className=\"h-px bg-[var(--border-color)]\" />\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.remaining', 'Remaining')}</span>\r\n <span className={`font-semibold ${isOver ? 'text-[var(--error-text)]' : 'text-[var(--success-text)]'}`}>\r\n {isOver ? '- ' : ''}{formatCurrency(Math.abs(budget - usage))}\r\n </span>\r\n </div>\r\n {budgetPeriodType && budgetPeriodType !== 'Fixed' && nextResetDate ? (\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.nextReset')}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {new Date(nextResetDate).toLocaleDateString()}\r\n </span>\r\n </div>\r\n ) : budgetPeriodType === 'Fixed' || !budgetPeriodType ? (\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">{t('settings.profiles.usage.nextReset')}</span>\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t('settings.profiles.usage.noAutoReset')}\r\n </span>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ApiKeyCardEditingProps {\r\n readonly showValue: boolean;\r\n readonly onShowValueChange: (show: boolean) => void;\r\n readonly value: string;\r\n readonly onValueChange: (val: string) => void;\r\n readonly placeholder: string;\r\n readonly saving: boolean;\r\n readonly onCancel: () => void;\r\n readonly onSave: () => void;\r\n readonly hasKey: boolean;\r\n readonly isApi: boolean;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ApiKeyCardEditing({\r\n showValue,\r\n onShowValueChange,\r\n value,\r\n onValueChange,\r\n placeholder,\r\n saving,\r\n onCancel,\r\n onSave,\r\n hasKey,\r\n isApi: _isApi,\r\n t,\r\n}: Readonly<ApiKeyCardEditingProps>) {\r\n return (\r\n <div className=\"space-y-3\">\r\n <div className=\"relative\">\r\n <input\r\n type={showValue ? 'text' : 'password'}\r\n value={value}\r\n onChange={(e) => onValueChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"input w-full pr-10 font-mono text-sm\"\r\n autoFocus\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' && value.trim()) onSave();\r\n if (e.key === 'Escape') onCancel();\r\n }}\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => onShowValueChange(!showValue)}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 rounded-md text-[var(--text-tertiary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition-colors\"\r\n tabIndex={-1}\r\n >\r\n {showValue ? <EyeOff className=\"w-4 h-4\" /> : <Eye className=\"w-4 h-4\" />}\r\n </button>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-2\">\r\n <button\r\n onClick={onCancel}\r\n disabled={saving}\r\n className=\"btn btn-ghost btn-sm\"\r\n >\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={onSave}\r\n disabled={!value.trim() || saving}\r\n className=\"btn btn-primary btn-sm disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {saving && <Loader2 className=\"w-4 h-4 animate-spin\" />}\r\n {hasKey ? t('settings.profiles.actions.changeKey') : t('common:save')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ApiKeyCardDisplayProps {\r\n readonly hasKey: boolean;\r\n readonly onEdit: () => void;\r\n readonly isApi: boolean;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction ApiKeyCardDisplay({\r\n hasKey,\r\n onEdit,\r\n isApi,\r\n t,\r\n}: Readonly<ApiKeyCardDisplayProps>) {\r\n return (\r\n <button\r\n onClick={onEdit}\r\n className=\"w-full group flex items-center justify-between py-1 text-left\"\r\n >\r\n {hasKey ? (\r\n <>\r\n <span className=\"font-mono text-sm text-[var(--text-tertiary)] tracking-widest\">{'•'.repeat(24)}</span>\r\n <span className=\"text-xs font-medium text-[var(--color-accent-600)] group-hover:text-[var(--color-accent-700)] transition-colors\">\r\n {t('settings.profiles.actions.changeKey')}\r\n </span>\r\n </>\r\n ) : (\r\n <span className=\"flex items-center gap-2 text-sm text-[var(--text-secondary)] group-hover:text-[var(--color-accent-600)] transition-colors\">\r\n <Plus className=\"w-4 h-4\" />\r\n {isApi ? t('settings.profiles.actions.setApiKey') : t('settings.profiles.actions.setAdminKey')}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\ninterface InstanceListItemProps {\r\n readonly instance: ProviderInstanceListDto;\r\n readonly isSelected: boolean;\r\n readonly onSelect: (id: string) => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction InstanceListItem({ instance, isSelected, onSelect, t }: Readonly<InstanceListItemProps>) {\r\n return (\r\n <button\r\n onClick={() => onSelect(instance.id)}\r\n className={`w-full text-left p-4 rounded-lg border transition-all ${\r\n isSelected\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 shadow-sm'\r\n : 'border-[var(--border-color)] bg-[var(--bg-primary)] hover:border-[var(--color-accent-300)] hover:shadow-sm'\r\n }`}\r\n >\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <ProviderLogo\r\n logoUrl={instance.providerLogoUrl}\r\n providerCode={instance.providerCode}\r\n size=\"sm\"\r\n />\r\n <div>\r\n <h4 className=\"font-medium\">{instance.name}</h4>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {instance.providerName}\r\n </p>\r\n </div>\r\n </div>\r\n <InstanceBadges isActive={instance.isActive} isOverBudget={instance.isOverBudget} t={t} />\r\n </div>\r\n\r\n <div className=\"mt-3 flex flex-wrap gap-2 text-xs text-[var(--text-secondary)]\">\r\n {instance.department && (\r\n <span className=\"flex items-center gap-1 bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n <Building2 className=\"w-3 h-3\" />\r\n {instance.department}\r\n </span>\r\n )}\r\n {instance.hasApiKey && (\r\n <span className=\"flex items-center gap-1 bg-[var(--success-bg)] text-[var(--success-text)] px-2 py-1 rounded\">\r\n <Key className=\"w-3 h-3\" />\r\n API\r\n </span>\r\n )}\r\n {instance.isAllTenants ? (\r\n <span className=\"flex items-center gap-1 bg-[var(--success-bg)] text-[var(--success-text)] px-2 py-1 rounded\">\r\n <Globe className=\"w-3 h-3\" />\r\n {t('settings.profiles.allTenants')}\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center gap-1 bg-[var(--bg-secondary)] px-2 py-1 rounded\">\r\n <Building2 className=\"w-3 h-3\" />\r\n {t('settings.profiles.tenantCount', { count: instance.tenantCount })}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {instance.budgetLimit && (\r\n <div className=\"mt-3\">\r\n <div className=\"flex justify-between text-xs mb-1\">\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {t('settings.profiles.usage.budget')}\r\n </span>\r\n <span\r\n className={instance.isOverBudget ? 'text-[var(--error-text)]' : ''}\r\n >\r\n {formatCurrency(instance.currentPeriodUsage)} / {formatCurrency(instance.budgetLimit)}\r\n </span>\r\n </div>\r\n <div className=\"h-1.5 bg-[var(--bg-secondary)] rounded-full overflow-hidden\">\r\n <div\r\n className={`h-full rounded-full transition-all ${\r\n instance.isOverBudget\r\n ? 'bg-[var(--error-dot)]'\r\n : 'bg-[var(--color-accent-500)]'\r\n }`}\r\n style={{\r\n width: `${Math.min(100, (instance.currentPeriodUsage / instance.budgetLimit) * 100)}%`,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\nfunction InlineSearchPanel({ placeholder, onSearch, onSelect, onClose }: Readonly<InlineSearchPanelProps>) {\r\n const [query, setQuery] = useState('');\r\n const [results, setResults] = useState<SearchResult[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [adding, setAdding] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (query.length < 2) {\r\n setResults([]);\r\n return;\r\n }\r\n const timer = setTimeout(async () => {\r\n setLoading(true);\r\n try {\r\n const items = await onSearch(query);\r\n setResults(items);\r\n } catch {\r\n setResults([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, 300);\r\n return () => clearTimeout(timer);\r\n }, [query, onSearch]);\r\n\r\n const handleSelect = async (id: string) => {\r\n setAdding(id);\r\n try {\r\n await onSelect(id);\r\n onClose();\r\n } catch {\r\n // keep panel open on error\r\n } finally {\r\n setAdding(null);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"p-3 border-t border-[var(--border-color)] bg-[var(--bg-primary)]\">\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={query}\r\n onChange={(e) => setQuery(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"w-full pl-9 pr-8 py-2 text-sm border border-[var(--border-color)] bg-[var(--bg-card)] text-[var(--text-primary)] rounded-[var(--radius-input)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n autoFocus\r\n />\r\n <button\r\n onClick={onClose}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n {loading && (\r\n <div className=\"flex items-center justify-center py-3\">\r\n <Loader2 className=\"w-4 h-4 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && results.length > 0 && (\r\n <div className=\"mt-2 max-h-48 overflow-y-auto space-y-1\">\r\n {results.map((result) => (\r\n <button\r\n key={result.id}\r\n onClick={() => handleSelect(result.id)}\r\n disabled={adding === result.id}\r\n className=\"w-full flex items-center gap-2.5 p-2 rounded-md text-left hover:bg-[var(--bg-hover)] transition-colors disabled:opacity-50\"\r\n >\r\n {result.icon || (\r\n <div className=\"w-7 h-7 rounded-md bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <Building2 className=\"w-3.5 h-3.5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"text-sm font-medium text-[var(--text-primary)] truncate\">{result.label}</div>\r\n {result.sublabel && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">{result.sublabel}</div>\r\n )}\r\n </div>\r\n {adding === result.id && <Loader2 className=\"w-4 h-4 animate-spin text-[var(--color-accent-500)]\" />}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n {!loading && query.length >= 2 && results.length === 0 && (\r\n <p className=\"text-xs text-[var(--text-secondary)] text-center py-3\">\r\n {query.length >= 2 ? 'No results found' : ''}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport function AiProfilesTab({\r\n instances,\r\n selectedInstance,\r\n onSelectInstance,\r\n onToggleActive,\r\n onDelete,\r\n onUpdate,\r\n models,\r\n onSetApiKey,\r\n onSetAdminKey,\r\n providerApiKeyUrl,\r\n providerAdminApiKeyUrl,\r\n onAddTenant,\r\n onRemoveTenant,\r\n onSetAllTenants,\r\n onAddPrompt,\r\n onRemovePrompt,\r\n}: AiProfilesTabProps): ReactElement {\r\n const { t } = useTranslation('ai');\r\n\r\n // Inline edit state\r\n const [editing, setEditing] = useState(false);\r\n const [editForm, setEditForm] = useState<UpdateProviderInstanceRequest>({ name: '' });\r\n const [saving, setSaving] = useState(false);\r\n\r\n // Search panels state\r\n const [showTenantSearch, setShowTenantSearch] = useState(false);\r\n const [showPromptSearch, setShowPromptSearch] = useState(false);\r\n const [togglingAllTenants, setTogglingAllTenants] = useState(false);\r\n\r\n const startEditing = useCallback(() => {\r\n if (!selectedInstance) return;\r\n setEditForm({\r\n name: selectedInstance.name,\r\n description: selectedInstance.description || '',\r\n systemContext: selectedInstance.systemContext || '',\r\n department: selectedInstance.department || '',\r\n costCenter: selectedInstance.costCenter || '',\r\n defaultModel: selectedInstance.defaultModel || '',\r\n maxTokensPerRequest: selectedInstance.maxTokensPerRequest || undefined,\r\n budgetLimit: selectedInstance.budgetLimit || undefined,\r\n budgetPeriodType: selectedInstance.budgetPeriodType || undefined,\r\n budgetPeriodStart: selectedInstance.budgetPeriodStart || undefined,\r\n });\r\n setEditing(true);\r\n }, [selectedInstance]);\r\n\r\n const cancelEditing = useCallback(() => {\r\n setEditing(false);\r\n setEditForm({ name: '' });\r\n }, []);\r\n\r\n const handleSaveEdit = useCallback(async () => {\r\n if (!editForm.name.trim()) return;\r\n setSaving(true);\r\n try {\r\n await onUpdate(editForm);\r\n setEditing(false);\r\n } catch {\r\n // Error handled by parent\r\n } finally {\r\n setSaving(false);\r\n }\r\n }, [editForm, onUpdate]);\r\n\r\n const searchTenants = useCallback(async (query: string): Promise<SearchResult[]> => {\r\n const result = await adminApi.tenants.getAll({ search: query, pageSize: 10 });\r\n const existingIds = new Set(selectedInstance?.tenants?.map(t => t.tenantId) || []);\r\n return result.items\r\n .filter(t => !existingIds.has(t.id))\r\n .map(t => ({\r\n id: t.id,\r\n label: t.name,\r\n sublabel: t.slug || undefined,\r\n }));\r\n }, [selectedInstance]);\r\n\r\n const searchPrompts = useCallback(async (query: string): Promise<SearchResult[]> => {\r\n const { aiApi } = await import('@/services/api/aiApi');\r\n const prompts = await aiApi.skills.getAll();\r\n const existingIds = new Set(selectedInstance?.skills?.map(p => p.skillId) || []);\r\n return prompts\r\n .filter((p: any) => !existingIds.has(p.id) && (p.name.toLowerCase().includes(query.toLowerCase()) || p.code.toLowerCase().includes(query.toLowerCase())))\r\n .slice(0, 10)\r\n .map((p: any) => ({\r\n id: p.id,\r\n label: p.name,\r\n sublabel: `${p.code} (v${p.version})`,\r\n }));\r\n }, [selectedInstance]);\r\n\r\n // Cancel editing when selected instance changes\r\n useEffect(() => {\r\n setEditing(false);\r\n }, [selectedInstance?.id]);\r\n\r\n const handleToggleAllTenants = useCallback(async () => {\r\n if (!selectedInstance) return;\r\n setTogglingAllTenants(true);\r\n try {\r\n await onSetAllTenants(!selectedInstance.isAllTenants);\r\n } catch {\r\n // Error handled by parent\r\n } finally {\r\n setTogglingAllTenants(false);\r\n }\r\n }, [selectedInstance, onSetAllTenants]);\r\n\r\n if (instances.length === 0) {\r\n return <EmptyInstancesState t={t} />;\r\n }\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* Instances List */}\r\n <div className=\"lg:col-span-1 space-y-3\">\r\n {instances.map((instance) => (\r\n <InstanceListItem\r\n key={instance.id}\r\n instance={instance}\r\n isSelected={selectedInstance?.id === instance.id}\r\n onSelect={onSelectInstance}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Instance Details */}\r\n <div className=\"lg:col-span-2\">\r\n {selectedInstance ? (\r\n <div className=\"card p-6 space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-4\">\r\n <ProviderLogo\r\n logoUrl={selectedInstance.providerLogoUrl}\r\n providerCode={selectedInstance.providerCode}\r\n size=\"lg\"\r\n />\r\n <div>\r\n <h3 className=\"text-xl font-semibold\">\r\n {editing ? t('settings.profiles.editTitle') : selectedInstance.name}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {selectedInstance.providerName} -{' '}\r\n <code className=\"text-xs\">{selectedInstance.code}</code>\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {editing ? (\r\n <>\r\n <button\r\n onClick={cancelEditing}\r\n disabled={saving}\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleSaveEdit}\r\n disabled={!editForm.name.trim() || saving}\r\n className=\"btn btn-primary btn-sm disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common:save')}\r\n </button>\r\n </>\r\n ) : (\r\n <>\r\n {selectedInstance.providerDocumentationUrl && (\r\n <a\r\n href={selectedInstance.providerDocumentationUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n <BookOpen className=\"w-4 h-4\" />\r\n {t('settings.profiles.metadata.docs')}\r\n </a>\r\n )}\r\n <button onClick={startEditing} className=\"btn btn-secondary btn-sm\">\r\n <Pencil className=\"w-4 h-4\" />\r\n {t('settings.profiles.actions.edit')}\r\n </button>\r\n <button\r\n onClick={() => onToggleActive(selectedInstance.id)}\r\n className={`btn btn-sm ${selectedInstance.isActive ? 'btn-secondary' : 'btn-primary'}`}\r\n title={t('settings.profiles.actions.toggleActive')}\r\n >\r\n {selectedInstance.isActive ? (\r\n <XCircle className=\"w-4 h-4\" />\r\n ) : (\r\n <CheckCircle className=\"w-4 h-4\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => onDelete(selectedInstance.id)}\r\n className=\"btn btn-sm text-[var(--error-text)] hover:bg-[var(--error-bg)]\"\r\n title={t('settings.profiles.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {editing ? (\r\n /* Inline Edit Form */\r\n <div className=\"space-y-4 bg-[var(--bg-secondary)] rounded-lg p-5 border border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n {/* Name */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.name')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.name}\r\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\r\n placeholder={t('settings.profiles.fields.namePlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n {/* Description */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.description')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.description || ''}\r\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.descriptionPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n {/* Department + Cost Center row */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.department')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.department || ''}\r\n onChange={(e) => setEditForm({ ...editForm, department: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.departmentPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.costCenter')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={editForm.costCenter || ''}\r\n onChange={(e) => setEditForm({ ...editForm, costCenter: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.costCenterPlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Default Model + Max Tokens row */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.defaultModel')}\r\n </label>\r\n <p className=\"text-xs text-[var(--text-muted)] mb-2\">\r\n {t('settings.profiles.fields.modelFamilyDescription')}\r\n </p>\r\n {(() => {\r\n const providerModels = models.filter(\r\n (m) => m.providerId === selectedInstance.providerId && m.modelFamily\r\n );\r\n const familyGroups = new Map<string, typeof models>();\r\n providerModels.forEach((m) => {\r\n const family = m.modelFamily!;\r\n if (!familyGroups.has(family)) familyGroups.set(family, []);\r\n familyGroups.get(family)!.push(m);\r\n });\r\n familyGroups.forEach((fModels) =>\r\n fModels.sort((a, b) => {\r\n const da = a.deprecationDate ? new Date(a.deprecationDate).getTime() : 0;\r\n const db = b.deprecationDate ? new Date(b.deprecationDate).getTime() : 0;\r\n return db - da || (a.inputCostPerMillionTokens > b.inputCostPerMillionTokens ? -1 : 1);\r\n })\r\n );\r\n\r\n const currentValue = editForm.defaultModel ?? '';\r\n const isFamily = familyGroups.has(currentValue);\r\n const isPinned = !isFamily && !!currentValue;\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <select\r\n value={isFamily ? currentValue : isPinned ? '__pinned__' : ''}\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n if (val === '__pinned__') return;\r\n setEditForm({ ...editForm, defaultModel: val || undefined });\r\n }}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('settings.profiles.fields.defaultModelPlaceholder')}</option>\r\n {Array.from(familyGroups.entries()).map(([family, fModels]) => {\r\n const latest = fModels[0];\r\n const minInput = Math.min(...fModels.map((m) => m.inputCostPerMillionTokens));\r\n const maxOutput = Math.max(...fModels.map((m) => m.outputCostPerMillionTokens));\r\n return (\r\n <option key={family} value={family}>\r\n {family.charAt(0).toUpperCase() + family.slice(1)} — {t('settings.profiles.fields.latestVersion', { modelName: latest.name })} (${minInput}/${maxOutput} {t('settings.models.perMillionTokens')}) — {t('settings.profiles.fields.familyModels', { count: fModels.length })}\r\n </option>\r\n );\r\n })}\r\n {isPinned && (\r\n <option value=\"__pinned__\" disabled>\r\n ✦ {t('settings.profiles.fields.pinVersion')}: {models.find((m) => m.code === currentValue)?.name ?? currentValue}\r\n </option>\r\n )}\r\n </select>\r\n\r\n {/* Pin specific version toggle */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (isPinned) {\r\n // Unpin: find family of current model and set family\r\n const currentModel = models.find((m) => m.code === currentValue);\r\n const family = currentModel?.modelFamily;\r\n setEditForm({ ...editForm, defaultModel: family || undefined });\r\n } else if (isFamily) {\r\n // Pin: set to latest model code in family\r\n const fModels = familyGroups.get(currentValue);\r\n if (fModels && fModels.length > 0) {\r\n setEditForm({ ...editForm, defaultModel: fModels[0].code });\r\n }\r\n }\r\n }}\r\n className={`flex items-center gap-1.5 text-xs px-2 py-1 rounded transition-colors ${\r\n isPinned\r\n ? 'bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-muted)] border border-[var(--border-color)] hover:border-[var(--text-muted)]'\r\n }`}\r\n disabled={!currentValue}\r\n >\r\n {isPinned ? <Pin className=\"w-3 h-3\" /> : <PinOff className=\"w-3 h-3\" />}\r\n {isPinned ? t('settings.profiles.fields.pinVersion') : t('settings.profiles.fields.latestVersion', { modelName: '' }).replace(': ', '')}\r\n </button>\r\n </div>\r\n\r\n {/* Pinned version picker */}\r\n {isPinned && (\r\n <select\r\n value={currentValue}\r\n onChange={(e) => setEditForm({ ...editForm, defaultModel: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n >\r\n {models\r\n .filter((m) => m.providerId === selectedInstance.providerId)\r\n .map((model) => (\r\n <option key={model.id} value={model.code}>\r\n {model.name} {model.modelFamily ? `(${model.modelFamily})` : ''}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.maxTokensPerRequest')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={editForm.maxTokensPerRequest ?? ''}\r\n onChange={(e) => setEditForm({ ...editForm, maxTokensPerRequest: e.target.value ? Number(e.target.value) : undefined })}\r\n placeholder={t('settings.profiles.fields.maxTokensPerRequestPlaceholder', 'e.g. 4096')}\r\n className=\"input w-full\"\r\n min={0}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Budget Limit */}\r\n <div className=\"md:w-1/2\">\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.budgetLimit')}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={editForm.budgetLimit ?? ''}\r\n onChange={(e) => setEditForm({ ...editForm, budgetLimit: e.target.value ? Number(e.target.value) : undefined })}\r\n placeholder={t('settings.profiles.fields.budgetLimitPlaceholder', 'e.g. 100.00')}\r\n className=\"input w-full\"\r\n min={0}\r\n step={0.01}\r\n />\r\n </div>\r\n\r\n {/* Budget Period Type + Budget Period Start row */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.budgetPeriodType')}\r\n </label>\r\n <select\r\n value={editForm.budgetPeriodType || ''}\r\n onChange={(e) => setEditForm({ ...editForm, budgetPeriodType: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">Select period type</option>\r\n <option value=\"Monthly\">Monthly</option>\r\n <option value=\"Quarterly\">Quarterly</option>\r\n <option value=\"Annual\">Annual</option>\r\n <option value=\"Fixed\">Fixed</option>\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.budgetPeriodStart')}\r\n </label>\r\n <input\r\n type=\"date\"\r\n value={editForm.budgetPeriodStart || ''}\r\n onChange={(e) => setEditForm({ ...editForm, budgetPeriodStart: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* System Context */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-primary)] mb-1\">\r\n {t('settings.profiles.fields.systemContext')}\r\n </label>\r\n <textarea\r\n value={editForm.systemContext || ''}\r\n onChange={(e) => setEditForm({ ...editForm, systemContext: e.target.value || undefined })}\r\n placeholder={t('settings.profiles.fields.systemContextPlaceholder', 'Enter system instructions...')}\r\n className=\"input w-full font-mono text-sm min-h-[120px] resize-y\"\r\n rows={5}\r\n />\r\n </div>\r\n </div>\r\n ) : (\r\n /* Read-only display */\r\n <>\r\n {/* Description */}\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {selectedInstance.description || <span className=\"italic\">{t('common:notSet', '—')}</span>}\r\n </p>\r\n\r\n {/* Info + Budget — 2 column layout */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-5 gap-4\">\r\n {/* Left — Info cards + System Context */}\r\n <div className=\"lg:col-span-3 flex flex-col gap-3\">\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-secondary)] mb-1\">\r\n <Building2 className=\"w-3 h-3\" />\r\n {t('settings.profiles.fields.department')}\r\n </div>\r\n <div className=\"font-medium\">\r\n {selectedInstance.department || <span className=\"text-[var(--text-tertiary)]\">—</span>}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-secondary)] mb-1\">\r\n <DollarSign className=\"w-3 h-3\" />\r\n {t('settings.profiles.fields.costCenter')}\r\n </div>\r\n <div className=\"font-medium\">\r\n {selectedInstance.costCenter || <span className=\"text-[var(--text-tertiary)]\">—</span>}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('settings.profiles.fields.defaultModel')}\r\n </div>\r\n <div className=\"font-medium font-mono text-sm\">\r\n {selectedInstance.defaultModel || <span className=\"text-[var(--text-tertiary)] font-sans\">—</span>}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('settings.profiles.fields.maxTokensPerRequest')}\r\n </div>\r\n <div className=\"font-medium\">\r\n {selectedInstance.maxTokensPerRequest\r\n ? selectedInstance.maxTokensPerRequest.toLocaleString()\r\n : <span className=\"text-[var(--text-tertiary)]\">—</span>}\r\n </div>\r\n </div>\r\n </div>\r\n {/* System Context */}\r\n <div className=\"flex-1 flex flex-col min-h-0\">\r\n <h4 className=\"font-medium mb-1.5 text-sm\">\r\n {t('settings.profiles.fields.systemContext')}\r\n </h4>\r\n {selectedInstance.systemContext ? (\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg text-sm font-mono whitespace-pre-wrap overflow-y-auto flex-1\">\r\n {selectedInstance.systemContext}\r\n </div>\r\n ) : (\r\n <div className=\"bg-[var(--bg-secondary)] p-3 rounded-lg text-sm text-[var(--text-tertiary)] italic flex-1 flex items-center justify-center\">\r\n —\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right — Budget Gauge */}\r\n <div className={`lg:col-span-2 rounded-[var(--radius-card)] border overflow-hidden flex flex-col ${\r\n selectedInstance.isOverBudget ? 'border-[var(--error-border)]' : 'border-[var(--border-color)]'\r\n }`}>\r\n <div className={`px-4 py-2.5 flex items-center gap-2 text-sm font-medium ${\r\n selectedInstance.isOverBudget ? 'bg-[var(--error-bg)] text-[var(--error-text)]' : 'bg-[var(--bg-secondary)] text-[var(--text-primary)]'\r\n }`}>\r\n <DollarSign className=\"w-4 h-4\" />\r\n {t('settings.profiles.usage.budget')}\r\n {selectedInstance.isOverBudget && (\r\n <span className=\"ml-auto flex items-center gap-1 text-xs font-medium\">\r\n <AlertCircle className=\"w-3.5 h-3.5\" />\r\n {t('settings.profiles.usage.overBudget')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n <BudgetGauge\r\n budget={selectedInstance.budgetLimit}\r\n usage={selectedInstance.currentPeriodUsage}\r\n isOver={selectedInstance.isOverBudget}\r\n t={t}\r\n budgetPeriodType={selectedInstance.budgetPeriodType}\r\n nextResetDate={selectedInstance.nextResetDate}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* API Keys Section */}\r\n <div>\r\n <h4 className=\"font-medium mb-3 flex items-center gap-2\">\r\n <Key className=\"w-4 h-4\" />\r\n {t('settings.profiles.fields.apiKeys')}\r\n </h4>\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\">\r\n <ApiKeyCard\r\n type=\"api\"\r\n hasKey={selectedInstance.hasApiKey}\r\n onSave={onSetApiKey}\r\n placeholder={t('settings.profiles.fields.apiKeyPlaceholder')}\r\n providerKeyUrl={providerApiKeyUrl}\r\n t={t}\r\n />\r\n <ApiKeyCard\r\n type=\"admin\"\r\n hasKey={selectedInstance.hasAdminKey}\r\n onSave={onSetAdminKey}\r\n placeholder={t('settings.profiles.fields.adminKeyPlaceholder')}\r\n providerKeyUrl={providerAdminApiKeyUrl}\r\n t={t}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Tenant Access Section */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h4 className=\"font-medium flex items-center gap-2\">\r\n <Building2 className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n {t('settings.profiles.tenantAccess')}\r\n </h4>\r\n </div>\r\n\r\n {/* All Tenants Toggle */}\r\n <div className=\"flex items-center justify-between p-4 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]\">\r\n <div>\r\n <p className=\"text-sm font-medium text-[var(--text-primary)]\">\r\n {t('settings.profiles.allTenants')}\r\n </p>\r\n <p className=\"text-xs text-[var(--text-secondary)] mt-0.5\">\r\n {t('settings.profiles.allTenantsDescription')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={handleToggleAllTenants}\r\n disabled={togglingAllTenants}\r\n className=\"flex-shrink-0 transition-colors\"\r\n title={t('settings.profiles.allTenants')}\r\n >\r\n {togglingAllTenants && (\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n )}\r\n {!togglingAllTenants && selectedInstance.isAllTenants && (\r\n <ToggleRight className=\"w-10 h-10 text-[var(--success-dot)]\" />\r\n )}\r\n {!togglingAllTenants && !selectedInstance.isAllTenants && (\r\n <ToggleLeft className=\"w-10 h-10 text-[var(--text-tertiary)]\" />\r\n )}\r\n </button>\r\n </div>\r\n\r\n {/* Individual Tenant List (only shown when not isAllTenants) */}\r\n {!selectedInstance.isAllTenants && (\r\n <div className=\"bg-[var(--bg-secondary)] rounded-[var(--radius-card)] overflow-hidden\">\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-[var(--bg-tertiary)]\">\r\n <h5 className=\"text-sm font-medium text-[var(--text-primary)] flex items-center gap-2\">\r\n <Building2 className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n {t('settings.profiles.tenantCount', { count: selectedInstance.tenants?.length ?? 0 })}\r\n </h5>\r\n <button\r\n onClick={() => setShowTenantSearch(!showTenantSearch)}\r\n className=\"p-1.5 rounded-md hover:bg-[var(--bg-primary)] text-[var(--color-accent-500)] transition-colors\"\r\n title={t('settings.profiles.addTenant')}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n {showTenantSearch && (\r\n <InlineSearchPanel\r\n placeholder={t('settings.profiles.addTenant')}\r\n onSearch={searchTenants}\r\n onSelect={async (id) => { await onAddTenant(id); }}\r\n onClose={() => setShowTenantSearch(false)}\r\n />\r\n )}\r\n <div className=\"p-3\">\r\n {(selectedInstance.tenants?.length ?? 0) > 0 ? (\r\n <div className=\"space-y-2\">\r\n {selectedInstance.tenants.map((tenant) => (\r\n <div\r\n key={tenant.id}\r\n className=\"group flex items-center gap-3 p-2.5 rounded-lg bg-[var(--bg-primary)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <div className=\"w-8 h-8 rounded-md bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <Building2 className=\"w-4 h-4 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)] truncate\">\r\n {tenant.tenantName}\r\n </div>\r\n {tenant.tenantSlug && (\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">\r\n {tenant.tenantSlug}\r\n </div>\r\n )}\r\n </div>\r\n <button\r\n onClick={() => onRemoveTenant(tenant.tenantId)}\r\n className=\"p-1.5 rounded-md text-[var(--text-secondary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] opacity-0 group-hover:opacity-100 transition-all\"\r\n title={t('settings.profiles.removeTenant')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-4\">\r\n <Building2 className=\"w-7 h-7 mx-auto text-[var(--text-tertiary)] mb-1.5\" />\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.profiles.noTenants')}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Prompts Section */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h4 className=\"font-medium flex items-center gap-2\">\r\n <BookOpen className=\"w-4 h-4 text-[var(--color-accent-500)]\" />\r\n {t('settings.profiles.prompts.title')}\r\n </h4>\r\n <button\r\n onClick={() => setShowPromptSearch(!showPromptSearch)}\r\n className=\"p-1.5 rounded-md hover:bg-[var(--bg-tertiary)] text-[var(--color-accent-500)] transition-colors\"\r\n title={t('settings.profiles.prompts.addPrompt')}\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n {showPromptSearch && (\r\n <InlineSearchPanel\r\n placeholder={t('settings.profiles.prompts.addPrompt')}\r\n onSearch={searchPrompts}\r\n onSelect={async (id) => { await onAddPrompt(id); }}\r\n onClose={() => setShowPromptSearch(false)}\r\n />\r\n )}\r\n\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg overflow-hidden\">\r\n <div className=\"p-3 min-h-[100px]\">\r\n {selectedInstance?.skills && selectedInstance.skills.length > 0 ? (\r\n <div className=\"space-y-2\">\r\n {selectedInstance.skills.map((skill) => (\r\n <div\r\n key={skill.id}\r\n className=\"group flex items-center gap-3 p-2.5 rounded-lg bg-[var(--bg-primary)] hover:bg-[var(--bg-tertiary)] transition-colors\"\r\n >\r\n <div className=\"w-8 h-8 rounded-md bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] flex items-center justify-center flex-shrink-0\">\r\n <BookOpen className=\"w-4 h-4 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"font-medium text-sm text-[var(--text-primary)] truncate\">\r\n {skill.skillName}\r\n </div>\r\n <div className=\"text-xs text-[var(--text-secondary)] truncate\">\r\n {skill.skillCode} <span className=\"text-xs opacity-75\">v{skill.skillVersion}</span>\r\n </div>\r\n </div>\r\n <span className=\"text-xs px-2 py-1 rounded bg-[var(--bg-secondary)] text-[var(--text-secondary)] whitespace-nowrap\">\r\n {skill.skillStatus}\r\n </span>\r\n <button\r\n onClick={() => onRemovePrompt(skill.skillId)}\r\n className=\"p-1.5 rounded-md text-[var(--text-secondary)] hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 opacity-0 group-hover:opacity-100 transition-all\"\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n <p className=\"text-sm text-[var(--text-secondary)] text-center py-6\">\r\n {t('settings.profiles.prompts.noPrompts')}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Metadata */}\r\n <div className=\"text-xs text-[var(--text-secondary)] flex items-center gap-4 pt-4 border-t border-[var(--border-color)]\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.profiles.metadata.created')}: {new Date(selectedInstance.createdAt).toLocaleDateString()}\r\n {selectedInstance.createdBy && ` ${t('settings.profiles.metadata.by')} ${selectedInstance.createdBy}`}\r\n </span>\r\n {selectedInstance.updatedAt && (\r\n <span>\r\n {t('settings.profiles.metadata.updated')}:{' '}\r\n {new Date(selectedInstance.updatedAt).toLocaleDateString()}\r\n {selectedInstance.updatedBy &&\r\n ` ${t('settings.profiles.metadata.by')} ${selectedInstance.updatedBy}`}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <NoDetailsState t={t} />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Shield } from 'lucide-react';\r\nimport { ProviderCard } from '@/components/ui/EntityCard';\r\nimport type { ProviderListDto } from '@/services/api/aiApi';\r\n\r\ninterface AiProvidersTabProps {\r\n readonly providers: ProviderListDto[];\r\n}\r\n\r\nexport function AiProvidersTab({ providers }: AiProvidersTabProps): ReactElement {\r\n const { t } = useTranslation('ai');\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('settings.providers.subtitle')}\r\n </p>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4\">\r\n {providers.map((provider) => (\r\n <ProviderCard\r\n key={provider.id}\r\n name={provider.name}\r\n code={provider.code}\r\n description={provider.description || ''}\r\n modelCount={provider.modelCount}\r\n color=\"var(--color-accent-500)\"\r\n websiteUrl={provider.websiteUrl ?? undefined}\r\n docsUrl={provider.documentationUrl ?? undefined}\r\n apiKeyUrl={provider.apiKeyUrl ?? undefined}\r\n adminApiKeyUrl={provider.adminApiKeyUrl ?? undefined}\r\n hasAdminKey={provider.supportsAdminApi}\r\n badgeIcon={provider.supportsAdminApi ? Shield : undefined}\r\n badgeTooltip={\r\n provider.supportsAdminApi\r\n ? t('settings.providers.adminApiSupported')\r\n : undefined\r\n }\r\n labels={{\r\n websiteLabel: t('settings.providers.officialSite'),\r\n docsLabel: t('settings.providers.apiDocumentation'),\r\n apiKeyLabel: t('settings.providers.getApiKey'),\r\n adminApiKeyLabel: t('settings.providers.getAdminApiKey'),\r\n modelsLabel: t('settings.providers.models'),\r\n }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Eye,\r\n ImagePlus,\r\n Mic,\r\n Volume2,\r\n Zap,\r\n Radio,\r\n Terminal,\r\n LayoutGrid,\r\n List,\r\n Filter,\r\n Brain,\r\n ArrowDownUp,\r\n ArrowUpDown,\r\n Cpu,\r\n CheckCircle,\r\n XCircle,\r\n AlertOctagon,\r\n} from 'lucide-react';\r\nimport type { ModelListDto, ProviderListDto } from '@/services/api/aiApi';\r\n\r\nconst formatCurrency = (value: number) =>\r\n new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2 }).format(value);\r\n\r\ntype CapabilityKey =\r\n | 'supportsVision'\r\n | 'supportsImageGeneration'\r\n | 'supportsAudioInput'\r\n | 'supportsAudioOutput'\r\n | 'supportsFunctionCalling'\r\n | 'supportsStreaming'\r\n | 'supportsCodeExecution';\r\n\r\nconst CAPABILITIES: {\r\n key: CapabilityKey;\r\n icon: React.ComponentType<{ className?: string }>;\r\n color: string;\r\n bgLight: string;\r\n bgDark: string;\r\n}[] = [\r\n {\r\n key: 'supportsVision',\r\n icon: Eye,\r\n color: 'text-blue-700 dark:text-blue-400',\r\n bgLight: 'bg-blue-100',\r\n bgDark: 'dark:bg-blue-900/30',\r\n },\r\n {\r\n key: 'supportsImageGeneration',\r\n icon: ImagePlus,\r\n color: 'text-pink-700 dark:text-pink-400',\r\n bgLight: 'bg-pink-100',\r\n bgDark: 'dark:bg-pink-900/30',\r\n },\r\n {\r\n key: 'supportsAudioInput',\r\n icon: Mic,\r\n color: 'text-amber-700 dark:text-amber-400',\r\n bgLight: 'bg-amber-100',\r\n bgDark: 'dark:bg-amber-900/30',\r\n },\r\n {\r\n key: 'supportsAudioOutput',\r\n icon: Volume2,\r\n color: 'text-orange-700 dark:text-orange-400',\r\n bgLight: 'bg-orange-100',\r\n bgDark: 'dark:bg-orange-900/30',\r\n },\r\n {\r\n key: 'supportsFunctionCalling',\r\n icon: Zap,\r\n color: 'text-purple-700 dark:text-purple-400',\r\n bgLight: 'bg-purple-100',\r\n bgDark: 'dark:bg-purple-900/30',\r\n },\r\n {\r\n key: 'supportsStreaming',\r\n icon: Radio,\r\n color: 'text-green-700 dark:text-green-400',\r\n bgLight: 'bg-green-100',\r\n bgDark: 'dark:bg-green-900/30',\r\n },\r\n {\r\n key: 'supportsCodeExecution',\r\n icon: Terminal,\r\n color: 'text-cyan-700 dark:text-cyan-400',\r\n bgLight: 'bg-cyan-100',\r\n bgDark: 'dark:bg-cyan-900/30',\r\n },\r\n];\r\n\r\nconst getProviderInitial = (providerCode: string | null | undefined) => {\r\n return providerCode?.charAt(0).toUpperCase() || 'M';\r\n};\r\n\r\nconst getModelStatusBadge = (model: ModelListDto, t: (key: string) => string) => {\r\n if (model.isDeprecated) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-400 rounded text-xs\">\r\n <AlertOctagon className=\"w-3 h-3\" />\r\n {t('settings.models.deprecated')}\r\n </span>\r\n );\r\n }\r\n if (model.isActive) {\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400 rounded text-xs\">\r\n <CheckCircle className=\"w-3 h-3\" />\r\n {t('settings.models.statusActive')}\r\n </span>\r\n );\r\n }\r\n return (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 bg-gray-100 dark:bg-gray-900/30 text-gray-700 dark:text-gray-400 rounded text-xs\">\r\n <XCircle className=\"w-3 h-3\" />\r\n {t('settings.models.statusInactive')}\r\n </span>\r\n );\r\n};\r\n\r\ninterface AiModelsTabProps {\r\n readonly models: ModelListDto[];\r\n readonly providers: ProviderListDto[];\r\n readonly filter: { category?: string; providerId?: string };\r\n readonly onFilterChange: (filter: { category?: string; providerId?: string }) => void;\r\n}\r\n\r\nexport function AiModelsTab({\r\n models,\r\n providers,\r\n filter,\r\n onFilterChange,\r\n}: AiModelsTabProps): ReactElement {\r\n const { t } = useTranslation('ai');\r\n\r\n const categories = [\r\n 'TextGeneration',\r\n 'Embedding',\r\n 'ImageGeneration',\r\n 'AudioGeneration',\r\n 'VideoGeneration',\r\n ];\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [viewMode, setViewMode] = useState<'grid' | 'table'>('grid');\r\n const [selectedCapabilities, setSelectedCapabilities] = useState<\r\n Set<CapabilityKey>\r\n >(new Set());\r\n const [filterMode, setFilterMode] = useState<'or' | 'and'>('or');\r\n const pageSize = viewMode === 'grid' ? 12 : 10;\r\n\r\n // Filter models by capabilities\r\n const filteredModels = models.filter((model) => {\r\n if (selectedCapabilities.size === 0) return true;\r\n\r\n const caps = Array.from(selectedCapabilities);\r\n if (filterMode === 'or') {\r\n return caps.some((cap) => model[cap]);\r\n } else {\r\n return caps.every((cap) => model[cap]);\r\n }\r\n });\r\n\r\n const totalPages = Math.ceil(filteredModels.length / pageSize);\r\n const paginatedModels = filteredModels.slice(\r\n (currentPage - 1) * pageSize,\r\n currentPage * pageSize\r\n );\r\n\r\n useEffect(() => {\r\n setCurrentPage(1);\r\n }, [filter, selectedCapabilities, filterMode, viewMode]);\r\n\r\n const toggleCapability = (cap: CapabilityKey) => {\r\n setSelectedCapabilities((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(cap)) {\r\n next.delete(cap);\r\n } else {\r\n next.add(cap);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const clearCapabilityFilters = () => {\r\n setSelectedCapabilities(new Set());\r\n };\r\n\r\n return (\r\n <div className=\"space-y-4\">\r\n {/* Header with view toggle */}\r\n <div className=\"flex items-center justify-between\">\r\n <p className=\"text-[var(--text-secondary)]\">\r\n {t('settings.models.subtitle')}\r\n </p>\r\n {/* View mode toggle */}\r\n <div className=\"flex items-center gap-1 p-1 bg-[var(--bg-secondary)] rounded-lg\">\r\n <button\r\n onClick={() => setViewMode('grid')}\r\n className={`p-2 rounded transition-colors ${viewMode === 'grid' ? 'bg-[var(--bg-primary)] shadow-sm' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n title={t('settings.models.viewGrid')}\r\n >\r\n <LayoutGrid className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => setViewMode('table')}\r\n className={`p-2 rounded transition-colors ${viewMode === 'table' ? 'bg-[var(--bg-primary)] shadow-sm' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n title={t('settings.models.viewTable')}\r\n >\r\n <List className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* 2. Category & Provider Filters */}\r\n <div className=\"flex flex-wrap gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.models.category')}\r\n </label>\r\n <select\r\n value={filter.category || ''}\r\n onChange={(e) =>\r\n onFilterChange({\r\n ...filter,\r\n category: e.target.value || undefined,\r\n })\r\n }\r\n className=\"input min-w-[150px]\"\r\n >\r\n <option value=\"\">{t('prompts.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {t(`settings.models.categories.${cat}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.profiles.fields.provider')}\r\n </label>\r\n <select\r\n value={filter.providerId || ''}\r\n onChange={(e) =>\r\n onFilterChange({\r\n ...filter,\r\n providerId: e.target.value || undefined,\r\n })\r\n }\r\n className=\"input min-w-[150px]\"\r\n >\r\n <option value=\"\">{t('dashboard.allProviders')}</option>\r\n {providers.map((p) => (\r\n <option key={p.id} value={p.id}>\r\n {p.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* 3. Capabilities Filter Bar - CLICKABLE LEGEND */}\r\n <div className=\"card p-4 space-y-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Filter className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n <span className=\"text-sm font-medium\">\r\n {t('settings.models.filterByCapabilities')}\r\n </span>\r\n {selectedCapabilities.size > 0 && (\r\n <span className=\"px-2 py-0.5 bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)] text-[var(--color-accent-600)] text-xs rounded-full\">\r\n {selectedCapabilities.size}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {selectedCapabilities.size > 0 && (\r\n <>\r\n <div className=\"flex items-center gap-1 p-1 bg-[var(--bg-secondary)] rounded-lg text-xs\">\r\n <button\r\n onClick={() => setFilterMode('or')}\r\n className={`px-2 py-1 rounded transition-colors ${filterMode === 'or' ? 'bg-[var(--bg-primary)] shadow-sm font-medium' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n >\r\n {t('settings.models.filterOr')}\r\n </button>\r\n <button\r\n onClick={() => setFilterMode('and')}\r\n className={`px-2 py-1 rounded transition-colors ${filterMode === 'and' ? 'bg-[var(--bg-primary)] shadow-sm font-medium' : 'hover:bg-[var(--bg-tertiary)]'}`}\r\n >\r\n {t('settings.models.filterAnd')}\r\n </button>\r\n </div>\r\n <button\r\n onClick={clearCapabilityFilters}\r\n className=\"text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] underline\"\r\n >\r\n {t('common:clear')}\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n {CAPABILITIES.map(({ key, icon: Icon, color, bgLight, bgDark }) => {\r\n const isSelected = selectedCapabilities.has(key);\r\n return (\r\n <button\r\n key={key}\r\n onClick={() => toggleCapability(key)}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-medium transition-all ${bgLight} ${bgDark} ${color} ${\r\n isSelected\r\n ? 'ring-2 ring-offset-1 ring-current shadow-sm'\r\n : 'opacity-60 hover:opacity-100'\r\n }`}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n {t(`settings.models.${key}`)}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n {selectedCapabilities.size > 0 && (\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {filterMode === 'or'\r\n ? t('settings.models.filterOrDescription', {\r\n count: filteredModels.length,\r\n })\r\n : t('settings.models.filterAndDescription', {\r\n count: filteredModels.length,\r\n })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Models Display */}\r\n {filteredModels.length === 0 && (\r\n <div className=\"card p-12 text-center\">\r\n <Cpu className=\"w-16 h-16 mx-auto mb-4 text-[var(--text-secondary)] opacity-50\" />\r\n <h3 className=\"text-lg font-medium mb-2\">\r\n {t('settings.models.noModels')}\r\n </h3>\r\n {selectedCapabilities.size > 0 && (\r\n <button\r\n onClick={clearCapabilityFilters}\r\n className=\"btn btn-secondary mt-2\"\r\n >\r\n {t('settings.models.clearFilters')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {filteredModels.length > 0 && viewMode === 'grid' && (\r\n /* GRID VIEW - Modern Cards */\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\r\n {paginatedModels.map((model) => (\r\n <div\r\n key={model.id}\r\n className={`bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:-translate-y-0.5 hover:border-[var(--color-accent-400)] ${model.isDeprecated ? 'opacity-60' : ''}`}\r\n >\r\n {/* Header with user's accent color */}\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 bg-[var(--color-accent-500)] rounded-lg flex items-center justify-center text-white font-bold shadow-lg\">\r\n {getProviderInitial(model.providerCode)}\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)]\">\r\n {model.name}\r\n </h3>\r\n <p className=\"text-xs text-[var(--text-secondary)]\">\r\n {model.providerName}\r\n </p>\r\n </div>\r\n </div>\r\n {model.isDeprecated && (\r\n <span className=\"px-2 py-0.5 bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-400 rounded text-xs flex items-center gap-1\">\r\n <AlertOctagon className=\"w-3 h-3\" />\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Card Body */}\r\n <div className=\"p-4 space-y-4\">\r\n {/* Category Badge */}\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"px-2 py-1 bg-[var(--bg-secondary)] rounded text-xs font-medium\">\r\n {t(`settings.models.categories.${model.category}`)}\r\n </span>\r\n <code className=\"text-xs text-[var(--text-tertiary)] font-mono\">\r\n {model.code}\r\n </code>\r\n </div>\r\n\r\n {/* Pricing */}\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-3 text-center\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1 flex items-center justify-center gap-1\">\r\n <ArrowDownUp className=\"w-3 h-3\" />\r\n {t('settings.models.inputCost')}\r\n </div>\r\n <div className=\"font-mono font-bold text-lg\">\r\n {formatCurrency(model.inputCostPerMillionTokens)}\r\n </div>\r\n <div className=\"text-[10px] text-[var(--text-tertiary)]\">\r\n {t('settings.models.perMillionTokens')}\r\n </div>\r\n </div>\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-3 text-center\">\r\n <div className=\"text-xs text-[var(--text-secondary)] mb-1 flex items-center justify-center gap-1\">\r\n <ArrowUpDown className=\"w-3 h-3\" />\r\n {t('settings.models.outputCost')}\r\n </div>\r\n <div className=\"font-mono font-bold text-lg\">\r\n {formatCurrency(model.outputCostPerMillionTokens)}\r\n </div>\r\n <div className=\"text-[10px] text-[var(--text-tertiary)]\">\r\n {t('settings.models.perMillionTokens')}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Context Window */}\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)] flex items-center gap-1\">\r\n <Brain className=\"w-4 h-4\" />\r\n {t('settings.models.contextWindow')}\r\n </span>\r\n <span className=\"font-mono font-medium\">\r\n {model.contextWindow >= 1000000\r\n ? `${(model.contextWindow / 1000000).toFixed(1)}M`\r\n : `${(model.contextWindow / 1000).toFixed(0)}K`}\r\n </span>\r\n </div>\r\n\r\n {/* Capabilities */}\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {CAPABILITIES.map(({ key, icon: Icon, color, bgLight, bgDark }) =>\r\n model[key] && (\r\n <span\r\n key={key}\r\n className={`p-1.5 ${bgLight} ${bgDark} ${color} rounded-md`}\r\n title={t(`settings.models.${key}`)}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )\r\n )}\r\n {!CAPABILITIES.some(({ key }) => model[key]) && (\r\n <span className=\"text-xs text-[var(--text-tertiary)] italic\">\r\n {t('settings.models.noCapabilities')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {filteredModels.length > 0 && viewMode !== 'grid' && (\r\n /* TABLE VIEW */\r\n <div className=\"card overflow-hidden\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"text-left p-4 font-medium text-sm\">{t('settings.models.model')}</th>\r\n <th className=\"text-left p-4 font-medium text-sm\">\r\n {t('settings.models.category')}\r\n </th>\r\n <th className=\"text-right p-4 font-medium text-sm\">\r\n {t('settings.models.inputCost')} $/M\r\n </th>\r\n <th className=\"text-right p-4 font-medium text-sm\">\r\n {t('settings.models.outputCost')} $/M\r\n </th>\r\n <th className=\"text-right p-4 font-medium text-sm\">\r\n {t('settings.models.contextWindow')}\r\n </th>\r\n <th className=\"text-center p-4 font-medium text-sm\">\r\n {t('settings.models.capabilities')}\r\n </th>\r\n <th className=\"text-center p-4 font-medium text-sm\">{t('settings.models.status')}</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {paginatedModels.map((model) => (\r\n <tr\r\n key={model.id}\r\n className={`hover:bg-[var(--bg-secondary)]/50 ${model.isDeprecated ? 'opacity-60' : ''}`}\r\n >\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-8 h-8 bg-[var(--color-accent-500)] rounded flex items-center justify-center text-xs font-bold text-white\">\r\n {getProviderInitial(model.providerCode)}\r\n </div>\r\n <div>\r\n <div className=\"font-medium\">{model.name}</div>\r\n <code className=\"text-xs text-[var(--text-secondary)]\">\r\n {model.code}\r\n </code>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <span className=\"px-2 py-1 bg-[var(--bg-secondary)] rounded text-sm\">\r\n {t(`settings.models.categories.${model.category}`)}\r\n </span>\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <span className=\"font-mono font-medium\">\r\n {formatCurrency(model.inputCostPerMillionTokens)}\r\n </span>\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <span className=\"font-mono font-medium\">\r\n {formatCurrency(model.outputCostPerMillionTokens)}\r\n </span>\r\n </td>\r\n <td className=\"p-4 text-right\">\r\n <div className=\"font-mono text-sm\">\r\n {model.contextWindow >= 1000000\r\n ? `${(model.contextWindow / 1000000).toFixed(1)}M`\r\n : `${(model.contextWindow / 1000).toFixed(0)}K`}\r\n </div>\r\n </td>\r\n <td className=\"p-4\">\r\n <div className=\"flex items-center justify-center gap-1 flex-wrap\">\r\n {CAPABILITIES.map(\r\n ({ key, icon: Icon, color, bgLight, bgDark }) =>\r\n model[key] && (\r\n <span\r\n key={key}\r\n className={`p-1 ${bgLight} ${bgDark} ${color} rounded`}\r\n title={t(`settings.models.${key}`)}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n </span>\r\n )\r\n )}\r\n </div>\r\n </td>\r\n <td className=\"p-4 text-center\">\r\n {getModelStatusBadge(model, t)}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('common.showingOf', {\r\n from: (currentPage - 1) * pageSize + 1,\r\n to: Math.min(currentPage * pageSize, filteredModels.length),\r\n total: filteredModels.length,\r\n })}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\r\n disabled={currentPage === 1}\r\n className=\"btn btn-sm btn-secondary disabled:opacity-50\"\r\n >\r\n {t('common.previous')}\r\n </button>\r\n <div className=\"flex items-center gap-1\">\r\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\r\n let page: number;\r\n if (totalPages <= 5) {\r\n page = i + 1;\r\n } else if (currentPage <= 3) {\r\n page = i + 1;\r\n } else if (currentPage >= totalPages - 2) {\r\n page = totalPages - 4 + i;\r\n } else {\r\n page = currentPage - 2 + i;\r\n }\r\n return (\r\n <button\r\n key={page}\r\n onClick={() => setCurrentPage(page)}\r\n className={`w-8 h-8 rounded text-sm font-medium ${\r\n currentPage === page\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'hover:bg-[var(--bg-secondary)]'\r\n }`}\r\n >\r\n {page}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n <button\r\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\r\n disabled={currentPage === totalPages}\r\n className=\"btn btn-sm btn-secondary disabled:opacity-50\"\r\n >\r\n {t('common.next')}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport {\r\n aiApi,\r\n type ProviderInstanceListDto,\r\n type ProviderInstanceDetailDto,\r\n type CreateProviderInstanceRequest,\r\n type UpdateProviderInstanceRequest,\r\n type SetKeyRequest,\r\n} from '@/services/api/aiApi';\r\n\r\nexport interface UseAiInstancesReturn {\r\n instances: ProviderInstanceListDto[];\r\n selectedInstance: ProviderInstanceDetailDto | null;\r\n loading: boolean;\r\n error: string | null;\r\n\r\n loadInstances: () => Promise<void>;\r\n loadInstanceDetail: (instanceId: string) => Promise<void>;\r\n refreshInstance: () => Promise<void>;\r\n createInstance: (data: CreateProviderInstanceRequest) => Promise<ProviderInstanceDetailDto | null>;\r\n updateInstance: (instanceId: string, data: UpdateProviderInstanceRequest) => Promise<ProviderInstanceDetailDto | null>;\r\n deleteInstance: (instanceId: string) => Promise<void>;\r\n toggleInstanceActive: (instanceId: string) => Promise<void>;\r\n setApiKey: (instanceId: string, apiKey: string) => Promise<void>;\r\n setAdminKey: (instanceId: string, adminKey: string) => Promise<void>;\r\n selectInstance: (instance: ProviderInstanceDetailDto | null) => void;\r\n clearError: () => void;\r\n}\r\n\r\nexport function useAiInstances(): UseAiInstancesReturn {\r\n const [instances, setInstances] = useState<ProviderInstanceListDto[]>([]);\r\n const [selectedInstance, setSelectedInstance] = useState<ProviderInstanceDetailDto | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadInstances = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const data = await aiApi.instances.getAll();\r\n setInstances(data ?? []);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load instances';\r\n setError(message);\r\n console.error('Failed to load instances:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadInstanceDetail = useCallback(async (instanceId: string) => {\r\n setError(null);\r\n try {\r\n const data = await aiApi.instances.getById(instanceId);\r\n setSelectedInstance(data ?? null);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load instance details';\r\n setError(message);\r\n console.error('Failed to load instance details:', err);\r\n }\r\n }, []);\r\n\r\n const refreshInstance = useCallback(async () => {\r\n if (!selectedInstance) return;\r\n await loadInstanceDetail(selectedInstance.id);\r\n }, [selectedInstance, loadInstanceDetail]);\r\n\r\n const createInstance = useCallback(\r\n async (data: CreateProviderInstanceRequest): Promise<ProviderInstanceDetailDto | null> => {\r\n setError(null);\r\n try {\r\n const result = await aiApi.instances.create(data);\r\n await loadInstances();\r\n return result ?? null;\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to create instance';\r\n setError(message);\r\n console.error('Failed to create instance:', err);\r\n return null;\r\n }\r\n },\r\n [loadInstances]\r\n );\r\n\r\n const updateInstance = useCallback(\r\n async (instanceId: string, data: UpdateProviderInstanceRequest): Promise<ProviderInstanceDetailDto | null> => {\r\n setError(null);\r\n try {\r\n const result = await aiApi.instances.update(instanceId, data);\r\n await loadInstances();\r\n if (selectedInstance?.id === instanceId) {\r\n setSelectedInstance(result ?? null);\r\n }\r\n return result ?? null;\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to update instance';\r\n setError(message);\r\n console.error('Failed to update instance:', err);\r\n return null;\r\n }\r\n },\r\n [loadInstances, selectedInstance?.id]\r\n );\r\n\r\n const deleteInstance = useCallback(\r\n async (instanceId: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n await aiApi.instances.delete(instanceId);\r\n await loadInstances();\r\n if (selectedInstance?.id === instanceId) {\r\n setSelectedInstance(null);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to delete instance';\r\n setError(message);\r\n console.error('Failed to delete instance:', err);\r\n }\r\n },\r\n [loadInstances, selectedInstance?.id]\r\n );\r\n\r\n const toggleInstanceActive = useCallback(\r\n async (instanceId: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n await aiApi.instances.toggleActive(instanceId);\r\n await loadInstances();\r\n if (selectedInstance?.id === instanceId) {\r\n await loadInstanceDetail(instanceId);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to toggle instance';\r\n setError(message);\r\n console.error('Failed to toggle instance:', err);\r\n }\r\n },\r\n [loadInstances, selectedInstance?.id, loadInstanceDetail]\r\n );\r\n\r\n const setApiKey = useCallback(\r\n async (instanceId: string, apiKey: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n const request: SetKeyRequest = { value: apiKey };\r\n await aiApi.instances.setApiKey(instanceId, request);\r\n if (selectedInstance?.id === instanceId) {\r\n await loadInstanceDetail(instanceId);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to set API key';\r\n setError(message);\r\n console.error('Failed to set API key:', err);\r\n }\r\n },\r\n [selectedInstance?.id, loadInstanceDetail]\r\n );\r\n\r\n const setAdminKey = useCallback(\r\n async (instanceId: string, adminKey: string): Promise<void> => {\r\n setError(null);\r\n try {\r\n const request: SetKeyRequest = { value: adminKey };\r\n await aiApi.instances.setAdminKey(instanceId, request);\r\n if (selectedInstance?.id === instanceId) {\r\n await loadInstanceDetail(instanceId);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to set admin key';\r\n setError(message);\r\n console.error('Failed to set admin key:', err);\r\n }\r\n },\r\n [selectedInstance?.id, loadInstanceDetail]\r\n );\r\n\r\n const selectInstance = useCallback((instance: ProviderInstanceDetailDto | null) => {\r\n setSelectedInstance(instance);\r\n setError(null);\r\n }, []);\r\n\r\n const clearError = useCallback(() => {\r\n setError(null);\r\n }, []);\r\n\r\n return {\r\n instances,\r\n selectedInstance,\r\n loading,\r\n error,\r\n loadInstances,\r\n loadInstanceDetail,\r\n refreshInstance,\r\n createInstance,\r\n updateInstance,\r\n deleteInstance,\r\n toggleInstanceActive,\r\n setApiKey,\r\n setAdminKey,\r\n selectInstance,\r\n clearError,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { aiApi, type ProviderListDto } from '@/services/api/aiApi';\r\n\r\nexport interface UseAiProvidersReturn {\r\n providers: ProviderListDto[];\r\n loading: boolean;\r\n error: string | null;\r\n\r\n loadProviders: () => Promise<void>;\r\n clearError: () => void;\r\n}\r\n\r\nexport function useAiProviders(): UseAiProvidersReturn {\r\n const [providers, setProviders] = useState<ProviderListDto[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const setError_ = useCallback((message: string | null) => {\r\n setError(message);\r\n }, []);\r\n\r\n const loadProviders = useCallback(async () => {\r\n setLoading(true);\r\n setError_(null);\r\n try {\r\n const data = await aiApi.settings.getProviders();\r\n setProviders(data ?? []);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load providers';\r\n setError_(message);\r\n console.error('Failed to load providers:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [setError_]);\r\n\r\n const clearError = useCallback(() => {\r\n setError_(null);\r\n }, [setError_]);\r\n\r\n return {\r\n providers,\r\n loading,\r\n error,\r\n loadProviders,\r\n clearError,\r\n };\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { aiApi, type ModelListDto } from '@/services/api/aiApi';\r\n\r\nexport interface ModelFilter {\r\n category?: string;\r\n providerId?: string;\r\n}\r\n\r\nexport interface UseAiModelsReturn {\r\n models: ModelListDto[];\r\n filteredModels: ModelListDto[];\r\n modelFilter: ModelFilter;\r\n loading: boolean;\r\n error: string | null;\r\n\r\n loadModels: (category?: string, providerId?: string) => Promise<void>;\r\n setModelFilter: (filter: ModelFilter) => Promise<void>;\r\n clearFilters: () => Promise<void>;\r\n clearError: () => void;\r\n}\r\n\r\nexport function useAiModels(): UseAiModelsReturn {\r\n const [models, setModels] = useState<ModelListDto[]>([]);\r\n const [modelFilter, setModelFilterState] = useState<ModelFilter>({});\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const setError_ = useCallback((message: string | null) => {\r\n setError(message);\r\n }, []);\r\n\r\n const loadModels = useCallback(\r\n async (category?: string, providerId?: string) => {\r\n setLoading(true);\r\n setError_(null);\r\n try {\r\n const data = await aiApi.settings.getModels(category, providerId);\r\n setModels(data ?? []);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Failed to load models';\r\n setError_(message);\r\n console.error('Failed to load models:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [setError_]\r\n );\r\n\r\n const setModelFilter = useCallback(\r\n async (filter: ModelFilter) => {\r\n setModelFilterState(filter);\r\n await loadModels(filter.category, filter.providerId);\r\n },\r\n [loadModels]\r\n );\r\n\r\n const clearFilters = useCallback(async () => {\r\n setModelFilterState({});\r\n await loadModels();\r\n }, [loadModels]);\r\n\r\n const clearError = useCallback(() => {\r\n setError_(null);\r\n }, [setError_]);\r\n\r\n const filteredModels = useMemo(() => {\r\n let result = models;\r\n\r\n if (modelFilter.providerId) {\r\n result = result.filter((model) => model.providerId === modelFilter.providerId);\r\n }\r\n\r\n if (modelFilter.category) {\r\n result = result.filter((model) => model.category === modelFilter.category);\r\n }\r\n\r\n return result;\r\n }, [models, modelFilter]);\r\n\r\n return {\r\n models,\r\n filteredModels,\r\n modelFilter,\r\n loading,\r\n error,\r\n loadModels,\r\n setModelFilter,\r\n clearFilters,\r\n clearError,\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport { aiApi } from '@/services/api/aiApi';\r\n\r\nexport interface AccessTenant {\r\n id: string;\r\n tenantId: string;\r\n tenantName: string;\r\n tenantSlug: string | null;\r\n}\r\n\r\nexport interface UseInstanceAccessReturn {\r\n tenants: AccessTenant[];\r\n showAddTenantModal: boolean;\r\n openAddTenantModal: () => void;\r\n closeAddTenantModal: () => void;\r\n addTenant: (instanceId: string, tenantId: string) => Promise<void>;\r\n removeTenant: (instanceId: string, tenantId: string) => Promise<void>;\r\n loadAccessData: (tenants?: AccessTenant[]) => void;\r\n}\r\n\r\nexport function useInstanceAccess(): UseInstanceAccessReturn {\r\n const [tenants, setTenants] = useState<AccessTenant[]>([]);\r\n const [showAddTenantModal, setShowAddTenantModal] = useState(false);\r\n\r\n const openAddTenantModal = useCallback(() => setShowAddTenantModal(true), []);\r\n const closeAddTenantModal = useCallback(() => setShowAddTenantModal(false), []);\r\n\r\n const addTenant = useCallback(\r\n async (instanceId: string, tenantId: string): Promise<void> => {\r\n try {\r\n await aiApi.instances.addTenant(instanceId, { tenantId });\r\n } catch (err) {\r\n console.error('Failed to add tenant:', err);\r\n throw err;\r\n }\r\n },\r\n []\r\n );\r\n\r\n const removeTenant = useCallback(\r\n async (instanceId: string, tenantId: string): Promise<void> => {\r\n try {\r\n await aiApi.instances.removeTenant(instanceId, tenantId);\r\n setTenants((prev) => prev.filter((t) => t.tenantId !== tenantId));\r\n } catch (err) {\r\n console.error('Failed to remove tenant:', err);\r\n throw err;\r\n }\r\n },\r\n []\r\n );\r\n\r\n const loadAccessData = useCallback(\r\n (tenants?: AccessTenant[]) => {\r\n if (tenants) setTenants(tenants);\r\n },\r\n []\r\n );\r\n\r\n return {\r\n tenants,\r\n showAddTenantModal,\r\n openAddTenantModal,\r\n closeAddTenantModal,\r\n addTenant,\r\n removeTenant,\r\n loadAccessData,\r\n };\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Settings,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n X,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ConfirmModal } from '@/components/ui/ConfirmModal';\r\nimport {\r\n AiProfilesTab,\r\n AiProvidersTab,\r\n AiModelsTab,\r\n} from '@/components/platform/administration/ai';\r\nimport {\r\n aiApi,\r\n type CreateProviderInstanceRequest,\r\n} from '@/services/api/aiApi';\r\nimport { useAiInstances } from '@/hooks/useAiInstances';\r\nimport { useAiProviders } from '@/hooks/useAiProviders';\r\nimport { useAiModels } from '@/hooks/useAiModels';\r\nimport { useInstanceAccess } from '@/hooks/useInstanceAccess';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst VALID_TABS = ['profiles', 'providers', 'models'] as const;\r\ntype TabType = typeof VALID_TABS[number];\r\n\r\nexport function AiSettingsPage(): ReactElement {\r\n const { t } = useTranslation(['ai']);\r\n const { activeTab, setActiveTab } = useTabNavigation<TabType>('profiles', VALID_TABS);\r\n\r\n // Data hooks\r\n const aiInstances = useAiInstances();\r\n const aiProviders = useAiProviders();\r\n const aiModels = useAiModels();\r\n const instanceAccess = useInstanceAccess();\r\n\r\n // Page-level modal states\r\n const [showCreateModal, setShowCreateModal] = useState(false);\r\n const [formData, setFormData] = useState<CreateProviderInstanceRequest>({\r\n name: '',\r\n code: '',\r\n providerId: '',\r\n });\r\n const [loadingCode, setLoadingCode] = useState(false);\r\n const [deleteConfirm, setDeleteConfirm] = useState<{ show: boolean; instanceId: string | null }>({ show: false, instanceId: null });\r\n\r\n // Initial data load\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(() => {\r\n const loadAllData = async () => {\r\n await Promise.all([\r\n aiInstances.loadInstances(),\r\n aiProviders.loadProviders(),\r\n aiModels.loadModels(),\r\n ]);\r\n };\r\n loadAllData();\r\n }, []);\r\n\r\n // Load instance details and access data when selected\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(() => {\r\n if (aiInstances.selectedInstance) {\r\n const { tenants } = aiInstances.selectedInstance;\r\n instanceAccess.loadAccessData(tenants);\r\n }\r\n }, [aiInstances.selectedInstance]);\r\n\r\n // Handlers for Profiles tab\r\n const handleSelectInstance = async (instanceId: string) => {\r\n await aiInstances.loadInstanceDetail(instanceId);\r\n };\r\n\r\n const handleDeleteInstance = (instanceId: string) => {\r\n setDeleteConfirm({ show: true, instanceId });\r\n };\r\n\r\n const confirmDeleteInstance = async () => {\r\n if (!deleteConfirm.instanceId) return;\r\n await aiInstances.deleteInstance(deleteConfirm.instanceId);\r\n setDeleteConfirm({ show: false, instanceId: null });\r\n };\r\n\r\n const handleToggleActive = async (instanceId: string) => {\r\n await aiInstances.toggleInstanceActive(instanceId);\r\n };\r\n\r\n const handleCreateInstance = async () => {\r\n try {\r\n const result = await aiInstances.createInstance(formData);\r\n if (result) {\r\n setShowCreateModal(false);\r\n setFormData({\r\n name: '',\r\n code: '',\r\n providerId: '',\r\n });\r\n }\r\n } catch (err) {\r\n console.error('Failed to create instance:', err);\r\n }\r\n };\r\n\r\n const handleUpdateInstance = async (data: Parameters<typeof aiInstances.updateInstance>[1]) => {\r\n if (!aiInstances.selectedInstance) return;\r\n await aiInstances.updateInstance(aiInstances.selectedInstance.id, data);\r\n };\r\n\r\n const handleGenerateCode = async () => {\r\n if (!formData.providerId) return;\r\n setLoadingCode(true);\r\n try {\r\n const response = await aiApi.instances.generateCode(formData.providerId);\r\n setFormData({ ...formData, code: response.code });\r\n } catch (err) {\r\n console.error('Failed to generate code:', err);\r\n } finally {\r\n setLoadingCode(false);\r\n }\r\n };\r\n\r\n // Determine loading state\r\n const isLoading = aiInstances.loading || aiProviders.loading || aiModels.loading;\r\n\r\n if (isLoading && !aiInstances.instances.length) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('settings.title', 'Settings') },\r\n ]}\r\n />\r\n\r\n {/* Error Banner */}\r\n {aiInstances.error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{aiInstances.error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Settings className=\"w-6 h-6\" />\r\n {t('settings.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">{t('settings.description')}</p>\r\n </div>\r\n </div>\r\n {activeTab === 'profiles' && (\r\n <button\r\n onClick={() => {\r\n setFormData({\r\n name: '',\r\n code: '',\r\n providerId: '',\r\n });\r\n setShowCreateModal(true);\r\n }}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('settings.profiles.createButton')}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <div className=\"flex gap-8\">\r\n {(['profiles', 'providers', 'models'] as const).map((tab) => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`pb-4 px-1 border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-accent-600)] text-[var(--text-primary)] font-medium'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`settings.tabs.${tab}`)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div>\r\n {activeTab === 'profiles' && (\r\n <AiProfilesTab\r\n instances={aiInstances.instances}\r\n selectedInstance={aiInstances.selectedInstance}\r\n onSelectInstance={handleSelectInstance}\r\n onToggleActive={handleToggleActive}\r\n onDelete={handleDeleteInstance}\r\n onUpdate={handleUpdateInstance}\r\n models={aiModels.models}\r\n onSetApiKey={async (key) => { if (aiInstances.selectedInstance) await aiInstances.setApiKey(aiInstances.selectedInstance.id, key); }}\r\n onSetAdminKey={async (key) => { if (aiInstances.selectedInstance) await aiInstances.setAdminKey(aiInstances.selectedInstance.id, key); }}\r\n providerApiKeyUrl={aiProviders.providers.find(p => p.id === aiInstances.selectedInstance?.providerId)?.apiKeyUrl}\r\n providerAdminApiKeyUrl={aiProviders.providers.find(p => p.id === aiInstances.selectedInstance?.providerId)?.adminApiKeyUrl}\r\n onAddTenant={async (tenantId) => { if (aiInstances.selectedInstance) { await instanceAccess.addTenant(aiInstances.selectedInstance.id, tenantId); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onRemoveTenant={async (tenantId) => { if (aiInstances.selectedInstance) { await instanceAccess.removeTenant(aiInstances.selectedInstance.id, tenantId); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onSetAllTenants={async (isAllTenants) => { if (aiInstances.selectedInstance) { await aiApi.instances.setAllTenants(aiInstances.selectedInstance.id, { isAllTenants }); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onAddPrompt={async (skillId) => { if (aiInstances.selectedInstance) { await aiApi.instances.addSkill(aiInstances.selectedInstance.id, { skillId }); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n onRemovePrompt={async (skillId) => { if (aiInstances.selectedInstance) { await aiApi.instances.removeSkill(aiInstances.selectedInstance.id, skillId); await aiInstances.loadInstanceDetail(aiInstances.selectedInstance.id); } }}\r\n />\r\n )}\r\n\r\n {activeTab === 'providers' && <AiProvidersTab providers={aiProviders.providers} />}\r\n\r\n {activeTab === 'models' && (\r\n <AiModelsTab\r\n models={aiModels.filteredModels}\r\n providers={aiProviders.providers}\r\n filter={aiModels.modelFilter}\r\n onFilterChange={(filter) => aiModels.setModelFilter(filter)}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Create Instance Modal */}\r\n {showCreateModal && (\r\n <div className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\" role=\"dialog\" aria-modal=\"true\" onKeyDown={(e) => { if (e.key === 'Escape') setShowCreateModal(false); }}>\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-lg max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\r\n <div className=\"flex items-center justify-between p-6 border-b border-[var(--border-color)]\">\r\n <h2 className=\"text-xl font-bold\">{t('settings.profiles.createTitle')}</h2>\r\n <button\r\n onClick={() => setShowCreateModal(false)}\r\n className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"p-6 space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('settings.profiles.fields.name')}</label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\r\n placeholder={t('settings.profiles.fields.namePlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('settings.profiles.fields.provider')}</label>\r\n <select\r\n value={formData.providerId}\r\n onChange={(e) => setFormData({ ...formData, providerId: e.target.value, defaultModel: undefined })}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('settings.profiles.fields.selectProvider')}</option>\r\n {aiProviders.providers.map((provider) => (\r\n <option key={provider.id} value={provider.id}>\r\n {provider.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.profiles.fields.defaultModel')}\r\n </label>\r\n <select\r\n value={formData.defaultModel || ''}\r\n onChange={(e) => setFormData({ ...formData, defaultModel: e.target.value || undefined })}\r\n className=\"input w-full\"\r\n disabled={!formData.providerId}\r\n >\r\n <option value=\"\">{t('settings.profiles.fields.defaultModelPlaceholder')}</option>\r\n {aiModels.models\r\n .filter((m) => m.providerId === formData.providerId)\r\n .map((model) => (\r\n <option key={model.id} value={model.code}>\r\n {model.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">\r\n {t('settings.profiles.fields.code')}\r\n <span className=\"text-xs text-[var(--text-secondary)] ml-2\">({t('settings.profiles.fields.autoGenerated')})</span>\r\n </label>\r\n <div className=\"flex gap-2\">\r\n <input\r\n type=\"text\"\r\n value={loadingCode ? '...' : formData.code || ''}\r\n readOnly\r\n className=\"input w-full bg-[var(--bg-secondary)] font-mono text-sm\"\r\n placeholder={t('settings.profiles.fields.codePlaceholder')}\r\n />\r\n <button\r\n onClick={handleGenerateCode}\r\n disabled={!formData.providerId || loadingCode}\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n {loadingCode ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : t('settings.profiles.fields.generate')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex gap-3 justify-end p-6 border-t border-[var(--border-color)]\">\r\n <button onClick={() => setShowCreateModal(false)} className=\"btn btn-secondary\">\r\n {t('common:cancel')}\r\n </button>\r\n <button\r\n onClick={handleCreateInstance}\r\n disabled={!formData.name.trim() || !formData.providerId}\r\n className=\"btn btn-primary disabled:opacity-50 disabled:cursor-not-allowed\"\r\n >\r\n {t('common:save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Delete Confirmation Modal */}\r\n <ConfirmModal\r\n isOpen={deleteConfirm.show}\r\n title={t('settings.profiles.actions.delete')}\r\n message={t('settings.profiles.confirmDelete')}\r\n variant=\"danger\"\r\n confirmLabel={t('common:delete')}\r\n onConfirm={confirmDeleteInstance}\r\n onCancel={() => setDeleteConfirm({ show: false, instanceId: null })}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n X,\r\n Play,\r\n Loader2,\r\n Clock,\r\n Coins,\r\n CheckCircle,\r\n XCircle,\r\n ChevronDown,\r\n ChevronUp,\r\n Copy,\r\n Check,\r\n} from 'lucide-react';\r\nimport {\r\n aiApi,\r\n type AiSkillDetailDto,\r\n type AiSkillExecutionResponse,\r\n type ProviderListDto,\r\n type ModelListDto,\r\n} from '@/services/api/aiApi';\r\n\r\ninterface PromptTestPanelProps {\r\n readonly prompt: AiSkillDetailDto;\r\n readonly onClose: () => void;\r\n}\r\n\r\nexport function PromptTestPanel({ prompt, onClose }: PromptTestPanelProps): ReactElement {\r\n const { t } = useTranslation(['ai']);\r\n const [variables, setVariables] = useState<Record<string, string>>({});\r\n const [providers, setProviders] = useState<ProviderListDto[]>([]);\r\n const [models, setModels] = useState<ModelListDto[]>([]);\r\n const [selectedProviderId, setSelectedProviderId] = useState<string>('');\r\n const [selectedModelId, setSelectedModelId] = useState<string>('');\r\n const [executing, setExecuting] = useState(false);\r\n const [result, setResult] = useState<AiSkillExecutionResponse | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showDebug, setShowDebug] = useState(false);\r\n const [copied, setCopied] = useState(false);\r\n\r\n // Initialize variables from prompt\r\n useEffect(() => {\r\n const initialVars: Record<string, string> = {};\r\n prompt.variables.forEach((v) => {\r\n initialVars[v] = '';\r\n });\r\n setVariables(initialVars);\r\n }, [prompt.variables]);\r\n\r\n // Load providers\r\n useEffect(() => {\r\n const loadProviders = async () => {\r\n try {\r\n const providersData = await aiApi.settings.getProviders();\r\n // Filter out system providers for manual testing\r\n const activeProviders = (providersData ?? []).filter((p) => p.isActive);\r\n setProviders(activeProviders);\r\n } catch (err) {\r\n console.error('Failed to load providers:', err);\r\n }\r\n };\r\n loadProviders();\r\n }, []);\r\n\r\n // Load models when provider changes\r\n useEffect(() => {\r\n const loadModels = async () => {\r\n if (!selectedProviderId) {\r\n setModels([]);\r\n return;\r\n }\r\n try {\r\n const modelsData = await aiApi.settings.getModels(undefined, selectedProviderId);\r\n const activeModels = (modelsData ?? []).filter((m) => m.isActive && !m.isDeprecated);\r\n setModels(activeModels);\r\n // Auto-select first model\r\n if (activeModels.length > 0) {\r\n setSelectedModelId(activeModels[0].id);\r\n }\r\n } catch (err) {\r\n console.error('Failed to load models:', err);\r\n }\r\n };\r\n loadModels();\r\n }, [selectedProviderId]);\r\n\r\n const handleExecute = async () => {\r\n setExecuting(true);\r\n setError(null);\r\n setResult(null);\r\n\r\n try {\r\n const response = await aiApi.skills.execute(prompt.id, {\r\n variables: Object.keys(variables).length > 0 ? variables : undefined,\r\n providerId: selectedProviderId || undefined,\r\n modelId: selectedModelId || undefined,\r\n });\r\n\r\n if (response) {\r\n setResult(response);\r\n if (!response.success && response.error) {\r\n setError(response.error);\r\n }\r\n }\r\n } catch (err: unknown) {\r\n console.error('Failed to execute prompt:', err);\r\n const errorMessage = err instanceof Error ? err.message : 'Une erreur est survenue';\r\n setError(errorMessage);\r\n } finally {\r\n setExecuting(false);\r\n }\r\n };\r\n\r\n const handleCopyResponse = async () => {\r\n if (result?.response) {\r\n await navigator.clipboard.writeText(result.response);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n }\r\n };\r\n\r\n // Build preview from blocks with variable substitution\r\n const getPreview = () => {\r\n return prompt.blocks\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .filter((b) => b.isEnabled)\r\n .map((block) => {\r\n let content = block.content;\r\n Object.entries(variables).forEach(([key, value]) => {\r\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value || `{${key}}`);\r\n });\r\n return `# ${block.label}\\n${content}`;\r\n })\r\n .join('\\n\\n');\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-4xl p-6 max-h-[90vh] overflow-hidden flex flex-col\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <div>\r\n <h3 className=\"text-lg font-semibold flex items-center gap-2\">\r\n <Play className=\"w-5 h-5 text-[var(--color-primary-600)]\" />\r\n {t('skills.test.title')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{prompt.name}</p>\r\n </div>\r\n <button onClick={onClose} className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex-1 overflow-y-auto space-y-4\">\r\n {/* Variables Section */}\r\n {prompt.variables.length > 0 && (\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-3\">{t('skills.test.variables')}</h4>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n {prompt.variables.map((variable) => (\r\n <div key={variable}>\r\n <label className=\"block text-xs text-[var(--text-secondary)] mb-1 font-mono\">\r\n {`{${variable}}`}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={variables[variable] || ''}\r\n onChange={(e) => setVariables({ ...variables, [variable]: e.target.value })}\r\n className=\"input w-full text-sm\"\r\n placeholder={t('skills.test.enterValue')}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Provider & Model Selection */}\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-3\">{t('skills.test.configuration')}</h4>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('skills.test.provider')}\r\n </label>\r\n <select\r\n value={selectedProviderId}\r\n onChange={(e) => {\r\n setSelectedProviderId(e.target.value);\r\n setSelectedModelId('');\r\n }}\r\n className=\"input w-full text-sm\"\r\n >\r\n <option value=\"\">{t('skills.test.defaultProvider')}</option>\r\n {providers.map((provider) => (\r\n <option key={provider.id} value={provider.id}>\r\n {provider.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-xs text-[var(--text-secondary)] mb-1\">\r\n {t('skills.test.model')}\r\n </label>\r\n <select\r\n value={selectedModelId}\r\n onChange={(e) => setSelectedModelId(e.target.value)}\r\n className=\"input w-full text-sm\"\r\n disabled={!selectedProviderId}\r\n >\r\n <option value=\"\">{t('skills.test.defaultModel')}</option>\r\n {models.map((model) => (\r\n <option key={model.id} value={model.id}>\r\n {model.name}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Prompt Preview */}\r\n <div className=\"p-4 border border-[var(--border-color)] rounded-lg\">\r\n <h4 className=\"text-sm font-medium mb-2\">{t('skills.test.promptPreview')}</h4>\r\n <pre className=\"whitespace-pre-wrap font-mono text-xs bg-[var(--bg-secondary)] p-3 rounded max-h-40 overflow-y-auto\">\r\n {getPreview() || t('skills.test.noContent')}\r\n </pre>\r\n </div>\r\n\r\n {/* Execute Button */}\r\n <div className=\"flex justify-center\">\r\n <button\r\n onClick={handleExecute}\r\n disabled={executing}\r\n className=\"btn btn-primary flex items-center gap-2 px-8\"\r\n >\r\n {executing ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <Play className=\"w-4 h-4\" />\r\n )}\r\n {executing ? t('skills.test.executing') : t('skills.test.execute')}\r\n </button>\r\n </div>\r\n\r\n {/* Error Display */}\r\n {error && (\r\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-red-800 dark:text-red-200\">\r\n <XCircle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span className=\"font-medium\">{t('skills.test.error')}</span>\r\n </div>\r\n <p className=\"mt-2 text-sm text-red-700 dark:text-red-300\">{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Result Display */}\r\n {result?.success && (\r\n <div className=\"space-y-3\">\r\n {/* Success Header */}\r\n <div className=\"flex items-center justify-between p-3 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-green-800 dark:text-green-200\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{t('skills.test.success')}</span>\r\n </div>\r\n <div className=\"flex items-center gap-4 text-sm text-green-700 dark:text-green-300\">\r\n <span className=\"flex items-center gap-1\">\r\n <Clock className=\"w-4 h-4\" />\r\n {result.latencyMs}ms\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Coins className=\"w-4 h-4\" />\r\n {result.totalTokens} tokens\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Response */}\r\n <div className=\"p-4 border border-[var(--border-color)] rounded-lg\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <h4 className=\"text-sm font-medium\">{t('skills.test.response')}</h4>\r\n <button\r\n onClick={handleCopyResponse}\r\n className=\"btn btn-secondary btn-sm flex items-center gap-1\"\r\n >\r\n {copied ? <Check className=\"w-3 h-3\" /> : <Copy className=\"w-3 h-3\" />}\r\n {copied ? t('skills.test.copied') : t('skills.test.copy')}\r\n </button>\r\n </div>\r\n <pre className=\"whitespace-pre-wrap font-mono text-sm bg-[var(--bg-secondary)] p-3 rounded max-h-60 overflow-y-auto\">\r\n {result.response}\r\n </pre>\r\n </div>\r\n\r\n {/* Debug Info Toggle */}\r\n <button\r\n onClick={() => setShowDebug(!showDebug)}\r\n className=\"w-full flex items-center justify-center gap-2 text-sm text-[var(--text-secondary)] hover:text-[var(--text-primary)] py-2\"\r\n >\r\n {showDebug ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />}\r\n {t('skills.test.debugInfo')}\r\n </button>\r\n\r\n {/* Debug Details */}\r\n {showDebug && (\r\n <div className=\"p-4 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"grid grid-cols-2 gap-3 text-sm\">\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.inputTokens')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.inputTokens}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.outputTokens')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.outputTokens}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.totalTokens')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.totalTokens}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.latency')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.latencyMs}ms</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.modelUsed')}:</span>\r\n <span className=\"ml-2 font-mono\">{result.modelName}</span>\r\n </div>\r\n <div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.test.promptId')}:</span>\r\n <span className=\"ml-2 font-mono text-xs\">{result.skillId}</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"flex justify-end gap-2 pt-4 mt-4 border-t border-[var(--border-color)]\">\r\n <button onClick={onClose} className=\"btn btn-secondary\">\r\n {t('common.close')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n FileText,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n Search,\r\n Eye,\r\n Edit2,\r\n Trash2,\r\n Copy,\r\n CheckCircle,\r\n XCircle,\r\n Blocks,\r\n Tag,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ViewToggle, type ViewMode, StatusBadge, Pagination } from '@/components/ui/DataView';\r\nimport { aiApi, type AiSkillListDto } from '@/services/api/aiApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\nconst statusColors: Record<string, 'active' | 'inactive' | 'warning'> = {\r\n Draft: 'inactive',\r\n Active: 'active',\r\n Deprecated: 'warning',\r\n};\r\n\r\nexport function AiPromptsListPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n\r\n const [prompts, setPrompts] = useState<AiSkillListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [search, setSearch] = useState('');\r\n const [filterCategory, setFilterCategory] = useState('');\r\n const [filterStatus, setFilterStatus] = useState('');\r\n\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadPrompts = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const params: Record<string, string> = {};\r\n if (search) params.search = search;\r\n if (filterCategory) params.category = filterCategory;\r\n if (filterStatus) params.status = filterStatus;\r\n\r\n const result = await aiApi.skills.getAll(params);\r\n setPrompts(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load prompts:', err);\r\n setError(t('skills.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n // TENANT ISOLATION: Re-fetch when tenant changes\r\n }, [search, filterCategory, filterStatus, t, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadPrompts();\r\n }, [loadPrompts]);\r\n\r\n const handleDelete = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!confirm(t('skills.confirmDelete'))) return;\r\n try {\r\n await aiApi.skills.delete(prompt.id);\r\n await loadPrompts();\r\n } catch (err) {\r\n console.error('Failed to delete prompt:', err);\r\n }\r\n };\r\n\r\n const handleClone = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n const cloned = await aiApi.skills.clone(prompt.id);\r\n await loadPrompts();\r\n if (cloned) {\r\n navigate(`/administration/ai/skills/${cloned.id}/edit`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to clone prompt:', err);\r\n }\r\n };\r\n\r\n const handleActivate = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n await aiApi.skills.activate(prompt.id);\r\n await loadPrompts();\r\n } catch (err) {\r\n console.error('Failed to activate prompt:', err);\r\n }\r\n };\r\n\r\n const handleDeprecate = async (prompt: AiSkillListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n try {\r\n await aiApi.skills.deprecate(prompt.id);\r\n await loadPrompts();\r\n } catch (err) {\r\n console.error('Failed to deprecate prompt:', err);\r\n }\r\n };\r\n\r\n const categories = Array.from(new Set(prompts.map((p) => p.tags).filter((tag): tag is string => Boolean(tag))));\r\n\r\n const filteredPrompts = prompts;\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedPrompts = filteredPrompts.slice(startIndex, startIndex + pageSize);\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.category')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.version')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.blocks')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.status')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('skills.list.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-primary-600)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedPrompts.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center text-[var(--text-secondary)]\">\r\n {t('skills.list.noSkills')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedPrompts.length > 0 && (\r\n paginatedPrompts.map((prompt) => (\r\n <tr\r\n key={prompt.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}`)}\r\n >\r\n <td className=\"px-4 py-3\" onClick={(e) => e.stopPropagation()}>\r\n <input type=\"checkbox\" className=\"w-4 h-4 rounded border-[var(--border-color)]\" />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileText className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{prompt.name}</p>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Tag className=\"w-3 h-3\" />\r\n {prompt.tags || '-'}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">v{prompt.version}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n <Blocks className=\"w-3.5 h-3.5\" />\r\n {prompt.blockCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={statusColors[prompt.status] || 'inactive'}\r\n label={t(`skills.status.${prompt.status}`)}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('skills.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}/edit`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('skills.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleClone(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('skills.actions.clone')}\r\n >\r\n <Copy className=\"w-4 h-4\" />\r\n </button>\r\n {prompt.status === 'Draft' && (\r\n <button\r\n onClick={(e) => handleActivate(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--success-text)] hover:bg-[var(--success-bg)] transition-all\"\r\n title={t('skills.actions.activate')}\r\n >\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n {prompt.status === 'Active' && (\r\n <button\r\n onClick={(e) => handleDeprecate(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--warning-text)] hover:bg-[var(--warning-bg)] transition-all\"\r\n title={t('skills.actions.deprecate')}\r\n >\r\n <XCircle className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n <button\r\n onClick={(e) => handleDelete(prompt, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('skills.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && paginatedPrompts.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--color-accent-50)] flex items-center justify-center mb-3\">\r\n <FileText className=\"w-8 h-8 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('skills.list.noSkills')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedPrompts.length > 0 && (\r\n paginatedPrompts.map((prompt) => (\r\n <button\r\n key={prompt.id}\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n >\r\n {/* Header with colored background */}\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-[var(--color-accent-500)] flex items-center justify-center shadow-lg\">\r\n <FileText className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div>\r\n <h4 className=\"font-semibold text-[var(--text-primary)] truncate\">{prompt.name}</h4>\r\n </div>\r\n </div>\r\n <StatusBadge\r\n status={statusColors[prompt.status] || 'inactive'}\r\n label={t(`skills.status.${prompt.status}`)}\r\n size=\"sm\"\r\n />\r\n </div>\r\n </div>\r\n {/* Body */}\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {/* Tags */}\r\n <div className=\"flex flex-wrap gap-2\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Tag className=\"w-3 h-3\" />\r\n {prompt.tags || '-'}\r\n </span>\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Blocks className=\"w-3 h-3\" />\r\n {prompt.blockCount} blocs\r\n </span>\r\n <span className=\"px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n v{prompt.version}\r\n </span>\r\n </div>\r\n\r\n {/* Spacer */}\r\n <div className=\"flex-1 min-h-4\" />\r\n\r\n {/* Actions */}\r\n <div\r\n className=\"flex items-center justify-end gap-1 mt-3 pt-3 border-t border-[var(--border-color)]\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${prompt.id}/edit`)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] transition-all\"\r\n title={t('skills.actions.edit')}\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleClone(prompt, e)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] transition-all\"\r\n title={t('skills.actions.clone')}\r\n >\r\n <Copy className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(prompt, e)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('skills.actions.delete')}\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title') }\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <FileText className=\"w-6 h-6\" />\r\n {t('skills.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">\r\n {prompts.length} {t('skills.list.skillsCount')}\r\n </p>\r\n </div>\r\n <button onClick={() => navigate('/administration/ai/skills/create')} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('skills.createSkill')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n <div className=\"flex flex-wrap items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder={t('skills.search')}\r\n className=\"input pl-10 w-full\"\r\n />\r\n </div>\r\n <select value={filterCategory} onChange={(e) => setFilterCategory(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('skills.allCategories')}</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {cat}\r\n </option>\r\n ))}\r\n </select>\r\n <select value={filterStatus} onChange={(e) => setFilterStatus(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('skills.allStatuses')}</option>\r\n <option value=\"Draft\">{t('skills.status.Draft')}</option>\r\n <option value=\"Active\">{t('skills.status.Active')}</option>\r\n <option value=\"Deprecated\">{t('skills.status.Deprecated')}</option>\r\n </select>\r\n </div>\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n showKanban={false}\r\n tableLabel={t('skills.list.tableView')}\r\n cardsLabel={t('skills.list.cardsView')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n\r\n {!loading && filteredPrompts.length > pageSize && (\r\n <Pagination\r\n page={page}\r\n totalPages={Math.ceil(filteredPrompts.length / pageSize)}\r\n totalCount={filteredPrompts.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel=\"skills\"\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n FileText,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Edit2,\r\n Trash2,\r\n Copy,\r\n CheckCircle,\r\n XCircle,\r\n Play,\r\n Eye,\r\n Blocks,\r\n Tag,\r\n Calendar,\r\n User,\r\n GripVertical,\r\n ChevronDown,\r\n ChevronRight,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { StatusBadge } from '@/components/ui/DataView';\r\nimport { aiApi, type AiSkillDetailDto, type AiSkillBlockDto } from '@/services/api/aiApi';\r\nimport { PromptTestPanel } from '@/components/platform/administration/ai/PromptTestPanel';\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400 border-purple-200 dark:border-purple-800',\r\n Context: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400 border-blue-200 dark:border-blue-800',\r\n Task: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400 border-green-200 dark:border-green-800',\r\n Output: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400 border-orange-200 dark:border-orange-800',\r\n Examples: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-400 border-cyan-200 dark:border-cyan-800',\r\n Validation: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400 border-red-200 dark:border-red-800',\r\n};\r\n\r\nconst statusMap: Record<string, 'active' | 'inactive' | 'warning'> = {\r\n Draft: 'inactive',\r\n Active: 'active',\r\n Deprecated: 'warning',\r\n};\r\n\r\nexport function AiSkillsDetailPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: skillId } = useParams<{ id: string }>();\r\n\r\n const [skill, setSkill] = useState<AiSkillDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [showTestPanel, setShowTestPanel] = useState(false);\r\n const [showPreview, setShowPreview] = useState(false);\r\n const [previewVariables, setPreviewVariables] = useState<Record<string, string>>({});\r\n\r\n const loadSkill = useCallback(async () => {\r\n if (!skillId) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.skills.getById(skillId);\r\n setSkill(result ?? null);\r\n if (result?.variables) {\r\n const vars: Record<string, string> = {};\r\n result.variables.forEach((v) => {\r\n vars[v] = '';\r\n });\r\n setPreviewVariables(vars);\r\n }\r\n } catch (err) {\r\n console.error('Failed to load skill:', err);\r\n setError(t('skills.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [skillId, t]);\r\n\r\n useEffect(() => {\r\n loadSkill();\r\n }, [loadSkill]);\r\n\r\n const handleDelete = async () => {\r\n if (!skill || !confirm(t('skills.confirmDelete', { name: skill.name }))) return;\r\n try {\r\n await aiApi.skills.delete(skill.id);\r\n navigate('/administration/ai/skills');\r\n } catch (err) {\r\n console.error('Failed to delete skill:', err);\r\n }\r\n };\r\n\r\n const handleClone = async () => {\r\n if (!skill) return;\r\n try {\r\n const cloned = await aiApi.skills.clone(skill.id);\r\n if (cloned) {\r\n navigate(`/administration/ai/skills/${cloned.id}/edit`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to clone skill:', err);\r\n }\r\n };\r\n\r\n const handleActivate = async () => {\r\n if (!skill) return;\r\n try {\r\n await aiApi.skills.activate(skill.id);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to activate skill:', err);\r\n }\r\n };\r\n\r\n const handleDeprecate = async () => {\r\n if (!skill) return;\r\n try {\r\n await aiApi.skills.deprecate(skill.id);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to deprecate skill:', err);\r\n }\r\n };\r\n\r\n const getPreviewContent = () => {\r\n if (!skill) return '';\r\n return skill.blocks\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .filter((b) => b.isEnabled)\r\n .map((block) => {\r\n let content = block.content;\r\n Object.entries(previewVariables).forEach(([key, value]) => {\r\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value || `{${key}}`);\r\n });\r\n return `## ${block.label}\\n${content}`;\r\n })\r\n .join('\\n\\n');\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !skill) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('skills.backToList')}\r\n </button>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">\r\n {error || t('skills.detail.notFound')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: skill?.name || 'Detail' }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('skills.backToList')}\r\n </button>\r\n <div className=\"flex items-center gap-2\">\r\n <button onClick={() => setShowTestPanel(true)} className=\"btn btn-primary flex items-center gap-2\">\r\n <Play className=\"w-4 h-4\" />\r\n {t('skills.test.title')}\r\n </button>\r\n <button onClick={() => setShowPreview(!showPreview)} className=\"btn btn-secondary flex items-center gap-2\">\r\n <Eye className=\"w-4 h-4\" />\r\n {t('skills.actions.preview')}\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/${skill.id}/edit`)}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('skills.actions.edit')}\r\n </button>\r\n <button onClick={handleClone} className=\"btn btn-secondary flex items-center gap-2\">\r\n <Copy className=\"w-4 h-4\" />\r\n {t('skills.actions.clone')}\r\n </button>\r\n {skill.status === 'Draft' && (\r\n <button onClick={handleActivate} className=\"btn btn-primary flex items-center gap-2\">\r\n <CheckCircle className=\"w-4 h-4\" />\r\n {t('skills.actions.activate')}\r\n </button>\r\n )}\r\n {skill.status === 'Active' && (\r\n <button onClick={handleDeprecate} className=\"btn btn-secondary flex items-center gap-2\">\r\n <XCircle className=\"w-4 h-4\" />\r\n {t('skills.actions.deprecate')}\r\n </button>\r\n )}\r\n <button onClick={handleDelete} className=\"btn btn-danger flex items-center gap-2\">\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n <div className=\"lg:col-span-2 space-y-6\">\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-start gap-4 mb-6\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center shadow-lg\">\r\n <FileText className=\"w-7 h-7 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3 mb-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{skill.name}</h1>\r\n <StatusBadge status={statusMap[skill.status]} label={t(`skills.status.${skill.status}`)} />\r\n </div>\r\n {skill.description && (\r\n <p className=\"text-[var(--text-secondary)] mt-2\">{skill.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Tag className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.list.columns.category')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{skill.tags || '-'}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Blocks className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.list.columns.blocks')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{skill.blocks.length}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Calendar className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.detail.version')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">v{skill.version}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <User className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('skills.detail.createdBy')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{skill.createdBy || 'System'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {skill.variables.length > 0 && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('skills.detail.variables')}</h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {skill.variables.map((variable) => (\r\n <span\r\n key={variable}\r\n className=\"px-3 py-1.5 bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-lg font-mono text-sm\"\r\n >\r\n {`{${variable}}`}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Blocks className=\"w-5 h-5\" />\r\n {t('skills.blocks.title')} ({skill.blocks.length})\r\n </h3>\r\n </div>\r\n\r\n {skill.blocks.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {skill.blocks\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block, index) => (\r\n <BlockDisplay key={block.id} block={block} index={index} t={t} />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)] border border-dashed border-[var(--border-color)] rounded-lg\">\r\n {t('skills.blocks.noBlocks')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-6\">\r\n {showPreview && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('skills.editor.preview')}</h3>\r\n\r\n {skill.variables.length > 0 && (\r\n <div className=\"mb-4 space-y-2\">\r\n <p className=\"text-sm text-[var(--text-secondary)]\">{t('skills.test.variables')}</p>\r\n <div className=\"grid grid-cols-1 gap-2\">\r\n {skill.variables.map((variable) => (\r\n <div key={variable}>\r\n <label className=\"block text-xs text-[var(--text-tertiary)] mb-1\">{`{${variable}}`}</label>\r\n <input\r\n type=\"text\"\r\n value={previewVariables[variable] || ''}\r\n onChange={(e) => setPreviewVariables({ ...previewVariables, [variable]: e.target.value })}\r\n className=\"input w-full text-sm\"\r\n placeholder={t('skills.test.enterValue')}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"border border-[var(--border-color)] rounded-lg p-4 bg-[var(--bg-secondary)] max-h-[400px] overflow-y-auto\">\r\n <pre className=\"whitespace-pre-wrap font-mono text-sm text-[var(--text-primary)]\">\r\n {getPreviewContent() || t('skills.blocks.noBlocks')}\r\n </pre>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('skills.detail.info')}</h3>\r\n <dl className=\"space-y-3 text-sm\">\r\n <div className=\"flex justify-between\">\r\n <dt className=\"text-[var(--text-secondary)]\">{t('skills.detail.createdAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {skill.createdAt ? new Date(skill.createdAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n <div className=\"flex justify-between\">\r\n <dt className=\"text-[var(--text-secondary)]\">{t('skills.detail.updatedAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {skill.updatedAt ? new Date(skill.updatedAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n </dl>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showTestPanel && skill && (\r\n <PromptTestPanel prompt={skill} onClose={() => setShowTestPanel(false)} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction BlockDisplay({\r\n block,\r\n index,\r\n t,\r\n}: {\r\n block: AiSkillBlockDto;\r\n index: number;\r\n t: ReturnType<typeof useTranslation>['t'];\r\n}) {\r\n const [expanded, setExpanded] = useState(index === 0);\r\n\r\n return (\r\n <div className={`border rounded-lg overflow-hidden ${blockTypeColors[block.blockType] || 'border-[var(--border-color)]'}`}>\r\n <button\r\n type=\"button\"\r\n className=\"w-full flex items-center gap-3 p-3 cursor-pointer bg-white/50 dark:bg-black/20 hover:bg-white/70 dark:hover:bg-black/30 transition-colors text-left\"\r\n onClick={() => setExpanded(!expanded)}\r\n >\r\n <GripVertical className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"w-6 h-6 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-xs font-medium\">\r\n {index + 1}\r\n </span>\r\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${blockTypeColors[block.blockType]}`}>\r\n {t(`skills.blocks.types.${block.blockType}`)}\r\n </span>\r\n <span className=\"font-medium flex-1 truncate\">{block.label}</span>\r\n {block.blockDefinitionCode && (\r\n <span className=\"text-xs text-[var(--text-secondary)] bg-[var(--bg-secondary)] px-2 py-0.5 rounded\">\r\n {block.blockDefinitionCode}\r\n </span>\r\n )}\r\n {!block.isEnabled && (\r\n <span className=\"text-xs text-orange-600 bg-orange-100 dark:bg-orange-900/30 px-2 py-0.5 rounded\">\r\n {t('skills.blocks.inactive')}\r\n </span>\r\n )}\r\n {expanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n </button>\r\n {expanded && (\r\n <div className=\"p-4 border-t border-[var(--border-color)] bg-white dark:bg-[var(--bg-primary)]\">\r\n <pre className=\"whitespace-pre-wrap text-sm font-mono text-[var(--text-primary)]\">{block.content}</pre>\r\n {(block.variables?.length ?? 0) > 0 && (\r\n <div className=\"mt-3 pt-3 border-t border-[var(--border-color)]\">\r\n <span className=\"text-xs text-[var(--text-secondary)]\">{t('skills.detail.variables')}: </span>\r\n {block.variables.map((v) => (\r\n <span key={v} className=\"ml-1 text-xs font-mono bg-[var(--bg-secondary)] px-1.5 py-0.5 rounded\">\r\n {`{${v}}`}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n FileText,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Save,\r\n Plus,\r\n Trash2,\r\n ChevronUp,\r\n ChevronDown,\r\n X,\r\n Eye,\r\n Play,\r\n GripVertical,\r\n Blocks,\r\n Settings,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n aiApi,\r\n type AiSkillDetailDto,\r\n type AiSkillBlockDto,\r\n type AiSkillBlockDefinitionListDto,\r\n type CreateAiSkillRequest,\r\n type UpdateAiSkillRequest,\r\n type CreateAiSkillBlockRequest,\r\n type UpdateAiSkillBlockRequest,\r\n} from '@/services/api/aiApi';\r\nimport { PromptTestPanel } from '@/components/platform/administration/ai/PromptTestPanel';\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'border-l-purple-500 bg-purple-50/50 dark:bg-purple-900/10',\r\n Context: 'border-l-blue-500 bg-blue-50/50 dark:bg-blue-900/10',\r\n Task: 'border-l-green-500 bg-green-50/50 dark:bg-green-900/10',\r\n Output: 'border-l-orange-500 bg-orange-50/50 dark:bg-orange-900/10',\r\n Examples: 'border-l-cyan-500 bg-cyan-50/50 dark:bg-cyan-900/10',\r\n Validation: 'border-l-red-500 bg-red-50/50 dark:bg-red-900/10',\r\n};\r\n\r\nconst blockTypeBadge: Record<string, string> = {\r\n System: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400',\r\n Context: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400',\r\n Task: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400',\r\n Output: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400',\r\n Examples: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-400',\r\n Validation: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400',\r\n};\r\n\r\nconst BLOCK_TYPES = ['System', 'Context', 'Task', 'Output', 'Examples', 'Validation'];\r\n\r\nexport function AiSkillsEditPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: skillId } = useParams<{ id: string }>();\r\n const isCreate = !skillId || skillId === 'create';\r\n\r\n const [loading, setLoading] = useState(!isCreate);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [category, setCategory] = useState('');\r\n const [skill, setSkill] = useState<AiSkillDetailDto | null>(null);\r\n\r\n const [blocks, setBlocks] = useState<AiSkillBlockDto[]>([]);\r\n const [definitions, setDefinitions] = useState<AiSkillBlockDefinitionListDto[]>([]);\r\n\r\n const [showAddBlockModal, setShowAddBlockModal] = useState(false);\r\n const [editingBlockId, setEditingBlockId] = useState<string | null>(null);\r\n const [showTestPanel, setShowTestPanel] = useState(false);\r\n\r\n const [previewVariables, setPreviewVariables] = useState<Record<string, string>>({});\r\n const [showSettings, setShowSettings] = useState(false);\r\n\r\n const loadSkill = useCallback(async () => {\r\n if (isCreate) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.skills.getById(skillId!);\r\n if (result) {\r\n setSkill(result);\r\n setName(result.name);\r\n setDescription(result.description || '');\r\n setCategory(result.tags || '');\r\n setBlocks(result.blocks.sort((a, b) => a.displayOrder - b.displayOrder));\r\n }\r\n } catch (err) {\r\n console.error('Failed to load skill:', err);\r\n setError(t('skills.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [skillId, isCreate, t]);\r\n\r\n const loadDefinitions = async () => {\r\n try {\r\n const defs = await aiApi.blockDefinitions.getAll();\r\n setDefinitions(defs ?? []);\r\n } catch (err) {\r\n console.error('Failed to load definitions:', err);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadSkill();\r\n loadDefinitions();\r\n }, [loadSkill]);\r\n\r\n const extractVariables = (content: string): string[] => {\r\n const matches = content.match(/\\{([^}]+)\\}/g);\r\n if (!matches) return [];\r\n return Array.from(new Set(matches.map((m) => m.slice(1, -1))));\r\n };\r\n\r\n const allVariables = blocks.flatMap((b) => extractVariables(b.content));\r\n const uniqueVariables = Array.from(new Set(allVariables));\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n if (isCreate) {\r\n const data: CreateAiSkillRequest = {\r\n name,\r\n description: description || undefined,\r\n code: name.toLowerCase().replace(/\\s+/g, '-'),\r\n tags: category || undefined,\r\n };\r\n const created = await aiApi.skills.create(data);\r\n if (created) {\r\n for (const block of blocks) {\r\n await aiApi.skills.addBlock(created.id, {\r\n blockType: block.blockType,\r\n label: block.label ?? '',\r\n content: block.content,\r\n displayOrder: block.displayOrder,\r\n });\r\n }\r\n navigate(`/administration/ai/skills/${created.id}`);\r\n }\r\n } else {\r\n const data: UpdateAiSkillRequest = {\r\n name,\r\n description: description || undefined,\r\n tags: category || undefined,\r\n };\r\n await aiApi.skills.update(skillId!, data);\r\n navigate(`/administration/ai/skills/${skillId}`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to save skill:', err);\r\n setError(t('skills.messages.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleAddBlock = async (blockData: CreateAiSkillBlockRequest) => {\r\n if (isCreate) {\r\n const newBlock: AiSkillBlockDto = {\r\n id: `temp-${Date.now()}`,\r\n blockDefinitionId: blockData.blockDefinitionId || null,\r\n blockDefinitionCode: null,\r\n blockType: blockData.blockType,\r\n label: blockData.label,\r\n content: blockData.content,\r\n displayOrder: blocks.length + 1,\r\n isRequired: blockData.isRequired ?? false,\r\n isEnabled: true,\r\n condition: blockData.condition ?? null,\r\n variables: extractVariables(blockData.content),\r\n };\r\n setBlocks([...blocks, newBlock]);\r\n } else {\r\n try {\r\n await aiApi.skills.addBlock(skillId!, blockData);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to add block:', err);\r\n }\r\n }\r\n setShowAddBlockModal(false);\r\n };\r\n\r\n const handleUpdateBlock = async (blockId: string, data: UpdateAiSkillBlockRequest) => {\r\n if (isCreate || blockId.startsWith('temp-')) {\r\n setBlocks(\r\n blocks.map((b) =>\r\n b.id === blockId\r\n ? { ...b, ...data, variables: extractVariables(data.content || b.content) }\r\n : b\r\n )\r\n );\r\n } else {\r\n try {\r\n await aiApi.skills.updateBlock(skillId!, blockId, data);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to update block:', err);\r\n }\r\n }\r\n setEditingBlockId(null);\r\n };\r\n\r\n const handleDeleteBlock = async (blockId: string) => {\r\n if (!confirm(t('skills.confirmDeleteBlock'))) return;\r\n if (isCreate || blockId.startsWith('temp-')) {\r\n setBlocks(blocks.filter((b) => b.id !== blockId));\r\n } else {\r\n try {\r\n await aiApi.skills.deleteBlock(skillId!, blockId);\r\n await loadSkill();\r\n } catch (err) {\r\n console.error('Failed to delete block:', err);\r\n }\r\n }\r\n };\r\n\r\n const handleMoveBlock = async (blockId: string, direction: 'up' | 'down') => {\r\n const index = blocks.findIndex((b) => b.id === blockId);\r\n if (index === -1) return;\r\n if (direction === 'up' && index === 0) return;\r\n if (direction === 'down' && index === blocks.length - 1) return;\r\n\r\n const newBlocks = [...blocks];\r\n const swapIndex = direction === 'up' ? index - 1 : index + 1;\r\n [newBlocks[index], newBlocks[swapIndex]] = [newBlocks[swapIndex], newBlocks[index]];\r\n\r\n const reordered = newBlocks.map((b, i) => ({ ...b, displayOrder: i + 1 }));\r\n setBlocks(reordered);\r\n\r\n if (!isCreate && !blockId.startsWith('temp-')) {\r\n try {\r\n await aiApi.skills.reorderBlocks(skillId!, { blockIds: reordered.map((b) => b.id) });\r\n } catch (err) {\r\n console.error('Failed to reorder blocks:', err);\r\n }\r\n }\r\n };\r\n\r\n const getPreviewContent = () => {\r\n return blocks\r\n .filter((b) => b.isEnabled)\r\n .sort((a, b) => a.displayOrder - b.displayOrder)\r\n .map((block) => {\r\n let content = block.content;\r\n Object.entries(previewVariables).forEach(([key, value]) => {\r\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value || `{${key}}`);\r\n });\r\n return `## ${block.label}\\n${content}`;\r\n })\r\n .join('\\n\\n');\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: isCreate ? t('common:create') : (skill?.name || 'Edit') }\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate(isCreate ? '/administration/ai/skills' : `/administration/ai/skills/${skillId}`)}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('common.back')}\r\n </button>\r\n <div className=\"flex items-center gap-2\">\r\n {!isCreate && skill && (\r\n <button onClick={() => setShowTestPanel(true)} className=\"btn btn-secondary flex items-center gap-2\">\r\n <Play className=\"w-4 h-4\" />\r\n {t('skills.test.title')}\r\n </button>\r\n )}\r\n <button onClick={handleSave} disabled={saving || !name || !category} className=\"btn btn-primary flex items-center gap-2\">\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 mb-2\">\r\n <div className=\"w-12 h-12 rounded-xl bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center shadow-lg\">\r\n <FileText className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {isCreate ? t('skills.createSkill') : t('skills.builder.editTitle')}\r\n </h1>\r\n </div>\r\n <button\r\n onClick={() => setShowSettings(!showSettings)}\r\n className={`btn btn-secondary flex items-center gap-2 ${showSettings ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('skills.builder.settings')}\r\n </button>\r\n </div>\r\n\r\n {showSettings && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold mb-4\">{t('skills.builder.skillInfo')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.list.columns.name')} *</label>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.list.columns.category')} *</label>\r\n <input\r\n type=\"text\"\r\n value={category}\r\n onChange={(e) => setCategory(e.target.value)}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n <div className=\"md:col-span-2\">\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.detail.description')}</label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n className=\"input w-full\"\r\n rows={2}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-1 lg:grid-cols-5 gap-6\">\r\n <div className=\"lg:col-span-3 space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Blocks className=\"w-5 h-5\" />\r\n {t('skills.blocks.title')} ({blocks.length})\r\n </h3>\r\n <button onClick={() => setShowAddBlockModal(true)} className=\"btn btn-primary btn-sm flex items-center gap-1\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('skills.blocks.addBlock')}\r\n </button>\r\n </div>\r\n\r\n {blocks.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {blocks.map((block, index) => (\r\n <BlockEditor\r\n key={block.id}\r\n block={block}\r\n index={index}\r\n isFirst={index === 0}\r\n isLast={index === blocks.length - 1}\r\n isEditing={editingBlockId === block.id}\r\n onEdit={() => setEditingBlockId(block.id)}\r\n onCancelEdit={() => setEditingBlockId(null)}\r\n onSave={(data) => handleUpdateBlock(block.id, data)}\r\n onDelete={() => handleDeleteBlock(block.id)}\r\n onMoveUp={() => handleMoveBlock(block.id, 'up')}\r\n onMoveDown={() => handleMoveBlock(block.id, 'down')}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Blocks className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('skills.blocks.noBlocks')}</p>\r\n <button onClick={() => setShowAddBlockModal(true)} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('skills.blocks.addFirstBlock')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"lg:col-span-2\">\r\n <div className=\"card p-6 sticky top-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Eye className=\"w-5 h-5\" />\r\n {t('skills.editor.preview')}\r\n </h3>\r\n </div>\r\n\r\n {uniqueVariables.length > 0 && (\r\n <div className=\"mb-4 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <p className=\"text-sm font-medium mb-2\">{t('skills.test.variables')}</p>\r\n <div className=\"grid grid-cols-1 gap-2\">\r\n {uniqueVariables.map((variable) => (\r\n <div key={variable}>\r\n <label className=\"block text-xs text-[var(--text-tertiary)] mb-1\">{`{${variable}}`}</label>\r\n <input\r\n type=\"text\"\r\n value={previewVariables[variable] || ''}\r\n onChange={(e) => setPreviewVariables({ ...previewVariables, [variable]: e.target.value })}\r\n className=\"input w-full text-sm\"\r\n placeholder={t('skills.test.enterValue')}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"border border-[var(--border-color)] rounded-lg p-4 bg-[var(--bg-secondary)] max-h-[500px] overflow-y-auto\">\r\n <pre className=\"whitespace-pre-wrap font-mono text-sm text-[var(--text-primary)]\">\r\n {getPreviewContent() || t('skills.blocks.noBlocks')}\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showAddBlockModal && (\r\n <AddBlockModal\r\n definitions={definitions}\r\n existingBlocksCount={blocks.length}\r\n onClose={() => setShowAddBlockModal(false)}\r\n onAdd={handleAddBlock}\r\n t={t}\r\n />\r\n )}\r\n\r\n {showTestPanel && skill && (\r\n <PromptTestPanel prompt={skill} onClose={() => setShowTestPanel(false)} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction BlockEditor({\r\n block,\r\n index,\r\n isFirst,\r\n isLast,\r\n isEditing,\r\n onEdit,\r\n onCancelEdit,\r\n onSave,\r\n onDelete,\r\n onMoveUp,\r\n onMoveDown,\r\n t,\r\n}: {\r\n block: AiSkillBlockDto;\r\n index: number;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n isEditing: boolean;\r\n onEdit: () => void;\r\n onCancelEdit: () => void;\r\n onSave: (data: UpdateAiSkillBlockRequest) => void;\r\n onDelete: () => void;\r\n onMoveUp: () => void;\r\n onMoveDown: () => void;\r\n t: ReturnType<typeof useTranslation>['t'];\r\n}) {\r\n const [label, setLabel] = useState(block.label ?? '');\r\n const [content, setContent] = useState(block.content);\r\n const [blockType, setBlockType] = useState(block.blockType);\r\n const [isEnabled, setIsEnabled] = useState(block.isEnabled);\r\n\r\n useEffect(() => {\r\n setLabel(block.label || '');\r\n setContent(block.content);\r\n setBlockType(block.blockType);\r\n setIsEnabled(block.isEnabled);\r\n }, [block]);\r\n\r\n const handleSave = () => {\r\n onSave({ label: label || undefined, content, isEnabled });\r\n };\r\n\r\n if (isEditing) {\r\n return (\r\n <div className={`card border-l-4 ${blockTypeColors[blockType]} p-4`}>\r\n <div className=\"space-y-3\">\r\n <div className=\"flex gap-3\">\r\n <div className=\"flex-1\">\r\n <label className=\"block text-xs font-medium mb-1\">{t('skills.editor.title')}</label>\r\n <input\r\n type=\"text\"\r\n value={label}\r\n onChange={(e) => setLabel(e.target.value)}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n <div className=\"w-40\">\r\n <label className=\"block text-xs font-medium mb-1\">{t('skills.blocks.type')}</label>\r\n <select value={blockType} onChange={(e) => setBlockType(e.target.value)} className=\"input w-full\">\r\n {BLOCK_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`skills.blocks.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('skills.editor.content')}</label>\r\n <textarea\r\n value={content}\r\n onChange={(e) => setContent(e.target.value)}\r\n className=\"input w-full font-mono text-sm\"\r\n rows={6}\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">{t('skills.editor.variableFormat')}</p>\r\n </div>\r\n <div className=\"flex items-center justify-between\">\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isEnabled}\r\n onChange={(e) => setIsEnabled(e.target.checked)}\r\n className=\"rounded\"\r\n />\r\n {t('skills.blocks.active')}\r\n </label>\r\n <div className=\"flex gap-2\">\r\n <button onClick={onCancelEdit} className=\"btn btn-secondary btn-sm\">\r\n {t('common.cancel')}\r\n </button>\r\n <button onClick={handleSave} className=\"btn btn-primary btn-sm\">\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={`card border-l-4 ${blockTypeColors[block.blockType]} p-4 cursor-pointer hover:shadow-md transition-shadow text-left w-full ${\r\n !block.isEnabled ? 'opacity-60' : ''\r\n }`}\r\n onClick={onEdit}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"flex flex-col items-center gap-1\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onMoveUp();\r\n }}\r\n disabled={isFirst}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronUp className=\"w-4 h-4\" />\r\n </button>\r\n <GripVertical className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onMoveDown();\r\n }}\r\n disabled={isLast}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <span className=\"w-6 h-6 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-xs font-medium\">\r\n {index + 1}\r\n </span>\r\n <span className={`px-2 py-0.5 rounded text-xs font-medium ${blockTypeBadge[block.blockType]}`}>\r\n {t(`skills.blocks.types.${block.blockType}`)}\r\n </span>\r\n <span className=\"font-medium truncate\">{block.label}</span>\r\n {!block.isEnabled && (\r\n <span className=\"text-xs text-orange-600 bg-orange-100 dark:bg-orange-900/30 px-2 py-0.5 rounded\">\r\n {t('skills.blocks.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 font-mono\">{block.content}</p>\r\n {(block.variables?.length ?? 0) > 0 && (\r\n <div className=\"mt-2 flex flex-wrap gap-1\">\r\n {block.variables.map((v) => (\r\n <span key={v} className=\"text-xs font-mono bg-[var(--bg-secondary)] px-1.5 py-0.5 rounded\">\r\n {`{${v}}`}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onDelete();\r\n }}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </button>\r\n );\r\n}\r\n\r\nfunction AddBlockModal({\r\n definitions,\r\n existingBlocksCount,\r\n onClose,\r\n onAdd,\r\n t,\r\n}: {\r\n definitions: AiSkillBlockDefinitionListDto[];\r\n existingBlocksCount: number;\r\n onClose: () => void;\r\n onAdd: (data: CreateAiSkillBlockRequest) => void;\r\n t: ReturnType<typeof useTranslation>['t'];\r\n}) {\r\n const [mode, setMode] = useState<'custom' | 'definition'>('custom');\r\n const [selectedDefinitionId, setSelectedDefinitionId] = useState('');\r\n const [blockType, setBlockType] = useState('Task');\r\n const [label, setLabel] = useState('');\r\n const [content, setContent] = useState('');\r\n\r\n const handleDefinitionChange = async (defId: string) => {\r\n setSelectedDefinitionId(defId);\r\n if (defId) {\r\n try {\r\n const def = await aiApi.blockDefinitions.getById(defId);\r\n if (def) {\r\n setBlockType(def.blockType);\r\n setLabel(def.defaultTitle || '');\r\n setContent(def.defaultContent || '');\r\n }\r\n } catch (err) {\r\n console.error('Failed to load definition:', err);\r\n }\r\n }\r\n };\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n onAdd({\r\n blockDefinitionId: mode === 'definition' && selectedDefinitionId ? selectedDefinitionId : undefined,\r\n blockType,\r\n label,\r\n content,\r\n displayOrder: existingBlocksCount + 1,\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\r\n <div className=\"bg-[var(--bg-primary)] rounded-lg shadow-xl w-full max-w-lg p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h3 className=\"text-lg font-semibold\">{t('skills.blocks.addBlock')}</h3>\r\n <button onClick={onClose} className=\"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\">\r\n <X className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex gap-2 mb-4\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setMode('custom')}\r\n className={`flex-1 py-2 px-4 rounded-lg border transition-colors ${\r\n mode === 'custom'\r\n ? 'border-[var(--color-primary-500)] bg-[var(--color-primary-50)] dark:bg-[var(--color-primary-900)]/20'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-secondary)]'\r\n }`}\r\n >\r\n {t('skills.blocks.custom')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => setMode('definition')}\r\n className={`flex-1 py-2 px-4 rounded-lg border transition-colors ${\r\n mode === 'definition'\r\n ? 'border-[var(--color-primary-500)] bg-[var(--color-primary-50)] dark:bg-[var(--color-primary-900)]/20'\r\n : 'border-[var(--border-color)] hover:bg-[var(--bg-secondary)]'\r\n }`}\r\n >\r\n {t('skills.blocks.fromDefinition')}\r\n </button>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {mode === 'definition' && (\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.definitions.title')}</label>\r\n <select\r\n value={selectedDefinitionId}\r\n onChange={(e) => handleDefinitionChange(e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('skills.definitions.selectDefinition')}</option>\r\n {definitions.map((def) => (\r\n <option key={def.id} value={def.id}>\r\n {def.name} ({t(`skills.blocks.types.${def.blockType}`)})\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.blocks.type')}</label>\r\n <select value={blockType} onChange={(e) => setBlockType(e.target.value)} className=\"input w-full\">\r\n {BLOCK_TYPES.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`skills.blocks.types.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.editor.title')}</label>\r\n <input\r\n type=\"text\"\r\n value={label}\r\n onChange={(e) => setLabel(e.target.value)}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('skills.editor.content')}</label>\r\n <textarea\r\n value={content}\r\n onChange={(e) => setContent(e.target.value)}\r\n className=\"input w-full font-mono text-sm\"\r\n rows={6}\r\n required\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">{t('skills.editor.variableFormat')}</p>\r\n </div>\r\n\r\n <div className=\"flex justify-end gap-2 pt-4\">\r\n <button type=\"button\" onClick={onClose} className=\"btn btn-secondary\">\r\n {t('common.cancel')}\r\n </button>\r\n <button type=\"submit\" className=\"btn btn-primary\">\r\n {t('common.create')}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Blocks,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n Search,\r\n Eye,\r\n Edit2,\r\n Trash2,\r\n Shield,\r\n FileText,\r\n Target,\r\n MessageSquare,\r\n ListChecks,\r\n Sparkles,\r\n Globe,\r\n Lock,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ViewToggle, type ViewMode, StatusBadge, Pagination } from '@/components/ui/DataView';\r\nimport { aiApi, type AiSkillBlockDefinitionListDto } from '@/services/api/aiApi';\r\n\r\nconst blockTypeIcons: Record<string, React.ReactNode> = {\r\n System: <Shield className=\"w-4 h-4\" />,\r\n Context: <FileText className=\"w-4 h-4\" />,\r\n Task: <Target className=\"w-4 h-4\" />,\r\n Output: <MessageSquare className=\"w-4 h-4\" />,\r\n Examples: <ListChecks className=\"w-4 h-4\" />,\r\n Validation: <Sparkles className=\"w-4 h-4\" />,\r\n};\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'from-red-500 to-rose-500',\r\n Context: 'from-blue-500 to-cyan-500',\r\n Task: 'from-amber-500 to-orange-500',\r\n Output: 'from-green-500 to-emerald-500',\r\n Examples: 'from-purple-500 to-violet-500',\r\n Validation: 'from-pink-500 to-fuchsia-500',\r\n};\r\n\r\nexport function AiBlockDefinitionsListPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n\r\n const [definitions, setDefinitions] = useState<AiSkillBlockDefinitionListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [search, setSearch] = useState('');\r\n const [filterType, setFilterType] = useState('');\r\n\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadDefinitions = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const params: Record<string, string> = {};\r\n if (search) params.search = search;\r\n if (filterType) params.blockType = filterType;\r\n\r\n const result = await aiApi.blockDefinitions.getAll(params);\r\n setDefinitions(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load block definitions:', err);\r\n setError(t('definitions.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [search, filterType, t]);\r\n\r\n useEffect(() => {\r\n loadDefinitions();\r\n }, [loadDefinitions]);\r\n\r\n const handleDelete = async (definition: AiSkillBlockDefinitionListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (definition.isSystem) {\r\n alert(t('definitions.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (definition.usageCount > 0) {\r\n alert(t('definitions.messages.cannotDeleteInUse', { count: definition.usageCount }));\r\n return;\r\n }\r\n if (!confirm(t('definitions.confirmDelete', { name: definition.name }))) return;\r\n try {\r\n await aiApi.blockDefinitions.delete(definition.id);\r\n await loadDefinitions();\r\n } catch (err) {\r\n console.error('Failed to delete definition:', err);\r\n }\r\n };\r\n\r\n const filteredDefinitions = definitions.filter((d) => {\r\n if (search && !d.name.toLowerCase().includes(search.toLowerCase())) return false;\r\n if (filterType && d.blockType !== filterType) return false;\r\n return true;\r\n });\r\n\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedDefinitions = filteredDefinitions.slice(startIndex, startIndex + pageSize);\r\n\r\n const blockTypes = ['System', 'Context', 'Task', 'Output', 'Examples', 'Validation'];\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.type')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.description')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.scope')}\r\n </th>\r\n <th className=\"px-4 py-3 text-center text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.usage')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('definitions.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={6} className=\"px-4 py-12 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-primary-600)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedDefinitions.length === 0 && (\r\n <tr>\r\n <td colSpan={6} className=\"px-4 py-12 text-center text-[var(--text-secondary)]\">\r\n {t('definitions.noDefinitions')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedDefinitions.length > 0 && (\r\n paginatedDefinitions.map((definition) => (\r\n <tr\r\n key={definition.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={`w-8 h-8 rounded-lg bg-gradient-to-br ${blockTypeColors[definition.blockType] || 'from-gray-500 to-slate-500'} flex items-center justify-center text-white`}\r\n >\r\n {blockTypeIcons[definition.blockType] || <Blocks className=\"w-4 h-4\" />}\r\n </div>\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{definition.name}</p>\r\n {definition.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.systemBadge')}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {blockTypeIcons[definition.blockType]}\r\n {t(`definitions.blockTypes.${definition.blockType}`)}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <p className=\"text-sm text-[var(--text-secondary)] truncate max-w-xs\">\r\n {definition.description || '-'}\r\n </p>\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n {definition.isGlobal ? (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--success-text)]\">\r\n <Globe className=\"w-3.5 h-3.5\" />\r\n {t('definitions.scope.global')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3.5 h-3.5\" />\r\n {t('definitions.scope.restricted')}\r\n </span>\r\n )}\r\n </td>\r\n <td className=\"px-4 py-3 text-center\">\r\n <StatusBadge\r\n status={definition.usageCount > 0 ? 'active' : 'inactive'}\r\n label={`${definition.usageCount}`}\r\n size=\"sm\"\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('definitions.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n {!definition.isSystem && (\r\n <>\r\n <button\r\n onClick={() =>\r\n navigate(`/administration/ai/skills/blocks/${definition.id}/edit`)\r\n }\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('definitions.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(definition, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('definitions.actions.delete')}\r\n disabled={definition.usageCount > 0}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!loading && paginatedDefinitions.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--bg-secondary)] flex items-center justify-center mb-3\">\r\n <Blocks className=\"w-8 h-8 text-[var(--text-tertiary)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('definitions.noDefinitions')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedDefinitions.length > 0 && (\r\n paginatedDefinitions.map((definition) => (\r\n <button\r\n key={definition.id}\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={`w-10 h-10 rounded-lg bg-gradient-to-br ${blockTypeColors[definition.blockType] || 'from-gray-500 to-slate-500'} flex items-center justify-center text-white shadow-lg`}\r\n >\r\n {blockTypeIcons[definition.blockType] || <Blocks className=\"w-5 h-5\" />}\r\n </div>\r\n <div>\r\n <h3 className=\"font-semibold text-[var(--text-primary)] truncate\">{definition.name}</h3>\r\n <span className=\"inline-flex items-center gap-1 text-xs text-[var(--text-tertiary)]\">\r\n {blockTypeIcons[definition.blockType]}\r\n {t(`definitions.blockTypes.${definition.blockType}`)}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {definition.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-400\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.systemBadge')}\r\n </span>\r\n )}\r\n {definition.isGlobal ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400\">\r\n <Globe className=\"w-3 h-3\" />\r\n {t('definitions.scope.global')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400\">\r\n <Lock className=\"w-3 h-3\" />\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {definition.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 mb-3\">{definition.description}</p>\r\n )}\r\n <div className=\"flex-1\" />\r\n <div className=\"flex items-center gap-2 text-xs text-[var(--text-tertiary)] mb-3\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-[var(--bg-secondary)]\">\r\n {t('definitions.usedIn', { count: definition.usageCount })}\r\n </span>\r\n </div>\r\n <div className=\"flex items-center justify-end gap-1 pt-3 border-t border-[var(--border-color)]\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('definitions.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n {!definition.isSystem && (\r\n <>\r\n <button\r\n onClick={() =>\r\n navigate(`/administration/ai/skills/blocks/${definition.id}/edit`)\r\n }\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('definitions.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(definition, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('definitions.actions.delete')}\r\n disabled={definition.usageCount > 0}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: t('definitions.title') },\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Blocks className=\"w-6 h-6\" />\r\n {t('definitions.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">{t('definitions.subtitle')}</p>\r\n </div>\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks/create')}\r\n className=\"btn btn-primary\"\r\n >\r\n <Plus className=\"w-4 h-4\" />\r\n {t('definitions.createDefinition')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n <div className=\"flex flex-wrap items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder={t('definitions.search')}\r\n className=\"input pl-10 w-full\"\r\n />\r\n </div>\r\n <select value={filterType} onChange={(e) => setFilterType(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('definitions.allTypes')}</option>\r\n {blockTypes.map((type) => (\r\n <option key={type} value={type}>\r\n {t(`definitions.blockTypes.${type}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <ViewToggle\r\n viewMode={viewMode}\r\n onChange={setViewMode}\r\n showKanban={false}\r\n tableLabel={t('definitions.tableView')}\r\n cardsLabel={t('definitions.cardsView')}\r\n />\r\n </div>\r\n </div>\r\n\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n\r\n {!loading && filteredDefinitions.length > pageSize && (\r\n <Pagination\r\n page={page}\r\n totalPages={Math.ceil(filteredDefinitions.length / pageSize)}\r\n totalCount={filteredDefinitions.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel={t('definitions.definitionsCount')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Blocks,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Edit2,\r\n Trash2,\r\n Shield,\r\n FileText,\r\n Target,\r\n MessageSquare,\r\n ListChecks,\r\n Sparkles,\r\n Globe,\r\n Lock,\r\n Calendar,\r\n Hash,\r\n Code,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { aiApi, type AiSkillBlockDefinitionDetailDto } from '@/services/api/aiApi';\r\n\r\nconst blockTypeIcons: Record<string, React.ReactNode> = {\r\n System: <Shield className=\"w-5 h-5\" />,\r\n Context: <FileText className=\"w-5 h-5\" />,\r\n Task: <Target className=\"w-5 h-5\" />,\r\n Output: <MessageSquare className=\"w-5 h-5\" />,\r\n Examples: <ListChecks className=\"w-5 h-5\" />,\r\n Validation: <Sparkles className=\"w-5 h-5\" />,\r\n};\r\n\r\nconst blockTypeColors: Record<string, string> = {\r\n System: 'from-red-500 to-rose-500',\r\n Context: 'from-blue-500 to-cyan-500',\r\n Task: 'from-amber-500 to-orange-500',\r\n Output: 'from-green-500 to-emerald-500',\r\n Examples: 'from-purple-500 to-violet-500',\r\n Validation: 'from-pink-500 to-fuchsia-500',\r\n};\r\n\r\nexport function AiBlockDefinitionDetailPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: definitionId } = useParams<{ id: string }>();\r\n\r\n const [definition, setDefinition] = useState<AiSkillBlockDefinitionDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const loadDefinition = async () => {\r\n if (!definitionId) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.blockDefinitions.getById(definitionId);\r\n setDefinition(result);\r\n } catch (err) {\r\n console.error('Failed to load block definition:', err);\r\n setError(t('definitions.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n loadDefinition();\r\n }, [definitionId, t]);\r\n\r\n const handleDelete = async () => {\r\n if (!definition) return;\r\n if (definition.isSystem) {\r\n alert(t('definitions.cannotDeleteSystem'));\r\n return;\r\n }\r\n if (!confirm(t('definitions.confirmDelete', { name: definition.name }))) return;\r\n try {\r\n await aiApi.blockDefinitions.delete(definition.id);\r\n navigate('/administration/ai/skills/blocks');\r\n } catch (err) {\r\n console.error('Failed to delete definition:', err);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !definition) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-6 text-center\">\r\n <AlertTriangle className=\"w-12 h-12 text-red-600 dark:text-red-400 mx-auto mb-3\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium\">\r\n {error || t('definitions.detail.notFound')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: t('definitions.title'), href: '/administration/ai/skills/blocks' },\r\n { label: definition?.name || 'Detail' }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n {!definition.isSystem && (\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate(`/administration/ai/skills/blocks/${definition.id}/edit`)}\r\n className=\"btn btn-secondary\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('common.edit')}\r\n </button>\r\n <button onClick={handleDelete} className=\"btn btn-danger\">\r\n <Trash2 className=\"w-4 h-4\" />\r\n {t('common.delete')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-start gap-6 mb-6\">\r\n <div\r\n className={`w-16 h-16 rounded-xl bg-gradient-to-br ${blockTypeColors[definition.blockType] || 'from-gray-500 to-slate-500'} flex items-center justify-center text-white shadow-lg`}\r\n >\r\n {blockTypeIcons[definition.blockType] || <Blocks className=\"w-8 h-8\" />}\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3 mb-2\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{definition.name}</h1>\r\n {definition.isSystem && (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.systemBadge')}\r\n </span>\r\n )}\r\n {definition.isGlobal ? (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300\">\r\n <Globe className=\"w-3 h-3\" />\r\n {t('definitions.scope.global')}\r\n </span>\r\n ) : (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium bg-[var(--bg-secondary)] text-[var(--text-tertiary)]\">\r\n <Lock className=\"w-3 h-3\" />\r\n {t('definitions.scope.restricted')}\r\n </span>\r\n )}\r\n </div>\r\n <span className=\"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-sm font-medium bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {blockTypeIcons[definition.blockType]}\r\n {t(`definitions.blockTypes.${definition.blockType}`)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {definition.description && (\r\n <div className=\"mb-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('definitions.columns.description')}\r\n </h3>\r\n <p className=\"text-[var(--text-primary)]\">{definition.description}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-6 pb-6 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <Code className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{t('definitions.fields.code')}</p>\r\n <p className=\"font-mono text-sm text-[var(--text-primary)]\">{definition.code}</p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <Hash className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{t('definitions.fields.usageCount')}</p>\r\n <p className=\"font-semibold text-[var(--text-primary)]\">{definition.usageCount ?? 0}</p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <Calendar className=\"w-5 h-5 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"text-xs text-[var(--text-tertiary)]\">{t('skills.detail.createdAt')}</p>\r\n <p className=\"text-sm text-[var(--text-primary)]\">\r\n {definition.createdAt ? new Date(definition.createdAt).toLocaleDateString() : '-'}\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-3 p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n {definition.isActive ? (\r\n <>\r\n <div className=\"w-2 h-2 rounded-full bg-green-500\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{t('skills.blocks.active')}</span>\r\n </>\r\n ) : (\r\n <>\r\n <div className=\"w-2 h-2 rounded-full bg-gray-400\" />\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('skills.blocks.inactive')}</span>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {definition.defaultTitle && (\r\n <div className=\"mb-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('definitions.fields.defaultTitle')}\r\n </h3>\r\n <p className=\"text-[var(--text-primary)] font-medium\">{definition.defaultTitle}</p>\r\n </div>\r\n )}\r\n\r\n <div>\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-2\">\r\n {t('definitions.fields.defaultContent')}\r\n </h3>\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-4 font-mono text-sm whitespace-pre-wrap text-[var(--text-primary)] border border-[var(--border-color)]\">\r\n {definition.defaultContent || t('common.noData')}\r\n </div>\r\n </div>\r\n\r\n {(definition.variables?.length ?? 0) > 0 && (\r\n <div className=\"mt-6 pt-6 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('skills.detail.variables')}\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {definition.variables.map((variable: string) => (\r\n <span\r\n key={variable}\r\n className=\"inline-flex items-center px-3 py-1.5 rounded-full text-xs font-mono bg-[var(--accent-bg)] text-[var(--accent-text)] border border-[var(--accent-border)]\"\r\n >\r\n {`{${variable}}`}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Blocks,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Save,\r\n Shield,\r\n FileText,\r\n Target,\r\n MessageSquare,\r\n ListChecks,\r\n Sparkles,\r\n Globe,\r\n Lock,\r\n Eye,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { aiApi, type AiSkillBlockDefinitionDetailDto } from '@/services/api/aiApi';\r\n\r\nconst blockTypeIcons: Record<string, React.ReactNode> = {\r\n System: <Shield className=\"w-4 h-4\" />,\r\n Context: <FileText className=\"w-4 h-4\" />,\r\n Task: <Target className=\"w-4 h-4\" />,\r\n Output: <MessageSquare className=\"w-4 h-4\" />,\r\n Examples: <ListChecks className=\"w-4 h-4\" />,\r\n Validation: <Sparkles className=\"w-4 h-4\" />,\r\n};\r\n\r\nconst blockTypes = ['System', 'Context', 'Task', 'Output', 'Examples', 'Validation'];\r\n\r\ninterface FormData {\r\n code: string;\r\n name: string;\r\n description: string;\r\n blockType: string;\r\n defaultTitle: string;\r\n defaultContent: string;\r\n isGlobal: boolean;\r\n}\r\n\r\nexport function AiBlockDefinitionEditPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: definitionId } = useParams<{ id: string }>();\r\n const isEditMode = !!definitionId;\r\n\r\n const [loading, setLoading] = useState(isEditMode);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [definition, setDefinition] = useState<AiSkillBlockDefinitionDetailDto | null>(null);\r\n const [showPreview, setShowPreview] = useState(false);\r\n\r\n const [formData, setFormData] = useState<FormData>({\r\n code: '',\r\n name: '',\r\n description: '',\r\n blockType: 'System',\r\n defaultTitle: '',\r\n defaultContent: '',\r\n isGlobal: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (!isEditMode) return;\r\n const loadDefinition = async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.blockDefinitions.getById(definitionId!);\r\n setDefinition(result);\r\n setFormData({\r\n code: result.code || '',\r\n name: result.name || '',\r\n description: result.description || '',\r\n blockType: result.blockType || 'System',\r\n defaultTitle: result.defaultTitle || '',\r\n defaultContent: result.defaultContent || '',\r\n isGlobal: result.isGlobal ?? true,\r\n });\r\n } catch (err) {\r\n console.error('Failed to load definition:', err);\r\n setError(t('definitions.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n loadDefinition();\r\n }, [definitionId, isEditMode, t]);\r\n\r\n const handleChange = (field: keyof FormData, value: string | boolean) => {\r\n setFormData((prev) => ({ ...prev, [field]: value }));\r\n };\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!formData.name.trim() || !formData.defaultContent.trim()) {\r\n setError(t('definitions.errors.requiredFields'));\r\n return;\r\n }\r\n\r\n try {\r\n setError(null);\r\n setSaving(true);\r\n\r\n if (isEditMode) {\r\n await aiApi.blockDefinitions.update(definitionId!, {\r\n name: formData.name,\r\n description: formData.description || undefined,\r\n defaultTitle: formData.defaultTitle || undefined,\r\n defaultContent: formData.defaultContent,\r\n });\r\n } else {\r\n await aiApi.blockDefinitions.create({\r\n name: formData.name,\r\n blockType: formData.blockType,\r\n description: formData.description || undefined,\r\n defaultTitle: formData.defaultTitle || undefined,\r\n defaultContent: formData.defaultContent,\r\n });\r\n }\r\n\r\n navigate('/administration/ai/skills/blocks');\r\n } catch (err) {\r\n console.error('Failed to save definition:', err);\r\n setError(t('definitions.messages.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n // Extract variables from content\r\n const extractedVariables = (formData.defaultContent.match(/\\{([^}]+)\\}/g) || []).map((v) =>\r\n v.replace(/[{}]/g, '')\r\n );\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (isEditMode && definition?.isSystem) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n <div className=\"bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg p-6 text-center\">\r\n <Lock className=\"w-12 h-12 text-amber-600 dark:text-amber-400 mx-auto mb-3\" />\r\n <p className=\"text-amber-800 dark:text-amber-200 font-medium\">\r\n {t('definitions.cannotEditSystem')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('skills.title'), href: '/administration/ai/skills' },\r\n { label: t('definitions.title'), href: '/administration/ai/skills/blocks' },\r\n { label: isEditMode ? (definition?.name || 'Edit') : t('common:create') }\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('definitions.backToList')}\r\n </button>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3 mb-6\">\r\n <div className=\"w-12 h-12 rounded-xl bg-gradient-to-br from-violet-500 to-purple-500 flex items-center justify-center text-white shadow-lg\">\r\n <Blocks className=\"w-6 h-6\" />\r\n </div>\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {isEditMode ? t('definitions.edit.title') : t('definitions.create.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)]\">{t('definitions.edit.subtitle')}</p>\r\n </div>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"grid grid-cols-1 lg:grid-cols-5 gap-6\">\r\n {/* Left: Form */}\r\n <div className=\"lg:col-span-3 space-y-6\">\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('definitions.edit.basicInfo')}\r\n </h2>\r\n\r\n <div className=\"space-y-4\">\r\n {!isEditMode && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.code')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.code}\r\n onChange={(e) => handleChange('code', e.target.value)}\r\n placeholder=\"my-block-definition\"\r\n className=\"input w-full font-mono\"\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">{t('definitions.fields.codeHelp')}</p>\r\n </div>\r\n )}\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.name')} *\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.name}\r\n onChange={(e) => handleChange('name', e.target.value)}\r\n placeholder={t('definitions.fields.namePlaceholder')}\r\n className=\"input w-full\"\r\n required\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.description')}\r\n </label>\r\n <textarea\r\n value={formData.description}\r\n onChange={(e) => handleChange('description', e.target.value)}\r\n placeholder={t('definitions.fields.descriptionPlaceholder')}\r\n rows={2}\r\n className=\"input w-full resize-none\"\r\n />\r\n </div>\r\n\r\n {!isEditMode && (\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.columns.type')} *\r\n </label>\r\n <div className=\"grid grid-cols-3 gap-2\">\r\n {blockTypes.map((type) => (\r\n <button\r\n key={type}\r\n type=\"button\"\r\n onClick={() => handleChange('blockType', type)}\r\n className={`p-3 rounded-lg border-2 transition-all flex flex-col items-center gap-2 ${\r\n formData.blockType === type\r\n ? 'border-[var(--color-primary-500)] bg-[var(--accent-bg)]'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-primary-300)]'\r\n }`}\r\n >\r\n <span\r\n className={\r\n formData.blockType === type ? 'text-[var(--color-primary-600)]' : 'text-[var(--text-tertiary)]'\r\n }\r\n >\r\n {blockTypeIcons[type]}\r\n </span>\r\n <span className=\"text-xs font-medium\">{t(`definitions.blockTypes.${type}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3 pt-2\">\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={formData.isGlobal}\r\n onChange={(e) => handleChange('isGlobal', e.target.checked)}\r\n className=\"w-4 h-4 rounded border-[var(--border-color)]\"\r\n />\r\n <Globe className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <span className=\"text-sm text-[var(--text-primary)]\">{t('definitions.fields.isGlobal')}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <h2 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('definitions.edit.content')}\r\n </h2>\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPreview(!showPreview)}\r\n className=\"btn btn-secondary btn-sm\"\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n {showPreview ? t('definitions.edit.hidePreview') : t('definitions.edit.showPreview')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-4\">\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.defaultTitle')}\r\n </label>\r\n <input\r\n type=\"text\"\r\n value={formData.defaultTitle}\r\n onChange={(e) => handleChange('defaultTitle', e.target.value)}\r\n placeholder={t('definitions.fields.defaultTitlePlaceholder')}\r\n className=\"input w-full\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <label className=\"block text-sm font-medium text-[var(--text-secondary)] mb-1\">\r\n {t('definitions.fields.defaultContent')} *\r\n </label>\r\n <textarea\r\n value={formData.defaultContent}\r\n onChange={(e) => handleChange('defaultContent', e.target.value)}\r\n placeholder={t('definitions.fields.defaultContentPlaceholder')}\r\n rows={12}\r\n className=\"input w-full font-mono text-sm resize-none\"\r\n required\r\n />\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1\">\r\n {t('definitions.fields.variablesHelp')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Right: Preview & Variables */}\r\n <div className=\"lg:col-span-2 space-y-6\">\r\n {extractedVariables.length > 0 && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('skills.detail.variables')} ({extractedVariables.length})\r\n </h3>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {extractedVariables.map((variable: string) => (\r\n <span\r\n key={variable}\r\n className=\"inline-flex items-center px-3 py-1.5 rounded-full text-xs font-mono bg-[var(--accent-bg)] text-[var(--accent-text)] border border-[var(--accent-border)]\"\r\n >\r\n {`{${variable}}`}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showPreview && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('skills.editor.preview')}\r\n </h3>\r\n <div className=\"bg-[var(--bg-secondary)] rounded-lg p-4 font-mono text-sm whitespace-pre-wrap text-[var(--text-primary)] border border-[var(--border-color)] max-h-96 overflow-y-auto\">\r\n {formData.defaultContent || t('common.noData')}\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"card p-6 bg-[var(--bg-secondary)]\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('definitions.edit.tips')}\r\n </h3>\r\n <ul className=\"space-y-2 text-sm text-[var(--text-tertiary)]\">\r\n <li className=\"flex items-start gap-2\">\r\n <span className=\"text-[var(--color-primary-500)]\">•</span>\r\n {t('definitions.edit.tip1')}\r\n </li>\r\n <li className=\"flex items-start gap-2\">\r\n <span className=\"text-[var(--color-primary-500)]\">•</span>\r\n {t('definitions.edit.tip2')}\r\n </li>\r\n <li className=\"flex items-start gap-2\">\r\n <span className=\"text-[var(--color-primary-500)]\">•</span>\r\n {t('definitions.edit.tip3')}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div className=\"flex gap-3\">\r\n <button\r\n type=\"button\"\r\n onClick={() => navigate('/administration/ai/skills/blocks')}\r\n className=\"btn btn-secondary flex-1\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n <button type=\"submit\" disabled={saving} className=\"btn btn-primary flex-1\">\r\n {saving ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : (\r\n <>\r\n <Save className=\"w-4 h-4\" />\r\n {t('common.save')}\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useMemo, memo } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Activity,\r\n DollarSign,\r\n Zap,\r\n Users,\r\n Loader2,\r\n AlertCircle,\r\n RefreshCw,\r\n ChevronDown,\r\n ChevronRight,\r\n CheckCircle,\r\n XCircle,\r\n} from 'lucide-react';\r\nimport {\r\n aiApi,\r\n type InstanceUsageDto,\r\n type InstanceEventDto,\r\n} from '@/services/api/aiApi';\r\n\r\n// Color classes pattern from CLAUDE.md\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n yellow: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n red: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\ninterface StatCardProps {\r\n readonly title: string;\r\n readonly value: string | number;\r\n readonly icon: React.ReactNode;\r\n readonly color: keyof typeof colorClasses;\r\n}\r\n\r\nconst StatCard = memo(function StatCard({ title, value, icon, color }: StatCardProps) {\r\n return (\r\n <div className={`card p-4 border ${colorClasses[color]}`}>\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium opacity-80\">{title}</span>\r\n {icon}\r\n </div>\r\n <div className=\"text-2xl font-bold\">{value}</div>\r\n </div>\r\n );\r\n});\r\n\r\ntype SortField = 'instanceName' | 'providerName' | 'totalTokens' | 'totalCost' | 'requestCount' | 'avgLatencyMs' | 'lastUsedAt';\r\ntype SortDirection = 'asc' | 'desc';\r\n\r\nexport function AiMonitoringPage(): ReactElement {\r\n const { t } = useTranslation(['ai']);\r\n const [loading, setLoading] = useState(true);\r\n const [refreshing, setRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [period, setPeriod] = useState(30);\r\n const [data, setData] = useState<InstanceUsageDto[]>([]);\r\n const [expandedInstance, setExpandedInstance] = useState<string | null>(null);\r\n const [events, setEvents] = useState<InstanceEventDto[]>([]);\r\n const [eventsLoading, setEventsLoading] = useState(false);\r\n const [sortField, setSortField] = useState<SortField>('totalCost');\r\n const [sortDirection, setSortDirection] = useState<SortDirection>('desc');\r\n\r\n const getDateRange = useCallback((days: number) => {\r\n const end = new Date();\r\n const start = new Date();\r\n start.setDate(start.getDate() - days);\r\n return {\r\n startDate: start.toISOString().split('T')[0],\r\n endDate: end.toISOString(),\r\n };\r\n }, []);\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setError(null);\r\n const { startDate, endDate } = getDateRange(period);\r\n const result = await aiApi.usage.getByInstance(startDate, endDate);\r\n setData(result ?? []);\r\n } catch (err: unknown) {\r\n console.error('Failed to load AI usage data:', err);\r\n setError(t('ai:common.error', 'Failed to load data'));\r\n } finally {\r\n setLoading(false);\r\n setRefreshing(false);\r\n }\r\n }, [period, getDateRange, t]);\r\n\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleRefresh = useCallback(() => {\r\n setRefreshing(true);\r\n loadData();\r\n }, [loadData]);\r\n\r\n const loadInstanceEvents = useCallback(async (instanceId: string) => {\r\n try {\r\n setEventsLoading(true);\r\n const { startDate, endDate } = getDateRange(period);\r\n const result = await aiApi.usage.getInstanceEvents(instanceId, startDate, endDate, 100);\r\n setEvents(result ?? []);\r\n } catch {\r\n setEvents([]);\r\n } finally {\r\n setEventsLoading(false);\r\n }\r\n }, [period, getDateRange]);\r\n\r\n const handleToggleInstance = useCallback((instanceId: string) => {\r\n if (expandedInstance === instanceId) {\r\n setExpandedInstance(null);\r\n setEvents([]);\r\n } else {\r\n setExpandedInstance(instanceId);\r\n loadInstanceEvents(instanceId);\r\n }\r\n }, [expandedInstance, loadInstanceEvents]);\r\n\r\n const handleSort = useCallback((field: SortField) => {\r\n if (sortField === field) {\r\n setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');\r\n } else {\r\n setSortField(field);\r\n setSortDirection('desc');\r\n }\r\n }, [sortField]);\r\n\r\n const sortedData = useMemo(() => {\r\n return [...data].sort((a, b) => {\r\n const aVal = a[sortField];\r\n const bVal = b[sortField];\r\n if (aVal == null && bVal == null) return 0;\r\n if (aVal == null) return 1;\r\n if (bVal == null) return -1;\r\n const cmp = typeof aVal === 'string'\r\n ? aVal.localeCompare(bVal as string)\r\n : (aVal as number) - (bVal as number);\r\n return sortDirection === 'asc' ? cmp : -cmp;\r\n });\r\n }, [data, sortField, sortDirection]);\r\n\r\n const kpis = useMemo(() => {\r\n const activeProfiles = data.length;\r\n const totalCost = data.reduce((sum, d) => sum + d.totalCost, 0);\r\n const totalRequests = data.reduce((sum, d) => sum + d.requestCount, 0);\r\n const totalTokens = data.reduce((sum, d) => sum + d.totalTokens, 0);\r\n return { activeProfiles, totalCost, totalRequests, totalTokens };\r\n }, [data]);\r\n\r\n const formatCurrency = (value: number) => {\r\n const abs = Math.abs(value);\r\n const getFractionDigits = () => {\r\n if (abs === 0 || abs >= 0.01) return 2;\r\n if (abs >= 0.0001) return 4;\r\n return 6;\r\n };\r\n const fractionDigits = getFractionDigits();\r\n return new Intl.NumberFormat('en-US', {\r\n style: 'currency',\r\n currency: 'USD',\r\n minimumFractionDigits: fractionDigits,\r\n maximumFractionDigits: fractionDigits,\r\n }).format(value);\r\n };\r\n\r\n const formatNumber = (value: number) =>\r\n new Intl.NumberFormat('en-US').format(value);\r\n\r\n const formatLatency = (ms: number) => `${Math.round(ms)} ms`;\r\n\r\n const formatSuccessRate = (item: InstanceUsageDto) => {\r\n if (item.requestCount === 0) return '—';\r\n return `${((item.successCount / item.requestCount) * 100).toFixed(1)}%`;\r\n };\r\n\r\n const formatDate = (dateStr: string | null) => {\r\n if (!dateStr) return '—';\r\n return new Date(dateStr).toLocaleString();\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('ai:monitoring.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">{t('ai:monitoring.subtitle')}</p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <select\r\n value={period}\r\n onChange={(e) => setPeriod(Number(e.target.value))}\r\n className=\"px-3 py-2 border border-[var(--border-color)] bg-[var(--bg-card)] text-[var(--text-primary)] rounded-[var(--radius-input)] focus:outline-none focus:ring-2 focus:ring-[var(--color-accent-500)]\"\r\n >\r\n <option value={7}>{t('ai:monitoring.period.7days')}</option>\r\n <option value={30}>{t('ai:monitoring.period.30days')}</option>\r\n <option value={90}>{t('ai:monitoring.period.90days')}</option>\r\n </select>\r\n <button\r\n onClick={handleRefresh}\r\n disabled={refreshing}\r\n className=\"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-hover)] rounded-[var(--radius-button)] flex items-center gap-2\"\r\n >\r\n <RefreshCw className={`w-4 h-4 ${refreshing ? 'animate-spin' : ''}`} />\r\n {t('ai:monitoring.refresh')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"p-4 bg-[var(--error-bg)] border border-[var(--error-border)] rounded-[var(--radius-card)]\">\r\n <div className=\"flex items-center\">\r\n <AlertCircle className=\"h-5 w-5 text-[var(--error-text)]\" />\r\n <span className=\"ml-2 text-[var(--error-text)]\">{error}</span>\r\n </div>\r\n <button\r\n onClick={handleRefresh}\r\n className=\"mt-2 text-sm text-[var(--error-text)] hover:opacity-80 underline\"\r\n >\r\n {t('ai:monitoring.refresh')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalProfiles')}\r\n value={kpis.activeProfiles}\r\n icon={<Users className=\"w-5 h-5\" />}\r\n color=\"blue\"\r\n />\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalCost')}\r\n value={formatCurrency(kpis.totalCost)}\r\n icon={<DollarSign className=\"w-5 h-5\" />}\r\n color=\"green\"\r\n />\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalRequests')}\r\n value={formatNumber(kpis.totalRequests)}\r\n icon={<Activity className=\"w-5 h-5\" />}\r\n color=\"yellow\"\r\n />\r\n <StatCard\r\n title={t('ai:monitoring.kpis.totalTokens')}\r\n value={formatNumber(kpis.totalTokens)}\r\n icon={<Zap className=\"w-5 h-5\" />}\r\n color=\"neutral\"\r\n />\r\n </div>\r\n\r\n {/* Main Table */}\r\n {data.length === 0 ? (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('ai:monitoring.empty')}\r\n </div>\r\n ) : (\r\n <div className=\"bg-[var(--bg-card)] border border-[var(--border-color)] rounded-[var(--radius-card)] overflow-hidden\">\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)] bg-[var(--bg-secondary)]\">\r\n <th className=\"w-8 p-3\" />\r\n <SortableHeader field=\"instanceName\" label={t('ai:monitoring.table.instance')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} />\r\n <SortableHeader field=\"providerName\" label={t('ai:monitoring.table.provider')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} />\r\n <th className=\"text-left p-3 text-sm font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.table.department')}</th>\r\n <th className=\"text-left p-3 text-sm font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.table.costCenter')}</th>\r\n <SortableHeader field=\"totalTokens\" label={t('ai:monitoring.table.totalTokens')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <SortableHeader field=\"totalCost\" label={t('ai:monitoring.table.totalCost')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <SortableHeader field=\"requestCount\" label={t('ai:monitoring.table.requests')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <th className=\"text-right p-3 text-sm font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.table.successRate')}</th>\r\n <SortableHeader field=\"avgLatencyMs\" label={t('ai:monitoring.table.avgLatency')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} align=\"right\" />\r\n <SortableHeader field=\"lastUsedAt\" label={t('ai:monitoring.table.lastUsed')} sortField={sortField} sortDirection={sortDirection} onSort={handleSort} />\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {sortedData.map((item) => (\r\n <InstanceRow\r\n key={item.instanceId}\r\n item={item}\r\n isExpanded={expandedInstance === item.instanceId}\r\n onToggle={handleToggleInstance}\r\n events={expandedInstance === item.instanceId ? events : []}\r\n eventsLoading={expandedInstance === item.instanceId && eventsLoading}\r\n formatCurrency={formatCurrency}\r\n formatNumber={formatNumber}\r\n formatLatency={formatLatency}\r\n formatSuccessRate={formatSuccessRate}\r\n formatDate={formatDate}\r\n />\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Sortable header component\r\ninterface SortableHeaderProps {\r\n readonly field: SortField;\r\n readonly label: string;\r\n readonly sortField: SortField;\r\n readonly sortDirection: SortDirection;\r\n readonly onSort: (field: SortField) => void;\r\n readonly align?: 'left' | 'right';\r\n}\r\n\r\nconst SortableHeader = memo(function SortableHeader({ field, label, sortField, sortDirection, onSort, align = 'left' }: SortableHeaderProps) {\r\n const isActive = sortField === field;\r\n return (\r\n <th\r\n className={`p-3 text-sm font-medium text-[var(--text-secondary)] cursor-pointer hover:text-[var(--text-primary)] select-none ${align === 'right' ? 'text-right' : 'text-left'}`}\r\n onClick={() => onSort(field)}\r\n >\r\n <span className=\"inline-flex items-center gap-1\">\r\n {label}\r\n {isActive && (\r\n <span className=\"text-[var(--color-accent-500)]\">\r\n {sortDirection === 'asc' ? '↑' : '↓'}\r\n </span>\r\n )}\r\n </span>\r\n </th>\r\n );\r\n});\r\n\r\n// Instance row with expandable detail\r\ninterface InstanceRowProps {\r\n readonly item: InstanceUsageDto;\r\n readonly isExpanded: boolean;\r\n readonly onToggle: (id: string) => void;\r\n readonly events: InstanceEventDto[];\r\n readonly eventsLoading: boolean;\r\n readonly formatCurrency: (v: number) => string;\r\n readonly formatNumber: (v: number) => string;\r\n readonly formatLatency: (v: number) => string;\r\n readonly formatSuccessRate: (item: InstanceUsageDto) => string;\r\n readonly formatDate: (d: string | null) => string;\r\n}\r\n\r\nconst InstanceRow = memo(function InstanceRow({\r\n item, isExpanded, onToggle, events, eventsLoading,\r\n formatCurrency, formatNumber, formatLatency, formatSuccessRate, formatDate,\r\n}: InstanceRowProps) {\r\n const { t } = useTranslation(['ai']);\r\n return (\r\n <>\r\n <tr\r\n className=\"border-b border-[var(--border-color)] hover:bg-[var(--bg-hover)] cursor-pointer\"\r\n onClick={() => onToggle(item.instanceId)}\r\n >\r\n <td className=\"p-3 text-center\">\r\n {isExpanded\r\n ? <ChevronDown className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n : <ChevronRight className=\"w-4 h-4 text-[var(--text-secondary)]\" />\r\n }\r\n </td>\r\n <td className=\"p-3 font-medium text-[var(--text-primary)]\">{item.instanceName}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{item.providerName}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{item.department ?? '—'}</td>\r\n <td className=\"p-3 text-[var(--text-secondary)]\">{item.costCenter ?? '—'}</td>\r\n <td className=\"p-3 text-right font-mono text-sm\">{formatNumber(item.totalTokens)}</td>\r\n <td className=\"p-3 text-right font-medium\">{formatCurrency(item.totalCost)}</td>\r\n <td className=\"p-3 text-right\">{formatNumber(item.requestCount)}</td>\r\n <td className=\"p-3 text-right\">{formatSuccessRate(item)}</td>\r\n <td className=\"p-3 text-right text-sm\">{formatLatency(item.avgLatencyMs)}</td>\r\n <td className=\"p-3 text-sm text-[var(--text-secondary)]\">{formatDate(item.lastUsedAt)}</td>\r\n </tr>\r\n {isExpanded && (\r\n <tr>\r\n <td colSpan={11} className=\"p-0\">\r\n <div className=\"bg-[var(--bg-secondary)] border-t border-[var(--border-color)] p-4\">\r\n <h4 className=\"text-sm font-semibold text-[var(--text-primary)] mb-3\">\r\n {t('ai:monitoring.detail.title', { name: item.instanceName })}\r\n </h4>\r\n {eventsLoading && (\r\n <div className=\"flex items-center justify-center py-6\">\r\n <Loader2 className=\"w-5 h-5 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!eventsLoading && events.length === 0 && (\r\n <div className=\"text-center py-4 text-[var(--text-secondary)] text-sm\">\r\n {t('ai:monitoring.detail.noEvents')}\r\n </div>\r\n )}\r\n {!eventsLoading && events.length > 0 && (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm\">\r\n <thead>\r\n <tr className=\"border-b border-[var(--border-color)]\">\r\n <th className=\"text-left p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.timestamp')}</th>\r\n <th className=\"text-left p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.model')}</th>\r\n <th className=\"text-left p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.feature')}</th>\r\n <th className=\"text-right p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.tokens')}</th>\r\n <th className=\"text-right p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.cost')}</th>\r\n <th className=\"text-right p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.latency')}</th>\r\n <th className=\"text-center p-2 font-medium text-[var(--text-secondary)]\">{t('ai:monitoring.detail.status')}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {events.map((event) => (\r\n <tr key={event.id} className=\"border-b border-[var(--border-color)] last:border-0\">\r\n <td className=\"p-2 text-[var(--text-secondary)]\">\r\n {new Date(event.timestamp).toLocaleString()}\r\n </td>\r\n <td className=\"p-2 font-mono\">{event.modelName}</td>\r\n <td className=\"p-2 text-[var(--text-secondary)]\">{event.featureName ?? '—'}</td>\r\n <td className=\"p-2 text-right font-mono\">\r\n <span title={`In: ${formatNumber(event.inputTokens)} / Out: ${formatNumber(event.outputTokens)}`}>\r\n {formatNumber(event.totalTokens)}\r\n </span>\r\n </td>\r\n <td className=\"p-2 text-right\">{formatCurrency(event.costAmount)}</td>\r\n <td className=\"p-2 text-right\">{event.latencyMs} ms</td>\r\n <td className=\"p-2 text-center\">\r\n {event.statusCode >= 200 && event.statusCode < 300 ? (\r\n <CheckCircle className=\"w-4 h-4 text-[var(--success-text)] inline\" />\r\n ) : (\r\n <span title={event.errorMessage ?? ''}>\r\n <XCircle className=\"w-4 h-4 text-[var(--error-text)] inline\" />\r\n </span>\r\n )}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport {\r\n Bot,\r\n Loader2,\r\n AlertTriangle,\r\n Plus,\r\n Search,\r\n Eye,\r\n Edit2,\r\n Trash2,\r\n Workflow,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { ViewToggle, type ViewMode, StatusBadge, Pagination } from '@/components/ui/DataView';\r\nimport { aiApi, type AiAgentListDto } from '@/services/api/aiApi';\r\nimport { useTenant } from '@/contexts/TenantContext';\r\n\r\nexport function AiAgentsPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { currentTenant, isGlobalView } = useTenant();\r\n\r\n const [agents, setAgents] = useState<AiAgentListDto[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [search, setSearch] = useState('');\r\n const [filterStatus, setFilterStatus] = useState('');\r\n\r\n const [viewMode, setViewMode] = useState<ViewMode>('table');\r\n const [page, setPage] = useState(1);\r\n const pageSize = 20;\r\n\r\n const loadAgents = useCallback(async () => {\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.agents.getAll();\r\n setAgents(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load agents:', err);\r\n setError(t('agents.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [t, currentTenant?.id, isGlobalView]);\r\n\r\n useEffect(() => {\r\n loadAgents();\r\n }, [loadAgents]);\r\n\r\n const handleDelete = async (agent: AiAgentListDto, e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (!confirm(t('agents.confirmDelete'))) return;\r\n try {\r\n await aiApi.agents.delete(agent.id);\r\n await loadAgents();\r\n } catch (err) {\r\n console.error('Failed to delete agent:', err);\r\n }\r\n };\r\n\r\n const filteredAgents = agents.filter((agent) => {\r\n const matchesSearch =\r\n !search ||\r\n agent.name.toLowerCase().includes(search.toLowerCase()) ||\r\n agent.agentCode.toLowerCase().includes(search.toLowerCase());\r\n const matchesStatus =\r\n !filterStatus ||\r\n (filterStatus === 'active' && agent.isActive) ||\r\n (filterStatus === 'inactive' && !agent.isActive);\r\n return matchesSearch && matchesStatus;\r\n });\r\n\r\n const startIndex = (page - 1) * pageSize;\r\n const paginatedAgents = filteredAgents.slice(startIndex, startIndex + pageSize);\r\n\r\n const renderTableView = () => (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.name')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.code')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.steps')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.maxParallelism')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.timeout')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.status')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase tracking-wider\">\r\n {t('agents.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {loading && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center\">\r\n <Loader2 className=\"w-8 h-8 animate-spin mx-auto text-[var(--color-primary-600)]\" />\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedAgents.length === 0 && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-12 text-center text-[var(--text-secondary)]\">\r\n {t('agents.noAgents')}\r\n </td>\r\n </tr>\r\n )}\r\n {!loading && paginatedAgents.length > 0 && (\r\n paginatedAgents.map((agent) => (\r\n <tr\r\n key={agent.id}\r\n className=\"group hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}`)}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n <Bot className=\"w-4 h-4 text-[var(--text-tertiary)]\" />\r\n <div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.name}</p>\r\n {agent.description && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] truncate max-w-[300px]\">\r\n {agent.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"font-mono text-sm text-[var(--text-secondary)]\">\r\n {agent.agentCode}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"inline-flex items-center gap-1 text-sm text-[var(--text-secondary)]\">\r\n <Workflow className=\"w-3.5 h-3.5\" />\r\n {agent.stepCount}\r\n </span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{agent.maxParallelism}</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{agent.timeoutSeconds}s</span>\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <StatusBadge\r\n status={agent.isActive ? 'active' : 'inactive'}\r\n label={t(`agents.status.${agent.isActive ? 'active' : 'inactive'}`)}\r\n />\r\n </td>\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center justify-end gap-1\" onClick={(e) => e.stopPropagation()}>\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-primary-600 hover:bg-[var(--accent-bg)] transition-all\"\r\n title={t('agents.actions.view')}\r\n >\r\n <Eye className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}/edit`)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--info-text)] hover:bg-[var(--info-bg)] transition-all\"\r\n title={t('agents.actions.edit')}\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(agent, e)}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('agents.actions.delete')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n\r\n const renderCardsView = () => (\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\r\n {loading && (\r\n <div className=\"col-span-full flex items-center justify-center py-16\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-500)]\" />\r\n </div>\r\n )}\r\n {!loading && paginatedAgents.length === 0 && (\r\n <div className=\"col-span-full flex flex-col items-center justify-center py-16\">\r\n <div className=\"w-16 h-16 rounded-lg bg-[var(--color-accent-50)] flex items-center justify-center mb-3\">\r\n <Bot className=\"w-8 h-8 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <span className=\"text-[var(--text-secondary)]\">{t('agents.noAgents')}</span>\r\n </div>\r\n )}\r\n {!loading && paginatedAgents.length > 0 && (\r\n paginatedAgents.map((agent) => (\r\n <button\r\n key={agent.id}\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}`)}\r\n className=\"bg-[var(--bg-card)] border-2 border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)] rounded-[var(--radius-card)] overflow-hidden transition-all hover:shadow-lg hover:border-[var(--color-accent-400)] cursor-pointer flex flex-col text-left\"\r\n >\r\n <div className=\"bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20 p-4 border-b border-[var(--color-accent-200)] dark:border-[var(--color-accent-800)]\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 rounded-lg bg-[var(--color-accent-500)] flex items-center justify-center shadow-lg\">\r\n <Bot className=\"w-5 h-5 text-white\" />\r\n </div>\r\n <div>\r\n <h4 className=\"font-semibold text-[var(--text-primary)] truncate\">{agent.name}</h4>\r\n <p className=\"text-xs font-mono text-[var(--text-tertiary)]\">{agent.agentCode}</p>\r\n </div>\r\n </div>\r\n <StatusBadge\r\n status={agent.isActive ? 'active' : 'inactive'}\r\n label={t(`agents.status.${agent.isActive ? 'active' : 'inactive'}`)}\r\n size=\"sm\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"p-4 flex flex-col flex-1\">\r\n {agent.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] line-clamp-2 mb-3\">{agent.description}</p>\r\n )}\r\n <div className=\"flex flex-wrap gap-2\">\r\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n <Workflow className=\"w-3 h-3\" />\r\n {agent.stepCount} {t('agents.columns.steps').toLowerCase()}\r\n </span>\r\n <span className=\"px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {t('agents.columns.maxParallelism')}: {agent.maxParallelism}\r\n </span>\r\n <span className=\"px-2 py-1 rounded-full text-xs bg-[var(--bg-secondary)] text-[var(--text-secondary)]\">\r\n {agent.timeoutSeconds}s\r\n </span>\r\n </div>\r\n <div className=\"flex-1 min-h-4\" />\r\n <div\r\n className=\"flex items-center justify-end gap-1 mt-3 pt-3 border-t border-[var(--border-color)]\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}/edit`)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--color-accent-600)] hover:bg-[var(--color-accent-50)] transition-all\"\r\n title={t('agents.actions.edit')}\r\n >\r\n <Edit2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n <button\r\n onClick={(e) => handleDelete(agent, e)}\r\n className=\"p-1.5 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('agents.actions.delete')}\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </div>\r\n </div>\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('agents.title') },\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Bot className=\"w-6 h-6\" />\r\n {t('agents.title')}\r\n </h1>\r\n <p className=\"text-sm text-[var(--text-tertiary)] mt-1\">\r\n {agents.length} {t('agents.agentsCount')}\r\n </p>\r\n </div>\r\n <button onClick={() => navigate('/administration/ai/agents/create')} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('agents.createAgent')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"card p-4\">\r\n <div className=\"flex flex-col md:flex-row md:items-center justify-between gap-4\">\r\n <div className=\"flex flex-wrap items-center gap-3 flex-1\">\r\n <div className=\"relative flex-1 max-w-md\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-[var(--text-secondary)]\" />\r\n <input\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder={t('agents.search')}\r\n className=\"input pl-10 w-full\"\r\n />\r\n </div>\r\n <select value={filterStatus} onChange={(e) => setFilterStatus(e.target.value)} className=\"input\">\r\n <option value=\"\">{t('agents.allStatuses')}</option>\r\n <option value=\"active\">{t('agents.status.active')}</option>\r\n <option value=\"inactive\">{t('agents.status.inactive')}</option>\r\n </select>\r\n </div>\r\n <ViewToggle viewMode={viewMode} onChange={setViewMode} showKanban={false} />\r\n </div>\r\n </div>\r\n\r\n {viewMode === 'table' && renderTableView()}\r\n {viewMode === 'cards' && renderCardsView()}\r\n\r\n {!loading && filteredAgents.length > pageSize && (\r\n <Pagination\r\n page={page}\r\n totalPages={Math.ceil(filteredAgents.length / pageSize)}\r\n totalCount={filteredAgents.length}\r\n pageSize={pageSize}\r\n onPageChange={setPage}\r\n itemLabel={t('agents.agentsCount')}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Bot,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Edit2,\r\n Trash2,\r\n Play,\r\n Workflow,\r\n Clock,\r\n Layers,\r\n User,\r\n AlertCircle,\r\n Timer,\r\n Coins,\r\n ChevronDown,\r\n ChevronRight,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { StatusBadge } from '@/components/ui/DataView';\r\nimport {\r\n aiApi,\r\n type AiAgentDetailDto,\r\n type AiAgentExecutionListDto,\r\n type AiAgentExecutionDetailDto,\r\n} from '@/services/api/aiApi';\r\nimport { useTabNavigation } from '@/hooks/useTabNavigation';\r\n\r\nconst TABS = ['steps', 'executions'] as const;\r\ntype TabId = (typeof TABS)[number];\r\n\r\nconst executionStatusColors: Record<number, 'active' | 'inactive' | 'warning'> = {\r\n 0: 'inactive', // Pending\r\n 1: 'active', // Running\r\n 2: 'active', // Completed\r\n 3: 'warning', // Failed\r\n 4: 'warning', // PartiallyCompleted\r\n 5: 'inactive', // Cancelled\r\n};\r\n\r\nexport function AiAgentDetailPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: agentId } = useParams<{ id: string }>();\r\n const { activeTab, setActiveTab } = useTabNavigation<TabId>('steps', TABS);\r\n\r\n const [agent, setAgent] = useState<AiAgentDetailDto | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const [executions, setExecutions] = useState<AiAgentExecutionListDto[]>([]);\r\n const [executionsLoading, setExecutionsLoading] = useState(false);\r\n const [selectedExecution, setSelectedExecution] = useState<AiAgentExecutionDetailDto | null>(null);\r\n\r\n const loadAgent = useCallback(async () => {\r\n if (!agentId) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.agents.getById(agentId);\r\n setAgent(result ?? null);\r\n } catch (err) {\r\n console.error('Failed to load agent:', err);\r\n setError(t('agents.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [agentId, t]);\r\n\r\n const loadExecutions = useCallback(async () => {\r\n if (!agentId) return;\r\n try {\r\n setExecutionsLoading(true);\r\n const result = await aiApi.agents.getExecutions(agentId);\r\n setExecutions(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load executions:', err);\r\n } finally {\r\n setExecutionsLoading(false);\r\n }\r\n }, [agentId]);\r\n\r\n useEffect(() => {\r\n loadAgent();\r\n }, [loadAgent]);\r\n\r\n useEffect(() => {\r\n if (activeTab === 'executions') {\r\n loadExecutions();\r\n }\r\n }, [activeTab, loadExecutions]);\r\n\r\n const handleDelete = async () => {\r\n if (!agent || !confirm(t('agents.confirmDelete'))) return;\r\n try {\r\n await aiApi.agents.delete(agent.id);\r\n navigate('/administration/ai/agents');\r\n } catch (err) {\r\n console.error('Failed to delete agent:', err);\r\n }\r\n };\r\n\r\n const handleViewExecution = async (executionId: string) => {\r\n try {\r\n const detail = await aiApi.agents.getExecutionDetail(executionId);\r\n setSelectedExecution(detail ?? null);\r\n } catch (err) {\r\n console.error('Failed to load execution detail:', err);\r\n }\r\n };\r\n\r\n const formatDuration = (ms: number) => {\r\n if (ms < 1000) return `${ms}ms`;\r\n return `${(ms / 1000).toFixed(1)}s`;\r\n };\r\n\r\n const formatCost = (cost: number) => `$${cost.toFixed(4)}`;\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !agent) {\r\n return (\r\n <div className=\"space-y-6\">\r\n <button\r\n onClick={() => navigate('/administration/ai/agents')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('agents.backToList')}\r\n </button>\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">\r\n {error || t('common.noData')}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('agents.title'), href: '/administration/ai/agents' },\r\n { label: agent.name },\r\n ]}\r\n />\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() => navigate('/administration/ai/agents')}\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('agents.backToList')}\r\n </button>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => navigate(`/administration/ai/agents/${agent.id}/edit`)}\r\n className=\"btn btn-secondary flex items-center gap-2\"\r\n >\r\n <Edit2 className=\"w-4 h-4\" />\r\n {t('agents.actions.edit')}\r\n </button>\r\n <button onClick={handleDelete} className=\"btn btn-danger flex items-center gap-2\">\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Agent Info Card */}\r\n <div className=\"card p-6\">\r\n <div className=\"flex items-start gap-4 mb-6\">\r\n <div className=\"w-14 h-14 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-500 flex items-center justify-center shadow-lg\">\r\n <Bot className=\"w-7 h-7 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-3 mb-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">{agent.name}</h1>\r\n <StatusBadge\r\n status={agent.isActive ? 'active' : 'inactive'}\r\n label={t(`agents.status.${agent.isActive ? 'active' : 'inactive'}`)}\r\n />\r\n </div>\r\n <p className=\"font-mono text-sm text-[var(--text-tertiary)]\">{agent.agentCode}</p>\r\n {agent.description && (\r\n <p className=\"text-[var(--text-secondary)] mt-2\">{agent.description}</p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Workflow className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.columns.steps')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.steps.length}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Layers className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.columns.maxParallelism')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.maxParallelism}</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <Clock className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.columns.timeout')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.timeoutSeconds}s</p>\r\n </div>\r\n <div className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-[var(--text-tertiary)] mb-1\">\r\n <User className=\"w-4 h-4\" />\r\n <span className=\"text-xs\">{t('agents.detail.createdBy')}</span>\r\n </div>\r\n <p className=\"font-medium text-[var(--text-primary)]\">{agent.createdBy || 'System'}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <nav className=\"flex gap-4\">\r\n {TABS.map((tab) => (\r\n <button\r\n key={tab}\r\n onClick={() => setActiveTab(tab)}\r\n className={`pb-3 px-1 text-sm font-medium border-b-2 transition-colors ${\r\n activeTab === tab\r\n ? 'border-[var(--color-primary-600)] text-[var(--color-primary-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)]'\r\n }`}\r\n >\r\n {t(`agents.detail.${tab}`)}\r\n </button>\r\n ))}\r\n </nav>\r\n </div>\r\n\r\n {/* Tab Content: Steps */}\r\n {activeTab === 'steps' && (\r\n <div className=\"space-y-3\">\r\n {agent.steps.length > 0 ? (\r\n agent.steps.map((step) => (\r\n <div\r\n key={step.id}\r\n className={`card p-4 border-l-4 ${\r\n step.isActive\r\n ? 'border-l-blue-500 bg-blue-50/30 dark:bg-blue-900/10'\r\n : 'border-l-gray-300 opacity-60'\r\n }`}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <span className=\"w-8 h-8 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-sm font-bold\">\r\n {step.stepOrder}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">{step.name}</span>\r\n {step.continueOnFailure && (\r\n <span className=\"text-xs px-2 py-0.5 rounded bg-[var(--warning-bg)] text-[var(--warning-text)]\">\r\n {t('agents.detail.continueOnFailure')}\r\n </span>\r\n )}\r\n {!step.isActive && (\r\n <span className=\"text-xs px-2 py-0.5 rounded bg-orange-100 text-orange-600 dark:bg-orange-900/30\">\r\n {t('agents.status.inactive')}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-2 text-sm text-[var(--text-secondary)]\">\r\n <div>\r\n <span className=\"text-[var(--text-tertiary)]\">{t('agents.detail.stepSkill')}: </span>\r\n <span className=\"font-mono\">\r\n {step.skill ? step.skill.name : step.skillId}\r\n </span>\r\n </div>\r\n {step.outputStateKey && (\r\n <div>\r\n <span className=\"text-[var(--text-tertiary)]\">{t('agents.detail.stepOutputKey')}: </span>\r\n <span className=\"font-mono\">{step.outputStateKey}</span>\r\n </div>\r\n )}\r\n {step.inputMappingJson && (\r\n <div>\r\n <span className=\"text-[var(--text-tertiary)]\">{t('agents.detail.stepInputMapping')}: </span>\r\n <span className=\"font-mono text-xs\">{step.inputMappingJson}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ))\r\n ) : (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Workflow className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('agents.detail.noSteps')}</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Tab Content: Executions */}\r\n {activeTab === 'executions' && (\r\n <div className=\"space-y-4\">\r\n {executionsLoading && (\r\n <div className=\"flex items-center justify-center py-12\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n )}\r\n {!executionsLoading && executions.length === 0 && (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Play className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)]\">{t('agents.executions.noExecutions')}</p>\r\n </div>\r\n )}\r\n {!executionsLoading && executions.length > 0 && (\r\n <div className=\"card overflow-hidden\">\r\n <table className=\"w-full\">\r\n <thead className=\"bg-[var(--bg-secondary)] border-b border-[var(--border-color)]\">\r\n <tr>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.status')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.startedAt')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.steps')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.tokens')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.cost')}\r\n </th>\r\n <th className=\"px-4 py-3 text-left text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.executions.columns.duration')}\r\n </th>\r\n <th className=\"px-4 py-3 text-right text-xs font-medium text-[var(--text-secondary)] uppercase\">\r\n {t('agents.columns.actions')}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-[var(--border-color)]\">\r\n {executions.map((exec) => (\r\n <ExecutionRow\r\n key={exec.id}\r\n execution={exec}\r\n t={t}\r\n formatDuration={formatDuration}\r\n formatCost={formatCost}\r\n selectedExecution={selectedExecution}\r\n onViewDetail={handleViewExecution}\r\n />\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Info Sidebar */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n <div className=\"lg:col-span-3\">\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] mb-4\">{t('agents.detail.info')}</h3>\r\n <dl className=\"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm\">\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.createdAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {agent.createdAt ? new Date(agent.createdAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.createdBy')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">{agent.createdBy || '-'}</dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.updatedAt')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">\r\n {agent.updatedAt ? new Date(agent.updatedAt).toLocaleDateString() : '-'}\r\n </dd>\r\n </div>\r\n <div>\r\n <dt className=\"text-[var(--text-secondary)]\">{t('agents.detail.updatedBy')}</dt>\r\n <dd className=\"text-[var(--text-primary)]\">{agent.updatedBy || '-'}</dd>\r\n </div>\r\n </dl>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ExecutionRow({\r\n execution,\r\n t,\r\n formatDuration,\r\n formatCost,\r\n selectedExecution,\r\n onViewDetail,\r\n}: {\r\n execution: AiAgentExecutionListDto;\r\n t: ReturnType<typeof import('react-i18next').useTranslation>['t'];\r\n formatDuration: (ms: number) => string;\r\n formatCost: (cost: number) => string;\r\n selectedExecution: AiAgentExecutionDetailDto | null;\r\n onViewDetail: (id: string) => Promise<void>;\r\n}) {\r\n const [expanded, setExpanded] = useState(false);\r\n const isSelected = selectedExecution?.id === execution.id;\r\n\r\n const handleToggle = async () => {\r\n if (!expanded && !isSelected) {\r\n await onViewDetail(execution.id);\r\n }\r\n setExpanded(!expanded);\r\n };\r\n\r\n return (\r\n <>\r\n <tr\r\n className=\"hover:bg-[var(--bg-hover)] transition-all cursor-pointer\"\r\n onClick={handleToggle}\r\n >\r\n <td className=\"px-4 py-3\">\r\n <div className=\"flex items-center gap-2\">\r\n {expanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n <StatusBadge\r\n status={executionStatusColors[execution.status] || 'inactive'}\r\n label={t(`agents.executions.status.${execution.status}`)}\r\n />\r\n </div>\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {new Date(execution.startedAt).toLocaleString()}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {execution.executedSteps}/{execution.totalSteps}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {(execution.totalInputTokens + execution.totalOutputTokens).toLocaleString()}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {formatCost(execution.totalCost)}\r\n </td>\r\n <td className=\"px-4 py-3 text-sm text-[var(--text-secondary)]\">\r\n {formatDuration(execution.totalExecutionTimeMs)}\r\n </td>\r\n <td className=\"px-4 py-3 text-right\">\r\n {execution.errorMessage && (\r\n <div title={execution.errorMessage}>\r\n <AlertCircle className=\"w-4 h-4 text-[var(--error-text)] inline-block\" />\r\n </div>\r\n )}\r\n </td>\r\n </tr>\r\n {expanded && isSelected && selectedExecution && (\r\n <tr>\r\n <td colSpan={7} className=\"px-4 py-4 bg-[var(--bg-secondary)]\">\r\n <div className=\"space-y-3\">\r\n <h4 className=\"font-medium text-sm\">{t('agents.executions.stepDetail')}</h4>\r\n {selectedExecution.stepExecutions.map((step) => (\r\n <div\r\n key={step.id}\r\n className=\"flex items-center gap-4 p-3 bg-[var(--bg-primary)] rounded-lg border border-[var(--border-color)]\"\r\n >\r\n <span className=\"w-6 h-6 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-xs font-bold\">\r\n {step.stepOrder}\r\n </span>\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"font-medium text-sm\">{step.stepName}</p>\r\n <p className=\"text-xs text-[var(--text-tertiary)] font-mono\">{step.skillCode}</p>\r\n </div>\r\n <StatusBadge\r\n status={executionStatusColors[step.status] || 'inactive'}\r\n label={t(`agents.executions.status.${step.status}`)}\r\n size=\"sm\"\r\n />\r\n <div className=\"text-xs text-[var(--text-secondary)] flex items-center gap-3\">\r\n <span className=\"flex items-center gap-1\">\r\n <Timer className=\"w-3 h-3\" />\r\n {formatDuration(step.executionTimeMs)}\r\n </span>\r\n <span className=\"flex items-center gap-1\">\r\n <Coins className=\"w-3 h-3\" />\r\n {formatCost(step.cost)}\r\n </span>\r\n <span>{(step.inputTokens + step.outputTokens).toLocaleString()} tokens</span>\r\n </div>\r\n {step.errorMessage && (\r\n <span className=\"text-xs text-[var(--error-text)] max-w-[200px] truncate\" title={step.errorMessage}>\r\n {step.errorMessage}\r\n </span>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useParams } from 'react-router-dom';\r\nimport {\r\n Bot,\r\n Loader2,\r\n AlertTriangle,\r\n ArrowLeft,\r\n Save,\r\n Plus,\r\n Trash2,\r\n ChevronUp,\r\n ChevronDown,\r\n Workflow,\r\n Settings,\r\n} from 'lucide-react';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport {\r\n aiApi,\r\n type AiAgentDetailDto,\r\n type AiSkillListDto,\r\n type UpdateAgentStepRequest,\r\n} from '@/services/api/aiApi';\r\n\r\ninterface StepFormData {\r\n tempId: string;\r\n id?: string;\r\n skillId: string;\r\n name: string;\r\n stepOrder: number;\r\n inputMappingJson: string;\r\n outputStateKey: string;\r\n continueOnFailure: boolean;\r\n}\r\n\r\nexport function AiAgentEditPage(): ReactElement {\r\n const { t } = useTranslation('ai');\r\n const navigate = useNavigate();\r\n const { id: agentId } = useParams<{ id: string }>();\r\n const isCreate = !agentId || agentId === 'create';\r\n\r\n const [loading, setLoading] = useState(!isCreate);\r\n const [saving, setSaving] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [agent, setAgent] = useState<AiAgentDetailDto | null>(null);\r\n\r\n // Agent form fields\r\n const [agentCode, setAgentCode] = useState('');\r\n const [name, setName] = useState('');\r\n const [description, setDescription] = useState('');\r\n const [maxParallelism, setMaxParallelism] = useState(5);\r\n const [timeoutSeconds, setTimeoutSeconds] = useState(120);\r\n\r\n // Steps\r\n const [steps, setSteps] = useState<StepFormData[]>([]);\r\n const [showSettings, setShowSettings] = useState(true);\r\n\r\n // Available skills for dropdown\r\n const [skills, setSkills] = useState<AiSkillListDto[]>([]);\r\n\r\n const loadAgent = useCallback(async () => {\r\n if (isCreate) return;\r\n try {\r\n setError(null);\r\n setLoading(true);\r\n const result = await aiApi.agents.getById(agentId!);\r\n if (result) {\r\n setAgent(result);\r\n setAgentCode(result.agentCode);\r\n setName(result.name);\r\n setDescription(result.description || '');\r\n setMaxParallelism(result.maxParallelism);\r\n setTimeoutSeconds(result.timeoutSeconds);\r\n setSteps(\r\n result.steps\r\n .sort((a, b) => a.stepOrder - b.stepOrder)\r\n .map((s) => ({\r\n tempId: s.id,\r\n id: s.id,\r\n skillId: s.skillId,\r\n name: s.name,\r\n stepOrder: s.stepOrder,\r\n inputMappingJson: s.inputMappingJson || '',\r\n outputStateKey: s.outputStateKey || '',\r\n continueOnFailure: s.continueOnFailure,\r\n }))\r\n );\r\n }\r\n } catch (err) {\r\n console.error('Failed to load agent:', err);\r\n setError(t('agents.messages.loadFailed'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [agentId, isCreate, t]);\r\n\r\n const loadSkills = useCallback(async () => {\r\n try {\r\n const result = await aiApi.skills.getAll({ status: 'Active' });\r\n setSkills(result ?? []);\r\n } catch (err) {\r\n console.error('Failed to load skills:', err);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadAgent();\r\n loadSkills();\r\n }, [loadAgent, loadSkills]);\r\n\r\n const handleSave = async () => {\r\n try {\r\n setSaving(true);\r\n setError(null);\r\n\r\n if (isCreate) {\r\n const created = await aiApi.agents.create({\r\n agentCode,\r\n name,\r\n moduleId: 'c3d4e5f6-7a8b-9c0d-1e2f-3a4b5c6d7e8f', // TODO: module selector\r\n description: description || undefined,\r\n maxParallelism,\r\n timeoutSeconds,\r\n });\r\n if (created) {\r\n // If steps were added, update with steps\r\n if (steps.length > 0) {\r\n const stepsData: UpdateAgentStepRequest[] = steps.map((s, i) => ({\r\n skillId: s.skillId,\r\n name: s.name,\r\n stepOrder: i + 1,\r\n inputMappingJson: s.inputMappingJson || undefined,\r\n outputStateKey: s.outputStateKey || undefined,\r\n continueOnFailure: s.continueOnFailure,\r\n }));\r\n await aiApi.agents.update(created.id, {\r\n name,\r\n description: description || undefined,\r\n maxParallelism,\r\n timeoutSeconds,\r\n steps: stepsData,\r\n });\r\n }\r\n navigate(`/administration/ai/agents/${created.id}`);\r\n }\r\n } else {\r\n const stepsData: UpdateAgentStepRequest[] = steps.map((s, i) => ({\r\n id: s.id,\r\n skillId: s.skillId,\r\n name: s.name,\r\n stepOrder: i + 1,\r\n inputMappingJson: s.inputMappingJson || undefined,\r\n outputStateKey: s.outputStateKey || undefined,\r\n continueOnFailure: s.continueOnFailure,\r\n }));\r\n await aiApi.agents.update(agentId!, {\r\n name,\r\n description: description || undefined,\r\n maxParallelism,\r\n timeoutSeconds,\r\n steps: stepsData,\r\n });\r\n navigate(`/administration/ai/agents/${agentId}`);\r\n }\r\n } catch (err) {\r\n console.error('Failed to save agent:', err);\r\n setError(t('agents.messages.saveFailed'));\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleAddStep = () => {\r\n const newStep: StepFormData = {\r\n tempId: `temp-${Date.now()}`,\r\n skillId: '',\r\n name: '',\r\n stepOrder: steps.length + 1,\r\n inputMappingJson: '',\r\n outputStateKey: '',\r\n continueOnFailure: false,\r\n };\r\n setSteps([...steps, newStep]);\r\n };\r\n\r\n const handleRemoveStep = (tempId: string) => {\r\n setSteps(steps.filter((s) => s.tempId !== tempId));\r\n };\r\n\r\n const handleStepChange = (tempId: string, field: keyof StepFormData, value: string | boolean) => {\r\n setSteps(\r\n steps.map((s) =>\r\n s.tempId === tempId ? { ...s, [field]: value } : s\r\n )\r\n );\r\n };\r\n\r\n const handleMoveStep = (tempId: string, direction: 'up' | 'down') => {\r\n const index = steps.findIndex((s) => s.tempId === tempId);\r\n if (index === -1) return;\r\n if (direction === 'up' && index === 0) return;\r\n if (direction === 'down' && index === steps.length - 1) return;\r\n\r\n const newSteps = [...steps];\r\n const swapIndex = direction === 'up' ? index - 1 : index + 1;\r\n [newSteps[index], newSteps[swapIndex]] = [newSteps[swapIndex], newSteps[index]];\r\n setSteps(newSteps.map((s, i) => ({ ...s, stepOrder: i + 1 })));\r\n };\r\n\r\n const canSave = name.trim() && (isCreate ? agentCode.trim() : true);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-primary-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('breadcrumb.administration'), href: '/administration' },\r\n { label: t('header.title'), href: '/administration/ai' },\r\n { label: t('agents.title'), href: '/administration/ai/agents' },\r\n { label: isCreate ? t('agents.edit.create') : (agent?.name || t('agents.edit.title')) },\r\n ]}\r\n />\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 flex items-center gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0\" />\r\n <p className=\"text-red-800 dark:text-red-200 font-medium flex-1\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <button\r\n onClick={() =>\r\n navigate(isCreate ? '/administration/ai/agents' : `/administration/ai/agents/${agentId}`)\r\n }\r\n className=\"flex items-center gap-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('common.back')}\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n disabled={saving || !canSave}\r\n className=\"btn btn-primary flex items-center gap-2\"\r\n >\r\n {saving ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n {t('common.save')}\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-4 mb-2\">\r\n <div className=\"w-12 h-12 rounded-xl bg-gradient-to-br from-indigo-500 to-blue-500 flex items-center justify-center shadow-lg\">\r\n <Bot className=\"w-6 h-6 text-white\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {isCreate ? t('agents.edit.create') : t('agents.edit.title')}\r\n </h1>\r\n </div>\r\n <button\r\n onClick={() => setShowSettings(!showSettings)}\r\n className={`btn btn-secondary flex items-center gap-2 ${showSettings ? 'bg-[var(--bg-secondary)]' : ''}`}\r\n >\r\n <Settings className=\"w-4 h-4\" />\r\n {t('agents.edit.agentInfo')}\r\n </button>\r\n </div>\r\n\r\n {/* Agent Settings Form */}\r\n {showSettings && (\r\n <div className=\"card p-6\">\r\n <h3 className=\"font-semibold mb-4\">{t('agents.edit.agentInfo')}</h3>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {isCreate && (\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.agentCode')} *</label>\r\n <input\r\n type=\"text\"\r\n value={agentCode}\r\n onChange={(e) => setAgentCode(e.target.value)}\r\n className=\"input w-full font-mono\"\r\n placeholder={t('agents.fields.agentCodePlaceholder')}\r\n required\r\n />\r\n </div>\r\n )}\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.name')} *</label>\r\n <input\r\n type=\"text\"\r\n value={name}\r\n onChange={(e) => setName(e.target.value)}\r\n className=\"input w-full\"\r\n placeholder={t('agents.fields.namePlaceholder')}\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.maxParallelism')}</label>\r\n <input\r\n type=\"number\"\r\n value={maxParallelism}\r\n onChange={(e) => setMaxParallelism(Math.min(20, Math.max(1, parseInt(e.target.value) || 1)))}\r\n className=\"input w-full\"\r\n min={1}\r\n max={20}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.timeoutSeconds')}</label>\r\n <input\r\n type=\"number\"\r\n value={timeoutSeconds}\r\n onChange={(e) => setTimeoutSeconds(Math.min(600, Math.max(10, parseInt(e.target.value) || 10)))}\r\n className=\"input w-full\"\r\n min={10}\r\n max={600}\r\n />\r\n </div>\r\n <div className=\"md:col-span-2\">\r\n <label className=\"block text-sm font-medium mb-1\">{t('agents.fields.description')}</label>\r\n <textarea\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n className=\"input w-full\"\r\n rows={2}\r\n placeholder={t('agents.fields.descriptionPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Steps Builder */}\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"font-semibold text-[var(--text-primary)] flex items-center gap-2\">\r\n <Workflow className=\"w-5 h-5\" />\r\n {t('agents.edit.stepsBuilder')} ({steps.length})\r\n </h3>\r\n <button onClick={handleAddStep} className=\"btn btn-primary btn-sm flex items-center gap-1\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('agents.edit.addStep')}\r\n </button>\r\n </div>\r\n\r\n {steps.length > 0 ? (\r\n <div className=\"space-y-3\">\r\n {steps.map((step, index) => (\r\n <StepEditor\r\n key={step.tempId}\r\n step={step}\r\n index={index}\r\n isFirst={index === 0}\r\n isLast={index === steps.length - 1}\r\n skills={skills}\r\n onChange={(field, value) => handleStepChange(step.tempId, field, value)}\r\n onDelete={() => handleRemoveStep(step.tempId)}\r\n onMoveUp={() => handleMoveStep(step.tempId, 'up')}\r\n onMoveDown={() => handleMoveStep(step.tempId, 'down')}\r\n t={t}\r\n />\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"card p-8 text-center border-2 border-dashed border-[var(--border-color)]\">\r\n <Workflow className=\"w-12 h-12 mx-auto mb-4 text-[var(--text-tertiary)]\" />\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{t('agents.edit.addFirstStep')}</p>\r\n <button onClick={handleAddStep} className=\"btn btn-primary\">\r\n <Plus className=\"w-4 h-4\" />\r\n {t('agents.edit.addStep')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StepEditor({\r\n step,\r\n index,\r\n isFirst,\r\n isLast,\r\n skills,\r\n onChange,\r\n onDelete,\r\n onMoveUp,\r\n onMoveDown,\r\n t,\r\n}: {\r\n step: StepFormData;\r\n index: number;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n skills: AiSkillListDto[];\r\n onChange: (field: keyof StepFormData, value: string | boolean) => void;\r\n onDelete: () => void;\r\n onMoveUp: () => void;\r\n onMoveDown: () => void;\r\n t: ReturnType<typeof import('react-i18next').useTranslation>['t'];\r\n}) {\r\n return (\r\n <div className=\"card border-l-4 border-l-blue-500 bg-blue-50/30 dark:bg-blue-900/10 p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n <div className=\"flex flex-col items-center gap-1 pt-2\">\r\n <button\r\n onClick={onMoveUp}\r\n disabled={isFirst}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronUp className=\"w-4 h-4\" />\r\n </button>\r\n <span className=\"w-8 h-8 rounded-full bg-[var(--bg-secondary)] flex items-center justify-center text-sm font-bold\">\r\n {index + 1}\r\n </span>\r\n <button\r\n onClick={onMoveDown}\r\n disabled={isLast}\r\n className=\"p-1 rounded hover:bg-[var(--bg-secondary)] disabled:opacity-30 disabled:cursor-not-allowed\"\r\n >\r\n <ChevronDown className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex-1 space-y-3\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.stepName')} *</label>\r\n <input\r\n type=\"text\"\r\n value={step.name}\r\n onChange={(e) => onChange('name', e.target.value)}\r\n className=\"input w-full\"\r\n placeholder={t('agents.fields.stepNamePlaceholder')}\r\n required\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.skill')} *</label>\r\n <select\r\n value={step.skillId}\r\n onChange={(e) => onChange('skillId', e.target.value)}\r\n className=\"input w-full\"\r\n >\r\n <option value=\"\">{t('agents.fields.selectSkill')}</option>\r\n {skills.map((skill) => (\r\n <option key={skill.id} value={skill.id}>\r\n {skill.name} ({skill.code})\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.outputStateKey')}</label>\r\n <input\r\n type=\"text\"\r\n value={step.outputStateKey}\r\n onChange={(e) => onChange('outputStateKey', e.target.value)}\r\n className=\"input w-full font-mono\"\r\n placeholder={t('agents.fields.outputStateKeyPlaceholder')}\r\n />\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium mb-1\">{t('agents.fields.inputMapping')}</label>\r\n <input\r\n type=\"text\"\r\n value={step.inputMappingJson}\r\n onChange={(e) => onChange('inputMappingJson', e.target.value)}\r\n className=\"input w-full font-mono text-sm\"\r\n placeholder={t('agents.fields.inputMappingPlaceholder')}\r\n />\r\n </div>\r\n </div>\r\n\r\n <label className=\"flex items-center gap-2 text-sm\">\r\n <input\r\n type=\"checkbox\"\r\n checked={step.continueOnFailure}\r\n onChange={(e) => onChange('continueOnFailure', e.target.checked)}\r\n className=\"rounded\"\r\n />\r\n {t('agents.fields.continueOnFailure')}\r\n </label>\r\n </div>\r\n\r\n <button\r\n onClick={onDelete}\r\n className=\"p-2 rounded-lg text-[var(--text-tertiary)] hover:text-[var(--error-text)] hover:bg-[var(--error-bg)] transition-all\"\r\n title={t('agents.edit.removeStep')}\r\n >\r\n <Trash2 className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["CHART_COLORS","colorClasses","AiDashboardPage","t","useTranslation","loading","setLoading","useState","refreshing","setRefreshing","period","setPeriod","selectedProvider","setSelectedProvider","overview","setOverview","providerUsage","setProviderUsage","modelUsage","setModelUsage","dailyCosts","setDailyCosts","error","setError","loadData","useCallback","providerId","overviewRes","providerRes","modelRes","dailyRes","aiApi","err","appError","useEffect","handleRefresh","formatCost","value","abs","fractionDigits","formatNumber","dailyCostTrend","useMemo","byDate","providers","item","row","a","b","dailyRequestsTrend","existing","d","providerDonut","p","i","modelBars","m","tokenSplit","input","s","output","costTrend","mid","firstHalf","secondHalf","sumCost","rows","total","k","v","first","second","jsx","Loader2","jsxs","Breadcrumb","AlertTriangle","RefreshCw","Brain","e","KpiCard","DollarSign","Zap","Activity","CheckCircle","rate","Clock","latency","Server","ResponsiveContainer","AreaChart","name","CartesianGrid","XAxis","YAxis","Tooltip","label","Legend","Area","NoDataPlaceholder","PieChart","Pie","entry","Cell","pct","BarChart","_","payload","Bar","ComposedChart","Line","model","title","icon","color","trend","TrendingUp","TrendingDown","message","formatCurrency","ProviderLogo","logoUrl","providerCode","size","hasError","setHasError","sizeMap","EmptyInstancesState","Layers","NoDetailsState","getActiveBadgeClass","isActive","getActiveText","InstanceBadges","isOverBudget","AlertCircle","getProfileCardBorderClass","editing","hasKey","ApiKeyCard","type","onSave","placeholder","providerKeyUrl","setEditing","setValue","saving","setSaving","showValue","setShowValue","isApi","Icon","KeyRound","ShieldCheck","handleSave","handleCancel","ExternalLink","ApiKeyCardEditing","ApiKeyCardDisplay","BudgetGauge","budget","usage","isOver","budgetPeriodType","nextResetDate","radius","circumference","strokeOffset","gaugeColor","onShowValueChange","onValueChange","onCancel","_isApi","EyeOff","Eye","onEdit","Fragment","Plus","InstanceListItem","instance","isSelected","onSelect","Building2","Key","Globe","InlineSearchPanel","onSearch","onClose","query","setQuery","results","setResults","adding","setAdding","timer","items","handleSelect","id","Search","X","result","AiProfilesTab","instances","selectedInstance","onSelectInstance","onToggleActive","onDelete","onUpdate","models","onSetApiKey","onSetAdminKey","providerApiKeyUrl","providerAdminApiKeyUrl","onAddTenant","onRemoveTenant","onSetAllTenants","onAddPrompt","onRemovePrompt","editForm","setEditForm","showTenantSearch","setShowTenantSearch","showPromptSearch","setShowPromptSearch","togglingAllTenants","setTogglingAllTenants","startEditing","cancelEditing","handleSaveEdit","searchTenants","adminApi","existingIds","searchPrompts","prompts","handleToggleAllTenants","Save","BookOpen","Pencil","XCircle","Trash2","providerModels","familyGroups","family","fModels","da","currentValue","isFamily","isPinned","val","latest","minInput","maxOutput","Pin","PinOff","ToggleRight","ToggleLeft","tenant","skill","AiProvidersTab","provider","ProviderCard","Shield","CAPABILITIES","ImagePlus","Mic","Volume2","Radio","Terminal","getProviderInitial","getModelStatusBadge","AlertOctagon","AiModelsTab","filter","onFilterChange","categories","currentPage","setCurrentPage","viewMode","setViewMode","selectedCapabilities","setSelectedCapabilities","filterMode","setFilterMode","pageSize","filteredModels","caps","cap","totalPages","paginatedModels","toggleCapability","prev","next","clearCapabilityFilters","LayoutGrid","List","cat","Filter","key","bgLight","bgDark","Cpu","ArrowDownUp","ArrowUpDown","page","useAiInstances","setInstances","setSelectedInstance","loadInstances","data","loadInstanceDetail","instanceId","refreshInstance","createInstance","updateInstance","deleteInstance","toggleInstanceActive","setApiKey","apiKey","request","setAdminKey","adminKey","selectInstance","clearError","useAiProviders","setProviders","setError_","loadProviders","useAiModels","setModels","modelFilter","setModelFilterState","loadModels","category","setModelFilter","clearFilters","useInstanceAccess","tenants","setTenants","showAddTenantModal","setShowAddTenantModal","openAddTenantModal","closeAddTenantModal","addTenant","tenantId","removeTenant","loadAccessData","VALID_TABS","AiSettingsPage","activeTab","setActiveTab","useTabNavigation","aiInstances","aiProviders","aiModels","instanceAccess","showCreateModal","setShowCreateModal","formData","setFormData","loadingCode","setLoadingCode","deleteConfirm","setDeleteConfirm","handleSelectInstance","handleDeleteInstance","confirmDeleteInstance","handleToggleActive","handleCreateInstance","handleUpdateInstance","handleGenerateCode","response","Settings","tab","isAllTenants","skillId","ConfirmModal","PromptTestPanel","prompt","variables","setVariables","selectedProviderId","setSelectedProviderId","selectedModelId","setSelectedModelId","executing","setExecuting","setResult","showDebug","setShowDebug","copied","setCopied","initialVars","activeProviders","activeModels","handleExecute","errorMessage","handleCopyResponse","getPreview","block","content","Play","variable","Coins","Check","Copy","ChevronUp","ChevronDown","statusColors","AiPromptsListPage","navigate","useNavigate","currentTenant","isGlobalView","useTenant","setPrompts","search","setSearch","filterCategory","setFilterCategory","filterStatus","setFilterStatus","setPage","loadPrompts","params","handleDelete","handleClone","cloned","handleActivate","handleDeprecate","tag","filteredPrompts","startIndex","paginatedPrompts","renderTableView","FileText","Tag","Blocks","StatusBadge","Edit2","renderCardsView","ViewToggle","Pagination","blockTypeColors","statusMap","AiSkillsDetailPage","useParams","setSkill","showTestPanel","setShowTestPanel","showPreview","setShowPreview","previewVariables","setPreviewVariables","loadSkill","vars","getPreviewContent","ArrowLeft","Calendar","User","index","BlockDisplay","expanded","setExpanded","GripVertical","ChevronRight","blockTypeBadge","BLOCK_TYPES","AiSkillsEditPage","isCreate","setName","description","setDescription","setCategory","blocks","setBlocks","definitions","setDefinitions","showAddBlockModal","setShowAddBlockModal","editingBlockId","setEditingBlockId","showSettings","setShowSettings","loadDefinitions","defs","extractVariables","matches","allVariables","uniqueVariables","created","handleAddBlock","blockData","newBlock","handleUpdateBlock","blockId","handleDeleteBlock","handleMoveBlock","direction","newBlocks","swapIndex","reordered","BlockEditor","AddBlockModal","isFirst","isLast","isEditing","onCancelEdit","onMoveUp","onMoveDown","setLabel","setContent","blockType","setBlockType","isEnabled","setIsEnabled","existingBlocksCount","onAdd","mode","setMode","selectedDefinitionId","setSelectedDefinitionId","handleDefinitionChange","defId","def","handleSubmit","blockTypeIcons","Target","MessageSquare","ListChecks","Sparkles","AiBlockDefinitionsListPage","filterType","setFilterType","definition","filteredDefinitions","paginatedDefinitions","blockTypes","Lock","AiBlockDefinitionDetailPage","definitionId","setDefinition","Code","Hash","AiBlockDefinitionEditPage","isEditMode","handleChange","field","extractedVariables","StatCard","memo","AiMonitoringPage","setData","expandedInstance","setExpandedInstance","events","setEvents","eventsLoading","setEventsLoading","sortField","setSortField","sortDirection","setSortDirection","getDateRange","days","end","start","startDate","endDate","loadInstanceEvents","handleToggleInstance","handleSort","sortedData","aVal","bVal","cmp","kpis","activeProfiles","totalCost","sum","totalRequests","totalTokens","formatLatency","ms","formatSuccessRate","formatDate","dateStr","Users","SortableHeader","InstanceRow","onSort","align","isExpanded","onToggle","event","AiAgentsPage","agents","setAgents","loadAgents","agent","filteredAgents","matchesSearch","matchesStatus","paginatedAgents","Bot","Workflow","TABS","executionStatusColors","AiAgentDetailPage","agentId","setAgent","executions","setExecutions","executionsLoading","setExecutionsLoading","selectedExecution","setSelectedExecution","loadAgent","loadExecutions","handleViewExecution","executionId","detail","formatDuration","cost","step","exec","ExecutionRow","execution","onViewDetail","Timer","AiAgentEditPage","agentCode","setAgentCode","maxParallelism","setMaxParallelism","timeoutSeconds","setTimeoutSeconds","steps","setSteps","skills","setSkills","loadSkills","stepsData","handleAddStep","newStep","handleRemoveStep","tempId","handleStepChange","handleMoveStep","newSteps","canSave","StepEditor","onChange"],"mappings":"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"}