libre-webui 0.36.0 → 0.37.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 (340) hide show
  1. package/README.md +53 -0
  2. package/backend/dist/cordis/contracts.d.ts +270 -0
  3. package/backend/dist/cordis/contracts.d.ts.map +1 -0
  4. package/backend/dist/cordis/contracts.js +32 -0
  5. package/backend/dist/cordis/contracts.js.map +1 -0
  6. package/backend/dist/cordis/dsh/chat-model.d.ts +16 -0
  7. package/backend/dist/cordis/dsh/chat-model.d.ts.map +1 -0
  8. package/backend/dist/cordis/dsh/chat-model.js +104 -0
  9. package/backend/dist/cordis/dsh/chat-model.js.map +1 -0
  10. package/backend/dist/cordis/dsh/engine-plugin.d.ts +186 -0
  11. package/backend/dist/cordis/dsh/engine-plugin.d.ts.map +1 -0
  12. package/backend/dist/cordis/dsh/engine-plugin.js +1113 -0
  13. package/backend/dist/cordis/dsh/engine-plugin.js.map +1 -0
  14. package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts +175 -0
  15. package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts.map +1 -0
  16. package/backend/dist/cordis/dsh/librewebui-llm-adapter.js +480 -0
  17. package/backend/dist/cordis/dsh/librewebui-llm-adapter.js.map +1 -0
  18. package/backend/dist/cordis/dsh/model-identity.d.ts +12 -0
  19. package/backend/dist/cordis/dsh/model-identity.d.ts.map +1 -0
  20. package/backend/dist/cordis/dsh/model-identity.js +87 -0
  21. package/backend/dist/cordis/dsh/model-identity.js.map +1 -0
  22. package/backend/dist/cordis/dsh/native-provider-client.d.ts +44 -0
  23. package/backend/dist/cordis/dsh/native-provider-client.d.ts.map +1 -0
  24. package/backend/dist/cordis/dsh/native-provider-client.js +524 -0
  25. package/backend/dist/cordis/dsh/native-provider-client.js.map +1 -0
  26. package/backend/dist/cordis/dsh/native-provider-plugin.d.ts +11 -0
  27. package/backend/dist/cordis/dsh/native-provider-plugin.d.ts.map +1 -0
  28. package/backend/dist/cordis/dsh/native-provider-plugin.js +416 -0
  29. package/backend/dist/cordis/dsh/native-provider-plugin.js.map +1 -0
  30. package/backend/dist/cordis/dsh/native-provider-protocol.d.ts +37 -0
  31. package/backend/dist/cordis/dsh/native-provider-protocol.d.ts.map +1 -0
  32. package/backend/dist/cordis/dsh/native-provider-protocol.js +325 -0
  33. package/backend/dist/cordis/dsh/native-provider-protocol.js.map +1 -0
  34. package/backend/dist/cordis/dsh/provider-handler.d.ts +36 -0
  35. package/backend/dist/cordis/dsh/provider-handler.d.ts.map +1 -0
  36. package/backend/dist/cordis/dsh/provider-handler.js +582 -0
  37. package/backend/dist/cordis/dsh/provider-handler.js.map +1 -0
  38. package/backend/dist/cordis/dsh/session-files.d.ts +9 -0
  39. package/backend/dist/cordis/dsh/session-files.d.ts.map +1 -0
  40. package/backend/dist/cordis/dsh/session-files.js +60 -0
  41. package/backend/dist/cordis/dsh/session-files.js.map +1 -0
  42. package/backend/dist/cordis/dsh/session-settings.d.ts +15 -0
  43. package/backend/dist/cordis/dsh/session-settings.d.ts.map +1 -0
  44. package/backend/dist/cordis/dsh/session-settings.js +51 -0
  45. package/backend/dist/cordis/dsh/session-settings.js.map +1 -0
  46. package/backend/dist/cordis/dsh/work-driver.d.ts +12 -0
  47. package/backend/dist/cordis/dsh/work-driver.d.ts.map +1 -0
  48. package/backend/dist/cordis/dsh/work-driver.js +402 -0
  49. package/backend/dist/cordis/dsh/work-driver.js.map +1 -0
  50. package/backend/dist/cordis/dsh/workspace-policy.d.ts +10 -0
  51. package/backend/dist/cordis/dsh/workspace-policy.d.ts.map +1 -0
  52. package/backend/dist/cordis/dsh/workspace-policy.js +44 -0
  53. package/backend/dist/cordis/dsh/workspace-policy.js.map +1 -0
  54. package/backend/dist/cordis/host/composition.d.ts +73 -0
  55. package/backend/dist/cordis/host/composition.d.ts.map +1 -0
  56. package/backend/dist/cordis/host/composition.js +205 -0
  57. package/backend/dist/cordis/host/composition.js.map +1 -0
  58. package/backend/dist/cordis/host/config.d.ts +159 -0
  59. package/backend/dist/cordis/host/config.d.ts.map +1 -0
  60. package/backend/dist/cordis/host/config.js +174 -0
  61. package/backend/dist/cordis/host/config.js.map +1 -0
  62. package/backend/dist/cordis/host/host.d.ts +74 -0
  63. package/backend/dist/cordis/host/host.d.ts.map +1 -0
  64. package/backend/dist/cordis/host/host.js +415 -0
  65. package/backend/dist/cordis/host/host.js.map +1 -0
  66. package/backend/dist/cordis/host/loader-entry.d.ts +41 -0
  67. package/backend/dist/cordis/host/loader-entry.d.ts.map +1 -0
  68. package/backend/dist/cordis/host/loader-entry.js +52 -0
  69. package/backend/dist/cordis/host/loader-entry.js.map +1 -0
  70. package/backend/dist/cordis/host/model.d.ts +45 -0
  71. package/backend/dist/cordis/host/model.d.ts.map +1 -0
  72. package/backend/dist/cordis/host/model.js +54 -0
  73. package/backend/dist/cordis/host/model.js.map +1 -0
  74. package/backend/dist/cordis/index.d.ts +14 -0
  75. package/backend/dist/cordis/index.d.ts.map +1 -0
  76. package/backend/dist/cordis/index.js +30 -0
  77. package/backend/dist/cordis/index.js.map +1 -0
  78. package/backend/dist/cordis/runtime.d.ts +97 -0
  79. package/backend/dist/cordis/runtime.d.ts.map +1 -0
  80. package/backend/dist/cordis/runtime.js +220 -0
  81. package/backend/dist/cordis/runtime.js.map +1 -0
  82. package/backend/dist/cordis/work-model.d.ts +7 -0
  83. package/backend/dist/cordis/work-model.d.ts.map +1 -0
  84. package/backend/dist/cordis/work-model.js +30 -0
  85. package/backend/dist/cordis/work-model.js.map +1 -0
  86. package/backend/dist/db.js +1 -1
  87. package/backend/dist/index.d.ts.map +1 -1
  88. package/backend/dist/index.js +9 -0
  89. package/backend/dist/index.js.map +1 -1
  90. package/backend/dist/main.js +12 -0
  91. package/backend/dist/main.js.map +1 -1
  92. package/backend/dist/persistence/extensionTypes.d.ts +2 -0
  93. package/backend/dist/persistence/extensionTypes.d.ts.map +1 -1
  94. package/backend/dist/persistence/extensionTypes.js.map +1 -1
  95. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
  96. package/backend/dist/persistence/postgresExtensionRepositories.js +38 -0
  97. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
  98. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  99. package/backend/dist/persistence/postgresResourceRepositories.js +6 -1
  100. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  101. package/backend/dist/persistence/resourceTypes.d.ts +3 -1
  102. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  103. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  104. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  105. package/backend/dist/persistence/sqliteExtensionRepositories.js +40 -0
  106. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  107. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  108. package/backend/dist/persistence/sqliteResourceRepositories.js +7 -1
  109. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  110. package/backend/dist/routes/agentCli.d.ts.map +1 -1
  111. package/backend/dist/routes/agentCli.js +34 -2
  112. package/backend/dist/routes/agentCli.js.map +1 -1
  113. package/backend/dist/routes/chat.d.ts.map +1 -1
  114. package/backend/dist/routes/chat.js +9 -1
  115. package/backend/dist/routes/chat.js.map +1 -1
  116. package/backend/dist/routes/cordis.d.ts +3 -0
  117. package/backend/dist/routes/cordis.d.ts.map +1 -0
  118. package/backend/dist/routes/cordis.js +440 -0
  119. package/backend/dist/routes/cordis.js.map +1 -0
  120. package/backend/dist/routes/libreClaw.js +1 -1
  121. package/backend/dist/routes/libreClaw.js.map +1 -1
  122. package/backend/dist/routes/work.d.ts.map +1 -1
  123. package/backend/dist/routes/work.js +23 -8
  124. package/backend/dist/routes/work.js.map +1 -1
  125. package/backend/dist/services/agentAccessService.d.ts +4 -0
  126. package/backend/dist/services/agentAccessService.d.ts.map +1 -1
  127. package/backend/dist/services/agentAccessService.js +48 -16
  128. package/backend/dist/services/agentAccessService.js.map +1 -1
  129. package/backend/dist/services/agentCliService.d.ts +42 -1
  130. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  131. package/backend/dist/services/agentCliService.js +206 -7
  132. package/backend/dist/services/agentCliService.js.map +1 -1
  133. package/backend/dist/services/agentCliUsage.d.ts +22 -0
  134. package/backend/dist/services/agentCliUsage.d.ts.map +1 -0
  135. package/backend/dist/services/agentCliUsage.js +192 -0
  136. package/backend/dist/services/agentCliUsage.js.map +1 -0
  137. package/backend/dist/services/authService.d.ts +3 -0
  138. package/backend/dist/services/authService.d.ts.map +1 -1
  139. package/backend/dist/services/authService.js +4 -1
  140. package/backend/dist/services/authService.js.map +1 -1
  141. package/backend/dist/services/chatGenerationService.d.ts +7 -0
  142. package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
  143. package/backend/dist/services/chatGenerationService.js +32 -1
  144. package/backend/dist/services/chatGenerationService.js.map +1 -1
  145. package/backend/dist/services/cordisAccessService.d.ts +56 -0
  146. package/backend/dist/services/cordisAccessService.d.ts.map +1 -0
  147. package/backend/dist/services/cordisAccessService.js +98 -0
  148. package/backend/dist/services/cordisAccessService.js.map +1 -0
  149. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
  150. package/backend/dist/services/durableChatGenerationService.js +9 -1
  151. package/backend/dist/services/durableChatGenerationService.js.map +1 -1
  152. package/backend/dist/services/emailService.d.ts.map +1 -1
  153. package/backend/dist/services/emailService.js +8 -1
  154. package/backend/dist/services/emailService.js.map +1 -1
  155. package/backend/dist/services/pluginService.d.ts.map +1 -1
  156. package/backend/dist/services/pluginService.js +7 -26
  157. package/backend/dist/services/pluginService.js.map +1 -1
  158. package/backend/dist/services/pluginUsageService.d.ts +52 -0
  159. package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
  160. package/backend/dist/services/pluginUsageService.js +89 -1
  161. package/backend/dist/services/pluginUsageService.js.map +1 -1
  162. package/backend/dist/services/systemSettingsService.d.ts +1 -1
  163. package/backend/dist/services/systemSettingsService.d.ts.map +1 -1
  164. package/backend/dist/services/systemSettingsService.js +1 -1
  165. package/backend/dist/services/systemSettingsService.js.map +1 -1
  166. package/backend/dist/services/thinkingSummaryService.d.ts +3 -0
  167. package/backend/dist/services/thinkingSummaryService.d.ts.map +1 -1
  168. package/backend/dist/services/thinkingSummaryService.js +56 -17
  169. package/backend/dist/services/thinkingSummaryService.js.map +1 -1
  170. package/backend/dist/services/titleGenerationService.d.ts +22 -2
  171. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  172. package/backend/dist/services/titleGenerationService.js +63 -8
  173. package/backend/dist/services/titleGenerationService.js.map +1 -1
  174. package/backend/dist/services/workAgentService.d.ts +1 -1
  175. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  176. package/backend/dist/services/workAgentService.js +76 -12
  177. package/backend/dist/services/workAgentService.js.map +1 -1
  178. package/backend/dist/services/workModelProviderService.d.ts +5 -0
  179. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  180. package/backend/dist/services/workModelProviderService.js +52 -3
  181. package/backend/dist/services/workModelProviderService.js.map +1 -1
  182. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  183. package/backend/dist/services/workRuntimeService.js +4 -1
  184. package/backend/dist/services/workRuntimeService.js.map +1 -1
  185. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  186. package/backend/dist/services/workTaskService.js +6 -6
  187. package/backend/dist/services/workTaskService.js.map +1 -1
  188. package/backend/dist/types/work.d.ts +12 -1
  189. package/backend/dist/types/work.d.ts.map +1 -1
  190. package/backend/dist/utils/pluginStreamAdapter.d.ts.map +1 -1
  191. package/backend/dist/utils/pluginStreamAdapter.js +18 -4
  192. package/backend/dist/utils/pluginStreamAdapter.js.map +1 -1
  193. package/backend/dist/utils/pluginStreaming.d.ts +6 -0
  194. package/backend/dist/utils/pluginStreaming.d.ts.map +1 -1
  195. package/backend/dist/utils/pluginStreaming.js +10 -0
  196. package/backend/dist/utils/pluginStreaming.js.map +1 -1
  197. package/backend/dist/utils/smtpClient.d.ts +5 -1
  198. package/backend/dist/utils/smtpClient.d.ts.map +1 -1
  199. package/backend/dist/utils/smtpClient.js +29 -3
  200. package/backend/dist/utils/smtpClient.js.map +1 -1
  201. package/backend/dist/websocketServer.d.ts.map +1 -1
  202. package/backend/dist/websocketServer.js +4 -0
  203. package/backend/dist/websocketServer.js.map +1 -1
  204. package/backend/package.json +36 -1
  205. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  206. package/frontend/dist/assets/index-C1SuPfNL.js +71 -0
  207. package/frontend/dist/assets/index-C8_AByBq.css +1 -0
  208. package/frontend/dist/index.html +22 -20
  209. package/frontend/dist/js/{ArtifactContainer-B8tyPtWd.js → ArtifactContainer-Bd0IrnmH.js} +1 -1
  210. package/frontend/dist/js/{ArtifactDemoPage-BwRfWoSK.js → ArtifactDemoPage-CL_ROEDy.js} +1 -1
  211. package/frontend/dist/js/{ArtifactSandboxFrame-Ctcwt_l2.js → ArtifactSandboxFrame-Dv32Q7Q9.js} +1 -1
  212. package/frontend/dist/js/ArtifactSlideOutPanel-BIeQrdzE.js +1 -0
  213. package/frontend/dist/js/{AutomationModal-mTYs9LrJ.js → AutomationModal-Dy42OlIk.js} +1 -1
  214. package/frontend/dist/js/AutomationsPage-DWtmeftv.js +1 -0
  215. package/frontend/dist/js/{AvatarUpload-wWUAi3e2.js → AvatarUpload-ClO6yGZX.js} +1 -1
  216. package/frontend/dist/js/{CalendarPage-Ch4racU2.js → CalendarPage-ChZgPFIy.js} +1 -1
  217. package/frontend/dist/js/ChannelsPage-zN03cSNe.js +1 -0
  218. package/frontend/dist/js/ChatPage-8miRtYkQ.js +14 -0
  219. package/frontend/dist/js/ConnectModels-S4NOCxtb.js +1 -0
  220. package/frontend/dist/js/CordisPage-BN6AcgVv.js +1 -0
  221. package/frontend/dist/js/{EvaluationsPage-DHPnNBkW.js → EvaluationsPage-DsGvkOBY.js} +2 -2
  222. package/frontend/dist/js/{FirstTimeSetup-CoF83yY8.js → FirstTimeSetup-DOHfNdJo.js} +1 -1
  223. package/frontend/dist/js/GalleryPage-Fndn6_oZ.js +1 -0
  224. package/frontend/dist/js/HomePage-DPoIA-VC.js +1 -0
  225. package/frontend/dist/js/{LanguageSwitcher-CogfczNm.js → LanguageSwitcher-DAkaWEHB.js} +1 -1
  226. package/frontend/dist/js/LibreClawPage-CdFXe8Mg.js +1 -0
  227. package/frontend/dist/js/{ModelManagerModals-Bc2Woor7.js → ModelManagerModals-oO3ygVfy.js} +1 -1
  228. package/frontend/dist/js/NotesPage-44VKCZNH.js +3 -0
  229. package/frontend/dist/js/{PasswordStrengthMeter-BJr4eBbo.js → PasswordStrengthMeter-BZF8U24d.js} +1 -1
  230. package/frontend/dist/js/{PersonasPage-ff5opf9B.js → PersonasPage-DoHAgNb3.js} +2 -2
  231. package/frontend/dist/js/PluginUsagePage-BfkgiWdb.js +1 -0
  232. package/frontend/dist/js/{RichMessageContent-BNNylVAb.js → RichMessageContent-B3V8vNPB.js} +1 -1
  233. package/frontend/dist/js/RichMessageContent-Cm-Sw-ux.js +1 -0
  234. package/frontend/dist/js/SettingsModal-DhBjTuR7.js +19 -0
  235. package/frontend/dist/js/{ShareDialog-DykD70uB.js → ShareDialog-DFCFk_5o.js} +1 -1
  236. package/frontend/dist/js/SystemPage-CqZLDXog.js +1 -0
  237. package/frontend/dist/js/UserManagementPanel-D7TNSA3i.js +1 -0
  238. package/frontend/dist/js/{WhatsNewModal-Bu4H4MEb.js → WhatsNewModal-5hfNdmEV.js} +1 -1
  239. package/frontend/dist/js/WorkPage-CTd_UrET.js +8 -0
  240. package/frontend/dist/js/api-D7VJAMui.js +1 -0
  241. package/frontend/dist/js/api-jEschMu2.js +14 -0
  242. package/frontend/dist/js/{appNavigation-CVsQuDI1.js → appNavigation-Dr7gFa_n.js} +1 -1
  243. package/frontend/dist/js/{appStore-Din-tTD9.js → appStore-DglPGdPW.js} +2 -2
  244. package/frontend/dist/js/appVersion-BQ7RP6kt.js +1 -0
  245. package/frontend/dist/js/ar-Cq-DrSYL.js +2 -0
  246. package/frontend/dist/js/{authStore-Cm8P6rYs.js → authStore-BSn9e-LG.js} +3 -3
  247. package/frontend/dist/js/authStore-DSIpfiYd.js +1 -0
  248. package/frontend/dist/js/bn-BqxLh-KL.js +2 -0
  249. package/frontend/dist/js/chatStore-BtjmZY_D.js +3 -0
  250. package/frontend/dist/js/client-CUuh7qtw.js +2 -0
  251. package/frontend/dist/js/composerStyles-C83jssgZ.js +1 -0
  252. package/frontend/dist/js/{config-DHea4b8N.js → config-CBGiqPGG.js} +1 -1
  253. package/frontend/dist/js/cordisApi-c6Um_474.js +2 -0
  254. package/frontend/dist/js/cs-D2DDNZf-.js +2 -0
  255. package/frontend/dist/js/da-BciY-TSG.js +2 -0
  256. package/frontend/dist/js/de-DjU_eXQ-.js +2 -0
  257. package/frontend/dist/js/es-ChIEs80I.js +2 -0
  258. package/frontend/dist/js/evaluationsApi-_U24Slqu.js +1 -0
  259. package/frontend/dist/js/fr-Bi8BGRW4.js +2 -0
  260. package/frontend/dist/js/hi-BMsCnWg7.js +2 -0
  261. package/frontend/dist/js/id-CpcN1vhk.js +2 -0
  262. package/frontend/dist/js/is-DkUy2cmP.js +2 -0
  263. package/frontend/dist/js/it-BglK9DRZ.js +2 -0
  264. package/frontend/dist/js/ja-IrprzwLJ.js +2 -0
  265. package/frontend/dist/js/ko--wwEsMPi.js +2 -0
  266. package/frontend/dist/js/{messageCodeStyles-euWoxwoo.js → messageCodeStyles-BuSENDg_.js} +2 -2
  267. package/frontend/dist/js/ms-BWj59y7-.js +2 -0
  268. package/frontend/dist/js/nl-D-QndW_A.js +2 -0
  269. package/frontend/dist/js/pl-Dw7d7iDV.js +2 -0
  270. package/frontend/dist/js/pt-BI53uHJw.js +2 -0
  271. package/frontend/dist/js/ru-JKyTgPg9.js +2 -0
  272. package/frontend/dist/js/sv-BIkBLPSQ.js +2 -0
  273. package/frontend/dist/js/{teamEventStream-DGgjrVqw.js → teamEventStream-B37335ai.js} +1 -1
  274. package/frontend/dist/js/th-CZ_LcCU0.js +2 -0
  275. package/frontend/dist/js/tr-B265byx1.js +2 -0
  276. package/frontend/dist/js/{ui-CNcEDQ95.js → ui-CwzgKeUQ.js} +2 -2
  277. package/frontend/dist/js/ui-vendor-wayYH9Nf.js +177 -0
  278. package/frontend/dist/js/uk-VTAlChwf.js +2 -0
  279. package/frontend/dist/js/{useChat-YRODF1y1.js → useChat-yWCeS8Rw.js} +1 -1
  280. package/frontend/dist/js/useDictation-a98XeJii.js +1 -0
  281. package/frontend/dist/js/vi-D8rXh-53.js +2 -0
  282. package/frontend/dist/js/{workStatus-oU04ZrUq.js → work-DmJpVPPO.js} +1 -1
  283. package/frontend/dist/js/workApi-DXie0wBj.js +1 -0
  284. package/frontend/dist/js/workApi-Xmj4wmPi.js +5 -0
  285. package/frontend/dist/js/workModels-MzU2Ab7l.js +1 -0
  286. package/frontend/dist/js/zh-BEGd9iBD.js +2 -0
  287. package/package.json +39 -4
  288. package/scripts/prepare-dsh-provider.mjs +124 -0
  289. package/frontend/dist/assets/index-BXTzjRcS.js +0 -92
  290. package/frontend/dist/assets/index-uzzNXp5R.css +0 -1
  291. package/frontend/dist/js/ArtifactSlideOutPanel-DPWGjHhp.js +0 -1
  292. package/frontend/dist/js/AutomationsPage-DvsLZWtg.js +0 -1
  293. package/frontend/dist/js/ChannelsPage-D252gXwf.js +0 -1
  294. package/frontend/dist/js/ChatPage-D_CzOiHw.js +0 -14
  295. package/frontend/dist/js/ConnectModels-DYOtIOEY.js +0 -1
  296. package/frontend/dist/js/GalleryPage-BpK-vrvd.js +0 -1
  297. package/frontend/dist/js/HomePage-zJkkDNJl.js +0 -1
  298. package/frontend/dist/js/LibreClawPage-CAgNj9GM.js +0 -1
  299. package/frontend/dist/js/NotesPage-CNTqlwNc.js +0 -3
  300. package/frontend/dist/js/PluginUsagePage-Cp4j4-VZ.js +0 -1
  301. package/frontend/dist/js/RichMessageContent-BOY5jqj-.js +0 -1
  302. package/frontend/dist/js/SettingsModal-WAdVG4-g.js +0 -19
  303. package/frontend/dist/js/SystemPage-Dwi8leEQ.js +0 -1
  304. package/frontend/dist/js/UserManagementPanel-CfG67c_k.js +0 -1
  305. package/frontend/dist/js/WorkPage-D_cL9wp4.js +0 -8
  306. package/frontend/dist/js/api-29NO19CP.js +0 -14
  307. package/frontend/dist/js/api-DhafOTdF.js +0 -1
  308. package/frontend/dist/js/appVersion-BNuquyI6.js +0 -1
  309. package/frontend/dist/js/ar-WHne6B0o.js +0 -2
  310. package/frontend/dist/js/authStore-snvjjOuX.js +0 -1
  311. package/frontend/dist/js/bn-BZvCjqwO.js +0 -2
  312. package/frontend/dist/js/chatStore-BPpcL4I5.js +0 -3
  313. package/frontend/dist/js/composerStyles-bNlrIugf.js +0 -1
  314. package/frontend/dist/js/cs-DfSqWQ9V.js +0 -2
  315. package/frontend/dist/js/da-BmMLW4Dl.js +0 -2
  316. package/frontend/dist/js/de-BQMiQwQT.js +0 -2
  317. package/frontend/dist/js/es-DXf6jt4Z.js +0 -2
  318. package/frontend/dist/js/evaluationsApi-Btc9Mg9z.js +0 -1
  319. package/frontend/dist/js/fr-BD6nT1oc.js +0 -2
  320. package/frontend/dist/js/hi-BSuNic-8.js +0 -2
  321. package/frontend/dist/js/id-wodbwt3B.js +0 -2
  322. package/frontend/dist/js/is-CEjw-OJE.js +0 -2
  323. package/frontend/dist/js/it-X_pq8C7q.js +0 -2
  324. package/frontend/dist/js/ja-DWM2HZZd.js +0 -2
  325. package/frontend/dist/js/ko-DFi2khBB.js +0 -2
  326. package/frontend/dist/js/ms-DNQateTR.js +0 -2
  327. package/frontend/dist/js/nl-DSWhi8W8.js +0 -2
  328. package/frontend/dist/js/pl-W9WEDpZ3.js +0 -2
  329. package/frontend/dist/js/pt-DCCGvdNt.js +0 -2
  330. package/frontend/dist/js/ru-D-Ww6dXe.js +0 -2
  331. package/frontend/dist/js/sv-B0Iry-H3.js +0 -2
  332. package/frontend/dist/js/th-CEZS0WeE.js +0 -2
  333. package/frontend/dist/js/tr-BFJ8TeYb.js +0 -2
  334. package/frontend/dist/js/ui-vendor-LatG6rFF.js +0 -177
  335. package/frontend/dist/js/uk-BmW3yDel.js +0 -2
  336. package/frontend/dist/js/vi-Cu25FXnp.js +0 -2
  337. package/frontend/dist/js/work-DVgm81bJ.js +0 -1
  338. package/frontend/dist/js/workApi-BdUNugC3.js +0 -1
  339. package/frontend/dist/js/workApi-OieM8qEL.js +0 -6
  340. package/frontend/dist/js/zh-CuCAx3oH.js +0 -2
