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
@@ -0,0 +1,156 @@
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
+ * The only filesystem a Strands agent can see. The SDK's default environment
19
+ * runs on the host with no isolation, so Libre WebUI replaces it with a
20
+ * sandbox that maps a virtual `/workspace` onto one private directory per
21
+ * account and refuses to execute commands. Paths are checked after symlink
22
+ * resolution, so a link inside the workspace cannot reach the rest of the
23
+ * disk.
24
+ */
25
+ import fs from 'node:fs/promises';
26
+ import path from 'node:path';
27
+ import { Sandbox } from '@strands-agents/sdk/sandbox';
28
+ /** The path the agent sees as its workspace root. */
29
+ export const STRANDS_WORKSPACE_ROOT = '/workspace';
30
+ /** Largest file an agent may read or write in one call. */
31
+ export const STRANDS_MAX_FILE_BYTES = 2 * 1024 * 1024;
32
+ export class StrandsSandboxError extends Error {
33
+ constructor(message) {
34
+ super(message);
35
+ this.name = 'StrandsSandboxError';
36
+ }
37
+ }
38
+ function isInside(root, candidate) {
39
+ const relative = path.relative(root, candidate);
40
+ return (relative === '' ||
41
+ (!relative.startsWith('..') && !path.isAbsolute(relative)));
42
+ }
43
+ export class WorkspaceSandbox extends Sandbox {
44
+ constructor(root) {
45
+ super();
46
+ this.root = root;
47
+ }
48
+ /** Resolve a virtual path to a host path inside the workspace. */
49
+ async resolve(virtualPath) {
50
+ if (typeof virtualPath !== 'string' || virtualPath.includes('\0')) {
51
+ throw new StrandsSandboxError('The path is invalid.');
52
+ }
53
+ const normalized = path.posix.normalize(virtualPath.startsWith('/')
54
+ ? virtualPath
55
+ : `${STRANDS_WORKSPACE_ROOT}/${virtualPath}`);
56
+ if (normalized !== STRANDS_WORKSPACE_ROOT &&
57
+ !normalized.startsWith(`${STRANDS_WORKSPACE_ROOT}/`)) {
58
+ throw new StrandsSandboxError(`Only paths under ${STRANDS_WORKSPACE_ROOT} are available.`);
59
+ }
60
+ const relative = normalized.slice(STRANDS_WORKSPACE_ROOT.length);
61
+ const root = await this.ensureRoot();
62
+ const target = path.join(root, ...relative.split('/').filter(Boolean));
63
+ if (!isInside(root, target)) {
64
+ throw new StrandsSandboxError('The path leaves the workspace.');
65
+ }
66
+ // Resolve the deepest existing ancestor so symlinks cannot escape.
67
+ let probe = target;
68
+ for (;;) {
69
+ try {
70
+ const real = await fs.realpath(probe);
71
+ if (!isInside(root, real)) {
72
+ throw new StrandsSandboxError('The path leaves the workspace.');
73
+ }
74
+ break;
75
+ }
76
+ catch (error) {
77
+ if (error instanceof StrandsSandboxError)
78
+ throw error;
79
+ const parent = path.dirname(probe);
80
+ if (parent === probe)
81
+ break;
82
+ probe = parent;
83
+ }
84
+ }
85
+ return target;
86
+ }
87
+ async ensureRoot() {
88
+ if (this.realRoot)
89
+ return this.realRoot;
90
+ await fs.mkdir(this.root, { recursive: true, mode: 0o700 });
91
+ this.realRoot = await fs.realpath(this.root);
92
+ return this.realRoot;
93
+ }
94
+ // eslint-disable-next-line require-yield
95
+ async *executeStreaming(_command, _options) {
96
+ throw new StrandsSandboxError('Command execution is not available in the Strands workspace.');
97
+ }
98
+ // eslint-disable-next-line require-yield
99
+ async *executeCodeStreaming(_code, _language, _options) {
100
+ throw new StrandsSandboxError('Code execution is not available in the Strands workspace.');
101
+ }
102
+ async readFile(virtualPath) {
103
+ const target = await this.resolve(virtualPath);
104
+ const stat = await fs.stat(target).catch(() => undefined);
105
+ if (!stat?.isFile()) {
106
+ throw new StrandsSandboxError(`No file at ${virtualPath}.`);
107
+ }
108
+ if (stat.size > STRANDS_MAX_FILE_BYTES) {
109
+ throw new StrandsSandboxError(`${virtualPath} is too large to read.`);
110
+ }
111
+ return new Uint8Array(await fs.readFile(target));
112
+ }
113
+ async writeFile(virtualPath, content) {
114
+ if (content.byteLength > STRANDS_MAX_FILE_BYTES) {
115
+ throw new StrandsSandboxError('The file is too large to write.');
116
+ }
117
+ const target = await this.resolve(virtualPath);
118
+ const root = await this.ensureRoot();
119
+ if (target === root) {
120
+ throw new StrandsSandboxError('The workspace root is a directory.');
121
+ }
122
+ await fs.mkdir(path.dirname(target), { recursive: true, mode: 0o700 });
123
+ // Re-check after creating parents in case a concurrent link appeared.
124
+ await this.resolve(virtualPath);
125
+ const existing = await fs.lstat(target).catch(() => undefined);
126
+ if (existing?.isSymbolicLink()) {
127
+ throw new StrandsSandboxError('Writing through a symlink is refused.');
128
+ }
129
+ await fs.writeFile(target, content, { mode: 0o600 });
130
+ }
131
+ async removeFile(virtualPath) {
132
+ const target = await this.resolve(virtualPath);
133
+ if (target === (await this.ensureRoot())) {
134
+ throw new StrandsSandboxError('The workspace root cannot be removed.');
135
+ }
136
+ await fs.rm(target, { force: false });
137
+ }
138
+ async listFiles(virtualPath) {
139
+ const target = await this.resolve(virtualPath);
140
+ const entries = await fs.readdir(target, { withFileTypes: true });
141
+ return Promise.all(entries.map(async (entry) => {
142
+ const info = entry.isDirectory()
143
+ ? { name: entry.name, isDir: true }
144
+ : {
145
+ name: entry.name,
146
+ isDir: false,
147
+ size: await fs
148
+ .stat(path.join(target, entry.name))
149
+ .then(stat => stat.size)
150
+ .catch(() => undefined),
151
+ };
152
+ return info;
153
+ }));
154
+ }
155
+ }
156
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/strands/sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { OllamaChatRequest, OllamaChatResponse } from '../types/index.js';
2
+ import type { WorkModelStreamObserver } from '../services/workModelProviderService.js';
3
+ export interface WorkStrandsDriver {
4
+ generate(request: OllamaChatRequest, observer: WorkModelStreamObserver, signal?: AbortSignal): Promise<OllamaChatResponse>;
5
+ dispose(): Promise<void>;
6
+ }
7
+ export interface WorkStrandsDriverOptions {
8
+ generate(request: OllamaChatRequest, observer: WorkModelStreamObserver, signal?: AbortSignal): Promise<OllamaChatResponse>;
9
+ }
10
+ export declare function createWorkStrandsDriver(options: WorkStrandsDriverOptions): Promise<WorkStrandsDriver>;
11
+ //# sourceMappingURL=work-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-driver.d.ts","sourceRoot":"","sources":["../../src/strands/work-driver.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEvF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CACN,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,uBAAuB,EACjC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CACN,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,uBAAuB,EACjC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAChC;AAgGD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAuV5B"}
@@ -0,0 +1,443 @@
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
+ * A Strands agent loop driving one Work run.
19
+ *
20
+ * Work stays authoritative for transcripts, authorization, approvals,
21
+ * sandboxed tool execution, and durability. The Strands agent owns the loop:
22
+ * each model call it makes is served by the next Work step, and its tools are
23
+ * proxies whose bodies wait for the results Work supplies with the following
24
+ * step. Nothing here touches the filesystem or runs a tool itself.
25
+ */
26
+ import { randomUUID } from 'node:crypto';
27
+ const MAX_QUEUED_EVENTS = 2048;
28
+ const MAX_QUEUED_BYTES = 2 * 1024 * 1024;
29
+ const CONTINUE_PROMPT = 'Continue the current Work request.';
30
+ const MISSING_RESULT = 'Work did not return a result for this tool call. Continue with the next step.';
31
+ /** Hand provider deltas to the Strands model stream without re-requesting. */
32
+ class EventQueue {
33
+ constructor() {
34
+ this.events = [];
35
+ this.sizes = [];
36
+ this.bytes = 0;
37
+ this.ended = false;
38
+ }
39
+ push(event) {
40
+ if (this.ended)
41
+ return;
42
+ const size = Buffer.byteLength(JSON.stringify(event), 'utf8');
43
+ if (this.events.length >= MAX_QUEUED_EVENTS ||
44
+ this.bytes + size > MAX_QUEUED_BYTES) {
45
+ const error = new Error('The Work provider exceeded the Strands stream buffer limit.');
46
+ this.finish(error);
47
+ throw error;
48
+ }
49
+ this.events.push(event);
50
+ this.sizes.push(size);
51
+ this.bytes += size;
52
+ this.wake?.();
53
+ }
54
+ finish(error) {
55
+ if (this.ended)
56
+ return;
57
+ this.ended = true;
58
+ this.failure = error;
59
+ if (error) {
60
+ this.events.length = 0;
61
+ this.sizes.length = 0;
62
+ this.bytes = 0;
63
+ }
64
+ this.wake?.();
65
+ }
66
+ async *read() {
67
+ while (true) {
68
+ if (this.events.length > 0) {
69
+ this.bytes -= this.sizes.shift() ?? 0;
70
+ yield this.events.shift();
71
+ continue;
72
+ }
73
+ if (this.ended) {
74
+ if (this.failure)
75
+ throw this.failure;
76
+ return;
77
+ }
78
+ await new Promise(resolve => {
79
+ this.wake = resolve;
80
+ });
81
+ this.wake = undefined;
82
+ }
83
+ }
84
+ }
85
+ function toolArguments(value) {
86
+ if (typeof value === 'string')
87
+ return value || '{}';
88
+ try {
89
+ return JSON.stringify(value ?? {});
90
+ }
91
+ catch {
92
+ return '{}';
93
+ }
94
+ }
95
+ function toolResultText(content) {
96
+ if (typeof content === 'string')
97
+ return content;
98
+ try {
99
+ return JSON.stringify(content ?? '');
100
+ }
101
+ catch {
102
+ return '';
103
+ }
104
+ }
105
+ export async function createWorkStrandsDriver(options) {
106
+ const sdk = await import('@strands-agents/sdk');
107
+ const lifetime = new AbortController();
108
+ let disposed = false;
109
+ let active;
110
+ let running;
111
+ let nextModel;
112
+ const toolResults = new Map();
113
+ const toolWaiters = new Map();
114
+ const registered = new Set();
115
+ const settle = (step) => {
116
+ if (step.settled)
117
+ return false;
118
+ step.settled = true;
119
+ step.detach();
120
+ if (active === step)
121
+ active = undefined;
122
+ return true;
123
+ };
124
+ const fail = (step, error) => {
125
+ if (!step || !settle(step))
126
+ return;
127
+ step.controller.abort(error);
128
+ step.reject(error);
129
+ };
130
+ const releaseWaiters = (value) => {
131
+ for (const [id, release] of toolWaiters) {
132
+ toolWaiters.delete(id);
133
+ release(value);
134
+ }
135
+ };
136
+ const waitForStep = (signal) => new Promise((resolve, reject) => {
137
+ const abort = () => {
138
+ nextModel = undefined;
139
+ reject(signal?.reason ?? new Error('The Strands model call aborted.'));
140
+ };
141
+ nextModel = () => {
142
+ signal?.removeEventListener('abort', abort);
143
+ nextModel = undefined;
144
+ resolve();
145
+ };
146
+ signal?.addEventListener('abort', abort, { once: true });
147
+ if (signal?.aborted)
148
+ abort();
149
+ });
150
+ class WorkStepModel extends sdk.Model {
151
+ constructor() {
152
+ super(...arguments);
153
+ this.config = { modelId: 'libre-webui-work' };
154
+ }
155
+ updateConfig(config) {
156
+ this.config = { ...this.config, ...config };
157
+ }
158
+ getConfig() {
159
+ return { ...this.config };
160
+ }
161
+ async *stream(_messages, streamOptions = {}) {
162
+ const cancel = streamOptions.cancelSignal;
163
+ while (!active && !disposed)
164
+ await waitForStep(cancel);
165
+ if (disposed || !active)
166
+ throw new Error('The Work Strands driver is disposed.');
167
+ const step = active;
168
+ if (step.claimed)
169
+ throw new Error('A Work model step is already running.');
170
+ step.claimed = true;
171
+ const abort = () => step.controller.abort(cancel?.reason);
172
+ cancel?.addEventListener('abort', abort, { once: true });
173
+ if (cancel?.aborted)
174
+ abort();
175
+ const queue = new EventQueue();
176
+ let block;
177
+ const streamed = { text: '', reasoning: '' };
178
+ const close = () => {
179
+ if (!block)
180
+ return;
181
+ queue.push({ type: 'modelContentBlockStopEvent' });
182
+ block = undefined;
183
+ };
184
+ const emit = (kind, delta) => {
185
+ if (!delta || step.settled || step.controller.signal.aborted)
186
+ return;
187
+ if (block?.kind !== kind) {
188
+ close();
189
+ block = { kind, text: '' };
190
+ queue.push({ type: 'modelContentBlockStartEvent' });
191
+ }
192
+ block.text += delta;
193
+ streamed[kind] += delta;
194
+ queue.push({
195
+ type: 'modelContentBlockDeltaEvent',
196
+ delta: kind === 'text'
197
+ ? { type: 'textDelta', text: delta }
198
+ : { type: 'reasoningContentDelta', text: delta },
199
+ });
200
+ };
201
+ const forward = (kind, delta) => {
202
+ if (!delta || step.settled || step.controller.signal.aborted)
203
+ return;
204
+ if (kind === 'text')
205
+ step.observer.onContent?.(delta);
206
+ else
207
+ step.observer.onReasoning?.(delta);
208
+ emit(kind, delta);
209
+ };
210
+ queue.push({ type: 'modelMessageStartEvent', role: 'assistant' });
211
+ const provider = (async () => {
212
+ const original = await options.generate(step.request, {
213
+ ...step.observer,
214
+ onContent: delta => forward('text', delta),
215
+ onReasoning: delta => forward('reasoning', delta),
216
+ }, step.controller.signal);
217
+ step.controller.signal.throwIfAborted();
218
+ const rawCalls = original.message.tool_calls ?? [];
219
+ const calls = rawCalls.map(call => typeof call.id === 'string' && call.id
220
+ ? call
221
+ : { ...call, id: `work-strands-${randomUUID()}` });
222
+ const response = calls.length && calls.some((call, index) => call !== rawCalls[index])
223
+ ? {
224
+ ...original,
225
+ message: { ...original.message, tool_calls: calls },
226
+ }
227
+ : original;
228
+ // Providers that do not stream still return full text. Only the
229
+ // part Strands has not seen yet is replayed.
230
+ const reasoning = original.message.thinking ?? '';
231
+ if (reasoning.startsWith(streamed.reasoning))
232
+ emit('reasoning', reasoning.slice(streamed.reasoning.length));
233
+ const content = original.message.content ?? '';
234
+ if (content.startsWith(streamed.text))
235
+ emit('text', content.slice(streamed.text.length));
236
+ close();
237
+ const toolUses = [];
238
+ for (const call of calls) {
239
+ const fn = call.function;
240
+ if (!fn || typeof fn.name !== 'string' || typeof call.id !== 'string')
241
+ throw new Error('The Work provider returned an invalid tool call.');
242
+ toolUses.push({
243
+ id: call.id,
244
+ name: fn.name,
245
+ input: toolArguments(fn.arguments),
246
+ });
247
+ }
248
+ for (const use of toolUses) {
249
+ queue.push({
250
+ type: 'modelContentBlockStartEvent',
251
+ start: {
252
+ type: 'toolUseStart',
253
+ name: use.name,
254
+ toolUseId: use.id,
255
+ },
256
+ });
257
+ queue.push({
258
+ type: 'modelContentBlockDeltaEvent',
259
+ delta: { type: 'toolUseInputDelta', input: use.input },
260
+ });
261
+ queue.push({ type: 'modelContentBlockStopEvent' });
262
+ }
263
+ const stopReason = toolUses.length ? 'toolUse' : 'endTurn';
264
+ queue.push({ type: 'modelMessageStopEvent', stopReason });
265
+ const inputTokens = original.prompt_eval_count ?? 0;
266
+ const outputTokens = original.eval_count ?? 0;
267
+ queue.push({
268
+ type: 'modelMetadataEvent',
269
+ usage: {
270
+ inputTokens,
271
+ outputTokens,
272
+ totalTokens: inputTokens + outputTokens,
273
+ },
274
+ });
275
+ queue.finish();
276
+ // Work gets the step back as soon as the provider is done. Its tool
277
+ // results arrive with the next step and release the proxy tools.
278
+ if (settle(step))
279
+ step.resolve(response);
280
+ })().catch(error => {
281
+ queue.finish(error);
282
+ fail(step, error);
283
+ });
284
+ try {
285
+ yield* queue.read();
286
+ }
287
+ finally {
288
+ cancel?.removeEventListener('abort', abort);
289
+ await provider;
290
+ }
291
+ }
292
+ }
293
+ const agent = new sdk.Agent({
294
+ model: new WorkStepModel(),
295
+ printer: false,
296
+ retryStrategy: null,
297
+ name: 'libre-webui-work',
298
+ });
299
+ const proxyTool = (name, description) => new sdk.FunctionTool({
300
+ name,
301
+ description,
302
+ inputSchema: {
303
+ type: 'object',
304
+ properties: {},
305
+ additionalProperties: true,
306
+ },
307
+ callback: (_input, context) => {
308
+ const id = context.toolUse.toolUseId;
309
+ const immediate = toolResults.get(id);
310
+ if (immediate !== undefined) {
311
+ toolResults.delete(id);
312
+ return immediate;
313
+ }
314
+ // Work has already moved to its next step without this result.
315
+ if (active && !active.claimed)
316
+ return MISSING_RESULT;
317
+ return new Promise((resolve, reject) => {
318
+ const signal = context.cancelSignal;
319
+ const abort = () => {
320
+ toolWaiters.delete(id);
321
+ reject(signal.reason ?? new Error('The Work tool call aborted.'));
322
+ };
323
+ toolWaiters.set(id, value => {
324
+ signal.removeEventListener('abort', abort);
325
+ resolve(value);
326
+ });
327
+ signal.addEventListener('abort', abort, { once: true });
328
+ if (signal.aborted)
329
+ abort();
330
+ });
331
+ },
332
+ });
333
+ const syncTools = (request) => {
334
+ const wanted = new Map();
335
+ for (const raw of request.tools ?? []) {
336
+ const fn = raw.function;
337
+ if (!fn || typeof fn.name !== 'string' || wanted.has(fn.name))
338
+ continue;
339
+ wanted.set(fn.name, typeof fn.description === 'string' ? fn.description : '');
340
+ }
341
+ for (const name of registered) {
342
+ if (wanted.has(name))
343
+ continue;
344
+ agent.toolRegistry.remove(name);
345
+ registered.delete(name);
346
+ }
347
+ const fresh = [...wanted]
348
+ .filter(([name]) => !registered.has(name))
349
+ .map(([name, description]) => proxyTool(name, description));
350
+ if (fresh.length) {
351
+ agent.toolRegistry.addOrReplace(fresh);
352
+ for (const tool of fresh)
353
+ registered.add(tool.name);
354
+ }
355
+ };
356
+ const start = () => {
357
+ const invocation = (async () => {
358
+ const events = agent.stream(CONTINUE_PROMPT, {
359
+ cancelSignal: lifetime.signal,
360
+ });
361
+ // Draining the generator runs the loop. Work consumes the output.
362
+ while (!(await events.next()).done) {
363
+ /* keep the loop moving */
364
+ }
365
+ })();
366
+ running = invocation
367
+ .catch(error => {
368
+ // Provider failures already reached the step that caused them. Any
369
+ // other loop failure fails the step waiting on it.
370
+ if (active)
371
+ fail(active, error);
372
+ releaseWaiters(MISSING_RESULT);
373
+ })
374
+ .finally(() => {
375
+ running = undefined;
376
+ // A step that arrived while the previous turn was wrapping up still
377
+ // needs a model call.
378
+ if (!disposed && active && !active.claimed)
379
+ start();
380
+ });
381
+ };
382
+ return {
383
+ async generate(request, observer, signal) {
384
+ signal?.throwIfAborted();
385
+ if (disposed)
386
+ throw new Error('The Work Strands driver is disposed.');
387
+ if (active)
388
+ throw new Error('A Work model step is already running.');
389
+ syncTools(request);
390
+ return new Promise((resolve, reject) => {
391
+ const controller = new AbortController();
392
+ const onAbort = () => fail(step, signal?.reason ?? new Error('Work generation aborted.'));
393
+ const step = {
394
+ request,
395
+ observer,
396
+ controller,
397
+ claimed: false,
398
+ settled: false,
399
+ resolve,
400
+ reject,
401
+ detach: () => signal?.removeEventListener('abort', onAbort),
402
+ };
403
+ active = step;
404
+ signal?.addEventListener('abort', onAbort, { once: true });
405
+ for (const message of request.messages) {
406
+ const callId = message.tool_call_id;
407
+ if (message.role !== 'tool' || typeof callId !== 'string')
408
+ continue;
409
+ const text = toolResultText(message.content);
410
+ const waiter = toolWaiters.get(callId);
411
+ if (waiter) {
412
+ toolWaiters.delete(callId);
413
+ waiter(text);
414
+ }
415
+ else {
416
+ toolResults.set(callId, text);
417
+ }
418
+ }
419
+ // Calls Work did not answer would otherwise hold the loop forever.
420
+ releaseWaiters(MISSING_RESULT);
421
+ if (running)
422
+ nextModel?.();
423
+ else
424
+ start();
425
+ });
426
+ },
427
+ async dispose() {
428
+ if (disposed)
429
+ return;
430
+ disposed = true;
431
+ const error = new Error('The Work Strands driver is disposed.');
432
+ fail(active, error);
433
+ nextModel?.();
434
+ lifetime.abort(error);
435
+ agent.cancel();
436
+ releaseWaiters(MISSING_RESULT);
437
+ toolResults.clear();
438
+ await running?.catch(() => undefined);
439
+ await agent.memoryManager?.flush?.().catch(() => undefined);
440
+ },
441
+ };
442
+ }
443
+ //# sourceMappingURL=work-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-driver.js","sourceRoot":"","sources":["../../src/strands/work-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Engine selection stored alongside the model in Work records. */
2
+ export declare const WORK_STRANDS_MODEL_PREFIX = "strands:";
3
+ /** Whether Work should use the Strands driver for this model selection. */
4
+ export declare function isWorkStrandsModel(model: string): boolean;
5
+ /** Recover the provider's exact model id without changing provider identity. */
6
+ export declare function workProviderModel(model: string): string;
7
+ //# sourceMappingURL=work-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-model.d.ts","sourceRoot":"","sources":["../../src/strands/work-model.ts"],"names":[],"mappings":"AAiBA,mEAAmE;AACnE,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAmBpD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvD"}