libre-webui 0.26.0 → 0.27.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 (249) hide show
  1. package/backend/dist/index.d.ts.map +1 -1
  2. package/backend/dist/index.js +7 -0
  3. package/backend/dist/index.js.map +1 -1
  4. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts +9 -0
  5. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts.map +1 -0
  6. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js +107 -0
  7. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js.map +1 -0
  8. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
  9. package/backend/dist/persistence/postgresMigrationRegistry.js +2 -0
  10. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  11. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  12. package/backend/dist/persistence/postgresResourceRepositories.js +162 -0
  13. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  14. package/backend/dist/persistence/postgresSecurityRepositories.d.ts.map +1 -1
  15. package/backend/dist/persistence/postgresSecurityRepositories.js +150 -0
  16. package/backend/dist/persistence/postgresSecurityRepositories.js.map +1 -1
  17. package/backend/dist/persistence/resourceTypes.d.ts +59 -0
  18. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  19. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  20. package/backend/dist/persistence/securityTypes.d.ts +59 -0
  21. package/backend/dist/persistence/securityTypes.d.ts.map +1 -1
  22. package/backend/dist/persistence/sqliteMigrations.d.ts +1 -0
  23. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  24. package/backend/dist/persistence/sqliteMigrations.js +194 -0
  25. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  26. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  27. package/backend/dist/persistence/sqliteResourceRepositories.js +134 -0
  28. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  29. package/backend/dist/persistence/sqliteSecurityRepositories.d.ts.map +1 -1
  30. package/backend/dist/persistence/sqliteSecurityRepositories.js +134 -0
  31. package/backend/dist/persistence/sqliteSecurityRepositories.js.map +1 -1
  32. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  33. package/backend/dist/persistence/sqliteToPostgresMigration.js +45 -0
  34. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  35. package/backend/dist/platform/jobs/domainJobContracts.d.ts +2 -0
  36. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
  37. package/backend/dist/platform/jobs/domainJobContracts.js +2 -0
  38. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
  39. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
  40. package/backend/dist/platform/jobs/domainJobHandlers.js +65 -2
  41. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
  42. package/backend/dist/routes/auth.d.ts.map +1 -1
  43. package/backend/dist/routes/auth.js +419 -1
  44. package/backend/dist/routes/auth.js.map +1 -1
  45. package/backend/dist/routes/documents.d.ts.map +1 -1
  46. package/backend/dist/routes/documents.js +4 -0
  47. package/backend/dist/routes/documents.js.map +1 -1
  48. package/backend/dist/routes/push.d.ts +3 -0
  49. package/backend/dist/routes/push.d.ts.map +1 -0
  50. package/backend/dist/routes/push.js +105 -0
  51. package/backend/dist/routes/push.js.map +1 -0
  52. package/backend/dist/routes/recovery.d.ts +3 -0
  53. package/backend/dist/routes/recovery.d.ts.map +1 -0
  54. package/backend/dist/routes/recovery.js +83 -0
  55. package/backend/dist/routes/recovery.js.map +1 -0
  56. package/backend/dist/routes/users.d.ts.map +1 -1
  57. package/backend/dist/routes/users.js +35 -0
  58. package/backend/dist/routes/users.js.map +1 -1
  59. package/backend/dist/services/authService.d.ts +6 -0
  60. package/backend/dist/services/authService.d.ts.map +1 -1
  61. package/backend/dist/services/authService.js +9 -0
  62. package/backend/dist/services/authService.js.map +1 -1
  63. package/backend/dist/services/automationSchedulerService.d.ts.map +1 -1
  64. package/backend/dist/services/automationSchedulerService.js +7 -0
  65. package/backend/dist/services/automationSchedulerService.js.map +1 -1
  66. package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
  67. package/backend/dist/services/dataArchiveService.js +3 -0
  68. package/backend/dist/services/dataArchiveService.js.map +1 -1
  69. package/backend/dist/services/documentMediaExtractionService.d.ts +40 -0
  70. package/backend/dist/services/documentMediaExtractionService.d.ts.map +1 -0
  71. package/backend/dist/services/documentMediaExtractionService.js +157 -0
  72. package/backend/dist/services/documentMediaExtractionService.js.map +1 -0
  73. package/backend/dist/services/documentService.d.ts +6 -0
  74. package/backend/dist/services/documentService.d.ts.map +1 -1
  75. package/backend/dist/services/documentService.js +58 -4
  76. package/backend/dist/services/documentService.js.map +1 -1
  77. package/backend/dist/services/encryptionService.d.ts +6 -0
  78. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  79. package/backend/dist/services/encryptionService.js +12 -0
  80. package/backend/dist/services/encryptionService.js.map +1 -1
  81. package/backend/dist/services/mfaService.d.ts +64 -0
  82. package/backend/dist/services/mfaService.d.ts.map +1 -0
  83. package/backend/dist/services/mfaService.js +263 -0
  84. package/backend/dist/services/mfaService.js.map +1 -0
  85. package/backend/dist/services/notificationService.d.ts +5 -0
  86. package/backend/dist/services/notificationService.d.ts.map +1 -1
  87. package/backend/dist/services/notificationService.js +33 -1
  88. package/backend/dist/services/notificationService.js.map +1 -1
  89. package/backend/dist/services/preferencesService.d.ts +1 -1
  90. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  91. package/backend/dist/services/preferencesService.js +1 -0
  92. package/backend/dist/services/preferencesService.js.map +1 -1
  93. package/backend/dist/services/recoveryDrillService.d.ts +57 -0
  94. package/backend/dist/services/recoveryDrillService.d.ts.map +1 -0
  95. package/backend/dist/services/recoveryDrillService.js +363 -0
  96. package/backend/dist/services/recoveryDrillService.js.map +1 -0
  97. package/backend/dist/services/webPushService.d.ts +71 -0
  98. package/backend/dist/services/webPushService.d.ts.map +1 -0
  99. package/backend/dist/services/webPushService.js +328 -0
  100. package/backend/dist/services/webPushService.js.map +1 -0
  101. package/backend/dist/services/webauthnService.d.ts +58 -0
  102. package/backend/dist/services/webauthnService.d.ts.map +1 -0
  103. package/backend/dist/services/webauthnService.js +300 -0
  104. package/backend/dist/services/webauthnService.js.map +1 -0
  105. package/backend/dist/types/index.d.ts +3 -2
  106. package/backend/dist/types/index.d.ts.map +1 -1
  107. package/backend/dist/types/index.js.map +1 -1
  108. package/backend/dist/utils/documentExtraction.d.ts +31 -3
  109. package/backend/dist/utils/documentExtraction.d.ts.map +1 -1
  110. package/backend/dist/utils/documentExtraction.js +106 -0
  111. package/backend/dist/utils/documentExtraction.js.map +1 -1
  112. package/backend/dist/utils/toolEgress.d.ts +2 -1
  113. package/backend/dist/utils/toolEgress.d.ts.map +1 -1
  114. package/backend/dist/utils/toolEgress.js +14 -2
  115. package/backend/dist/utils/toolEgress.js.map +1 -1
  116. package/backend/dist/utils/totp.d.ts +19 -0
  117. package/backend/dist/utils/totp.d.ts.map +1 -0
  118. package/backend/dist/utils/totp.js +117 -0
  119. package/backend/dist/utils/totp.js.map +1 -0
  120. package/backend/dist/utils/webauthn.d.ts +43 -0
  121. package/backend/dist/utils/webauthn.d.ts.map +1 -0
  122. package/backend/dist/utils/webauthn.js +294 -0
  123. package/backend/dist/utils/webauthn.js.map +1 -0
  124. package/backend/package.json +1 -1
  125. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  126. package/frontend/dist/assets/index-DBAf_VaS.js +47 -0
  127. package/frontend/dist/assets/index-kn_Axjts.css +1 -0
  128. package/frontend/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  129. package/frontend/dist/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  130. package/frontend/dist/fonts/jetbrains-mono.css +24 -0
  131. package/frontend/dist/index.html +20 -13
  132. package/frontend/dist/js/ArtifactContainer-C9zNtCay.js +1 -0
  133. package/frontend/dist/js/{ArtifactDemoPage-D0JEIAbZ.js → ArtifactDemoPage-C-EBFBCt.js} +1 -1
  134. package/frontend/dist/js/ArtifactSandboxFrame-CTA1j_d1.js +111 -0
  135. package/frontend/dist/js/ArtifactSlideOutPanel-BOENbOiv.js +1 -0
  136. package/frontend/dist/js/AutomationsPage-C58MQ4te.js +1 -0
  137. package/frontend/dist/js/CalendarPage-BcdAZ292.js +1 -0
  138. package/frontend/dist/js/ChannelsPage-DPr9Yajs.js +1 -0
  139. package/frontend/dist/js/ChatPage-DsbB748s.js +14 -0
  140. package/frontend/dist/js/{EvaluationsPage-Bm8FRoeX.js → EvaluationsPage-FWIJu2fI.js} +1 -1
  141. package/frontend/dist/js/FirstTimeSetup-Cy-w6xko.js +1 -0
  142. package/frontend/dist/js/GalleryPage-DDAtxM-x.js +1 -0
  143. package/frontend/dist/js/{HomePage-BqNy-FWX.js → HomePage-DLKwmE7n.js} +1 -1
  144. package/frontend/dist/js/LibreClawPage-vKOj-9w9.js +1 -0
  145. package/frontend/dist/js/{ModelManagerModals-DX9eT5r2.js → ModelManagerModals-BY5TK38_.js} +1 -1
  146. package/frontend/dist/js/ModelSelector-CoCS6MZ9.js +1 -0
  147. package/frontend/dist/js/NotesPage-BElIpXgA.js +3 -0
  148. package/frontend/dist/js/OptimizedSyntaxHighlighter-xgyE3dRA.js +1 -0
  149. package/frontend/dist/js/PersonasPage-P40jVbfU.js +13 -0
  150. package/frontend/dist/js/{PluginUsagePage-Ctoka6JZ.js → PluginUsagePage-CKUEPCJN.js} +1 -1
  151. package/frontend/dist/js/RichMessageContent-Bm2WaEGi.js +3 -0
  152. package/frontend/dist/js/SettingsModal-DxSGzx9A.js +19 -0
  153. package/frontend/dist/js/SystemPage-BT07dTMT.js +1 -0
  154. package/frontend/dist/js/UserManagementPage-B9Vz5cm3.js +1 -0
  155. package/frontend/dist/js/WorkPage-qoN_e_jK.js +6 -0
  156. package/frontend/dist/js/api-D7Ff5M2Q.js +14 -0
  157. package/frontend/dist/js/appStore-DmV5wqDz.js +2 -0
  158. package/frontend/dist/js/ar-YHHTVP8f.js +2 -0
  159. package/frontend/dist/js/artifactHtml-DDmfpcB0.js +41 -0
  160. package/frontend/dist/js/{authStore-DbqqrfZv.js → authStore-BYW8-kP6.js} +3 -3
  161. package/frontend/dist/js/bn-C8VTxBVl.js +2 -0
  162. package/frontend/dist/js/chatStore-D-NTlArO.js +3 -0
  163. package/frontend/dist/js/{config-8KdgjtEx.js → config-BqZ5304Q.js} +1 -1
  164. package/frontend/dist/js/cs-CCngB5fC.js +2 -0
  165. package/frontend/dist/js/da-CM2PP2ma.js +2 -0
  166. package/frontend/dist/js/de-BqVkD-dw.js +2 -0
  167. package/frontend/dist/js/es-BtWsWBjZ.js +2 -0
  168. package/frontend/dist/js/{estree-BU5-LV_1.js → estree-DPkpBuOU.js} +1 -1
  169. package/frontend/dist/js/{evaluationsApi-CwZJsgeG.js → evaluationsApi-Dnf2dTd-.js} +1 -1
  170. package/frontend/dist/js/fr-C68w9abT.js +2 -0
  171. package/frontend/dist/js/hi-DtBlcyXZ.js +2 -0
  172. package/frontend/dist/js/{html-DeoAy2bo.js → html-BpGUXG8E.js} +1 -1
  173. package/frontend/dist/js/id-BWzIu8tn.js +2 -0
  174. package/frontend/dist/js/is-yeFwu4dJ.js +2 -0
  175. package/frontend/dist/js/it-AxEMG8Jg.js +2 -0
  176. package/frontend/dist/js/ja-B-VyokB8.js +2 -0
  177. package/frontend/dist/js/ko-CvwzYr9k.js +2 -0
  178. package/frontend/dist/js/{markdown-DOLsYkBY.js → markdown-DCBRWJSK.js} +1 -1
  179. package/frontend/dist/js/{messageCodeStyles-DhVgizF-.js → messageCodeStyles-BQwf7sSz.js} +2 -2
  180. package/frontend/dist/js/ms-BhEwb4b7.js +2 -0
  181. package/frontend/dist/js/nl-Dq-QRx1L.js +2 -0
  182. package/frontend/dist/js/pl-BNEy8mQm.js +2 -0
  183. package/frontend/dist/js/pt-_3Jl3FdY.js +2 -0
  184. package/frontend/dist/js/ru-IhQiJ8ta.js +2 -0
  185. package/frontend/dist/js/{standalone-BO5pzI8_.js → standalone-BFrK0R2A.js} +1 -1
  186. package/frontend/dist/js/sv-DWunXUNz.js +2 -0
  187. package/frontend/dist/js/{syntax-highlight-DcR9Vhb7.js → syntax-highlight-P2zo9o06.js} +1 -1
  188. package/frontend/dist/js/th-DVnW2yyh.js +2 -0
  189. package/frontend/dist/js/tr-Do8CFmhR.js +2 -0
  190. package/frontend/dist/js/{typescript-6GJ8APmn.js → typescript-DYVyvmm_.js} +1 -1
  191. package/frontend/dist/js/ui-db9meqAB.js +2 -0
  192. package/frontend/dist/js/ui-vendor-C0DZ8-Cm.js +177 -0
  193. package/frontend/dist/js/uk-BNPKIZga.js +2 -0
  194. package/frontend/dist/js/vi-CZMFo9je.js +2 -0
  195. package/frontend/dist/js/{workApi-BruWTlHM.js → workApi-CcprMH_1.js} +2 -2
  196. package/frontend/dist/js/zh-Pg0881v0.js +2 -0
  197. package/frontend/dist/manifest.webmanifest +32 -0
  198. package/frontend/dist/sw.js +125 -0
  199. package/package.json +2 -2
  200. package/frontend/dist/assets/index-BPsH9FII.js +0 -80
  201. package/frontend/dist/assets/index-BtXF0Oxa.css +0 -1
  202. package/frontend/dist/js/ArtifactContainer-CIoFoMv8.js +0 -1
  203. package/frontend/dist/js/ArtifactSandboxFrame-REazyIrx.js +0 -151
  204. package/frontend/dist/js/ArtifactSlideOutPanel-A-i94ghF.js +0 -1
  205. package/frontend/dist/js/AutomationsPage-Dow_lbIf.js +0 -1
  206. package/frontend/dist/js/CalendarPage-DLjasZOd.js +0 -1
  207. package/frontend/dist/js/ChannelsPage-C8hvTD7J.js +0 -1
  208. package/frontend/dist/js/ChatPage-BAgBHUES.js +0 -16
  209. package/frontend/dist/js/FirstTimeSetup-BxJapNul.js +0 -1
  210. package/frontend/dist/js/GalleryPage-DHz9DkK7.js +0 -1
  211. package/frontend/dist/js/LibreClawPage-BDzDILjY.js +0 -1
  212. package/frontend/dist/js/ModelSelector-ol8mK2ja.js +0 -1
  213. package/frontend/dist/js/NotesPage-DzHEx2O4.js +0 -3
  214. package/frontend/dist/js/OptimizedSyntaxHighlighter-CZNPwN0i.js +0 -1
  215. package/frontend/dist/js/PersonasPage-M_WKH2a9.js +0 -13
  216. package/frontend/dist/js/RichMessageContent-BqgafH4p.js +0 -3
  217. package/frontend/dist/js/SettingsModal-R9EDadAV.js +0 -19
  218. package/frontend/dist/js/SystemPage-aOkrSuY7.js +0 -1
  219. package/frontend/dist/js/UserManagementPage-BOuaX3ay.js +0 -1
  220. package/frontend/dist/js/WorkPage-DxZISerQ.js +0 -6
  221. package/frontend/dist/js/api-6bSMtSNh.js +0 -14
  222. package/frontend/dist/js/appStore-CdObhQBb.js +0 -2
  223. package/frontend/dist/js/ar-DT_VLBO3.js +0 -2
  224. package/frontend/dist/js/bn-BrvEqhGA.js +0 -2
  225. package/frontend/dist/js/chatStore-DbZPJNsu.js +0 -3
  226. package/frontend/dist/js/cs-BthnM_YI.js +0 -2
  227. package/frontend/dist/js/da-DCth-6_j.js +0 -2
  228. package/frontend/dist/js/de-BBWt0gJ_.js +0 -2
  229. package/frontend/dist/js/es-DuslOPqM.js +0 -2
  230. package/frontend/dist/js/fr-DZAeg46S.js +0 -2
  231. package/frontend/dist/js/hi-ijDSiY77.js +0 -2
  232. package/frontend/dist/js/id-BS6qS0oq.js +0 -2
  233. package/frontend/dist/js/is-CO2PMDte.js +0 -2
  234. package/frontend/dist/js/it-ChhxT4hs.js +0 -2
  235. package/frontend/dist/js/ja-cyeqUeJN.js +0 -2
  236. package/frontend/dist/js/ko-CfqHTLXj.js +0 -2
  237. package/frontend/dist/js/ms-DZ5pACe1.js +0 -2
  238. package/frontend/dist/js/nl-BsRsnOVp.js +0 -2
  239. package/frontend/dist/js/pl-DXSTAW4M.js +0 -2
  240. package/frontend/dist/js/pt-DmDx0JxB.js +0 -2
  241. package/frontend/dist/js/ru-d2g8EWfY.js +0 -2
  242. package/frontend/dist/js/sv-CIhYUTVQ.js +0 -2
  243. package/frontend/dist/js/th-B3wSxanB.js +0 -2
  244. package/frontend/dist/js/tr-R4UGgPOY.js +0 -2
  245. package/frontend/dist/js/ui-CV0LYmkM.js +0 -2
  246. package/frontend/dist/js/ui-vendor-CWjIBW-z.js +0 -177
  247. package/frontend/dist/js/uk-BzUF4Vkt.js +0 -2
  248. package/frontend/dist/js/vi-CKc6Fg4h.js +0 -2
  249. package/frontend/dist/js/zh-CXL-kDe8.js +0 -2