package/README.md CHANGED
@@ -310,6 +310,56 @@ HTTP, web search, MCP, memory, approvals, and schedules.
310
310
  - [Installed agent CLIs](https://docs.librewebui.org/AGENT_CLI_MODELS)
311
311
  - [Libre Claw integration](https://docs.librewebui.org/LIBRE_CLAW_INTEGRATION)
312
312
 
313
+ ## Cordis bridge
314
+
315
+ The optional Cordis bridge embeds the
316
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) engine inside
317
+ Libre WebUI's backend. The engine runs as a plugin tree in a
318
+ [Cordis](https://github.com/cordiverse/cordis) runtime that Libre WebUI hosts, so
319
+ its sessions, agents, and tools arrive as Cordis services rather than as
320
+ imported modules.
321
+
322
+ The engine is off by default. An administrator enables it in **Settings → User
323
+ Management → Access & policies → Cordis Engine**; the change takes effect
324
+ immediately, with no restart.
325
+
326
+ The engine still needs a composition, so configure one once:
327
+
328
+ ```bash
329
+ cd backend
330
+ cp cordis.patch.example.yml cordis.patch.yml
331
+ cp cordis.config.example.yml cordis.config.yml
332
+ ```
333
+
334
+ Because the engine is a plugin tree rather than an import, operators can:
335
+
336
+ - **Retarget the model provider** by editing YAML — Ollama, an
337
+ OpenAI-compatible gateway, or the first-party DeepSeek adapter.
338
+ - **Swap the model adapter at runtime** by reloading one plugin row, without
339
+ restarting Libre WebUI or losing the session store, tool registry, or agents.
340
+ - **Remove the engine cleanly** by disposing the tree, which withdraws its
341
+ services, releases its listeners, and disposes the agents it created.
342
+
343
+ Once enabled, administrators can use the **Cordis Engine** page for persistent
344
+ engine sessions and select **DeepSeek Harness** in Chat (with Agent CLI models also
345
+ enabled). In Work, select **DeepSeek Harness** in the **Engine** control to run its agent loop
346
+ through Work's existing container runtime, approval gates, and durable records.
347
+ Normal provider models remain available.
348
+
349
+ The host Engine is a shared administrator console for single-replica solo
350
+ installations. Its shipped filesystem tools are confined to the configured
351
+ workspace and use DSH's mutation policies. Work uses a separate in-memory DSH
352
+ composition with no host filesystem tools. Review the security notes before
353
+ enabling either surface.
354
+
355
+ ```bash
356
+ curl -s http://127.0.0.1:3001/api/cordis/health | jq
357
+ ```
358
+
359
+ - [Cordis bridge architecture](https://docs.librewebui.org/CORDIS_BRIDGE)
360
+ - [Cordis configuration reference](https://docs.librewebui.org/CORDIS_CONFIGURATION)
361
+ - [Writing Cordis plugins](https://docs.librewebui.org/CORDIS_PLUGIN_AUTHORING)
362
+
313
363
  ## Deployment options
314
364
 
315
365
  | Deployment | Command or link | Use case |
@@ -349,6 +399,9 @@ See the [deployment documentation](https://docs.librewebui.org) for details.
349
399
  - [Calendar](https://docs.librewebui.org/CALENDAR)
350
400
  - [Public API](https://docs.librewebui.org/PUBLIC_API)
351
401
  - [Plugin architecture](https://docs.librewebui.org/PLUGIN_ARCHITECTURE)
402
+ - [Cordis bridge](https://docs.librewebui.org/CORDIS_BRIDGE)
403
+ - [Cordis configuration](https://docs.librewebui.org/CORDIS_CONFIGURATION)
404
+ - [Writing Cordis plugins](https://docs.librewebui.org/CORDIS_PLUGIN_AUTHORING)
352
405
  - [Capability contracts](https://docs.librewebui.org/CAPABILITY_CONTRACTS)
353
406
  - [Authentication](https://docs.librewebui.org/AUTHENTICATION)
354
407
  - [Data portability](https://docs.librewebui.org/DATA_PORTABILITY)
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Transport- and implementation-neutral contracts for the embedded DSH engine.
3
+ *
4
+ * Everything Libre WebUI consumes from the DSH engine crosses this file. The
5
+ * route layer, the WebSocket bridge, and the frontend client all program
6
+ * against these shapes, and the `dsh-engine` Cordis plugin is what satisfies
7
+ * them. No Libre WebUI module outside `src/cordis/dsh/` may import a concrete
8
+ * `@deepseek-ai/dsh-*` package: that restriction is what makes the engine
9
+ * hot-swappable and what keeps the Cordis bridge a genuine seam rather than a
10
+ * direct dependency in disguise.
11
+ *
12
+ * @module cordis/contracts
13
+ */
14
+ /** Stable Cordis service name under which the engine contract is published. */
15
+ export declare const DSH_ENGINE_SERVICE: 'libreDshEngine';
16
+ /** Lifecycle phase of one engine service, mirroring Cordis fiber states. */
17
+ export type EngineServiceState =
18
+ /** The providing plugin has not been mounted yet. */
19
+ 'pending'
20
+ /** The providing plugin is mounted and the service is usable. */
21
+ | 'ready'
22
+ /** The providing plugin is mounted but cannot serve requests. */
23
+ | 'failed';
24
+ /** One engine service as observed through the contract. */
25
+ export interface EngineServiceStatus {
26
+ /** Service name as registered on the Cordis context. */
27
+ readonly name: string;
28
+ /** Current lifecycle phase. */
29
+ readonly state: EngineServiceState;
30
+ /** Human-readable reason, present only when `state` is `failed`. */
31
+ readonly detail?: string;
32
+ }
33
+ /** Role of one message projected from an engine session log. */
34
+ export type EngineMessageRole = 'user' | 'assistant' | 'system' | 'tool' | 'unknown';
35
+ /** One message projected from an engine session log. */
36
+ export interface EngineMessage {
37
+ /** Engine-assigned identifier, stable within a session. */
38
+ readonly id: string;
39
+ /** Projected author role. */
40
+ readonly role: EngineMessageRole;
41
+ /** Flattened text content; empty when the message carried none. */
42
+ readonly text: string;
43
+ /** Reasoning exposed by the provider, kept separate from the answer. */
44
+ readonly reasoning?: string;
45
+ /** Distinguishes human input from harness-injected runtime context. */
46
+ readonly source?: 'user' | 'model' | 'system' | 'context' | 'tool';
47
+ readonly toolCalls?: readonly EngineToolCall[];
48
+ readonly toolResults?: readonly EngineToolResult[];
49
+ /** Engine sequence number of the originating event, when known. */
50
+ readonly seq?: number;
51
+ }
52
+ /** One structured model-requested operation. */
53
+ export interface EngineToolCall {
54
+ readonly callId: string;
55
+ readonly name: string;
56
+ readonly arguments: string;
57
+ }
58
+ /** One structured operation result. */
59
+ export interface EngineToolResult {
60
+ readonly callId: string;
61
+ readonly name?: string;
62
+ readonly output: string;
63
+ readonly isError: boolean;
64
+ }
65
+ export type EnginePermissionMode = 'read-only' | 'workspace-write';
66
+ export interface EngineSessionSettings {
67
+ readonly model?: string;
68
+ readonly permissionMode: EnginePermissionMode;
69
+ }
70
+ export interface EngineApproval {
71
+ readonly id: string;
72
+ readonly sessionId: string;
73
+ readonly callId?: string;
74
+ readonly toolName: string;
75
+ readonly reason?: string;
76
+ }
77
+ export type EngineApprovalOutcome = 'allowed-once' | 'rejected' | 'cancelled' | 'unavailable';
78
+ /** Summary of one engine session. */
79
+ export interface EngineSessionSummary {
80
+ /** Opaque session identifier used by every other session operation. */
81
+ readonly id: string;
82
+ /** Engine-supplied title, absent until one is generated. */
83
+ readonly title?: string;
84
+ /** Epoch milliseconds when the session was created, when known. */
85
+ readonly createdAt?: number;
86
+ /** Number of events currently recorded for the session. */
87
+ readonly eventCount: number;
88
+ /** Canonical working directory recorded for this session. */
89
+ readonly workspacePath?: string;
90
+ }
91
+ /** A live or restored engine session. */
92
+ export interface EngineSession extends EngineSessionSummary {
93
+ readonly active: boolean;
94
+ readonly settings: EngineSessionSettings;
95
+ readonly capabilities: {
96
+ readonly permissions: boolean;
97
+ readonly approvals: boolean;
98
+ };
99
+ readonly approvals: readonly EngineApproval[];
100
+ /** Messages projected from the session log, oldest first. */
101
+ readonly messages: readonly EngineMessage[];
102
+ }
103
+ /** Identifies one live agent. */
104
+ export interface EngineAgentSummary {
105
+ /** Agent identifier, equal to its backing session id. */
106
+ readonly id: string;
107
+ /** Whether this agent is a runtime root rather than a child of another. */
108
+ readonly root: boolean;
109
+ }
110
+ /** One tool the engine can expose to a model. */
111
+ export interface EngineToolSummary {
112
+ /** Model-facing tool name. */
113
+ readonly name: string;
114
+ /** Model-facing description, empty when the tool declared none. */
115
+ readonly description: string;
116
+ }
117
+ /** Options accepted when creating an engine session. */
118
+ export interface EngineCreateSessionOptions {
119
+ /** Absolute working directory recorded in the session header. */
120
+ readonly cwd: string;
121
+ /** A temporary Chat invocation, excluded from the engine console. */
122
+ readonly transient?: boolean;
123
+ readonly model?: string;
124
+ readonly permissionMode?: EnginePermissionMode;
125
+ /** Authenticated caller used to validate a requested model; never persisted. */
126
+ readonly userId?: string;
127
+ /** Optional author-supplied title. */
128
+ readonly title?: string;
129
+ }
130
+ /** Options accepted when creating an agent bound to a session. */
131
+ export interface EngineCreateAgentOptions {
132
+ /** Session the agent should operate on. */
133
+ readonly sessionId: string;
134
+ /** Absolute working directory recorded in the session header. */
135
+ readonly cwd: string;
136
+ /** Provider route name, when the caller wants to pin one. */
137
+ readonly provider?: string;
138
+ /** Model identifier, when the caller wants to pin one. */
139
+ readonly model?: string;
140
+ }
141
+ /** One increment of a streaming agent response. */
142
+ export type EngineStreamChunk =
143
+ /** Incremental assistant text. */
144
+ {
145
+ readonly type: 'text';
146
+ readonly text: string;
147
+ }
148
+ /**
149
+ * Incremental reasoning the model exposed.
150
+ *
151
+ * Separate from `text` because it is not part of the reply: a consumer may
152
+ * show it, collapse it, or drop it, and mixing it into the answer would make
153
+ * that choice impossible.
154
+ */
155
+ | {
156
+ readonly type: 'reasoning';
157
+ readonly text: string;
158
+ }
159
+ /**
160
+ * The turn failed before producing a reply.
161
+ *
162
+ * Carried separately from `done` because the engine reports a structured
163
+ * failure reason, and collapsing it into a terminal status would leave a
164
+ * caller with "the turn ended" and no way to say why.
165
+ */
166
+ | {
167
+ readonly type: 'error';
168
+ readonly message: string;
169
+ readonly code?: string;
170
+ }
171
+ /** A tool call the agent started. */
172
+ | {
173
+ readonly type: 'tool-call';
174
+ readonly callId: string;
175
+ readonly name: string;
176
+ readonly arguments?: string;
177
+ }
178
+ /** A tool call that finished, successfully or not. */
179
+ | {
180
+ readonly type: 'tool-result';
181
+ readonly callId: string;
182
+ readonly name: string;
183
+ readonly isError: boolean;
184
+ readonly output?: string;
185
+ } | {
186
+ readonly type: 'approval-request';
187
+ readonly approval: EngineApproval;
188
+ } | {
189
+ readonly type: 'approval-decision';
190
+ readonly approvalId: string;
191
+ readonly outcome: EngineApprovalOutcome;
192
+ }
193
+ /** A turn boundary; the terminal chunk of one response. */
194
+ | {
195
+ readonly type: 'done';
196
+ readonly reason: string;
197
+ readonly interrupted?: boolean;
198
+ };
199
+ /** Subscription handle returned by {@link EngineStreamHandle}. */
200
+ export interface EngineStreamSubscription {
201
+ /** Stop receiving chunks. Safe to call more than once. */
202
+ unsubscribe(): void;
203
+ }
204
+ /** Handle over one in-flight streaming response. */
205
+ export interface EngineStreamHandle {
206
+ /** Session the response belongs to. */
207
+ readonly sessionId: string;
208
+ /**
209
+ * Register a chunk listener.
210
+ *
211
+ * Everything the response has already produced is replayed first, so a
212
+ * listener that attaches after a fast answer still receives it.
213
+ */
214
+ subscribe(listener: (chunk: EngineStreamChunk) => void): EngineStreamSubscription;
215
+ /**
216
+ * Release this handle's resources.
217
+ *
218
+ * Called when a client disconnects, so an abandoned response stops buffering
219
+ * for a reader that is gone. The turn stays durable: its transcript remains
220
+ * readable and the next message is not blocked.
221
+ */
222
+ close(): void;
223
+ }
224
+ /**
225
+ * The engine contract published as the `libreDshEngine` Cordis service.
226
+ *
227
+ * Every method rejects rather than returning a partial result when the engine
228
+ * is not ready, so callers never mistake an unmounted engine for an empty one.
229
+ */
230
+ export interface DshEngine {
231
+ /** Report the lifecycle state of each engine service. */
232
+ status(): readonly EngineServiceStatus[];
233
+ /** Model defaults of the running composition, before per-session choices. */
234
+ modelConfiguration(): {
235
+ readonly provider?: string;
236
+ readonly model?: string;
237
+ };
238
+ /** List live and restored sessions, newest first. */
239
+ listSessions(): Promise<readonly EngineSessionSummary[]>;
240
+ /** Read one session with its projected messages. */
241
+ getSession(sessionId: string): Promise<EngineSession | undefined>;
242
+ /** Create a session. */
243
+ createSession(options: EngineCreateSessionOptions): Promise<EngineSession>;
244
+ updateSessionSettings(sessionId: string, settings: Partial<EngineSessionSettings>, options?: {
245
+ readonly userId?: string;
246
+ }): Promise<EngineSession>;
247
+ decideApproval(sessionId: string, approvalId: string, outcome: 'allowed-once' | 'rejected'): Promise<boolean>;
248
+ /** Delete a session and dispose any agent still bound to it. */
249
+ deleteSession(sessionId: string): Promise<boolean>;
250
+ /** List live agents. */
251
+ listAgents(): Promise<readonly EngineAgentSummary[]>;
252
+ /** List tools currently registered with the engine. */
253
+ listTools(): Promise<readonly EngineToolSummary[]>;
254
+ /**
255
+ * Send a user message to a session and stream the agent response.
256
+ *
257
+ * The returned handle is usable immediately: chunks emitted before the first
258
+ * subscriber attaches are buffered and replayed to that subscriber, so a
259
+ * caller can await the HTTP response and then attach without losing text.
260
+ */
261
+ sendMessage(sessionId: string, text: string, options?: {
262
+ readonly cwd?: string;
263
+ readonly userId?: string;
264
+ }): Promise<EngineStreamHandle>;
265
+ /** Authenticated actor attached to the current turn only. */
266
+ requestUserId(sessionId: string): string | undefined;
267
+ /** Cancel the in-flight response for a session, if any. */
268
+ cancel(sessionId: string): Promise<boolean>;
269
+ }
270
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/cordis/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
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
+ /**
18
+ * Transport- and implementation-neutral contracts for the embedded DSH engine.
19
+ *
20
+ * Everything Libre WebUI consumes from the DSH engine crosses this file. The
21
+ * route layer, the WebSocket bridge, and the frontend client all program
22
+ * against these shapes, and the `dsh-engine` Cordis plugin is what satisfies
23
+ * them. No Libre WebUI module outside `src/cordis/dsh/` may import a concrete
24
+ * `@deepseek-ai/dsh-*` package: that restriction is what makes the engine
25
+ * hot-swappable and what keeps the Cordis bridge a genuine seam rather than a
26
+ * direct dependency in disguise.
27
+ *
28
+ * @module cordis/contracts
29
+ */
30
+ /** Stable Cordis service name under which the engine contract is published. */
31
+ export const DSH_ENGINE_SERVICE = 'libreDshEngine';
32
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/cordis/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;GAYG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAyB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { DshEngine } from '../contracts.js';
2
+ import type { BridgeModel } from './librewebui-llm-adapter.js';
3
+ /** Decode only the agent envelope; the provider route stays qualified. */
4
+ export declare function dshProviderModel(selector: string): string | undefined;
5
+ /** Discovery reads configuration but never starts the optional engine. */
6
+ export declare function dshChatModelChoices(userId: string): Promise<readonly BridgeModel[]>;
7
+ /** Validate a saved choice before starting an engine or allocating a session. */
8
+ export declare function resolveDshSelectedModel(selector: string, userId: string): Promise<string | undefined>;
9
+ export declare function requireDshProviderRoute(engine: DshEngine): void;
10
+ /** Titles and summaries use the selected LLM directly, without an agent turn. */
11
+ export declare function resolveDshProviderTarget(selector: string, userId: string): Promise<{
12
+ model: string;
13
+ providerType: 'ollama' | 'plugin' | 'dsh';
14
+ providerId: string | null;
15
+ }>;
16
+ //# sourceMappingURL=chat-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-model.d.ts","sourceRoot":"","sources":["../../../src/cordis/dsh/chat-model.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAiB/D,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAarE;AAaD,0EAA0E;AAC1E,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CA0BjC;AAED,iFAAiF;AACjF,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAK/D;AAED,iFAAiF;AACjF,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC1C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,CAoBD"}
@@ -0,0 +1,104 @@
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 { getAgentCliModelsEnabled } from '../../services/agentAccessService.js';
18
+ import { userModel } from '../../models/userModel.js';
19
+ import { readCompositionFile } from '../host/composition.js';
20
+ import { isProviderModelIdentity, parseNativeDshModelId, } from './model-identity.js';
21
+ import { libreWebUiProviderHandler, resolveCordisProviderTarget, resolveEngineDefaultModel, } from './provider-handler.js';
22
+ const DSH_PREFIX = 'dsh:';
23
+ const PROVIDER_ROUTE = 'libre-webui';
24
+ /** Decode only the agent envelope; the provider route stays qualified. */
25
+ export function dshProviderModel(selector) {
26
+ if (selector === 'dsh')
27
+ return undefined;
28
+ const model = selector.startsWith(DSH_PREFIX)
29
+ ? selector.slice(DSH_PREFIX.length)
30
+ : '';
31
+ if (selector.length > 2048 ||
32
+ (!model.startsWith('lwui:') && !model.startsWith('native:')) ||
33
+ !isProviderModelIdentity(model)) {
34
+ throw new Error('Choose a valid DeepSeek Harness provider model.');
35
+ }
36
+ return model;
37
+ }
38
+ async function requireDshChatAccess(userId) {
39
+ const user = await userModel.getUserById(userId);
40
+ if (user?.role !== 'admin' || user.status !== 'active')
41
+ throw new Error('DeepSeek Harness requires an active administrator.');
42
+ if (!(await getAgentCliModelsEnabled()))
43
+ throw new Error('Agent CLI models are disabled on this server.');
44
+ const { isCordisBridgeEnabled } = await import('../runtime.js');
45
+ if (!(await isCordisBridgeEnabled()))
46
+ throw new Error('The DeepSeek Harness engine is not available.');
47
+ }
48
+ /** Discovery reads configuration but never starts the optional engine. */
49
+ export async function dshChatModelChoices(userId) {
50
+ await requireDshChatAccess(userId);
51
+ const { cordisRuntimeConfig } = await import('../runtime.js');
52
+ const { BRIDGE_ENTRY_ID } = await import('../host/host.js');
53
+ const config = cordisRuntimeConfig();
54
+ const row = readCompositionFile(config.configPath).find(entry => entry.id === BRIDGE_ENTRY_ID);
55
+ if (!row || row.disabled)
56
+ return [];
57
+ const rowConfig = row.config && typeof row.config === 'object' && !Array.isArray(row.config)
58
+ ? row.config
59
+ : {};
60
+ // A row pin wins over host defaults, including an unknown !!js expression.
61
+ // Such compositions keep their base profile rather than advertise a route
62
+ // that may not be the one their engine will execute.
63
+ const provider = Object.prototype.hasOwnProperty.call(rowConfig, 'defaultProvider')
64
+ ? rowConfig.defaultProvider
65
+ : config.model.provider === 'libre-webui'
66
+ ? PROVIDER_ROUTE
67
+ : config.model.route;
68
+ if (provider !== PROVIDER_ROUTE)
69
+ return [];
70
+ return libreWebUiProviderHandler.listModels(userId);
71
+ }
72
+ /** Validate a saved choice before starting an engine or allocating a session. */
73
+ export async function resolveDshSelectedModel(selector, userId) {
74
+ const model = dshProviderModel(selector);
75
+ await requireDshChatAccess(userId);
76
+ if (model &&
77
+ !(await dshChatModelChoices(userId)).some(candidate => candidate.id === model))
78
+ throw new Error('The selected DeepSeek Harness model is unavailable.');
79
+ return model;
80
+ }
81
+ export function requireDshProviderRoute(engine) {
82
+ if (engine.modelConfiguration().provider !== PROVIDER_ROUTE)
83
+ throw new Error('This DeepSeek Harness composition does not use Libre WebUI model providers.');
84
+ }
85
+ /** Titles and summaries use the selected LLM directly, without an agent turn. */
86
+ export async function resolveDshProviderTarget(selector, userId) {
87
+ const selected = await resolveDshSelectedModel(selector, userId);
88
+ if (selected && parseNativeDshModelId(selected))
89
+ return resolveCordisProviderTarget(selected, userId);
90
+ const { getCordisEngine } = await import('../runtime.js');
91
+ const result = await getCordisEngine();
92
+ if (!result.ok)
93
+ throw new Error(`The DeepSeek Harness engine is not available: ${result.reason}`);
94
+ requireDshProviderRoute(result.engine);
95
+ const configured = result.engine.modelConfiguration().model;
96
+ const model = selected ??
97
+ (isProviderModelIdentity(configured)
98
+ ? configured
99
+ : await resolveEngineDefaultModel(userId));
100
+ if (!model)
101
+ throw new Error('No DeepSeek Harness provider model is available.');
102
+ return resolveCordisProviderTarget(model, userId);
103
+ }
104
+ //# sourceMappingURL=chat-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-model.js","sourceRoot":"","sources":["../../../src/cordis/dsh/chat-model.ts"],"names":[],"mappings":"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"}