libre-webui 0.37.2 → 0.38.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 (355) hide show
  1. package/README.md +28 -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/sqliteExtensionRepositories.d.ts.map +1 -1
  15. package/backend/dist/persistence/sqliteExtensionRepositories.js +2 -4
  16. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  17. package/backend/dist/routes/agentCli.d.ts.map +1 -1
  18. package/backend/dist/routes/agentCli.js +8 -3
  19. package/backend/dist/routes/agentCli.js.map +1 -1
  20. package/backend/dist/routes/{cordis.d.ts → strands.d.ts} +1 -1
  21. package/backend/dist/routes/strands.d.ts.map +1 -0
  22. package/backend/dist/routes/strands.js +300 -0
  23. package/backend/dist/routes/strands.js.map +1 -0
  24. package/backend/dist/routes/work.d.ts.map +1 -1
  25. package/backend/dist/routes/work.js +9 -21
  26. package/backend/dist/routes/work.js.map +1 -1
  27. package/backend/dist/services/agentAccessService.d.ts +0 -5
  28. package/backend/dist/services/agentAccessService.d.ts.map +1 -1
  29. package/backend/dist/services/agentAccessService.js +7 -35
  30. package/backend/dist/services/agentAccessService.js.map +1 -1
  31. package/backend/dist/services/agentCliService.d.ts +16 -23
  32. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  33. package/backend/dist/services/agentCliService.js +84 -112
  34. package/backend/dist/services/agentCliService.js.map +1 -1
  35. package/backend/dist/services/authService.d.ts +3 -3
  36. package/backend/dist/services/authService.d.ts.map +1 -1
  37. package/backend/dist/services/authService.js +3 -4
  38. package/backend/dist/services/authService.js.map +1 -1
  39. package/backend/dist/services/authorizationService.d.ts +1 -1
  40. package/backend/dist/services/authorizationService.d.ts.map +1 -1
  41. package/backend/dist/services/authorizationService.js +17 -8
  42. package/backend/dist/services/authorizationService.js.map +1 -1
  43. package/backend/dist/services/pluginUsageService.d.ts +0 -34
  44. package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
  45. package/backend/dist/services/pluginUsageService.js +0 -62
  46. package/backend/dist/services/pluginUsageService.js.map +1 -1
  47. package/backend/dist/services/strandsAccessService.d.ts +26 -0
  48. package/backend/dist/services/strandsAccessService.d.ts.map +1 -0
  49. package/backend/dist/services/strandsAccessService.js +95 -0
  50. package/backend/dist/services/strandsAccessService.js.map +1 -0
  51. package/backend/dist/services/thinkingSummaryService.d.ts +2 -3
  52. package/backend/dist/services/thinkingSummaryService.d.ts.map +1 -1
  53. package/backend/dist/services/thinkingSummaryService.js +13 -27
  54. package/backend/dist/services/thinkingSummaryService.js.map +1 -1
  55. package/backend/dist/services/titleGenerationService.d.ts +7 -18
  56. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  57. package/backend/dist/services/titleGenerationService.js +15 -36
  58. package/backend/dist/services/titleGenerationService.js.map +1 -1
  59. package/backend/dist/services/workAgentService.d.ts +1 -1
  60. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  61. package/backend/dist/services/workAgentService.js +14 -60
  62. package/backend/dist/services/workAgentService.js.map +1 -1
  63. package/backend/dist/services/workModelProviderService.d.ts +1 -4
  64. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  65. package/backend/dist/services/workModelProviderService.js +17 -37
  66. package/backend/dist/services/workModelProviderService.js.map +1 -1
  67. package/backend/dist/services/workTaskService.js +1 -1
  68. package/backend/dist/services/workTaskService.js.map +1 -1
  69. package/backend/dist/strands/catalog.d.ts +57 -0
  70. package/backend/dist/strands/catalog.d.ts.map +1 -0
  71. package/backend/dist/strands/catalog.js +241 -0
  72. package/backend/dist/strands/catalog.js.map +1 -0
  73. package/backend/dist/strands/engine.d.ts +131 -0
  74. package/backend/dist/strands/engine.d.ts.map +1 -0
  75. package/backend/dist/strands/engine.js +477 -0
  76. package/backend/dist/strands/engine.js.map +1 -0
  77. package/backend/dist/strands/harness.d.ts +14 -0
  78. package/backend/dist/strands/harness.d.ts.map +1 -0
  79. package/backend/dist/strands/harness.js +41 -0
  80. package/backend/dist/strands/harness.js.map +1 -0
  81. package/backend/dist/strands/model.d.ts +24 -0
  82. package/backend/dist/strands/model.d.ts.map +1 -0
  83. package/backend/dist/strands/model.js +381 -0
  84. package/backend/dist/strands/model.js.map +1 -0
  85. package/backend/dist/strands/runtime.d.ts +4 -0
  86. package/backend/dist/strands/runtime.d.ts.map +1 -0
  87. package/backend/dist/{cordis/work-model.js → strands/runtime.js} +16 -12
  88. package/backend/dist/strands/runtime.js.map +1 -0
  89. package/backend/dist/strands/sandbox.d.ts +24 -0
  90. package/backend/dist/strands/sandbox.d.ts.map +1 -0
  91. package/backend/dist/strands/sandbox.js +156 -0
  92. package/backend/dist/strands/sandbox.js.map +1 -0
  93. package/backend/dist/strands/work-driver.d.ts +11 -0
  94. package/backend/dist/strands/work-driver.d.ts.map +1 -0
  95. package/backend/dist/strands/work-driver.js +443 -0
  96. package/backend/dist/strands/work-driver.js.map +1 -0
  97. package/backend/dist/strands/work-model.d.ts +7 -0
  98. package/backend/dist/strands/work-model.d.ts.map +1 -0
  99. package/backend/dist/strands/work-model.js +42 -0
  100. package/backend/dist/strands/work-model.js.map +1 -0
  101. package/backend/dist/types/work.d.ts +4 -11
  102. package/backend/dist/types/work.d.ts.map +1 -1
  103. package/backend/dist/utils/corsOriginPolicy.d.ts +10 -0
  104. package/backend/dist/utils/corsOriginPolicy.d.ts.map +1 -0
  105. package/backend/dist/utils/corsOriginPolicy.js +70 -0
  106. package/backend/dist/utils/corsOriginPolicy.js.map +1 -0
  107. package/backend/package.json +4 -34
  108. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  109. package/frontend/dist/assets/index-CJHJxwjA.js +68 -0
  110. package/frontend/dist/assets/index-DSHdOZRK.css +1 -0
  111. package/frontend/dist/index.html +30 -30
  112. package/frontend/dist/js/{ArtifactContainer-D4v4l15L.js → ArtifactContainer-BWTN4QSW.js} +1 -1
  113. package/frontend/dist/js/{ArtifactDemoPage-B2uaVpsi.js → ArtifactDemoPage-CCh7lQEw.js} +1 -1
  114. package/frontend/dist/js/{ArtifactSandboxFrame-DlWJHI-r.js → ArtifactSandboxFrame-D1ntMsqe.js} +1 -1
  115. package/frontend/dist/js/{ArtifactSlideOutPanel-laZ98QKB.js → ArtifactSlideOutPanel-zPEBPoMh.js} +1 -1
  116. package/frontend/dist/js/AutomationModal-DN98Eyym.js +1 -0
  117. package/frontend/dist/js/AutomationsPage-3DBwRKME.js +1 -0
  118. package/frontend/dist/js/{AvatarUpload-KaBaTKoG.js → AvatarUpload-D5_wGUb5.js} +1 -1
  119. package/frontend/dist/js/{Button-CGMYia4g.js → Button-CTwi9N3d.js} +1 -1
  120. package/frontend/dist/js/{CalendarPage-Dc7r-86c.js → CalendarPage-CUbGH3Tl.js} +1 -1
  121. package/frontend/dist/js/ChannelsPage-B1hC1rRS.js +1 -0
  122. package/frontend/dist/js/ChatPage-B7mEg5z2.js +14 -0
  123. package/frontend/dist/js/{ConnectModels-aUTD6s9B.js → ConnectModels-Cby89_Mc.js} +1 -1
  124. package/frontend/dist/js/{EvaluationsPage-BB7sPhIR.js → EvaluationsPage-BaND2qQM.js} +2 -2
  125. package/frontend/dist/js/{FirstTimeSetup-elqSi9JH.js → FirstTimeSetup-D8ktLJKO.js} +1 -1
  126. package/frontend/dist/js/GalleryPage-DXQLoU0l.js +1 -0
  127. package/frontend/dist/js/HomePage-WVug1vWc.js +1 -0
  128. package/frontend/dist/js/LanguageSwitcher-DHHTrDBR.js +1 -0
  129. package/frontend/dist/js/{Logo-HZvdAk2c.js → Logo-D1o5k_wt.js} +1 -1
  130. package/frontend/dist/js/{LogoMark-GJnfMXsk.js → LogoMark-lnmc98jv.js} +1 -1
  131. package/frontend/dist/js/{ModelManagerModals-Bk6OQzJI.js → ModelManagerModals-BPALNMDH.js} +1 -1
  132. package/frontend/dist/js/NotesPage-CRzX2Wa8.js +3 -0
  133. package/frontend/dist/js/{PasswordStrengthMeter-DasfJa4P.js → PasswordStrengthMeter-BGrHWG0B.js} +1 -1
  134. package/frontend/dist/js/{PersonasPage-CIJINcQK.js → PersonasPage-BRU9151f.js} +2 -2
  135. package/frontend/dist/js/PluginUsagePage-BlhYZq1l.js +1 -0
  136. package/frontend/dist/js/RichMessageContent-FiuPwDG7.js +1 -0
  137. package/frontend/dist/js/{RichMessageContent-DxCHlUlY.js → RichMessageContent-OGBLO64L.js} +1 -1
  138. package/frontend/dist/js/SettingsModal-sLkxG-lW.js +19 -0
  139. package/frontend/dist/js/{SettingsToggle-oxvw7ulA.js → SettingsToggle-Du2FSUPO.js} +1 -1
  140. package/frontend/dist/js/{ShareDialog-Bhpt_Y1N.js → ShareDialog-DEhxnLfn.js} +1 -1
  141. package/frontend/dist/js/StrandsPage-DWnUKSb0.js +1 -0
  142. package/frontend/dist/js/{SystemPage-BfhVXqar.js → SystemPage-cqq8lSxB.js} +1 -1
  143. package/frontend/dist/js/UserManagementPanel-NZmoTk6V.js +1 -0
  144. package/frontend/dist/js/{WhatsNewModal-Dl69bG2T.js → WhatsNewModal-5SwIdmU1.js} +1 -1
  145. package/frontend/dist/js/WorkPage-BIuaVNEC.js +8 -0
  146. package/frontend/dist/js/api-C2k0OqEk.js +1 -0
  147. package/frontend/dist/js/api-CnJYEbRz.js +14 -0
  148. package/frontend/dist/js/{appNavigation-R8iKverf.js → appNavigation-BXNRwrN-.js} +1 -1
  149. package/frontend/dist/js/appStore-DULGAJnH.js +2 -0
  150. package/frontend/dist/js/appVersion-DooVk4c_.js +1 -0
  151. package/frontend/dist/js/ar-Bp843BgG.js +2 -0
  152. package/frontend/dist/js/authStore-CaLdzyAr.js +1 -0
  153. package/frontend/dist/js/{authStore-D8fc-Hl0.js → authStore-DwaPsICv.js} +3 -3
  154. package/frontend/dist/js/bn-DmSGkklY.js +2 -0
  155. package/frontend/dist/js/chatStore-j8bGpkeT.js +3 -0
  156. package/frontend/dist/js/{client-BeJbHHWx.js → client-DQy1iGRM.js} +2 -2
  157. package/frontend/dist/js/{config-D6Kcp5n3.js → config-BbrsmDn2.js} +1 -1
  158. package/frontend/dist/js/cs-BcauIRyG.js +2 -0
  159. package/frontend/dist/js/da-CJ14DPJ_.js +2 -0
  160. package/frontend/dist/js/de-ajswyAhq.js +2 -0
  161. package/frontend/dist/js/es-rlf8FsMZ.js +2 -0
  162. package/frontend/dist/js/{evaluationsApi-2YwZBPk5.js → evaluationsApi-KVsH7yXe.js} +1 -1
  163. package/frontend/dist/js/fr-BwkM1wie.js +2 -0
  164. package/frontend/dist/js/hi-B3eId9-I.js +2 -0
  165. package/frontend/dist/js/id-BcgPFJh2.js +2 -0
  166. package/frontend/dist/js/is-Crvd3K7f.js +2 -0
  167. package/frontend/dist/js/it-DrLx24hb.js +2 -0
  168. package/frontend/dist/js/ja-DZMcf-oB.js +2 -0
  169. package/frontend/dist/js/ko-Cm0NiOE8.js +2 -0
  170. package/frontend/dist/js/{messageCodeStyles-D4haBw80.js → messageCodeStyles-CDnMKLgo.js} +1 -1
  171. package/frontend/dist/js/ms-ymaG59hx.js +2 -0
  172. package/frontend/dist/js/nl-CdIdeA9d.js +2 -0
  173. package/frontend/dist/js/pl-CuO0b605.js +2 -0
  174. package/frontend/dist/js/pt-Vy413FG5.js +2 -0
  175. package/frontend/dist/js/ru-D0zOEVrL.js +2 -0
  176. package/frontend/dist/js/strandsApi-SeoX_IsY.js +2 -0
  177. package/frontend/dist/js/sv-JoS4krpk.js +2 -0
  178. package/frontend/dist/js/{teamEventStream-omPy51va.js → teamEventStream-CZYdpbVw.js} +1 -1
  179. package/frontend/dist/js/th-afhelaqR.js +2 -0
  180. package/frontend/dist/js/tr-BhSy9UrR.js +2 -0
  181. package/frontend/dist/js/{ui-D5-4niRk.js → ui-CW3gJ4Kl.js} +2 -2
  182. package/frontend/dist/js/ui-vendor-_fvLnmDx.js +1 -0
  183. package/frontend/dist/js/uk-CibXypnZ.js +2 -0
  184. package/frontend/dist/js/{useChat-DnGClJeX.js → useChat-CBySqLqR.js} +4 -4
  185. package/frontend/dist/js/useDialogFocus-DbW0oA9H.js +1 -0
  186. package/frontend/dist/js/useDictation-DEAp64eu.js +1 -0
  187. package/frontend/dist/js/{useTranslation-B9kflK9S.js → useTranslation-UHEMTEHd.js} +1 -1
  188. package/frontend/dist/js/utils-DaXuqmQm.js +1 -0
  189. package/frontend/dist/js/utils-vendor-CvhktdS_.js +1 -0
  190. package/frontend/dist/js/vi-Cg0WKHtb.js +2 -0
  191. package/frontend/dist/js/{work-DmJpVPPO.js → work-CdbmBok5.js} +1 -1
  192. package/frontend/dist/js/{workApi-C5InfT8x.js → workApi-BqkCbCLQ.js} +1 -1
  193. package/frontend/dist/js/workApi-gpxrWwCm.js +1 -0
  194. package/frontend/dist/js/workModels-BM2Zyiba.js +1 -0
  195. package/frontend/dist/js/zh-DTqys9TE.js +2 -0
  196. package/package.json +10 -39
  197. package/backend/dist/cordis/contracts.d.ts +0 -270
  198. package/backend/dist/cordis/contracts.d.ts.map +0 -1
  199. package/backend/dist/cordis/contracts.js +0 -32
  200. package/backend/dist/cordis/contracts.js.map +0 -1
  201. package/backend/dist/cordis/dsh/chat-model.d.ts +0 -16
  202. package/backend/dist/cordis/dsh/chat-model.d.ts.map +0 -1
  203. package/backend/dist/cordis/dsh/chat-model.js +0 -104
  204. package/backend/dist/cordis/dsh/chat-model.js.map +0 -1
  205. package/backend/dist/cordis/dsh/engine-plugin.d.ts +0 -186
  206. package/backend/dist/cordis/dsh/engine-plugin.d.ts.map +0 -1
  207. package/backend/dist/cordis/dsh/engine-plugin.js +0 -1116
  208. package/backend/dist/cordis/dsh/engine-plugin.js.map +0 -1
  209. package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts +0 -175
  210. package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts.map +0 -1
  211. package/backend/dist/cordis/dsh/librewebui-llm-adapter.js +0 -480
  212. package/backend/dist/cordis/dsh/librewebui-llm-adapter.js.map +0 -1
  213. package/backend/dist/cordis/dsh/model-identity.d.ts +0 -12
  214. package/backend/dist/cordis/dsh/model-identity.d.ts.map +0 -1
  215. package/backend/dist/cordis/dsh/model-identity.js +0 -87
  216. package/backend/dist/cordis/dsh/model-identity.js.map +0 -1
  217. package/backend/dist/cordis/dsh/native-provider-client.d.ts +0 -44
  218. package/backend/dist/cordis/dsh/native-provider-client.d.ts.map +0 -1
  219. package/backend/dist/cordis/dsh/native-provider-client.js +0 -524
  220. package/backend/dist/cordis/dsh/native-provider-client.js.map +0 -1
  221. package/backend/dist/cordis/dsh/native-provider-plugin.d.ts +0 -11
  222. package/backend/dist/cordis/dsh/native-provider-plugin.d.ts.map +0 -1
  223. package/backend/dist/cordis/dsh/native-provider-plugin.js +0 -416
  224. package/backend/dist/cordis/dsh/native-provider-plugin.js.map +0 -1
  225. package/backend/dist/cordis/dsh/native-provider-protocol.d.ts +0 -37
  226. package/backend/dist/cordis/dsh/native-provider-protocol.d.ts.map +0 -1
  227. package/backend/dist/cordis/dsh/native-provider-protocol.js +0 -325
  228. package/backend/dist/cordis/dsh/native-provider-protocol.js.map +0 -1
  229. package/backend/dist/cordis/dsh/provider-handler.d.ts +0 -36
  230. package/backend/dist/cordis/dsh/provider-handler.d.ts.map +0 -1
  231. package/backend/dist/cordis/dsh/provider-handler.js +0 -582
  232. package/backend/dist/cordis/dsh/provider-handler.js.map +0 -1
  233. package/backend/dist/cordis/dsh/session-files.d.ts +0 -9
  234. package/backend/dist/cordis/dsh/session-files.d.ts.map +0 -1
  235. package/backend/dist/cordis/dsh/session-files.js +0 -60
  236. package/backend/dist/cordis/dsh/session-files.js.map +0 -1
  237. package/backend/dist/cordis/dsh/session-settings.d.ts +0 -15
  238. package/backend/dist/cordis/dsh/session-settings.d.ts.map +0 -1
  239. package/backend/dist/cordis/dsh/session-settings.js +0 -51
  240. package/backend/dist/cordis/dsh/session-settings.js.map +0 -1
  241. package/backend/dist/cordis/dsh/work-driver.d.ts +0 -12
  242. package/backend/dist/cordis/dsh/work-driver.d.ts.map +0 -1
  243. package/backend/dist/cordis/dsh/work-driver.js +0 -402
  244. package/backend/dist/cordis/dsh/work-driver.js.map +0 -1
  245. package/backend/dist/cordis/dsh/workspace-policy.d.ts +0 -10
  246. package/backend/dist/cordis/dsh/workspace-policy.d.ts.map +0 -1
  247. package/backend/dist/cordis/dsh/workspace-policy.js +0 -44
  248. package/backend/dist/cordis/dsh/workspace-policy.js.map +0 -1
  249. package/backend/dist/cordis/host/composition.d.ts +0 -73
  250. package/backend/dist/cordis/host/composition.d.ts.map +0 -1
  251. package/backend/dist/cordis/host/composition.js +0 -205
  252. package/backend/dist/cordis/host/composition.js.map +0 -1
  253. package/backend/dist/cordis/host/config.d.ts +0 -159
  254. package/backend/dist/cordis/host/config.d.ts.map +0 -1
  255. package/backend/dist/cordis/host/config.js +0 -184
  256. package/backend/dist/cordis/host/config.js.map +0 -1
  257. package/backend/dist/cordis/host/host.d.ts +0 -74
  258. package/backend/dist/cordis/host/host.d.ts.map +0 -1
  259. package/backend/dist/cordis/host/host.js +0 -420
  260. package/backend/dist/cordis/host/host.js.map +0 -1
  261. package/backend/dist/cordis/host/loader-entry.d.ts +0 -41
  262. package/backend/dist/cordis/host/loader-entry.d.ts.map +0 -1
  263. package/backend/dist/cordis/host/loader-entry.js +0 -52
  264. package/backend/dist/cordis/host/loader-entry.js.map +0 -1
  265. package/backend/dist/cordis/host/model.d.ts +0 -45
  266. package/backend/dist/cordis/host/model.d.ts.map +0 -1
  267. package/backend/dist/cordis/host/model.js +0 -54
  268. package/backend/dist/cordis/host/model.js.map +0 -1
  269. package/backend/dist/cordis/host/privacy.d.ts +0 -8
  270. package/backend/dist/cordis/host/privacy.d.ts.map +0 -1
  271. package/backend/dist/cordis/host/privacy.js +0 -73
  272. package/backend/dist/cordis/host/privacy.js.map +0 -1
  273. package/backend/dist/cordis/index.d.ts +0 -14
  274. package/backend/dist/cordis/index.d.ts.map +0 -1
  275. package/backend/dist/cordis/index.js +0 -30
  276. package/backend/dist/cordis/index.js.map +0 -1
  277. package/backend/dist/cordis/runtime.d.ts +0 -97
  278. package/backend/dist/cordis/runtime.d.ts.map +0 -1
  279. package/backend/dist/cordis/runtime.js +0 -231
  280. package/backend/dist/cordis/runtime.js.map +0 -1
  281. package/backend/dist/cordis/work-model.d.ts +0 -7
  282. package/backend/dist/cordis/work-model.d.ts.map +0 -1
  283. package/backend/dist/cordis/work-model.js.map +0 -1
  284. package/backend/dist/routes/cordis.d.ts.map +0 -1
  285. package/backend/dist/routes/cordis.js +0 -440
  286. package/backend/dist/routes/cordis.js.map +0 -1
  287. package/backend/dist/routes/libreClaw.d.ts +0 -3
  288. package/backend/dist/routes/libreClaw.d.ts.map +0 -1
  289. package/backend/dist/routes/libreClaw.js +0 -200
  290. package/backend/dist/routes/libreClaw.js.map +0 -1
  291. package/backend/dist/services/cordisAccessService.d.ts +0 -56
  292. package/backend/dist/services/cordisAccessService.d.ts.map +0 -1
  293. package/backend/dist/services/cordisAccessService.js +0 -98
  294. package/backend/dist/services/cordisAccessService.js.map +0 -1
  295. package/backend/dist/services/libreClawService.d.ts +0 -105
  296. package/backend/dist/services/libreClawService.d.ts.map +0 -1
  297. package/backend/dist/services/libreClawService.js +0 -169
  298. package/backend/dist/services/libreClawService.js.map +0 -1
  299. package/frontend/dist/assets/index-C8_AByBq.css +0 -1
  300. package/frontend/dist/assets/index-DWLnkKwj.js +0 -16
  301. package/frontend/dist/js/AutomationModal-CjjiEZFA.js +0 -1
  302. package/frontend/dist/js/AutomationsPage-jnWmD58y.js +0 -1
  303. package/frontend/dist/js/ChannelsPage-DHPabX1e.js +0 -1
  304. package/frontend/dist/js/ChatPage-ZvGp-iqV.js +0 -14
  305. package/frontend/dist/js/CordisPage-DZKcpPVj.js +0 -1
  306. package/frontend/dist/js/GalleryPage-CrlNRnkn.js +0 -1
  307. package/frontend/dist/js/HomePage-lR9h7_a1.js +0 -1
  308. package/frontend/dist/js/LanguageSwitcher-CWkbzpxT.js +0 -1
  309. package/frontend/dist/js/LibreClawPage-P19FnNlu.js +0 -1
  310. package/frontend/dist/js/NotesPage-DopG0M4B.js +0 -3
  311. package/frontend/dist/js/PluginUsagePage-Cj0mUxD8.js +0 -1
  312. package/frontend/dist/js/RichMessageContent-BZndQSJU.js +0 -1
  313. package/frontend/dist/js/SettingsModal-wAuFQOE4.js +0 -19
  314. package/frontend/dist/js/UserManagementPanel-BU95ZPOv.js +0 -1
  315. package/frontend/dist/js/WorkPage-CSderbeT.js +0 -8
  316. package/frontend/dist/js/api-CU-JXx2u.js +0 -1
  317. package/frontend/dist/js/api-DPXCtanG.js +0 -14
  318. package/frontend/dist/js/appStore-BD70bvas.js +0 -2
  319. package/frontend/dist/js/appVersion-C7sxqgMd.js +0 -1
  320. package/frontend/dist/js/ar-Cq-DrSYL.js +0 -2
  321. package/frontend/dist/js/authStore-FNKLFUQp.js +0 -1
  322. package/frontend/dist/js/bn-BqxLh-KL.js +0 -2
  323. package/frontend/dist/js/chatStore-CK5ojwft.js +0 -3
  324. package/frontend/dist/js/cordisApi-BS8QMSV4.js +0 -2
  325. package/frontend/dist/js/cs-D2DDNZf-.js +0 -2
  326. package/frontend/dist/js/da-BciY-TSG.js +0 -2
  327. package/frontend/dist/js/de-DjU_eXQ-.js +0 -2
  328. package/frontend/dist/js/es-ChIEs80I.js +0 -2
  329. package/frontend/dist/js/fr-Bi8BGRW4.js +0 -2
  330. package/frontend/dist/js/hi-BMsCnWg7.js +0 -2
  331. package/frontend/dist/js/i18next-DOICz7ZY.js +0 -1
  332. package/frontend/dist/js/id-CpcN1vhk.js +0 -2
  333. package/frontend/dist/js/is-DkUy2cmP.js +0 -2
  334. package/frontend/dist/js/it-BglK9DRZ.js +0 -2
  335. package/frontend/dist/js/ja-IrprzwLJ.js +0 -2
  336. package/frontend/dist/js/ko--wwEsMPi.js +0 -2
  337. package/frontend/dist/js/ms-BWj59y7-.js +0 -2
  338. package/frontend/dist/js/nl-D-QndW_A.js +0 -2
  339. package/frontend/dist/js/pl-Dw7d7iDV.js +0 -2
  340. package/frontend/dist/js/pt-BI53uHJw.js +0 -2
  341. package/frontend/dist/js/ru-JKyTgPg9.js +0 -2
  342. package/frontend/dist/js/sv-BIkBLPSQ.js +0 -2
  343. package/frontend/dist/js/th-CZ_LcCU0.js +0 -2
  344. package/frontend/dist/js/tr-B265byx1.js +0 -2
  345. package/frontend/dist/js/ui-vendor-BhHHyHk3.js +0 -1
  346. package/frontend/dist/js/uk-VTAlChwf.js +0 -2
  347. package/frontend/dist/js/useDialogFocus-BPTG_Zmy.js +0 -1
  348. package/frontend/dist/js/useDictation-D7zVBjDJ.js +0 -1
  349. package/frontend/dist/js/utils-p8Gt72YP.js +0 -1
  350. package/frontend/dist/js/utils-vendor-DISWt2y9.js +0 -1
  351. package/frontend/dist/js/vi-D8rXh-53.js +0 -2
  352. package/frontend/dist/js/workApi-FV75LKJn.js +0 -1
  353. package/frontend/dist/js/workModels-MzU2Ab7l.js +0 -1
  354. package/frontend/dist/js/zh-BEGd9iBD.js +0 -2
  355. package/scripts/prepare-dsh-provider.mjs +0 -124
