libre-webui 0.16.1 → 0.18.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 (314) hide show
  1. package/README.md +232 -154
  2. package/backend/dist/db.d.ts.map +1 -1
  3. package/backend/dist/db.js +155 -6
  4. package/backend/dist/db.js.map +1 -1
  5. package/backend/dist/index.d.ts.map +1 -1
  6. package/backend/dist/index.js +17 -10
  7. package/backend/dist/index.js.map +1 -1
  8. package/backend/dist/middleware/auth.d.ts.map +1 -1
  9. package/backend/dist/middleware/auth.js +35 -3
  10. package/backend/dist/middleware/auth.js.map +1 -1
  11. package/backend/dist/models/userModel.d.ts +23 -0
  12. package/backend/dist/models/userModel.d.ts.map +1 -1
  13. package/backend/dist/models/userModel.js +89 -24
  14. package/backend/dist/models/userModel.js.map +1 -1
  15. package/backend/dist/routes/agentCli.d.ts +3 -0
  16. package/backend/dist/routes/agentCli.d.ts.map +1 -0
  17. package/backend/dist/routes/agentCli.js +35 -0
  18. package/backend/dist/routes/agentCli.js.map +1 -0
  19. package/backend/dist/routes/auth.d.ts.map +1 -1
  20. package/backend/dist/routes/auth.js +46 -33
  21. package/backend/dist/routes/auth.js.map +1 -1
  22. package/backend/dist/routes/chat.d.ts.map +1 -1
  23. package/backend/dist/routes/chat.js +30 -1
  24. package/backend/dist/routes/chat.js.map +1 -1
  25. package/backend/dist/routes/documents.d.ts.map +1 -1
  26. package/backend/dist/routes/documents.js +49 -41
  27. package/backend/dist/routes/documents.js.map +1 -1
  28. package/backend/dist/routes/embeddings.js +2 -2
  29. package/backend/dist/routes/embeddings.js.map +1 -1
  30. package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
  31. package/backend/dist/routes/huggingfaceHub.js +3 -1
  32. package/backend/dist/routes/huggingfaceHub.js.map +1 -1
  33. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  34. package/backend/dist/routes/imageGen.js +2 -0
  35. package/backend/dist/routes/imageGen.js.map +1 -1
  36. package/backend/dist/routes/media.d.ts +3 -0
  37. package/backend/dist/routes/media.d.ts.map +1 -0
  38. package/backend/dist/routes/media.js +429 -0
  39. package/backend/dist/routes/media.js.map +1 -0
  40. package/backend/dist/routes/ollama.d.ts.map +1 -1
  41. package/backend/dist/routes/ollama.js +15 -83
  42. package/backend/dist/routes/ollama.js.map +1 -1
  43. package/backend/dist/routes/personas.d.ts.map +1 -1
  44. package/backend/dist/routes/personas.js +2 -0
  45. package/backend/dist/routes/personas.js.map +1 -1
  46. package/backend/dist/routes/plugins.d.ts.map +1 -1
  47. package/backend/dist/routes/plugins.js +28 -0
  48. package/backend/dist/routes/plugins.js.map +1 -1
  49. package/backend/dist/routes/systemDiagnostics.d.ts +3 -0
  50. package/backend/dist/routes/systemDiagnostics.d.ts.map +1 -0
  51. package/backend/dist/routes/systemDiagnostics.js +49 -0
  52. package/backend/dist/routes/systemDiagnostics.js.map +1 -0
  53. package/backend/dist/routes/tts.d.ts.map +1 -1
  54. package/backend/dist/routes/tts.js +4 -0
  55. package/backend/dist/routes/tts.js.map +1 -1
  56. package/backend/dist/routes/users.d.ts.map +1 -1
  57. package/backend/dist/routes/users.js +58 -0
  58. package/backend/dist/routes/users.js.map +1 -1
  59. package/backend/dist/routes/work.d.ts.map +1 -1
  60. package/backend/dist/routes/work.js +107 -2
  61. package/backend/dist/routes/work.js.map +1 -1
  62. package/backend/dist/services/agentCliService.d.ts +30 -0
  63. package/backend/dist/services/agentCliService.d.ts.map +1 -0
  64. package/backend/dist/services/agentCliService.js +328 -0
  65. package/backend/dist/services/agentCliService.js.map +1 -0
  66. package/backend/dist/services/authService.d.ts +15 -9
  67. package/backend/dist/services/authService.d.ts.map +1 -1
  68. package/backend/dist/services/authService.js +34 -29
  69. package/backend/dist/services/authService.js.map +1 -1
  70. package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
  71. package/backend/dist/services/chatGenerationService.js +19 -1
  72. package/backend/dist/services/chatGenerationService.js.map +1 -1
  73. package/backend/dist/services/chatRequestService.d.ts +8 -2
  74. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  75. package/backend/dist/services/chatRequestService.js +30 -3
  76. package/backend/dist/services/chatRequestService.js.map +1 -1
  77. package/backend/dist/services/documentService.d.ts +11 -10
  78. package/backend/dist/services/documentService.d.ts.map +1 -1
  79. package/backend/dist/services/documentService.js +62 -54
  80. package/backend/dist/services/documentService.js.map +1 -1
  81. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  82. package/backend/dist/services/encryptionService.js +18 -8
  83. package/backend/dist/services/encryptionService.js.map +1 -1
  84. package/backend/dist/services/galleryService.d.ts +23 -1
  85. package/backend/dist/services/galleryService.d.ts.map +1 -1
  86. package/backend/dist/services/galleryService.js +125 -8
  87. package/backend/dist/services/galleryService.js.map +1 -1
  88. package/backend/dist/services/mediaGenerationJobService.d.ts +25 -0
  89. package/backend/dist/services/mediaGenerationJobService.d.ts.map +1 -0
  90. package/backend/dist/services/mediaGenerationJobService.js +82 -0
  91. package/backend/dist/services/mediaGenerationJobService.js.map +1 -0
  92. package/backend/dist/services/pluginAudioGenerationService.d.ts +34 -0
  93. package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -0
  94. package/backend/dist/services/pluginAudioGenerationService.js +211 -0
  95. package/backend/dist/services/pluginAudioGenerationService.js.map +1 -0
  96. package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -1
  97. package/backend/dist/services/pluginCapabilityRegistryService.js +6 -0
  98. package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -1
  99. package/backend/dist/services/pluginEmbeddingService.d.ts +2 -0
  100. package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
  101. package/backend/dist/services/pluginEmbeddingService.js +66 -35
  102. package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
  103. package/backend/dist/services/pluginImageGenerationService.d.ts +2 -0
  104. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  105. package/backend/dist/services/pluginImageGenerationService.js +63 -38
  106. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  107. package/backend/dist/services/pluginService.d.ts +38 -1
  108. package/backend/dist/services/pluginService.d.ts.map +1 -1
  109. package/backend/dist/services/pluginService.js +390 -69
  110. package/backend/dist/services/pluginService.js.map +1 -1
  111. package/backend/dist/services/pluginTTSService.d.ts +2 -0
  112. package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
  113. package/backend/dist/services/pluginTTSService.js +27 -2
  114. package/backend/dist/services/pluginTTSService.js.map +1 -1
  115. package/backend/dist/services/pluginUsageService.d.ts +82 -0
  116. package/backend/dist/services/pluginUsageService.d.ts.map +1 -0
  117. package/backend/dist/services/pluginUsageService.js +238 -0
  118. package/backend/dist/services/pluginUsageService.js.map +1 -0
  119. package/backend/dist/services/pluginVideoGenerationService.d.ts +45 -0
  120. package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -0
  121. package/backend/dist/services/pluginVideoGenerationService.js +198 -0
  122. package/backend/dist/services/pluginVideoGenerationService.js.map +1 -0
  123. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  124. package/backend/dist/services/preferencesService.js +15 -1
  125. package/backend/dist/services/preferencesService.js.map +1 -1
  126. package/backend/dist/services/registrationPolicy.d.ts +5 -0
  127. package/backend/dist/services/registrationPolicy.d.ts.map +1 -0
  128. package/backend/dist/services/registrationPolicy.js +21 -0
  129. package/backend/dist/services/registrationPolicy.js.map +1 -0
  130. package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -1
  131. package/backend/dist/services/simpleGitHubOAuth.js +8 -12
  132. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
  133. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
  134. package/backend/dist/services/simpleHuggingFaceOAuth.js +7 -12
  135. package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
  136. package/backend/dist/services/systemDiagnosticsService.d.ts +117 -0
  137. package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -0
  138. package/backend/dist/services/systemDiagnosticsService.js +326 -0
  139. package/backend/dist/services/systemDiagnosticsService.js.map +1 -0
  140. package/backend/dist/services/turnstileService.d.ts +2 -1
  141. package/backend/dist/services/turnstileService.d.ts.map +1 -1
  142. package/backend/dist/services/turnstileService.js +28 -2
  143. package/backend/dist/services/turnstileService.js.map +1 -1
  144. package/backend/dist/services/workAgentGuidance.js +1 -1
  145. package/backend/dist/services/workAgentGuidance.js.map +1 -1
  146. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  147. package/backend/dist/services/workAgentService.js +37 -0
  148. package/backend/dist/services/workAgentService.js.map +1 -1
  149. package/backend/dist/services/workHostWorkspaceService.d.ts +22 -0
  150. package/backend/dist/services/workHostWorkspaceService.d.ts.map +1 -0
  151. package/backend/dist/services/workHostWorkspaceService.js +136 -0
  152. package/backend/dist/services/workHostWorkspaceService.js.map +1 -0
  153. package/backend/dist/services/workModelProviderService.d.ts +3 -0
  154. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  155. package/backend/dist/services/workModelProviderService.js +37 -4
  156. package/backend/dist/services/workModelProviderService.js.map +1 -1
  157. package/backend/dist/services/workPreviewProxyService.d.ts +27 -0
  158. package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -0
  159. package/backend/dist/services/workPreviewProxyService.js +514 -0
  160. package/backend/dist/services/workPreviewProxyService.js.map +1 -0
  161. package/backend/dist/services/workRuntimeService.d.ts +65 -3
  162. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  163. package/backend/dist/services/workRuntimeService.js +536 -14
  164. package/backend/dist/services/workRuntimeService.js.map +1 -1
  165. package/backend/dist/services/workTaskService.d.ts +3 -3
  166. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  167. package/backend/dist/services/workTaskService.js +10 -6
  168. package/backend/dist/services/workTaskService.js.map +1 -1
  169. package/backend/dist/services/workTerminalService.d.ts +46 -0
  170. package/backend/dist/services/workTerminalService.d.ts.map +1 -0
  171. package/backend/dist/services/workTerminalService.js +241 -0
  172. package/backend/dist/services/workTerminalService.js.map +1 -0
  173. package/backend/dist/storage.d.ts.map +1 -1
  174. package/backend/dist/storage.js +3 -3
  175. package/backend/dist/storage.js.map +1 -1
  176. package/backend/dist/types/index.d.ts +78 -2
  177. package/backend/dist/types/index.d.ts.map +1 -1
  178. package/backend/dist/types/index.js.map +1 -1
  179. package/backend/dist/types/work.d.ts +53 -0
  180. package/backend/dist/types/work.d.ts.map +1 -1
  181. package/backend/dist/utils/chatDocumentContext.d.ts +1 -1
  182. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  183. package/backend/dist/utils/chatDocumentContext.js +4 -4
  184. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  185. package/backend/dist/utils/chatProviderSelection.d.ts.map +1 -1
  186. package/backend/dist/utils/chatProviderSelection.js +7 -5
  187. package/backend/dist/utils/chatProviderSelection.js.map +1 -1
  188. package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
  189. package/backend/dist/utils/pluginValidation.d.ts +3 -2
  190. package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
  191. package/backend/dist/utils/pluginValidation.js +30 -2
  192. package/backend/dist/utils/pluginValidation.js.map +1 -1
  193. package/backend/dist/utils/workGit.d.ts +14 -0
  194. package/backend/dist/utils/workGit.d.ts.map +1 -0
  195. package/backend/dist/utils/workGit.js +207 -0
  196. package/backend/dist/utils/workGit.js.map +1 -0
  197. package/backend/dist/websocketServer.d.ts +1 -0
  198. package/backend/dist/websocketServer.d.ts.map +1 -1
  199. package/backend/dist/websocketServer.js +156 -35
  200. package/backend/dist/websocketServer.js.map +1 -1
  201. package/backend/dist/workTerminalServer.d.ts +17 -0
  202. package/backend/dist/workTerminalServer.d.ts.map +1 -0
  203. package/backend/dist/workTerminalServer.js +226 -0
  204. package/backend/dist/workTerminalServer.js.map +1 -0
  205. package/backend/package.json +1 -1
  206. package/frontend/dist/assets/index-ChhWhug2.css +1 -0
  207. package/frontend/dist/assets/index-CmZntyR1.js +3 -0
  208. package/frontend/dist/assets/xterm-CmMoOwwu.css +1 -0
  209. package/frontend/dist/index.html +28 -6
  210. package/frontend/dist/js/ArtifactContainer-CBAbdoIJ.js +1 -0
  211. package/frontend/dist/js/{ArtifactDemoPage-CWDhGWrz.js → ArtifactDemoPage-BWN0MWCx.js} +1 -1
  212. package/frontend/dist/js/ArtifactSlideOutPanel-D-AvYkfk.js +1 -0
  213. package/frontend/dist/js/{Button-DBk-AREB.js → Button-CRwzOaDZ.js} +1 -1
  214. package/frontend/dist/js/ChatPage-w2FkF_fE.js +16 -0
  215. package/frontend/dist/js/FirstTimeSetup-CzBxl7UH.js +1 -0
  216. package/frontend/dist/js/GalleryPage-Cv8pniRW.js +1 -0
  217. package/frontend/dist/js/HomePage-Vyj4ndU4.js +1 -0
  218. package/frontend/dist/js/LibreClawPage-CYhLgQB-.js +1 -0
  219. package/frontend/dist/js/{ModelManagerModals-DltRprHU.js → ModelManagerModals-C2rwHd01.js} +1 -1
  220. package/frontend/dist/js/ModelSelector-D7kDjZV9.js +1 -0
  221. package/frontend/dist/js/ModelsPage-BnUddkrs.js +2 -0
  222. package/frontend/dist/js/{PersonasPage-C2pqDsWA.js → PersonasPage-BL5XlrEm.js} +2 -2
  223. package/frontend/dist/js/PluginUsagePage-BXqweCCs.js +1 -0
  224. package/frontend/dist/js/RichMessageContent-nAEaPTpH.js +3 -0
  225. package/frontend/dist/js/SettingsModal-DZYCI5-y.js +1 -0
  226. package/frontend/dist/js/SystemPage-jdHYfn9A.js +1 -0
  227. package/frontend/dist/js/UserManagementPage-BpOnt6os.js +1 -0
  228. package/frontend/dist/js/WorkPage-DAp1T1dl.js +5 -0
  229. package/frontend/dist/js/addon-fit-Cj0_dfHF.js +1 -0
  230. package/frontend/dist/js/api-BCqWXjZI.js +19 -0
  231. package/frontend/dist/js/appStore-CDM6V5ny.js +2 -0
  232. package/frontend/dist/js/ar-DS8gs8WK.js +2 -0
  233. package/frontend/dist/js/authStore-Bl5ofD_h.js +4 -0
  234. package/frontend/dist/js/bn-CrMPJwTR.js +2 -0
  235. package/frontend/dist/js/cs-BL116Ezu.js +2 -0
  236. package/frontend/dist/js/da-TDNaKzqy.js +2 -0
  237. package/frontend/dist/js/de-DkIqdAB5.js +2 -0
  238. package/frontend/dist/js/es-CHRXt6Fd.js +2 -0
  239. package/frontend/dist/js/{estree-BRklD62a.js → estree-BFya-bSu.js} +1 -1
  240. package/frontend/dist/js/fr-8715yUKq.js +2 -0
  241. package/frontend/dist/js/hi-C2O08SBU.js +2 -0
  242. package/frontend/dist/js/{html-BgGIAGmn.js → html-DJot0Wwf.js} +1 -1
  243. package/frontend/dist/js/id-Dq7UXUEV.js +2 -0
  244. package/frontend/dist/js/is-B3dbbhSl.js +2 -0
  245. package/frontend/dist/js/it-CLSuu2K7.js +2 -0
  246. package/frontend/dist/js/ja-CthrqyCR.js +2 -0
  247. package/frontend/dist/js/ko-BJvFDJ82.js +2 -0
  248. package/frontend/dist/js/{markdown-CM2nBJJi.js → markdown-CXwWsPYG.js} +1 -1
  249. package/frontend/dist/js/ms-QV0202Mj.js +2 -0
  250. package/frontend/dist/js/nl-Dob1m1pV.js +2 -0
  251. package/frontend/dist/js/pl-urfOKnYI.js +2 -0
  252. package/frontend/dist/js/pt-D52Xkpi0.js +2 -0
  253. package/frontend/dist/js/ru-CwnW9Xe2.js +2 -0
  254. package/frontend/dist/js/{standalone-CUBo-NGt.js → standalone-C0NjJpWr.js} +1 -1
  255. package/frontend/dist/js/sv-BNclj-Fo.js +2 -0
  256. package/frontend/dist/js/th-BlQ4PL57.js +2 -0
  257. package/frontend/dist/js/tr-B80aZ1px.js +2 -0
  258. package/frontend/dist/js/{typescript-Dcy9qxSB.js → typescript-d0TUM2-0.js} +1 -1
  259. package/frontend/dist/js/ui-vendor-ChfdHf5M.js +177 -0
  260. package/frontend/dist/js/uk-DZuuaI56.js +2 -0
  261. package/frontend/dist/js/utils-DmZD5uA3.js +1 -0
  262. package/frontend/dist/js/vi-Bg42fPfF.js +2 -0
  263. package/frontend/dist/js/work-DVgm81bJ.js +1 -0
  264. package/frontend/dist/js/xterm-DKl1QLiw.js +7 -0
  265. package/frontend/dist/js/zh-BSt87zs6.js +2 -0
  266. package/package.json +3 -3
  267. package/plugins/openrouter.json +89 -0
  268. package/backend/dist/services/systemSettingsService.d.ts +0 -12
  269. package/backend/dist/services/systemSettingsService.d.ts.map +0 -1
  270. package/backend/dist/services/systemSettingsService.js +0 -70
  271. package/backend/dist/services/systemSettingsService.js.map +0 -1
  272. package/frontend/dist/assets/index-BVgyQN3z.js +0 -5
  273. package/frontend/dist/assets/index-Dme2Ozol.css +0 -1
  274. package/frontend/dist/js/ArtifactContainer-CbMAYwvr.js +0 -1
  275. package/frontend/dist/js/ArtifactSlideOutPanel-CzUpDM59.js +0 -1
  276. package/frontend/dist/js/ChatPage-D0fdzy7a.js +0 -16
  277. package/frontend/dist/js/FirstTimeSetup-CfnOmy9w.js +0 -1
  278. package/frontend/dist/js/GalleryPage-CMkCur9v.js +0 -1
  279. package/frontend/dist/js/LibreClawPage-CHEfny1k.js +0 -1
  280. package/frontend/dist/js/ModelSelector-COnlNsVM.js +0 -1
  281. package/frontend/dist/js/ModelsPage-nxheiYJp.js +0 -2
  282. package/frontend/dist/js/RichMessageContent-Cz9y-bgl.js +0 -3
  283. package/frontend/dist/js/SettingsModal-B6Se68Hd.js +0 -1
  284. package/frontend/dist/js/UserManagementPage-DQeL-Twp.js +0 -1
  285. package/frontend/dist/js/WorkPage-AcZMp8OB.js +0 -2
  286. package/frontend/dist/js/api-Fi-lJlfu.js +0 -19
  287. package/frontend/dist/js/ar-KceI0PfT.js +0 -2
  288. package/frontend/dist/js/bn-DsKo2dzS.js +0 -2
  289. package/frontend/dist/js/cs-6UKhKj0A.js +0 -2
  290. package/frontend/dist/js/da-CJgZ3YuL.js +0 -2
  291. package/frontend/dist/js/de-BZAmOuCT.js +0 -2
  292. package/frontend/dist/js/es-CD4u7no9.js +0 -2
  293. package/frontend/dist/js/fr-Cou2jOS3.js +0 -2
  294. package/frontend/dist/js/hi-ZxkbNCyB.js +0 -2
  295. package/frontend/dist/js/id-DT9CqaWQ.js +0 -2
  296. package/frontend/dist/js/is-BWSbAIoq.js +0 -2
  297. package/frontend/dist/js/it-CdNoTXm3.js +0 -2
  298. package/frontend/dist/js/ja-CIuQg0xv.js +0 -2
  299. package/frontend/dist/js/ko-BWRUjDOH.js +0 -2
  300. package/frontend/dist/js/ms-gJstIj2a.js +0 -2
  301. package/frontend/dist/js/nl-CydjVNUw.js +0 -2
  302. package/frontend/dist/js/pl-DPN9mAa5.js +0 -2
  303. package/frontend/dist/js/pt-MRXGqIjQ.js +0 -2
  304. package/frontend/dist/js/ru-CvQ9GkJF.js +0 -2
  305. package/frontend/dist/js/sv-BxS2fvhU.js +0 -2
  306. package/frontend/dist/js/th-DMxyn6e4.js +0 -2
  307. package/frontend/dist/js/tr-BTPldUaA.js +0 -2
  308. package/frontend/dist/js/ui-vendor-CAFEDSaO.js +0 -177
  309. package/frontend/dist/js/uk-BGxZOKgp.js +0 -2
  310. package/frontend/dist/js/useBaseQuery-CFTidwqz.js +0 -1
  311. package/frontend/dist/js/useQuery-UsSBfWzs.js +0 -1
  312. package/frontend/dist/js/utils-pTFqSV8c.js +0 -1
  313. package/frontend/dist/js/vi-82JkwFsQ.js +0 -2
  314. package/frontend/dist/js/zh-Bxxfwci3.js +0 -2
