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.
- package/README.md +29 -65
- package/backend/dist/db.js +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +13 -36
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/main.js +0 -12
- package/backend/dist/main.js.map +1 -1
- package/backend/dist/middleware/cors.d.ts.map +1 -1
- package/backend/dist/middleware/cors.js +5 -0
- package/backend/dist/middleware/cors.js.map +1 -1
- package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresExtensionRepositories.js +2 -4
- package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
- package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
- package/backend/dist/persistence/postgresMigrationRegistry.js +2 -0
- package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
- package/backend/dist/persistence/postgresWorkRunThinkMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresWorkRunThinkMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresWorkRunThinkMigration.js +39 -0
- package/backend/dist/persistence/postgresWorkRunThinkMigration.js.map +1 -0
- package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteExtensionRepositories.js +2 -4
- package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.js +20 -0
- package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.js +1 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -1
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +3 -2
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.js.map +1 -1
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts.map +1 -1
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js +3 -3
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -1
- package/backend/dist/platform/workPersistence/types.d.ts +5 -0
- package/backend/dist/platform/workPersistence/types.d.ts.map +1 -1
- package/backend/dist/platform/workPersistence/types.js.map +1 -1
- package/backend/dist/routes/agentCli.d.ts.map +1 -1
- package/backend/dist/routes/agentCli.js +8 -3
- package/backend/dist/routes/agentCli.js.map +1 -1
- package/backend/dist/routes/{cordis.d.ts → strands.d.ts} +1 -1
- package/backend/dist/routes/strands.d.ts.map +1 -0
- package/backend/dist/routes/strands.js +300 -0
- package/backend/dist/routes/strands.js.map +1 -0
- package/backend/dist/routes/work.d.ts.map +1 -1
- package/backend/dist/routes/work.js +26 -23
- package/backend/dist/routes/work.js.map +1 -1
- package/backend/dist/services/agentAccessService.d.ts +0 -5
- package/backend/dist/services/agentAccessService.d.ts.map +1 -1
- package/backend/dist/services/agentAccessService.js +7 -35
- package/backend/dist/services/agentAccessService.js.map +1 -1
- package/backend/dist/services/agentCliService.d.ts +16 -23
- package/backend/dist/services/agentCliService.d.ts.map +1 -1
- package/backend/dist/services/agentCliService.js +85 -112
- package/backend/dist/services/agentCliService.js.map +1 -1
- package/backend/dist/services/authService.d.ts +3 -3
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +3 -4
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/authorizationService.d.ts +1 -1
- package/backend/dist/services/authorizationService.d.ts.map +1 -1
- package/backend/dist/services/authorizationService.js +17 -8
- package/backend/dist/services/authorizationService.js.map +1 -1
- package/backend/dist/services/followUpService.d.ts +4 -1
- package/backend/dist/services/followUpService.d.ts.map +1 -1
- package/backend/dist/services/followUpService.js +23 -2
- package/backend/dist/services/followUpService.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +10 -6
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/pluginUsageService.d.ts +0 -34
- package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
- package/backend/dist/services/pluginUsageService.js +0 -62
- package/backend/dist/services/pluginUsageService.js.map +1 -1
- package/backend/dist/services/strandsAccessService.d.ts +26 -0
- package/backend/dist/services/strandsAccessService.d.ts.map +1 -0
- package/backend/dist/services/strandsAccessService.js +95 -0
- package/backend/dist/services/strandsAccessService.js.map +1 -0
- package/backend/dist/services/thinkingSummaryService.d.ts +2 -3
- package/backend/dist/services/thinkingSummaryService.d.ts.map +1 -1
- package/backend/dist/services/thinkingSummaryService.js +13 -27
- package/backend/dist/services/thinkingSummaryService.js.map +1 -1
- package/backend/dist/services/titleGenerationService.d.ts +7 -18
- package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
- package/backend/dist/services/titleGenerationService.js +15 -36
- package/backend/dist/services/titleGenerationService.js.map +1 -1
- package/backend/dist/services/workAgentService.d.ts +1 -1
- package/backend/dist/services/workAgentService.d.ts.map +1 -1
- package/backend/dist/services/workAgentService.js +17 -60
- package/backend/dist/services/workAgentService.js.map +1 -1
- package/backend/dist/services/workModelProviderService.d.ts +1 -4
- package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
- package/backend/dist/services/workModelProviderService.js +60 -50
- package/backend/dist/services/workModelProviderService.js.map +1 -1
- package/backend/dist/services/workTaskService.d.ts +3 -2
- package/backend/dist/services/workTaskService.d.ts.map +1 -1
- package/backend/dist/services/workTaskService.js +11 -7
- package/backend/dist/services/workTaskService.js.map +1 -1
- package/backend/dist/strands/catalog.d.ts +57 -0
- package/backend/dist/strands/catalog.d.ts.map +1 -0
- package/backend/dist/strands/catalog.js +241 -0
- package/backend/dist/strands/catalog.js.map +1 -0
- package/backend/dist/strands/engine.d.ts +131 -0
- package/backend/dist/strands/engine.d.ts.map +1 -0
- package/backend/dist/strands/engine.js +477 -0
- package/backend/dist/strands/engine.js.map +1 -0
- package/backend/dist/strands/harness.d.ts +14 -0
- package/backend/dist/strands/harness.d.ts.map +1 -0
- package/backend/dist/strands/harness.js +41 -0
- package/backend/dist/strands/harness.js.map +1 -0
- package/backend/dist/strands/model.d.ts +24 -0
- package/backend/dist/strands/model.d.ts.map +1 -0
- package/backend/dist/strands/model.js +381 -0
- package/backend/dist/strands/model.js.map +1 -0
- package/backend/dist/strands/runtime.d.ts +4 -0
- package/backend/dist/strands/runtime.d.ts.map +1 -0
- package/backend/dist/{cordis/work-model.js → strands/runtime.js} +16 -12
- package/backend/dist/strands/runtime.js.map +1 -0
- package/backend/dist/strands/sandbox.d.ts +24 -0
- package/backend/dist/strands/sandbox.d.ts.map +1 -0
- package/backend/dist/strands/sandbox.js +156 -0
- package/backend/dist/strands/sandbox.js.map +1 -0
- package/backend/dist/strands/work-driver.d.ts +11 -0
- package/backend/dist/strands/work-driver.d.ts.map +1 -0
- package/backend/dist/strands/work-driver.js +443 -0
- package/backend/dist/strands/work-driver.js.map +1 -0
- package/backend/dist/strands/work-model.d.ts +7 -0
- package/backend/dist/strands/work-model.d.ts.map +1 -0
- package/backend/dist/strands/work-model.js +42 -0
- package/backend/dist/strands/work-model.js.map +1 -0
- package/backend/dist/types/work.d.ts +7 -11
- package/backend/dist/types/work.d.ts.map +1 -1
- package/backend/dist/types/work.js.map +1 -1
- package/backend/dist/utils/bedrockMantle.d.ts +46 -0
- package/backend/dist/utils/bedrockMantle.d.ts.map +1 -0
- package/backend/dist/utils/bedrockMantle.js +206 -0
- package/backend/dist/utils/bedrockMantle.js.map +1 -0
- package/backend/dist/utils/corsOriginPolicy.d.ts +10 -0
- package/backend/dist/utils/corsOriginPolicy.d.ts.map +1 -0
- package/backend/dist/utils/corsOriginPolicy.js +70 -0
- package/backend/dist/utils/corsOriginPolicy.js.map +1 -0
- package/backend/dist/utils/pluginChatAdapter.d.ts +36 -0
- package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
- package/backend/dist/utils/pluginChatAdapter.js +122 -47
- package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.js +3 -2
- package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
- package/backend/dist/utils/pluginValidation.d.ts +1 -1
- package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
- package/backend/dist/utils/pluginValidation.js +11 -0
- package/backend/dist/utils/pluginValidation.js.map +1 -1
- package/backend/package.json +6 -36
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/artifact-runtime/babel.js +170 -170
- package/frontend/dist/artifact-runtime/framer-motion.js +3 -3
- package/frontend/dist/artifact-runtime/lucide-react.js +1 -1
- package/frontend/dist/artifact-runtime/mathjs.js +1 -1
- package/frontend/dist/artifact-runtime/mermaid.js +1 -1
- package/frontend/dist/artifact-runtime/plotly.js +1 -1
- package/frontend/dist/artifact-runtime/react.js +3 -3
- package/frontend/dist/assets/index-D99DS5c6.js +57 -0
- package/frontend/dist/assets/index-Dz1JufgZ.css +1 -0
- package/frontend/dist/assets/{markdown-math-D1Bj3pDB.css → markdown-math-DzFXvcrH.css} +1 -1
- package/frontend/dist/index.html +34 -34
- package/frontend/dist/js/{ArtifactContainer-D4v4l15L.js → ArtifactContainer-Cn7X9HGm.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-B2uaVpsi.js → ArtifactDemoPage-Ddpy2O_v.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-DlWJHI-r.js → ArtifactSandboxFrame-CdsAqv8H.js} +1 -1
- package/frontend/dist/js/{ArtifactSlideOutPanel-laZ98QKB.js → ArtifactSlideOutPanel-cVd9X80o.js} +1 -1
- package/frontend/dist/js/AutomationModal-B4UaWjkk.js +1 -0
- package/frontend/dist/js/AutomationsPage-huCrvLUp.js +1 -0
- package/frontend/dist/js/{AvatarUpload-KaBaTKoG.js → AvatarUpload-CG-w6Mpt.js} +1 -1
- package/frontend/dist/js/{Button-CGMYia4g.js → Button-j68Q8KVh.js} +1 -1
- package/frontend/dist/js/{CalendarPage-Dc7r-86c.js → CalendarPage-CZXT1w99.js} +1 -1
- package/frontend/dist/js/ChannelsPage-DbtdHnSL.js +1 -0
- package/frontend/dist/js/ChatPage-BZE65kiq.js +14 -0
- package/frontend/dist/js/ConnectModels-DD4bLgdq.js +1 -0
- package/frontend/dist/js/{EvaluationsPage-BB7sPhIR.js → EvaluationsPage-Dq53LaXd.js} +2 -2
- package/frontend/dist/js/{FirstTimeSetup-elqSi9JH.js → FirstTimeSetup-BoJIfuQT.js} +1 -1
- package/frontend/dist/js/GalleryPage-DKwqeB2A.js +1 -0
- package/frontend/dist/js/HomePage-C8bCJfls.js +1 -0
- package/frontend/dist/js/LanguageSwitcher-B_YyU5JG.js +1 -0
- package/frontend/dist/js/{Logo-HZvdAk2c.js → Logo-DnfVtjgj.js} +1 -1
- package/frontend/dist/js/{LogoMark-GJnfMXsk.js → LogoMark-BzObGdA9.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-Bk6OQzJI.js → ModelManagerModals-BzjZ-QwL.js} +1 -1
- package/frontend/dist/js/NotesPage-CnaAp_w_.js +3 -0
- package/frontend/dist/js/{OptimizedSyntaxHighlighter-CzzV6ONG.js → OptimizedSyntaxHighlighter-B0g8cxZQ.js} +1 -1
- package/frontend/dist/js/OptimizedSyntaxHighlighter-B_BbHeO1.js +1 -0
- package/frontend/dist/js/{PasswordStrengthMeter-DasfJa4P.js → PasswordStrengthMeter-DI4RDv67.js} +1 -1
- package/frontend/dist/js/{PersonasPage-CIJINcQK.js → PersonasPage-CH3GUKph.js} +2 -2
- package/frontend/dist/js/PluginUsagePage-d54K2gAj.js +1 -0
- package/frontend/dist/js/{RichMessageContent-DxCHlUlY.js → RichMessageContent-BfYbVBFz.js} +2 -2
- package/frontend/dist/js/RichMessageContent-CDxxs3Tt.js +1 -0
- package/frontend/dist/js/SettingsModal-BvtJcvow.js +19 -0
- package/frontend/dist/js/{SettingsToggle-oxvw7ulA.js → SettingsToggle-DrJ0Bapi.js} +1 -1
- package/frontend/dist/js/{ShareDialog-Bhpt_Y1N.js → ShareDialog-DaSxkTKS.js} +1 -1
- package/frontend/dist/js/StrandsPage-BQwz0mWq.js +1 -0
- package/frontend/dist/js/{SystemPage-BfhVXqar.js → SystemPage-BqNZoFxR.js} +1 -1
- package/frontend/dist/js/{TurnstileWidget-CVepEMEQ.js → TurnstileWidget-tI50c7Kc.js} +1 -1
- package/frontend/dist/js/{UserManagementPage-2yHv89ZA.js → UserManagementPage-UvPjA9RP.js} +1 -1
- package/frontend/dist/js/UserManagementPanel-C3T1ReJJ.js +1 -0
- package/frontend/dist/js/{WhatsNewModal-Dl69bG2T.js → WhatsNewModal-CLcU2Ugk.js} +1 -1
- package/frontend/dist/js/WorkPage-BpjGn--1.js +8 -0
- package/frontend/dist/js/api-BrHW-VGd.js +14 -0
- package/frontend/dist/js/api-K_hhqPdx.js +1 -0
- package/frontend/dist/js/{appNavigation-R8iKverf.js → appNavigation-B6xYIgLi.js} +1 -1
- package/frontend/dist/js/appStore-DkRdQQeY.js +2 -0
- package/frontend/dist/js/appVersion-BVtSqLVj.js +1 -0
- package/frontend/dist/js/ar-XTZGEtBr.js +2 -0
- package/frontend/dist/js/authStore-DBS6Kbvh.js +1 -0
- package/frontend/dist/js/{authStore-D8fc-Hl0.js → authStore-DjAsRpNL.js} +3 -3
- package/frontend/dist/js/bn-JiK7ZWmy.js +2 -0
- package/frontend/dist/js/chatStore-DpVxt9VX.js +3 -0
- package/frontend/dist/js/{client-BeJbHHWx.js → client-DppLngAs.js} +2 -2
- package/frontend/dist/js/{config-D6Kcp5n3.js → config-4_s8hdqO.js} +1 -1
- package/frontend/dist/js/cs-D8ju18CO.js +2 -0
- package/frontend/dist/js/da-BJWcAoUc.js +2 -0
- package/frontend/dist/js/de-CLJLmy69.js +2 -0
- package/frontend/dist/js/es-BvqHEL-3.js +2 -0
- package/frontend/dist/js/{evaluationsApi-2YwZBPk5.js → evaluationsApi-DyuW7IJ_.js} +1 -1
- package/frontend/dist/js/fr-B8ZoZomI.js +2 -0
- package/frontend/dist/js/hi-AzJLALo-.js +2 -0
- package/frontend/dist/js/id-DZYGQhvC.js +2 -0
- package/frontend/dist/js/is-Da_kvtzW.js +2 -0
- package/frontend/dist/js/it-B90zSlqn.js +2 -0
- package/frontend/dist/js/ja-DU_K1GOr.js +2 -0
- package/frontend/dist/js/ko-DicfoO-e.js +2 -0
- package/frontend/dist/js/{markdown-CZ1tYEW8.js → markdown-DU84620G.js} +1 -1
- package/frontend/dist/js/{markdown-core-KjS96SYW.js → markdown-core-Cyql92Hg.js} +1 -1
- package/frontend/dist/js/{markdown-html-DQEwrWcf.js → markdown-html-CUc2fCgY.js} +1 -1
- package/frontend/dist/js/{markdown-math-CKi32S5d.js → markdown-math-DxPfMKvO.js} +1 -1
- package/frontend/dist/js/{markdownHtml-lrXhxBhK.js → markdownHtml-KhS0cFNH.js} +1 -1
- package/frontend/dist/js/markdownMath-CsfRQAcz.js +1 -0
- package/frontend/dist/js/{messageCodeStyles-D4haBw80.js → messageCodeStyles-CuQPkfEK.js} +1 -1
- package/frontend/dist/js/ms-CfH7wjUY.js +2 -0
- package/frontend/dist/js/nl-ELlOz-B3.js +2 -0
- package/frontend/dist/js/pl-33dayyUk.js +2 -0
- package/frontend/dist/js/pt-aIXSQPCT.js +2 -0
- package/frontend/dist/js/react-vendor-CR5VJ85Q.js +9 -0
- package/frontend/dist/js/{router-vendor-HZm4FR0A.js → router-vendor-DqMnEJWK.js} +1 -1
- package/frontend/dist/js/ru-BSvGtBtW.js +2 -0
- package/frontend/dist/js/{standalone-DbyFjvTU.js → standalone-D_lg5NC9.js} +1 -1
- package/frontend/dist/js/strandsApi-BFbeEpAY.js +2 -0
- package/frontend/dist/js/sv-B7KOz81W.js +2 -0
- package/frontend/dist/js/{syntax-highlight-DNc3FFCa.js → syntax-highlight-D7dQ5s5-.js} +1 -1
- package/frontend/dist/js/{teamEventStream-omPy51va.js → teamEventStream-DsAS6P4m.js} +1 -1
- package/frontend/dist/js/th-DgpjGxvA.js +2 -0
- package/frontend/dist/js/tr-BQTbl2h-.js +2 -0
- package/frontend/dist/js/{ui-D5-4niRk.js → ui-Aq8MP7Ph.js} +2 -2
- package/frontend/dist/js/ui-vendor-DVTj_sKN.js +1 -0
- package/frontend/dist/js/uk-JLymloot.js +2 -0
- package/frontend/dist/js/{useChat-DnGClJeX.js → useChat-D3ZAGz70.js} +4 -4
- package/frontend/dist/js/useDialogFocus-zSGHkpE4.js +1 -0
- package/frontend/dist/js/useDictation-B6l8QzeM.js +1 -0
- package/frontend/dist/js/{useQuery-hWmQjdLu.js → useQuery-BTKpXudI.js} +1 -1
- package/frontend/dist/js/{useTranslation-B9kflK9S.js → useTranslation-Boi0fB1B.js} +1 -1
- package/frontend/dist/js/utils-B-Bhh1pF.js +1 -0
- package/frontend/dist/js/utils-vendor-DPJG-EG_.js +1 -0
- package/frontend/dist/js/vi-BXdLOJ8q.js +2 -0
- package/frontend/dist/js/{work-DmJpVPPO.js → work-CdbmBok5.js} +1 -1
- package/frontend/dist/js/workApi-D1xtiG3Q.js +1 -0
- package/frontend/dist/js/{workApi-C5InfT8x.js → workApi-UPxumrEF.js} +1 -1
- package/frontend/dist/js/workModels-BM2Zyiba.js +1 -0
- package/frontend/dist/js/zh-gdUf9sXa.js +2 -0
- package/package.json +11 -40
- package/plugins/anthropic.json +3 -1
- package/plugins/bedrock.json +86 -0
- package/plugins/openrouter.json +2 -0
- package/backend/dist/cordis/contracts.d.ts +0 -270
- package/backend/dist/cordis/contracts.d.ts.map +0 -1
- package/backend/dist/cordis/contracts.js +0 -32
- package/backend/dist/cordis/contracts.js.map +0 -1
- package/backend/dist/cordis/dsh/chat-model.d.ts +0 -16
- package/backend/dist/cordis/dsh/chat-model.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/chat-model.js +0 -104
- package/backend/dist/cordis/dsh/chat-model.js.map +0 -1
- package/backend/dist/cordis/dsh/engine-plugin.d.ts +0 -186
- package/backend/dist/cordis/dsh/engine-plugin.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/engine-plugin.js +0 -1116
- package/backend/dist/cordis/dsh/engine-plugin.js.map +0 -1
- package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts +0 -175
- package/backend/dist/cordis/dsh/librewebui-llm-adapter.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/librewebui-llm-adapter.js +0 -480
- package/backend/dist/cordis/dsh/librewebui-llm-adapter.js.map +0 -1
- package/backend/dist/cordis/dsh/model-identity.d.ts +0 -12
- package/backend/dist/cordis/dsh/model-identity.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/model-identity.js +0 -87
- package/backend/dist/cordis/dsh/model-identity.js.map +0 -1
- package/backend/dist/cordis/dsh/native-provider-client.d.ts +0 -44
- package/backend/dist/cordis/dsh/native-provider-client.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/native-provider-client.js +0 -524
- package/backend/dist/cordis/dsh/native-provider-client.js.map +0 -1
- package/backend/dist/cordis/dsh/native-provider-plugin.d.ts +0 -11
- package/backend/dist/cordis/dsh/native-provider-plugin.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/native-provider-plugin.js +0 -416
- package/backend/dist/cordis/dsh/native-provider-plugin.js.map +0 -1
- package/backend/dist/cordis/dsh/native-provider-protocol.d.ts +0 -37
- package/backend/dist/cordis/dsh/native-provider-protocol.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/native-provider-protocol.js +0 -325
- package/backend/dist/cordis/dsh/native-provider-protocol.js.map +0 -1
- package/backend/dist/cordis/dsh/provider-handler.d.ts +0 -36
- package/backend/dist/cordis/dsh/provider-handler.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/provider-handler.js +0 -582
- package/backend/dist/cordis/dsh/provider-handler.js.map +0 -1
- package/backend/dist/cordis/dsh/session-files.d.ts +0 -9
- package/backend/dist/cordis/dsh/session-files.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/session-files.js +0 -60
- package/backend/dist/cordis/dsh/session-files.js.map +0 -1
- package/backend/dist/cordis/dsh/session-settings.d.ts +0 -15
- package/backend/dist/cordis/dsh/session-settings.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/session-settings.js +0 -51
- package/backend/dist/cordis/dsh/session-settings.js.map +0 -1
- package/backend/dist/cordis/dsh/work-driver.d.ts +0 -12
- package/backend/dist/cordis/dsh/work-driver.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/work-driver.js +0 -402
- package/backend/dist/cordis/dsh/work-driver.js.map +0 -1
- package/backend/dist/cordis/dsh/workspace-policy.d.ts +0 -10
- package/backend/dist/cordis/dsh/workspace-policy.d.ts.map +0 -1
- package/backend/dist/cordis/dsh/workspace-policy.js +0 -44
- package/backend/dist/cordis/dsh/workspace-policy.js.map +0 -1
- package/backend/dist/cordis/host/composition.d.ts +0 -73
- package/backend/dist/cordis/host/composition.d.ts.map +0 -1
- package/backend/dist/cordis/host/composition.js +0 -205
- package/backend/dist/cordis/host/composition.js.map +0 -1
- package/backend/dist/cordis/host/config.d.ts +0 -159
- package/backend/dist/cordis/host/config.d.ts.map +0 -1
- package/backend/dist/cordis/host/config.js +0 -184
- package/backend/dist/cordis/host/config.js.map +0 -1
- package/backend/dist/cordis/host/host.d.ts +0 -74
- package/backend/dist/cordis/host/host.d.ts.map +0 -1
- package/backend/dist/cordis/host/host.js +0 -420
- package/backend/dist/cordis/host/host.js.map +0 -1
- package/backend/dist/cordis/host/loader-entry.d.ts +0 -41
- package/backend/dist/cordis/host/loader-entry.d.ts.map +0 -1
- package/backend/dist/cordis/host/loader-entry.js +0 -52
- package/backend/dist/cordis/host/loader-entry.js.map +0 -1
- package/backend/dist/cordis/host/model.d.ts +0 -45
- package/backend/dist/cordis/host/model.d.ts.map +0 -1
- package/backend/dist/cordis/host/model.js +0 -54
- package/backend/dist/cordis/host/model.js.map +0 -1
- package/backend/dist/cordis/host/privacy.d.ts +0 -8
- package/backend/dist/cordis/host/privacy.d.ts.map +0 -1
- package/backend/dist/cordis/host/privacy.js +0 -73
- package/backend/dist/cordis/host/privacy.js.map +0 -1
- package/backend/dist/cordis/index.d.ts +0 -14
- package/backend/dist/cordis/index.d.ts.map +0 -1
- package/backend/dist/cordis/index.js +0 -30
- package/backend/dist/cordis/index.js.map +0 -1
- package/backend/dist/cordis/runtime.d.ts +0 -97
- package/backend/dist/cordis/runtime.d.ts.map +0 -1
- package/backend/dist/cordis/runtime.js +0 -231
- package/backend/dist/cordis/runtime.js.map +0 -1
- package/backend/dist/cordis/work-model.d.ts +0 -7
- package/backend/dist/cordis/work-model.d.ts.map +0 -1
- package/backend/dist/cordis/work-model.js.map +0 -1
- package/backend/dist/routes/cordis.d.ts.map +0 -1
- package/backend/dist/routes/cordis.js +0 -440
- package/backend/dist/routes/cordis.js.map +0 -1
- package/backend/dist/routes/libreClaw.d.ts +0 -3
- package/backend/dist/routes/libreClaw.d.ts.map +0 -1
- package/backend/dist/routes/libreClaw.js +0 -200
- package/backend/dist/routes/libreClaw.js.map +0 -1
- package/backend/dist/services/cordisAccessService.d.ts +0 -56
- package/backend/dist/services/cordisAccessService.d.ts.map +0 -1
- package/backend/dist/services/cordisAccessService.js +0 -98
- package/backend/dist/services/cordisAccessService.js.map +0 -1
- package/backend/dist/services/libreClawService.d.ts +0 -105
- package/backend/dist/services/libreClawService.d.ts.map +0 -1
- package/backend/dist/services/libreClawService.js +0 -169
- package/backend/dist/services/libreClawService.js.map +0 -1
- package/frontend/dist/assets/index-C8_AByBq.css +0 -1
- package/frontend/dist/assets/index-DWLnkKwj.js +0 -16
- package/frontend/dist/js/AutomationModal-CjjiEZFA.js +0 -1
- package/frontend/dist/js/AutomationsPage-jnWmD58y.js +0 -1
- package/frontend/dist/js/ChannelsPage-DHPabX1e.js +0 -1
- package/frontend/dist/js/ChatPage-ZvGp-iqV.js +0 -14
- package/frontend/dist/js/ConnectModels-aUTD6s9B.js +0 -1
- package/frontend/dist/js/CordisPage-DZKcpPVj.js +0 -1
- package/frontend/dist/js/GalleryPage-CrlNRnkn.js +0 -1
- package/frontend/dist/js/HomePage-lR9h7_a1.js +0 -1
- package/frontend/dist/js/LanguageSwitcher-CWkbzpxT.js +0 -1
- package/frontend/dist/js/LibreClawPage-P19FnNlu.js +0 -1
- package/frontend/dist/js/NotesPage-DopG0M4B.js +0 -3
- package/frontend/dist/js/OptimizedSyntaxHighlighter-ajqwyBQm.js +0 -1
- package/frontend/dist/js/PluginUsagePage-Cj0mUxD8.js +0 -1
- package/frontend/dist/js/RichMessageContent-BZndQSJU.js +0 -1
- package/frontend/dist/js/SettingsModal-wAuFQOE4.js +0 -19
- package/frontend/dist/js/UserManagementPanel-BU95ZPOv.js +0 -1
- package/frontend/dist/js/WorkPage-CSderbeT.js +0 -8
- package/frontend/dist/js/api-CU-JXx2u.js +0 -1
- package/frontend/dist/js/api-DPXCtanG.js +0 -14
- package/frontend/dist/js/appStore-BD70bvas.js +0 -2
- package/frontend/dist/js/appVersion-C7sxqgMd.js +0 -1
- package/frontend/dist/js/ar-Cq-DrSYL.js +0 -2
- package/frontend/dist/js/authStore-FNKLFUQp.js +0 -1
- package/frontend/dist/js/bn-BqxLh-KL.js +0 -2
- package/frontend/dist/js/chatStore-CK5ojwft.js +0 -3
- package/frontend/dist/js/cordisApi-BS8QMSV4.js +0 -2
- package/frontend/dist/js/cs-D2DDNZf-.js +0 -2
- package/frontend/dist/js/da-BciY-TSG.js +0 -2
- package/frontend/dist/js/de-DjU_eXQ-.js +0 -2
- package/frontend/dist/js/es-ChIEs80I.js +0 -2
- package/frontend/dist/js/fr-Bi8BGRW4.js +0 -2
- package/frontend/dist/js/hi-BMsCnWg7.js +0 -2
- package/frontend/dist/js/i18next-DOICz7ZY.js +0 -1
- package/frontend/dist/js/id-CpcN1vhk.js +0 -2
- package/frontend/dist/js/is-DkUy2cmP.js +0 -2
- package/frontend/dist/js/it-BglK9DRZ.js +0 -2
- package/frontend/dist/js/ja-IrprzwLJ.js +0 -2
- package/frontend/dist/js/ko--wwEsMPi.js +0 -2
- package/frontend/dist/js/markdownMath-B0BpyFBS.js +0 -1
- package/frontend/dist/js/ms-BWj59y7-.js +0 -2
- package/frontend/dist/js/nl-D-QndW_A.js +0 -2
- package/frontend/dist/js/pl-Dw7d7iDV.js +0 -2
- package/frontend/dist/js/pt-BI53uHJw.js +0 -2
- package/frontend/dist/js/react-vendor-wiHys0m2.js +0 -9
- package/frontend/dist/js/ru-JKyTgPg9.js +0 -2
- package/frontend/dist/js/sv-BIkBLPSQ.js +0 -2
- package/frontend/dist/js/th-CZ_LcCU0.js +0 -2
- package/frontend/dist/js/tr-B265byx1.js +0 -2
- package/frontend/dist/js/ui-vendor-BhHHyHk3.js +0 -1
- package/frontend/dist/js/uk-VTAlChwf.js +0 -2
- package/frontend/dist/js/useDialogFocus-BPTG_Zmy.js +0 -1
- package/frontend/dist/js/useDictation-D7zVBjDJ.js +0 -1
- package/frontend/dist/js/utils-p8Gt72YP.js +0 -1
- package/frontend/dist/js/utils-vendor-DISWt2y9.js +0 -1
- package/frontend/dist/js/vi-D8rXh-53.js +0 -2
- package/frontend/dist/js/workApi-FV75LKJn.js +0 -1
- package/frontend/dist/js/workModels-MzU2Ab7l.js +0 -1
- package/frontend/dist/js/zh-BEGd9iBD.js +0 -2
- 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"}
|