agim-cli 1.3.9 → 1.4.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 (205) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/core/a2a.d.ts +1 -1
  3. package/dist/core/a2a.d.ts.map +1 -1
  4. package/dist/core/a2a.js +7 -12
  5. package/dist/core/a2a.js.map +1 -1
  6. package/dist/core/approval-router.d.ts.map +1 -1
  7. package/dist/core/approval-router.js +8 -11
  8. package/dist/core/approval-router.js.map +1 -1
  9. package/dist/core/ask-user-router.d.ts +13 -1
  10. package/dist/core/ask-user-router.d.ts.map +1 -1
  11. package/dist/core/ask-user-router.js +58 -23
  12. package/dist/core/ask-user-router.js.map +1 -1
  13. package/dist/core/ask-user-rpc.d.ts +33 -6
  14. package/dist/core/ask-user-rpc.d.ts.map +1 -1
  15. package/dist/core/ask-user-rpc.js +251 -65
  16. package/dist/core/ask-user-rpc.js.map +1 -1
  17. package/dist/core/llm/fs-dispatcher.d.ts.map +1 -1
  18. package/dist/core/llm/fs-dispatcher.js +14 -13
  19. package/dist/core/llm/fs-dispatcher.js.map +1 -1
  20. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -1
  21. package/dist/core/llm/imhub-dispatcher.js +2 -0
  22. package/dist/core/llm/imhub-dispatcher.js.map +1 -1
  23. package/dist/core/skills/builtin/agim-self/SKILL.md +4 -4
  24. package/dist/core/types.d.ts +21 -0
  25. package/dist/core/types.d.ts.map +1 -1
  26. package/dist/plugins/agents/native/index.js +1 -1
  27. package/dist/plugins/agents/native/index.js.map +1 -1
  28. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +8 -0
  29. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -1
  30. package/dist/plugins/messengers/telegram/telegram-adapter.js +67 -8
  31. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
  32. package/dist/web/public/assets/{a2a-D_I9ZX8i.js → a2a-DWibx2v1.js} +2 -2
  33. package/dist/web/public/assets/{a2a-D_I9ZX8i.js.map → a2a-DWibx2v1.js.map} +1 -1
  34. package/dist/web/public/assets/{activity-ZxWknBf9.js → activity-CSppRQoj.js} +2 -2
  35. package/dist/web/public/assets/{activity-ZxWknBf9.js.map → activity-CSppRQoj.js.map} +1 -1
  36. package/dist/web/public/assets/{admins-DFZcKgq0.js → admins-C9uvJ-ek.js} +2 -2
  37. package/dist/web/public/assets/{admins-DFZcKgq0.js.map → admins-C9uvJ-ek.js.map} +1 -1
  38. package/dist/web/public/assets/{agents-DTONSU0R.js → agents-rbtxCOzD.js} +2 -2
  39. package/dist/web/public/assets/{agents-DTONSU0R.js.map → agents-rbtxCOzD.js.map} +1 -1
  40. package/dist/web/public/assets/{approvals-BdDJvH8b.js → approvals-CgRDzZZP.js} +2 -2
  41. package/dist/web/public/assets/{approvals-BdDJvH8b.js.map → approvals-CgRDzZZP.js.map} +1 -1
  42. package/dist/web/public/assets/{arrow-down-Bhl7hNwa.js → arrow-down-DfVXLyJ6.js} +2 -2
  43. package/dist/web/public/assets/{arrow-down-Bhl7hNwa.js.map → arrow-down-DfVXLyJ6.js.map} +1 -1
  44. package/dist/web/public/assets/{arrow-up-DZLw3qr1.js → arrow-up-CMHA89ux.js} +2 -2
  45. package/dist/web/public/assets/{arrow-up-DZLw3qr1.js.map → arrow-up-CMHA89ux.js.map} +1 -1
  46. package/dist/web/public/assets/{asks-Cj2QazUD.js → asks-9JCznWEb.js} +2 -2
  47. package/dist/web/public/assets/{asks-Cj2QazUD.js.map → asks-9JCznWEb.js.map} +1 -1
  48. package/dist/web/public/assets/{audit-sxS7UUa6.js → audit-DM5sKNA4.js} +2 -2
  49. package/dist/web/public/assets/{audit-sxS7UUa6.js.map → audit-DM5sKNA4.js.map} +1 -1
  50. package/dist/web/public/assets/{bell-CqimaF3k.js → bell-BzG0tUiv.js} +2 -2
  51. package/dist/web/public/assets/{bell-CqimaF3k.js.map → bell-BzG0tUiv.js.map} +1 -1
  52. package/dist/web/public/assets/{bgjobs-BnXdz4TP.js → bgjobs-dLxHKjQK.js} +2 -2
  53. package/dist/web/public/assets/{bgjobs-BnXdz4TP.js.map → bgjobs-dLxHKjQK.js.map} +1 -1
  54. package/dist/web/public/assets/{brain-4TIClaVZ.js → brain-9QmMQ6Ap.js} +2 -2
  55. package/dist/web/public/assets/{brain-4TIClaVZ.js.map → brain-9QmMQ6Ap.js.map} +1 -1
  56. package/dist/web/public/assets/{briefcase-iKF60CJd.js → briefcase-BehkRQvT.js} +2 -2
  57. package/dist/web/public/assets/{briefcase-iKF60CJd.js.map → briefcase-BehkRQvT.js.map} +1 -1
  58. package/dist/web/public/assets/{chat-Cjp0ECm5.js → chat-nfyoGDVp.js} +2 -2
  59. package/dist/web/public/assets/{chat-Cjp0ECm5.js.map → chat-nfyoGDVp.js.map} +1 -1
  60. package/dist/web/public/assets/{chevron-left-sZyMkeG-.js → chevron-left-DHpm5XR1.js} +2 -2
  61. package/dist/web/public/assets/{chevron-left-sZyMkeG-.js.map → chevron-left-DHpm5XR1.js.map} +1 -1
  62. package/dist/web/public/assets/{chevron-right-CPHPRLSX.js → chevron-right-BIKADdPm.js} +2 -2
  63. package/dist/web/public/assets/{chevron-right-CPHPRLSX.js.map → chevron-right-BIKADdPm.js.map} +1 -1
  64. package/dist/web/public/assets/{circle-check-BB11MxVm.js → circle-check-BbAeV_k2.js} +2 -2
  65. package/dist/web/public/assets/{circle-check-BB11MxVm.js.map → circle-check-BbAeV_k2.js.map} +1 -1
  66. package/dist/web/public/assets/{circle-check-big-Sj-6H_3x.js → circle-check-big-Cd4Eyz41.js} +2 -2
  67. package/dist/web/public/assets/{circle-check-big-Sj-6H_3x.js.map → circle-check-big-Cd4Eyz41.js.map} +1 -1
  68. package/dist/web/public/assets/{circle-x-DYcD4BUu.js → circle-x-CrmHcrAS.js} +2 -2
  69. package/dist/web/public/assets/{circle-x-DYcD4BUu.js.map → circle-x-CrmHcrAS.js.map} +1 -1
  70. package/dist/web/public/assets/{clock-BVXa81yB.js → clock-jJtwqx8f.js} +2 -2
  71. package/dist/web/public/assets/{clock-BVXa81yB.js.map → clock-jJtwqx8f.js.map} +1 -1
  72. package/dist/web/public/assets/{confirm-dialog-C2melodU.js → confirm-dialog-D4JCDxHT.js} +2 -2
  73. package/dist/web/public/assets/{confirm-dialog-C2melodU.js.map → confirm-dialog-D4JCDxHT.js.map} +1 -1
  74. package/dist/web/public/assets/{copy-D1OIgfLU.js → copy-D9ljWg7b.js} +2 -2
  75. package/dist/web/public/assets/{copy-D1OIgfLU.js.map → copy-D9ljWg7b.js.map} +1 -1
  76. package/dist/web/public/assets/{data-table-BYJ2qMyY.js → data-table-yUuGHUSG.js} +2 -2
  77. package/dist/web/public/assets/{data-table-BYJ2qMyY.js.map → data-table-yUuGHUSG.js.map} +1 -1
  78. package/dist/web/public/assets/{download-BChufhnl.js → download-9zxV6ejH.js} +2 -2
  79. package/dist/web/public/assets/{download-BChufhnl.js.map → download-9zxV6ejH.js.map} +1 -1
  80. package/dist/web/public/assets/{email-exon2FvQ.js → email-C8Fx7GcZ.js} +2 -2
  81. package/dist/web/public/assets/{email-exon2FvQ.js.map → email-C8Fx7GcZ.js.map} +1 -1
  82. package/dist/web/public/assets/{empty-state-De5ls0uC.js → empty-state-B0sJBvsG.js} +2 -2
  83. package/dist/web/public/assets/{empty-state-De5ls0uC.js.map → empty-state-B0sJBvsG.js.map} +1 -1
  84. package/dist/web/public/assets/{external-link-CiJZi5YL.js → external-link-C3fHPbrL.js} +2 -2
  85. package/dist/web/public/assets/{external-link-CiJZi5YL.js.map → external-link-C3fHPbrL.js.map} +1 -1
  86. package/dist/web/public/assets/{eye-DowB5M1R.js → eye-BrcGR1Ln.js} +2 -2
  87. package/dist/web/public/assets/{eye-DowB5M1R.js.map → eye-BrcGR1Ln.js.map} +1 -1
  88. package/dist/web/public/assets/{facts-BdnrzWfV.js → facts-DNcekpR_.js} +2 -2
  89. package/dist/web/public/assets/{facts-BdnrzWfV.js.map → facts-DNcekpR_.js.map} +1 -1
  90. package/dist/web/public/assets/{goals-D6ibCBqb.js → goals-BJ0I0rVU.js} +2 -2
  91. package/dist/web/public/assets/{goals-D6ibCBqb.js.map → goals-BJ0I0rVU.js.map} +1 -1
  92. package/dist/web/public/assets/{health-BA8ydz1A.js → health-DCFAQ615.js} +2 -2
  93. package/dist/web/public/assets/{health-BA8ydz1A.js.map → health-DCFAQ615.js.map} +1 -1
  94. package/dist/web/public/assets/{heart-pulse-ClrbGrB7.js → heart-pulse-CiwiVY1D.js} +2 -2
  95. package/dist/web/public/assets/{heart-pulse-ClrbGrB7.js.map → heart-pulse-CiwiVY1D.js.map} +1 -1
  96. package/dist/web/public/assets/{heartbeat-j03zupAy.js → heartbeat-CYIIkyqM.js} +2 -2
  97. package/dist/web/public/assets/{heartbeat-j03zupAy.js.map → heartbeat-CYIIkyqM.js.map} +1 -1
  98. package/dist/web/public/assets/{hot-D3bwuObi.js → hot-SjwVKjTN.js} +2 -2
  99. package/dist/web/public/assets/{hot-D3bwuObi.js.map → hot-SjwVKjTN.js.map} +1 -1
  100. package/dist/web/public/assets/index-BiXaJRfQ.js +209 -0
  101. package/dist/web/public/assets/index-BiXaJRfQ.js.map +1 -0
  102. package/dist/web/public/assets/{index-CokfQGcz.css → index-DknVjPYB.css} +1 -1
  103. package/dist/web/public/assets/{injection-C89g9123.js → injection-rK-nXEck.js} +2 -2
  104. package/dist/web/public/assets/{injection-C89g9123.js.map → injection-rK-nXEck.js.map} +1 -1
  105. package/dist/web/public/assets/{installed-1Hal8dxW.js → installed-C3GsWhFt.js} +2 -2
  106. package/dist/web/public/assets/{installed-1Hal8dxW.js.map → installed-C3GsWhFt.js.map} +1 -1
  107. package/dist/web/public/assets/{jobs-cQ7V-7ec.js → jobs-Bu20ae1w.js} +2 -2
  108. package/dist/web/public/assets/{jobs-cQ7V-7ec.js.map → jobs-Bu20ae1w.js.map} +1 -1
  109. package/dist/web/public/assets/{layout-U5o6RgqN.js → layout-B4AOR7bx.js} +2 -2
  110. package/dist/web/public/assets/{layout-U5o6RgqN.js.map → layout-B4AOR7bx.js.map} +1 -1
  111. package/dist/web/public/assets/{layout-Y9JSZczb.js → layout-BjiHbubM.js} +2 -2
  112. package/dist/web/public/assets/{layout-Y9JSZczb.js.map → layout-BjiHbubM.js.map} +1 -1
  113. package/dist/web/public/assets/{layout-CZ9hb8_a.js → layout-C0eeaex1.js} +2 -2
  114. package/dist/web/public/assets/{layout-CZ9hb8_a.js.map → layout-C0eeaex1.js.map} +1 -1
  115. package/dist/web/public/assets/{layout-CXGgZCd2.js → layout-CHFdMCNs.js} +2 -2
  116. package/dist/web/public/assets/{layout-CXGgZCd2.js.map → layout-CHFdMCNs.js.map} +1 -1
  117. package/dist/web/public/assets/{layout-BbRAk_tA.js → layout-e2mh2uBC.js} +2 -2
  118. package/dist/web/public/assets/{layout-BbRAk_tA.js.map → layout-e2mh2uBC.js.map} +1 -1
  119. package/dist/web/public/assets/{llm-CumYZM83.js → llm-CgMGyAjF.js} +2 -2
  120. package/dist/web/public/assets/{llm-CumYZM83.js.map → llm-CgMGyAjF.js.map} +1 -1
  121. package/dist/web/public/assets/{loader-circle-CZQXsfz7.js → loader-circle-D_dW2RUZ.js} +2 -2
  122. package/dist/web/public/assets/{loader-circle-CZQXsfz7.js.map → loader-circle-D_dW2RUZ.js.map} +1 -1
  123. package/dist/web/public/assets/{map-pin-CYj0xBbt.js → map-pin-jOOaGCmo.js} +2 -2
  124. package/dist/web/public/assets/{map-pin-CYj0xBbt.js.map → map-pin-jOOaGCmo.js.map} +1 -1
  125. package/dist/web/public/assets/{mcp-DP4Vj1Nh.js → mcp-Ip_omrap.js} +2 -2
  126. package/dist/web/public/assets/{mcp-DP4Vj1Nh.js.map → mcp-Ip_omrap.js.map} +1 -1
  127. package/dist/web/public/assets/{memos-ZDpt1S28.js → memos-yOmAURiM.js} +2 -2
  128. package/dist/web/public/assets/{memos-ZDpt1S28.js.map → memos-yOmAURiM.js.map} +1 -1
  129. package/dist/web/public/assets/{messengers-B007J8et.js → messengers-DdS6Tv_H.js} +2 -2
  130. package/dist/web/public/assets/{messengers-B007J8et.js.map → messengers-DdS6Tv_H.js.map} +1 -1
  131. package/dist/web/public/assets/{mobile-Crm0YJ36.js → mobile-7gRnqslc.js} +2 -2
  132. package/dist/web/public/assets/{mobile-Crm0YJ36.js.map → mobile-7gRnqslc.js.map} +1 -1
  133. package/dist/web/public/assets/{network-BYbGwOEp.js → network-ClaA9iUg.js} +2 -2
  134. package/dist/web/public/assets/{network-BYbGwOEp.js.map → network-ClaA9iUg.js.map} +1 -1
  135. package/dist/web/public/assets/{outbox-D7xZ5y2T.js → outbox-YtiqLz-u.js} +2 -2
  136. package/dist/web/public/assets/{outbox-D7xZ5y2T.js.map → outbox-YtiqLz-u.js.map} +1 -1
  137. package/dist/web/public/assets/{pagination-bzSoQOAd.js → pagination-DU9Lf0rD.js} +2 -2
  138. package/dist/web/public/assets/{pagination-bzSoQOAd.js.map → pagination-DU9Lf0rD.js.map} +1 -1
  139. package/dist/web/public/assets/{persona-VT6A3VYL.js → persona-C9vZYuJJ.js} +2 -2
  140. package/dist/web/public/assets/{persona-VT6A3VYL.js.map → persona-C9vZYuJJ.js.map} +1 -1
  141. package/dist/web/public/assets/{plans-b4DAc_3a.js → plans-doYYvgG_.js} +2 -2
  142. package/dist/web/public/assets/{plans-b4DAc_3a.js.map → plans-doYYvgG_.js.map} +1 -1
  143. package/dist/web/public/assets/{play-SPYhVFeC.js → play-C5MgP1qM.js} +2 -2
  144. package/dist/web/public/assets/{play-SPYhVFeC.js.map → play-C5MgP1qM.js.map} +1 -1
  145. package/dist/web/public/assets/{plus-D__n9IVW.js → plus-BFi9eVCl.js} +2 -2
  146. package/dist/web/public/assets/{plus-D__n9IVW.js.map → plus-BFi9eVCl.js.map} +1 -1
  147. package/dist/web/public/assets/{policy-CWeiR9UO.js → policy-DS3IIL78.js} +2 -2
  148. package/dist/web/public/assets/{policy-CWeiR9UO.js.map → policy-DS3IIL78.js.map} +1 -1
  149. package/dist/web/public/assets/{qr-code-BqDQw03Z.js → qr-code-BL039OK7.js} +2 -2
  150. package/dist/web/public/assets/{qr-code-BqDQw03Z.js.map → qr-code-BL039OK7.js.map} +1 -1
  151. package/dist/web/public/assets/{refresh-ccw-CW2loqyz.js → refresh-ccw-DBNikooZ.js} +2 -2
  152. package/dist/web/public/assets/{refresh-ccw-CW2loqyz.js.map → refresh-ccw-DBNikooZ.js.map} +1 -1
  153. package/dist/web/public/assets/{reminders-BAl8NC0R.js → reminders-BcymTbK9.js} +2 -2
  154. package/dist/web/public/assets/{reminders-BAl8NC0R.js.map → reminders-BcymTbK9.js.map} +1 -1
  155. package/dist/web/public/assets/{save-DzWp78MC.js → save-DZiTNYpH.js} +2 -2
  156. package/dist/web/public/assets/{save-DzWp78MC.js.map → save-DZiTNYpH.js.map} +1 -1
  157. package/dist/web/public/assets/{schedules-6cyfjv0O.js → schedules-C47XYMM0.js} +2 -2
  158. package/dist/web/public/assets/{schedules-6cyfjv0O.js.map → schedules-C47XYMM0.js.map} +1 -1
  159. package/dist/web/public/assets/{search-DVWPME2t.js → search-DSXC_EYz.js} +2 -2
  160. package/dist/web/public/assets/{search-DVWPME2t.js.map → search-DSXC_EYz.js.map} +1 -1
  161. package/dist/web/public/assets/{search-Bh7gD1Aq.js → search-DbPfPYg8.js} +2 -2
  162. package/dist/web/public/assets/{search-Bh7gD1Aq.js.map → search-DbPfPYg8.js.map} +1 -1
  163. package/dist/web/public/assets/{security-DlZ_rDwC.js → security-D7z1GPFd.js} +2 -2
  164. package/dist/web/public/assets/{security-DlZ_rDwC.js.map → security-D7z1GPFd.js.map} +1 -1
  165. package/dist/web/public/assets/{service-DKkji52r.js → service-7mISPUwf.js} +2 -2
  166. package/dist/web/public/assets/{service-DKkji52r.js.map → service-7mISPUwf.js.map} +1 -1
  167. package/dist/web/public/assets/{shield-alert-5pYX52s1.js → shield-alert-C3F8izo0.js} +2 -2
  168. package/dist/web/public/assets/{shield-alert-5pYX52s1.js.map → shield-alert-C3F8izo0.js.map} +1 -1
  169. package/dist/web/public/assets/{status-badge-W8PRNBT2.js → status-badge-CvmA1Y93.js} +2 -2
  170. package/dist/web/public/assets/{status-badge-W8PRNBT2.js.map → status-badge-CvmA1Y93.js.map} +1 -1
  171. package/dist/web/public/assets/{subtasks-DSvOTpF0.js → subtasks-Bkgb9Pkm.js} +2 -2
  172. package/dist/web/public/assets/{subtasks-DSvOTpF0.js.map → subtasks-Bkgb9Pkm.js.map} +1 -1
  173. package/dist/web/public/assets/{table-B695Fh_p.js → table-z7CVpKMe.js} +2 -2
  174. package/dist/web/public/assets/{table-B695Fh_p.js.map → table-z7CVpKMe.js.map} +1 -1
  175. package/dist/web/public/assets/{topn-DqUC9bYh.js → topn-B7GHdOiE.js} +2 -2
  176. package/dist/web/public/assets/{topn-DqUC9bYh.js.map → topn-B7GHdOiE.js.map} +1 -1
  177. package/dist/web/public/assets/{trash-2-DH4UNSUm.js → trash-2-DdjC6QH7.js} +2 -2
  178. package/dist/web/public/assets/{trash-2-DH4UNSUm.js.map → trash-2-DdjC6QH7.js.map} +1 -1
  179. package/dist/web/public/assets/{use-agim-skills-BD17YQCK.js → use-agim-skills-CZkKns-g.js} +2 -2
  180. package/dist/web/public/assets/{use-agim-skills-BD17YQCK.js.map → use-agim-skills-CZkKns-g.js.map} +1 -1
  181. package/dist/web/public/assets/{use-background-tasks-Clyo1IGE.js → use-background-tasks-CVdojnmx.js} +2 -2
  182. package/dist/web/public/assets/{use-background-tasks-Clyo1IGE.js.map → use-background-tasks-CVdojnmx.js.map} +1 -1
  183. package/dist/web/public/assets/{use-memory-BGvVWIQX.js → use-memory-CHARtjQ-.js} +2 -2
  184. package/dist/web/public/assets/{use-memory-BGvVWIQX.js.map → use-memory-CHARtjQ-.js.map} +1 -1
  185. package/dist/web/public/assets/{use-observability-IlURblVq.js → use-observability-BtZPZLvB.js} +2 -2
  186. package/dist/web/public/assets/{use-observability-IlURblVq.js.map → use-observability-BtZPZLvB.js.map} +1 -1
  187. package/dist/web/public/assets/{use-settings-DFTGCq8J.js → use-settings-DHEiuHAv.js} +2 -2
  188. package/dist/web/public/assets/{use-settings-DFTGCq8J.js.map → use-settings-DHEiuHAv.js.map} +1 -1
  189. package/dist/web/public/assets/{use-workspace-DaXX6QdK.js → use-workspace-C1gInLvF.js} +2 -2
  190. package/dist/web/public/assets/{use-workspace-DaXX6QdK.js.map → use-workspace-C1gInLvF.js.map} +1 -1
  191. package/dist/web/public/assets/{vector-CKUwZBiK.js → vector-CLlo9px7.js} +2 -2
  192. package/dist/web/public/assets/{vector-CKUwZBiK.js.map → vector-CLlo9px7.js.map} +1 -1
  193. package/dist/web/public/assets/{viewer-edlHJiVg.js → viewer-BGdrQoJC.js} +2 -2
  194. package/dist/web/public/assets/{viewer-edlHJiVg.js.map → viewer-BGdrQoJC.js.map} +1 -1
  195. package/dist/web/public/assets/{workspace-B0jlv7Gj.js → workspace-zG8AgTev.js} +2 -2
  196. package/dist/web/public/assets/{workspace-B0jlv7Gj.js.map → workspace-zG8AgTev.js.map} +1 -1
  197. package/dist/web/public/assets/{workspaces-_Ho1uiD-.js → workspaces-DT2xLs5G.js} +2 -2
  198. package/dist/web/public/assets/{workspaces-_Ho1uiD-.js.map → workspaces-DT2xLs5G.js.map} +1 -1
  199. package/dist/web/public/index.html +2 -2
  200. package/dist/web/server.d.ts.map +1 -1
  201. package/dist/web/server.js +56 -37
  202. package/dist/web/server.js.map +1 -1
  203. package/package.json +1 -1
  204. package/dist/web/public/assets/index-DvWldAJY.js +0 -204
  205. package/dist/web/public/assets/index-DvWldAJY.js.map +0 -1