@@ -0,0 +1,111 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{_ as t,g as n}from"./markdown-core-BK7WVOb7.js";import{t as r}from"./logger-DSXjF4ye.js";import{t as i}from"./config-BqZ5304Q.js";import{a,l as o,n as s,o as c,r as l,t as u}from"./artifactHtml-DDmfpcB0.js";var d=e(t(),1),f=`${i.replace(/\/+$/,``)}/artifacts/sandbox`,p=window.location.protocol===`file:`?new URL(f).origin:window.location.origin,m=`/artifact-runtime`,h=`runtime`,g=`react`,_=`babel`,v=`tailwind`,y=`fonts`,b={react:g,"react-dom":g,"react-dom/client":g,"react/jsx-runtime":g,"react/jsx-dev-runtime":g,recharts:`recharts`,"lucide-react":`lucide-react`,d3:`d3`,three:`three`,papaparse:`papaparse`,lodash:`lodash`,"lodash-es":`lodash`,mermaid:`mermaid`,"chart.js":`chart`,"chart.js/auto":`chart`,tone:`tone`,mathjs:`mathjs`,"plotly.js":`plotly`,"plotly.js-dist-min":`plotly`,"framer-motion":`framer-motion`,"motion/react":`framer-motion`,motion:`framer-motion`,"three/addons/controls/OrbitControls.js":`three`,"three/examples/jsm/controls/OrbitControls.js":`three`},x=[h,g,_,v],S=[h,`mermaid`],C=[{pattern:/cdn\.tailwindcss\.com/i,bundle:v},{pattern:/(?:^|\/)tailwindcss(?:@[\d.]+)?(?:\/|$)/i,bundle:v},{pattern:/(?:^|\/)chart\.js(?:@[\d.]+)?(?:\/|$|\?)/i,bundle:`chart`},{pattern:/(?:^|\/)chart(?:\.min)?\.js(?:$|\?)/i,bundle:`chart`},{pattern:/(?:^|\/)d3(?:@[\d.]+)?(?:\/|$|\?)/i,bundle:`d3`},{pattern:/(?:^|\/)d3(?:\.min)?\.js(?:$|\?)/i,bundle:`d3`},{pattern:/(?:^|\/)three(?:@[\d.]+)?(?:\/|$|\?)/i,bundle:`three`},{pattern:/(?:^|\/)three(?:\.min)?\.js(?:$|\?)/i,bundle:`three`},{pattern:/papaparse/i,bundle:`papaparse`},{pattern:/(?:^|\/)lodash(?:@[\d.]+)?(?:\/|$|\?)/i,bundle:`lodash`},{pattern:/(?:^|\/)lodash(?:\.min)?\.js(?:$|\?)/i,bundle:`lodash`},{pattern:/fonts\.(?:googleapis|gstatic)\.com/i,bundle:y},{pattern:/mermaid/i,bundle:`mermaid`},{pattern:/(?:^|\/)tone(?:@[\d.]+)?(?:\/|$|\?)|tone(?:\.min)?\.js/i,bundle:`tone`},{pattern:/mathjs|math(?:\.min)?\.js/i,bundle:`mathjs`},{pattern:/plotly/i,bundle:`plotly`},{pattern:/framer-motion|(?:^|\/)motion(?:@[\d.]+)?(?:\/|$)/i,bundle:`framer-motion`},{pattern:/react-dom/i,bundle:g},{pattern:/(?:^|\/)react(?:@[\d.]+)?(?:\/|$|\?)/i,bundle:g},{pattern:/babel(?:-standalone|\/standalone)/i,bundle:_}],w=`__libreArtifactRuntime`;function T(e){if(b[e])return e;let t=C.find(({pattern:t})=>t.test(e))?.bundle??Object.values(b).find(t=>e.startsWith(`${t}/`));return t?Object.entries(b).find(([,e])=>e===t)?.[0]??null:null}function E(e){let t=new Set,n=e.matchAll(/(?:from|import|require)\s*\(?\s*['"`]([^'"`]+)['"`]/g);for(let[,e]of n){let n=T(e);n&&t.add(b[n])}return[...t]}var D=/\b(?:flex|grid|hidden|absolute|relative|(?:p|m|px|py|mx|my|mt|mb|ml|mr|gap|space)-\d|(?:w|h|max-w|min-h)-(?:\d|full|screen|auto)|text-(?:xs|sm|base|lg|xl|\dxl|center|left|right|white|black|gray-\d)|bg-(?:white|black|transparent|[a-z]+-\d)|rounded(?:-[a-z]+)?|shadow(?:-[a-z]+)?|border(?:-\d)?|items-(?:center|start|end)|justify-(?:center|between|around|end)|font-(?:bold|medium|semibold|light)|hover:[a-z-]+|(?:sm|md|lg|xl):[a-z-]+)\b/g;function O(e){let t=[...e.matchAll(/class\s*=\s*("|')(.*?)\1/gi)].map(e=>e[2]).join(` `);return new Set(t.match(D)??[]).size>=3}function k(e){let t=new Set;for(let[n,r]of Object.entries(b)){let i=n.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);RegExp(`(?:from|import|require)\\s*\\(?\\s*['"\`]${i}['"\`]`).test(e)&&t.add(r)}return[...t]}function A(e){return C.find(({pattern:t})=>t.test(e))?.bundle??null}function j(e){let t=new Set;for(let n of e.matchAll(/\b(?:src|href)\s*=\s*("|')(.*?)\1/gi))t.add(n[2]);for(let n of e.matchAll(/(?:from|import|require)\s*\(?\s*['"`]([^'"`]+)['"`]/g))t.add(n[1]);return[...t]}function M(e){let t=new Set;for(let n of j(e)){let e=A(n);e&&t.add(e)}return[...t]}var N=`8ebab41e5201a784`,P=new Map;function F(e){let t=P.get(e);if(t)return t;let n=fetch(`${p}${m}/${e}.js?v=${N}`,{credentials:`same-origin`,cache:`no-cache`}).then(t=>{if(!t.ok)throw Error(`The artifact runtime bundle "${e}" is unavailable (HTTP ${t.status}).`);return t.text()});return n.catch(()=>P.delete(e)),P.set(e,n),n}async function I(e){let t=await Promise.all(e.map(F));return Object.fromEntries(e.map((e,n)=>[e,t[n]]))}var L=`
2
+ html, body { margin: 0; min-height: 100%; }
3
+ body {
4
+ background: #ffffff;
5
+ color: #111827;
6
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
7
+ }
8
+ #root { min-height: 100vh; }
9
+ * { box-sizing: border-box; }
10
+ `,R=e=>JSON.stringify(e).replace(/</g,`\\u003c`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`),z=e=>`<script>${e}<\/script>`,B=`(function () {
11
+ function createStorage() {
12
+ var data = Object.create(null);
13
+ var api = {
14
+ getItem: function (key) {
15
+ key = String(key);
16
+ return Object.prototype.hasOwnProperty.call(data, key) ? data[key] : null;
17
+ },
18
+ setItem: function (key, value) { data[String(key)] = String(value); },
19
+ removeItem: function (key) { delete data[String(key)]; },
20
+ clear: function () { data = Object.create(null); },
21
+ key: function (index) {
22
+ var keys = Object.keys(data);
23
+ return index < keys.length ? keys[index] : null;
24
+ },
25
+ };
26
+ Object.defineProperty(api, 'length', { get: function () { return Object.keys(data).length; } });
27
+ return api;
28
+ }
29
+
30
+ for (const name of ['localStorage', 'sessionStorage']) {
31
+ try {
32
+ void window[name];
33
+ } catch (error) {
34
+ Object.defineProperty(window, name, { value: createStorage(), configurable: true });
35
+ }
36
+ }
37
+
38
+ // Generated code sometimes appends a font stylesheet itself. It cannot load
39
+ // — artifacts have no network — and the vendored face is already injected,
40
+ // so the tag is dropped instead of failing against the policy.
41
+ var appendChild = Node.prototype.appendChild;
42
+ var blocked = /fonts\\.(?:googleapis|gstatic)\\.com|^https?:\\/\\//i;
43
+ Node.prototype.appendChild = function (node) {
44
+ if (
45
+ node &&
46
+ node.tagName === 'LINK' &&
47
+ String(node.rel || '').toLowerCase().indexOf('stylesheet') !== -1 &&
48
+ blocked.test(String(node.href || ''))
49
+ ) {
50
+ return node;
51
+ }
52
+ return appendChild.call(this, node);
53
+ };
54
+
55
+ try {
56
+ void document.cookie;
57
+ } catch (error) {
58
+ var jar = '';
59
+ Object.defineProperty(document, 'cookie', {
60
+ configurable: true,
61
+ get: function () { return jar; },
62
+ set: function (value) {
63
+ var pair = String(value).split(';')[0];
64
+ jar = jar ? jar + '; ' + pair : pair;
65
+ },
66
+ });
67
+ }
68
+ })();`,V=new Set([`module`,`text/babel`,`application/babel`]),H=e=>/^(?:https?:)?\/\//i.test(e);function U(e){return[...new DOMParser().parseFromString(e,`text/html`).querySelectorAll(`script`)].filter(e=>!e.getAttribute(`src`)&&V.has((e.getAttribute(`type`)??``).trim().toLowerCase())).map(e=>e.textContent??``).join(`
69
+ `)}function W(e,t){if(e===`react`)return[...new Set([...x,...k(t)])];if(e===`mermaid`)return[...S];let n=U(t),r=new Set(M(t));for(let e of E(n))r.add(e);return O(t)&&r.add(v),n.trim()&&(r.add(_),/\bReact\b|jsx|<[A-Z]/.test(n)&&r.add(g)),[h,...[...r].filter(e=>e!==h)]}function G(e,t,n,r){let i=new DOMParser().parseFromString(e,`text/html`),a=e=>i.createComment(` ${e} `),o=e=>{let n=A(e);return n&&t[n]?n:null};for(let e of[...i.querySelectorAll(`script`)]){let t=(e.getAttribute(`type`)??``).trim().toLowerCase(),n=e.getAttribute(`src`);if(t===`importmap`){e.replaceWith(a(`import map removed: modules resolve from the local runtime`));continue}if(n){let t=o(n);t?e.replaceWith(a(`${t} is provided by the local runtime`)):H(n)&&(r.push(n),e.replaceWith(a(`unavailable offline: ${n}`)));continue}if(V.has(t)){let t=i.createElement(`script`);t.textContent=`(function () {
70
+ var runtime = window.${w};
71
+ if (runtime && typeof runtime.runInline === 'function') {
72
+ runtime.runInline(${R(e.textContent??``)});
73
+ return;
74
+ }
75
+ var report = document.createElement('pre');
76
+ report.setAttribute('data-testid', 'artifact-runtime-missing');
77
+ report.style.cssText = 'margin:16px;padding:12px;border:1px solid #f0a5a5;border-radius:8px;background:#fff5f5;color:#7f1d1d;font:12px/1.5 ui-monospace,Menlo,monospace;white-space:pre-wrap;';
78
+ report.textContent = 'The artifact runtime did not load.\\n\\nregistry: ' +
79
+ (runtime ? 'present, keys: ' + Object.keys(runtime).join(', ') : 'absent') +
80
+ '\\nscripts in document: ' + document.querySelectorAll('script').length;
81
+ (document.body || document.documentElement).appendChild(report);
82
+ })();`,e.replaceWith(t)}}for(let e of[...i.querySelectorAll(`link`)]){let t=(e.getAttribute(`rel`)??``).toLowerCase();if(/preconnect|dns-prefetch|icon|manifest/.test(t))continue;let n=e.getAttribute(`href`);if(!n||!t.includes(`stylesheet`)&&!/\.css|fonts\.googleapis/i.test(n))continue;let i=o(n);i?e.replaceWith(a(`${i} is provided by the local runtime`)):H(n)&&(r.push(n),e.replaceWith(a(`unavailable offline: ${n}`)))}let s=i.head,c=[...n,r.length?K(r):``].filter(Boolean);for(let e of[...c].reverse()){let t=i.createElement(`script`);t.textContent=e,s.insertBefore(t,s.firstChild)}return`<!DOCTYPE html>${i.documentElement.outerHTML}`}var K=e=>{let t=e.map(e=>e.split(`/`).pop()||e).filter((e,t,n)=>n.indexOf(e)===t);return`(function () {
83
+ var notice = document.createElement('div');
84
+ notice.setAttribute('data-testid', 'artifact-missing-library');
85
+ notice.style.cssText = 'position:sticky;top:0;z-index:2147483647;margin:0;padding:10px 14px;' +
86
+ 'background:#fff7ed;border-bottom:1px solid #fdba74;color:#7c2d12;' +
87
+ 'font:13px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;';
88
+ notice.textContent = ${JSON.stringify(`This artifact asked for ${t.join(`, `)}, which is not available offline. Artifacts run without network access; ask for a version that uses the built-in libraries.`)};
89
+ var place = function () {
90
+ if (document.body) document.body.insertBefore(notice, document.body.firstChild);
91
+ };
92
+ if (document.body) place();
93
+ else document.addEventListener('DOMContentLoaded', place);
94
+ })();`},q=(e,t,n,r,i)=>`<!DOCTYPE html>
95
+ <html lang="en" data-color-scheme="${i.colorScheme??`light`}">
96
+ <head>
97
+ <meta charset="UTF-8" />
98
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
99
+ <base target="_blank" />
100
+ <title>${a(e)}</title>
101
+ <style>${L}</style>
102
+ </head>
103
+ <body>
104
+ <div id="root"></div>
105
+ ${z(B)}
106
+ <script>window.__libreArtifactSource = ${R(t)};<\/script>
107
+ ${n.map(z).join(`
108
+ `)}
109
+ <script>window.${w}.${r}();<\/script>
110
+ </body>
111
+ </html>`;function J(e,t,n,r,i={}){let a=W(e,t).map(e=>r[e]).filter(e=>!!e);if(e===`react`)return q(n,t,a,`runReact`,i);if(e===`mermaid`)return q(n,t,a,`runMermaid`,i);let o=[];return G(l(t,n),r,[B,...a],o)}async function Y(e,t,n,r={}){return J(e,t,n,await I(W(e,t)),r)}var X=n(),Z=r(`components:artifact-sandbox-frame`),Q=8e3,$=({content:e,title:t,kind:n=`html`,colorScheme:r=`light`,className:i,testId:a=`artifact-html-preview`,fallback:l})=>{let p=(0,d.useRef)(null),m=(0,d.useRef)(!1),h=(0,d.useRef)(null),[g,_]=(0,d.useState)(!1);return(0,d.useEffect)(()=>{let i=!1;return Y(n,e,t,{colorScheme:r}).then(e=>{i||(h.current=e,m.current&&o(p.current,e))}).catch(e=>{i||(Z.error(`Failed to prepare the artifact runtime:`,e),_(!0))}),()=>{i=!0}},[n,e,t,r]),(0,d.useEffect)(()=>{let e=e=>{c(e,p.current)&&(m.current=!0,h.current&&o(p.current,h.current))};window.addEventListener(`message`,e);let t=window.setTimeout(()=>{m.current||_(!0)},Q);return()=>{window.removeEventListener(`message`,e),window.clearTimeout(t)}},[]),g&&l?(0,X.jsx)(X.Fragment,{children:l}):(0,X.jsx)(`iframe`,{ref:p,"data-testid":a,src:f,className:i,sandbox:s,allow:u,title:t})};export{$ as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{_ as t,g as n}from"./markdown-core-BK7WVOb7.js";import{n as r}from"./react-vendor-BG_HPV6X.js";import{t as ee}from"./useTranslation-5b5UhAc9.js";import{t as i}from"./utils-BGrdX9ie.js";import{t as te,w as ne}from"./chatStore-D-NTlArO.js";import{Bn as re,Ht as ie,Ln as ae,Rn as oe,Tn as a,Wt as o,_n as se,bn as ce,fn as le,h as s,n as ue,on as c,wn as l}from"./ui-vendor-C0DZ8-Cm.js";import{t as u}from"./logger-DSXjF4ye.js";import{t as de}from"./appStore-DmV5wqDz.js";import{t as d}from"./Button-C0r3J9G_.js";import{i as fe,r as pe}from"./artifactHtml-DDmfpcB0.js";import{t as f}from"./OptimizedSyntaxHighlighter-xgyE3dRA.js";import{t as me}from"./ArtifactSandboxFrame-CTA1j_d1.js";var p=e(t(),1),he=r(),m=n(),h=u(`components:artifact-slide-out-panel`),g=320,ge=.9,_e=400,ve=`(min-width: 768px)`,ye=`(min-width: 1024px)`,_=e=>{let[t,n]=(0,p.useState)(()=>typeof window<`u`&&window.matchMedia(e).matches);return(0,p.useEffect)(()=>{let t=window.matchMedia(e),r=()=>n(t.matches);return t.addEventListener(`change`,r),()=>t.removeEventListener(`change`,r)},[e]),t},v=()=>{let{t:e,i18n:t}=ee(),n=ne(t.language),{artifactPanelOpen:r,artifactPanelArtifact:u,openArtifactPanel:v,closeArtifactPanel:y,theme:b,artifactPanelWidth:x,setArtifactPanelWidth:S,artifactPanelResizing:C,setArtifactPanelResizing:w,sidebarOpen:T,sidebarCompact:E}=de(),D=_(ve),O=_(ye)?T?E?64:288:0:T&&E?64:0,k=(0,p.useCallback)(()=>D?Math.max(g,window.innerWidth-O-_e):window.innerWidth*ge,[D,O]),A=te(e=>e.currentSession),j=p.useMemo(()=>{if(!u)return[];let e=u.title.trim().toLowerCase(),t=(A?.messages??[]).flatMap(e=>e.artifacts??[]).filter(t=>t.title.trim().toLowerCase()===e);return t.some(e=>e.id===u.id||e.content===u.content)?t:[...t,u]},[A,u]),M=j.findIndex(e=>e.id===u?.id);M===-1&&u&&(M=j.findIndex(e=>e.content===u.content));let[N,P]=(0,p.useState)(!1),[F,I]=(0,p.useState)(`preview`),L=(0,p.useRef)(null),R=(0,p.useRef)(null),z=(0,p.useRef)(0),B=(0,p.useRef)(0),V=(0,p.useRef)(null),H=(0,p.useRef)(null),U=(0,p.useRef)(x),W=u?.id??null;W!==R.current&&(R.current=W,F!==`preview`&&I(`preview`));let G=(0,p.useCallback)(e=>{U.current=e,H.current===null&&(H.current=window.requestAnimationFrame(()=>{H.current=null,S(U.current)}))},[S]),K=(0,p.useCallback)(()=>{V.current=null,w(!1),H.current!==null&&(window.cancelAnimationFrame(H.current),H.current=null,S(U.current))},[w,S]),be=(0,p.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),V.current=e.pointerId,B.current=x,z.current=e.clientX,U.current=x,e.currentTarget.setPointerCapture(e.pointerId),w(!0)},[x,w]),q=(0,p.useCallback)(e=>{if(!C||V.current!==null&&e.pointerId!==V.current)return;e.preventDefault();let t=(z.current-e.clientX)*(n?-1:1),r=Math.min(k(),Math.max(g,B.current+t));G(r)},[C,n,G,k]);if((0,p.useEffect)(()=>{if(!C){document.body.style.userSelect=``,document.body.style.cursor=``;return}let e=e=>{(V.current===null||e.pointerId===V.current)&&K()};return window.addEventListener(`pointermove`,q,{passive:!1}),window.addEventListener(`pointerup`,e),window.addEventListener(`pointercancel`,e),window.addEventListener(`blur`,K),document.body.style.userSelect=`none`,document.body.style.cursor=`col-resize`,()=>{window.removeEventListener(`pointermove`,q),window.removeEventListener(`pointerup`,e),window.removeEventListener(`pointercancel`,e),window.removeEventListener(`blur`,K),document.body.style.userSelect=``,document.body.style.cursor=``}},[C,q,K]),(0,p.useEffect)(()=>{let e=()=>{let e=k();x>e&&S(e)};return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[x,S,k]),(0,p.useEffect)(()=>{if(D)return;let e=e=>{e.key===`Escape`&&r&&y()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[r,y,D]),(0,p.useEffect)(()=>{if(D)return;let e=e=>{C||L.current&&!L.current.contains(e.target)&&r&&y()},t=setTimeout(()=>{window.addEventListener(`mousedown`,e)},100);return()=>{clearTimeout(t),window.removeEventListener(`mousedown`,e)}},[r,y,C,D]),!u)return null;let J=u,xe=async e=>{try{await navigator.clipboard.writeText(e),P(!0),setTimeout(()=>P(!1),2e3)}catch(e){h.error(`Failed to copy:`,e)}},Se=()=>{let e=J.type===`html`?pe(J.content,J.title):J.content,t=new Blob([e],{type:Ce(J.type)}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${J.title}.${we(J.type)}`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)},Ce=e=>{switch(e){case`html`:return`text/html`;case`react`:return`text/javascript`;case`svg`:return`image/svg+xml`;case`css`:return`text/css`;case`json`:return`application/json`;default:return`text/plain`}},we=e=>{switch(e){case`html`:return`html`;case`react`:return`jsx`;case`svg`:return`svg`;case`css`:return`css`;case`json`:return`json`;default:return`txt`}},Y=()=>{switch(J.type){case`html`:return(0,m.jsx)(o,{className:`h-5 w-5`});case`react`:return(0,m.jsx)(l,{className:`h-5 w-5`});case`svg`:return(0,m.jsx)(c,{className:`h-5 w-5`});case`code`:return(0,m.jsx)(l,{className:`h-5 w-5`});default:return(0,m.jsx)(c,{className:`h-5 w-5`})}},X=()=>(0,m.jsx)(`div`,{"data-testid":`artifact-html-fallback`,className:`w-full h-full flex items-center justify-center bg-gray-50 dark:bg-dark-100 rounded-lg border border-gray-200 dark:border-dark-200 p-4`,children:(0,m.jsxs)(`div`,{className:`max-w-sm text-center`,children:[(0,m.jsx)(s,{className:`h-8 w-8 text-primary-500 mx-auto mb-3`}),(0,m.jsx)(`p`,{className:`text-sm font-medium text-gray-900 dark:text-gray-100`,children:e(`artifacts.previewUnavailable`)}),(0,m.jsx)(`p`,{className:`mt-1 text-sm text-gray-600 dark:text-gray-400`,children:e(`artifacts.previewUnavailableDescription`)}),(0,m.jsxs)(d,{variant:`outline`,size:`sm`,onClick:()=>I(`code`),className:`mt-4`,children:[(0,m.jsx)(a,{className:`h-3.5 w-3.5 me-1.5`}),e(`artifacts.code`)]})]})}),Z=e=>J.content.trim()?(0,m.jsx)(me,{content:J.content,title:J.title,kind:e,colorScheme:b.mode===`light`?`light`:`dark`,className:i(`w-full h-full border-0 rounded-lg bg-white`,C&&`pointer-events-none`),fallback:X()}):X(),Te=()=>(0,m.jsx)(`iframe`,{"data-testid":`artifact-svg-preview`,srcDoc:fe(J.content,J.title),className:`w-full h-full border-0 rounded-lg bg-white`,sandbox:``,title:J.title}),Q=()=>(0,m.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,m.jsx)(f,{language:(()=>{if(J.language)return J.language;switch(J.type){case`html`:return`html`;case`react`:return`jsx`;case`svg`:return`xml`;case`json`:return`json`;default:return`text`}})(),isDark:b.mode!==`light`,className:`!m-0 !rounded-lg !h-full`,codeTheme:`night`,showLineNumbers:!0,backgroundColor:b.mode===`light`?void 0:`rgb(var(--color-dark-50))`,children:J.content})}),Ee=()=>{try{let e=JSON.parse(J.content),t=JSON.stringify(e,null,2);return(0,m.jsx)(`div`,{className:`h-full overflow-auto`,children:(0,m.jsx)(f,{language:`json`,isDark:b.mode!==`light`,className:`!m-0 !rounded-lg !h-full`,codeTheme:`night`,showLineNumbers:!0,backgroundColor:b.mode===`light`?void 0:`rgb(var(--color-dark-50))`,children:t})})}catch{return(0,m.jsx)(`div`,{className:`w-full h-full flex items-center justify-center bg-gray-50 dark:bg-dark-100 rounded-lg`,children:(0,m.jsxs)(`div`,{className:`text-center`,children:[(0,m.jsx)(s,{className:`h-8 w-8 text-primary-500 mx-auto mb-2`}),(0,m.jsx)(`p`,{className:`text-sm text-gray-600 dark:text-dark-600`,children:e(`artifacts.invalidJson`)})]})})}},De=()=>{if(F===`code`)return Q();switch(J.type){case`html`:return Z(`html`);case`react`:return Z(`react`);case`mermaid`:return Z(`mermaid`);case`svg`:return Te();case`json`:return Ee();default:return Q()}},Oe=()=>J.type===`html`||J.type===`svg`||J.type===`react`||J.type===`mermaid`,$=typeof window<`u`&&window.innerWidth<640,ke=$?`100%`:`${x}px`,Ae=(0,m.jsxs)(m.Fragment,{children:[!D&&(0,m.jsx)(`div`,{className:i(`fixed inset-0 bg-black/30 dark:bg-black/50 z-40 transition-opacity duration-300`,r?`opacity-100`:`opacity-0 pointer-events-none`)}),C&&(0,m.jsx)(`div`,{className:i(`fixed inset-0 cursor-col-resize select-none`,D?`z-40`:`z-[55]`),"aria-hidden":`true`}),(0,m.jsxs)(`div`,{ref:L,"data-testid":`artifact-slide-out-panel`,style:{width:ke},className:i(`fixed top-0 end-0 h-full`,D?`z-30`:`z-50`,`bg-white dark:bg-dark-25`,`shadow-2xl border-s border-gray-200 dark:border-dark-200`,`flex flex-col`,`transform transition-transform duration-300 ease-out`,r?`translate-x-0`:`translate-x-full rtl:-translate-x-full`),children:[!$&&(0,m.jsxs)(`div`,{onPointerDown:be,"data-testid":`artifact-resize-handle`,title:e(`artifacts.dragEdgeToResize`),className:i(`absolute start-0 top-0 bottom-0 w-4 -ms-2 cursor-col-resize z-[56]`,`flex items-center justify-center`,`touch-none select-none group`),children:[(0,m.jsx)(`div`,{className:i(`w-1 h-16 rounded-full transition-all duration-200`,`bg-gray-300 dark:bg-dark-300`,`group-hover:bg-primary-500 group-hover:h-24`,C&&`bg-primary-500 h-24`)}),(0,m.jsx)(`div`,{className:i(`absolute left-1/2 -translate-x-1/2 opacity-0 group-hover:opacity-100 transition-opacity`,`text-gray-400 dark:text-dark-500`,C&&`opacity-100`),children:(0,m.jsx)(ie,{className:`h-4 w-4`})})]}),(0,m.jsxs)(`div`,{className:`flex items-center gap-1.5 border-b border-gray-200 dark:border-dark-200 ps-3 pe-2 py-1.5`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-1`,children:[(0,m.jsx)(`div`,{className:`text-gray-600 dark:text-gray-400 flex-shrink-0`,children:Y()}),(0,m.jsx)(`h2`,{className:`text-sm font-semibold text-gray-900 dark:text-gray-100 truncate`,title:J.description||`${e(`artifacts.created`)}: ${new Date(J.createdAt).toLocaleString()}`,children:J.title}),(0,m.jsx)(`span`,{className:`hidden sm:inline text-[10px] bg-primary-50 dark:bg-primary-900/20 text-primary-700 dark:text-primary-300 px-1.5 py-0.5 rounded-full font-medium flex-shrink-0`,children:J.type.toUpperCase()})]}),j.length>1&&M!==-1&&(0,m.jsxs)(`div`,{className:`flex items-center gap-0.5 flex-shrink-0`,children:[(0,m.jsx)(d,{variant:`ghost`,size:`sm`,disabled:M===0,onClick:()=>v(j[M-1]),className:`h-7 w-7 p-0`,title:e(`artifacts.previousVersion`),children:(0,m.jsx)(oe,{className:`h-3.5 w-3.5 rtl:rotate-180`})}),(0,m.jsx)(`span`,{className:`whitespace-nowrap text-xs tabular-nums text-gray-500 dark:text-dark-600`,children:e(`artifacts.versionOf`,{current:M+1,total:j.length})}),(0,m.jsx)(d,{variant:`ghost`,size:`sm`,disabled:M===j.length-1,onClick:()=>v(j[M+1]),className:`h-7 w-7 p-0`,title:e(`artifacts.nextVersion`),children:(0,m.jsx)(ae,{className:`h-3.5 w-3.5 rtl:rotate-180`})})]}),Oe()&&(0,m.jsxs)(`div`,{className:`flex items-center gap-0.5 flex-shrink-0`,children:[(0,m.jsxs)(d,{variant:F===`preview`?`primary`:`ghost`,size:`sm`,onClick:()=>I(`preview`),className:`h-7 px-2 text-xs`,title:e(`artifacts.previewMode`),children:[(0,m.jsx)(le,{className:`h-3.5 w-3.5 me-1`}),e(`artifacts.preview`)]}),(0,m.jsxs)(d,{variant:F===`code`?`primary`:`ghost`,size:`sm`,onClick:()=>I(`code`),className:`h-7 px-2 text-xs`,title:e(`artifacts.codeMode`),children:[(0,m.jsx)(a,{className:`h-3.5 w-3.5 me-1`}),e(`artifacts.code`)]})]}),(0,m.jsxs)(`div`,{className:`flex items-center gap-0.5 flex-shrink-0`,children:[(0,m.jsx)(d,{variant:`ghost`,size:`sm`,onClick:()=>xe(J.content),className:`h-7 w-7 p-0 hover:bg-gray-100 dark:hover:bg-dark-200`,title:e(`artifacts.copyContent`),children:N?(0,m.jsx)(re,{className:`h-3.5 w-3.5 text-green-500`}):(0,m.jsx)(ce,{className:`h-3.5 w-3.5`})}),(0,m.jsx)(d,{variant:`ghost`,size:`sm`,onClick:Se,className:`h-7 w-7 p-0 hover:bg-gray-100 dark:hover:bg-dark-200`,title:e(`artifacts.download`),children:(0,m.jsx)(se,{className:`h-3.5 w-3.5`})}),(0,m.jsx)(d,{variant:`ghost`,size:`sm`,onClick:y,className:`h-7 w-7 p-0 hover:bg-gray-100 dark:hover:bg-dark-200`,title:e(D?`common.close`:`artifacts.closePanelEsc`),children:(0,m.jsx)(ue,{className:`h-4 w-4`})})]})]}),(0,m.jsx)(`div`,{className:`flex-1 p-2 overflow-hidden`,children:De()})]})]});return(0,he.createPortal)(Ae,document.body)};export{v as ArtifactSlideOutPanel};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{_ as t,g as n}from"./markdown-core-BK7WVOb7.js";import{n as r}from"./react-vendor-BG_HPV6X.js";import{f as i}from"./router-vendor-CbexJIsv.js";import{t as a}from"./useTranslation-5b5UhAc9.js";import{r as o,t as s}from"./utils-BGrdX9ie.js";import{t as c}from"./chatStore-D-NTlArO.js";import{An as l,Dn as u,Ot as d,Q as f,X as p,_ as m,fr as h,gn as g,jn as _,kn as v,n as y,q as b,rt as x,t as S,tt as ee}from"./ui-vendor-C0DZ8-Cm.js";import{t as C}from"./logger-DSXjF4ye.js";import{w}from"./api-D7Ff5M2Q.js";import{t as T}from"./Button-C0r3J9G_.js";import"./ui-db9meqAB.js";import{c as E,d as D,l as O,n as k}from"./calendarDates-Co3o_05Y.js";var A=e(t(),1),j=r(),M=(e,t,n)=>new Intl.DateTimeFormat(n,{hour:`numeric`,minute:`2-digit`}).format(new Date(2024,0,1,e,t)),N=(e,t)=>new Intl.DateTimeFormat(t,{weekday:`long`}).format(new Date(2024,0,7+e)),P=(e,t,n)=>new Intl.DateTimeFormat(n,{month:`long`,day:`numeric`}).format(new Date(2024,e-1,t));function F(e,t,n){switch(e.kind){case`once`:return n(`automations.trigger.once`,{when:new Intl.DateTimeFormat(t,{dateStyle:`medium`,timeStyle:`short`}).format(new Date(e.at))});case`hourly`:{let t=e.startHour!==void 0||e.endHour!==void 0?` (${e.startHour??0}–${e.endHour??23})`:``;return n(`automations.trigger.hourly`,{minute:String(e.minute).padStart(2,`0`)})+t}case`daily`:return n(`automations.trigger.daily`,{time:M(e.hour,e.minute,t)});case`weekly`:return n(`automations.trigger.weekly`,{day:N(e.dayOfWeek,t),time:M(e.hour,e.minute,t)});case`monthly`:return n(`automations.trigger.monthly`,{day:e.dayOfMonth,time:M(e.hour,e.minute,t)});case`yearly`:return n(`automations.trigger.yearly`,{date:P(e.month,e.dayOfMonth,t),time:M(e.hour,e.minute,t)})}}function I(e,t,n){return e.map(e=>F(e,t,n)).join(` · `)}function L(e){let t=(e,t,n)=>typeof e==`number`&&Number.isSafeInteger(e)&&e>=t&&e<=n;switch(e.kind){case`once`:return t(e.at,0,864e13);case`hourly`:return t(e.minute,0,59)&&(e.startHour===void 0||t(e.startHour,0,23))&&(e.endHour===void 0||t(e.endHour,0,23))&&(e.startHour===void 0||e.endHour===void 0||e.endHour>=e.startHour);case`daily`:return t(e.hour,0,23)&&t(e.minute,0,59);case`weekly`:return t(e.dayOfWeek,0,6)&&t(e.hour,0,23)&&t(e.minute,0,59);case`monthly`:return t(e.dayOfMonth,1,31)&&t(e.hour,0,23)&&t(e.minute,0,59);case`yearly`:return t(e.month,1,12)&&t(e.dayOfMonth,1,31)&&t(e.hour,0,23)&&t(e.minute,0,59);default:return!1}}var R=n(),z=[`once`,`hourly`,`daily`,`weekly`,`monthly`,`yearly`],B=`rounded-lg border border-black/[0.08] bg-white px-2 py-1 text-[13px] text-gray-900 focus:border-primary-500/40 focus:outline-none dark:border-white/[0.08] dark:bg-dark-100 dark:text-dark-900`,V=(e,t)=>`${String(e).padStart(2,`0`)}:${String(t).padStart(2,`0`)}`,H=e=>{switch(e){case`once`:{let e=new Date;return e.setHours(e.getHours()+1,0,0,0),{kind:`once`,at:e.getTime()}}case`hourly`:return{kind:`hourly`,minute:0};case`daily`:return{kind:`daily`,hour:8,minute:0};case`weekly`:return{kind:`weekly`,dayOfWeek:1,hour:9,minute:0};case`monthly`:return{kind:`monthly`,dayOfMonth:1,hour:9,minute:0};case`yearly`:return{kind:`yearly`,month:1,dayOfMonth:1,hour:9,minute:0}}};function U({trigger:e,onChange:t,onRemove:n}){let{t:r,i18n:i}=a(),o=D(i.language,`short`),s=new Intl.DateTimeFormat(i.language,{month:`long`}),c=n=>{let[r,i]=(n||`00:00`).split(`:`).map(Number);e.kind!==`hourly`&&e.kind!==`once`&&t({...e,hour:r,minute:i})},l=e.kind!==`once`&&e.kind!==`hourly`?(0,R.jsx)(`input`,{type:`time`,"aria-label":r(`automations.form.time`),value:V(e.hour,e.minute),onChange:e=>c(e.target.value),className:B}):null;return(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 rounded-xl border border-black/[0.06] bg-black/[0.02] px-2.5 py-2 dark:border-white/[0.06] dark:bg-white/[0.03]`,"data-testid":`automation-trigger`,children:[(0,R.jsx)(u,{className:`h-3.5 w-3.5 shrink-0 text-gray-400 dark:text-dark-500`}),(0,R.jsx)(`select`,{"aria-label":r(`automations.form.frequency`),value:e.kind,onChange:e=>t(H(e.target.value)),className:B,"data-testid":`automation-trigger-kind`,children:z.map(e=>(0,R.jsx)(`option`,{value:e,children:r(`automations.kind.${e}`)},e))}),e.kind===`once`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`input`,{type:`date`,"aria-label":r(`calendar.date`),value:E(e.at),onChange:n=>t({...e,at:k(n.target.value,O(e.at))}),className:B}),(0,R.jsx)(`input`,{type:`time`,"aria-label":r(`automations.form.time`),value:O(e.at),onChange:n=>t({...e,at:k(E(e.at),n.target.value)}),className:B})]}),e.kind===`hourly`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`label`,{className:`flex items-center gap-1 text-[12px] text-gray-500 dark:text-dark-500`,children:[r(`automations.form.minute`),(0,R.jsx)(`input`,{type:`number`,min:0,max:59,value:e.minute,onChange:n=>t({...e,minute:Math.min(59,Math.max(0,Number(n.target.value)))}),className:`${B} w-16`})]}),(0,R.jsxs)(`label`,{className:`flex items-center gap-1 text-[12px] text-gray-500 dark:text-dark-500`,children:[r(`automations.form.fromHour`),(0,R.jsx)(`input`,{type:`number`,min:0,max:23,value:e.startHour??0,onChange:n=>t({...e,startHour:Math.min(23,Math.max(0,Number(n.target.value)))}),className:`${B} w-16`})]}),(0,R.jsxs)(`label`,{className:`flex items-center gap-1 text-[12px] text-gray-500 dark:text-dark-500`,children:[r(`automations.form.toHour`),(0,R.jsx)(`input`,{type:`number`,min:0,max:23,value:e.endHour??23,onChange:n=>t({...e,endHour:Math.min(23,Math.max(0,Number(n.target.value)))}),className:`${B} w-16`})]})]}),e.kind===`weekly`&&(0,R.jsx)(`select`,{"aria-label":r(`automations.form.weekday`),value:e.dayOfWeek,onChange:n=>t({...e,dayOfWeek:Number(n.target.value)}),className:B,children:o.map((e,t)=>(0,R.jsx)(`option`,{value:t,children:e},e))}),(e.kind===`monthly`||e.kind===`yearly`)&&(0,R.jsxs)(`label`,{className:`flex items-center gap-1 text-[12px] text-gray-500 dark:text-dark-500`,children:[r(`automations.form.dayOfMonth`),(0,R.jsx)(`input`,{type:`number`,min:1,max:31,value:e.dayOfMonth,onChange:n=>t({...e,dayOfMonth:Math.min(31,Math.max(1,Number(n.target.value)))}),className:`${B} w-16`})]}),e.kind===`yearly`&&(0,R.jsx)(`select`,{"aria-label":r(`automations.form.month`),value:e.month,onChange:n=>t({...e,month:Number(n.target.value)}),className:B,children:Array.from({length:12},(e,t)=>(0,R.jsx)(`option`,{value:t+1,children:s.format(new Date(2024,t,1))},t+1))}),l,n&&(0,R.jsx)(`button`,{type:`button`,onClick:n,"aria-label":r(`common.delete`),className:`ms-auto rounded-md p-1 text-red-500 transition-colors hover:bg-red-50 dark:hover:bg-red-900/20`,children:(0,R.jsx)(m,{className:`h-3.5 w-3.5`})})]})}var W=`w-full rounded-lg border border-black/[0.08] bg-white px-2.5 py-1.5 text-[13px] text-gray-900 focus:border-primary-500/40 focus:outline-none dark:border-white/[0.08] dark:bg-dark-100 dark:text-dark-900`,G=`mb-1 block text-[11px] font-medium uppercase tracking-wide text-gray-400 dark:text-dark-500`,K=e=>e.isPlugin&&e.pluginId?`plugin:${e.pluginId}`:e.isAgent&&e.agentId?`agent:${e.agentId}`:`ollama`;function q({open:e,automation:t,initial:n,models:r,saving:i,onClose:a,onSave:o}){return e?(0,R.jsx)(J,{automation:t,initial:n,models:r,saving:i,onClose:a,onSave:o},t?.id??n?.name??`new`):null}function J({automation:e,initial:t,models:n,saving:r,onClose:i,onSave:o}){let{t:s}=a(),[c,l]=(0,A.useState)(e?.name??t?.name??``),[u,d]=(0,A.useState)(e?.instructions??t?.instructions??``),[f,m]=(0,A.useState)(e?.triggers??t?.triggers??[{kind:`daily`,hour:8,minute:0}]),[h,g]=(0,A.useState)(e?.model??``),[_,v]=(0,A.useState)(e?.notify??`app`),b=c.trim().length>0&&u.trim().length>0&&f.length>0&&f.every(L);return(0,j.createPortal)((0,R.jsx)(`div`,{className:`fixed inset-0 z-[2147483647] flex items-center justify-center bg-gray-950/55 p-4 backdrop-blur-md`,onClick:i,children:(0,R.jsxs)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`automation-modal-title`,"data-testid":`automation-modal`,className:`max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-3xl border border-black/[0.07] bg-white p-6 shadow-[0_24px_80px_rgba(0,0,0,0.24)] animate-scale-in scrollbar-thin dark:border-white/[0.08] dark:bg-dark-25`,onClick:e=>e.stopPropagation(),children:[(0,R.jsxs)(`div`,{className:`mb-4 flex items-center justify-between`,children:[(0,R.jsx)(`h3`,{id:`automation-modal-title`,className:`text-lg font-medium tracking-[-0.02em] text-gray-950 dark:text-dark-950`,children:s(e?`automations.editAutomation`:`automations.newAutomation`)}),(0,R.jsx)(`button`,{onClick:i,"aria-label":s(`common.close`),className:`rounded-xl p-2 transition-colors hover:bg-gray-100 dark:hover:bg-dark-200`,children:(0,R.jsx)(y,{size:20,className:`text-gray-500`})})]}),(0,R.jsxs)(`div`,{className:`space-y-4`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`label`,{htmlFor:`automation-name`,className:G,children:s(`automations.form.name`)}),(0,R.jsx)(`input`,{id:`automation-name`,"data-testid":`automation-name`,type:`text`,value:c,onChange:e=>l(e.target.value),placeholder:s(`automations.form.namePlaceholder`),className:W,maxLength:200,autoFocus:!0})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`span`,{className:G,children:s(`automations.form.triggers`)}),(0,R.jsxs)(`div`,{className:`space-y-2`,children:[f.map((e,t)=>(0,R.jsx)(U,{trigger:e,onChange:e=>m(n=>n.map((n,r)=>r===t?e:n)),onRemove:f.length>1?()=>m(e=>e.filter((e,n)=>n!==t)):void 0},t)),f.length<5&&(0,R.jsxs)(`button`,{type:`button`,onClick:()=>m(e=>[...e,{kind:`daily`,hour:8,minute:0}]),"data-testid":`automation-add-trigger`,className:`flex items-center gap-1.5 rounded-lg px-2 py-1 text-[12px] font-medium text-primary-600 transition-colors hover:bg-primary-500/10 dark:text-primary-400`,children:[(0,R.jsx)(p,{className:`h-3.5 w-3.5`}),s(`automations.form.addTrigger`)]})]})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`label`,{htmlFor:`automation-instructions`,className:G,children:s(`automations.form.instructions`)}),(0,R.jsx)(`textarea`,{id:`automation-instructions`,"data-testid":`automation-instructions`,value:u,onChange:e=>d(e.target.value),placeholder:s(`automations.form.instructionsPlaceholder`),rows:5,className:W,maxLength:2e4})]}),(0,R.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`label`,{htmlFor:`automation-model`,className:G,children:s(`automations.form.model`)}),(0,R.jsxs)(`select`,{id:`automation-model`,value:h,onChange:e=>g(e.target.value),className:W,children:[(0,R.jsx)(`option`,{value:``,children:s(`automations.form.modelAuto`)}),n.map(e=>(0,R.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`label`,{htmlFor:`automation-notify`,className:G,children:s(`automations.form.notification`)}),(0,R.jsxs)(`select`,{id:`automation-notify`,value:_,onChange:e=>v(e.target.value),className:W,children:[(0,R.jsx)(`option`,{value:`app`,children:s(`automations.form.notifyApp`)}),(0,R.jsx)(`option`,{value:`off`,children:s(`automations.form.notifyOff`)})]})]})]}),(0,R.jsxs)(`div`,{className:`flex justify-end gap-3 border-t border-gray-200 pt-4 dark:border-dark-300`,children:[(0,R.jsx)(`button`,{onClick:i,className:`rounded-xl px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-100 dark:text-dark-700 dark:hover:bg-dark-200`,children:s(`common.cancel`)}),(0,R.jsx)(`button`,{onClick:()=>{if(!b)return;let e=n.find(e=>e.name===h);o({name:c.trim(),instructions:u.trim(),triggers:f,...e?{provider:K(e),model:e.name}:{},notify:_})},disabled:r||!b,"data-testid":`automation-save`,className:`rounded-xl bg-gray-950 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-gray-800 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-white dark:text-gray-950 dark:hover:bg-gray-100`,children:s(r?`common.saving`:`common.save`)})]})]})]})}),document.body)}function te({days:e,locale:t}){let{t:n}=a(),r=e.reduce((e,t)=>e+t.succeeded,0),i=e.reduce((e,t)=>e+t.failed,0),o=Math.max(1,...e.map(e=>e.succeeded+e.failed)),s=new Intl.DateTimeFormat(t,{month:`short`,day:`numeric`}),c=new Date,l=e=>s.format(new Date(c.getFullYear(),c.getMonth(),c.getDate()-29+e));return(0,R.jsxs)(`div`,{className:`rounded-2xl border border-black/[0.06] bg-white/60 px-4 py-3 dark:border-white/[0.07] dark:bg-dark-100/60`,"data-testid":`automation-run-strip`,children:[(0,R.jsxs)(`div`,{className:`mb-2 flex items-center justify-between`,children:[(0,R.jsx)(`p`,{className:`text-[12px] font-medium text-gray-700 dark:text-dark-700`,children:n(`automations.runHistory`)}),(0,R.jsxs)(`p`,{className:`text-[11px] text-gray-400 dark:text-dark-500`,children:[(0,R.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400`,children:[r,` `,n(`automations.succeeded`)]}),` · `,(0,R.jsxs)(`span`,{className:`text-red-500 dark:text-red-400`,children:[i,` `,n(`automations.failed`)]})]})]}),(0,R.jsx)(`div`,{className:`flex h-12 items-end gap-[3px]`,children:e.map((e,t)=>{let n=e.succeeded+e.failed;if(n===0)return(0,R.jsx)(`div`,{title:l(t),className:`h-[3px] flex-1 rounded-sm bg-black/[0.06] dark:bg-white/[0.08]`},t);let r=Math.max(6,Math.round(n/o*48)),i=Math.round(e.failed/n*r);return(0,R.jsxs)(`div`,{title:`${l(t)}: ${e.succeeded}✓ ${e.failed}✗`,className:`flex flex-1 flex-col justify-end overflow-hidden rounded-sm`,style:{height:r},children:[(0,R.jsx)(`div`,{className:`w-full bg-emerald-500/80`,style:{height:r-i}}),i>0&&(0,R.jsx)(`div`,{className:`w-full bg-red-500/80`,style:{height:i}})]},t)})})]})}var ne=[{id:`morningBrief`,instructions:`Put together my morning brief: the top world, business, and tech headlines from the last 24 hours with one-line summaries, and one story worth reading in depth and why. Keep the whole thing scannable.`,triggers:[{kind:`daily`,hour:7,minute:30}]},{id:`newsDigest`,instructions:`Summarize the most important AI news from the last 24 hours: model releases, notable research papers, funding rounds, and policy changes. For each item add one sentence on why it matters. Skip minor product updates and rumors.`,triggers:[{kind:`daily`,hour:8,minute:0}]},{id:`weeklyReview`,instructions:`Help me wrap the week: prompt me to reflect on what I accomplished, what is still open, and what the top priorities for next week should be. Structure it as a short template I can fill in.`,triggers:[{kind:`weekly`,dayOfWeek:5,hour:16,minute:0}]},{id:`monthlyReport`,instructions:`Draft a monthly status report outline: key accomplishments, metrics to review, risks, and goals for the next month. Leave placeholders where my specifics belong.`,triggers:[{kind:`monthly`,dayOfMonth:1,hour:9,minute:0}]}],Y=C(`pages:automations`),X=()=>{let{t:e,i18n:t}=a(),n=i(),r=c(e=>e.models),u=c(e=>e.loadModels),[y,C]=(0,A.useState)(`automations`),[E,D]=(0,A.useState)([]),[O,k]=(0,A.useState)([]),[j,M]=(0,A.useState)(null),[N,P]=(0,A.useState)(!0),[F,L]=(0,A.useState)(!1),[z,B]=(0,A.useState)(null),[V,H]=(0,A.useState)(null),[U,W]=(0,A.useState)(!1),[G,K]=(0,A.useState)(null),[J,X]=(0,A.useState)(0),Q=(0,A.useCallback)(()=>X(e=>e+1),[]);(0,A.useEffect)(()=>{let t=!1;return Promise.all([w.getAutomations(),w.getRuns(),w.getRunsSummary()]).then(([e,n,r])=>{t||(e.success&&e.data&&D(e.data),n.success&&n.data&&k(n.data),r.success&&r.data&&M(r.data))}).catch(n=>{t||(Y.error(`Failed to load automations:`,n),h.error(e(`automations.loadFailed`)))}).finally(()=>{t||P(!1)}),()=>{t=!0}},[J,e]),(0,A.useEffect)(()=>{r.length===0&&u({quiet:!0})},[r.length,u]),(0,A.useEffect)(()=>{y===`runs`&&w.markRunsSeen().then(()=>w.getRunsSummary()).then(e=>{e.success&&e.data&&M(e.data)}).catch(()=>void 0)},[y,O.length]);let re=()=>{B(null),H(null),L(!0)},ie=t=>{B(null),H({name:e(`automations.templates.${t.id}.name`),instructions:t.instructions,triggers:t.triggers}),L(!0)},ae=e=>{B(e),H(null),K(null),L(!0)},oe=async t=>{W(!0);try{let n=z?await w.updateAutomation(z.id,t):await w.createAutomation(t);n.success?(L(!1),Q()):h.error(n.error||e(`automations.saveFailed`))}catch(t){Y.error(`Failed to save automation:`,t),h.error(e(`automations.saveFailed`))}finally{W(!1)}},$=async(t,n)=>{K(null);try{n===`pause`?await w.pauseAutomation(t.id):n===`resume`?await w.resumeAutomation(t.id):n===`run`?(await w.runAutomationNow(t.id),h.success(e(`automations.runQueued`))):await w.deleteAutomation(t.id),Q()}catch(t){Y.error(`Automation ${n} failed:`,t),h.error(e(`automations.actionFailed`))}},se=e=>e.status===`succeeded`?(0,R.jsx)(_,{className:`h-4 w-4 text-emerald-500`}):e.status===`failed`?(0,R.jsx)(v,{className:`h-4 w-4 text-red-500`}):(0,R.jsx)(d,{className:`h-4 w-4 animate-spin text-gray-400`}),ce=t=>E.find(e=>e.id===t)?.name??e(`automations.deletedAutomation`);return(0,R.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col overflow-hidden`,"data-testid":`automations-page`,children:[(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 border-b border-black/[0.06] px-4 py-3 dark:border-white/[0.07]`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,R.jsx)(`h1`,{className:`text-sm font-semibold text-gray-900 dark:text-dark-900`,children:e(`automations.title`)}),(0,R.jsx)(`div`,{className:`flex items-center rounded-xl bg-black/[0.04] p-0.5 dark:bg-white/[0.06]`,children:[`automations`,`runs`].map(t=>(0,R.jsx)(`button`,{onClick:()=>C(t),"data-testid":`automations-tab-${t}`,className:s(`rounded-[10px] px-2.5 py-1 text-[12px] font-medium transition-colors`,y===t?`bg-white text-gray-900 shadow-sm dark:bg-dark-200 dark:text-dark-900`:`text-gray-500 hover:text-gray-800 dark:text-dark-500 dark:hover:text-dark-800`),children:e(`automations.tab.${t}`)},t))})]}),(0,R.jsxs)(T,{size:`sm`,onClick:re,"data-testid":`automation-new`,className:`h-7 gap-1 px-2.5 text-[12px]`,children:[(0,R.jsx)(p,{className:`h-3.5 w-3.5`}),e(`automations.newAutomation`)]})]}),(0,R.jsxs)(`div`,{className:`scroll-region min-h-0 flex-1 overflow-y-auto px-4 py-4 scrollbar-thin`,children:[y===`automations`?N?null:E.length===0?(0,R.jsxs)(`div`,{className:`px-3 py-16 text-center`,children:[(0,R.jsx)(S,{className:`mx-auto mb-2 h-6 w-6 text-gray-300 dark:text-dark-400`}),(0,R.jsx)(`p`,{className:`text-sm text-gray-400 dark:text-dark-500`,children:e(`automations.empty`)})]}):(0,R.jsx)(`div`,{className:`mx-auto w-full max-w-3xl space-y-2`,children:E.map(n=>(0,R.jsx)(`div`,{"data-testid":`automation-row`,className:`rounded-2xl border border-black/[0.06] bg-white/60 px-4 py-3 dark:border-white/[0.07] dark:bg-dark-100/60`,children:(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,R.jsxs)(`div`,{className:`min-w-0`,children:[(0,R.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,R.jsx)(`p`,{className:`truncate text-[14px] font-medium text-gray-900 dark:text-dark-900`,children:n.name}),(0,R.jsx)(`span`,{className:s(`rounded-full px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide`,n.status===`active`?`bg-emerald-500/10 text-emerald-600 dark:text-emerald-400`:`bg-gray-500/10 text-gray-500 dark:text-dark-500`),children:e(`automations.status.${n.status}`)})]}),(0,R.jsxs)(`p`,{className:`mt-0.5 truncate text-[12px] text-gray-500 dark:text-dark-500`,children:[I(n.triggers,t.language,e),n.nextRunAt&&(0,R.jsxs)(R.Fragment,{children:[` · `,e(`automations.nextRun`,{when:new Intl.DateTimeFormat(t.language,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}).format(n.nextRunAt)})]})]})]}),(0,R.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,R.jsx)(`button`,{onClick:()=>K(e=>e===n.id?null:n.id),"aria-label":e(`automations.actions`),"data-testid":`automation-menu`,className:`rounded-lg p-1.5 text-gray-400 transition-colors hover:bg-black/[0.04] hover:text-gray-700 dark:hover:bg-white/[0.06] dark:hover:text-dark-800`,children:(0,R.jsx)(g,{className:`h-4 w-4`})}),G===n.id&&(0,R.jsxs)(`div`,{className:`absolute end-0 top-8 z-20 w-44 rounded-xl border border-black/[0.07] bg-white p-1 shadow-lg dark:border-white/[0.08] dark:bg-dark-100`,children:[(0,R.jsx)(Z,{icon:ee,label:e(`common.edit`),onClick:()=>ae(n)}),n.status===`active`?(0,R.jsx)(Z,{icon:x,label:e(`automations.pause`),onClick:()=>$(n,`pause`)}):(0,R.jsx)(Z,{icon:f,label:e(`automations.resume`),onClick:()=>$(n,`resume`)}),(0,R.jsx)(Z,{icon:b,label:e(`automations.runNow`),onClick:()=>$(n,`run`)}),(0,R.jsx)(Z,{icon:m,label:e(`common.delete`),destructive:!0,onClick:()=>$(n,`delete`)})]})]})]})},n.id))}):null,y===`automations`&&!N&&(0,R.jsxs)(`div`,{className:`mx-auto mt-8 w-full max-w-3xl`,children:[(0,R.jsx)(`p`,{className:`mb-2 text-[11px] font-medium uppercase tracking-wide text-gray-400 dark:text-dark-500`,children:e(`automations.templatesTitle`)}),(0,R.jsx)(`div`,{className:`grid gap-2 sm:grid-cols-2`,children:ne.map(n=>(0,R.jsxs)(`button`,{type:`button`,onClick:()=>ie(n),"data-testid":`automation-template`,className:`rounded-2xl border border-black/[0.06] bg-white/40 px-4 py-3 text-start transition-colors hover:bg-white/80 dark:border-white/[0.07] dark:bg-dark-100/40 dark:hover:bg-dark-100/80`,children:[(0,R.jsx)(`p`,{className:`text-[13px] font-medium text-gray-900 dark:text-dark-900`,children:e(`automations.templates.${n.id}.name`)}),(0,R.jsx)(`p`,{className:`mt-0.5 text-[12px] text-gray-500 dark:text-dark-500`,children:e(`automations.templates.${n.id}.description`)}),(0,R.jsx)(`p`,{className:`mt-1.5 text-[11px] text-gray-400 dark:text-dark-500`,children:I(n.triggers,t.language,e)})]},n.id))})]}),y===`runs`&&(0,R.jsxs)(`div`,{className:`mx-auto w-full max-w-3xl space-y-4`,children:[j&&(0,R.jsx)(te,{days:j.days,locale:t.language}),O.length===0?(0,R.jsxs)(`div`,{className:`px-3 py-12 text-center`,children:[(0,R.jsx)(l,{className:`mx-auto mb-2 h-6 w-6 text-gray-300 dark:text-dark-400`}),(0,R.jsx)(`p`,{className:`text-sm text-gray-400 dark:text-dark-500`,children:e(`automations.noRuns`)})]}):(0,R.jsx)(`div`,{className:`space-y-1`,"data-testid":`automation-run-list`,children:O.map(r=>(0,R.jsxs)(`div`,{className:`flex items-center gap-3 rounded-xl border border-black/[0.05] bg-white/50 px-3 py-2 dark:border-white/[0.06] dark:bg-dark-100/50`,children:[se(r),(0,R.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,R.jsx)(`p`,{className:`truncate text-[13px] text-gray-900 dark:text-dark-900`,children:ce(r.automationId)}),(0,R.jsxs)(`p`,{className:`truncate text-[11px] text-gray-400 dark:text-dark-500`,children:[o(r.scheduledFor,t.language),r.error&&(0,R.jsxs)(R.Fragment,{children:[` · `,(0,R.jsx)(`span`,{className:`text-red-500`,children:r.error})]})]})]}),r.sessionId&&(0,R.jsx)(`button`,{onClick:()=>n(`/c/${r.sessionId}`),"data-testid":`automation-run-open`,className:`shrink-0 rounded-lg px-2.5 py-1 text-[12px] font-medium text-primary-600 transition-colors hover:bg-primary-500/10 dark:text-primary-400`,children:e(`automations.openChat`)})]},r.id))})]})]}),(0,R.jsx)(q,{open:F,automation:z,initial:V,models:r,saving:U,onClose:()=>L(!1),onSave:e=>void oe(e)})]})};function Z({icon:e,label:t,destructive:n,onClick:r}){return(0,R.jsxs)(`button`,{onClick:r,className:s(`flex w-full items-center gap-2 rounded-lg px-2.5 py-1.5 text-start text-[13px] transition-colors`,n?`text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20`:`text-gray-700 hover:bg-black/[0.04] dark:text-dark-700 dark:hover:bg-white/[0.06]`),children:[(0,R.jsx)(e,{className:`h-3.5 w-3.5`}),t]})}export{X as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{_ as t,g as n}from"./markdown-core-BK7WVOb7.js";import{n as r}from"./react-vendor-BG_HPV6X.js";import{f as i}from"./router-vendor-CbexJIsv.js";import{t as a}from"./useTranslation-5b5UhAc9.js";import{t as o}from"./utils-BGrdX9ie.js";import{L as s,Ln as c,Rn as l,X as u,_ as d,_n as f,f as p,fr as m,n as h}from"./ui-vendor-C0DZ8-Cm.js";import{t as g}from"./logger-DSXjF4ye.js";import{D as _,w as v}from"./api-D7Ff5M2Q.js";import{t as y}from"./Button-C0r3J9G_.js";import"./ui-db9meqAB.js";import{C as b}from"../assets/index-DBAf_VaS.js";import{a as x,c as S,d as C,i as w,l as T,n as E,o as D,r as O,s as k,t as A,u as j}from"./calendarDates-Co3o_05Y.js";var M=e(t(),1),N=n(),P={event:`bg-primary-500/15 text-primary-700 hover:bg-primary-500/25 dark:text-primary-300`,automation:`bg-amber-500/15 text-amber-700 hover:bg-amber-500/25 dark:text-amber-300`,runSucceeded:`bg-emerald-500/15 text-emerald-700 hover:bg-emerald-500/25 dark:text-emerald-300`,runFailed:`bg-red-500/15 text-red-700 hover:bg-red-500/25 dark:text-red-300`};function F({event:e,label:t,onClick:n}){return(0,N.jsx)(`button`,{type:`button`,"data-testid":`calendar-event-chip`,"data-variant":e.variant??`event`,title:e.title,onClick:e=>{e.stopPropagation(),n()},className:o(`w-full truncate rounded-md px-1.5 py-0.5 text-start text-[11px] leading-4 transition-colors`,P[e.variant??`event`],e.baseEventId&&`opacity-75`),children:t})}var I=3;function L({year:e,monthIndex:t,events:n,onDayClick:r,onEventClick:i}){let{t:s,i18n:c}=a(),l=(0,M.useMemo)(()=>O(e,t),[e,t]),u=new Date,d=(0,M.useMemo)(()=>{let e=new Map;for(let t of n){let n=new Date(t.startAt),r=`${n.getFullYear()}-${n.getMonth()}-${n.getDate()}`,i=e.get(r);i?i.push(t):e.set(r,[t])}return e},[n]),f=(0,M.useMemo)(()=>C(c.language),[c.language]);return(0,N.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col`,"data-testid":`calendar-month-grid`,children:[(0,N.jsx)(`div`,{className:`grid grid-cols-7 border-b border-black/[0.06] dark:border-white/[0.07]`,children:f.map(e=>(0,N.jsx)(`div`,{className:`px-2 py-1.5 text-center text-[11px] font-medium uppercase tracking-wide text-gray-400 dark:text-dark-500`,children:e},e))}),(0,N.jsx)(`div`,{className:`grid min-h-0 flex-1 grid-cols-7 grid-rows-6`,children:l.map(e=>{let n=e.getMonth()===t,a=w(e,u),l=`${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`,f=d.get(l)??[],p=f.length-I;return(0,N.jsxs)(`div`,{role:`gridcell`,"data-testid":`calendar-day-cell`,onClick:()=>r(e),className:o(`flex min-h-0 cursor-pointer flex-col gap-0.5 border-b border-e border-black/[0.04] p-1 transition-colors hover:bg-black/[0.02] dark:border-white/[0.04] dark:hover:bg-white/[0.03]`,!n&&`opacity-40`),children:[(0,N.jsx)(`span`,{className:o(`flex h-6 w-6 items-center justify-center rounded-full text-[12px]`,a?`bg-primary-500 font-semibold text-white`:`text-gray-600 dark:text-dark-600`),children:e.getDate()}),(0,N.jsxs)(`div`,{className:`flex min-h-0 flex-col gap-0.5 overflow-hidden`,children:[f.slice(0,I).map(e=>(0,N.jsx)(F,{event:e,label:e.allDay?e.title:`${k(e.startAt,c.language)} ${e.title}`,onClick:()=>i(e)},e.id)),p>0&&(0,N.jsx)(`span`,{className:`px-1 text-[10px] text-gray-400 dark:text-dark-500`,children:s(`calendar.more`,{n:p})})]})]},l)})})]})}var R=48;function ee({anchor:e,events:t,dayCount:n=7,onDayClick:r,onEventClick:i}){let{i18n:s}=a(),c=(0,M.useMemo)(()=>n===1?[new Date(e.getFullYear(),e.getMonth(),e.getDate())]:j(e),[e,n]),l=new Date,u=(0,M.useMemo)(()=>new Intl.DateTimeFormat(s.language,{hour:`numeric`}),[s.language]),d=(0,M.useMemo)(()=>new Intl.DateTimeFormat(s.language,{weekday:`short`,day:`numeric`}),[s.language]),f=e=>t.filter(t=>t.allDay&&w(new Date(t.startAt),e)),p=e=>t.filter(t=>!t.allDay&&w(new Date(t.startAt),e));return(0,N.jsx)(`div`,{className:`scroll-region min-h-0 flex-1 overflow-y-auto scrollbar-thin`,"data-testid":`calendar-week-grid`,children:(0,N.jsxs)(`div`,{className:`grid grid-cols-[3.5rem_repeat(7,1fr)]`,children:[(0,N.jsx)(`div`,{className:`sticky top-0 z-10 border-b border-black/[0.06] bg-surface dark:border-white/[0.07]`}),c.map(e=>(0,N.jsxs)(`div`,{className:`sticky top-0 z-10 border-b border-e border-black/[0.06] bg-surface px-1 py-1.5 dark:border-white/[0.07]`,children:[(0,N.jsx)(`span`,{className:o(`block truncate text-center text-[11px] font-medium`,w(e,l)?`text-primary-600 dark:text-primary-400`:`text-gray-500 dark:text-dark-500`),children:d.format(e)}),(0,N.jsx)(`div`,{className:`mt-0.5 space-y-0.5`,children:f(e).map(e=>(0,N.jsx)(F,{event:e,label:e.title,onClick:()=>i(e)},e.id))})]},e.toISOString())),Array.from({length:24},(e,t)=>(0,N.jsxs)(M.Fragment,{children:[(0,N.jsx)(`div`,{className:`relative border-b border-black/[0.04] pe-1.5 text-end text-[10px] text-gray-400 dark:border-white/[0.04] dark:text-dark-500`,children:(0,N.jsx)(`span`,{className:`relative -top-1.5`,children:t>0?u.format(new Date(2024,0,1,t)):``})}),c.map(e=>{let n=p(e).filter(e=>new Date(e.startAt).getHours()===t);return(0,N.jsx)(`div`,{onClick:()=>r(e,t),style:{height:R},className:`cursor-pointer space-y-0.5 overflow-hidden border-b border-e border-black/[0.04] p-0.5 transition-colors hover:bg-black/[0.02] dark:border-white/[0.04] dark:hover:bg-white/[0.03]`,children:n.map(e=>(0,N.jsx)(F,{event:e,label:`${k(e.startAt,s.language)} ${e.title}`,onClick:()=>i(e)},e.id))},`${e.toISOString()}-${t}`)})]},t))]})})}var z=r(),B=e=>!e||e.kind===`once`||e.kind===`hourly`?`none`:e.kind,V=(e,t)=>{let n=new Date(t),r=n.getHours(),i=n.getMinutes();switch(e){case`daily`:return{kind:`daily`,hour:r,minute:i};case`weekly`:return{kind:`weekly`,dayOfWeek:n.getDay(),hour:r,minute:i};case`monthly`:return{kind:`monthly`,dayOfMonth:n.getDate(),hour:r,minute:i};case`yearly`:return{kind:`yearly`,month:n.getMonth()+1,dayOfMonth:n.getDate(),hour:r,minute:i};default:return null}},H=`w-full rounded-lg border border-black/[0.08] bg-white px-2.5 py-1.5 text-[13px] text-gray-900 focus:border-primary-500/40 focus:outline-none dark:border-white/[0.08] dark:bg-dark-100 dark:text-dark-900`,U=`mb-1 block text-[11px] font-medium uppercase tracking-wide text-gray-400 dark:text-dark-500`;function te({open:e,event:t,initialStartAt:n,calendars:r,saving:i,onClose:a,onSave:o,onDelete:s}){return e?(0,N.jsx)(W,{event:t,initialStartAt:n,calendars:r,saving:i,onClose:a,onSave:o,onDelete:s},`${t?.id??`new`}:${n}`):null}function W({event:e,initialStartAt:t,calendars:n,saving:r,onClose:i,onSave:o,onDelete:s}){let{t:c}=a(),l=e?.startAt??t,[u,f]=(0,M.useState)(e?.title??``),[p,m]=(0,M.useState)(e?.notes??``),[g,_]=(0,M.useState)(S(l)),[v,y]=(0,M.useState)(e?T(l):`09:00`),[b,x]=(0,M.useState)(e?.endAt===void 0?``:T(e.endAt)),[C,w]=(0,M.useState)(e?.allDay??!1),[D,O]=(0,M.useState)(B(e?.recurrence)),[k,A]=(0,M.useState)(e?.calendarId??``),[j,P]=(0,M.useState)(e?.reminderMinutes===void 0?``:String(e.reminderMinutes)),F=()=>{if(!u.trim()||!g)return;let e=E(g,C?``:v),t=!C&&b?E(g,b):null;o({title:u.trim(),notes:p.trim()?p.trim():void 0,startAt:e,endAt:t!==null&&t>e?t:null,allDay:C,recurrence:V(D,e),calendarId:k||null,reminderMinutes:j?Number(j):null})},I=[{value:``,label:c(`calendar.reminderNone`)},{value:`5`,label:c(`calendar.reminderMinutes`,{minutes:5})},{value:`15`,label:c(`calendar.reminderMinutes`,{minutes:15})},{value:`30`,label:c(`calendar.reminderMinutes`,{minutes:30})},{value:`60`,label:c(`calendar.reminderHour`)},{value:`1440`,label:c(`calendar.reminderDay`)}],L=[{value:`none`,label:c(`calendar.repeatNone`)},{value:`daily`,label:c(`calendar.repeatDaily`)},{value:`weekly`,label:c(`calendar.repeatWeekly`)},{value:`monthly`,label:c(`calendar.repeatMonthly`)},{value:`yearly`,label:c(`calendar.repeatYearly`)}];return(0,z.createPortal)((0,N.jsx)(`div`,{className:`fixed inset-0 z-[2147483647] flex items-center justify-center bg-gray-950/55 p-4 backdrop-blur-md`,onClick:i,children:(0,N.jsxs)(`div`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`calendar-event-modal-title`,"data-testid":`calendar-event-modal`,className:`w-full max-w-md rounded-3xl border border-black/[0.07] bg-white p-6 shadow-[0_24px_80px_rgba(0,0,0,0.24)] animate-scale-in dark:border-white/[0.08] dark:bg-dark-25`,onClick:e=>e.stopPropagation(),children:[(0,N.jsxs)(`div`,{className:`mb-4 flex items-center justify-between`,children:[(0,N.jsx)(`h3`,{id:`calendar-event-modal-title`,className:`text-lg font-medium tracking-[-0.02em] text-gray-950 dark:text-dark-950`,children:c(e?`calendar.editEvent`:`calendar.newEvent`)}),(0,N.jsx)(`button`,{onClick:i,"aria-label":c(`common.close`),className:`rounded-xl p-2 transition-colors hover:bg-gray-100 dark:hover:bg-dark-200`,children:(0,N.jsx)(h,{size:20,className:`text-gray-500`})})]}),(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{htmlFor:`calendar-event-title`,className:U,children:c(`calendar.eventTitle`)}),(0,N.jsx)(`input`,{id:`calendar-event-title`,"data-testid":`calendar-event-title`,type:`text`,value:u,onChange:e=>f(e.target.value),placeholder:c(`calendar.titlePlaceholder`),className:H,maxLength:200,autoFocus:!0})]}),(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{htmlFor:`calendar-event-date`,className:U,children:c(`calendar.date`)}),(0,N.jsx)(`input`,{id:`calendar-event-date`,type:`date`,value:g,onChange:e=>_(e.target.value),className:H})]}),(0,N.jsx)(`div`,{className:`flex items-end pb-1.5`,children:(0,N.jsxs)(`label`,{className:`flex items-center gap-2 text-[13px] text-gray-700 dark:text-dark-700`,children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:C,onChange:e=>w(e.target.checked),className:`h-4 w-4 rounded accent-primary-500`}),c(`calendar.allDay`)]})})]}),!C&&(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{htmlFor:`calendar-event-start`,className:U,children:c(`calendar.start`)}),(0,N.jsx)(`input`,{id:`calendar-event-start`,type:`time`,value:v,onChange:e=>y(e.target.value),className:H})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{htmlFor:`calendar-event-end`,className:U,children:c(`calendar.end`)}),(0,N.jsx)(`input`,{id:`calendar-event-end`,type:`time`,value:b,onChange:e=>x(e.target.value),className:H})]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{htmlFor:`calendar-event-repeat`,className:U,children:c(`calendar.repeat`)}),(0,N.jsx)(`select`,{id:`calendar-event-repeat`,value:D,onChange:e=>O(e.target.value),className:H,children:L.map(e=>(0,N.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{htmlFor:`calendar-event-notes`,className:U,children:c(`calendar.notes`)}),(0,N.jsx)(`textarea`,{id:`calendar-event-notes`,value:p,onChange:e=>m(e.target.value),rows:3,className:H,maxLength:1e4})]}),(0,N.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:U,children:c(`calendar.calendarLabel`)}),(0,N.jsxs)(`select`,{value:k,onChange:e=>A(e.target.value),className:H,"data-testid":`calendar-event-calendar`,children:[(0,N.jsx)(`option`,{value:``,children:c(`calendar.personalCalendar`)}),n.map(e=>(0,N.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:U,children:c(`calendar.reminderLabel`)}),(0,N.jsx)(`select`,{value:j,onChange:e=>P(e.target.value),className:H,"data-testid":`calendar-event-reminder`,children:I.map(e=>(0,N.jsx)(`option`,{value:e.value,children:e.label},e.value))})]})]}),(0,N.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-gray-200 pt-4 dark:border-dark-300`,children:[e&&s?(0,N.jsxs)(`button`,{onClick:s,"data-testid":`calendar-event-delete`,className:`flex items-center gap-1.5 rounded-xl px-3 py-2 text-sm font-medium text-red-600 transition-colors hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20`,children:[(0,N.jsx)(d,{className:`h-4 w-4`}),c(`common.delete`)]}):(0,N.jsx)(`span`,{}),(0,N.jsxs)(`div`,{className:`flex gap-3`,children:[(0,N.jsx)(`button`,{onClick:i,className:`rounded-xl px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-100 dark:text-dark-700 dark:hover:bg-dark-200`,children:c(`common.cancel`)}),(0,N.jsx)(`button`,{onClick:F,disabled:r||!u.trim(),"data-testid":`calendar-event-save`,className:`rounded-xl bg-gray-950 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-gray-800 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-white dark:text-gray-950 dark:hover:bg-gray-100`,children:c(r?`common.saving`:`common.save`)})]})]})]})]})}),document.body)}var G=g(`pages:calendar`),K=()=>{let{t:e,i18n:t}=a(),n=i(),[r,d]=(0,M.useState)(`month`),[g,S]=(0,M.useState)(()=>new Date),[C,w]=(0,M.useState)([]),[T,E]=(0,M.useState)([]),[O,k]=(0,M.useState)(!1),[j,P]=(0,M.useState)(null),[F,I]=(0,M.useState)(()=>Date.now()),[R,z]=(0,M.useState)(!1),[B,V]=(0,M.useState)([]),[H,U]=(0,M.useState)(``),[W,K]=(0,M.useState)(null),q=M.useRef(null),J=(0,M.useMemo)(()=>{if(r===`month`){let e=new Date(g.getFullYear(),g.getMonth(),1),t=D(e);return{from:t.getTime(),to:A(t,42).getTime()}}if(r===`day`){let e=new Date(g.getFullYear(),g.getMonth(),g.getDate());return{from:e.getTime(),to:A(e,1).getTime()}}let e=D(g);return{from:e.getTime(),to:A(e,7).getTime()}},[g,r]),[Y,ne]=(0,M.useState)(0),X=(0,M.useCallback)(()=>ne(e=>e+1),[]);(0,M.useEffect)(()=>{_.getCalendars().then(e=>{e.success&&e.data&&V(e.data)}).catch(e=>G.error(`Failed to load calendars:`,e))},[Y]),(0,M.useEffect)(()=>{let t=!1;return _.getEvents(J.from,J.to).then(e=>{t||e.success&&e.data&&w(e.data)}).catch(n=>{t||(G.error(`Failed to load calendar events:`,n),m.error(e(`calendar.loadFailed`)))}),Promise.all([v.getOccurrences(J.from,J.to),v.getRuns({from:J.from,to:J.to}),v.getAutomations()]).then(([n,r,i])=>{if(t)return;let a=Date.now(),o=t=>i.data?.find(e=>e.id===t)?.name??e(`automations.deletedAutomation`),s=[];for(let e of n.data??[])e.at<=a||s.push({id:`automation:${e.automationId}:${e.at}`,title:e.name,startAt:e.at,allDay:!1,createdAt:e.at,updatedAt:e.at,variant:`automation`});for(let e of r.data??[])(e.status===`succeeded`||e.status===`failed`)&&s.push({id:`run:${e.id}`,title:o(e.automationId),startAt:e.scheduledFor,allDay:!1,createdAt:e.createdAt,updatedAt:e.createdAt,variant:e.status===`succeeded`?`runSucceeded`:`runFailed`,...e.sessionId?{sessionId:e.sessionId}:{}});E(s)}).catch(e=>{t||G.error(`Failed to project automations onto the calendar:`,e)}),()=>{t=!0}},[J.from,J.to,Y,e]);let Z=(0,M.useMemo)(()=>[...C,...T].sort((e,t)=>e.startAt-t.startAt),[C,T]),Q=e=>{S(t=>r===`month`?new Date(t.getFullYear(),t.getMonth()+e,1):A(t,e*(r===`day`?1:7)))},$=(e,t=9)=>{P(null),I(new Date(e.getFullYear(),e.getMonth(),e.getDate(),t,0).getTime()),k(!0)},re=t=>{if(t.variant===`runSucceeded`||t.variant===`runFailed`){t.sessionId?n(`/c/${t.sessionId}`):n(`/automations`);return}if(t.variant===`automation`){n(`/automations`);return}if(t.shared&&t.shared.permission!==`write`){m(e(`calendar.sharedReadOnly`));return}if(t.baseEventId){let e=C.find(e=>e.id===t.baseEventId);P(e??t)}else P(t);k(!0)},ie=async t=>{z(!0);try{let n=j?await _.updateEvent(j.id,t):await _.createEvent(t);n.success?(k(!1),X()):m.error(n.error||e(`calendar.saveFailed`))}catch(t){G.error(`Failed to save calendar event:`,t),m.error(e(`calendar.saveFailed`))}finally{z(!1)}},ae=async()=>{if(j){z(!0);try{let t=await _.deleteEvent(j.id);t.success?(k(!1),X()):m.error(t.error||e(`calendar.deleteFailed`))}catch(t){G.error(`Failed to delete calendar event:`,t),m.error(e(`calendar.deleteFailed`))}finally{z(!1)}}},oe=r===`month`?x(g.getFullYear(),g.getMonth(),t.language):new Intl.DateTimeFormat(t.language,{month:`long`,day:`numeric`,year:`numeric`}).format(r===`day`?g:D(g)),se=async()=>{let t=H.trim();t&&((await _.createCalendar({name:t}).catch(()=>void 0))?.success?(U(``),X()):m.error(e(`calendar.calendarSaveFailed`)))},ce=async t=>{try{let e=await _.exportIcs(t),n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`calendar.ics`,r.click(),URL.revokeObjectURL(n)}catch(t){G.error(`Failed to export the calendar:`,t),m.error(e(`calendar.exportFailed`))}},le=async t=>{try{let n=await t.text(),r=await _.importIcs(n);r.success&&r.data?(m.success(e(`calendar.importResult`,{total:r.data.imported})),X()):m.error(r.error||e(`calendar.importFailed`))}catch(t){G.error(`Failed to import the calendar:`,t),m.error(e(`calendar.importFailed`))}};return(0,N.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col overflow-hidden`,"data-testid":`calendar-page`,children:[(0,N.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 border-b border-black/[0.06] px-4 py-3 dark:border-white/[0.07]`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(`h1`,{className:`text-sm font-semibold text-gray-900 dark:text-dark-900`,children:e(`calendar.title`)}),(0,N.jsx)(`span`,{className:`text-sm text-gray-500 dark:text-dark-500`,"data-testid":`calendar-range-label`,children:oe})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(`div`,{className:`flex items-center rounded-xl bg-black/[0.04] p-0.5 dark:bg-white/[0.06]`,children:[`month`,`week`,`day`].map(t=>(0,N.jsx)(`button`,{onClick:()=>d(t),"data-testid":`calendar-view-${t}`,className:o(`rounded-[10px] px-2.5 py-1 text-[12px] font-medium transition-colors`,r===t?`bg-white text-gray-900 shadow-sm dark:bg-dark-200 dark:text-dark-900`:`text-gray-500 hover:text-gray-800 dark:text-dark-500 dark:hover:text-dark-800`),children:e(`calendar.${t}`)},t))}),(0,N.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,N.jsx)(y,{size:`sm`,variant:`ghost`,onClick:()=>Q(-1),className:`h-7 w-7 p-0`,title:e(`calendar.previous`),children:(0,N.jsx)(l,{className:`h-4 w-4`})}),(0,N.jsx)(y,{size:`sm`,variant:`ghost`,onClick:()=>S(new Date),className:`h-7 px-2 text-[12px]`,children:e(`calendar.today`)}),(0,N.jsx)(y,{size:`sm`,variant:`ghost`,onClick:()=>Q(1),className:`h-7 w-7 p-0`,title:e(`calendar.next`),children:(0,N.jsx)(c,{className:`h-4 w-4`})})]}),(0,N.jsxs)(y,{size:`sm`,onClick:()=>$(g),"data-testid":`calendar-new-event`,className:`h-7 gap-1 px-2.5 text-[12px]`,children:[(0,N.jsx)(u,{className:`h-3.5 w-3.5`}),e(`calendar.newEvent`)]})]})]}),(0,N.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 border-b border-black/[0.06] px-4 py-2 dark:border-white/[0.07]`,children:[B.map(t=>(0,N.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 rounded-full border border-black/[0.08] px-2.5 py-1 text-xs text-gray-700 dark:border-white/[0.1] dark:text-dark-800`,"data-testid":`calendar-chip`,children:[(0,N.jsx)(`span`,{className:`h-2 w-2 rounded-full`,style:{backgroundColor:t.color??`#8b8b8b`}}),t.name,t.shared?(0,N.jsx)(`span`,{className:`text-[10px] uppercase text-gray-400 dark:text-dark-500`,children:e(`calendar.sharedBadge`)}):(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)(`button`,{onClick:()=>K(t),className:`text-gray-400 hover:text-primary-500 dark:text-dark-500`,title:e(`calendar.shareCalendar`),"data-testid":`calendar-share`,children:(0,N.jsx)(s,{className:`h-3 w-3`})}),(0,N.jsx)(`button`,{onClick:()=>void _.deleteCalendar(t.id).then(X),className:`text-gray-400 hover:text-red-500 dark:text-dark-500`,title:e(`common.delete`),children:(0,N.jsx)(h,{className:`h-3 w-3`})})]})]},t.id)),(0,N.jsx)(`input`,{type:`text`,value:H,onChange:e=>U(e.target.value),onKeyDown:e=>{e.key===`Enter`&&se()},placeholder:e(`calendar.newCalendarPlaceholder`),className:`w-36 rounded-full border border-dashed border-black/[0.12] bg-transparent px-2.5 py-1 text-xs text-gray-700 placeholder:text-gray-400 focus:outline-none dark:border-white/[0.16] dark:text-dark-800`,"data-testid":`calendar-new-calendar`}),(0,N.jsxs)(`div`,{className:`ms-auto flex items-center gap-1`,children:[(0,N.jsx)(`input`,{ref:q,type:`file`,accept:`.ics,text/calendar`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&le(t),e.target.value=``}}),(0,N.jsxs)(y,{size:`sm`,variant:`ghost`,onClick:()=>q.current?.click(),className:`h-7 gap-1 px-2 text-[12px]`,"data-testid":`calendar-import`,children:[(0,N.jsx)(p,{className:`h-3.5 w-3.5`}),e(`calendar.importIcs`)]}),(0,N.jsxs)(y,{size:`sm`,variant:`ghost`,onClick:()=>void ce(),className:`h-7 gap-1 px-2 text-[12px]`,"data-testid":`calendar-export`,children:[(0,N.jsx)(f,{className:`h-3.5 w-3.5`}),e(`calendar.exportIcs`)]})]})]}),r===`month`?(0,N.jsx)(L,{year:g.getFullYear(),monthIndex:g.getMonth(),events:Z,onDayClick:e=>$(e),onEventClick:re}):(0,N.jsx)(ee,{anchor:g,events:Z,dayCount:r===`day`?1:7,onDayClick:(e,t)=>$(e,t),onEventClick:re}),W&&(0,N.jsx)(b,{resourceType:`calendar`,resourceId:W.id,resourceLabel:W.name,onClose:()=>K(null)}),(0,N.jsx)(te,{open:O,event:j,initialStartAt:F,calendars:B.filter(e=>!e.shared||e.shared.permission===`write`),saving:R,onClose:()=>k(!1),onSave:e=>void ie(e),onDelete:()=>void ae()})]})};export{K as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{_ as t,g as n}from"./markdown-core-BK7WVOb7.js";import{i as r}from"./router-vendor-CbexJIsv.js";import{t as i}from"./useTranslation-5b5UhAc9.js";import{r as a,t as o}from"./utils-BGrdX9ie.js";import{t as s}from"./chatStore-D-NTlArO.js";import{$ as c,B as l,Bn as u,Bt as d,Et as f,Ot as p,Sn as m,V as h,X as g,Zn as ee,_ as te,ar as ne,bt as re,dn as _,fr as v,it as y,n as b,s as x,tt as ie,xt as S}from"./ui-vendor-C0DZ8-Cm.js";import{t as C}from"./logger-DSXjF4ye.js";import{E as w}from"./api-D7Ff5M2Q.js";import{n as ae}from"./authStore-BYW8-kP6.js";import{t as T}from"./Button-C0r3J9G_.js";import{i as E,n as D,r as O}from"./ui-db9meqAB.js";import{S as oe}from"../assets/index-DBAf_VaS.js";var k=e(t(),1),A=n(),j=[`👍`,`🎉`,`❤️`,`😄`,`👀`,`🚀`],M=({message:e,currentUserId:t,canModerate:n,actions:r,compact:s=!1})=>{let{t:l,i18n:d}=i(),[f,m]=(0,k.useState)(!1),[h,g]=(0,k.useState)(e.content),[ne,v]=(0,k.useState)(!1),x=e.authorKind===`model`,S=!x&&e.author?.userId===t&&!e.deleted,C=x?e.model??l(`channels.modelAuthor`):e.author?.username??l(`channels.unknownAuthor`);return(0,A.jsxs)(`div`,{className:o(`group relative rounded-xl px-2.5 py-1.5 hover:bg-black/[0.025] dark:hover:bg-white/[0.03]`,s&&`px-2 py-1`),"data-testid":`channel-message`,children:[(0,A.jsxs)(`div`,{className:`flex items-baseline gap-2`,children:[x&&(0,A.jsx)(ee,{className:`h-3.5 w-3.5 shrink-0 self-center text-primary-500`}),(0,A.jsx)(`span`,{className:o(`shrink-0 text-[13px] font-semibold`,x?`text-primary-600 dark:text-primary-400`:`text-gray-900 dark:text-dark-900`),children:C}),(0,A.jsx)(`span`,{className:`shrink-0 text-[11px] text-gray-400 dark:text-dark-500`,children:a(e.createdAt,d.language)}),e.editedAt&&!e.deleted&&(0,A.jsx)(`span`,{className:`shrink-0 text-[10px] text-gray-400 dark:text-dark-500`,children:l(`channels.edited`)}),e.pinnedAt&&(0,A.jsx)(c,{className:`h-3 w-3 shrink-0 text-amber-500`})]}),e.deleted?(0,A.jsx)(`p`,{className:`text-[13px] italic text-gray-400 dark:text-dark-500`,children:l(`channels.deletedMessage`)}):f?(0,A.jsxs)(`div`,{className:`mt-1 flex items-end gap-1.5`,children:[(0,A.jsx)(`textarea`,{value:h,onChange:e=>g(e.target.value),rows:2,className:`min-w-0 flex-1 resize-none rounded-lg border border-black/[0.08] bg-transparent px-2 py-1 text-[13px] focus:outline-none dark:border-white/[0.1] dark:text-dark-900`,"data-testid":`channel-message-edit`}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>{r.onEdit(e,h),m(!1)},className:`rounded-md p-1.5 text-emerald-600 hover:bg-emerald-50 dark:hover:bg-emerald-900/20`,children:(0,A.jsx)(u,{className:`h-3.5 w-3.5`})}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>m(!1),className:`rounded-md p-1.5 text-gray-400 hover:bg-black/[0.04] dark:hover:bg-white/[0.06]`,children:(0,A.jsx)(b,{className:`h-3.5 w-3.5`})})]}):(0,A.jsxs)(A.Fragment,{children:[e.pending?(0,A.jsxs)(`p`,{className:`flex items-center gap-1.5 text-[13px] text-gray-400 dark:text-dark-500`,children:[(0,A.jsx)(p,{className:`h-3.5 w-3.5 animate-spin`}),l(`channels.modelThinking`)]}):e.error?(0,A.jsx)(`p`,{className:`text-[13px] text-red-500`,children:e.error}):(0,A.jsx)(`p`,{className:`whitespace-pre-wrap break-words text-[13px] leading-relaxed text-gray-800 dark:text-dark-800`,children:e.content}),(e.attachments?.length??0)>0&&(0,A.jsx)(`div`,{className:`mt-1 space-y-1`,children:e.attachments.map(e=>(0,A.jsxs)(`button`,{type:`button`,onClick:()=>void r.onDownload(e.id,e.filename),className:`flex items-center gap-1.5 rounded-lg border border-black/[0.06] px-2 py-1 text-[12px] text-gray-600 hover:bg-black/[0.03] dark:border-white/[0.08] dark:text-dark-700 dark:hover:bg-white/[0.04]`,"data-testid":`channel-attachment`,children:[(0,A.jsx)(y,{className:`h-3 w-3`}),(0,A.jsx)(`span`,{className:`min-w-0 truncate`,children:e.filename})]},e.id))})]}),(e.reactions?.length??0)>0&&(0,A.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:e.reactions.map(t=>(0,A.jsxs)(`button`,{type:`button`,onClick:()=>void r.onReact(e,t.emoji,t.mine),className:o(`rounded-full border px-1.5 py-0.5 text-[11px]`,t.mine?`border-primary-400/50 bg-primary-500/10 text-primary-600 dark:text-primary-400`:`border-black/[0.08] text-gray-600 hover:bg-black/[0.03] dark:border-white/[0.1] dark:text-dark-700`),"data-testid":`channel-reaction`,children:[t.emoji,` `,t.count]},t.emoji))}),!s&&(e.replyCount??0)>0&&r.onReply&&(0,A.jsxs)(`button`,{type:`button`,onClick:()=>r.onReply(e),className:`mt-1 flex items-center gap-1 text-[11px] font-medium text-primary-600 hover:underline dark:text-primary-400`,"data-testid":`channel-reply-count`,children:[(0,A.jsx)(re,{className:`h-3 w-3`}),l(`channels.replyCount`,{total:e.replyCount})]}),!e.deleted&&!f&&(0,A.jsxs)(`div`,{className:`absolute -top-2.5 right-2 hidden items-center gap-0.5 rounded-lg border border-black/[0.08] bg-white px-1 py-0.5 shadow-sm group-hover:flex dark:border-white/[0.1] dark:bg-dark-50`,children:[(0,A.jsxs)(`div`,{className:`relative`,children:[(0,A.jsx)(`button`,{type:`button`,onClick:()=>v(e=>!e),className:`rounded p-1 text-gray-400 hover:text-gray-700 dark:hover:text-dark-800`,title:l(`channels.react`),"data-testid":`channel-react`,children:(0,A.jsx)(_,{className:`h-3.5 w-3.5`})}),ne&&(0,A.jsx)(`div`,{className:`absolute right-0 top-6 z-10 flex gap-0.5 rounded-lg border border-black/[0.08] bg-white p-1 shadow-md dark:border-white/[0.1] dark:bg-dark-50`,children:j.map(t=>(0,A.jsx)(`button`,{type:`button`,onClick:()=>{let n=!!e.reactions?.find(e=>e.emoji===t)?.mine;r.onReact(e,t,n),v(!1)},className:`rounded p-0.5 text-sm hover:bg-black/[0.05] dark:hover:bg-white/[0.08]`,children:t},t))})]}),r.onReply&&!e.parentId&&(0,A.jsx)(`button`,{type:`button`,onClick:()=>r.onReply(e),className:`rounded p-1 text-gray-400 hover:text-gray-700 dark:hover:text-dark-800`,title:l(`channels.reply`),"data-testid":`channel-reply`,children:(0,A.jsx)(re,{className:`h-3.5 w-3.5`})}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>void r.onPin(e),className:`rounded p-1 text-gray-400 hover:text-amber-500`,title:e.pinnedAt?l(`channels.unpin`):l(`channels.pin`),"data-testid":`channel-pin`,children:(0,A.jsx)(c,{className:`h-3.5 w-3.5`})}),S&&(0,A.jsx)(`button`,{type:`button`,onClick:()=>{g(e.content),m(!0)},className:`rounded p-1 text-gray-400 hover:text-gray-700 dark:hover:text-dark-800`,title:l(`channels.edit`),"data-testid":`channel-edit`,children:(0,A.jsx)(ie,{className:`h-3.5 w-3.5`})}),(S||n)&&(0,A.jsx)(`button`,{type:`button`,onClick:()=>void r.onDelete(e),className:`rounded p-1 text-gray-400 hover:text-red-500`,title:l(`channels.deleteMessage`),"data-testid":`channel-delete-message`,children:(0,A.jsx)(te,{className:`h-3.5 w-3.5`})})]})]})},N=C(`pages:channels`),se=e=>e.type===`dm`?(0,A.jsx)(S,{className:`h-3.5 w-3.5 shrink-0`}):e.type===`private`?(0,A.jsx)(f,{className:`h-3.5 w-3.5 shrink-0`}):(0,A.jsx)(d,{className:`h-3.5 w-3.5 shrink-0`}),ce=e=>e.type===`dm`?e.dmPeer?.username??`…`:e.name,le=()=>{let{t:e}=i(),t=ae(e=>e.user),n=s(e=>e.models),[a,u]=(0,k.useState)([]),[d,f]=(0,k.useState)(null),[te,_]=(0,k.useState)(!1),[ie,C]=(0,k.useState)(!0),[E,D]=(0,k.useState)(null),[O,j]=(0,k.useState)(null),[le,P]=(0,k.useState)([]),[me,he]=(0,k.useState)([]),[F,I]=(0,k.useState)(null),[L,R]=(0,k.useState)(null),[ge,z]=(0,k.useState)([]),[B,V]=(0,k.useState)(``),[H,_e]=(0,k.useState)(``),[U,ve]=(0,k.useState)(!1),[W,ye]=(0,k.useState)(null),[be,xe]=(0,k.useState)(!1),[Se,Ce]=(0,k.useState)(!1),[G,we]=(0,k.useState)(``),[Te,K]=(0,k.useState)(!1),Ee=(0,k.useRef)(null),De=(0,k.useRef)(null),[Oe,ke]=r(),q=(0,k.useMemo)(()=>a.find(e=>e.id===E)??null,[a,E]),[Ae,je]=(0,k.useState)(null);E!==Ae&&(je(E),j(null),R(null),I(null));let J=q?.role===`owner`,Y=(0,k.useCallback)(()=>{w.listMine().then(e=>{e.success&&e.data&&u(e.data)}).catch(e=>N.error(`Failed to load channels:`,e)).finally(()=>C(!1))},[]);(0,k.useEffect)(()=>{Y();let e=window.setInterval(Y,3e4);return()=>window.clearInterval(e)},[Y]);let X=Oe.get(`channel`);X&&E!==X&&D(X),(0,k.useEffect)(()=>{X&&ke({},{replace:!0})},[X,ke]);let Z=(0,k.useCallback)(e=>{w.listMessages(e,{limit:100}).then(e=>{e.success&&e.data&&j(e.data)}).catch(e=>N.error(`Failed to load messages:`,e))},[]),Me=(0,k.useRef)(null);(0,k.useEffect)(()=>{Me.current=L},[L]);let Ne=(0,k.useCallback)(e=>{Z(e),w.markRead(e);let t=Me.current;t&&w.thread(t).then(e=>{e.success&&e.data&&z(e.data)})},[Z]);(0,k.useEffect)(()=>{if(!E)return;Z(E),w.markRead(E).then(Y);let e=new AbortController;return oe({path:`/channels/${E}/events`,signal:e.signal,onEvent:()=>Ne(E)}),()=>e.abort()},[E,Z,Y,Ne]);let Pe=O?.length??0;(0,k.useEffect)(()=>{let e=De.current;e&&(e.scrollTop=e.scrollHeight)},[Pe,E]),(0,k.useEffect)(()=>{!E||!F||(F===`members`?w.listMembers(E).then(e=>{e.success&&e.data&&P(e.data)}):w.listPins(E).then(e=>{e.success&&e.data&&he(e.data)}))},[E,F]),(0,k.useEffect)(()=>{L&&w.thread(L).then(e=>{e.success&&e.data&&z(e.data)})},[L]);let Fe=()=>{_(!0),w.listPublic().then(e=>{e.success&&e.data&&f(e.data)})},Q=async t=>{if(!E||U)return;let n=B.trim();if(!(!n&&!W)){ve(!0);try{let r=await w.postMessage(E,{content:n,...t?{parentId:t}:{},...W?{attachmentIds:[W.id]}:{},...H?{mentionModel:H}:{}});if(r.success){if(V(``),ye(null),_e(``),Z(E),t){let e=await w.thread(t);e.success&&e.data&&z(e.data)}}else v.error(r.error||e(`channels.sendFailed`))}catch(t){N.error(`Failed to send message:`,t),v.error(e(`channels.sendFailed`))}finally{ve(!1)}}},Ie=async t=>{if(E)try{let n=await w.uploadAttachment(E,t);n.success&&n.data?ye({id:n.data.id,filename:n.data.filename}):v.error(n.error||e(`channels.uploadFailed`))}catch(t){N.error(`Failed to upload attachment:`,t),v.error(e(`channels.uploadFailed`))}},Le=async()=>{if(!(!E||!G.trim()))if((await w.addMember(E,G.trim()).catch(()=>void 0))?.success){we(``);let t=await w.listMembers(E);t.success&&t.data&&P(t.data),v.success(e(`channels.memberAdded`))}else v.error(e(`channels.memberAddFailed`))},Re={onReply:e=>R(e.id),onEdit:async(e,t)=>{(await w.editMessage(e.id,t).catch(()=>void 0))?.success&&E&&Z(E)},onDelete:async e=>{(await w.deleteMessage(e.id).catch(()=>void 0))?.success&&E&&Z(E)},onPin:async e=>{await w.setPinned(e.id,!e.pinnedAt).catch(()=>void 0),E&&Z(E)},onReact:async(e,t,n)=>{n?await w.removeReaction(e.id,t).catch(()=>void 0):await w.addReaction(e.id,t).catch(()=>void 0),E&&Z(E)},onDownload:async(e,t)=>{try{let n=await w.downloadAttachment(e),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t,i.click(),URL.revokeObjectURL(r)}catch(e){N.error(`Failed to download attachment:`,e)}}},$=ge[0];return(0,A.jsxs)(`div`,{className:`flex h-full min-h-0`,children:[(0,A.jsxs)(`aside`,{className:o(`flex w-64 shrink-0 flex-col border-r border-black/[0.06] dark:border-white/[0.06]`,E?`hidden md:flex`:`flex`),"data-testid":`channel-rail`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-1 px-3 py-2.5`,children:[(0,A.jsx)(`h1`,{className:`min-w-0 flex-1 truncate text-sm font-semibold text-gray-900 dark:text-dark-900`,children:e(`channels.title`)}),(0,A.jsx)(`button`,{type:`button`,onClick:Fe,title:e(`channels.browsePublic`),className:`rounded-md p-1.5 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channels-browse`,children:(0,A.jsx)(m,{className:`h-4 w-4`})}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>Ce(!0),title:e(`channels.newDm`),className:`rounded-md p-1.5 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channels-new-dm`,children:(0,A.jsx)(S,{className:`h-4 w-4`})}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>xe(!0),title:e(`channels.newChannel`),className:`rounded-md p-1.5 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channels-new`,children:(0,A.jsx)(g,{className:`h-4 w-4`})})]}),(0,A.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-2 pb-3 scrollbar-thin`,children:ie?(0,A.jsx)(p,{className:`mx-auto mt-6 h-4 w-4 animate-spin text-gray-400`}):a.length===0?(0,A.jsx)(`p`,{className:`px-2 pt-6 text-center text-xs text-gray-400 dark:text-dark-500`,children:e(`channels.empty`)}):a.map(e=>(0,A.jsxs)(`button`,{type:`button`,onClick:()=>D(e.id),className:o(`flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-[13px]`,E===e.id?`bg-black/[0.05] text-gray-900 dark:bg-white/[0.08] dark:text-dark-900`:`text-gray-600 hover:bg-black/[0.03] dark:text-dark-700 dark:hover:bg-white/[0.04]`),"data-testid":`channel-item`,children:[se(e),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:ce(e)}),(e.unreadCount??0)>0&&(0,A.jsx)(`span`,{className:`rounded-full bg-primary-500 px-1.5 text-[10px] font-semibold leading-4 text-white`,"data-testid":`channel-unread`,children:e.unreadCount})]},e.id))})]}),(0,A.jsx)(`main`,{className:`flex min-w-0 flex-1 flex-col`,children:q?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`header`,{className:`flex items-center gap-2 border-b border-black/[0.06] px-4 py-2.5 dark:border-white/[0.06]`,children:[(0,A.jsx)(`button`,{type:`button`,onClick:()=>D(null),className:`rounded-md p-1 text-gray-500 hover:bg-black/[0.04] md:hidden dark:text-dark-600`,children:(0,A.jsx)(ne,{className:`h-4 w-4`})}),se(q),(0,A.jsx)(`h2`,{className:`min-w-0 flex-1 truncate text-sm font-semibold text-gray-900 dark:text-dark-900`,"data-testid":`channel-title`,children:ce(q)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>I(F===`pins`?null:`pins`),title:e(`channels.pins`),className:`rounded-md p-1.5 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channel-pins-toggle`,children:(0,A.jsx)(c,{className:`h-4 w-4`})}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>I(F===`members`?null:`members`),title:e(`channels.members`),className:`rounded-md p-1.5 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channel-members-toggle`,children:(0,A.jsx)(x,{className:`h-4 w-4`})}),J&&q.type!==`dm`&&(0,A.jsx)(`button`,{type:`button`,onClick:()=>K(!0),title:e(`channels.settings`),className:`rounded-md p-1.5 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channel-settings`,children:(0,A.jsx)(l,{className:`h-4 w-4`})})]}),(0,A.jsxs)(`div`,{className:`flex min-h-0 flex-1`,children:[(0,A.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col`,children:[(0,A.jsx)(`div`,{ref:De,className:`min-h-0 flex-1 space-y-1 overflow-y-auto px-4 py-3 scrollbar-thin`,"data-testid":`channel-timeline`,children:O===null?(0,A.jsx)(p,{className:`mx-auto mt-6 h-4 w-4 animate-spin text-gray-400`}):O.length===0?(0,A.jsx)(`p`,{className:`pt-8 text-center text-xs text-gray-400 dark:text-dark-500`,children:e(`channels.noMessages`)}):O.map(e=>(0,A.jsx)(M,{message:e,currentUserId:t?.id,canModerate:J,actions:Re},e.id))}),(0,A.jsxs)(`div`,{className:`border-t border-black/[0.06] p-3 dark:border-white/[0.06]`,children:[W&&(0,A.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 rounded-lg border border-black/[0.06] px-2.5 py-1.5 text-xs text-gray-600 dark:border-white/[0.08] dark:text-dark-700`,children:[(0,A.jsx)(y,{className:`h-3.5 w-3.5`}),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:W.filename}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>ye(null),className:`text-gray-400 hover:text-red-500`,children:(0,A.jsx)(b,{className:`h-3.5 w-3.5`})})]}),(0,A.jsxs)(`div`,{className:`flex items-end gap-1.5`,children:[(0,A.jsx)(`input`,{ref:Ee,type:`file`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&Ie(t),e.target.value=``}}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>Ee.current?.click(),title:e(`channels.attach`),className:`rounded-md p-2 text-gray-500 hover:bg-black/[0.04] dark:text-dark-600 dark:hover:bg-white/[0.06]`,"data-testid":`channel-attach`,children:(0,A.jsx)(y,{className:`h-4 w-4`})}),(0,A.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,A.jsx)(ee,{className:o(`h-4 w-4`,H?`text-primary-500`:`text-gray-400 dark:text-dark-500`)}),(0,A.jsxs)(`select`,{value:H,onChange:e=>_e(e.target.value),className:`max-w-[130px] rounded-md border border-black/[0.08] bg-transparent px-1 py-1 text-[11px] text-gray-600 focus:outline-none dark:border-white/[0.1] dark:bg-dark-100 dark:text-dark-700`,title:e(`channels.askModel`),"data-testid":`channel-mention-model`,children:[(0,A.jsx)(`option`,{value:``,children:e(`channels.noModel`)}),n.map(e=>(0,A.jsx)(`option`,{value:e.name,children:e.name},e.name))]})]}),(0,A.jsx)(`textarea`,{value:B,onChange:e=>V(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Q())},rows:1,placeholder:e(`channels.composerPlaceholder`),className:`max-h-32 min-w-0 flex-1 resize-none rounded-xl border border-black/[0.08] bg-transparent px-3 py-2 text-[13px] text-gray-900 placeholder:text-gray-400 focus:border-primary-500/40 focus:outline-none dark:border-white/[0.1] dark:text-dark-900`,"data-testid":`channel-composer`}),(0,A.jsx)(T,{size:`sm`,disabled:U||!B.trim()&&!W,onClick:()=>void Q(),"data-testid":`channel-send`,children:U?(0,A.jsx)(p,{className:`h-4 w-4 animate-spin`}):(0,A.jsx)(h,{className:`h-4 w-4`})})]})]})]}),L&&(0,A.jsxs)(`aside`,{className:`flex w-80 shrink-0 flex-col border-l border-black/[0.06] dark:border-white/[0.06]`,"data-testid":`channel-thread`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-black/[0.06] px-3 py-2 dark:border-white/[0.06]`,children:[(0,A.jsx)(`span`,{className:`flex-1 text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-dark-600`,children:e(`channels.thread`)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>R(null),className:`rounded-md p-1 text-gray-400 hover:bg-black/[0.04] dark:hover:bg-white/[0.06]`,children:(0,A.jsx)(b,{className:`h-3.5 w-3.5`})})]}),(0,A.jsx)(`div`,{className:`min-h-0 flex-1 space-y-1 overflow-y-auto px-3 py-2 scrollbar-thin`,children:ge.map(e=>(0,A.jsx)(M,{message:e,currentUserId:t?.id,canModerate:J,actions:{...Re,onReply:void 0},compact:!0},e.id))}),(0,A.jsxs)(`div`,{className:`flex items-end gap-1.5 border-t border-black/[0.06] p-2 dark:border-white/[0.06]`,children:[(0,A.jsx)(`textarea`,{value:B,onChange:e=>V(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),$&&Q($.id))},rows:1,placeholder:e(`channels.replyPlaceholder`),className:`min-w-0 flex-1 resize-none rounded-lg border border-black/[0.08] bg-transparent px-2.5 py-1.5 text-[13px] text-gray-900 focus:outline-none dark:border-white/[0.1] dark:text-dark-900`,"data-testid":`channel-thread-composer`}),(0,A.jsx)(T,{size:`sm`,disabled:U||!B.trim(),onClick:()=>$&&void Q($.id),children:(0,A.jsx)(h,{className:`h-3.5 w-3.5`})})]})]}),F&&(0,A.jsxs)(`aside`,{className:`flex w-72 shrink-0 flex-col border-l border-black/[0.06] dark:border-white/[0.06]`,"data-testid":`channel-${F}-panel`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-black/[0.06] px-3 py-2 dark:border-white/[0.06]`,children:[(0,A.jsx)(`span`,{className:`flex-1 text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-dark-600`,children:e(F===`members`?`channels.members`:`channels.pins`)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>I(null),className:`rounded-md p-1 text-gray-400 hover:bg-black/[0.04] dark:hover:bg-white/[0.06]`,children:(0,A.jsx)(b,{className:`h-3.5 w-3.5`})})]}),(0,A.jsx)(`div`,{className:`min-h-0 flex-1 space-y-1.5 overflow-y-auto px-3 py-2 scrollbar-thin`,children:F===`members`?(0,A.jsxs)(A.Fragment,{children:[J&&q.type===`private`&&(0,A.jsxs)(`div`,{className:`mb-2 flex gap-1.5`,children:[(0,A.jsx)(`input`,{type:`text`,value:G,onChange:e=>we(e.target.value),onKeyDown:e=>{e.key===`Enter`&&Le()},placeholder:e(`channels.invitePlaceholder`),className:`min-w-0 flex-1 rounded-lg border border-black/[0.08] bg-transparent px-2 py-1 text-xs focus:outline-none dark:border-white/[0.1] dark:text-dark-800`,"data-testid":`channel-invite-name`}),(0,A.jsx)(T,{size:`sm`,disabled:!G.trim(),onClick:()=>void Le(),"data-testid":`channel-invite-submit`,children:(0,A.jsx)(g,{className:`h-3.5 w-3.5`})})]}),le.map(n=>(0,A.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg px-2 py-1.5 text-[13px] text-gray-700 dark:text-dark-800`,"data-testid":`channel-member`,children:[(0,A.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:n.username}),(0,A.jsx)(`span`,{className:`text-[10px] uppercase text-gray-400 dark:text-dark-500`,children:n.role===`owner`?e(`channels.roleOwner`):``}),J&&n.userId!==t?.id&&q.type!==`dm`&&(0,A.jsx)(`button`,{type:`button`,onClick:()=>void w.removeMember(q.id,n.userId).then(()=>P(e=>e.filter(e=>e.userId!==n.userId))),className:`rounded p-0.5 text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20`,title:e(`channels.removeMember`),children:(0,A.jsx)(b,{className:`h-3 w-3`})})]},n.userId)),!J&&q.type!==`dm`&&(0,A.jsx)(T,{size:`sm`,variant:`ghost`,className:`mt-2 w-full text-red-500`,onClick:()=>void w.removeMember(q.id,t?.id??``).then(()=>{D(null),Y()}),"data-testid":`channel-leave`,children:e(`channels.leave`)})]}):me.length===0?(0,A.jsx)(`p`,{className:`pt-4 text-center text-xs text-gray-400 dark:text-dark-500`,children:e(`channels.noPins`)}):me.map(e=>(0,A.jsx)(M,{message:e,currentUserId:t?.id,canModerate:J,actions:Re,compact:!0},e.id))})]})]})]}):(0,A.jsxs)(`div`,{className:`flex flex-1 flex-col items-center justify-center gap-2 text-gray-400 dark:text-dark-500`,children:[(0,A.jsx)(re,{className:`h-8 w-8`}),(0,A.jsx)(`p`,{className:`text-sm`,children:e(`channels.selectPrompt`)})]})}),be&&(0,A.jsx)(ue,{onClose:()=>xe(!1),onCreated:e=>{xe(!1),Y(),D(e.id)}}),Se&&(0,A.jsx)(de,{onClose:()=>Ce(!1),onOpened:e=>{Ce(!1),Y(),D(e.id)}}),te&&(0,A.jsx)(fe,{channels:d,onClose:()=>_(!1),onJoined:e=>{_(!1),Y(),D(e)}}),Te&&q&&(0,A.jsx)(pe,{channel:q,onClose:()=>K(!1),onChanged:()=>{K(!1),Y()},onDeleted:()=>{K(!1),D(null),Y()}})]})},ue=({onClose:e,onCreated:t})=>{let{t:n}=i(),[r,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(`public`),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(!1);return(0,A.jsxs)(D,{titleId:`create-channel-title`,title:n(`channels.newChannel`),onClose:e,testId:`create-channel-modal`,footer:(0,A.jsx)(T,{size:`sm`,disabled:u||!r.trim(),onClick:()=>{d(!0),w.create({type:o,name:r.trim(),...c.trim()?{description:c.trim()}:{}}).then(e=>{e.success&&e.data?t(e.data):v.error(e.error||n(`channels.createFailed`))}).catch(()=>v.error(n(`channels.createFailed`))).finally(()=>d(!1))},"data-testid":`create-channel-submit`,children:n(`channels.create`)}),children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:E,children:n(`channels.nameLabel`)}),(0,A.jsx)(`input`,{className:O,value:r,onChange:e=>a(e.target.value),"data-testid":`create-channel-name`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:E,children:n(`channels.typeLabel`)}),(0,A.jsxs)(`select`,{className:O,value:o,onChange:e=>s(e.target.value),"data-testid":`create-channel-type`,children:[(0,A.jsx)(`option`,{value:`public`,children:n(`channels.typePublic`)}),(0,A.jsx)(`option`,{value:`private`,children:n(`channels.typePrivate`)})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:E,children:n(`channels.descriptionLabel`)}),(0,A.jsx)(`textarea`,{className:O,rows:2,value:c,onChange:e=>l(e.target.value)})]})]})},de=({onClose:e,onOpened:t})=>{let{t:n}=i(),[r,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(!1),c=()=>{r.trim()&&(s(!0),w.openDm(r.trim()).then(e=>{e.success&&e.data?t(e.data):v.error(e.error||n(`channels.dmFailed`))}).catch(()=>v.error(n(`channels.dmFailed`))).finally(()=>s(!1)))};return(0,A.jsx)(D,{titleId:`open-dm-title`,title:n(`channels.newDm`),subtitle:n(`channels.dmHint`),onClose:e,testId:`open-dm-modal`,footer:(0,A.jsx)(T,{size:`sm`,disabled:o||!r.trim(),onClick:c,"data-testid":`open-dm-submit`,children:n(`channels.openDm`)}),children:(0,A.jsx)(`input`,{className:O,value:r,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&c()},placeholder:n(`channels.dmPlaceholder`),"data-testid":`open-dm-username`})})},fe=({channels:e,onClose:t,onJoined:n})=>{let{t:r}=i();return(0,A.jsx)(D,{titleId:`browse-channels-title`,title:r(`channels.browsePublic`),onClose:t,testId:`browse-channels-modal`,children:e===null?(0,A.jsx)(p,{className:`mx-auto h-4 w-4 animate-spin text-gray-400`}):e.length===0?(0,A.jsx)(`p`,{className:`text-center text-xs text-gray-400 dark:text-dark-500`,children:r(`channels.noPublic`)}):e.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg border border-black/[0.06] px-3 py-2 dark:border-white/[0.08]`,"data-testid":`browse-channel-item`,children:[(0,A.jsx)(d,{className:`h-3.5 w-3.5 shrink-0 text-gray-400`}),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[13px] text-gray-800 dark:text-dark-800`,children:e.name}),e.isMember?(0,A.jsx)(`span`,{className:`text-[11px] text-gray-400`,children:r(`channels.joined`)}):(0,A.jsx)(T,{size:`sm`,onClick:()=>void w.join(e.id).then(()=>n(e.id)),"data-testid":`browse-channel-join`,children:r(`channels.join`)})]},e.id))})},pe=({channel:e,onClose:t,onChanged:n,onDeleted:r})=>{let{t:a}=i(),[o,s]=(0,k.useState)(e.name),[c,l]=(0,k.useState)(e.description??``),[u,d]=(0,k.useState)(!1);return(0,A.jsxs)(D,{titleId:`channel-settings-title`,title:a(`channels.settings`),onClose:t,testId:`channel-settings-modal`,footer:(0,A.jsxs)(`div`,{className:`flex w-full items-center justify-between`,children:[(0,A.jsx)(T,{size:`sm`,variant:`ghost`,className:`text-red-500`,onClick:()=>void w.delete(e.id).then(e=>{e.success&&r()}),"data-testid":`channel-delete`,children:a(`channels.delete`)}),(0,A.jsx)(T,{size:`sm`,disabled:u||!o.trim(),onClick:()=>{d(!0),w.update(e.id,{name:o.trim(),description:c.trim()}).then(e=>{e.success&&n()}).finally(()=>d(!1))},"data-testid":`channel-settings-save`,children:a(`channels.save`)})]}),children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:E,children:a(`channels.nameLabel`)}),(0,A.jsx)(`input`,{className:O,value:o,onChange:e=>s(e.target.value)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:E,children:a(`channels.descriptionLabel`)}),(0,A.jsx)(`textarea`,{className:O,rows:2,value:c,onChange:e=>l(e.target.value)})]})]})};export{le as default};