@@ -0,0 +1,381 @@
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 model that serves every turn through Libre WebUI's own provider
19
+ * services. The agent loop, tools, and sessions belong to Strands; the model
20
+ * call goes through the same Ollama and plugin paths Chat uses, so provider
21
+ * credentials, usage metering, and the Ollama switch apply unchanged.
22
+ *
23
+ * Strands expects one content block at a time and a message stop event that
24
+ * says why the turn ended. Tools only run when that reason is 'toolUse'.
25
+ */
26
+ import { randomUUID } from 'node:crypto';
27
+ import { Model, } from '@strands-agents/sdk';
28
+ import pluginService from '../services/pluginService.js';
29
+ import ollamaService from '../services/ollamaService.js';
30
+ import { toOpenAICompatibleTools } from '../utils/pluginChatAdapter.js';
31
+ const MAX_BUFFERED_EVENTS = 2048;
32
+ const MAX_BUFFERED_BYTES = 2000000;
33
+ function systemText(prompt) {
34
+ if (!prompt)
35
+ return '';
36
+ if (typeof prompt === 'string')
37
+ return prompt;
38
+ return prompt
39
+ .map(block => (block.type === 'textBlock' ? block.text : ''))
40
+ .filter(Boolean)
41
+ .join('\n\n');
42
+ }
43
+ function toolResultText(block) {
44
+ return block.content
45
+ .map(item => {
46
+ if (item.type === 'textBlock')
47
+ return item.text ?? '';
48
+ if (item.type === 'jsonBlock')
49
+ return JSON.stringify(item.json);
50
+ return `[${item.type} omitted]`;
51
+ })
52
+ .join('\n');
53
+ }
54
+ /** Convert a Strands transcript into Libre WebUI's provider message shape. */
55
+ export function toChatMessages(messages, systemPrompt) {
56
+ const now = Date.now();
57
+ let index = 0;
58
+ const id = () => `strands-${now}-${index++}`;
59
+ const out = [];
60
+ const system = systemText(systemPrompt);
61
+ if (system) {
62
+ out.push({ id: id(), role: 'system', content: system, timestamp: now });
63
+ }
64
+ for (const message of messages) {
65
+ const text = [];
66
+ const thinking = [];
67
+ const toolCalls = [];
68
+ for (const block of message.content) {
69
+ switch (block.type) {
70
+ case 'textBlock':
71
+ text.push(block.text);
72
+ break;
73
+ case 'reasoningBlock':
74
+ if (block.text)
75
+ thinking.push(block.text);
76
+ break;
77
+ case 'toolUseBlock':
78
+ toolCalls.push({
79
+ id: block.toolUseId,
80
+ type: 'function',
81
+ function: {
82
+ name: block.name,
83
+ arguments: JSON.stringify(block.input ?? {}),
84
+ },
85
+ });
86
+ break;
87
+ case 'toolResultBlock':
88
+ out.push({
89
+ id: id(),
90
+ role: 'tool',
91
+ content: (block.status === 'error' ? 'Error: ' : '') +
92
+ toolResultText(block),
93
+ tool_call_id: block.toolUseId,
94
+ timestamp: now,
95
+ });
96
+ break;
97
+ default:
98
+ break;
99
+ }
100
+ }
101
+ if (text.length === 0 && toolCalls.length === 0)
102
+ continue;
103
+ out.push({
104
+ id: id(),
105
+ role: message.role === 'assistant' ? 'assistant' : 'user',
106
+ content: text.join(''),
107
+ ...(thinking.length ? { thinking: thinking.join('') } : {}),
108
+ ...(toolCalls.length ? { tool_calls: toolCalls } : {}),
109
+ timestamp: now,
110
+ });
111
+ }
112
+ return out;
113
+ }
114
+ export function toProviderTools(specs) {
115
+ if (!specs?.length)
116
+ return undefined;
117
+ return specs.map(spec => ({
118
+ name: spec.name,
119
+ description: spec.description,
120
+ parameters: spec.inputSchema ?? {
121
+ type: 'object',
122
+ properties: {},
123
+ },
124
+ }));
125
+ }
126
+ export function stopReasonFor(reason, hasTools) {
127
+ if (hasTools)
128
+ return 'toolUse';
129
+ if (reason === 'length' ||
130
+ reason === 'max_tokens' ||
131
+ reason === 'max-tokens' ||
132
+ reason === 'incomplete:max_output_tokens') {
133
+ return 'maxTokens';
134
+ }
135
+ return 'endTurn';
136
+ }
137
+ export class LibreWebUiModel extends Model {
138
+ constructor(target, userId, config = {}) {
139
+ super();
140
+ this.target = target;
141
+ this.userId = userId;
142
+ this.config = { ...config, modelId: target.id };
143
+ }
144
+ updateConfig(modelConfig) {
145
+ this.config = { ...this.config, ...modelConfig, modelId: this.target.id };
146
+ }
147
+ getConfig() {
148
+ return { ...this.config };
149
+ }
150
+ async *stream(messages, options = {}) {
151
+ const signal = options.cancelSignal;
152
+ signal?.throwIfAborted();
153
+ const chatMessages = toChatMessages(messages, options.systemPrompt);
154
+ const tools = toProviderTools(options.toolSpecs);
155
+ const generation = {
156
+ ...(this.config.temperature === undefined
157
+ ? {}
158
+ : { temperature: this.config.temperature }),
159
+ ...(this.config.maxTokens === undefined
160
+ ? {}
161
+ : { num_predict: this.config.maxTokens }),
162
+ };
163
+ yield { type: 'modelMessageStartEvent', role: 'assistant' };
164
+ let open;
165
+ let hasTools = false;
166
+ let doneReason;
167
+ let inputTokens = 0;
168
+ let outputTokens = 0;
169
+ let sawUsage = false;
170
+ const source = this.target.route.type === 'plugin'
171
+ ? this.pluginEvents(chatMessages, generation, tools, signal)
172
+ : this.ollamaEvents(chatMessages, generation, tools, signal);
173
+ for await (const event of source) {
174
+ if (event.type === 'text' || event.type === 'reasoning') {
175
+ if (!event.text)
176
+ continue;
177
+ if (open && open !== event.type) {
178
+ yield { type: 'modelContentBlockStopEvent' };
179
+ open = undefined;
180
+ }
181
+ open = event.type;
182
+ yield {
183
+ type: 'modelContentBlockDeltaEvent',
184
+ delta: event.type === 'text'
185
+ ? { type: 'textDelta', text: event.text }
186
+ : { type: 'reasoningContentDelta', text: event.text },
187
+ };
188
+ continue;
189
+ }
190
+ if (event.type === 'tool-call') {
191
+ if (open) {
192
+ yield { type: 'modelContentBlockStopEvent' };
193
+ open = undefined;
194
+ }
195
+ hasTools = true;
196
+ yield {
197
+ type: 'modelContentBlockStartEvent',
198
+ start: {
199
+ type: 'toolUseStart',
200
+ name: event.toolCall.name,
201
+ toolUseId: event.toolCall.id || `call_${randomUUID()}`,
202
+ },
203
+ };
204
+ yield {
205
+ type: 'modelContentBlockDeltaEvent',
206
+ delta: {
207
+ type: 'toolUseInputDelta',
208
+ input: event.toolCall.arguments || '{}',
209
+ },
210
+ };
211
+ yield { type: 'modelContentBlockStopEvent' };
212
+ continue;
213
+ }
214
+ if (event.type === 'usage') {
215
+ sawUsage = true;
216
+ inputTokens = event.inputTokens;
217
+ outputTokens = event.outputTokens;
218
+ continue;
219
+ }
220
+ doneReason = event.reason;
221
+ }
222
+ signal?.throwIfAborted();
223
+ if (open)
224
+ yield { type: 'modelContentBlockStopEvent' };
225
+ yield {
226
+ type: 'modelMessageStopEvent',
227
+ stopReason: stopReasonFor(doneReason, hasTools),
228
+ };
229
+ if (sawUsage) {
230
+ yield {
231
+ type: 'modelMetadataEvent',
232
+ usage: {
233
+ inputTokens,
234
+ outputTokens,
235
+ totalTokens: inputTokens + outputTokens,
236
+ },
237
+ };
238
+ }
239
+ }
240
+ async *pluginEvents(messages, generation, tools, signal) {
241
+ const route = this.target.route;
242
+ if (route.type !== 'plugin')
243
+ return;
244
+ for await (const chunk of pluginService.executePluginStreamRequest(route.model, messages, { ...generation, ...(tools ? { tools } : {}) }, this.userId, route.pluginId, signal)) {
245
+ signal?.throwIfAborted();
246
+ if (chunk.type === 'content' && chunk.content) {
247
+ yield { type: 'text', text: chunk.content };
248
+ }
249
+ else if (chunk.type === 'reasoning' && chunk.content) {
250
+ yield { type: 'reasoning', text: chunk.content };
251
+ }
252
+ else if (chunk.type === 'tool_call' && chunk.toolCall) {
253
+ yield { type: 'tool-call', toolCall: chunk.toolCall };
254
+ }
255
+ else if (chunk.type === 'usage' && chunk.usage) {
256
+ yield {
257
+ type: 'usage',
258
+ inputTokens: chunk.usage.promptTokens ?? 0,
259
+ outputTokens: chunk.usage.completionTokens ?? 0,
260
+ };
261
+ }
262
+ else if (chunk.type === 'done') {
263
+ yield { type: 'done', reason: chunk.doneReason };
264
+ }
265
+ }
266
+ }
267
+ /** Ollama streams through callbacks, so bridge them onto a bounded queue. */
268
+ async *ollamaEvents(messages, generation, tools, outer) {
269
+ const controller = new AbortController();
270
+ const signal = outer
271
+ ? AbortSignal.any([outer, controller.signal])
272
+ : controller.signal;
273
+ const queue = [];
274
+ let bufferedBytes = 0;
275
+ let settled = false;
276
+ let failure;
277
+ let wake;
278
+ let doneReason;
279
+ const notify = () => {
280
+ wake?.();
281
+ wake = undefined;
282
+ };
283
+ const fail = (error) => {
284
+ failure ?? (failure = error);
285
+ settled = true;
286
+ notify();
287
+ };
288
+ const push = (event) => {
289
+ if (settled || signal.aborted)
290
+ return;
291
+ const bytes = Buffer.byteLength(JSON.stringify(event));
292
+ if (queue.length >= MAX_BUFFERED_EVENTS ||
293
+ bufferedBytes + bytes > MAX_BUFFERED_BYTES) {
294
+ const error = new Error('Strands provider output exceeded its stream buffer limit.');
295
+ fail(error);
296
+ controller.abort(error);
297
+ return;
298
+ }
299
+ queue.push(event);
300
+ bufferedBytes += bytes;
301
+ notify();
302
+ };
303
+ const abort = () => fail(signal.reason instanceof Error
304
+ ? signal.reason
305
+ : new Error('Request aborted'));
306
+ signal.addEventListener('abort', abort, { once: true });
307
+ if (signal.aborted)
308
+ abort();
309
+ const route = this.target.route;
310
+ const finished = ollamaService
311
+ .generateChatStreamResponse({
312
+ model: route.model,
313
+ messages,
314
+ stream: true,
315
+ options: { ...generation },
316
+ ...(tools?.length ? { tools: toOpenAICompatibleTools(tools) } : {}),
317
+ }, chunk => {
318
+ const text = chunk.message?.content;
319
+ if (text)
320
+ push({ type: 'text', text });
321
+ if (chunk.message?.thinking) {
322
+ push({ type: 'reasoning', text: chunk.message.thinking });
323
+ }
324
+ for (const rawCall of chunk.message?.tool_calls ?? []) {
325
+ const fn = rawCall.function;
326
+ push({
327
+ type: 'tool-call',
328
+ toolCall: {
329
+ id: typeof rawCall.id === 'string' && rawCall.id
330
+ ? rawCall.id
331
+ : `call_${randomUUID()}`,
332
+ name: typeof fn?.name === 'string' ? fn.name : '',
333
+ arguments: typeof fn?.arguments === 'string'
334
+ ? fn.arguments
335
+ : JSON.stringify(fn?.arguments ?? {}),
336
+ },
337
+ });
338
+ }
339
+ if (typeof chunk.prompt_eval_count === 'number' &&
340
+ typeof chunk.eval_count === 'number') {
341
+ push({
342
+ type: 'usage',
343
+ inputTokens: chunk.prompt_eval_count,
344
+ outputTokens: chunk.eval_count,
345
+ });
346
+ }
347
+ if (chunk.done_reason)
348
+ doneReason = chunk.done_reason;
349
+ }, fail, () => push({ type: 'done', reason: doneReason }), signal, { userId: this.userId })
350
+ .catch(error => fail(error instanceof Error ? error : new Error(String(error))))
351
+ .finally(() => {
352
+ settled = true;
353
+ notify();
354
+ });
355
+ try {
356
+ while (!settled || queue.length) {
357
+ if (failure)
358
+ throw failure;
359
+ const event = queue.shift();
360
+ if (event) {
361
+ bufferedBytes -= Buffer.byteLength(JSON.stringify(event));
362
+ yield event;
363
+ }
364
+ else {
365
+ await new Promise(resolve => {
366
+ wake = resolve;
367
+ });
368
+ }
369
+ }
370
+ if (failure)
371
+ throw failure;
372
+ }
373
+ finally {
374
+ signal.removeEventListener('abort', abort);
375
+ controller.abort();
376
+ queue.length = 0;
377
+ await finished;
378
+ }
379
+ }
380
+ }
381
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/strands/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,KAAK,GAON,MAAM,qBAAqB,CAAC;AAM7B,OAAO,aAAa,MAAM,8BAA8B,CAAC;AACzD,OAAO,aAAa,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,kBAAkB,GAAG,OAAS,CAAC;AAcrC,SAAS,UAAU,CAAC,MAAgC;IAClD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,OAAO,MAAM;SACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC5D,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,KAEvB;IACC,OAAO,KAAK,CAAC,OAAO;SACjB,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,IAAI,IAAI,CAAC,IAAI,WAAW,CAAC;IAClC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAC5B,QAA4B,EAC5B,YAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,KAAK,EAAE,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,SAAS,GAA2C,EAAE,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,WAAW;oBACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtB,MAAM;gBACR,KAAK,gBAAgB;oBACnB,IAAI,KAAK,CAAC,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC1C,MAAM;gBACR,KAAK,cAAc;oBACjB,SAAS,CAAC,IAAI,CAAC;wBACb,EAAE,EAAE,KAAK,CAAC,SAAS;wBACnB,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE;4BACR,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;yBAC7C;qBACF,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,iBAAiB;oBACpB,GAAG,CAAC,IAAI,CAAC;wBACP,EAAE,EAAE,EAAE,EAAE;wBACR,IAAI,EAAE,MAAM;wBACZ,OAAO,EACL,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC3C,cAAc,CAAC,KAAK,CAAC;wBACvB,YAAY,EAAE,KAAK,CAAC,SAAS;wBAC7B,SAAS,EAAE,GAAG;qBACf,CAAC,CAAC;oBACH,MAAM;gBACR;oBACE,MAAM;YACV,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC1D,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,EAAE,EAAE;YACR,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YACzD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAsC;IAEtC,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAG,IAAI,CAAC,WAAmD,IAAI;YACvE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAA0B,EAC1B,QAAiB;IAEjB,IAAI,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/B,IACE,MAAM,KAAK,QAAQ;QACnB,MAAM,KAAK,YAAY;QACvB,MAAM,KAAK,YAAY;QACvB,MAAM,KAAK,8BAA8B,EACzC,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,KAA4B;IAG/D,YACmB,MAA4B,EAC5B,MAAc,EAC/B,MAAM,GAAmC,EAAE;QAE3C,KAAK,EAAE,CAAC;sBAJS,MAAM;sBACN,MAAM;QAIvB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,YAAY,CAAC,WAAkC;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAC5E,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CACX,QAAmB,EACnB,OAAO,GAAkB,EAAE;QAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QACpC,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,UAAU,GAAsB;YACpC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS;gBACvC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS;gBACrC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;SAC5C,CAAC;QAEF,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAC5D,IAAI,IAAsC,CAAC;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAA8B,CAAC;QACnC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEjE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACxD,IAAI,CAAC,KAAK,CAAC,IAAI;oBAAE,SAAS;gBAC1B,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChC,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;oBAC7C,IAAI,GAAG,SAAS,CAAC;gBACnB,CAAC;gBACD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBAClB,MAAM;oBACJ,IAAI,EAAE,6BAA6B;oBACnC,KAAK,EACH,KAAK,CAAC,IAAI,KAAK,MAAM;wBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;wBACzC,CAAC,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;iBAC1D,CAAC;gBACF,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;oBAC7C,IAAI,GAAG,SAAS,CAAC;gBACnB,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;oBACJ,IAAI,EAAE,6BAA6B;oBACnC,KAAK,EAAE;wBACL,IAAI,EAAE,cAAc;wBACpB,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;wBACzB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,UAAU,EAAE,EAAE;qBACvD;iBACF,CAAC;gBACF,MAAM;oBACJ,IAAI,EAAE,6BAA6B;oBACnC,KAAK,EAAE;wBACL,IAAI,EAAE,mBAAmB;wBACzB,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI;qBACxC;iBACF,CAAC;gBACF,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,QAAQ,GAAG,IAAI,CAAC;gBAChB,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;gBAChC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;gBAClC,SAAS;YACX,CAAC;YACD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,CAAC;QACD,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,IAAI,IAAI;YAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;QACvD,MAAM;YACJ,IAAI,EAAE,uBAAuB;YAC7B,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC;SAChD,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM;gBACJ,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE;oBACL,WAAW;oBACX,YAAY;oBACZ,WAAW,EAAE,WAAW,GAAG,YAAY;iBACxC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,CAAC,YAAY,CACzB,QAAuB,EACvB,UAA6B,EAC7B,KAAqC,EACrC,MAAoB;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,aAAa,CAAC,0BAA0B,CAChE,KAAK,CAAC,KAAK,EACX,QAAQ,EACR,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAC9C,IAAI,CAAC,MAAM,EACX,KAAK,CAAC,QAAQ,EACd,MAAM,CACP,EAAE,CAAC;YACF,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACxD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjD,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC;oBAC1C,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC;iBAChD,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IACrE,KAAK,CAAC,CAAC,YAAY,CACzB,QAAuB,EACvB,UAA6B,EAC7B,KAAqC,EACrC,KAAmB;QAEnB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK;YAClB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QACtB,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,OAA0B,CAAC;QAC/B,IAAI,IAA8B,CAAC;QACnC,IAAI,UAA8B,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,EAAE,EAAE,CAAC;YACT,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;YAC5B,OAAO,KAAP,OAAO,GAAK,KAAK,EAAC;YAClB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAoB,EAAE,EAAE;YACpC,IAAI,OAAO,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,IACE,KAAK,CAAC,MAAM,IAAI,mBAAmB;gBACnC,aAAa,GAAG,KAAK,GAAG,kBAAkB,EAC1C,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,2DAA2D,CAC5D,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,CAAC;gBACZ,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,aAAa,IAAI,KAAK,CAAC;YACvB,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,EAAE,CACjB,IAAI,CACF,MAAM,CAAC,MAAM,YAAY,KAAK;YAC5B,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CACjC,CAAC;QACJ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,EAAE,CAAC;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,MAAM,QAAQ,GAAG,aAAa;aAC3B,0BAA0B,CACzB;YACE,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ;YACR,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,EAAE,GAAG,UAAU,EAA6B;YACrD,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,EACD,KAAK,CAAC,EAAE;YACN,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;YACpC,IAAI,IAAI;gBAAE,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;gBACtD,MAAM,EAAE,GAAG,OAAO,CAAC,QACkC,CAAC;gBACtD,IAAI,CAAC;oBACH,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACR,EAAE,EACA,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE;4BAC1C,CAAC,CAAC,OAAO,CAAC,EAAE;4BACZ,CAAC,CAAC,QAAQ,UAAU,EAAE,EAAE;wBAC5B,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;wBACjD,SAAS,EACP,OAAO,EAAE,EAAE,SAAS,KAAK,QAAQ;4BAC/B,CAAC,CAAC,EAAE,CAAC,SAAS;4BACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,IAAI,EAAE,CAAC;qBAC1C;iBACF,CAAC,CAAC;YACL,CAAC;YACD,IACE,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ;gBAC3C,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EACpC,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,KAAK,CAAC,iBAAiB;oBACpC,YAAY,EAAE,KAAK,CAAC,UAAU;iBAC/B,CAAC,CAAC;YACL,CAAC;YACD,IAAI,KAAK,CAAC,WAAW;gBAAE,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC;QACxD,CAAC,EACD,IAAI,EACJ,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAChD,MAAM,EACN,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CACxB;aACA,KAAK,CAAC,KAAK,CAAC,EAAE,CACb,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAChE;aACA,OAAO,CAAC,GAAG,EAAE;YACZ,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QACL,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAI,OAAO;oBAAE,MAAM,OAAO,CAAC;gBAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5B,IAAI,KAAK,EAAE,CAAC;oBACV,aAAa,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC1D,MAAM,KAAK,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;wBAChC,IAAI,GAAG,OAAO,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,OAAO;gBAAE,MAAM,OAAO,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjB,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export declare function getStrandsEngine(): Promise<import('./engine.js').StrandsEngine>;
2
+ /** Cancel live turns during shutdown. A never-loaded engine has none. */
3
+ export declare function stopStrandsEngine(): Promise<void>;
4
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/strands/runtime.ts"],"names":[],"mappings":"AAyBA,wBAAgB,gBAAgB,IAAI,OAAO,CACzC,OAAO,aAAa,EAAE,aAAa,CACpC,CAGA;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIvD"}
@@ -14,17 +14,21 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- /** Engine selection stored alongside the model in existing Work records. */
18
- export const WORK_DSH_MODEL_PREFIX = 'dsh:';
19
- /** Whether Work should use its isolated DSH driver for this model selection. */
20
- export function isWorkDshModel(model) {
21
- return model.trim().startsWith(WORK_DSH_MODEL_PREFIX);
17
+ /**
18
+ * Entry points the rest of the server uses for the Strands engine. Keeping
19
+ * them here, behind dynamic imports, means the SDK loads only when a turn
20
+ * actually needs it.
21
+ */
22
+ let loaded;
23
+ export function getStrandsEngine() {
24
+ loaded ?? (loaded = import('./engine.js'));
25
+ return loaded.then(module => module.strandsEngine);
22
26
  }
23
- /** Recover the provider's exact model id without changing provider identity. */
24
- export function workProviderModel(model) {
25
- const selected = model.trim();
26
- return isWorkDshModel(selected)
27
- ? selected.slice(WORK_DSH_MODEL_PREFIX.length).trim()
28
- : selected;
27
+ /** Cancel live turns during shutdown. A never-loaded engine has none. */
28
+ export async function stopStrandsEngine() {
29
+ if (!loaded)
30
+ return;
31
+ const engine = await loaded.then(module => module.strandsEngine);
32
+ await engine.stop();
29
33
  }
30
- //# sourceMappingURL=work-model.js.map
34
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/strands/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;GAIG;AAEH,IAAI,MAAyD,CAAC;AAE9D,MAAM,UAAU,gBAAgB;IAG9B,MAAM,KAAN,MAAM,GAAK,MAAM,CAAC,aAAa,CAAC,EAAC;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrD,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Sandbox, type ExecuteOptions } from '@strands-agents/sdk/sandbox';
2
+ import type { ExecutionResult, FileInfo, StreamChunk } from '@strands-agents/sdk/sandbox';
3
+ /** The path the agent sees as its workspace root. */
4
+ export declare const STRANDS_WORKSPACE_ROOT = "/workspace";
5
+ /** Largest file an agent may read or write in one call. */
6
+ export declare const STRANDS_MAX_FILE_BYTES: number;
7
+ export declare class StrandsSandboxError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare class WorkspaceSandbox extends Sandbox {
11
+ private readonly root;
12
+ private realRoot;
13
+ constructor(root: string);
14
+ /** Resolve a virtual path to a host path inside the workspace. */
15
+ resolve(virtualPath: string): Promise<string>;
16
+ private ensureRoot;
17
+ executeStreaming(_command: string, _options?: ExecuteOptions): AsyncIterable<StreamChunk | ExecutionResult>;
18
+ executeCodeStreaming(_code: string, _language: string, _options?: ExecuteOptions): AsyncIterable<StreamChunk | ExecutionResult>;
19
+ readFile(virtualPath: string): Promise<Uint8Array>;
20
+ writeFile(virtualPath: string, content: Uint8Array): Promise<void>;
21
+ removeFile(virtualPath: string): Promise<void>;
22
+ listFiles(virtualPath: string): Promise<FileInfo[]>;
23
+ }
24
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/strands/sandbox.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,WAAW,EACZ,MAAM,6BAA6B,CAAC;AAErC,qDAAqD;AACrD,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,QAAkB,CAAC;AAEtD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAUD,qBAAa,gBAAiB,SAAQ,OAAO;IAG/B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAqB;IAErC,YAA6B,IAAI,EAAE,MAAM,EAExC;IAED,kEAAkE;IAC5D,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwClD;YAEa,UAAU;IAQjB,gBAAgB,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,cAAc,GACxB,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC,CAI9C;IAGM,oBAAoB,CACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,cAAc,GACxB,aAAa,CAAC,WAAW,GAAG,eAAe,CAAC,CAI9C;IAEK,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAUvD;IAEK,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnD;IAEK,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAkBxD;CACF"}
@@ -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