@@ -1 +1 @@
1
- :root{--ag-bg: 220 14% 96%;--ag-surface: 0 0% 100%;--ag-surface-2: 220 14% 94%;--ag-surface-hover:220 14% 92%;--ag-border: 220 13% 90%;--ag-border-strong: 220 10% 80%;--ag-text: 220 13% 13%;--ag-text-dim: 220 6% 38%;--ag-text-muted: 220 6% 58%;--ag-accent: 246 80% 60%;--ag-accent-fg: 0 0% 100%;--ag-accent-hover: 246 80% 52%;--ag-accent-bg: 246 100% 96%;--ag-success: 158 75% 39%;--ag-success-bg:158 75% 95%;--ag-warning: 38 95% 50%;--ag-warning-bg: 38 95% 95%;--ag-danger: 0 78% 56%;--ag-danger-bg: 0 78% 96%;--ag-info: 217 91% 60%;--ag-info-bg: 217 91% 96%;--ag-shadow-sm: 0 1px 2px hsl(220 13% 13% / .05);--ag-shadow-md: 0 2px 8px hsl(220 13% 13% / .08);--ag-shadow-lg: 0 8px 24px hsl(220 13% 13% / .12)}:root[data-theme=dark]{--ag-bg: 220 10% 7%;--ag-surface: 220 12% 11%;--ag-surface-2: 220 12% 14%;--ag-surface-hover:220 12% 16%;--ag-border: 220 10% 20%;--ag-border-strong: 220 10% 28%;--ag-text: 220 14% 91%;--ag-text-dim: 220 8% 68%;--ag-text-muted: 220 8% 50%;--ag-accent: 246 90% 72%;--ag-accent-fg: 220 30% 5%;--ag-accent-hover: 246 90% 80%;--ag-accent-bg: 246 30% 22%;--ag-success: 158 70% 50%;--ag-success-bg:158 60% 20%;--ag-warning: 38 90% 60%;--ag-warning-bg: 38 60% 20%;--ag-danger: 0 85% 67%;--ag-danger-bg: 0 60% 22%;--ag-info: 217 90% 70%;--ag-info-bg: 217 60% 25%;--ag-shadow-sm: 0 1px 2px hsl(0 0% 0% / .4);--ag-shadow-md: 0 2px 8px hsl(0 0% 0% / .5);--ag-shadow-lg: 0 8px 24px hsl(0 0% 0% / .6)}@media (prefers-color-scheme: dark){:root:not([data-theme=light]):not([data-theme=dark]){--ag-bg: 220 10% 7%;--ag-surface: 220 12% 11%;--ag-surface-2: 220 12% 14%;--ag-surface-hover:220 12% 16%;--ag-border: 220 10% 20%;--ag-border-strong: 220 10% 28%;--ag-text: 220 14% 91%;--ag-text-dim: 220 8% 68%;--ag-text-muted: 220 8% 50%;--ag-accent: 246 90% 72%;--ag-accent-fg: 220 30% 5%;--ag-accent-hover: 246 90% 80%;--ag-accent-bg: 246 30% 22%;--ag-success: 158 70% 50%;--ag-success-bg:158 60% 20%;--ag-warning: 38 90% 60%;--ag-warning-bg: 38 60% 20%;--ag-danger: 0 85% 67%;--ag-danger-bg: 0 60% 22%;--ag-info: 217 90% 70%;--ag-info-bg: 217 60% 25%;--ag-shadow-sm: 0 1px 2px hsl(0 0% 0% / .4);--ag-shadow-md: 0 2px 8px hsl(0 0% 0% / .5);--ag-shadow-lg: 0 8px 24px hsl(0 0% 0% / .6)}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html,body,#root{height:100%}body{background-color:hsl(var(--ag-bg));color:hsl(var(--ag-text));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji",sans-serif;touch-action:manipulation;-webkit-tap-highlight-color:hsl(var(--ag-accent) / .15)}button,[role=button],a,input[type=button],input[type=submit]{-webkit-tap-highlight-color:hsl(var(--ag-accent) / .15)}@media (pointer: fine){*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-thumb{background:hsl(var(--ag-border-strong));border-radius:999px;border:2px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:hsl(var(--ag-text-muted));background-clip:content-box}}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 640px){.container{max-width:640px;padding-right:24px;padding-left:24px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px;padding-right:32px;padding-left:32px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-2{bottom:8px}.bottom-28{bottom:7rem}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:8px}.left-\[50\%\]{left:50%}.right-4{right:16px}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:16px}.top-\[50\%\]{top:50%}.top-\[var\(--topbar-h\,0\)\]{top:var(--topbar-h,0)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.-mx-1{margin-left:-4px;margin-right:-4px}.-mx-3{margin-left:-12px;margin-right:-12px}.mx-4{margin-left:16px;margin-right:16px}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:4px;margin-bottom:4px}.my-2{margin-top:8px;margin-bottom:8px}.-ml-2{margin-left:-8px}.mb-0\.5{margin-bottom:2px}.mb-1{margin-bottom:4px}.mb-1\.5{margin-bottom:6px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.ml-1{margin-left:4px}.ml-2{margin-left:8px}.ml-3{margin-left:12px}.ml-5{margin-left:20px}.ml-auto{margin-left:auto}.mr-1{margin-right:4px}.mr-2{margin-right:8px}.mt-0\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-1\.5{margin-top:6px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-4{width:16px;height:16px}.h-1{height:4px}.h-1\.5{height:6px}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:8px}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:12px}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:16px}.h-48{height:12rem}.h-5{height:20px}.h-6{height:24px}.h-64{height:16rem}.h-7{height:32px}.h-72{height:18rem}.h-8{height:48px}.h-9{height:64px}.h-96{height:24rem}.h-\[280px\]{height:280px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-px{height:1px}.max-h-32{max-height:8rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.max-h-\[85dvh\]{max-height:85dvh}.min-h-8{min-height:48px}.min-h-9{min-height:64px}.min-h-\[500px\]{min-height:500px}.min-h-dvh{min-height:100dvh}.w-1\.5{width:6px}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:8px}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:12px}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:16px}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:20px}.w-6{width:24px}.w-64{width:16rem}.w-72{width:18rem}.w-8{width:48px}.w-9{width:64px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[280px\]{width:280px}.w-\[80px\]{width:80px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[85\%\]{max-width:85%}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-mx-4{scroll-margin-left:16px;scroll-margin-right:16px}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:2px}.gap-1{gap:4px}.gap-1\.5{gap:6px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-6{gap:24px}.gap-x-3{-moz-column-gap:12px;column-gap:12px}.gap-x-4{-moz-column-gap:16px;column-gap:16px}.gap-y-1{row-gap:4px}.gap-y-2{row-gap:8px}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--ag-border))}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:6px}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:10px}.rounded-md{border-radius:6px}.rounded-xl{border-radius:14px}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-accent{border-color:hsl(var(--ag-accent))}.border-border{border-color:hsl(var(--ag-border))}.border-border\/40{border-color:hsl(var(--ag-border) / .4)}.border-danger{border-color:hsl(var(--ag-danger))}.border-danger\/30{border-color:hsl(var(--ag-danger) / .3)}.border-danger\/60{border-color:hsl(var(--ag-danger) / .6)}.border-info{border-color:hsl(var(--ag-info))}.border-info\/30{border-color:hsl(var(--ag-info) / .3)}.border-success{border-color:hsl(var(--ag-success))}.border-success\/30{border-color:hsl(var(--ag-success) / .3)}.border-success\/60{border-color:hsl(var(--ag-success) / .6)}.border-transparent{border-color:transparent}.border-warning{border-color:hsl(var(--ag-warning))}.border-warning\/30{border-color:hsl(var(--ag-warning) / .3)}.border-warning\/40{border-color:hsl(var(--ag-warning) / .4)}.border-warning\/50{border-color:hsl(var(--ag-warning) / .5)}.border-warning\/60{border-color:hsl(var(--ag-warning) / .6)}.bg-accent{background-color:hsl(var(--ag-accent))}.bg-accent-bg{background-color:hsl(var(--ag-accent-bg))}.bg-accent\/60{background-color:hsl(var(--ag-accent) / .6)}.bg-bg{background-color:hsl(var(--ag-bg))}.bg-black\/35{background-color:#00000059}.bg-black\/50{background-color:#00000080}.bg-border{background-color:hsl(var(--ag-border))}.bg-danger{background-color:hsl(var(--ag-danger))}.bg-danger-bg{background-color:hsl(var(--ag-danger-bg))}.bg-danger-bg\/30{background-color:hsl(var(--ag-danger-bg) / .3)}.bg-info-bg{background-color:hsl(var(--ag-info-bg))}.bg-info-bg\/50{background-color:hsl(var(--ag-info-bg) / .5)}.bg-success{background-color:hsl(var(--ag-success))}.bg-success-bg{background-color:hsl(var(--ag-success-bg))}.bg-surface{background-color:hsl(var(--ag-surface))}.bg-surface-2{background-color:hsl(var(--ag-surface-2))}.bg-surface-2\/40{background-color:hsl(var(--ag-surface-2) / .4)}.bg-surface-2\/50{background-color:hsl(var(--ag-surface-2) / .5)}.bg-text{background-color:hsl(var(--ag-text))}.bg-text-muted{background-color:hsl(var(--ag-text-muted))}.bg-transparent{background-color:transparent}.bg-warning{background-color:hsl(var(--ag-warning))}.bg-warning-bg{background-color:hsl(var(--ag-warning-bg))}.bg-warning-bg\/40{background-color:hsl(var(--ag-warning-bg) / .4)}.bg-warning-bg\/50{background-color:hsl(var(--ag-warning-bg) / .5)}.bg-warning\/5{background-color:hsl(var(--ag-warning) / .05)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:4px}.p-12{padding:3rem}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:4px;padding-right:4px}.px-1\.5{padding-left:6px;padding-right:6px}.px-2{padding-left:8px;padding-right:8px}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.py-0\.5{padding-top:2px;padding-bottom:2px}.py-1{padding-top:4px;padding-bottom:4px}.py-1\.5{padding-top:6px;padding-bottom:6px}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:8px;padding-bottom:8px}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.py-5{padding-top:20px;padding-bottom:20px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:48px;padding-bottom:48px}.pb-1{padding-bottom:4px}.pb-2{padding-bottom:8px}.pb-3{padding-bottom:12px}.pb-\[calc\(env\(safe-area-inset-bottom\)\+1\.5rem\)\]{padding-bottom:calc(env(safe-area-inset-bottom) + 1.5rem)}.pl-3{padding-left:12px}.pl-7{padding-left:32px}.pl-8{padding-left:48px}.pr-1{padding-right:4px}.pr-2{padding-right:8px}.pt-0{padding-top:0}.pt-1{padding-top:4px}.pt-2{padding-top:8px}.pt-3{padding-top:12px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:30px;line-height:38px}.text-6xl{font-size:3.75rem;line-height:1}.text-\[0\.85em\]{font-size:.85em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[15px\]{font-size:15px}.text-base{font-size:15px;line-height:22px}.text-lg{font-size:20px;line-height:28px}.text-md{font-size:16px;line-height:24px}.text-sm{font-size:13px;line-height:20px}.text-xl{font-size:24px;line-height:32px}.text-xs{font-size:12px;line-height:16px}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-accent{color:hsl(var(--ag-accent))}.text-accent-fg{color:hsl(var(--ag-accent-fg))}.text-bg{color:hsl(var(--ag-bg))}.text-danger{color:hsl(var(--ag-danger))}.text-info{color:hsl(var(--ag-info))}.text-success{color:hsl(var(--ag-success))}.text-text{color:hsl(var(--ag-text))}.text-text-dim{color:hsl(var(--ag-text-dim))}.text-text-muted{color:hsl(var(--ag-text-muted))}.text-warning{color:hsl(var(--ag-warning))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.decoration-accent\/40{text-decoration-color:hsl(var(--ag-accent) / .4)}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-accent{accent-color:hsl(var(--ag-accent))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow{--tw-shadow: var(--ag-shadow-md);--tw-shadow-colored: var(--ag-shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--ag-shadow-lg);--tw-shadow-colored: var(--ag-shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--ag-shadow-md);--tw-shadow-colored: var(--ag-shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--ag-shadow-sm);--tw-shadow-colored: var(--ag-shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.running{animation-play-state:running}.paused{animation-play-state:paused}.pt-safe{padding-top:calc(env(safe-area-inset-top) + .5rem)}.pb-safe{padding-bottom:calc(env(safe-area-inset-bottom) + .5rem)}.h-dvh{height:100vh;height:100dvh}.min-h-dvh{min-height:100vh;min-height:100dvh}.tap-target{min-height:32px;min-width:32px}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:13px;line-height:20px}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-text-muted::-moz-placeholder{color:hsl(var(--ag-text-muted))}.placeholder\:text-text-muted::placeholder{color:hsl(var(--ag-text-muted))}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-border-strong:hover{border-color:hsl(var(--ag-border-strong))}.hover\:bg-accent-hover:hover{background-color:hsl(var(--ag-accent-hover))}.hover\:bg-danger:hover{background-color:hsl(var(--ag-danger))}.hover\:bg-danger\/10:hover{background-color:hsl(var(--ag-danger) / .1)}.hover\:bg-surface-2:hover{background-color:hsl(var(--ag-surface-2))}.hover\:text-accent:hover{color:hsl(var(--ag-accent))}.hover\:text-danger:hover{color:hsl(var(--ag-danger))}.hover\:text-text:hover{color:hsl(var(--ag-text))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-accent:hover{text-decoration-color:hsl(var(--ag-accent))}.focus\:border-accent:focus{border-color:hsl(var(--ag-accent))}.focus\:text-text:focus{color:hsl(var(--ag-text))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent:focus{--tw-ring-color: hsl(var(--ag-accent))}.focus\:ring-danger:focus{--tw-ring-color: hsl(var(--ag-danger))}.focus\:ring-offset-1:focus{--tw-ring-offset-width: 1px}.focus\:ring-offset-bg:focus{--tw-ring-offset-color: hsl(var(--ag-bg))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-accent:focus-visible{--tw-ring-color: hsl(var(--ag-accent))}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-bg:focus-visible{--tw-ring-offset-color: hsl(var(--ag-bg))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-55:disabled{opacity:.55}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=selected\]\:bg-accent-bg[data-state=selected]{background-color:hsl(var(--ag-accent-bg))}.data-\[state\=active\]\:text-accent[data-state=active]{color:hsl(var(--ag-accent))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open],.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open],.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open],.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=active\]\:after\:absolute[data-state=active]:after{content:var(--tw-content);position:absolute}.data-\[state\=active\]\:after\:inset-x-0[data-state=active]:after{content:var(--tw-content);left:0;right:0}.data-\[state\=active\]\:after\:-bottom-px[data-state=active]:after{content:var(--tw-content);bottom:-1px}.data-\[state\=active\]\:after\:h-0\.5[data-state=active]:after{content:var(--tw-content);height:2px}.data-\[state\=active\]\:after\:rounded[data-state=active]:after{content:var(--tw-content);border-radius:6px}.data-\[state\=active\]\:after\:bg-accent[data-state=active]:after{content:var(--tw-content);background-color:hsl(var(--ag-accent))}@media (min-width: 640px){.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:-mx-4{margin-left:-16px;margin-right:-16px}.sm\:ml-1{margin-left:4px}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:w-20{width:5rem}.sm\:w-28{width:7rem}.sm\:w-36{width:9rem}.sm\:w-40{width:10rem}.sm\:min-w-0{min-width:0px}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-\[75\%\]{max-width:75%}.sm\:max-w-lg{max-width:32rem}.sm\:flex-1{flex:1 1 0%}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:8px}.sm\:gap-3{gap:12px}.sm\:p-4{padding:16px}.sm\:p-6{padding:24px}.sm\:px-4{padding-left:16px;padding-right:16px}.sm\:px-6{padding-left:24px;padding-right:24px}.sm\:py-2{padding-top:8px;padding-bottom:8px}.sm\:pt-0{padding-top:0}}@media (min-width: 768px){.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[280px\,1fr\]{grid-template-columns:280px 1fr}}@media (min-width: 1024px){.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.\[\&\:\:-webkit-scrollbar-thumb\]\:bg-border::-webkit-scrollbar-thumb{background-color:hsl(var(--ag-border))}.\[\&\:\:-webkit-scrollbar\]\:h-1::-webkit-scrollbar{height:4px}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\*\:first-child\]\:mt-0>*:first-child{margin-top:0}.\[\&\>\*\:last-child\]\:mb-0>*:last-child{margin-bottom:0}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:16px;height:16px}.\[\&_svg\]\:h-6 svg{height:24px}.\[\&_svg\]\:w-6 svg{width:24px}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}.\[\&_tr\]\:border-border tr{border-color:hsl(var(--ag-border))}
1
+ :root{--ag-bg: 220 14% 96%;--ag-surface: 0 0% 100%;--ag-surface-2: 220 14% 94%;--ag-surface-hover:220 14% 92%;--ag-border: 220 13% 90%;--ag-border-strong: 220 10% 80%;--ag-text: 220 13% 13%;--ag-text-dim: 220 6% 38%;--ag-text-muted: 220 6% 58%;--ag-accent: 246 80% 60%;--ag-accent-fg: 0 0% 100%;--ag-accent-hover: 246 80% 52%;--ag-accent-bg: 246 100% 96%;--ag-success: 158 75% 39%;--ag-success-bg:158 75% 95%;--ag-warning: 38 95% 50%;--ag-warning-bg: 38 95% 95%;--ag-danger: 0 78% 56%;--ag-danger-bg: 0 78% 96%;--ag-info: 217 91% 60%;--ag-info-bg: 217 91% 96%;--ag-shadow-sm: 0 1px 2px hsl(220 13% 13% / .05);--ag-shadow-md: 0 2px 8px hsl(220 13% 13% / .08);--ag-shadow-lg: 0 8px 24px hsl(220 13% 13% / .12)}:root[data-theme=dark]{--ag-bg: 220 10% 7%;--ag-surface: 220 12% 11%;--ag-surface-2: 220 12% 14%;--ag-surface-hover:220 12% 16%;--ag-border: 220 10% 20%;--ag-border-strong: 220 10% 28%;--ag-text: 220 14% 91%;--ag-text-dim: 220 8% 68%;--ag-text-muted: 220 8% 50%;--ag-accent: 246 90% 72%;--ag-accent-fg: 220 30% 5%;--ag-accent-hover: 246 90% 80%;--ag-accent-bg: 246 30% 22%;--ag-success: 158 70% 50%;--ag-success-bg:158 60% 20%;--ag-warning: 38 90% 60%;--ag-warning-bg: 38 60% 20%;--ag-danger: 0 85% 67%;--ag-danger-bg: 0 60% 22%;--ag-info: 217 90% 70%;--ag-info-bg: 217 60% 25%;--ag-shadow-sm: 0 1px 2px hsl(0 0% 0% / .4);--ag-shadow-md: 0 2px 8px hsl(0 0% 0% / .5);--ag-shadow-lg: 0 8px 24px hsl(0 0% 0% / .6)}@media (prefers-color-scheme: dark){:root:not([data-theme=light]):not([data-theme=dark]){--ag-bg: 220 10% 7%;--ag-surface: 220 12% 11%;--ag-surface-2: 220 12% 14%;--ag-surface-hover:220 12% 16%;--ag-border: 220 10% 20%;--ag-border-strong: 220 10% 28%;--ag-text: 220 14% 91%;--ag-text-dim: 220 8% 68%;--ag-text-muted: 220 8% 50%;--ag-accent: 246 90% 72%;--ag-accent-fg: 220 30% 5%;--ag-accent-hover: 246 90% 80%;--ag-accent-bg: 246 30% 22%;--ag-success: 158 70% 50%;--ag-success-bg:158 60% 20%;--ag-warning: 38 90% 60%;--ag-warning-bg: 38 60% 20%;--ag-danger: 0 85% 67%;--ag-danger-bg: 0 60% 22%;--ag-info: 217 90% 70%;--ag-info-bg: 217 60% 25%;--ag-shadow-sm: 0 1px 2px hsl(0 0% 0% / .4);--ag-shadow-md: 0 2px 8px hsl(0 0% 0% / .5);--ag-shadow-lg: 0 8px 24px hsl(0 0% 0% / .6)}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html,body,#root{height:100%}body{background-color:hsl(var(--ag-bg));color:hsl(var(--ag-text));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,"Apple Color Emoji","Segoe UI Emoji",sans-serif;touch-action:manipulation;-webkit-tap-highlight-color:hsl(var(--ag-accent) / .15)}button,[role=button],a,input[type=button],input[type=submit]{-webkit-tap-highlight-color:hsl(var(--ag-accent) / .15)}@media (pointer: fine){*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-thumb{background:hsl(var(--ag-border-strong));border-radius:999px;border:2px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:hsl(var(--ag-text-muted));background-clip:content-box}}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 640px){.container{max-width:640px;padding-right:24px;padding-left:24px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px;padding-right:32px;padding-left:32px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.bottom-2{bottom:8px}.bottom-28{bottom:7rem}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:8px}.left-\[50\%\]{left:50%}.right-4{right:16px}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:16px}.top-\[50\%\]{top:50%}.top-\[var\(--topbar-h\,0\)\]{top:var(--topbar-h,0)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.-mx-1{margin-left:-4px;margin-right:-4px}.-mx-3{margin-left:-12px;margin-right:-12px}.mx-4{margin-left:16px;margin-right:16px}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:4px;margin-bottom:4px}.my-2{margin-top:8px;margin-bottom:8px}.-ml-2{margin-left:-8px}.mb-0\.5{margin-bottom:2px}.mb-1{margin-bottom:4px}.mb-1\.5{margin-bottom:6px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.ml-1{margin-left:4px}.ml-2{margin-left:8px}.ml-3{margin-left:12px}.ml-5{margin-left:20px}.ml-auto{margin-left:auto}.mr-1{margin-right:4px}.mr-2{margin-right:8px}.mt-0\.5{margin-top:2px}.mt-1{margin-top:4px}.mt-1\.5{margin-top:6px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-4{width:16px;height:16px}.h-1{height:4px}.h-1\.5{height:6px}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2{height:8px}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:12px}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:16px}.h-48{height:12rem}.h-5{height:20px}.h-6{height:24px}.h-64{height:16rem}.h-7{height:32px}.h-72{height:18rem}.h-8{height:48px}.h-9{height:64px}.h-96{height:24rem}.h-\[280px\]{height:280px}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-px{height:1px}.max-h-32{max-height:8rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.max-h-\[85dvh\]{max-height:85dvh}.min-h-8{min-height:48px}.min-h-9{min-height:64px}.min-h-\[500px\]{min-height:500px}.min-h-dvh{min-height:100dvh}.w-1\.5{width:6px}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:8px}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:12px}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:16px}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:20px}.w-6{width:24px}.w-64{width:16rem}.w-72{width:18rem}.w-8{width:48px}.w-9{width:64px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[280px\]{width:280px}.w-\[80px\]{width:80px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[85\%\]{max-width:85%}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-mx-4{scroll-margin-left:16px;scroll-margin-right:16px}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:2px}.gap-1{gap:4px}.gap-1\.5{gap:6px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-6{gap:24px}.gap-x-3{-moz-column-gap:12px;column-gap:12px}.gap-x-4{-moz-column-gap:16px;column-gap:16px}.gap-y-1{row-gap:4px}.gap-y-2{row-gap:8px}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:hsl(var(--ag-border))}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:6px}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:10px}.rounded-md{border-radius:6px}.rounded-xl{border-radius:14px}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-accent{border-color:hsl(var(--ag-accent))}.border-border{border-color:hsl(var(--ag-border))}.border-border\/40{border-color:hsl(var(--ag-border) / .4)}.border-danger{border-color:hsl(var(--ag-danger))}.border-danger\/30{border-color:hsl(var(--ag-danger) / .3)}.border-danger\/60{border-color:hsl(var(--ag-danger) / .6)}.border-info{border-color:hsl(var(--ag-info))}.border-info\/30{border-color:hsl(var(--ag-info) / .3)}.border-info\/40{border-color:hsl(var(--ag-info) / .4)}.border-success{border-color:hsl(var(--ag-success))}.border-success\/30{border-color:hsl(var(--ag-success) / .3)}.border-success\/60{border-color:hsl(var(--ag-success) / .6)}.border-transparent{border-color:transparent}.border-warning{border-color:hsl(var(--ag-warning))}.border-warning\/30{border-color:hsl(var(--ag-warning) / .3)}.border-warning\/40{border-color:hsl(var(--ag-warning) / .4)}.border-warning\/50{border-color:hsl(var(--ag-warning) / .5)}.border-warning\/60{border-color:hsl(var(--ag-warning) / .6)}.bg-accent{background-color:hsl(var(--ag-accent))}.bg-accent-bg{background-color:hsl(var(--ag-accent-bg))}.bg-accent\/60{background-color:hsl(var(--ag-accent) / .6)}.bg-bg{background-color:hsl(var(--ag-bg))}.bg-black\/35{background-color:#00000059}.bg-black\/50{background-color:#00000080}.bg-border{background-color:hsl(var(--ag-border))}.bg-danger{background-color:hsl(var(--ag-danger))}.bg-danger-bg{background-color:hsl(var(--ag-danger-bg))}.bg-danger-bg\/30{background-color:hsl(var(--ag-danger-bg) / .3)}.bg-info-bg{background-color:hsl(var(--ag-info-bg))}.bg-info-bg\/40{background-color:hsl(var(--ag-info-bg) / .4)}.bg-info-bg\/50{background-color:hsl(var(--ag-info-bg) / .5)}.bg-success{background-color:hsl(var(--ag-success))}.bg-success-bg{background-color:hsl(var(--ag-success-bg))}.bg-surface{background-color:hsl(var(--ag-surface))}.bg-surface-2{background-color:hsl(var(--ag-surface-2))}.bg-surface-2\/40{background-color:hsl(var(--ag-surface-2) / .4)}.bg-surface-2\/50{background-color:hsl(var(--ag-surface-2) / .5)}.bg-text{background-color:hsl(var(--ag-text))}.bg-text-muted{background-color:hsl(var(--ag-text-muted))}.bg-transparent{background-color:transparent}.bg-warning{background-color:hsl(var(--ag-warning))}.bg-warning-bg{background-color:hsl(var(--ag-warning-bg))}.bg-warning-bg\/40{background-color:hsl(var(--ag-warning-bg) / .4)}.bg-warning-bg\/50{background-color:hsl(var(--ag-warning-bg) / .5)}.bg-warning\/5{background-color:hsl(var(--ag-warning) / .05)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:4px}.p-12{padding:3rem}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:4px;padding-right:4px}.px-1\.5{padding-left:6px;padding-right:6px}.px-2{padding-left:8px;padding-right:8px}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.py-0\.5{padding-top:2px;padding-bottom:2px}.py-1{padding-top:4px;padding-bottom:4px}.py-1\.5{padding-top:6px;padding-bottom:6px}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:8px;padding-bottom:8px}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.py-5{padding-top:20px;padding-bottom:20px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:48px;padding-bottom:48px}.pb-1{padding-bottom:4px}.pb-2{padding-bottom:8px}.pb-3{padding-bottom:12px}.pb-\[calc\(env\(safe-area-inset-bottom\)\+1\.5rem\)\]{padding-bottom:calc(env(safe-area-inset-bottom) + 1.5rem)}.pl-3{padding-left:12px}.pl-7{padding-left:32px}.pl-8{padding-left:48px}.pr-1{padding-right:4px}.pr-2{padding-right:8px}.pt-0{padding-top:0}.pt-1{padding-top:4px}.pt-2{padding-top:8px}.pt-3{padding-top:12px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:30px;line-height:38px}.text-6xl{font-size:3.75rem;line-height:1}.text-\[0\.85em\]{font-size:.85em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[15px\]{font-size:15px}.text-base{font-size:15px;line-height:22px}.text-lg{font-size:20px;line-height:28px}.text-md{font-size:16px;line-height:24px}.text-sm{font-size:13px;line-height:20px}.text-xl{font-size:24px;line-height:32px}.text-xs{font-size:12px;line-height:16px}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.text-accent{color:hsl(var(--ag-accent))}.text-accent-fg{color:hsl(var(--ag-accent-fg))}.text-bg{color:hsl(var(--ag-bg))}.text-danger{color:hsl(var(--ag-danger))}.text-info{color:hsl(var(--ag-info))}.text-success{color:hsl(var(--ag-success))}.text-text{color:hsl(var(--ag-text))}.text-text-dim{color:hsl(var(--ag-text-dim))}.text-text-muted{color:hsl(var(--ag-text-muted))}.text-warning{color:hsl(var(--ag-warning))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.decoration-accent\/40{text-decoration-color:hsl(var(--ag-accent) / .4)}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-accent{accent-color:hsl(var(--ag-accent))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow{--tw-shadow: var(--ag-shadow-md);--tw-shadow-colored: var(--ag-shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: var(--ag-shadow-lg);--tw-shadow-colored: var(--ag-shadow-lg);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: var(--ag-shadow-md);--tw-shadow-colored: var(--ag-shadow-md);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: var(--ag-shadow-sm);--tw-shadow-colored: var(--ag-shadow-sm);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}.running{animation-play-state:running}.paused{animation-play-state:paused}.pt-safe{padding-top:calc(env(safe-area-inset-top) + .5rem)}.pb-safe{padding-bottom:calc(env(safe-area-inset-bottom) + .5rem)}.h-dvh{height:100vh;height:100dvh}.min-h-dvh{min-height:100vh;min-height:100dvh}.tap-target{min-height:32px;min-width:32px}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:13px;line-height:20px}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-text-muted::-moz-placeholder{color:hsl(var(--ag-text-muted))}.placeholder\:text-text-muted::placeholder{color:hsl(var(--ag-text-muted))}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-border-strong:hover{border-color:hsl(var(--ag-border-strong))}.hover\:bg-accent-hover:hover{background-color:hsl(var(--ag-accent-hover))}.hover\:bg-danger:hover{background-color:hsl(var(--ag-danger))}.hover\:bg-danger\/10:hover{background-color:hsl(var(--ag-danger) / .1)}.hover\:bg-surface-2:hover{background-color:hsl(var(--ag-surface-2))}.hover\:text-accent:hover{color:hsl(var(--ag-accent))}.hover\:text-danger:hover{color:hsl(var(--ag-danger))}.hover\:text-text:hover{color:hsl(var(--ag-text))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-accent:hover{text-decoration-color:hsl(var(--ag-accent))}.focus\:border-accent:focus{border-color:hsl(var(--ag-accent))}.focus\:border-info:focus{border-color:hsl(var(--ag-info))}.focus\:text-text:focus{color:hsl(var(--ag-text))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent:focus{--tw-ring-color: hsl(var(--ag-accent))}.focus\:ring-danger:focus{--tw-ring-color: hsl(var(--ag-danger))}.focus\:ring-offset-1:focus{--tw-ring-offset-width: 1px}.focus\:ring-offset-bg:focus{--tw-ring-offset-color: hsl(var(--ag-bg))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-accent:focus-visible{--tw-ring-color: hsl(var(--ag-accent))}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-bg:focus-visible{--tw-ring-offset-color: hsl(var(--ag-bg))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-55:disabled{opacity:.55}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=selected\]\:bg-accent-bg[data-state=selected]{background-color:hsl(var(--ag-accent-bg))}.data-\[state\=active\]\:text-accent[data-state=active]{color:hsl(var(--ag-accent))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open],.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open],.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open],.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=active\]\:after\:absolute[data-state=active]:after{content:var(--tw-content);position:absolute}.data-\[state\=active\]\:after\:inset-x-0[data-state=active]:after{content:var(--tw-content);left:0;right:0}.data-\[state\=active\]\:after\:-bottom-px[data-state=active]:after{content:var(--tw-content);bottom:-1px}.data-\[state\=active\]\:after\:h-0\.5[data-state=active]:after{content:var(--tw-content);height:2px}.data-\[state\=active\]\:after\:rounded[data-state=active]:after{content:var(--tw-content);border-radius:6px}.data-\[state\=active\]\:after\:bg-accent[data-state=active]:after{content:var(--tw-content);background-color:hsl(var(--ag-accent))}@media (min-width: 640px){.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:-mx-4{margin-left:-16px;margin-right:-16px}.sm\:ml-1{margin-left:4px}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:w-20{width:5rem}.sm\:w-28{width:7rem}.sm\:w-36{width:9rem}.sm\:w-40{width:10rem}.sm\:min-w-0{min-width:0px}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-\[75\%\]{max-width:75%}.sm\:max-w-lg{max-width:32rem}.sm\:flex-1{flex:1 1 0%}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[180px_1fr\]{grid-template-columns:180px 1fr}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:8px}.sm\:gap-3{gap:12px}.sm\:p-4{padding:16px}.sm\:p-6{padding:24px}.sm\:px-4{padding-left:16px;padding-right:16px}.sm\:px-6{padding-left:24px;padding-right:24px}.sm\:py-2{padding-top:8px;padding-bottom:8px}.sm\:pt-0{padding-top:0}}@media (min-width: 768px){.md\:block{display:block}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[280px\,1fr\]{grid-template-columns:280px 1fr}}@media (min-width: 1024px){.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.\[\&\:\:-webkit-scrollbar-thumb\]\:bg-border::-webkit-scrollbar-thumb{background-color:hsl(var(--ag-border))}.\[\&\:\:-webkit-scrollbar\]\:h-1::-webkit-scrollbar{height:4px}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\*\:first-child\]\:mt-0>*:first-child{margin-top:0}.\[\&\>\*\:last-child\]\:mb-0>*:last-child{margin-bottom:0}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:16px;height:16px}.\[\&_svg\]\:h-6 svg{height:24px}.\[\&_svg\]\:w-6 svg{width:24px}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}.\[\&_tr\]\:border-border tr{border-color:hsl(var(--ag-border))}
@@ -1,2 +1,2 @@
1
- import{u as C,j as e,l as n,B as x,L as k,m as i}from"./index-DvWldAJY.js";import{r as v}from"./react-DlP5eolq.js";import{f as T,g as A,h as P,a as R}from"./use-agim-skills-BD17YQCK.js";import{L as p}from"./loader-circle-CZQXsfz7.js";import{R as E}from"./refresh-ccw-CW2loqyz.js";import{C as z}from"./copy-D1OIgfLU.js";import{S as O}from"./save-DzWp78MC.js";import{T as B}from"./trash-2-DH4UNSUm.js";const I=1e4;function M(){return e.jsx(W,{})}function W(){const{t:s}=C(["settings","common"]),a=T(),u=A(),h=P(),j=R(),[l,r]=v.useState(""),[f,o]=v.useState(!1);v.useEffect(()=>{a.data&&!f&&r(a.data.override??"")},[a.data,f]);const c=a.data?.auto??"",g=a.data?.maxOverrideChars??4e4,b=a.data?.overrideActive??!1,N=a.data?.overridePath??"~/.agim/skill-injection-override.md",d=l.length,m=d>g;async function w(){if(m){i.error(s("skillInjection.overLimitToast",{len:d,max:g}));return}try{const t=await u.mutateAsync(l);i.success(t.deleted?s("skillInjection.clearedToast"):s("skillInjection.savedToast")),o(!1)}catch(t){i.error(t?.message??String(t))}}async function L(){if(confirm(s("skillInjection.confirmClear")))try{await h.mutateAsync(),r(""),o(!1),i.success(s("skillInjection.clearedToast"))}catch(t){i.error(t?.message??String(t))}}async function S(){try{await j.mutateAsync()}catch(t){i.error(t?.message??String(t));return}await a.refetch(),f||r(a.data?.override??""),i.success(s("skillInjection.rebuiltToast"))}function y(){r(c),o(!0)}return e.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("skillInjection.title")}),b?e.jsx(n,{variant:"success",children:s("skillInjection.overrideActive")}):e.jsx(n,{variant:"outline",children:s("skillInjection.overrideInactive")}),e.jsxs(x,{variant:"outline",size:"sm",className:"ml-auto",onClick:()=>void S(),disabled:a.isFetching||j.isPending,title:s("skillInjection.rebuildTooltip"),children:[a.isFetching||j.isPending?e.jsx(p,{className:"h-4 w-4 animate-spin"}):e.jsx(E,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("skillInjection.rebuild")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("skillInjection.subtitle")}),e.jsx("p",{className:"text-xs text-text-dim font-mono break-all",children:N}),e.jsxs("section",{className:"flex flex-col gap-2 rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"text-sm font-medium",children:s("skillInjection.autoLabel")}),e.jsxs(n,{variant:"outline",children:[c.length.toLocaleString()," chars"]}),c.length>=I&&e.jsx(n,{variant:"warning",children:s("skillInjection.largeWarn")}),e.jsxs(x,{variant:"ghost",size:"sm",className:"ml-auto",onClick:y,disabled:a.isLoading,children:[e.jsx(z,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("skillInjection.copyToOverride")})]})]}),e.jsx("textarea",{readOnly:!0,value:a.isLoading?"...":c,className:"h-64 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs","aria-label":s("skillInjection.autoLabel")})]}),e.jsxs("section",{className:"flex flex-col gap-2 rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"text-sm font-medium",children:s("skillInjection.overrideLabel")}),e.jsxs(n,{variant:m?"danger":"outline",children:[d.toLocaleString()," / ",g.toLocaleString()," chars"]}),d>=I&&!m&&e.jsx(n,{variant:"warning",children:s("skillInjection.largeWarn")})]}),e.jsx("textarea",{value:l,onChange:t=>{r(t.target.value),o(!0)},placeholder:s("skillInjection.overridePlaceholder"),className:"h-72 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs","aria-label":s("skillInjection.overrideLabel")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 pt-1",children:[e.jsxs(x,{onClick:()=>void w(),disabled:u.isPending||m,children:[u.isPending?e.jsx(p,{className:"h-4 w-4 animate-spin"}):e.jsx(O,{className:"h-4 w-4"}),s("skillInjection.save")]}),e.jsxs(x,{variant:"outline",onClick:()=>void L(),disabled:h.isPending||!b&&l.length===0,children:[h.isPending?e.jsx(p,{className:"h-4 w-4 animate-spin"}):e.jsx(B,{className:"h-4 w-4"}),s("skillInjection.clear")]}),e.jsx("span",{className:"text-xs text-text-dim",children:s("skillInjection.hint")})]})]})]})}export{M as Component,W as default};
2
- //# sourceMappingURL=injection-C89g9123.js.map
1
+ import{u as C,j as e,l as n,B as x,L as k,m as i}from"./index-BiXaJRfQ.js";import{r as v}from"./react-DlP5eolq.js";import{f as T,g as A,h as P,a as R}from"./use-agim-skills-CZkKns-g.js";import{L as p}from"./loader-circle-D_dW2RUZ.js";import{R as E}from"./refresh-ccw-DBNikooZ.js";import{C as z}from"./copy-D9ljWg7b.js";import{S as O}from"./save-DZiTNYpH.js";import{T as B}from"./trash-2-DdjC6QH7.js";const I=1e4;function M(){return e.jsx(W,{})}function W(){const{t:s}=C(["settings","common"]),a=T(),u=A(),h=P(),j=R(),[l,r]=v.useState(""),[f,o]=v.useState(!1);v.useEffect(()=>{a.data&&!f&&r(a.data.override??"")},[a.data,f]);const c=a.data?.auto??"",g=a.data?.maxOverrideChars??4e4,b=a.data?.overrideActive??!1,N=a.data?.overridePath??"~/.agim/skill-injection-override.md",d=l.length,m=d>g;async function w(){if(m){i.error(s("skillInjection.overLimitToast",{len:d,max:g}));return}try{const t=await u.mutateAsync(l);i.success(t.deleted?s("skillInjection.clearedToast"):s("skillInjection.savedToast")),o(!1)}catch(t){i.error(t?.message??String(t))}}async function L(){if(confirm(s("skillInjection.confirmClear")))try{await h.mutateAsync(),r(""),o(!1),i.success(s("skillInjection.clearedToast"))}catch(t){i.error(t?.message??String(t))}}async function S(){try{await j.mutateAsync()}catch(t){i.error(t?.message??String(t));return}await a.refetch(),f||r(a.data?.override??""),i.success(s("skillInjection.rebuiltToast"))}function y(){r(c),o(!0)}return e.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("skillInjection.title")}),b?e.jsx(n,{variant:"success",children:s("skillInjection.overrideActive")}):e.jsx(n,{variant:"outline",children:s("skillInjection.overrideInactive")}),e.jsxs(x,{variant:"outline",size:"sm",className:"ml-auto",onClick:()=>void S(),disabled:a.isFetching||j.isPending,title:s("skillInjection.rebuildTooltip"),children:[a.isFetching||j.isPending?e.jsx(p,{className:"h-4 w-4 animate-spin"}):e.jsx(E,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("skillInjection.rebuild")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("skillInjection.subtitle")}),e.jsx("p",{className:"text-xs text-text-dim font-mono break-all",children:N}),e.jsxs("section",{className:"flex flex-col gap-2 rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"text-sm font-medium",children:s("skillInjection.autoLabel")}),e.jsxs(n,{variant:"outline",children:[c.length.toLocaleString()," chars"]}),c.length>=I&&e.jsx(n,{variant:"warning",children:s("skillInjection.largeWarn")}),e.jsxs(x,{variant:"ghost",size:"sm",className:"ml-auto",onClick:y,disabled:a.isLoading,children:[e.jsx(z,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("skillInjection.copyToOverride")})]})]}),e.jsx("textarea",{readOnly:!0,value:a.isLoading?"...":c,className:"h-64 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs","aria-label":s("skillInjection.autoLabel")})]}),e.jsxs("section",{className:"flex flex-col gap-2 rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"text-sm font-medium",children:s("skillInjection.overrideLabel")}),e.jsxs(n,{variant:m?"danger":"outline",children:[d.toLocaleString()," / ",g.toLocaleString()," chars"]}),d>=I&&!m&&e.jsx(n,{variant:"warning",children:s("skillInjection.largeWarn")})]}),e.jsx("textarea",{value:l,onChange:t=>{r(t.target.value),o(!0)},placeholder:s("skillInjection.overridePlaceholder"),className:"h-72 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs","aria-label":s("skillInjection.overrideLabel")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 pt-1",children:[e.jsxs(x,{onClick:()=>void w(),disabled:u.isPending||m,children:[u.isPending?e.jsx(p,{className:"h-4 w-4 animate-spin"}):e.jsx(O,{className:"h-4 w-4"}),s("skillInjection.save")]}),e.jsxs(x,{variant:"outline",onClick:()=>void L(),disabled:h.isPending||!b&&l.length===0,children:[h.isPending?e.jsx(p,{className:"h-4 w-4 animate-spin"}):e.jsx(B,{className:"h-4 w-4"}),s("skillInjection.clear")]}),e.jsx("span",{className:"text-xs text-text-dim",children:s("skillInjection.hint")})]})]})]})}export{M as Component,W as default};
2
+ //# sourceMappingURL=injection-rK-nXEck.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injection-C89g9123.js","sources":["../../src/routes/settings/agim-skills/injection.tsx"],"sourcesContent":["/**\n * /settings/agim-skills/injection — operator-facing editor for the\n * tier-1 system-prompt skill block.\n *\n * v1.2.151 — Background: every agim turn injects an auto-generated\n * skill block at the top of the system prompt so the LLM knows which\n * skills it can call. The block is computed from the loader's bucket\n * + cluster rules. When operators want to nudge it (pin a skill,\n * hide a noisy one, add a routing hint about a custom env), they\n * authoring text here writes a single Markdown file\n * (`~/.agim/skill-injection-override.md`) that REPLACES the auto\n * block at injection time. Empty file == auto behaviour.\n *\n * UI:\n * · Left/top: Auto-generated block (read-only preview).\n * · Right/bottom: Operator override (editable textarea).\n * · Buttons: Save / Clear / Refresh / Copy-auto-into-override.\n * · Counters: char count for both panes + warning at ≥10k chars.\n */\n\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Copy, Loader2, RefreshCcw, Save, Trash2 } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Label } from '@/components/ui/label'\nimport {\n useSkillInjection, useSkillInjectionSave, useSkillInjectionDelete,\n useAgimSkillsRefresh,\n} from '@/hooks/use-agim-skills'\n\nconst TOKEN_WARN_CHARS = 10_000\n\nexport function Component(): JSX.Element {\n return <InjectionEditorRoute />\n}\n\nexport default function InjectionEditorRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const query = useSkillInjection()\n const save = useSkillInjectionSave()\n const del = useSkillInjectionDelete()\n // v1.2.152 — \"Refresh\" 改成\"重建自动注入词\":先让 loader 重扫磁盘\n // (POST /api/agim-skills/refresh 会调用 invalidateSkillsCache 失效 5 分钟\n // TTL 缓存),然后再 refetch GET injection 拿到 fresh auto block。\n // override 字段不受影响。\n const refreshLoader = useAgimSkillsRefresh()\n\n // Local draft state; sync from server on first load + after a save.\n const [draft, setDraft] = useState('')\n const [touched, setTouched] = useState(false)\n\n useEffect(() => {\n if (query.data && !touched) {\n setDraft(query.data.override ?? '')\n }\n }, [query.data, touched])\n\n const auto = query.data?.auto ?? ''\n const maxChars = query.data?.maxOverrideChars ?? 40_000\n const overrideActive = query.data?.overrideActive ?? false\n const overridePath = query.data?.overridePath ?? '~/.agim/skill-injection-override.md'\n\n const draftLen = draft.length\n const overLimit = draftLen > maxChars\n\n async function onSave(): Promise<void> {\n if (overLimit) {\n toast.error(t('skillInjection.overLimitToast', { len: draftLen, max: maxChars }))\n return\n }\n try {\n const r = await save.mutateAsync(draft)\n toast.success(r.deleted ? t('skillInjection.clearedToast') : t('skillInjection.savedToast'))\n setTouched(false)\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n }\n }\n\n async function onClear(): Promise<void> {\n if (!confirm(t('skillInjection.confirmClear'))) return\n try {\n await del.mutateAsync()\n setDraft('')\n setTouched(false)\n toast.success(t('skillInjection.clearedToast'))\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n }\n }\n\n async function onRefresh(): Promise<void> {\n // Two-step: invalidate loader cache (re-scan disk) → refetch injection.\n try {\n await refreshLoader.mutateAsync()\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n return\n }\n await query.refetch()\n if (!touched) setDraft(query.data?.override ?? '')\n toast.success(t('skillInjection.rebuiltToast'))\n }\n\n function onCopyAuto(): void {\n setDraft(auto)\n setTouched(true)\n }\n\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('skillInjection.title')}</h1>\n {overrideActive\n ? <Badge variant=\"success\">{t('skillInjection.overrideActive')}</Badge>\n : <Badge variant=\"outline\">{t('skillInjection.overrideInactive')}</Badge>}\n <Button\n variant=\"outline\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void onRefresh()}\n disabled={query.isFetching || refreshLoader.isPending}\n title={t('skillInjection.rebuildTooltip')}\n >\n {(query.isFetching || refreshLoader.isPending)\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('skillInjection.rebuild')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('skillInjection.subtitle')}</p>\n <p className=\"text-xs text-text-dim font-mono break-all\">{overridePath}</p>\n\n {/* Auto preview */}\n <section className=\"flex flex-col gap-2 rounded-md border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-sm font-medium\">{t('skillInjection.autoLabel')}</Label>\n <Badge variant=\"outline\">{auto.length.toLocaleString()} chars</Badge>\n {auto.length >= TOKEN_WARN_CHARS && (\n <Badge variant=\"warning\">{t('skillInjection.largeWarn')}</Badge>\n )}\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={onCopyAuto}\n disabled={query.isLoading}\n >\n <Copy className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('skillInjection.copyToOverride')}</span>\n </Button>\n </div>\n <textarea\n readOnly\n value={query.isLoading ? '...' : auto}\n className=\"h-64 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs\"\n aria-label={t('skillInjection.autoLabel')}\n />\n </section>\n\n {/* Override editor */}\n <section className=\"flex flex-col gap-2 rounded-md border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-sm font-medium\">{t('skillInjection.overrideLabel')}</Label>\n <Badge variant={overLimit ? 'danger' : 'outline'}>\n {draftLen.toLocaleString()} / {maxChars.toLocaleString()} chars\n </Badge>\n {draftLen >= TOKEN_WARN_CHARS && !overLimit && (\n <Badge variant=\"warning\">{t('skillInjection.largeWarn')}</Badge>\n )}\n </div>\n <textarea\n value={draft}\n onChange={(e) => { setDraft(e.target.value); setTouched(true) }}\n placeholder={t('skillInjection.overridePlaceholder')}\n className=\"h-72 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs\"\n aria-label={t('skillInjection.overrideLabel')}\n />\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n onClick={() => void onSave()}\n disabled={save.isPending || overLimit}\n >\n {save.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('skillInjection.save')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => void onClear()}\n disabled={del.isPending || (!overrideActive && draft.length === 0)}\n >\n {del.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Trash2 className=\"h-4 w-4\" />}\n {t('skillInjection.clear')}\n </Button>\n <span className=\"text-xs text-text-dim\">{t('skillInjection.hint')}</span>\n </div>\n </section>\n </div>\n )\n}\n"],"names":["TOKEN_WARN_CHARS","Component","InjectionEditorRoute","t","useTranslation","query","useSkillInjection","save","useSkillInjectionSave","del","useSkillInjectionDelete","refreshLoader","useAgimSkillsRefresh","draft","setDraft","useState","touched","setTouched","useEffect","auto","maxChars","overrideActive","overridePath","draftLen","overLimit","onSave","toast","r","err","onClear","onRefresh","onCopyAuto","jsxs","jsx","Badge","Button","Loader2","RefreshCcw","Label","Copy","e","Save","Trash2"],"mappings":"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"}
1
+ {"version":3,"file":"injection-rK-nXEck.js","sources":["../../src/routes/settings/agim-skills/injection.tsx"],"sourcesContent":["/**\n * /settings/agim-skills/injection — operator-facing editor for the\n * tier-1 system-prompt skill block.\n *\n * v1.2.151 — Background: every agim turn injects an auto-generated\n * skill block at the top of the system prompt so the LLM knows which\n * skills it can call. The block is computed from the loader's bucket\n * + cluster rules. When operators want to nudge it (pin a skill,\n * hide a noisy one, add a routing hint about a custom env), they\n * authoring text here writes a single Markdown file\n * (`~/.agim/skill-injection-override.md`) that REPLACES the auto\n * block at injection time. Empty file == auto behaviour.\n *\n * UI:\n * · Left/top: Auto-generated block (read-only preview).\n * · Right/bottom: Operator override (editable textarea).\n * · Buttons: Save / Clear / Refresh / Copy-auto-into-override.\n * · Counters: char count for both panes + warning at ≥10k chars.\n */\n\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Copy, Loader2, RefreshCcw, Save, Trash2 } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Label } from '@/components/ui/label'\nimport {\n useSkillInjection, useSkillInjectionSave, useSkillInjectionDelete,\n useAgimSkillsRefresh,\n} from '@/hooks/use-agim-skills'\n\nconst TOKEN_WARN_CHARS = 10_000\n\nexport function Component(): JSX.Element {\n return <InjectionEditorRoute />\n}\n\nexport default function InjectionEditorRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const query = useSkillInjection()\n const save = useSkillInjectionSave()\n const del = useSkillInjectionDelete()\n // v1.2.152 — \"Refresh\" 改成\"重建自动注入词\":先让 loader 重扫磁盘\n // (POST /api/agim-skills/refresh 会调用 invalidateSkillsCache 失效 5 分钟\n // TTL 缓存),然后再 refetch GET injection 拿到 fresh auto block。\n // override 字段不受影响。\n const refreshLoader = useAgimSkillsRefresh()\n\n // Local draft state; sync from server on first load + after a save.\n const [draft, setDraft] = useState('')\n const [touched, setTouched] = useState(false)\n\n useEffect(() => {\n if (query.data && !touched) {\n setDraft(query.data.override ?? '')\n }\n }, [query.data, touched])\n\n const auto = query.data?.auto ?? ''\n const maxChars = query.data?.maxOverrideChars ?? 40_000\n const overrideActive = query.data?.overrideActive ?? false\n const overridePath = query.data?.overridePath ?? '~/.agim/skill-injection-override.md'\n\n const draftLen = draft.length\n const overLimit = draftLen > maxChars\n\n async function onSave(): Promise<void> {\n if (overLimit) {\n toast.error(t('skillInjection.overLimitToast', { len: draftLen, max: maxChars }))\n return\n }\n try {\n const r = await save.mutateAsync(draft)\n toast.success(r.deleted ? t('skillInjection.clearedToast') : t('skillInjection.savedToast'))\n setTouched(false)\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n }\n }\n\n async function onClear(): Promise<void> {\n if (!confirm(t('skillInjection.confirmClear'))) return\n try {\n await del.mutateAsync()\n setDraft('')\n setTouched(false)\n toast.success(t('skillInjection.clearedToast'))\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n }\n }\n\n async function onRefresh(): Promise<void> {\n // Two-step: invalidate loader cache (re-scan disk) → refetch injection.\n try {\n await refreshLoader.mutateAsync()\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n return\n }\n await query.refetch()\n if (!touched) setDraft(query.data?.override ?? '')\n toast.success(t('skillInjection.rebuiltToast'))\n }\n\n function onCopyAuto(): void {\n setDraft(auto)\n setTouched(true)\n }\n\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('skillInjection.title')}</h1>\n {overrideActive\n ? <Badge variant=\"success\">{t('skillInjection.overrideActive')}</Badge>\n : <Badge variant=\"outline\">{t('skillInjection.overrideInactive')}</Badge>}\n <Button\n variant=\"outline\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void onRefresh()}\n disabled={query.isFetching || refreshLoader.isPending}\n title={t('skillInjection.rebuildTooltip')}\n >\n {(query.isFetching || refreshLoader.isPending)\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('skillInjection.rebuild')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('skillInjection.subtitle')}</p>\n <p className=\"text-xs text-text-dim font-mono break-all\">{overridePath}</p>\n\n {/* Auto preview */}\n <section className=\"flex flex-col gap-2 rounded-md border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-sm font-medium\">{t('skillInjection.autoLabel')}</Label>\n <Badge variant=\"outline\">{auto.length.toLocaleString()} chars</Badge>\n {auto.length >= TOKEN_WARN_CHARS && (\n <Badge variant=\"warning\">{t('skillInjection.largeWarn')}</Badge>\n )}\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={onCopyAuto}\n disabled={query.isLoading}\n >\n <Copy className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('skillInjection.copyToOverride')}</span>\n </Button>\n </div>\n <textarea\n readOnly\n value={query.isLoading ? '...' : auto}\n className=\"h-64 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs\"\n aria-label={t('skillInjection.autoLabel')}\n />\n </section>\n\n {/* Override editor */}\n <section className=\"flex flex-col gap-2 rounded-md border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <Label className=\"text-sm font-medium\">{t('skillInjection.overrideLabel')}</Label>\n <Badge variant={overLimit ? 'danger' : 'outline'}>\n {draftLen.toLocaleString()} / {maxChars.toLocaleString()} chars\n </Badge>\n {draftLen >= TOKEN_WARN_CHARS && !overLimit && (\n <Badge variant=\"warning\">{t('skillInjection.largeWarn')}</Badge>\n )}\n </div>\n <textarea\n value={draft}\n onChange={(e) => { setDraft(e.target.value); setTouched(true) }}\n placeholder={t('skillInjection.overridePlaceholder')}\n className=\"h-72 w-full resize-y rounded border border-border bg-surface-2 p-2 font-mono text-xs\"\n aria-label={t('skillInjection.overrideLabel')}\n />\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n onClick={() => void onSave()}\n disabled={save.isPending || overLimit}\n >\n {save.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('skillInjection.save')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => void onClear()}\n disabled={del.isPending || (!overrideActive && draft.length === 0)}\n >\n {del.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Trash2 className=\"h-4 w-4\" />}\n {t('skillInjection.clear')}\n </Button>\n <span className=\"text-xs text-text-dim\">{t('skillInjection.hint')}</span>\n </div>\n </section>\n </div>\n )\n}\n"],"names":["TOKEN_WARN_CHARS","Component","InjectionEditorRoute","t","useTranslation","query","useSkillInjection","save","useSkillInjectionSave","del","useSkillInjectionDelete","refreshLoader","useAgimSkillsRefresh","draft","setDraft","useState","touched","setTouched","useEffect","auto","maxChars","overrideActive","overridePath","draftLen","overLimit","onSave","toast","r","err","onClear","onRefresh","onCopyAuto","jsxs","jsx","Badge","Button","Loader2","RefreshCcw","Label","Copy","e","Save","Trash2"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{o as C,u as v,j as e,l as b,B as y,m as S,L as M,I as L,C as O}from"./index-DvWldAJY.js";import{r as x}from"./react-DlP5eolq.js";import{u as P,a as R,b as T,c as z,d as F,e as D}from"./use-agim-skills-BD17YQCK.js";import{L as N}from"./loader-circle-CZQXsfz7.js";import{R as q}from"./refresh-ccw-CW2loqyz.js";import{S as K}from"./search-DVWPME2t.js";import{C as W}from"./chevron-right-CPHPRLSX.js";import{T as V}from"./trash-2-DH4UNSUm.js";import{S as H}from"./save-DzWp78MC.js";/**
1
+ import{o as C,u as v,j as e,l as b,B as y,m as S,L as M,I as L,C as O}from"./index-BiXaJRfQ.js";import{r as x}from"./react-DlP5eolq.js";import{u as P,a as R,b as T,c as z,d as F,e as D}from"./use-agim-skills-CZkKns-g.js";import{L as N}from"./loader-circle-D_dW2RUZ.js";import{R as q}from"./refresh-ccw-DBNikooZ.js";import{S as K}from"./search-DSXC_EYz.js";import{C as W}from"./chevron-right-BIKADdPm.js";import{T as V}from"./trash-2-DdjC6QH7.js";import{S as H}from"./save-DZiTNYpH.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -28,4 +28,4 @@ Write the body the agent should read when this skill applies.
28
28
  1. step one
29
29
  2. step two
30
30
  `;function ne(){const{t:s}=v(["settings","common"]),l=P(),h=R(),[t,a]=x.useState(null);x.useEffect(()=>{!t&&l.data?.skills.length&&a(l.data.skills[0]?.name??null)},[t,l.data]);const u=l.data?.skills??[],p=l.data?.maxBodyChars??32e3;async function g(){try{const o=await h.mutateAsync();S.success(s("agimSkills.reloadedToast",{count:o.count}))}catch(o){S.error(o?.message??String(o))}}return e.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx(I,{className:"h-5 w-5 text-text-dim"}),e.jsx("h1",{className:"text-xl font-semibold",children:s("agimSkills.title")}),e.jsx(b,{variant:"info",children:u.length}),e.jsxs(y,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void g(),disabled:h.isPending,children:[h.isPending?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(q,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("agimSkills.reload")})]}),e.jsx(Z,{onCreate:o=>a(o)})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("agimSkills.subtitle")}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[280px,1fr]",children:[e.jsx($,{skills:u,selected:t,onSelect:a,loading:l.isLoading}),t?e.jsx(G,{name:t,maxBody:p,onDeleted:()=>a(null)},t):e.jsx("section",{className:"flex items-center justify-center rounded-md border border-border bg-surface p-12 text-sm text-text-dim",children:s("agimSkills.selectHint")})]})]})}const w=[{bucket:0,i18nKey:"agimSkills.group.framework",defaultOpen:!0},{bucket:1,i18nKey:"agimSkills.group.builtin",defaultOpen:!0},{bucket:3,i18nKey:"agimSkills.group.workspace",defaultOpen:!1},{bucket:2,i18nKey:"agimSkills.group.eccPicks",defaultOpen:!0},{bucket:4,i18nKey:"agimSkills.group.eccRemainder",defaultOpen:!1}];function U(s){return typeof s.bucket=="number"?s.bucket:s.name.startsWith("agim-")?0:s.source==="builtin"&&s.description.startsWith("[ECC] ")?4:s.source==="workspace"?3:1}function $({skills:s,selected:l,onSelect:h,loading:t}){const{t:a}=v(["settings","common"]),[u,p]=x.useState(""),[g,o]=x.useState(()=>new Set(w.filter(i=>i.defaultOpen).map(i=>i.bucket))),f=x.useMemo(()=>{const i=new Map;for(const d of s){const c=U(d),m=i.get(c)??[];m.push(d),i.set(c,m)}for(const d of i.values())d.sort((c,m)=>c.name.localeCompare(m.name));return i},[s]),k=u.trim().toLowerCase(),r=x.useMemo(()=>{if(!k)return f;const i=new Map;for(const[d,c]of f){const m=c.filter(n=>n.name.toLowerCase().includes(k)||n.description.toLowerCase().includes(k));m.length>0&&i.set(d,m)}return i},[k,f]);function j(i){o(d=>{const c=new Set(d);return c.has(i)?c.delete(i):c.add(i),c})}return t?e.jsx("div",{className:"h-48 rounded-md bg-surface-2 animate-pulse"}):s.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-4 text-sm text-text-dim",children:a("agimSkills.emptyList")}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"relative",children:[e.jsx(K,{className:"absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-text-dim"}),e.jsx(L,{value:u,onChange:i=>p(i.target.value),placeholder:a("agimSkills.searchPlaceholder",{defaultValue:"Filter skills..."}),className:"pl-7 text-xs h-8","aria-label":a("agimSkills.searchPlaceholder",{defaultValue:"Filter skills"})})]}),e.jsxs("nav",{className:"rounded-md border border-border bg-surface",children:[w.map(({bucket:i,i18nKey:d})=>{const c=r.get(i)??[];if(c.length===0)return null;const m=k?!0:g.has(i);return e.jsxs("section",{className:"border-b border-border last:border-b-0",children:[e.jsxs("button",{type:"button",onClick:()=>j(i),className:"flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-medium hover:bg-surface-2","aria-expanded":m,children:[m?e.jsx(O,{className:"h-3.5 w-3.5 shrink-0 text-text-dim"}):e.jsx(W,{className:"h-3.5 w-3.5 shrink-0 text-text-dim"}),e.jsx("span",{className:"grow truncate",children:a(d)}),e.jsx(b,{variant:"outline",children:c.length})]}),m&&e.jsx("ul",{className:"divide-y divide-border border-t border-border bg-surface-2/40",children:c.map(n=>{const B=l===n.name,E=n.available?n.always?e.jsx(b,{variant:"success",children:a("agimSkills.alwaysOn")}):null:e.jsx(b,{variant:"outline",title:n.unavailableReason,children:a("agimSkills.unavailable")}),A=n.source==="workspace"?e.jsx(b,{variant:"info",children:a("agimSkills.sourceWs")}):e.jsx(b,{variant:"outline",children:a("agimSkills.sourceBuiltin")});return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>h(n.name),className:"flex w-full flex-col items-start gap-1 px-3 py-2 text-left text-xs transition hover:bg-surface-2 "+(B?"bg-surface-2 font-semibold":""),children:[e.jsxs("span",{className:"flex w-full items-center gap-2 font-mono text-[12px]",children:[e.jsx("span",{className:"grow truncate",children:n.name}),A,E]}),e.jsx("span",{className:"line-clamp-2 text-[11px] text-text-dim",children:n.description})]})},n.name)})})]},i)}),k&&r.size===0&&e.jsx("div",{className:"px-3 py-4 text-xs text-text-dim",children:a("agimSkills.searchEmpty",{defaultValue:"No matches."})})]})]})}function G({name:s,maxBody:l,onDeleted:h}){const{t}=v(["settings","common"]),a=z(s),u=F(),p=D(),[g,o]=x.useState(""),[f,k]=x.useState("");x.useEffect(()=>{a.data&&f!==s&&(o(a.data.body),k(s))},[a.data,s,f]);const r=a.data?.meta,j=r?.source==="builtin",i=a.data?.body??"",d=x.useMemo(()=>g!==i,[g,i]);async function c(){try{await u.mutateAsync({name:s,body:g}),S.success(t("agimSkills.savedToast",{name:s}))}catch(n){S.error(n?.message??String(n))}}async function m(){if(!j&&confirm(t("agimSkills.deleteConfirm",{name:s})))try{await p.mutateAsync(s),S.success(t("agimSkills.deletedToast",{name:s})),h()}catch(n){S.error(n?.message??String(n))}}return a.isLoading?e.jsx("section",{className:"h-72 rounded-md bg-surface-2 animate-pulse"}):r?e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("header",{className:"flex flex-wrap items-center gap-2 rounded-md border border-border bg-surface px-3 py-2",children:[e.jsx("span",{className:"font-mono text-sm font-semibold",children:r.name}),r.source==="workspace"?e.jsx(b,{variant:"info",children:t("agimSkills.sourceWorkspace")}):e.jsx(b,{variant:"outline",children:t("agimSkills.sourceBuiltinReadonly")}),r.always&&e.jsx(b,{variant:"success",children:t("agimSkills.alwaysOn")}),!r.available&&e.jsx(b,{variant:"outline",title:r.unavailableReason,children:t("agimSkills.unavailable")}),e.jsxs("span",{className:"ml-auto text-[11px] text-text-dim",children:[g.length," / ",l]})]}),e.jsx("textarea",{value:g,onChange:n=>o(n.target.value),disabled:j&&!d,spellCheck:!1,className:"min-h-[500px] w-full rounded-md border border-border bg-surface p-3 font-mono text-xs leading-relaxed focus:border-accent focus:outline-none"}),e.jsxs("div",{className:"text-[11px] text-text-dim",children:[t("agimSkills.pathLabel")," ",e.jsx("code",{children:r.dir})," ·",t("agimSkills.binsLabel")," ",e.jsx("code",{children:r.requiresBins.join(", ")||t("agimSkills.none")})," ·",t("agimSkills.envLabel")," ",e.jsx("code",{children:r.requiresEnv.join(", ")||t("agimSkills.none")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[j&&e.jsx("span",{className:"text-[11px] text-text-dim",children:t("agimSkills.builtinShadowHint")}),e.jsx("span",{className:"ml-auto"}),!j&&e.jsxs(y,{variant:"ghost",size:"sm",onClick:()=>void m(),disabled:p.isPending,className:"text-danger hover:text-danger",children:[e.jsx(V,{className:"h-4 w-4"}),t("agimSkills.delete")]}),e.jsxs(y,{size:"sm",onClick:()=>void c(),disabled:u.isPending||!d,children:[u.isPending?e.jsx(N,{className:"h-4 w-4 animate-spin"}):e.jsx(H,{className:"h-4 w-4"}),t(j?"agimSkills.saveShadow":"agimSkills.save")]})]})]}):e.jsx("section",{className:"rounded-md border border-border bg-surface p-4 text-sm text-danger",children:t("agimSkills.notFound")})}function Z({onCreate:s}){const{t:l}=v(["settings","common"]),h=T(),[t,a]=x.useState(!1),[u,p]=x.useState("");async function g(o){o.preventDefault();const f=u.trim();if(!f){S.error(l("agimSkills.nameRequired"));return}if(!/^[A-Za-z0-9._-]+$/.test(f)){S.error(l("agimSkills.invalidNameChars"));return}const k=Q.replace("name: my-skill",`name: ${f}`);try{const r=await h.mutateAsync({name:f,body:k});S.success(l("agimSkills.createdToast",{name:r.meta.name})),a(!1),p(""),s(r.meta.name)}catch(r){S.error(r?.message??String(r))}}return t?e.jsxs("form",{onSubmit:o=>void g(o),className:"flex items-center gap-1",children:[e.jsx(M,{className:"sr-only",children:l("agimSkills.newName")}),e.jsx(L,{autoFocus:!0,value:u,onChange:o=>p(o.target.value),placeholder:l("agimSkills.newNamePlaceholder"),className:"h-8 w-44 font-mono text-xs"}),e.jsx(y,{type:"submit",size:"sm",disabled:h.isPending,children:h.isPending?e.jsx(N,{className:"h-4 w-4 animate-spin"}):l("agimSkills.newCreate")}),e.jsx(y,{type:"button",variant:"ghost",size:"sm",onClick:()=>{a(!1),p("")},children:l("actions.cancel",{ns:"common"})})]}):e.jsxs(y,{size:"sm",onClick:()=>a(!0),children:[e.jsx(_,{className:"h-4 w-4"})," ",l("agimSkills.new")]})}export{ne as default};
31
- //# sourceMappingURL=installed-1Hal8dxW.js.map
31
+ //# sourceMappingURL=installed-C3GsWhFt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installed-1Hal8dxW.js","sources":["../../node_modules/lucide-react/dist/esm/icons/book-open.js","../../node_modules/lucide-react/dist/esm/icons/file-plus-2.js","../../src/routes/settings/agim-skills/installed.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst BookOpen = createLucideIcon(\"BookOpen\", [\n [\"path\", { d: \"M12 7v14\", key: \"1akyts\" }],\n [\n \"path\",\n {\n d: \"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n key: \"ruj8y\"\n }\n ]\n]);\n\nexport { BookOpen as default };\n//# sourceMappingURL=book-open.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FilePlus2 = createLucideIcon(\"FilePlus2\", [\n [\"path\", { d: \"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4\", key: \"1pf5j1\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M3 15h6\", key: \"4e2qda\" }],\n [\"path\", { d: \"M6 12v6\", key: \"1u72j0\" }]\n]);\n\nexport { FilePlus2 as default };\n//# sourceMappingURL=file-plus-2.js.map\n","/**\n * /settings/agim-skills — manage the agim SKILL.md library\n * (P1 follow-up).\n *\n * Two-pane layout:\n * · Left: skill list (source + availability + always-on tags;\n * click to load body into the editor).\n * · Right: SKILL.md editor (textarea) + Save + Delete (workspace\n * skills only) + Create New + Refresh from disk.\n *\n * Builtin skills are read-only here — to override one, just create\n * a workspace skill with the same name; the loader shadows builtins\n * by name (see core/skills/loader.ts § discovery + shadowing).\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n BookOpen, ChevronDown, ChevronRight, FilePlus2, Loader2, RefreshCcw, Save, Search, Trash2,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n useAgimSkillsList, useAgimSkill,\n useAgimSkillCreate, useAgimSkillUpdate, useAgimSkillDelete,\n useAgimSkillsRefresh,\n type AgimSkillMeta,\n} from '@/hooks/use-agim-skills'\n\nconst STARTER_TEMPLATE = `---\nname: my-skill\ndescription: One-line summary the LLM uses to decide whether to load this skill.\nalways: false\n---\n\n# My Skill\n\nWrite the body the agent should read when this skill applies.\n\n## When to use this skill\n\n- bullet 1\n- bullet 2\n\n## Steps\n\n1. step one\n2. step two\n`\n\nexport default function SettingsAgimSkillsRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useAgimSkillsList()\n const refresh = useAgimSkillsRefresh()\n const [selected, setSelected] = useState<string | null>(null)\n\n // Pre-select the first skill once the list arrives.\n useEffect(() => {\n if (!selected && listQuery.data?.skills.length) {\n setSelected(listQuery.data.skills[0]?.name ?? null)\n }\n }, [selected, listQuery.data])\n\n const skills = listQuery.data?.skills ?? []\n const maxBody = listQuery.data?.maxBodyChars ?? 32_000\n\n async function onRefresh(): Promise<void> {\n try {\n const r = await refresh.mutateAsync()\n toast.success(t('agimSkills.reloadedToast', { count: r.count }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4\">\n <header className=\"flex items-center gap-3\">\n <BookOpen className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('agimSkills.title')}</h1>\n <Badge variant=\"info\">{skills.length}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void onRefresh()}\n disabled={refresh.isPending}\n >\n {refresh.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('agimSkills.reload')}</span>\n </Button>\n <NewSkillButton onCreate={(n) => setSelected(n)} />\n </header>\n <p className=\"text-sm text-text-dim\">{t('agimSkills.subtitle')}</p>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-[280px,1fr]\">\n <SkillsList\n skills={skills}\n selected={selected}\n onSelect={setSelected}\n loading={listQuery.isLoading}\n />\n {selected ? (\n <SkillEditor\n key={selected}\n name={selected}\n maxBody={maxBody}\n onDeleted={() => setSelected(null)}\n />\n ) : (\n <section className=\"flex items-center justify-center rounded-md border border-border bg-surface p-12 text-sm text-text-dim\">\n {t('agimSkills.selectHint')}\n </section>\n )}\n </div>\n </div>\n )\n}\n\n/* ─────────────── List pane ─────────────── */\n\n// v1.2.152 — bucket grouping for the installed list. Maps loader's\n// `rankSkillBucket` (0–4) to a stable display order + i18n key. Default\n// expanded vs collapsed: small curated buckets (framework / builtin /\n// ECC picks) expand on first render; the two large reservoirs (workspace\n// + ECC remainder) collapse so the page renders without throwing 300+\n// rows into the DOM tree on mount.\nconst BUCKET_DEF: ReadonlyArray<{ bucket: 0 | 1 | 2 | 3 | 4; i18nKey: string; defaultOpen: boolean }> = [\n { bucket: 0, i18nKey: 'agimSkills.group.framework', defaultOpen: true },\n { bucket: 1, i18nKey: 'agimSkills.group.builtin', defaultOpen: true },\n { bucket: 3, i18nKey: 'agimSkills.group.workspace', defaultOpen: false },\n { bucket: 2, i18nKey: 'agimSkills.group.eccPicks', defaultOpen: true },\n { bucket: 4, i18nKey: 'agimSkills.group.eccRemainder', defaultOpen: false },\n]\n\nfunction bucketOf(s: AgimSkillMeta): 0 | 1 | 2 | 3 | 4 {\n // Server tells us via the `bucket` field (v1.2.152+); fall back to a\n // best-effort client-side derivation for older agim servers.\n if (typeof s.bucket === 'number') return s.bucket\n if (s.name.startsWith('agim-')) return 0\n const isEcc = s.source === 'builtin' && s.description.startsWith('[ECC] ')\n if (isEcc) return 4\n if (s.source === 'workspace') return 3\n return 1\n}\n\nfunction SkillsList({\n skills, selected, onSelect, loading,\n}: { skills: AgimSkillMeta[]; selected: string | null; onSelect: (n: string) => void; loading: boolean }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const [query, setQuery] = useState('')\n const [openBuckets, setOpenBuckets] = useState<Set<number>>(\n () => new Set(BUCKET_DEF.filter((d) => d.defaultOpen).map((d) => d.bucket)),\n )\n\n // Group skills by bucket. Each bucket sorted alphabetically.\n const grouped = useMemo(() => {\n const m = new Map<number, AgimSkillMeta[]>()\n for (const s of skills) {\n const b = bucketOf(s)\n const arr = m.get(b) ?? []\n arr.push(s)\n m.set(b, arr)\n }\n for (const arr of m.values()) arr.sort((a, b) => a.name.localeCompare(b.name))\n return m\n }, [skills])\n\n // Active search => filter + flatten. Bucket headers still show with\n // their per-bucket match count; matching groups auto-expand.\n const q = query.trim().toLowerCase()\n const filteredGrouped = useMemo(() => {\n if (!q) return grouped\n const m = new Map<number, AgimSkillMeta[]>()\n for (const [b, arr] of grouped) {\n const hits = arr.filter((s) =>\n s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q),\n )\n if (hits.length > 0) m.set(b, hits)\n }\n return m\n }, [q, grouped])\n\n function toggleBucket(b: number): void {\n setOpenBuckets((prev) => {\n const next = new Set(prev)\n if (next.has(b)) next.delete(b)\n else next.add(b)\n return next\n })\n }\n\n if (loading) return <div className=\"h-48 rounded-md bg-surface-2 animate-pulse\" />\n if (skills.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-4 text-sm text-text-dim\">\n {t('agimSkills.emptyList')}\n </section>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {/* Search box */}\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-text-dim\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={t('agimSkills.searchPlaceholder', { defaultValue: 'Filter skills...' })}\n className=\"pl-7 text-xs h-8\"\n aria-label={t('agimSkills.searchPlaceholder', { defaultValue: 'Filter skills' })}\n />\n </div>\n\n {/* Bucket groups */}\n <nav className=\"rounded-md border border-border bg-surface\">\n {BUCKET_DEF.map(({ bucket, i18nKey }) => {\n const items = filteredGrouped.get(bucket) ?? []\n if (items.length === 0) return null\n // When searching, force-open buckets that have matches.\n const open = q ? true : openBuckets.has(bucket)\n return (\n <section key={bucket} className=\"border-b border-border last:border-b-0\">\n <button\n type=\"button\"\n onClick={() => toggleBucket(bucket)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-medium hover:bg-surface-2\"\n aria-expanded={open}\n >\n {open\n ? <ChevronDown className=\"h-3.5 w-3.5 shrink-0 text-text-dim\" />\n : <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-text-dim\" />}\n <span className=\"grow truncate\">{t(i18nKey)}</span>\n <Badge variant=\"outline\">{items.length}</Badge>\n </button>\n {open && (\n <ul className=\"divide-y divide-border border-t border-border bg-surface-2/40\">\n {items.map((s) => {\n const isSelected = selected === s.name\n const flag = !s.available\n ? <Badge variant=\"outline\" title={s.unavailableReason}>{t('agimSkills.unavailable')}</Badge>\n : s.always\n ? <Badge variant=\"success\">{t('agimSkills.alwaysOn')}</Badge>\n : null\n const src = s.source === 'workspace'\n ? <Badge variant=\"info\">{t('agimSkills.sourceWs')}</Badge>\n : <Badge variant=\"outline\">{t('agimSkills.sourceBuiltin')}</Badge>\n return (\n <li key={s.name}>\n <button\n type=\"button\"\n onClick={() => onSelect(s.name)}\n className={\n 'flex w-full flex-col items-start gap-1 px-3 py-2 text-left text-xs transition hover:bg-surface-2 '\n + (isSelected ? 'bg-surface-2 font-semibold' : '')\n }\n >\n <span className=\"flex w-full items-center gap-2 font-mono text-[12px]\">\n <span className=\"grow truncate\">{s.name}</span>\n {src}\n {flag}\n </span>\n <span className=\"line-clamp-2 text-[11px] text-text-dim\">{s.description}</span>\n </button>\n </li>\n )\n })}\n </ul>\n )}\n </section>\n )\n })}\n {q && filteredGrouped.size === 0 && (\n <div className=\"px-3 py-4 text-xs text-text-dim\">\n {t('agimSkills.searchEmpty', { defaultValue: 'No matches.' })}\n </div>\n )}\n </nav>\n </div>\n )\n}\n\n/* ─────────────── Editor pane ─────────────── */\n\nfunction SkillEditor({\n name, maxBody, onDeleted,\n}: { name: string; maxBody: number; onDeleted: () => void }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const detail = useAgimSkill(name)\n const update = useAgimSkillUpdate()\n const remove = useAgimSkillDelete()\n\n const [draft, setDraft] = useState('')\n const [syncedFor, setSyncedFor] = useState<string>('')\n\n useEffect(() => {\n if (detail.data && syncedFor !== name) {\n setDraft(detail.data.body)\n setSyncedFor(name)\n }\n }, [detail.data, name, syncedFor])\n\n const meta = detail.data?.meta\n const isBuiltin = meta?.source === 'builtin'\n const initial = detail.data?.body ?? ''\n const isDirty = useMemo(() => draft !== initial, [draft, initial])\n\n async function onSave(): Promise<void> {\n try {\n await update.mutateAsync({ name, body: draft })\n toast.success(t('agimSkills.savedToast', { name }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onDelete(): Promise<void> {\n if (isBuiltin) return\n if (!confirm(t('agimSkills.deleteConfirm', { name }))) return\n try {\n await remove.mutateAsync(name)\n toast.success(t('agimSkills.deletedToast', { name }))\n onDeleted()\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n if (detail.isLoading) return <section className=\"h-72 rounded-md bg-surface-2 animate-pulse\" />\n if (!meta) return <section className=\"rounded-md border border-border bg-surface p-4 text-sm text-danger\">{t('agimSkills.notFound')}</section>\n\n return (\n <section className=\"flex flex-col gap-2\">\n <header className=\"flex flex-wrap items-center gap-2 rounded-md border border-border bg-surface px-3 py-2\">\n <span className=\"font-mono text-sm font-semibold\">{meta.name}</span>\n {meta.source === 'workspace'\n ? <Badge variant=\"info\">{t('agimSkills.sourceWorkspace')}</Badge>\n : <Badge variant=\"outline\">{t('agimSkills.sourceBuiltinReadonly')}</Badge>}\n {meta.always && <Badge variant=\"success\">{t('agimSkills.alwaysOn')}</Badge>}\n {!meta.available && <Badge variant=\"outline\" title={meta.unavailableReason}>{t('agimSkills.unavailable')}</Badge>}\n <span className=\"ml-auto text-[11px] text-text-dim\">{draft.length} / {maxBody}</span>\n </header>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n disabled={isBuiltin && !isDirty}\n spellCheck={false}\n className=\"min-h-[500px] w-full rounded-md border border-border bg-surface p-3 font-mono text-xs leading-relaxed focus:border-accent focus:outline-none\"\n />\n <div className=\"text-[11px] text-text-dim\">\n {t('agimSkills.pathLabel')} <code>{meta.dir}</code> ·\n {t('agimSkills.binsLabel')} <code>{meta.requiresBins.join(', ') || t('agimSkills.none')}</code> ·\n {t('agimSkills.envLabel')} <code>{meta.requiresEnv.join(', ') || t('agimSkills.none')}</code>\n </div>\n <div className=\"flex items-center gap-2\">\n {isBuiltin && (\n <span className=\"text-[11px] text-text-dim\">\n {t('agimSkills.builtinShadowHint')}\n </span>\n )}\n <span className=\"ml-auto\" />\n {!isBuiltin && (\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onDelete()}\n disabled={remove.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('agimSkills.delete')}\n </Button>\n )}\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={update.isPending || !isDirty}\n >\n {update.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {isBuiltin ? t('agimSkills.saveShadow') : t('agimSkills.save')}\n </Button>\n </div>\n </section>\n )\n}\n\n/* ─────────────── New skill ─────────────── */\n\nfunction NewSkillButton({ onCreate }: { onCreate: (name: string) => void }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const create = useAgimSkillCreate()\n const [open, setOpen] = useState(false)\n const [name, setName] = useState('')\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const trimmed = name.trim()\n if (!trimmed) { toast.error(t('agimSkills.nameRequired')); return }\n if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {\n toast.error(t('agimSkills.invalidNameChars')); return\n }\n const body = STARTER_TEMPLATE.replace('name: my-skill', `name: ${trimmed}`)\n try {\n const r = await create.mutateAsync({ name: trimmed, body })\n toast.success(t('agimSkills.createdToast', { name: r.meta.name }))\n setOpen(false)\n setName('')\n onCreate(r.meta.name)\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n if (!open) {\n return (\n <Button size=\"sm\" onClick={() => setOpen(true)}>\n <FilePlus2 className=\"h-4 w-4\" /> {t('agimSkills.new')}\n </Button>\n )\n }\n\n return (\n <form onSubmit={(e) => void onSubmit(e)} className=\"flex items-center gap-1\">\n <Label className=\"sr-only\">{t('agimSkills.newName')}</Label>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('agimSkills.newNamePlaceholder')}\n className=\"h-8 w-44 font-mono text-xs\"\n />\n <Button type=\"submit\" size=\"sm\" disabled={create.isPending}>\n {create.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : t('agimSkills.newCreate')}\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => { setOpen(false); setName('') }}>\n {t('actions.cancel', { ns: 'common' })}\n </Button>\n </form>\n )\n}\n"],"names":["BookOpen","createLucideIcon","FilePlus2","STARTER_TEMPLATE","SettingsAgimSkillsRoute","t","useTranslation","listQuery","useAgimSkillsList","refresh","useAgimSkillsRefresh","selected","setSelected","useState","useEffect","skills","maxBody","onRefresh","r","toast","err","jsxs","jsx","Badge","Button","Loader2","RefreshCcw","NewSkillButton","n","SkillsList","SkillEditor","BUCKET_DEF","bucketOf","onSelect","loading","query","setQuery","openBuckets","setOpenBuckets","d","grouped","useMemo","m","s","b","arr","a","q","filteredGrouped","hits","toggleBucket","prev","next","Search","Input","e","bucket","i18nKey","items","open","ChevronDown","ChevronRight","isSelected","flag","src","name","onDeleted","detail","useAgimSkill","update","useAgimSkillUpdate","remove","useAgimSkillDelete","draft","setDraft","syncedFor","setSyncedFor","meta","isBuiltin","initial","isDirty","onSave","onDelete","Trash2","Save","onCreate","create","useAgimSkillCreate","setOpen","setName","onSubmit","trimmed","body","Label"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"installed-C3GsWhFt.js","sources":["../../node_modules/lucide-react/dist/esm/icons/book-open.js","../../node_modules/lucide-react/dist/esm/icons/file-plus-2.js","../../src/routes/settings/agim-skills/installed.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst BookOpen = createLucideIcon(\"BookOpen\", [\n [\"path\", { d: \"M12 7v14\", key: \"1akyts\" }],\n [\n \"path\",\n {\n d: \"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n key: \"ruj8y\"\n }\n ]\n]);\n\nexport { BookOpen as default };\n//# sourceMappingURL=book-open.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FilePlus2 = createLucideIcon(\"FilePlus2\", [\n [\"path\", { d: \"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4\", key: \"1pf5j1\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M3 15h6\", key: \"4e2qda\" }],\n [\"path\", { d: \"M6 12v6\", key: \"1u72j0\" }]\n]);\n\nexport { FilePlus2 as default };\n//# sourceMappingURL=file-plus-2.js.map\n","/**\n * /settings/agim-skills — manage the agim SKILL.md library\n * (P1 follow-up).\n *\n * Two-pane layout:\n * · Left: skill list (source + availability + always-on tags;\n * click to load body into the editor).\n * · Right: SKILL.md editor (textarea) + Save + Delete (workspace\n * skills only) + Create New + Refresh from disk.\n *\n * Builtin skills are read-only here — to override one, just create\n * a workspace skill with the same name; the loader shadows builtins\n * by name (see core/skills/loader.ts § discovery + shadowing).\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n BookOpen, ChevronDown, ChevronRight, FilePlus2, Loader2, RefreshCcw, Save, Search, Trash2,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n useAgimSkillsList, useAgimSkill,\n useAgimSkillCreate, useAgimSkillUpdate, useAgimSkillDelete,\n useAgimSkillsRefresh,\n type AgimSkillMeta,\n} from '@/hooks/use-agim-skills'\n\nconst STARTER_TEMPLATE = `---\nname: my-skill\ndescription: One-line summary the LLM uses to decide whether to load this skill.\nalways: false\n---\n\n# My Skill\n\nWrite the body the agent should read when this skill applies.\n\n## When to use this skill\n\n- bullet 1\n- bullet 2\n\n## Steps\n\n1. step one\n2. step two\n`\n\nexport default function SettingsAgimSkillsRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useAgimSkillsList()\n const refresh = useAgimSkillsRefresh()\n const [selected, setSelected] = useState<string | null>(null)\n\n // Pre-select the first skill once the list arrives.\n useEffect(() => {\n if (!selected && listQuery.data?.skills.length) {\n setSelected(listQuery.data.skills[0]?.name ?? null)\n }\n }, [selected, listQuery.data])\n\n const skills = listQuery.data?.skills ?? []\n const maxBody = listQuery.data?.maxBodyChars ?? 32_000\n\n async function onRefresh(): Promise<void> {\n try {\n const r = await refresh.mutateAsync()\n toast.success(t('agimSkills.reloadedToast', { count: r.count }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4\">\n <header className=\"flex items-center gap-3\">\n <BookOpen className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('agimSkills.title')}</h1>\n <Badge variant=\"info\">{skills.length}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void onRefresh()}\n disabled={refresh.isPending}\n >\n {refresh.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('agimSkills.reload')}</span>\n </Button>\n <NewSkillButton onCreate={(n) => setSelected(n)} />\n </header>\n <p className=\"text-sm text-text-dim\">{t('agimSkills.subtitle')}</p>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-[280px,1fr]\">\n <SkillsList\n skills={skills}\n selected={selected}\n onSelect={setSelected}\n loading={listQuery.isLoading}\n />\n {selected ? (\n <SkillEditor\n key={selected}\n name={selected}\n maxBody={maxBody}\n onDeleted={() => setSelected(null)}\n />\n ) : (\n <section className=\"flex items-center justify-center rounded-md border border-border bg-surface p-12 text-sm text-text-dim\">\n {t('agimSkills.selectHint')}\n </section>\n )}\n </div>\n </div>\n )\n}\n\n/* ─────────────── List pane ─────────────── */\n\n// v1.2.152 — bucket grouping for the installed list. Maps loader's\n// `rankSkillBucket` (0–4) to a stable display order + i18n key. Default\n// expanded vs collapsed: small curated buckets (framework / builtin /\n// ECC picks) expand on first render; the two large reservoirs (workspace\n// + ECC remainder) collapse so the page renders without throwing 300+\n// rows into the DOM tree on mount.\nconst BUCKET_DEF: ReadonlyArray<{ bucket: 0 | 1 | 2 | 3 | 4; i18nKey: string; defaultOpen: boolean }> = [\n { bucket: 0, i18nKey: 'agimSkills.group.framework', defaultOpen: true },\n { bucket: 1, i18nKey: 'agimSkills.group.builtin', defaultOpen: true },\n { bucket: 3, i18nKey: 'agimSkills.group.workspace', defaultOpen: false },\n { bucket: 2, i18nKey: 'agimSkills.group.eccPicks', defaultOpen: true },\n { bucket: 4, i18nKey: 'agimSkills.group.eccRemainder', defaultOpen: false },\n]\n\nfunction bucketOf(s: AgimSkillMeta): 0 | 1 | 2 | 3 | 4 {\n // Server tells us via the `bucket` field (v1.2.152+); fall back to a\n // best-effort client-side derivation for older agim servers.\n if (typeof s.bucket === 'number') return s.bucket\n if (s.name.startsWith('agim-')) return 0\n const isEcc = s.source === 'builtin' && s.description.startsWith('[ECC] ')\n if (isEcc) return 4\n if (s.source === 'workspace') return 3\n return 1\n}\n\nfunction SkillsList({\n skills, selected, onSelect, loading,\n}: { skills: AgimSkillMeta[]; selected: string | null; onSelect: (n: string) => void; loading: boolean }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const [query, setQuery] = useState('')\n const [openBuckets, setOpenBuckets] = useState<Set<number>>(\n () => new Set(BUCKET_DEF.filter((d) => d.defaultOpen).map((d) => d.bucket)),\n )\n\n // Group skills by bucket. Each bucket sorted alphabetically.\n const grouped = useMemo(() => {\n const m = new Map<number, AgimSkillMeta[]>()\n for (const s of skills) {\n const b = bucketOf(s)\n const arr = m.get(b) ?? []\n arr.push(s)\n m.set(b, arr)\n }\n for (const arr of m.values()) arr.sort((a, b) => a.name.localeCompare(b.name))\n return m\n }, [skills])\n\n // Active search => filter + flatten. Bucket headers still show with\n // their per-bucket match count; matching groups auto-expand.\n const q = query.trim().toLowerCase()\n const filteredGrouped = useMemo(() => {\n if (!q) return grouped\n const m = new Map<number, AgimSkillMeta[]>()\n for (const [b, arr] of grouped) {\n const hits = arr.filter((s) =>\n s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q),\n )\n if (hits.length > 0) m.set(b, hits)\n }\n return m\n }, [q, grouped])\n\n function toggleBucket(b: number): void {\n setOpenBuckets((prev) => {\n const next = new Set(prev)\n if (next.has(b)) next.delete(b)\n else next.add(b)\n return next\n })\n }\n\n if (loading) return <div className=\"h-48 rounded-md bg-surface-2 animate-pulse\" />\n if (skills.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-4 text-sm text-text-dim\">\n {t('agimSkills.emptyList')}\n </section>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {/* Search box */}\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-text-dim\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={t('agimSkills.searchPlaceholder', { defaultValue: 'Filter skills...' })}\n className=\"pl-7 text-xs h-8\"\n aria-label={t('agimSkills.searchPlaceholder', { defaultValue: 'Filter skills' })}\n />\n </div>\n\n {/* Bucket groups */}\n <nav className=\"rounded-md border border-border bg-surface\">\n {BUCKET_DEF.map(({ bucket, i18nKey }) => {\n const items = filteredGrouped.get(bucket) ?? []\n if (items.length === 0) return null\n // When searching, force-open buckets that have matches.\n const open = q ? true : openBuckets.has(bucket)\n return (\n <section key={bucket} className=\"border-b border-border last:border-b-0\">\n <button\n type=\"button\"\n onClick={() => toggleBucket(bucket)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-medium hover:bg-surface-2\"\n aria-expanded={open}\n >\n {open\n ? <ChevronDown className=\"h-3.5 w-3.5 shrink-0 text-text-dim\" />\n : <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-text-dim\" />}\n <span className=\"grow truncate\">{t(i18nKey)}</span>\n <Badge variant=\"outline\">{items.length}</Badge>\n </button>\n {open && (\n <ul className=\"divide-y divide-border border-t border-border bg-surface-2/40\">\n {items.map((s) => {\n const isSelected = selected === s.name\n const flag = !s.available\n ? <Badge variant=\"outline\" title={s.unavailableReason}>{t('agimSkills.unavailable')}</Badge>\n : s.always\n ? <Badge variant=\"success\">{t('agimSkills.alwaysOn')}</Badge>\n : null\n const src = s.source === 'workspace'\n ? <Badge variant=\"info\">{t('agimSkills.sourceWs')}</Badge>\n : <Badge variant=\"outline\">{t('agimSkills.sourceBuiltin')}</Badge>\n return (\n <li key={s.name}>\n <button\n type=\"button\"\n onClick={() => onSelect(s.name)}\n className={\n 'flex w-full flex-col items-start gap-1 px-3 py-2 text-left text-xs transition hover:bg-surface-2 '\n + (isSelected ? 'bg-surface-2 font-semibold' : '')\n }\n >\n <span className=\"flex w-full items-center gap-2 font-mono text-[12px]\">\n <span className=\"grow truncate\">{s.name}</span>\n {src}\n {flag}\n </span>\n <span className=\"line-clamp-2 text-[11px] text-text-dim\">{s.description}</span>\n </button>\n </li>\n )\n })}\n </ul>\n )}\n </section>\n )\n })}\n {q && filteredGrouped.size === 0 && (\n <div className=\"px-3 py-4 text-xs text-text-dim\">\n {t('agimSkills.searchEmpty', { defaultValue: 'No matches.' })}\n </div>\n )}\n </nav>\n </div>\n )\n}\n\n/* ─────────────── Editor pane ─────────────── */\n\nfunction SkillEditor({\n name, maxBody, onDeleted,\n}: { name: string; maxBody: number; onDeleted: () => void }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const detail = useAgimSkill(name)\n const update = useAgimSkillUpdate()\n const remove = useAgimSkillDelete()\n\n const [draft, setDraft] = useState('')\n const [syncedFor, setSyncedFor] = useState<string>('')\n\n useEffect(() => {\n if (detail.data && syncedFor !== name) {\n setDraft(detail.data.body)\n setSyncedFor(name)\n }\n }, [detail.data, name, syncedFor])\n\n const meta = detail.data?.meta\n const isBuiltin = meta?.source === 'builtin'\n const initial = detail.data?.body ?? ''\n const isDirty = useMemo(() => draft !== initial, [draft, initial])\n\n async function onSave(): Promise<void> {\n try {\n await update.mutateAsync({ name, body: draft })\n toast.success(t('agimSkills.savedToast', { name }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onDelete(): Promise<void> {\n if (isBuiltin) return\n if (!confirm(t('agimSkills.deleteConfirm', { name }))) return\n try {\n await remove.mutateAsync(name)\n toast.success(t('agimSkills.deletedToast', { name }))\n onDeleted()\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n if (detail.isLoading) return <section className=\"h-72 rounded-md bg-surface-2 animate-pulse\" />\n if (!meta) return <section className=\"rounded-md border border-border bg-surface p-4 text-sm text-danger\">{t('agimSkills.notFound')}</section>\n\n return (\n <section className=\"flex flex-col gap-2\">\n <header className=\"flex flex-wrap items-center gap-2 rounded-md border border-border bg-surface px-3 py-2\">\n <span className=\"font-mono text-sm font-semibold\">{meta.name}</span>\n {meta.source === 'workspace'\n ? <Badge variant=\"info\">{t('agimSkills.sourceWorkspace')}</Badge>\n : <Badge variant=\"outline\">{t('agimSkills.sourceBuiltinReadonly')}</Badge>}\n {meta.always && <Badge variant=\"success\">{t('agimSkills.alwaysOn')}</Badge>}\n {!meta.available && <Badge variant=\"outline\" title={meta.unavailableReason}>{t('agimSkills.unavailable')}</Badge>}\n <span className=\"ml-auto text-[11px] text-text-dim\">{draft.length} / {maxBody}</span>\n </header>\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n disabled={isBuiltin && !isDirty}\n spellCheck={false}\n className=\"min-h-[500px] w-full rounded-md border border-border bg-surface p-3 font-mono text-xs leading-relaxed focus:border-accent focus:outline-none\"\n />\n <div className=\"text-[11px] text-text-dim\">\n {t('agimSkills.pathLabel')} <code>{meta.dir}</code> ·\n {t('agimSkills.binsLabel')} <code>{meta.requiresBins.join(', ') || t('agimSkills.none')}</code> ·\n {t('agimSkills.envLabel')} <code>{meta.requiresEnv.join(', ') || t('agimSkills.none')}</code>\n </div>\n <div className=\"flex items-center gap-2\">\n {isBuiltin && (\n <span className=\"text-[11px] text-text-dim\">\n {t('agimSkills.builtinShadowHint')}\n </span>\n )}\n <span className=\"ml-auto\" />\n {!isBuiltin && (\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onDelete()}\n disabled={remove.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('agimSkills.delete')}\n </Button>\n )}\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={update.isPending || !isDirty}\n >\n {update.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {isBuiltin ? t('agimSkills.saveShadow') : t('agimSkills.save')}\n </Button>\n </div>\n </section>\n )\n}\n\n/* ─────────────── New skill ─────────────── */\n\nfunction NewSkillButton({ onCreate }: { onCreate: (name: string) => void }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const create = useAgimSkillCreate()\n const [open, setOpen] = useState(false)\n const [name, setName] = useState('')\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const trimmed = name.trim()\n if (!trimmed) { toast.error(t('agimSkills.nameRequired')); return }\n if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {\n toast.error(t('agimSkills.invalidNameChars')); return\n }\n const body = STARTER_TEMPLATE.replace('name: my-skill', `name: ${trimmed}`)\n try {\n const r = await create.mutateAsync({ name: trimmed, body })\n toast.success(t('agimSkills.createdToast', { name: r.meta.name }))\n setOpen(false)\n setName('')\n onCreate(r.meta.name)\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n if (!open) {\n return (\n <Button size=\"sm\" onClick={() => setOpen(true)}>\n <FilePlus2 className=\"h-4 w-4\" /> {t('agimSkills.new')}\n </Button>\n )\n }\n\n return (\n <form onSubmit={(e) => void onSubmit(e)} className=\"flex items-center gap-1\">\n <Label className=\"sr-only\">{t('agimSkills.newName')}</Label>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('agimSkills.newNamePlaceholder')}\n className=\"h-8 w-44 font-mono text-xs\"\n />\n <Button type=\"submit\" size=\"sm\" disabled={create.isPending}>\n {create.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : t('agimSkills.newCreate')}\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => { setOpen(false); setName('') }}>\n {t('actions.cancel', { ns: 'common' })}\n </Button>\n </form>\n )\n}\n"],"names":["BookOpen","createLucideIcon","FilePlus2","STARTER_TEMPLATE","SettingsAgimSkillsRoute","t","useTranslation","listQuery","useAgimSkillsList","refresh","useAgimSkillsRefresh","selected","setSelected","useState","useEffect","skills","maxBody","onRefresh","r","toast","err","jsxs","jsx","Badge","Button","Loader2","RefreshCcw","NewSkillButton","n","SkillsList","SkillEditor","BUCKET_DEF","bucketOf","onSelect","loading","query","setQuery","openBuckets","setOpenBuckets","d","grouped","useMemo","m","s","b","arr","a","q","filteredGrouped","hits","toggleBucket","prev","next","Search","Input","e","bucket","i18nKey","items","open","ChevronDown","ChevronRight","isSelected","flag","src","name","onDeleted","detail","useAgimSkill","update","useAgimSkillUpdate","remove","useAgimSkillDelete","draft","setDraft","syncedFor","setSyncedFor","meta","isBuiltin","initial","isDirty","onSave","onDelete","Trash2","Save","onCreate","create","useAgimSkillCreate","setOpen","setName","onSubmit","trimmed","body","Label"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,2 +1,2 @@
1
- import{a as D,b as q,d as M,e as I,u as V,f as K,j as t,c as A,B as P,S as Q,g as U,h as z,i as G,k as T,l as X,m as O,n as Y}from"./index-DvWldAJY.js";import{r as u}from"./react-DlP5eolq.js";import{D as H}from"./data-table-BYJ2qMyY.js";import{E as W}from"./empty-state-De5ls0uC.js";import{S as Z}from"./status-badge-W8PRNBT2.js";import{P as ee}from"./pagination-bzSoQOAd.js";import{C as te}from"./confirm-dialog-C2melodU.js";import{u as se}from"./use-event-stream-I1lMFEfh.js";import{L as ae}from"./loader-circle-CZQXsfz7.js";import{R as ne}from"./refresh-ccw-CW2loqyz.js";import{C as ie}from"./circle-x-DYcD4BUu.js";import{B as oe}from"./briefcase-iKF60CJd.js";import"./table-B695Fh_p.js";import"./arrow-up-DZLw3qr1.js";import"./arrow-down-Bhl7hNwa.js";import"./chevron-left-sZyMkeG-.js";import"./chevron-right-CPHPRLSX.js";const N={all:["jobs"],list:e=>["jobs","list",e]};function re(e){return q({queryKey:N.list(e),queryFn:()=>M.listJobs(e)})}function le(){const e=D();return()=>e.invalidateQueries({queryKey:N.all})}function ce(){const e=D();return I({mutationFn:a=>M.batchCancelJobs(a),onSuccess:()=>e.invalidateQueries({queryKey:N.all})})}const de=[10,20,50,100],E=20,me=["pending","running","completed","delivered","failed","cancelled","interrupted","replaced","abandoned"],ue={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function Ae(){const{t:e}=V(["tasks","common"]),[a,i]=K(),d=le(),r=Math.max(1,Number(a.get("page"))||1),l=Number(a.get("per_page"))||E,m=a.get("status")??null,L=u.useMemo(()=>({limit:l,offset:(r-1)*l,...m?{status:m}:{}}),[r,l,m]),{data:S,isLoading:R,isFetching:C,refetch:$}=re(L),h=S?.jobs??[],n=S?.stats,v=se({job:()=>d()}),[p,w]=u.useState(new Set),[B,y]=u.useState(!1),_=ce();async function F(){const s=Array.from(p).map(Number).filter(Number.isFinite);if(s.length!==0)try{await _.mutateAsync({ids:s}),w(new Set),O.success(e("states.saved",{ns:"common"}))}catch(o){const{message:c}=Y(o,e);throw O.error(c),o}}function f(s){const o=new URLSearchParams(a);for(const[c,j]of Object.entries(s))j==null||j===""?o.delete(c):o.set(c,j);Object.keys(s).some(c=>c!=="page")&&o.delete("page"),i(o,{replace:!1})}const g=n?n.pending+n.running+n.completed+n.failed+(n.delivered??0):void 0,k=g?Math.max(1,Math.ceil(g/l)):h.length===l?r+1:r,J=u.useMemo(()=>[{id:"id",header:e("jobs.col.id"),cell:s=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",s.id]}),headClassName:"w-16",hideOnMobile:!1},{id:"agent",header:e("jobs.col.agent"),cell:s=>t.jsx("span",{className:"font-medium",children:s.agent}),headClassName:"w-32"},{id:"prompt",header:e("jobs.col.prompt"),cell:s=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:s.prompt}),asCardTitle:!0},{id:"status",header:e("jobs.col.status"),cell:s=>t.jsx(Z,{status:s.status,children:e(`jobs.status.${s.status}`,{defaultValue:s.status})}),headClassName:"w-32"},{id:"createdAt",header:e("jobs.col.createdAt"),cell:s=>t.jsx("span",{className:"text-text-dim",children:he(s.created_at)}),headClassName:"w-40",hideOnMobile:!0},{id:"duration",header:e("jobs.col.duration"),cell:s=>t.jsx("span",{className:"tabular-nums text-text-dim",children:pe(s.duration_ms)}),headClassName:"w-24",hideOnMobile:!0},{id:"cost",header:e("jobs.col.cost"),cell:s=>t.jsx("span",{className:"tabular-nums text-text-dim",children:s.cost!=null?`$${s.cost.toFixed(4)}`:"—"}),headClassName:"w-24",hideOnMobile:!0}],[e]),b=p.size;return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("jobs.title")}),t.jsx("span",{className:A("text-xs font-medium tabular-nums",ue[v]),children:e(`jobs.live.${v}`)}),t.jsxs(P,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>$(),disabled:C,"aria-label":e("actions.refresh",{ns:"common"}),children:[C?t.jsx(ae,{className:"h-4 w-4 animate-spin"}):t.jsx(ne,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("jobs.subtitle")})]}),n&&t.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[t.jsx(x,{label:e("jobs.stats.pending"),value:n.pending,tone:"info"}),t.jsx(x,{label:e("jobs.stats.running"),value:n.running,tone:"warning"}),t.jsx(x,{label:e("jobs.stats.completed"),value:n.completed,tone:"success"}),t.jsx(x,{label:e("jobs.stats.failed"),value:n.failed,tone:"danger"})]}),t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("label",{className:"text-sm text-text-dim",htmlFor:"status-filter",children:e("jobs.filter.status")}),t.jsxs(Q,{value:m??"__any__",onValueChange:s=>f({status:s==="__any__"?null:s}),children:[t.jsx(U,{id:"status-filter",className:"w-[160px]",children:t.jsx(z,{})}),t.jsxs(G,{children:[t.jsx(T,{value:"__any__",children:e("jobs.filter.statusAny")}),me.map(s=>t.jsx(T,{value:s,children:e(`jobs.status.${s}`,{defaultValue:s})},s))]})]})]}),b>0&&t.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[t.jsx(X,{variant:"secondary",children:e("jobs.batch.selected",{count:b})}),t.jsxs(P,{variant:"destructive",size:"sm",onClick:()=>y(!0),disabled:_.isPending,children:[t.jsx(ie,{className:"h-4 w-4"}),e("jobs.batch.cancel")]})]})]}),t.jsx(H,{columns:J,rows:h,getRowId:s=>String(s.id),loading:R,selection:p,onSelectionChange:w,emptyState:t.jsx(W,{icon:t.jsx(oe,{}),title:e("jobs.empty.title"),description:e("jobs.empty.description")})}),(h.length>0||r>1)&&t.jsx(ee,{page:r,totalPages:k,totalRows:g,perPage:l,perPageOptions:de,onPageChange:s=>f({page:s===1?null:String(s)}),onPerPageChange:s=>f({per_page:s===E?null:String(s)})}),t.jsx(te,{open:B,onOpenChange:y,title:e("jobs.batch.confirmCancel",{count:b}),description:e("jobs.batch.confirmCancelDesc"),intent:"danger",confirmLabel:e("jobs.batch.cancel"),onConfirm:F})]})}const xe={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function x({label:e,value:a,tone:i}){return t.jsxs("div",{className:A("rounded-md border bg-surface px-3 py-2",xe[i]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:a})]})}function he(e){try{const a=new Date(e);if(Number.isNaN(a.getTime()))return e;const i=new Date;return a.toDateString()===i.toDateString()?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function pe(e){if(e==null)return"—";if(e<1e3)return`${e}ms`;const a=e/1e3;if(a<60)return`${a.toFixed(1)}s`;const i=Math.floor(a/60),d=Math.round(a-i*60);return`${i}m${d}s`}export{Ae as default};
2
- //# sourceMappingURL=jobs-cQ7V-7ec.js.map
1
+ import{a as D,b as q,d as M,e as I,u as V,f as K,j as t,c as A,B as P,S as Q,g as U,h as z,i as G,k as T,l as X,m as O,n as Y}from"./index-BiXaJRfQ.js";import{r as u}from"./react-DlP5eolq.js";import{D as H}from"./data-table-yUuGHUSG.js";import{E as W}from"./empty-state-B0sJBvsG.js";import{S as Z}from"./status-badge-CvmA1Y93.js";import{P as ee}from"./pagination-DU9Lf0rD.js";import{C as te}from"./confirm-dialog-D4JCDxHT.js";import{u as se}from"./use-event-stream-I1lMFEfh.js";import{L as ae}from"./loader-circle-D_dW2RUZ.js";import{R as ne}from"./refresh-ccw-DBNikooZ.js";import{C as ie}from"./circle-x-CrmHcrAS.js";import{B as oe}from"./briefcase-BehkRQvT.js";import"./table-z7CVpKMe.js";import"./arrow-up-CMHA89ux.js";import"./arrow-down-DfVXLyJ6.js";import"./chevron-left-DHpm5XR1.js";import"./chevron-right-BIKADdPm.js";const N={all:["jobs"],list:e=>["jobs","list",e]};function re(e){return q({queryKey:N.list(e),queryFn:()=>M.listJobs(e)})}function le(){const e=D();return()=>e.invalidateQueries({queryKey:N.all})}function ce(){const e=D();return I({mutationFn:a=>M.batchCancelJobs(a),onSuccess:()=>e.invalidateQueries({queryKey:N.all})})}const de=[10,20,50,100],E=20,me=["pending","running","completed","delivered","failed","cancelled","interrupted","replaced","abandoned"],ue={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function Ae(){const{t:e}=V(["tasks","common"]),[a,i]=K(),d=le(),r=Math.max(1,Number(a.get("page"))||1),l=Number(a.get("per_page"))||E,m=a.get("status")??null,L=u.useMemo(()=>({limit:l,offset:(r-1)*l,...m?{status:m}:{}}),[r,l,m]),{data:S,isLoading:R,isFetching:C,refetch:$}=re(L),h=S?.jobs??[],n=S?.stats,v=se({job:()=>d()}),[p,w]=u.useState(new Set),[B,y]=u.useState(!1),_=ce();async function F(){const s=Array.from(p).map(Number).filter(Number.isFinite);if(s.length!==0)try{await _.mutateAsync({ids:s}),w(new Set),O.success(e("states.saved",{ns:"common"}))}catch(o){const{message:c}=Y(o,e);throw O.error(c),o}}function f(s){const o=new URLSearchParams(a);for(const[c,j]of Object.entries(s))j==null||j===""?o.delete(c):o.set(c,j);Object.keys(s).some(c=>c!=="page")&&o.delete("page"),i(o,{replace:!1})}const g=n?n.pending+n.running+n.completed+n.failed+(n.delivered??0):void 0,k=g?Math.max(1,Math.ceil(g/l)):h.length===l?r+1:r,J=u.useMemo(()=>[{id:"id",header:e("jobs.col.id"),cell:s=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",s.id]}),headClassName:"w-16",hideOnMobile:!1},{id:"agent",header:e("jobs.col.agent"),cell:s=>t.jsx("span",{className:"font-medium",children:s.agent}),headClassName:"w-32"},{id:"prompt",header:e("jobs.col.prompt"),cell:s=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:s.prompt}),asCardTitle:!0},{id:"status",header:e("jobs.col.status"),cell:s=>t.jsx(Z,{status:s.status,children:e(`jobs.status.${s.status}`,{defaultValue:s.status})}),headClassName:"w-32"},{id:"createdAt",header:e("jobs.col.createdAt"),cell:s=>t.jsx("span",{className:"text-text-dim",children:he(s.created_at)}),headClassName:"w-40",hideOnMobile:!0},{id:"duration",header:e("jobs.col.duration"),cell:s=>t.jsx("span",{className:"tabular-nums text-text-dim",children:pe(s.duration_ms)}),headClassName:"w-24",hideOnMobile:!0},{id:"cost",header:e("jobs.col.cost"),cell:s=>t.jsx("span",{className:"tabular-nums text-text-dim",children:s.cost!=null?`$${s.cost.toFixed(4)}`:"—"}),headClassName:"w-24",hideOnMobile:!0}],[e]),b=p.size;return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("jobs.title")}),t.jsx("span",{className:A("text-xs font-medium tabular-nums",ue[v]),children:e(`jobs.live.${v}`)}),t.jsxs(P,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>$(),disabled:C,"aria-label":e("actions.refresh",{ns:"common"}),children:[C?t.jsx(ae,{className:"h-4 w-4 animate-spin"}):t.jsx(ne,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("jobs.subtitle")})]}),n&&t.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[t.jsx(x,{label:e("jobs.stats.pending"),value:n.pending,tone:"info"}),t.jsx(x,{label:e("jobs.stats.running"),value:n.running,tone:"warning"}),t.jsx(x,{label:e("jobs.stats.completed"),value:n.completed,tone:"success"}),t.jsx(x,{label:e("jobs.stats.failed"),value:n.failed,tone:"danger"})]}),t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("label",{className:"text-sm text-text-dim",htmlFor:"status-filter",children:e("jobs.filter.status")}),t.jsxs(Q,{value:m??"__any__",onValueChange:s=>f({status:s==="__any__"?null:s}),children:[t.jsx(U,{id:"status-filter",className:"w-[160px]",children:t.jsx(z,{})}),t.jsxs(G,{children:[t.jsx(T,{value:"__any__",children:e("jobs.filter.statusAny")}),me.map(s=>t.jsx(T,{value:s,children:e(`jobs.status.${s}`,{defaultValue:s})},s))]})]})]}),b>0&&t.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[t.jsx(X,{variant:"secondary",children:e("jobs.batch.selected",{count:b})}),t.jsxs(P,{variant:"destructive",size:"sm",onClick:()=>y(!0),disabled:_.isPending,children:[t.jsx(ie,{className:"h-4 w-4"}),e("jobs.batch.cancel")]})]})]}),t.jsx(H,{columns:J,rows:h,getRowId:s=>String(s.id),loading:R,selection:p,onSelectionChange:w,emptyState:t.jsx(W,{icon:t.jsx(oe,{}),title:e("jobs.empty.title"),description:e("jobs.empty.description")})}),(h.length>0||r>1)&&t.jsx(ee,{page:r,totalPages:k,totalRows:g,perPage:l,perPageOptions:de,onPageChange:s=>f({page:s===1?null:String(s)}),onPerPageChange:s=>f({per_page:s===E?null:String(s)})}),t.jsx(te,{open:B,onOpenChange:y,title:e("jobs.batch.confirmCancel",{count:b}),description:e("jobs.batch.confirmCancelDesc"),intent:"danger",confirmLabel:e("jobs.batch.cancel"),onConfirm:F})]})}const xe={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function x({label:e,value:a,tone:i}){return t.jsxs("div",{className:A("rounded-md border bg-surface px-3 py-2",xe[i]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:a})]})}function he(e){try{const a=new Date(e);if(Number.isNaN(a.getTime()))return e;const i=new Date;return a.toDateString()===i.toDateString()?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function pe(e){if(e==null)return"—";if(e<1e3)return`${e}ms`;const a=e/1e3;if(a<60)return`${a.toFixed(1)}s`;const i=Math.floor(a/60),d=Math.round(a-i*60);return`${i}m${d}s`}export{Ae as default};
2
+ //# sourceMappingURL=jobs-Bu20ae1w.js.map