@@ -0,0 +1,514 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import crypto from 'node:crypto';
18
+ import http from 'node:http';
19
+ import { getDatabase } from '../db.js';
20
+ import { createLogger } from '../utils/logger.js';
21
+ const logger = createLogger('services:work-preview-proxy');
22
+ export const WORK_PREVIEW_PROXY_PREFIX = '/api/work/previews';
23
+ const MAX_REWRITABLE_RESPONSE_BYTES = 8 * 1024 * 1024;
24
+ const TASK_ID_PATTERN = /^[A-Za-z0-9-]{1,100}$/;
25
+ const NONCE_PATTERN = /^[A-Za-z0-9_-]{22}$/;
26
+ const SIGNATURE_PATTERN = /^[A-Za-z0-9_-]{43}$/;
27
+ // Derive a domain-separated capability secret from JWT_SECRET when it exists.
28
+ // An unset JWT secret already makes sessions process-local; the random fallback
29
+ // gives preview capabilities the same restart semantics without importing the
30
+ // auth service (whose model singleton opens the database during module load).
31
+ const WORK_PREVIEW_SECRET = crypto
32
+ .createHash('sha256')
33
+ .update(`libre-work-preview:${process.env.JWT_SECRET || crypto.randomBytes(64).toString('hex')}`)
34
+ .digest('hex');
35
+ const HOP_BY_HOP_HEADERS = new Set([
36
+ 'connection',
37
+ 'keep-alive',
38
+ 'proxy-authenticate',
39
+ 'proxy-authorization',
40
+ 'te',
41
+ 'trailer',
42
+ 'transfer-encoding',
43
+ 'upgrade',
44
+ ]);
45
+ const PRIVATE_REQUEST_HEADERS = new Set([
46
+ 'authorization',
47
+ 'cookie',
48
+ 'host',
49
+ 'origin',
50
+ 'referer',
51
+ ]);
52
+ const PRIVATE_RESPONSE_HEADERS = new Set([
53
+ 'alt-svc',
54
+ 'authentication-info',
55
+ 'clear-site-data',
56
+ 'content-security-policy',
57
+ 'content-security-policy-report-only',
58
+ 'cross-origin-embedder-policy',
59
+ 'cross-origin-opener-policy',
60
+ 'cross-origin-resource-policy',
61
+ 'document-policy',
62
+ 'feature-policy',
63
+ 'nel',
64
+ 'origin-agent-cluster',
65
+ 'permissions-policy',
66
+ 'reporting-endpoints',
67
+ 'report-to',
68
+ 'set-cookie',
69
+ 'strict-transport-security',
70
+ 'www-authenticate',
71
+ 'x-frame-options',
72
+ 'x-permitted-cross-domain-policies',
73
+ ]);
74
+ const SAFE_WEBSOCKET_RESPONSE_HEADERS = new Set([
75
+ 'connection',
76
+ 'sec-websocket-accept',
77
+ 'sec-websocket-extensions',
78
+ 'sec-websocket-protocol',
79
+ 'upgrade',
80
+ ]);
81
+ const previewFrameAncestors = () => {
82
+ const ancestors = new Set(["'self'"]);
83
+ if (process.env.NODE_ENV !== 'production') {
84
+ ancestors.add('http://localhost:*');
85
+ ancestors.add('http://127.0.0.1:*');
86
+ ancestors.add('http://[::1]:*');
87
+ }
88
+ for (const candidate of (process.env.CORS_ORIGIN || '').split(',')) {
89
+ try {
90
+ const origin = new URL(candidate.trim());
91
+ if (origin.protocol === 'http:' || origin.protocol === 'https:') {
92
+ ancestors.add(origin.origin);
93
+ }
94
+ }
95
+ catch {
96
+ // Ignore wildcard and malformed CORS entries in a CSP source list.
97
+ }
98
+ }
99
+ return [...ancestors].join(' ');
100
+ };
101
+ const defaultPreviewLookup = taskId => getDatabase()
102
+ .prepare(`SELECT preview_status, preview_url
103
+ FROM work_tasks
104
+ WHERE id = ?`)
105
+ .get(taskId);
106
+ const previewUpstreamHost = () => {
107
+ const configured = (process.env.WORK_PREVIEW_BIND || '127.0.0.1').trim();
108
+ if (!configured || configured === '0.0.0.0')
109
+ return '127.0.0.1';
110
+ if (configured === '::' || configured === '[::]')
111
+ return '::1';
112
+ return configured.replace(/^\[|\]$/g, '');
113
+ };
114
+ const secureEqual = (left, right) => {
115
+ const leftBuffer = Buffer.from(left);
116
+ const rightBuffer = Buffer.from(right);
117
+ return (leftBuffer.length === rightBuffer.length &&
118
+ crypto.timingSafeEqual(leftBuffer, rightBuffer));
119
+ };
120
+ const escapeHtmlAttribute = (value) => value
121
+ .replace(/&/g, '&')
122
+ .replace(/"/g, '"')
123
+ .replace(/</g, '&lt;')
124
+ .replace(/>/g, '&gt;');
125
+ const formatHostForUrl = (host) => host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;
126
+ const proxyBootstrap = (proxyBasePath) => {
127
+ const serializedBase = JSON.stringify(proxyBasePath);
128
+ return `<base href="${escapeHtmlAttribute(proxyBasePath)}" />
129
+ <script>(() => {
130
+ const proxyBase = ${serializedBase};
131
+ const rewrite = value => {
132
+ if (value == null) return value;
133
+ try {
134
+ const url = new URL(String(value), document.baseURI);
135
+ const proxyProtocol = url.protocol === 'http:' || url.protocol === 'https:' || url.protocol === 'ws:' || url.protocol === 'wss:';
136
+ if (proxyProtocol && url.host === location.host && !url.pathname.startsWith(proxyBase)) {
137
+ url.pathname = proxyBase + url.pathname.replace(/^\\/+/, '');
138
+ return url.toString();
139
+ }
140
+ } catch {}
141
+ return value;
142
+ };
143
+
144
+ const nativeFetch = window.fetch.bind(window);
145
+ window.fetch = (input, init) => {
146
+ if (typeof input === 'string' || input instanceof URL) return nativeFetch(rewrite(input), init);
147
+ if (input instanceof Request) return nativeFetch(new Request(rewrite(input.url), input), init);
148
+ return nativeFetch(input, init);
149
+ };
150
+
151
+ const nativeOpen = XMLHttpRequest.prototype.open;
152
+ XMLHttpRequest.prototype.open = function(method, url, ...rest) {
153
+ return nativeOpen.call(this, method, rewrite(url), ...rest);
154
+ };
155
+
156
+ const NativeWebSocket = window.WebSocket;
157
+ function PreviewWebSocket(url, protocols) {
158
+ return protocols === undefined
159
+ ? new NativeWebSocket(rewrite(url))
160
+ : new NativeWebSocket(rewrite(url), protocols);
161
+ }
162
+ PreviewWebSocket.prototype = NativeWebSocket.prototype;
163
+ PreviewWebSocket.CONNECTING = NativeWebSocket.CONNECTING;
164
+ PreviewWebSocket.OPEN = NativeWebSocket.OPEN;
165
+ PreviewWebSocket.CLOSING = NativeWebSocket.CLOSING;
166
+ PreviewWebSocket.CLOSED = NativeWebSocket.CLOSED;
167
+ window.WebSocket = PreviewWebSocket;
168
+
169
+ if (window.EventSource) {
170
+ const NativeEventSource = window.EventSource;
171
+ function PreviewEventSource(url, options) {
172
+ return new NativeEventSource(rewrite(url), options);
173
+ }
174
+ PreviewEventSource.prototype = NativeEventSource.prototype;
175
+ window.EventSource = PreviewEventSource;
176
+ }
177
+
178
+ const nativeSetAttribute = Element.prototype.setAttribute;
179
+ Element.prototype.setAttribute = function(name, value) {
180
+ if (/^srcset$/i.test(name)) {
181
+ const sourceSet = String(value).split(',').map(candidate => {
182
+ const [url, ...descriptor] = candidate.trim().split(/\\s+/);
183
+ return [rewrite(url), ...descriptor].join(' ');
184
+ }).join(', ');
185
+ return nativeSetAttribute.call(this, name, sourceSet);
186
+ }
187
+ const urlAttribute = /^(?:src|href|action|formaction|poster|data)$/i.test(name);
188
+ return nativeSetAttribute.call(this, name, urlAttribute ? rewrite(value) : value);
189
+ };
190
+
191
+ for (const method of ['pushState', 'replaceState']) {
192
+ const nativeHistoryMethod = history[method].bind(history);
193
+ history[method] = (state, unused, url) => nativeHistoryMethod(state, unused, rewrite(url));
194
+ }
195
+ })();</script>`;
196
+ };
197
+ const rewriteQuotedRootPaths = (content, proxyBasePath) => content.replace(/(["'`])\/(?!\/)(?=[@A-Za-z0-9._~-])/g, `$1${proxyBasePath}`);
198
+ export const rewritePreviewText = (content, contentType, proxyBasePath) => {
199
+ const normalizedType = contentType.toLowerCase();
200
+ if (normalizedType.includes('text/html') ||
201
+ normalizedType.includes('application/xhtml+xml')) {
202
+ let rewritten = content.replace(/(\b(?:src|href|action|formaction|poster|data)\s*=\s*["'])\/(?!\/)/gi, `$1${proxyBasePath}`);
203
+ rewritten = rewritten.replace(/(\bsrcset\s*=\s*["'])([^"']*)(["'])/gi, (_match, open, sourceSet, close) => `${open}${sourceSet.replace(/(^|,\s*)\/(?!\/)/g, `$1${proxyBasePath}`)}${close}`);
204
+ rewritten = rewritten.replace(/(<script\b[^>]*>)([\s\S]*?)(<\/script\b[^>]*>)/gi, (_match, open, script, close) => `${open}${rewriteQuotedRootPaths(script, proxyBasePath)}${close}`);
205
+ rewritten = rewritten.replace(/(<style\b[^>]*>)([\s\S]*?)(<\/style\b[^>]*>)/gi, (_match, open, style, close) => `${open}${rewritePreviewText(style, 'text/css', proxyBasePath)}${close}`);
206
+ const injection = proxyBootstrap(proxyBasePath);
207
+ return /<head\b[^>]*>/i.test(rewritten)
208
+ ? rewritten.replace(/<head\b[^>]*>/i, match => `${match}\n${injection}`)
209
+ : `${injection}\n${rewritten}`;
210
+ }
211
+ if (normalizedType.includes('text/css')) {
212
+ return content
213
+ .replace(/(url\(\s*["']?)\/(?!\/)/gi, `$1${proxyBasePath}`)
214
+ .replace(/(@import\s+["'])\/(?!\/)/gi, `$1${proxyBasePath}`);
215
+ }
216
+ if (normalizedType.includes('javascript') ||
217
+ normalizedType.includes('ecmascript') ||
218
+ normalizedType.includes('typescript')) {
219
+ return rewriteQuotedRootPaths(content, proxyBasePath);
220
+ }
221
+ if (normalizedType.includes('image/svg+xml')) {
222
+ return content.replace(/(\b(?:src|href)\s*=\s*["'])\/(?!\/)/gi, `$1${proxyBasePath}`);
223
+ }
224
+ return content;
225
+ };
226
+ const canRewriteContentType = (contentType) => {
227
+ const normalized = contentType.toLowerCase();
228
+ return (normalized.includes('text/html') ||
229
+ normalized.includes('application/xhtml+xml') ||
230
+ normalized.includes('text/css') ||
231
+ normalized.includes('javascript') ||
232
+ normalized.includes('ecmascript') ||
233
+ normalized.includes('typescript') ||
234
+ normalized.includes('image/svg+xml'));
235
+ };
236
+ export class WorkPreviewProxyService {
237
+ constructor(secret = WORK_PREVIEW_SECRET, lookupPreview = defaultPreviewLookup, upstreamHost = previewUpstreamHost()) {
238
+ this.secret = secret;
239
+ this.lookupPreview = lookupPreview;
240
+ this.upstreamHost = upstreamHost;
241
+ this.handleHttp = (request, response) => {
242
+ const target = this.parseTarget(request.originalUrl || request.url);
243
+ if (!target) {
244
+ response.status(404).type('text/plain').send('Preview not found.');
245
+ return;
246
+ }
247
+ if (request.method === 'OPTIONS' &&
248
+ request.headers['access-control-request-method']) {
249
+ response.status(204);
250
+ response.setHeader('Access-Control-Allow-Origin', '*');
251
+ response.setHeader('Access-Control-Allow-Methods', String(request.headers['access-control-request-method']));
252
+ const requestedHeaders = request.headers['access-control-request-headers'];
253
+ if (requestedHeaders) {
254
+ response.setHeader('Access-Control-Allow-Headers', requestedHeaders);
255
+ }
256
+ response.setHeader('Access-Control-Max-Age', '600');
257
+ response.setHeader('Cache-Control', 'no-store');
258
+ response.end();
259
+ return;
260
+ }
261
+ const upstreamRequest = http.request({
262
+ hostname: this.upstreamHost,
263
+ port: target.port,
264
+ path: target.upstreamPath,
265
+ method: request.method,
266
+ headers: this.upstreamRequestHeaders(request.headers, target),
267
+ }, upstream => {
268
+ const contentType = String(upstream.headers['content-type'] || '');
269
+ const contentEncoding = String(upstream.headers['content-encoding'] || 'identity').toLowerCase();
270
+ const rewritten = request.method !== 'HEAD' &&
271
+ contentEncoding === 'identity' &&
272
+ canRewriteContentType(contentType);
273
+ if (!rewritten) {
274
+ this.applyResponseHeaders(response, upstream, target, false);
275
+ upstream.pipe(response);
276
+ return;
277
+ }
278
+ const chunks = [];
279
+ let totalBytes = 0;
280
+ upstream.on('data', (chunk) => {
281
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
282
+ totalBytes += buffer.length;
283
+ if (totalBytes > MAX_REWRITABLE_RESPONSE_BYTES) {
284
+ upstream.destroy(new Error('Work preview text response exceeded the proxy limit.'));
285
+ return;
286
+ }
287
+ chunks.push(buffer);
288
+ });
289
+ upstream.on('end', () => {
290
+ if (response.destroyed)
291
+ return;
292
+ this.applyResponseHeaders(response, upstream, target, true);
293
+ const body = rewritePreviewText(Buffer.concat(chunks).toString('utf8'), contentType, target.proxyBasePath);
294
+ response.send(body);
295
+ });
296
+ upstream.on('error', error => {
297
+ logger.warn('Work preview upstream response failed:', error.message);
298
+ if (!response.headersSent) {
299
+ response
300
+ .status(502)
301
+ .type('text/plain')
302
+ .send('Preview unavailable.');
303
+ }
304
+ else {
305
+ response.destroy(error);
306
+ }
307
+ });
308
+ });
309
+ upstreamRequest.on('error', error => {
310
+ logger.warn('Work preview proxy request failed:', error.message);
311
+ if (!response.headersSent) {
312
+ response.status(502).type('text/plain').send('Preview unavailable.');
313
+ }
314
+ else {
315
+ response.destroy(error);
316
+ }
317
+ });
318
+ request.on('aborted', () => upstreamRequest.destroy());
319
+ request.pipe(upstreamRequest);
320
+ };
321
+ }
322
+ signature(taskId, port, nonce) {
323
+ return crypto
324
+ .createHmac('sha256', this.secret)
325
+ .update(`${taskId}:${port}:${nonce}`)
326
+ .digest('base64url');
327
+ }
328
+ createPreviewUrl(taskId, port) {
329
+ if (!TASK_ID_PATTERN.test(taskId)) {
330
+ throw new Error('Work preview task ID is invalid.');
331
+ }
332
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
333
+ throw new Error('Work preview port is invalid.');
334
+ }
335
+ const nonce = crypto.randomBytes(16).toString('base64url');
336
+ const signature = this.signature(taskId, port, nonce);
337
+ return `${WORK_PREVIEW_PROXY_PREFIX}/${encodeURIComponent(taskId)}/${port}.${nonce}.${signature}/`;
338
+ }
339
+ parseTarget(rawUrl) {
340
+ let url;
341
+ try {
342
+ url = new URL(rawUrl, 'http://libre-preview.local');
343
+ }
344
+ catch {
345
+ return undefined;
346
+ }
347
+ if (!url.pathname.startsWith(`${WORK_PREVIEW_PROXY_PREFIX}/`)) {
348
+ return undefined;
349
+ }
350
+ const remainder = url.pathname.slice(WORK_PREVIEW_PROXY_PREFIX.length + 1);
351
+ const segments = remainder.split('/');
352
+ const encodedTaskId = segments.shift();
353
+ const credential = segments.shift();
354
+ if (!encodedTaskId || !credential)
355
+ return undefined;
356
+ let taskId;
357
+ try {
358
+ taskId = decodeURIComponent(encodedTaskId);
359
+ }
360
+ catch {
361
+ return undefined;
362
+ }
363
+ if (!TASK_ID_PATTERN.test(taskId))
364
+ return undefined;
365
+ const [rawPort = '', nonce = '', signature = '', ...extraCredentials] = credential.split('.');
366
+ if (extraCredentials.length > 0)
367
+ return undefined;
368
+ const port = Number(rawPort);
369
+ if (!Number.isInteger(port) ||
370
+ port < 1 ||
371
+ port > 65535 ||
372
+ !NONCE_PATTERN.test(nonce) ||
373
+ !SIGNATURE_PATTERN.test(signature)) {
374
+ return undefined;
375
+ }
376
+ const expectedSignature = this.signature(taskId, port, nonce);
377
+ if (!secureEqual(signature, expectedSignature))
378
+ return undefined;
379
+ const proxyBasePath = `${WORK_PREVIEW_PROXY_PREFIX}/${encodeURIComponent(taskId)}/${credential}/`;
380
+ if (!url.pathname.startsWith(proxyBasePath))
381
+ return undefined;
382
+ const record = this.lookupPreview(taskId);
383
+ if (record?.preview_status !== 'running' ||
384
+ record.preview_url !== proxyBasePath) {
385
+ return undefined;
386
+ }
387
+ const upstreamPath = `/${url.pathname.slice(proxyBasePath.length)}${url.search}`;
388
+ return { taskId, port, proxyBasePath, upstreamPath };
389
+ }
390
+ upstreamRequestHeaders(headers, target) {
391
+ const outgoing = {};
392
+ for (const [name, value] of Object.entries(headers)) {
393
+ if (value === undefined ||
394
+ HOP_BY_HOP_HEADERS.has(name) ||
395
+ PRIVATE_REQUEST_HEADERS.has(name) ||
396
+ name.startsWith('cf-') ||
397
+ name.startsWith('x-forwarded-')) {
398
+ continue;
399
+ }
400
+ outgoing[name] = value;
401
+ }
402
+ outgoing.host = `${formatHostForUrl(this.upstreamHost)}:${target.port}`;
403
+ outgoing['accept-encoding'] = 'identity';
404
+ if (headers.origin) {
405
+ outgoing.origin = `http://${formatHostForUrl(this.upstreamHost)}:${target.port}`;
406
+ }
407
+ return outgoing;
408
+ }
409
+ rewriteLocation(value, target) {
410
+ try {
411
+ const location = new URL(value, `http://${formatHostForUrl(this.upstreamHost)}:${target.port}`);
412
+ if (location.hostname.replace(/^\[|\]$/g, '') === this.upstreamHost &&
413
+ Number(location.port || 80) === target.port) {
414
+ return `${target.proxyBasePath}${location.pathname.replace(/^\/+/, '')}${location.search}${location.hash}`;
415
+ }
416
+ }
417
+ catch {
418
+ // Preserve malformed upstream locations rather than creating a new URL.
419
+ }
420
+ return value;
421
+ }
422
+ applyResponseHeaders(response, upstream, target, rewritten) {
423
+ response.status(upstream.statusCode || 502);
424
+ for (const [name, value] of Object.entries(upstream.headers)) {
425
+ if (value === undefined ||
426
+ HOP_BY_HOP_HEADERS.has(name) ||
427
+ PRIVATE_RESPONSE_HEADERS.has(name) ||
428
+ name.startsWith('access-control-') ||
429
+ (rewritten &&
430
+ (name === 'content-length' ||
431
+ name === 'content-encoding' ||
432
+ name === 'etag'))) {
433
+ continue;
434
+ }
435
+ response.setHeader(name, name === 'location' && typeof value === 'string'
436
+ ? this.rewriteLocation(value, target)
437
+ : value);
438
+ }
439
+ response.setHeader('Cache-Control', 'no-store');
440
+ // A sandboxed preview has an opaque browser origin. Wildcard CORS lets its
441
+ // modules and requests reach only this uncredentialed capability URL.
442
+ response.setHeader('Access-Control-Allow-Origin', '*');
443
+ response.setHeader('Referrer-Policy', 'no-referrer');
444
+ response.setHeader('X-Content-Type-Options', 'nosniff');
445
+ response.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=(), payment=(), usb=(), serial=(), bluetooth=()');
446
+ const contentType = String(upstream.headers['content-type'] || '');
447
+ if (contentType.toLowerCase().includes('text/html') ||
448
+ contentType.toLowerCase().includes('application/xhtml+xml')) {
449
+ response.setHeader('Content-Security-Policy', `sandbox allow-scripts allow-forms allow-modals allow-downloads; frame-ancestors ${previewFrameAncestors()}`);
450
+ }
451
+ }
452
+ tryHandleUpgrade(request, socket, head) {
453
+ const target = this.parseTarget(request.url || '');
454
+ if (!target) {
455
+ if ((request.url || '').startsWith(`${WORK_PREVIEW_PROXY_PREFIX}/`)) {
456
+ socket.end('HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n');
457
+ return true;
458
+ }
459
+ return false;
460
+ }
461
+ const headers = this.upstreamRequestHeaders(request.headers, target);
462
+ headers.connection = 'Upgrade';
463
+ headers.upgrade = request.headers.upgrade || 'websocket';
464
+ const upstreamRequest = http.request({
465
+ hostname: this.upstreamHost,
466
+ port: target.port,
467
+ path: target.upstreamPath,
468
+ method: request.method,
469
+ headers,
470
+ });
471
+ socket.once('error', error => {
472
+ logger.debug('Work preview client WebSocket closed with an error:', error);
473
+ });
474
+ upstreamRequest.on('upgrade', (upstream, upstreamSocket, upstreamHead) => {
475
+ const statusLine = `HTTP/${upstream.httpVersion} ${upstream.statusCode || 101} ${upstream.statusMessage || 'Switching Protocols'}\r\n`;
476
+ const headerLines = [];
477
+ for (let index = 0; index < upstream.rawHeaders.length; index += 2) {
478
+ const name = upstream.rawHeaders[index];
479
+ const value = upstream.rawHeaders[index + 1];
480
+ if (!name || !SAFE_WEBSOCKET_RESPONSE_HEADERS.has(name.toLowerCase())) {
481
+ continue;
482
+ }
483
+ headerLines.push(`${name}: ${value}`);
484
+ }
485
+ socket.write(`${statusLine}${headerLines.join('\r\n')}\r\n\r\n`);
486
+ if (upstreamHead.length > 0)
487
+ socket.write(upstreamHead);
488
+ if (head.length > 0)
489
+ upstreamSocket.write(head);
490
+ upstreamSocket.once('error', error => {
491
+ logger.debug('Work preview upstream WebSocket closed with an error:', error);
492
+ socket.destroy();
493
+ });
494
+ socket.once('close', () => upstreamSocket.destroy());
495
+ upstreamSocket.pipe(socket);
496
+ socket.pipe(upstreamSocket);
497
+ });
498
+ upstreamRequest.on('response', upstream => {
499
+ upstream.resume();
500
+ socket.end(`HTTP/1.1 ${upstream.statusCode || 502} ${upstream.statusMessage || 'Upgrade Failed'}\r\nConnection: close\r\n\r\n`);
501
+ });
502
+ upstreamRequest.on('error', error => {
503
+ logger.warn('Work preview WebSocket proxy failed:', error.message);
504
+ if (!socket.destroyed) {
505
+ socket.end('HTTP/1.1 502 Bad Gateway\r\nConnection: close\r\n\r\n');
506
+ }
507
+ });
508
+ upstreamRequest.end();
509
+ return true;
510
+ }
511
+ }
512
+ export const workPreviewProxyService = new WorkPreviewProxyService();
513
+ export default workPreviewProxyService;
514
+ //# sourceMappingURL=workPreviewProxyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workPreviewProxyService.js","sourceRoot":"","sources":["../../src/services/workPreviewProxyService.ts"],"names":[],"mappings":"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"}