libre-webui 0.37.2 → 0.39.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 (432) hide show
  1. package/README.md +29 -65
  2. package/backend/dist/db.js +1 -1
  3. package/backend/dist/index.d.ts.map +1 -1
  4. package/backend/dist/index.js +13 -36
  5. package/backend/dist/index.js.map +1 -1
  6. package/backend/dist/main.js +0 -12
  7. package/backend/dist/main.js.map +1 -1
  8. package/backend/dist/middleware/cors.d.ts.map +1 -1
  9. package/backend/dist/middleware/cors.js +5 -0
  10. package/backend/dist/middleware/cors.js.map +1 -1
  11. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
  12. package/backend/dist/persistence/postgresExtensionRepositories.js +2 -4
  13. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
  14. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
  15. package/backend/dist/persistence/postgresMigrationRegistry.js +2 -0
  16. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  17. package/backend/dist/persistence/postgresWorkRunThinkMigration.d.ts +9 -0
  18. package/backend/dist/persistence/postgresWorkRunThinkMigration.d.ts.map +1 -0
  19. package/backend/dist/persistence/postgresWorkRunThinkMigration.js +39 -0
  20. package/backend/dist/persistence/postgresWorkRunThinkMigration.js.map +1 -0
  21. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  22. package/backend/dist/persistence/sqliteExtensionRepositories.js +2 -4
  23. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  24. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  25. package/backend/dist/persistence/sqliteMigrations.js +20 -0
  26. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  27. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  28. package/backend/dist/persistence/sqliteToPostgresMigration.js +1 -0
  29. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  30. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -1
  31. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +3 -2
  32. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js.map +1 -1
  33. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts.map +1 -1
  34. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js +3 -3
  35. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -1
  36. package/backend/dist/platform/workPersistence/types.d.ts +5 -0
  37. package/backend/dist/platform/workPersistence/types.d.ts.map +1 -1
  38. package/backend/dist/platform/workPersistence/types.js.map +1 -1
  39. package/backend/dist/routes/agentCli.d.ts.map +1 -1
  40. package/backend/dist/routes/agentCli.js +8 -3
  41. package/backend/dist/routes/agentCli.js.map +1 -1
  42. package/backend/dist/routes/{cordis.d.ts → strands.d.ts} +1 -1
  43. package/backend/dist/routes/strands.d.ts.map +1 -0
  44. package/backend/dist/routes/strands.js +300 -0
  45. package/backend/dist/routes/strands.js.map +1 -0
  46. package/backend/dist/routes/work.d.ts.map +1 -1
  47. package/backend/dist/routes/work.js +26 -23
  48. package/backend/dist/routes/work.js.map +1 -1
  49. package/backend/dist/services/agentAccessService.d.ts +0 -5
  50. package/backend/dist/services/agentAccessService.d.ts.map +1 -1
  51. package/backend/dist/services/agentAccessService.js +7 -35
  52. package/backend/dist/services/agentAccessService.js.map +1 -1
  53. package/backend/dist/services/agentCliService.d.ts +16 -23
  54. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  55. package/backend/dist/services/agentCliService.js +85 -112
  56. package/backend/dist/services/agentCliService.js.map +1 -1
  57. package/backend/dist/services/authService.d.ts +3 -3
  58. package/backend/dist/services/authService.d.ts.map +1 -1
  59. package/backend/dist/services/authService.js +3 -4
  60. package/backend/dist/services/authService.js.map +1 -1
  61. package/backend/dist/services/authorizationService.d.ts +1 -1
  62. package/backend/dist/services/authorizationService.d.ts.map +1 -1
  63. package/backend/dist/services/authorizationService.js +17 -8
  64. package/backend/dist/services/authorizationService.js.map +1 -1
  65. package/backend/dist/services/followUpService.d.ts +4 -1
  66. package/backend/dist/services/followUpService.d.ts.map +1 -1
  67. package/backend/dist/services/followUpService.js +23 -2
  68. package/backend/dist/services/followUpService.js.map +1 -1
  69. package/backend/dist/services/pluginService.d.ts.map +1 -1
  70. package/backend/dist/services/pluginService.js +10 -6
  71. package/backend/dist/services/pluginService.js.map +1 -1
  72. package/backend/dist/services/pluginUsageService.d.ts +0 -34
  73. package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
  74. package/backend/dist/services/pluginUsageService.js +0 -62
  75. package/backend/dist/services/pluginUsageService.js.map +1 -1
  76. package/backend/dist/services/strandsAccessService.d.ts +26 -0
  77. package/backend/dist/services/strandsAccessService.d.ts.map +1 -0
  78. package/backend/dist/services/strandsAccessService.js +95 -0
  79. package/backend/dist/services/strandsAccessService.js.map +1 -0
  80. package/backend/dist/services/thinkingSummaryService.d.ts +2 -3
  81. package/backend/dist/services/thinkingSummaryService.d.ts.map +1 -1
  82. package/backend/dist/services/thinkingSummaryService.js +13 -27
  83. package/backend/dist/services/thinkingSummaryService.js.map +1 -1
  84. package/backend/dist/services/titleGenerationService.d.ts +7 -18
  85. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  86. package/backend/dist/services/titleGenerationService.js +15 -36
  87. package/backend/dist/services/titleGenerationService.js.map +1 -1
  88. package/backend/dist/services/workAgentService.d.ts +1 -1
  89. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  90. package/backend/dist/services/workAgentService.js +17 -60
  91. package/backend/dist/services/workAgentService.js.map +1 -1
  92. package/backend/dist/services/workModelProviderService.d.ts +1 -4
  93. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  94. package/backend/dist/services/workModelProviderService.js +60 -50
  95. package/backend/dist/services/workModelProviderService.js.map +1 -1
  96. package/backend/dist/services/workTaskService.d.ts +3 -2
  97. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  98. package/backend/dist/services/workTaskService.js +11 -7
  99. package/backend/dist/services/workTaskService.js.map +1 -1
  100. package/backend/dist/strands/catalog.d.ts +57 -0
  101. package/backend/dist/strands/catalog.d.ts.map +1 -0
  102. package/backend/dist/strands/catalog.js +241 -0
  103. package/backend/dist/strands/catalog.js.map +1 -0
  104. package/backend/dist/strands/engine.d.ts +131 -0
  105. package/backend/dist/strands/engine.d.ts.map +1 -0
  106. package/backend/dist/strands/engine.js +477 -0
  107. package/backend/dist/strands/engine.js.map +1 -0
  108. package/backend/dist/strands/harness.d.ts +14 -0
  109. package/backend/dist/strands/harness.d.ts.map +1 -0
  110. package/backend/dist/strands/harness.js +41 -0
  111. package/backend/dist/strands/harness.js.map +1 -0
  112. package/backend/dist/strands/model.d.ts +24 -0
  113. package/backend/dist/strands/model.d.ts.map +1 -0
  114. package/backend/dist/strands/model.js +381 -0
  115. package/backend/dist/strands/model.js.map +1 -0
  116. package/backend/dist/strands/runtime.d.ts +4 -0
  117. package/backend/dist/strands/runtime.d.ts.map +1 -0
  118. package/backend/dist/{cordis/work-model.js → strands/runtime.js} +16 -12
  119. package/backend/dist/strands/runtime.js.map +1 -0
  120. package/backend/dist/strands/sandbox.d.ts +24 -0
  121. package/backend/dist/strands/sandbox.d.ts.map +1 -0
  122. package/backend/dist/strands/sandbox.js +156 -0
  123. package/backend/dist/strands/sandbox.js.map +1 -0
  124. package/backend/dist/strands/work-driver.d.ts +11 -0
  125. package/backend/dist/strands/work-driver.d.ts.map +1 -0
  126. package/backend/dist/strands/work-driver.js +443 -0
  127. package/backend/dist/strands/work-driver.js.map +1 -0
  128. package/backend/dist/strands/work-model.d.ts +7 -0
  129. package/backend/dist/strands/work-model.d.ts.map +1 -0
  130. package/backend/dist/strands/work-model.js +42 -0
  131. package/backend/dist/strands/work-model.js.map +1 -0
  132. package/backend/dist/types/work.d.ts +7 -11
  133. package/backend/dist/types/work.d.ts.map +1 -1
  134. package/backend/dist/types/work.js.map +1 -1
  135. package/backend/dist/utils/bedrockMantle.d.ts +46 -0
  136. package/backend/dist/utils/bedrockMantle.d.ts.map +1 -0
  137. package/backend/dist/utils/bedrockMantle.js +206 -0
  138. package/backend/dist/utils/bedrockMantle.js.map +1 -0
  139. package/backend/dist/utils/corsOriginPolicy.d.ts +10 -0
  140. package/backend/dist/utils/corsOriginPolicy.d.ts.map +1 -0
  141. package/backend/dist/utils/corsOriginPolicy.js +70 -0
  142. package/backend/dist/utils/corsOriginPolicy.js.map +1 -0
  143. package/backend/dist/utils/pluginChatAdapter.d.ts +36 -0
  144. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  145. package/backend/dist/utils/pluginChatAdapter.js +122 -47
  146. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  147. package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
  148. package/backend/dist/utils/pluginDefinitionTrust.js +3 -2
  149. package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
  150. package/backend/dist/utils/pluginValidation.d.ts +1 -1
  151. package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
  152. package/backend/dist/utils/pluginValidation.js +11 -0
  153. package/backend/dist/utils/pluginValidation.js.map +1 -1
  154. package/backend/package.json +6 -36
  155. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  156. package/frontend/dist/artifact-runtime/babel.js +170 -170
  157. package/frontend/dist/artifact-runtime/framer-motion.js +3 -3
  158. package/frontend/dist/artifact-runtime/lucide-react.js +1 -1
  159. package/frontend/dist/artifact-runtime/mathjs.js +1 -1
  160. package/frontend/dist/artifact-runtime/mermaid.js +1 -1
  161. package/frontend/dist/artifact-runtime/plotly.js +1 -1
  162. package/frontend/dist/artifact-runtime/react.js +3 -3
  163. package/frontend/dist/assets/index-D99DS5c6.js +57 -0
  164. package/frontend/dist/assets/index-Dz1JufgZ.css +1 -0
  165. package/frontend/dist/assets/{markdown-math-D1Bj3pDB.css → markdown-math-DzFXvcrH.css} +1 -1
  166. package/frontend/dist/index.html +34 -34
  167. package/frontend/dist/js/{ArtifactContainer-D4v4l15L.js → ArtifactContainer-Cn7X9HGm.js} +1 -1
  168. package/frontend/dist/js/{ArtifactDemoPage-B2uaVpsi.js → ArtifactDemoPage-Ddpy2O_v.js} +1 -1
  169. package/frontend/dist/js/{ArtifactSandboxFrame-DlWJHI-r.js → ArtifactSandboxFrame-CdsAqv8H.js} +1 -1
  170. package/frontend/dist/js/{ArtifactSlideOutPanel-laZ98QKB.js → ArtifactSlideOutPanel-cVd9X80o.js} +1 -1
  171. package/frontend/dist/js/AutomationModal-B4UaWjkk.js +1 -0
  172. package/frontend/dist/js/AutomationsPage-huCrvLUp.js +1 -0
  173. package/frontend/dist/js/{AvatarUpload-KaBaTKoG.js → AvatarUpload-CG-w6Mpt.js} +1 -1
  174. package/frontend/dist/js/{Button-CGMYia4g.js → Button-j68Q8KVh.js} +1 -1
  175. package/frontend/dist/js/{CalendarPage-Dc7r-86c.js → CalendarPage-CZXT1w99.js} +1 -1
  176. package/frontend/dist/js/ChannelsPage-DbtdHnSL.js +1 -0
  177. package/frontend/dist/js/ChatPage-BZE65kiq.js +14 -0
  178. package/frontend/dist/js/ConnectModels-DD4bLgdq.js +1 -0
  179. package/frontend/dist/js/{EvaluationsPage-BB7sPhIR.js → EvaluationsPage-Dq53LaXd.js} +2 -2
  180. package/frontend/dist/js/{FirstTimeSetup-elqSi9JH.js → FirstTimeSetup-BoJIfuQT.js} +1 -1
  181. package/frontend/dist/js/GalleryPage-DKwqeB2A.js +1 -0
  182. package/frontend/dist/js/HomePage-C8bCJfls.js +1 -0
  183. package/frontend/dist/js/LanguageSwitcher-B_YyU5JG.js +1 -0
  184. package/frontend/dist/js/{Logo-HZvdAk2c.js → Logo-DnfVtjgj.js} +1 -1
  185. package/frontend/dist/js/{LogoMark-GJnfMXsk.js → LogoMark-BzObGdA9.js} +1 -1
  186. package/frontend/dist/js/{ModelManagerModals-Bk6OQzJI.js → ModelManagerModals-BzjZ-QwL.js} +1 -1
  187. package/frontend/dist/js/NotesPage-CnaAp_w_.js +3 -0
  188. package/frontend/dist/js/{OptimizedSyntaxHighlighter-CzzV6ONG.js → OptimizedSyntaxHighlighter-B0g8cxZQ.js} +1 -1
  189. package/frontend/dist/js/OptimizedSyntaxHighlighter-B_BbHeO1.js +1 -0
  190. package/frontend/dist/js/{PasswordStrengthMeter-DasfJa4P.js → PasswordStrengthMeter-DI4RDv67.js} +1 -1
  191. package/frontend/dist/js/{PersonasPage-CIJINcQK.js → PersonasPage-CH3GUKph.js} +2 -2
  192. package/frontend/dist/js/PluginUsagePage-d54K2gAj.js +1 -0
  193. package/frontend/dist/js/{RichMessageContent-DxCHlUlY.js → RichMessageContent-BfYbVBFz.js} +2 -2
  194. package/frontend/dist/js/RichMessageContent-CDxxs3Tt.js +1 -0
  195. package/frontend/dist/js/SettingsModal-BvtJcvow.js +19 -0
  196. package/frontend/dist/js/{SettingsToggle-oxvw7ulA.js → SettingsToggle-DrJ0Bapi.js} +1 -1
  197. package/frontend/dist/js/{ShareDialog-Bhpt_Y1N.js → ShareDialog-DaSxkTKS.js} +1 -1
  198. package/frontend/dist/js/StrandsPage-BQwz0mWq.js +1 -0
  199. package/frontend/dist/js/{SystemPage-BfhVXqar.js → SystemPage-BqNZoFxR.js} +1 -1
  200. package/frontend/dist/js/{TurnstileWidget-CVepEMEQ.js → TurnstileWidget-tI50c7Kc.js} +1 -1
  201. package/frontend/dist/js/{UserManagementPage-2yHv89ZA.js → UserManagementPage-UvPjA9RP.js} +1 -1
  202. package/frontend/dist/js/UserManagementPanel-C3T1ReJJ.js +1 -0
  203. package/frontend/dist/js/{WhatsNewModal-Dl69bG2T.js → WhatsNewModal-CLcU2Ugk.js} +1 -1
  204. package/frontend/dist/js/WorkPage-BpjGn--1.js +8 -0
  205. package/frontend/dist/js/api-BrHW-VGd.js +14 -0
  206. package/frontend/dist/js/api-K_hhqPdx.js +1 -0
  207. package/frontend/dist/js/{appNavigation-R8iKverf.js → appNavigation-B6xYIgLi.js} +1 -1
  208. package/frontend/dist/js/appStore-DkRdQQeY.js +2 -0
  209. package/frontend/dist/js/appVersion-BVtSqLVj.js +1 -0
  210. package/frontend/dist/js/ar-XTZGEtBr.js +2 -0
  211. package/frontend/dist/js/authStore-DBS6Kbvh.js +1 -0
  212. package/frontend/dist/js/{authStore-D8fc-Hl0.js → authStore-DjAsRpNL.js} +3 -3
  213. package/frontend/dist/js/bn-JiK7ZWmy.js +2 -0
  214. package/frontend/dist/js/chatStore-DpVxt9VX.js +3 -0
  215. package/frontend/dist/js/{client-BeJbHHWx.js → client-DppLngAs.js} +2 -2
  216. package/frontend/dist/js/{config-D6Kcp5n3.js → config-4_s8hdqO.js} +1 -1
  217. package/frontend/dist/js/cs-D8ju18CO.js +2 -0
  218. package/frontend/dist/js/da-BJWcAoUc.js +2 -0
  219. package/frontend/dist/js/de-CLJLmy69.js +2 -0
  220. package/frontend/dist/js/es-BvqHEL-3.js +2 -0
  221. package/frontend/dist/js/{evaluationsApi-2YwZBPk5.js → evaluationsApi-DyuW7IJ_.js} +1 -1
  222. package/frontend/dist/js/fr-B8ZoZomI.js +2 -0
  223. package/frontend/dist/js/hi-AzJLALo-.js +2 -0
  224. package/frontend/dist/js/id-DZYGQhvC.js +2 -0
  225. package/frontend/dist/js/is-Da_kvtzW.js +2 -0
  226. package/frontend/dist/js/it-B90zSlqn.js +2 -0
  227. package/frontend/dist/js/ja-DU_K1GOr.js +2 -0
  228. package/frontend/dist/js/ko-DicfoO-e.js +2 -0
  229. package/frontend/dist/js/{markdown-CZ1tYEW8.js → markdown-DU84620G.js} +1 -1
  230. package/frontend/dist/js/{markdown-core-KjS96SYW.js → markdown-core-Cyql92Hg.js} +1 -1
  231. package/frontend/dist/js/{markdown-html-DQEwrWcf.js → markdown-html-CUc2fCgY.js} +1 -1
  232. package/frontend/dist/js/{markdown-math-CKi32S5d.js → markdown-math-DxPfMKvO.js} +1 -1
  233. package/frontend/dist/js/{markdownHtml-lrXhxBhK.js → markdownHtml-KhS0cFNH.js} +1 -1
  234. package/frontend/dist/js/markdownMath-CsfRQAcz.js +1 -0
  235. package/frontend/dist/js/{messageCodeStyles-D4haBw80.js → messageCodeStyles-CuQPkfEK.js} +1 -1
  236. package/frontend/dist/js/ms-CfH7wjUY.js +2 -0
  237. package/frontend/dist/js/nl-ELlOz-B3.js +2 -0
  238. package/frontend/dist/js/pl-33dayyUk.js +2 -0
  239. package/frontend/dist/js/pt-aIXSQPCT.js +2 -0
  240. package/frontend/dist/js/react-vendor-CR5VJ85Q.js +9 -0
  241. package/frontend/dist/js/{router-vendor-HZm4FR0A.js → router-vendor-DqMnEJWK.js} +1 -1
  242. package/frontend/dist/js/ru-BSvGtBtW.js +2 -0
  243. package/frontend/dist/js/{standalone-DbyFjvTU.js → standalone-D_lg5NC9.js} +1 -1
  244. package/frontend/dist/js/strandsApi-BFbeEpAY.js +2 -0
  245. package/frontend/dist/js/sv-B7KOz81W.js +2 -0
  246. package/frontend/dist/js/{syntax-highlight-DNc3FFCa.js → syntax-highlight-D7dQ5s5-.js} +1 -1
  247. package/frontend/dist/js/{teamEventStream-omPy51va.js → teamEventStream-DsAS6P4m.js} +1 -1
  248. package/frontend/dist/js/th-DgpjGxvA.js +2 -0
  249. package/frontend/dist/js/tr-BQTbl2h-.js +2 -0
  250. package/frontend/dist/js/{ui-D5-4niRk.js → ui-Aq8MP7Ph.js} +2 -2
  251. package/frontend/dist/js/ui-vendor-DVTj_sKN.js +1 -0
  252. package/frontend/dist/js/uk-JLymloot.js +2 -0
  253. package/frontend/dist/js/{useChat-DnGClJeX.js → useChat-D3ZAGz70.js} +4 -4
  254. package/frontend/dist/js/useDialogFocus-zSGHkpE4.js +1 -0
  255. package/frontend/dist/js/useDictation-B6l8QzeM.js +1 -0
  256. package/frontend/dist/js/{useQuery-hWmQjdLu.js → useQuery-BTKpXudI.js} +1 -1
  257. package/frontend/dist/js/{useTranslation-B9kflK9S.js → useTranslation-Boi0fB1B.js} +1 -1
  258. package/frontend/dist/js/utils-B-Bhh1pF.js +1 -0
  259. package/frontend/dist/js/utils-vendor-DPJG-EG_.js +1 -0
  260. package/frontend/dist/js/vi-BXdLOJ8q.js +2 -0
  261. package/frontend/dist/js/{work-DmJpVPPO.js → work-CdbmBok5.js} +1 -1
  262. package/frontend/dist/js/workApi-D1xtiG3Q.js +1 -0
  263. package/frontend/dist/js/{workApi-C5InfT8x.js → workApi-UPxumrEF.js} +1 -1
  264. package/frontend/dist/js/workModels-BM2Zyiba.js +1 -0
  265. package/frontend/dist/js/zh-gdUf9sXa.js +2 -0
  266. package/package.json +11 -40
  267. package/plugins/anthropic.json +3 -1
  268. package/plugins/bedrock.json +86 -0
  269. package/plugins/openrouter.json +2 -0
  270. package/backend/dist/cordis/contracts.d.ts +0 -270
  271. package/backend/dist/cordis/contracts.d.ts.map +0 -1
  272. package/backend/dist/cordis/contracts.js +0 -32
  273. package/backend/dist/cordis/contracts.js.map +0 -1
  274. package/backend/dist/cordis/dsh/chat-model.d.ts +0 -16
  275. package/backend/dist/cordis/dsh/chat-model.d.ts.map +0 -1
  276. package/backend/dist/cordis/dsh/chat-model.js +0 -104
  277. package/backend/dist/cordis/dsh/chat-model.js.map +0 -1
  278. package/backend/dist/cordis/dsh/engine-plugin.d.ts +0 -186
  279. package/backend/dist/cordis/dsh/engine-plugin.d.ts.map +0 -1
  280. package/backend/dist/cordis/dsh/engine-plugin.js +0 -1116
  281. package/backend/dist/cordis/dsh/engine-plugin.js.map +0 -1
  282. package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts +0 -175
  283. package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts.map +0 -1
  284. package/backend/dist/cordis/dsh/librewebui-llm-adapter.js +0 -480
  285. package/backend/dist/cordis/dsh/librewebui-llm-adapter.js.map +0 -1
  286. package/backend/dist/cordis/dsh/model-identity.d.ts +0 -12
  287. package/backend/dist/cordis/dsh/model-identity.d.ts.map +0 -1
  288. package/backend/dist/cordis/dsh/model-identity.js +0 -87
  289. package/backend/dist/cordis/dsh/model-identity.js.map +0 -1
  290. package/backend/dist/cordis/dsh/native-provider-client.d.ts +0 -44
  291. package/backend/dist/cordis/dsh/native-provider-client.d.ts.map +0 -1
  292. package/backend/dist/cordis/dsh/native-provider-client.js +0 -524
  293. package/backend/dist/cordis/dsh/native-provider-client.js.map +0 -1
  294. package/backend/dist/cordis/dsh/native-provider-plugin.d.ts +0 -11
  295. package/backend/dist/cordis/dsh/native-provider-plugin.d.ts.map +0 -1
  296. package/backend/dist/cordis/dsh/native-provider-plugin.js +0 -416
  297. package/backend/dist/cordis/dsh/native-provider-plugin.js.map +0 -1
  298. package/backend/dist/cordis/dsh/native-provider-protocol.d.ts +0 -37
  299. package/backend/dist/cordis/dsh/native-provider-protocol.d.ts.map +0 -1
  300. package/backend/dist/cordis/dsh/native-provider-protocol.js +0 -325
  301. package/backend/dist/cordis/dsh/native-provider-protocol.js.map +0 -1
  302. package/backend/dist/cordis/dsh/provider-handler.d.ts +0 -36
  303. package/backend/dist/cordis/dsh/provider-handler.d.ts.map +0 -1
  304. package/backend/dist/cordis/dsh/provider-handler.js +0 -582
  305. package/backend/dist/cordis/dsh/provider-handler.js.map +0 -1
  306. package/backend/dist/cordis/dsh/session-files.d.ts +0 -9
  307. package/backend/dist/cordis/dsh/session-files.d.ts.map +0 -1
  308. package/backend/dist/cordis/dsh/session-files.js +0 -60
  309. package/backend/dist/cordis/dsh/session-files.js.map +0 -1
  310. package/backend/dist/cordis/dsh/session-settings.d.ts +0 -15
  311. package/backend/dist/cordis/dsh/session-settings.d.ts.map +0 -1
  312. package/backend/dist/cordis/dsh/session-settings.js +0 -51
  313. package/backend/dist/cordis/dsh/session-settings.js.map +0 -1
  314. package/backend/dist/cordis/dsh/work-driver.d.ts +0 -12
  315. package/backend/dist/cordis/dsh/work-driver.d.ts.map +0 -1
  316. package/backend/dist/cordis/dsh/work-driver.js +0 -402
  317. package/backend/dist/cordis/dsh/work-driver.js.map +0 -1
  318. package/backend/dist/cordis/dsh/workspace-policy.d.ts +0 -10
  319. package/backend/dist/cordis/dsh/workspace-policy.d.ts.map +0 -1
  320. package/backend/dist/cordis/dsh/workspace-policy.js +0 -44
  321. package/backend/dist/cordis/dsh/workspace-policy.js.map +0 -1
  322. package/backend/dist/cordis/host/composition.d.ts +0 -73
  323. package/backend/dist/cordis/host/composition.d.ts.map +0 -1
  324. package/backend/dist/cordis/host/composition.js +0 -205
  325. package/backend/dist/cordis/host/composition.js.map +0 -1
  326. package/backend/dist/cordis/host/config.d.ts +0 -159
  327. package/backend/dist/cordis/host/config.d.ts.map +0 -1
  328. package/backend/dist/cordis/host/config.js +0 -184
  329. package/backend/dist/cordis/host/config.js.map +0 -1
  330. package/backend/dist/cordis/host/host.d.ts +0 -74
  331. package/backend/dist/cordis/host/host.d.ts.map +0 -1
  332. package/backend/dist/cordis/host/host.js +0 -420
  333. package/backend/dist/cordis/host/host.js.map +0 -1
  334. package/backend/dist/cordis/host/loader-entry.d.ts +0 -41
  335. package/backend/dist/cordis/host/loader-entry.d.ts.map +0 -1
  336. package/backend/dist/cordis/host/loader-entry.js +0 -52
  337. package/backend/dist/cordis/host/loader-entry.js.map +0 -1
  338. package/backend/dist/cordis/host/model.d.ts +0 -45
  339. package/backend/dist/cordis/host/model.d.ts.map +0 -1
  340. package/backend/dist/cordis/host/model.js +0 -54
  341. package/backend/dist/cordis/host/model.js.map +0 -1
  342. package/backend/dist/cordis/host/privacy.d.ts +0 -8
  343. package/backend/dist/cordis/host/privacy.d.ts.map +0 -1
  344. package/backend/dist/cordis/host/privacy.js +0 -73
  345. package/backend/dist/cordis/host/privacy.js.map +0 -1
  346. package/backend/dist/cordis/index.d.ts +0 -14
  347. package/backend/dist/cordis/index.d.ts.map +0 -1
  348. package/backend/dist/cordis/index.js +0 -30
  349. package/backend/dist/cordis/index.js.map +0 -1
  350. package/backend/dist/cordis/runtime.d.ts +0 -97
  351. package/backend/dist/cordis/runtime.d.ts.map +0 -1
  352. package/backend/dist/cordis/runtime.js +0 -231
  353. package/backend/dist/cordis/runtime.js.map +0 -1
  354. package/backend/dist/cordis/work-model.d.ts +0 -7
  355. package/backend/dist/cordis/work-model.d.ts.map +0 -1
  356. package/backend/dist/cordis/work-model.js.map +0 -1
  357. package/backend/dist/routes/cordis.d.ts.map +0 -1
  358. package/backend/dist/routes/cordis.js +0 -440
  359. package/backend/dist/routes/cordis.js.map +0 -1
  360. package/backend/dist/routes/libreClaw.d.ts +0 -3
  361. package/backend/dist/routes/libreClaw.d.ts.map +0 -1
  362. package/backend/dist/routes/libreClaw.js +0 -200
  363. package/backend/dist/routes/libreClaw.js.map +0 -1
  364. package/backend/dist/services/cordisAccessService.d.ts +0 -56
  365. package/backend/dist/services/cordisAccessService.d.ts.map +0 -1
  366. package/backend/dist/services/cordisAccessService.js +0 -98
  367. package/backend/dist/services/cordisAccessService.js.map +0 -1
  368. package/backend/dist/services/libreClawService.d.ts +0 -105
  369. package/backend/dist/services/libreClawService.d.ts.map +0 -1
  370. package/backend/dist/services/libreClawService.js +0 -169
  371. package/backend/dist/services/libreClawService.js.map +0 -1
  372. package/frontend/dist/assets/index-C8_AByBq.css +0 -1
  373. package/frontend/dist/assets/index-DWLnkKwj.js +0 -16
  374. package/frontend/dist/js/AutomationModal-CjjiEZFA.js +0 -1
  375. package/frontend/dist/js/AutomationsPage-jnWmD58y.js +0 -1
  376. package/frontend/dist/js/ChannelsPage-DHPabX1e.js +0 -1
  377. package/frontend/dist/js/ChatPage-ZvGp-iqV.js +0 -14
  378. package/frontend/dist/js/ConnectModels-aUTD6s9B.js +0 -1
  379. package/frontend/dist/js/CordisPage-DZKcpPVj.js +0 -1
  380. package/frontend/dist/js/GalleryPage-CrlNRnkn.js +0 -1
  381. package/frontend/dist/js/HomePage-lR9h7_a1.js +0 -1
  382. package/frontend/dist/js/LanguageSwitcher-CWkbzpxT.js +0 -1
  383. package/frontend/dist/js/LibreClawPage-P19FnNlu.js +0 -1
  384. package/frontend/dist/js/NotesPage-DopG0M4B.js +0 -3
  385. package/frontend/dist/js/OptimizedSyntaxHighlighter-ajqwyBQm.js +0 -1
  386. package/frontend/dist/js/PluginUsagePage-Cj0mUxD8.js +0 -1
  387. package/frontend/dist/js/RichMessageContent-BZndQSJU.js +0 -1
  388. package/frontend/dist/js/SettingsModal-wAuFQOE4.js +0 -19
  389. package/frontend/dist/js/UserManagementPanel-BU95ZPOv.js +0 -1
  390. package/frontend/dist/js/WorkPage-CSderbeT.js +0 -8
  391. package/frontend/dist/js/api-CU-JXx2u.js +0 -1
  392. package/frontend/dist/js/api-DPXCtanG.js +0 -14
  393. package/frontend/dist/js/appStore-BD70bvas.js +0 -2
  394. package/frontend/dist/js/appVersion-C7sxqgMd.js +0 -1
  395. package/frontend/dist/js/ar-Cq-DrSYL.js +0 -2
  396. package/frontend/dist/js/authStore-FNKLFUQp.js +0 -1
  397. package/frontend/dist/js/bn-BqxLh-KL.js +0 -2
  398. package/frontend/dist/js/chatStore-CK5ojwft.js +0 -3
  399. package/frontend/dist/js/cordisApi-BS8QMSV4.js +0 -2
  400. package/frontend/dist/js/cs-D2DDNZf-.js +0 -2
  401. package/frontend/dist/js/da-BciY-TSG.js +0 -2
  402. package/frontend/dist/js/de-DjU_eXQ-.js +0 -2
  403. package/frontend/dist/js/es-ChIEs80I.js +0 -2
  404. package/frontend/dist/js/fr-Bi8BGRW4.js +0 -2
  405. package/frontend/dist/js/hi-BMsCnWg7.js +0 -2
  406. package/frontend/dist/js/i18next-DOICz7ZY.js +0 -1
  407. package/frontend/dist/js/id-CpcN1vhk.js +0 -2
  408. package/frontend/dist/js/is-DkUy2cmP.js +0 -2
  409. package/frontend/dist/js/it-BglK9DRZ.js +0 -2
  410. package/frontend/dist/js/ja-IrprzwLJ.js +0 -2
  411. package/frontend/dist/js/ko--wwEsMPi.js +0 -2
  412. package/frontend/dist/js/markdownMath-B0BpyFBS.js +0 -1
  413. package/frontend/dist/js/ms-BWj59y7-.js +0 -2
  414. package/frontend/dist/js/nl-D-QndW_A.js +0 -2
  415. package/frontend/dist/js/pl-Dw7d7iDV.js +0 -2
  416. package/frontend/dist/js/pt-BI53uHJw.js +0 -2
  417. package/frontend/dist/js/react-vendor-wiHys0m2.js +0 -9
  418. package/frontend/dist/js/ru-JKyTgPg9.js +0 -2
  419. package/frontend/dist/js/sv-BIkBLPSQ.js +0 -2
  420. package/frontend/dist/js/th-CZ_LcCU0.js +0 -2
  421. package/frontend/dist/js/tr-B265byx1.js +0 -2
  422. package/frontend/dist/js/ui-vendor-BhHHyHk3.js +0 -1
  423. package/frontend/dist/js/uk-VTAlChwf.js +0 -2
  424. package/frontend/dist/js/useDialogFocus-BPTG_Zmy.js +0 -1
  425. package/frontend/dist/js/useDictation-D7zVBjDJ.js +0 -1
  426. package/frontend/dist/js/utils-p8Gt72YP.js +0 -1
  427. package/frontend/dist/js/utils-vendor-DISWt2y9.js +0 -1
  428. package/frontend/dist/js/vi-D8rXh-53.js +0 -2
  429. package/frontend/dist/js/workApi-FV75LKJn.js +0 -1
  430. package/frontend/dist/js/workModels-MzU2Ab7l.js +0 -1
  431. package/frontend/dist/js/zh-BEGd9iBD.js +0 -2
  432. package/scripts/prepare-dsh-provider.mjs +0 -124
@@ -1,440 +0,0 @@
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
- * HTTP surface for the embedded Cordis/DSH engine.
19
- *
20
- * Everything here consumes the `libreDshEngine` contract only; no handler knows
21
- * that DSH exists. That is what allows the whole engine to be swapped or
22
- * removed through the composition document without touching a route.
23
- *
24
- * Authentication is not optional: the engine can run tools with real
25
- * filesystem access, so an unauthenticated endpoint would be a remote code
26
- * execution surface. Every route requires an authenticated session.
27
- *
28
- * @module routes/cordis
29
- */
30
- import express from 'express';
31
- import { authenticate, requireAdmin } from '../middleware/auth.js';
32
- import { cordisAccessState, getCordisEngine, isCordisBridgeEnabled, stopCordisHost, } from '../cordis/runtime.js';
33
- import { setCordisEnabled } from '../services/cordisAccessService.js';
34
- import { getCordisModelCatalog } from '../cordis/dsh/provider-handler.js';
35
- const router = express.Router();
36
- /** Status code and payload for a bridge that cannot serve a request. */
37
- function unavailable(status, detail) {
38
- if (status === 'disabled') {
39
- return {
40
- status: 503,
41
- body: {
42
- success: false,
43
- error: 'The Cordis bridge is not enabled.',
44
- code: 'CORDIS_DISABLED',
45
- },
46
- };
47
- }
48
- if (status === 'starting') {
49
- return {
50
- status: 503,
51
- body: {
52
- success: false,
53
- error: 'The Cordis bridge is still starting.',
54
- code: 'CORDIS_STARTING',
55
- },
56
- };
57
- }
58
- return {
59
- status: 503,
60
- body: {
61
- success: false,
62
- error: detail ?? 'The Cordis bridge failed to start.',
63
- code: 'CORDIS_UNAVAILABLE',
64
- },
65
- };
66
- }
67
- router.use((_req, res, next) => {
68
- res.setHeader('Cache-Control', 'no-store');
69
- next();
70
- });
71
- // Health is reachable without a session so an operator can tell "disabled"
72
- // apart from a broken one before they have credentials to hand.
73
- router.get('/health', async (_req, res) => {
74
- if (!(await isCordisBridgeEnabled())) {
75
- res.json({ success: true, enabled: false, ready: false });
76
- return;
77
- }
78
- const result = await getCordisEngine();
79
- if (!result.ok) {
80
- const { status, body } = unavailable(result.reason, result.detail);
81
- res.status(status).json({ enabled: true, ready: false, ...body });
82
- return;
83
- }
84
- res.json({
85
- success: true,
86
- enabled: true,
87
- ready: true,
88
- services: result.engine.status(),
89
- });
90
- });
91
- /**
92
- * Read the administrator opt-in.
93
- *
94
- * Administrator-only: the answer decides whether the engine's page exists for
95
- * this deployment, and the setting is a deployment-wide switch rather than a
96
- * per-user preference.
97
- */
98
- router.get('/access', authenticate, requireAdmin, async (_req, res) => {
99
- const access = await cordisAccessState();
100
- res.json({ success: true, ...access });
101
- });
102
- /**
103
- * Set the administrator opt-in.
104
- *
105
- * Enabling starts the engine on its next request; disabling stops it
106
- * immediately so the decision takes effect without a restart. Disposal is what
107
- * withdraws the engine's services and releases its listeners, so turning the
108
- * feature off does not leave a running engine behind a hidden page.
109
- */
110
- router.put('/access', authenticate, requireAdmin, async (req, res) => {
111
- const { enabled } = req.body ?? {};
112
- if (typeof enabled !== 'boolean') {
113
- res
114
- .status(400)
115
- .json({ success: false, error: 'enabled must be a boolean.' });
116
- return;
117
- }
118
- const access = await cordisAccessState();
119
- if (access.lockedByEnv) {
120
- res.status(409).json({
121
- success: false,
122
- error: access.lockedBy === 'env'
123
- ? 'The Cordis engine is pinned by LIBRE_CORDIS_ENABLED; unset the environment variable to manage it here.'
124
- : 'The Cordis engine is pinned by features.enabled in cordis.config.yml; remove that key to manage it here.',
125
- });
126
- return;
127
- }
128
- await setCordisEnabled(enabled);
129
- if (!enabled)
130
- await stopCordisHost();
131
- res.json({ success: true, enabled, lockedByEnv: false });
132
- });
133
- // The host engine is an administrator console with deployment-wide sessions.
134
- // Navigation visibility is not an authorization boundary.
135
- router.use(authenticate, requireAdmin);
136
- /** Validate only choices advertised for the authenticated administrator. */
137
- async function sessionSettings(body, userId) {
138
- if (body === null || typeof body !== 'object' || Array.isArray(body)) {
139
- throw new Error('Session settings must be an object.');
140
- }
141
- const input = body;
142
- const settings = {};
143
- if (input.model !== undefined) {
144
- if (typeof input.model !== 'string' ||
145
- !input.model.trim() ||
146
- input.model.length > 2048) {
147
- throw new Error('Choose an available engine model.');
148
- }
149
- const catalog = await getCordisModelCatalog(userId);
150
- if (!catalog.models.some(model => model.id === input.model)) {
151
- throw new Error('The selected engine model is not available to this account.');
152
- }
153
- settings.model = input.model;
154
- }
155
- if (input.permissionMode !== undefined) {
156
- if (input.permissionMode !== 'read-only' &&
157
- input.permissionMode !== 'workspace-write') {
158
- throw new Error('Permission mode must be read-only or workspace-write.');
159
- }
160
- settings.permissionMode = input.permissionMode;
161
- }
162
- return settings;
163
- }
164
- router.get('/models', async (req, res) => {
165
- if (!(await isCordisBridgeEnabled())) {
166
- const response = unavailable('disabled');
167
- res.status(response.status).json(response.body);
168
- return;
169
- }
170
- const catalog = await getCordisModelCatalog(req.user.userId);
171
- res.json({ success: true, ...catalog });
172
- });
173
- router.get('/sessions', async (_req, res) => {
174
- const result = await getCordisEngine();
175
- if (!result.ok) {
176
- const { status, body } = unavailable(result.reason, result.detail);
177
- res.status(status).json(body);
178
- return;
179
- }
180
- res.json({ success: true, sessions: await result.engine.listSessions() });
181
- });
182
- router.post('/sessions', async (req, res) => {
183
- const result = await getCordisEngine();
184
- if (!result.ok) {
185
- const { status, body } = unavailable(result.reason, result.detail);
186
- res.status(status).json(body);
187
- return;
188
- }
189
- const cwd = typeof req.body?.cwd === 'string' && req.body.cwd.trim() !== ''
190
- ? req.body.cwd
191
- : undefined;
192
- const title = typeof req.body?.title === 'string' && req.body.title.trim() !== ''
193
- ? req.body.title
194
- : undefined;
195
- try {
196
- // The engine resolves an omitted cwd to its configured workspace, so the
197
- // route never invents one.
198
- const settings = await sessionSettings(req.body ?? {}, req.user.userId);
199
- const session = await result.engine.createSession({
200
- cwd: cwd ?? '',
201
- ...(title === undefined ? {} : { title }),
202
- ...settings,
203
- userId: req.user.userId,
204
- });
205
- res.status(201).json({ success: true, session });
206
- }
207
- catch (error) {
208
- res.status(400).json({
209
- success: false,
210
- error: error instanceof Error ? error.message : String(error),
211
- });
212
- }
213
- });
214
- router.get('/sessions/:id', async (req, res) => {
215
- const result = await getCordisEngine();
216
- if (!result.ok) {
217
- const { status, body } = unavailable(result.reason, result.detail);
218
- res.status(status).json(body);
219
- return;
220
- }
221
- const session = await result.engine.getSession(req.params.id);
222
- if (!session) {
223
- res.status(404).json({ success: false, error: 'Session not found.' });
224
- return;
225
- }
226
- res.json({ success: true, session });
227
- });
228
- router.patch('/sessions/:id/settings', async (req, res) => {
229
- const result = await getCordisEngine();
230
- if (!result.ok) {
231
- const response = unavailable(result.reason, result.detail);
232
- res.status(response.status).json(response.body);
233
- return;
234
- }
235
- try {
236
- const settings = await sessionSettings(req.body, req.user.userId);
237
- if (Object.keys(settings).length === 0) {
238
- res.status(400).json({
239
- success: false,
240
- error: 'Choose a model or permission mode to update.',
241
- });
242
- return;
243
- }
244
- if (!(await result.engine.getSession(req.params.id))) {
245
- res.status(404).json({ success: false, error: 'Session not found.' });
246
- return;
247
- }
248
- const session = await result.engine.updateSessionSettings(req.params.id, settings, { userId: req.user.userId });
249
- res.json({ success: true, session });
250
- }
251
- catch (error) {
252
- const code = error?.code;
253
- res.status(code === 'CORDIS_SESSION_BUSY' ? 409 : 400).json({
254
- success: false,
255
- error: error instanceof Error ? error.message : String(error),
256
- ...(typeof code === 'string' ? { code } : {}),
257
- });
258
- }
259
- });
260
- router.post('/sessions/:id/approvals/:approvalId', async (req, res) => {
261
- const decision = req.body?.decision;
262
- if (decision !== 'allowed-once' && decision !== 'rejected') {
263
- res.status(400).json({
264
- success: false,
265
- error: 'Choose allow once or reject for this approval.',
266
- });
267
- return;
268
- }
269
- const result = await getCordisEngine();
270
- if (!result.ok) {
271
- const response = unavailable(result.reason, result.detail);
272
- res.status(response.status).json(response.body);
273
- return;
274
- }
275
- const accepted = await result.engine.decideApproval(req.params.id, req.params.approvalId, decision);
276
- if (!accepted) {
277
- res.status(409).json({
278
- success: false,
279
- error: 'This approval is no longer pending for this session.',
280
- });
281
- return;
282
- }
283
- res.json({ success: true });
284
- });
285
- router.delete('/sessions/:id', async (req, res) => {
286
- const result = await getCordisEngine();
287
- if (!result.ok) {
288
- const { status, body } = unavailable(result.reason, result.detail);
289
- res.status(status).json(body);
290
- return;
291
- }
292
- const deleted = await result.engine.deleteSession(req.params.id);
293
- res.status(deleted ? 200 : 404).json({ success: deleted });
294
- });
295
- router.get('/agents', async (_req, res) => {
296
- const result = await getCordisEngine();
297
- if (!result.ok) {
298
- const { status, body } = unavailable(result.reason, result.detail);
299
- res.status(status).json(body);
300
- return;
301
- }
302
- res.json({ success: true, agents: await result.engine.listAgents() });
303
- });
304
- router.get('/tools', async (_req, res) => {
305
- const result = await getCordisEngine();
306
- if (!result.ok) {
307
- const { status, body } = unavailable(result.reason, result.detail);
308
- res.status(status).json(body);
309
- return;
310
- }
311
- res.json({ success: true, tools: await result.engine.listTools() });
312
- });
313
- /**
314
- * Send a chat message and stream the agent response as newline-delimited JSON.
315
- *
316
- * NDJSON is chosen over WebSocket deliberately: an agent turn is a single
317
- * server-to-client sequence with no client-to-server frames after the request,
318
- * so a streaming POST keeps the whole turn inside one authenticated request and
319
- * needs no separate handshake, ticket, or reconnect protocol.
320
- */
321
- router.post('/sessions/:id/messages', async (req, res) => {
322
- const result = await getCordisEngine();
323
- if (!result.ok) {
324
- const { status, body } = unavailable(result.reason, result.detail);
325
- res.status(status).json(body);
326
- return;
327
- }
328
- const text = typeof req.body?.text === 'string' ? req.body.text : '';
329
- if (text.trim() === '') {
330
- res
331
- .status(400)
332
- .json({ success: false, error: 'A message text is required.' });
333
- return;
334
- }
335
- if (text.length > 100000) {
336
- res.status(400).json({
337
- success: false,
338
- error: 'Message text exceeds 100000 characters.',
339
- });
340
- return;
341
- }
342
- let disconnected = false;
343
- const onDisconnect = () => {
344
- disconnected = true;
345
- void result.engine.cancel(req.params.id).catch(() => undefined);
346
- };
347
- res.once('close', onDisconnect);
348
- let stream;
349
- try {
350
- stream = await result.engine.sendMessage(req.params.id, text, {
351
- userId: req.user.userId,
352
- });
353
- if (disconnected) {
354
- await result.engine.cancel(req.params.id);
355
- stream.close();
356
- return;
357
- }
358
- }
359
- catch (error) {
360
- // A failure here is caller-visible (unknown session, a turn already in
361
- // flight, streaming disabled), so it is a request error rather than a
362
- // bridge outage.
363
- res.off('close', onDisconnect);
364
- if (!res.destroyed)
365
- res.status(400).json({
366
- success: false,
367
- error: error instanceof Error ? error.message : String(error),
368
- });
369
- return;
370
- }
371
- res.setHeader('Content-Type', 'application/x-ndjson');
372
- res.setHeader('Cache-Control', 'no-store');
373
- // The response must not be buffered by an intermediary: the point of the
374
- // endpoint is that chunks reach the client as the model produces them.
375
- res.setHeader('X-Accel-Buffering', 'no');
376
- res.flushHeaders?.();
377
- let closed = false;
378
- let subscription;
379
- const finish = () => {
380
- if (closed)
381
- return;
382
- closed = true;
383
- res.off('close', onDisconnect);
384
- subscription?.unsubscribe();
385
- res.end();
386
- };
387
- // Subscribing replays whatever the model already produced, so a fast first
388
- // token cannot be lost between the engine starting the turn and this handler
389
- // attaching its listener.
390
- subscription = stream.subscribe(chunk => {
391
- if (closed)
392
- return;
393
- res.write(`${JSON.stringify(chunk)}\n`);
394
- if (res.writableLength > 1048576) {
395
- onDisconnect();
396
- finish();
397
- return;
398
- }
399
- // `done` is the terminal chunk of one turn, so the response ends here
400
- // rather than waiting for the client to close it.
401
- if (chunk.type === 'done')
402
- finish();
403
- });
404
- if (closed)
405
- subscription.unsubscribe();
406
- // Disconnecting cancels model and tool work, as well as releasing the reader.
407
- res.on('close', () => {
408
- if (closed)
409
- return;
410
- closed = true;
411
- subscription?.unsubscribe();
412
- stream.close();
413
- });
414
- });
415
- router.post('/sessions/:id/cancel', async (req, res) => {
416
- const result = await getCordisEngine();
417
- if (!result.ok) {
418
- const { status, body } = unavailable(result.reason, result.detail);
419
- res.status(status).json(body);
420
- return;
421
- }
422
- res.json({ success: await result.engine.cancel(req.params.id) });
423
- });
424
- // Keep corrupt legacy sessions visible as a recoverable conflict. Never bypass
425
- // the engine's event validator or discard a transcript to make it readable.
426
- const sessionErrorHandler = (error, _req, res, next) => {
427
- if (error instanceof Error &&
428
- error.name === 'SessionPersistenceCorruptionError') {
429
- res.status(409).json({
430
- success: false,
431
- code: 'CORDIS_SESSION_INVALID',
432
- error: 'This saved session has an invalid event log. Preserve the original files and use the Cordis session repair tool before reopening it.',
433
- });
434
- return;
435
- }
436
- next(error);
437
- };
438
- router.use(sessionErrorHandler);
439
- export default router;
440
- //# sourceMappingURL=cordis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cordis.js","sourceRoot":"","sources":["../../src/routes/cordis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;GAYG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,wEAAwE;AACxE,SAAS,WAAW,CAClB,MAA0C,EAC1C,MAAe;IAEf,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mCAAmC;gBAC1C,IAAI,EAAE,iBAAiB;aACxB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sCAAsC;gBAC7C,IAAI,EAAE,iBAAiB;aACxB;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM,IAAI,oCAAoC;YACrD,IAAI,EAAE,oBAAoB;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAC7B,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC;AACT,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,gEAAgE;AAChE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,IAAI,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;KACjC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACnE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,GAAG;aACA,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EACH,MAAM,CAAC,QAAQ,KAAK,KAAK;gBACvB,CAAC,CAAC,wGAAwG;gBAC1G,CAAC,CAAC,0GAA0G;SACjH,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,MAAM,cAAc,EAAE,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAC7E,0DAA0D;AAC1D,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAEvC,4EAA4E;AAC5E,KAAK,UAAU,eAAe,CAC5B,IAAa,EACb,MAAc;IAEd,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,KAAK,GAAG,IAA+B,CAAC;IAC9C,MAAM,QAAQ,GAGV,EAAE,CAAC;IACP,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,IACE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YACnB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,EACzB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACvC,IACE,KAAK,CAAC,cAAc,KAAK,WAAW;YACpC,KAAK,CAAC,cAAc,KAAK,iBAAiB,EAC1C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IACjD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvC,IAAI,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC;IAC9D,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GACP,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAC7D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;QACd,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GACT,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QACjE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK;QAChB,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC;QACH,yEAAyE;QACzE,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;YAChD,GAAG,EAAE,GAAG,IAAI,EAAE;YACd,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACzC,GAAG,QAAQ;YACX,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC7C,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8CAA8C;aACtD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,qBAAqB,CACvD,GAAG,CAAC,MAAM,CAAC,EAAE,EACb,QAAQ,EACR,EAAE,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,MAAM,EAAE,CAC7B,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA4B,EAAE,IAAI,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1D,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;IACpC,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gDAAgD;SACxD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CACjD,GAAG,CAAC,MAAM,CAAC,EAAE,EACb,GAAG,CAAC,MAAM,CAAC,UAAU,EACrB,QAAQ,CACT,CAAC;IACF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sDAAsD;SAC9D,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAChD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,GAAG;aACA,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,MAAO,EAAE,CAAC;QAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yCAAyC;SACjD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,YAAY,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE;YAC5D,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QACH,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uEAAuE;QACvE,sEAAsE;QACtE,iBAAiB;QACjB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,SAAS;YAChB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;IACtD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,yEAAyE;IACzE,uEAAuE;IACvE,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;IAErB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,YAAiD,CAAC;IAEtD,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/B,YAAY,EAAE,WAAW,EAAE,CAAC;QAC5B,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,2EAA2E;IAC3E,6EAA6E;IAC7E,0BAA0B;IAC1B,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;QACtC,IAAI,MAAM;YAAE,OAAO;QACnB,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,GAAG,CAAC,cAAc,GAAG,OAAS,EAAE,CAAC;YACnC,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,sEAAsE;QACtE,kDAAkD;QAClD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM;QAAE,YAAY,CAAC,WAAW,EAAE,CAAC;IAEvC,8EAA8E;IAC9E,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,YAAY,EAAE,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,mBAAmB,GAAgC,CACvD,KAAK,EACL,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,EAAE;IACF,IACE,KAAK,YAAY,KAAK;QACtB,KAAK,CAAC,IAAI,KAAK,mCAAmC,EAClD,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EACH,sIAAsI;SACzI,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,CAAC;AACd,CAAC,CAAC;AACF,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAEhC,eAAe,MAAM,CAAC"}
@@ -1,3 +0,0 @@
1
- declare const router: import("express-serve-static-core").Router;
2
- export default router;
3
- //# sourceMappingURL=libreClaw.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"libreClaw.d.ts","sourceRoot":"","sources":["../../src/routes/libreClaw.ts"],"names":[],"mappings":"AA+BA,QAAA,MAAM,MAAM,4CAAmB,CAAC;eA6UjB,MAAM"}
@@ -1,200 +0,0 @@
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 express from 'express';
18
- import { authenticate, requireAdmin } from '../middleware/auth.js';
19
- import { agentsEnabledLockedByEnv, getAgentsEnabled, setAgentsEnabled, } from '../services/agentAccessService.js';
20
- import libreClawService, { LibreClawServiceError, } from '../services/libreClawService.js';
21
- const router = express.Router();
22
- router.use(authenticate, requireAdmin);
23
- /**
24
- * The Agents feature toggle. Reachable while the feature is disabled —
25
- * this is how an administrator turns it on. Everything below the gate
26
- * requires the feature to be enabled.
27
- */
28
- router.get('/access', async (_req, res) => {
29
- sendSuccess(res, {
30
- enabled: await getAgentsEnabled(),
31
- lockedByEnv: agentsEnabledLockedByEnv(),
32
- });
33
- });
34
- router.put('/access', async (req, res) => {
35
- const enabled = req.body?.enabled;
36
- if (typeof enabled !== 'boolean') {
37
- res.status(400).json({
38
- success: false,
39
- error: 'enabled must be a boolean.',
40
- });
41
- return;
42
- }
43
- if (agentsEnabledLockedByEnv()) {
44
- res.status(409).json({
45
- success: false,
46
- error: 'Libre Claw is pinned by LIBRE_CLAW_ENABLED; unset the environment variable to manage it here.',
47
- });
48
- return;
49
- }
50
- await setAgentsEnabled(enabled);
51
- sendSuccess(res, {
52
- enabled: await getAgentsEnabled(),
53
- lockedByEnv: false,
54
- });
55
- });
56
- router.use(async (_req, res, next) => {
57
- if (!(await getAgentsEnabled())) {
58
- res.status(403).json({
59
- success: false,
60
- error: 'The Agents feature is disabled on this server.',
61
- });
62
- return;
63
- }
64
- next();
65
- });
66
- router.get('/status', async (_req, res) => {
67
- const status = await libreClawService.status();
68
- sendSuccess(res, status);
69
- });
70
- router.get('/health', async (_req, res) => {
71
- await sendLibreClaw(res, () => libreClawService.health());
72
- });
73
- router.get('/dashboard', (_req, res) => {
74
- sendSuccess(res, { url: libreClawService.dashboardUrl() });
75
- });
76
- router.get('/config/model', async (_req, res) => {
77
- await sendLibreClaw(res, () => libreClawService.currentModel());
78
- });
79
- router.patch('/config/model', async (req, res) => {
80
- await sendLibreClaw(res, () => libreClawService.updateModel({
81
- provider: String(req.body?.provider || '').trim(),
82
- model: String(req.body?.model || '').trim(),
83
- persist_global: Boolean(req.body?.persist_global),
84
- }));
85
- });
86
- router.get('/config/fallback', async (_req, res) => {
87
- await sendLibreClaw(res, () => libreClawService.currentFallback());
88
- });
89
- router.patch('/config/fallback', async (req, res) => {
90
- await sendLibreClaw(res, () => libreClawService.updateFallback(req.body || {}));
91
- });
92
- router.patch('/config/theme', async (req, res) => {
93
- await sendLibreClaw(res, () => libreClawService.updateTheme({
94
- theme: String(req.body?.theme || '').trim(),
95
- persist_global: req.body?.persist_global !== false,
96
- }));
97
- });
98
- router.get('/runs', async (req, res) => {
99
- await sendLibreClaw(res, () => libreClawService.listRuns(readLimit(req, 20, 100)));
100
- });
101
- router.post('/runs', async (req, res) => {
102
- const payload = req.body;
103
- await sendLibreClaw(res, () => libreClawService.startRun({
104
- message: String(payload?.message || '').trim(),
105
- kind: payload?.kind === 'goal' ? 'goal' : 'chat',
106
- provider: cleanOptionalString(payload?.provider),
107
- model: cleanOptionalString(payload?.model),
108
- surface: 'libre-webui',
109
- session: payload?.session,
110
- attachments: payload?.attachments,
111
- }), 202);
112
- });
113
- router.get('/runs/:runId', async (req, res) => {
114
- await sendLibreClaw(res, () => libreClawService.getRun(readParam(req, 'runId')));
115
- });
116
- router.get('/runs/:runId/events', async (req, res) => {
117
- await sendLibreClaw(res, () => libreClawService.getEvents(readParam(req, 'runId'), readAfter(req)));
118
- });
119
- router.post('/runs/:runId/cancel', async (req, res) => {
120
- await sendLibreClaw(res, () => libreClawService.cancelRun(readParam(req, 'runId')));
121
- });
122
- router.post('/runs/:runId/permissions/:toolCallId', async (req, res) => {
123
- const resolution = String(req.body?.resolution || 'deny');
124
- const payload = {
125
- resolution: isPermissionResolution(resolution) ? resolution : 'deny',
126
- };
127
- await sendLibreClaw(res, () => libreClawService.resolvePermission(readParam(req, 'runId'), readParam(req, 'toolCallId'), payload));
128
- });
129
- router.get('/usage', async (req, res) => {
130
- await sendLibreClaw(res, () => libreClawService.usage(String(req.query.provider || '').trim(), readLimit(req, 250, 1000)));
131
- });
132
- router.get('/automations', async (req, res) => {
133
- await sendLibreClaw(res, () => libreClawService.listAutomations(readLimit(req, 50, 200)));
134
- });
135
- router.post('/automations', async (req, res) => {
136
- await sendLibreClaw(res, () => libreClawService.createAutomation(req.body || {}), 201);
137
- });
138
- router.get('/automations/:automationId', async (req, res) => {
139
- await sendLibreClaw(res, () => libreClawService.getAutomation(readParam(req, 'automationId')));
140
- });
141
- router.patch('/automations/:automationId', async (req, res) => {
142
- await sendLibreClaw(res, () => libreClawService.updateAutomation(readParam(req, 'automationId'), req.body || {}));
143
- });
144
- router.put('/automations/:automationId', async (req, res) => {
145
- await sendLibreClaw(res, () => libreClawService.updateAutomation(readParam(req, 'automationId'), req.body || {}));
146
- });
147
- router.post('/automations/:automationId/pause', async (req, res) => {
148
- await sendLibreClaw(res, () => libreClawService.pauseAutomation(readParam(req, 'automationId')));
149
- });
150
- router.post('/automations/:automationId/resume', async (req, res) => {
151
- await sendLibreClaw(res, () => libreClawService.resumeAutomation(readParam(req, 'automationId')));
152
- });
153
- router.post('/automations/:automationId/run', async (req, res) => {
154
- await sendLibreClaw(res, () => libreClawService.runAutomationNow(readParam(req, 'automationId')));
155
- });
156
- router.delete('/automations/:automationId', async (req, res) => {
157
- await sendLibreClaw(res, () => libreClawService.deleteAutomation(readParam(req, 'automationId')));
158
- });
159
- const sendLibreClaw = async (res, action, successStatus = 200) => {
160
- try {
161
- const data = await action();
162
- res.status(successStatus).json({ success: true, data });
163
- }
164
- catch (error) {
165
- const status = error instanceof LibreClawServiceError ? error.status : 500;
166
- const message = error instanceof Error ? error.message : 'Libre Claw request failed';
167
- res.status(status).json({
168
- success: false,
169
- error: message,
170
- });
171
- }
172
- };
173
- const sendSuccess = (res, data) => {
174
- res.json({ success: true, data });
175
- };
176
- const readLimit = (req, fallback, max) => {
177
- const raw = Number(req.query.limit);
178
- if (!Number.isFinite(raw)) {
179
- return fallback;
180
- }
181
- return Math.max(1, Math.min(max, Math.floor(raw)));
182
- };
183
- const readAfter = (req) => {
184
- const raw = Number(req.query.after);
185
- if (!Number.isFinite(raw)) {
186
- return 0;
187
- }
188
- return Math.max(0, Math.floor(raw));
189
- };
190
- const readParam = (req, name) => String(req.params[name] || '').trim();
191
- const cleanOptionalString = (value) => {
192
- const cleaned = String(value || '').trim();
193
- return cleaned || undefined;
194
- };
195
- const isPermissionResolution = (value) => value === 'allow_once' ||
196
- value === 'deny' ||
197
- value === 'always_allow_tool' ||
198
- value === 'always_allow_call';
199
- export default router;
200
- //# sourceMappingURL=libreClaw.js.map