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
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Libre WebUI
|
|
3
|
-
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at:
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
/**
|
|
18
|
-
* HTTP surface for the embedded Cordis/DSH engine.
|
|
19
|
-
*
|
|
20
|
-
* Everything here consumes the `libreDshEngine` contract only; no handler knows
|
|
21
|
-
* that DSH exists. That is what allows the whole engine to be swapped or
|
|
22
|
-
* removed through the composition document without touching a route.
|
|
23
|
-
*
|
|
24
|
-
* Authentication is not optional: the engine can run tools with real
|
|
25
|
-
* filesystem access, so an unauthenticated endpoint would be a remote code
|
|
26
|
-
* execution surface. Every route requires an authenticated session.
|
|
27
|
-
*
|
|
28
|
-
* @module routes/cordis
|
|
29
|
-
*/
|
|
30
|
-
import express from 'express';
|
|
31
|
-
import { authenticate, requireAdmin } from '../middleware/auth.js';
|
|
32
|
-
import { cordisAccessState, getCordisEngine, isCordisBridgeEnabled, stopCordisHost, } from '../cordis/runtime.js';
|
|
33
|
-
import { setCordisEnabled } from '../services/cordisAccessService.js';
|
|
34
|
-
import { getCordisModelCatalog } from '../cordis/dsh/provider-handler.js';
|
|
35
|
-
const router = express.Router();
|
|
36
|
-
/** Status code and payload for a bridge that cannot serve a request. */
|
|
37
|
-
function unavailable(status, detail) {
|
|
38
|
-
if (status === 'disabled') {
|
|
39
|
-
return {
|
|
40
|
-
status: 503,
|
|
41
|
-
body: {
|
|
42
|
-
success: false,
|
|
43
|
-
error: 'The Cordis bridge is not enabled.',
|
|
44
|
-
code: 'CORDIS_DISABLED',
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
if (status === 'starting') {
|
|
49
|
-
return {
|
|
50
|
-
status: 503,
|
|
51
|
-
body: {
|
|
52
|
-
success: false,
|
|
53
|
-
error: 'The Cordis bridge is still starting.',
|
|
54
|
-
code: 'CORDIS_STARTING',
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
status: 503,
|
|
60
|
-
body: {
|
|
61
|
-
success: false,
|
|
62
|
-
error: detail ?? 'The Cordis bridge failed to start.',
|
|
63
|
-
code: 'CORDIS_UNAVAILABLE',
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
router.use((_req, res, next) => {
|
|
68
|
-
res.setHeader('Cache-Control', 'no-store');
|
|
69
|
-
next();
|
|
70
|
-
});
|
|
71
|
-
// Health is reachable without a session so an operator can tell "disabled"
|
|
72
|
-
// apart from a broken one before they have credentials to hand.
|
|
73
|
-
router.get('/health', async (_req, res) => {
|
|
74
|
-
if (!(await isCordisBridgeEnabled())) {
|
|
75
|
-
res.json({ success: true, enabled: false, ready: false });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const result = await getCordisEngine();
|
|
79
|
-
if (!result.ok) {
|
|
80
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
81
|
-
res.status(status).json({ enabled: true, ready: false, ...body });
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
res.json({
|
|
85
|
-
success: true,
|
|
86
|
-
enabled: true,
|
|
87
|
-
ready: true,
|
|
88
|
-
services: result.engine.status(),
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
/**
|
|
92
|
-
* Read the administrator opt-in.
|
|
93
|
-
*
|
|
94
|
-
* Administrator-only: the answer decides whether the engine's page exists for
|
|
95
|
-
* this deployment, and the setting is a deployment-wide switch rather than a
|
|
96
|
-
* per-user preference.
|
|
97
|
-
*/
|
|
98
|
-
router.get('/access', authenticate, requireAdmin, async (_req, res) => {
|
|
99
|
-
const access = await cordisAccessState();
|
|
100
|
-
res.json({ success: true, ...access });
|
|
101
|
-
});
|
|
102
|
-
/**
|
|
103
|
-
* Set the administrator opt-in.
|
|
104
|
-
*
|
|
105
|
-
* Enabling starts the engine on its next request; disabling stops it
|
|
106
|
-
* immediately so the decision takes effect without a restart. Disposal is what
|
|
107
|
-
* withdraws the engine's services and releases its listeners, so turning the
|
|
108
|
-
* feature off does not leave a running engine behind a hidden page.
|
|
109
|
-
*/
|
|
110
|
-
router.put('/access', authenticate, requireAdmin, async (req, res) => {
|
|
111
|
-
const { enabled } = req.body ?? {};
|
|
112
|
-
if (typeof enabled !== 'boolean') {
|
|
113
|
-
res
|
|
114
|
-
.status(400)
|
|
115
|
-
.json({ success: false, error: 'enabled must be a boolean.' });
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
const access = await cordisAccessState();
|
|
119
|
-
if (access.lockedByEnv) {
|
|
120
|
-
res.status(409).json({
|
|
121
|
-
success: false,
|
|
122
|
-
error: access.lockedBy === 'env'
|
|
123
|
-
? 'The Cordis engine is pinned by LIBRE_CORDIS_ENABLED; unset the environment variable to manage it here.'
|
|
124
|
-
: 'The Cordis engine is pinned by features.enabled in cordis.config.yml; remove that key to manage it here.',
|
|
125
|
-
});
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
await setCordisEnabled(enabled);
|
|
129
|
-
if (!enabled)
|
|
130
|
-
await stopCordisHost();
|
|
131
|
-
res.json({ success: true, enabled, lockedByEnv: false });
|
|
132
|
-
});
|
|
133
|
-
// The host engine is an administrator console with deployment-wide sessions.
|
|
134
|
-
// Navigation visibility is not an authorization boundary.
|
|
135
|
-
router.use(authenticate, requireAdmin);
|
|
136
|
-
/** Validate only choices advertised for the authenticated administrator. */
|
|
137
|
-
async function sessionSettings(body, userId) {
|
|
138
|
-
if (body === null || typeof body !== 'object' || Array.isArray(body)) {
|
|
139
|
-
throw new Error('Session settings must be an object.');
|
|
140
|
-
}
|
|
141
|
-
const input = body;
|
|
142
|
-
const settings = {};
|
|
143
|
-
if (input.model !== undefined) {
|
|
144
|
-
if (typeof input.model !== 'string' ||
|
|
145
|
-
!input.model.trim() ||
|
|
146
|
-
input.model.length > 2048) {
|
|
147
|
-
throw new Error('Choose an available engine model.');
|
|
148
|
-
}
|
|
149
|
-
const catalog = await getCordisModelCatalog(userId);
|
|
150
|
-
if (!catalog.models.some(model => model.id === input.model)) {
|
|
151
|
-
throw new Error('The selected engine model is not available to this account.');
|
|
152
|
-
}
|
|
153
|
-
settings.model = input.model;
|
|
154
|
-
}
|
|
155
|
-
if (input.permissionMode !== undefined) {
|
|
156
|
-
if (input.permissionMode !== 'read-only' &&
|
|
157
|
-
input.permissionMode !== 'workspace-write') {
|
|
158
|
-
throw new Error('Permission mode must be read-only or workspace-write.');
|
|
159
|
-
}
|
|
160
|
-
settings.permissionMode = input.permissionMode;
|
|
161
|
-
}
|
|
162
|
-
return settings;
|
|
163
|
-
}
|
|
164
|
-
router.get('/models', async (req, res) => {
|
|
165
|
-
if (!(await isCordisBridgeEnabled())) {
|
|
166
|
-
const response = unavailable('disabled');
|
|
167
|
-
res.status(response.status).json(response.body);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
const catalog = await getCordisModelCatalog(req.user.userId);
|
|
171
|
-
res.json({ success: true, ...catalog });
|
|
172
|
-
});
|
|
173
|
-
router.get('/sessions', async (_req, res) => {
|
|
174
|
-
const result = await getCordisEngine();
|
|
175
|
-
if (!result.ok) {
|
|
176
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
177
|
-
res.status(status).json(body);
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
res.json({ success: true, sessions: await result.engine.listSessions() });
|
|
181
|
-
});
|
|
182
|
-
router.post('/sessions', async (req, res) => {
|
|
183
|
-
const result = await getCordisEngine();
|
|
184
|
-
if (!result.ok) {
|
|
185
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
186
|
-
res.status(status).json(body);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const cwd = typeof req.body?.cwd === 'string' && req.body.cwd.trim() !== ''
|
|
190
|
-
? req.body.cwd
|
|
191
|
-
: undefined;
|
|
192
|
-
const title = typeof req.body?.title === 'string' && req.body.title.trim() !== ''
|
|
193
|
-
? req.body.title
|
|
194
|
-
: undefined;
|
|
195
|
-
try {
|
|
196
|
-
// The engine resolves an omitted cwd to its configured workspace, so the
|
|
197
|
-
// route never invents one.
|
|
198
|
-
const settings = await sessionSettings(req.body ?? {}, req.user.userId);
|
|
199
|
-
const session = await result.engine.createSession({
|
|
200
|
-
cwd: cwd ?? '',
|
|
201
|
-
...(title === undefined ? {} : { title }),
|
|
202
|
-
...settings,
|
|
203
|
-
userId: req.user.userId,
|
|
204
|
-
});
|
|
205
|
-
res.status(201).json({ success: true, session });
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
res.status(400).json({
|
|
209
|
-
success: false,
|
|
210
|
-
error: error instanceof Error ? error.message : String(error),
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
router.get('/sessions/:id', async (req, res) => {
|
|
215
|
-
const result = await getCordisEngine();
|
|
216
|
-
if (!result.ok) {
|
|
217
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
218
|
-
res.status(status).json(body);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
const session = await result.engine.getSession(req.params.id);
|
|
222
|
-
if (!session) {
|
|
223
|
-
res.status(404).json({ success: false, error: 'Session not found.' });
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
res.json({ success: true, session });
|
|
227
|
-
});
|
|
228
|
-
router.patch('/sessions/:id/settings', async (req, res) => {
|
|
229
|
-
const result = await getCordisEngine();
|
|
230
|
-
if (!result.ok) {
|
|
231
|
-
const response = unavailable(result.reason, result.detail);
|
|
232
|
-
res.status(response.status).json(response.body);
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
try {
|
|
236
|
-
const settings = await sessionSettings(req.body, req.user.userId);
|
|
237
|
-
if (Object.keys(settings).length === 0) {
|
|
238
|
-
res.status(400).json({
|
|
239
|
-
success: false,
|
|
240
|
-
error: 'Choose a model or permission mode to update.',
|
|
241
|
-
});
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
if (!(await result.engine.getSession(req.params.id))) {
|
|
245
|
-
res.status(404).json({ success: false, error: 'Session not found.' });
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
const session = await result.engine.updateSessionSettings(req.params.id, settings, { userId: req.user.userId });
|
|
249
|
-
res.json({ success: true, session });
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
const code = error?.code;
|
|
253
|
-
res.status(code === 'CORDIS_SESSION_BUSY' ? 409 : 400).json({
|
|
254
|
-
success: false,
|
|
255
|
-
error: error instanceof Error ? error.message : String(error),
|
|
256
|
-
...(typeof code === 'string' ? { code } : {}),
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
router.post('/sessions/:id/approvals/:approvalId', async (req, res) => {
|
|
261
|
-
const decision = req.body?.decision;
|
|
262
|
-
if (decision !== 'allowed-once' && decision !== 'rejected') {
|
|
263
|
-
res.status(400).json({
|
|
264
|
-
success: false,
|
|
265
|
-
error: 'Choose allow once or reject for this approval.',
|
|
266
|
-
});
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const result = await getCordisEngine();
|
|
270
|
-
if (!result.ok) {
|
|
271
|
-
const response = unavailable(result.reason, result.detail);
|
|
272
|
-
res.status(response.status).json(response.body);
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
const accepted = await result.engine.decideApproval(req.params.id, req.params.approvalId, decision);
|
|
276
|
-
if (!accepted) {
|
|
277
|
-
res.status(409).json({
|
|
278
|
-
success: false,
|
|
279
|
-
error: 'This approval is no longer pending for this session.',
|
|
280
|
-
});
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
res.json({ success: true });
|
|
284
|
-
});
|
|
285
|
-
router.delete('/sessions/:id', async (req, res) => {
|
|
286
|
-
const result = await getCordisEngine();
|
|
287
|
-
if (!result.ok) {
|
|
288
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
289
|
-
res.status(status).json(body);
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
const deleted = await result.engine.deleteSession(req.params.id);
|
|
293
|
-
res.status(deleted ? 200 : 404).json({ success: deleted });
|
|
294
|
-
});
|
|
295
|
-
router.get('/agents', async (_req, res) => {
|
|
296
|
-
const result = await getCordisEngine();
|
|
297
|
-
if (!result.ok) {
|
|
298
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
299
|
-
res.status(status).json(body);
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
res.json({ success: true, agents: await result.engine.listAgents() });
|
|
303
|
-
});
|
|
304
|
-
router.get('/tools', async (_req, res) => {
|
|
305
|
-
const result = await getCordisEngine();
|
|
306
|
-
if (!result.ok) {
|
|
307
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
308
|
-
res.status(status).json(body);
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
res.json({ success: true, tools: await result.engine.listTools() });
|
|
312
|
-
});
|
|
313
|
-
/**
|
|
314
|
-
* Send a chat message and stream the agent response as newline-delimited JSON.
|
|
315
|
-
*
|
|
316
|
-
* NDJSON is chosen over WebSocket deliberately: an agent turn is a single
|
|
317
|
-
* server-to-client sequence with no client-to-server frames after the request,
|
|
318
|
-
* so a streaming POST keeps the whole turn inside one authenticated request and
|
|
319
|
-
* needs no separate handshake, ticket, or reconnect protocol.
|
|
320
|
-
*/
|
|
321
|
-
router.post('/sessions/:id/messages', async (req, res) => {
|
|
322
|
-
const result = await getCordisEngine();
|
|
323
|
-
if (!result.ok) {
|
|
324
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
325
|
-
res.status(status).json(body);
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
const text = typeof req.body?.text === 'string' ? req.body.text : '';
|
|
329
|
-
if (text.trim() === '') {
|
|
330
|
-
res
|
|
331
|
-
.status(400)
|
|
332
|
-
.json({ success: false, error: 'A message text is required.' });
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
if (text.length > 100000) {
|
|
336
|
-
res.status(400).json({
|
|
337
|
-
success: false,
|
|
338
|
-
error: 'Message text exceeds 100000 characters.',
|
|
339
|
-
});
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
let disconnected = false;
|
|
343
|
-
const onDisconnect = () => {
|
|
344
|
-
disconnected = true;
|
|
345
|
-
void result.engine.cancel(req.params.id).catch(() => undefined);
|
|
346
|
-
};
|
|
347
|
-
res.once('close', onDisconnect);
|
|
348
|
-
let stream;
|
|
349
|
-
try {
|
|
350
|
-
stream = await result.engine.sendMessage(req.params.id, text, {
|
|
351
|
-
userId: req.user.userId,
|
|
352
|
-
});
|
|
353
|
-
if (disconnected) {
|
|
354
|
-
await result.engine.cancel(req.params.id);
|
|
355
|
-
stream.close();
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
catch (error) {
|
|
360
|
-
// A failure here is caller-visible (unknown session, a turn already in
|
|
361
|
-
// flight, streaming disabled), so it is a request error rather than a
|
|
362
|
-
// bridge outage.
|
|
363
|
-
res.off('close', onDisconnect);
|
|
364
|
-
if (!res.destroyed)
|
|
365
|
-
res.status(400).json({
|
|
366
|
-
success: false,
|
|
367
|
-
error: error instanceof Error ? error.message : String(error),
|
|
368
|
-
});
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
res.setHeader('Content-Type', 'application/x-ndjson');
|
|
372
|
-
res.setHeader('Cache-Control', 'no-store');
|
|
373
|
-
// The response must not be buffered by an intermediary: the point of the
|
|
374
|
-
// endpoint is that chunks reach the client as the model produces them.
|
|
375
|
-
res.setHeader('X-Accel-Buffering', 'no');
|
|
376
|
-
res.flushHeaders?.();
|
|
377
|
-
let closed = false;
|
|
378
|
-
let subscription;
|
|
379
|
-
const finish = () => {
|
|
380
|
-
if (closed)
|
|
381
|
-
return;
|
|
382
|
-
closed = true;
|
|
383
|
-
res.off('close', onDisconnect);
|
|
384
|
-
subscription?.unsubscribe();
|
|
385
|
-
res.end();
|
|
386
|
-
};
|
|
387
|
-
// Subscribing replays whatever the model already produced, so a fast first
|
|
388
|
-
// token cannot be lost between the engine starting the turn and this handler
|
|
389
|
-
// attaching its listener.
|
|
390
|
-
subscription = stream.subscribe(chunk => {
|
|
391
|
-
if (closed)
|
|
392
|
-
return;
|
|
393
|
-
res.write(`${JSON.stringify(chunk)}\n`);
|
|
394
|
-
if (res.writableLength > 1048576) {
|
|
395
|
-
onDisconnect();
|
|
396
|
-
finish();
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
// `done` is the terminal chunk of one turn, so the response ends here
|
|
400
|
-
// rather than waiting for the client to close it.
|
|
401
|
-
if (chunk.type === 'done')
|
|
402
|
-
finish();
|
|
403
|
-
});
|
|
404
|
-
if (closed)
|
|
405
|
-
subscription.unsubscribe();
|
|
406
|
-
// Disconnecting cancels model and tool work, as well as releasing the reader.
|
|
407
|
-
res.on('close', () => {
|
|
408
|
-
if (closed)
|
|
409
|
-
return;
|
|
410
|
-
closed = true;
|
|
411
|
-
subscription?.unsubscribe();
|
|
412
|
-
stream.close();
|
|
413
|
-
});
|
|
414
|
-
});
|
|
415
|
-
router.post('/sessions/:id/cancel', async (req, res) => {
|
|
416
|
-
const result = await getCordisEngine();
|
|
417
|
-
if (!result.ok) {
|
|
418
|
-
const { status, body } = unavailable(result.reason, result.detail);
|
|
419
|
-
res.status(status).json(body);
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
res.json({ success: await result.engine.cancel(req.params.id) });
|
|
423
|
-
});
|
|
424
|
-
// Keep corrupt legacy sessions visible as a recoverable conflict. Never bypass
|
|
425
|
-
// the engine's event validator or discard a transcript to make it readable.
|
|
426
|
-
const sessionErrorHandler = (error, _req, res, next) => {
|
|
427
|
-
if (error instanceof Error &&
|
|
428
|
-
error.name === 'SessionPersistenceCorruptionError') {
|
|
429
|
-
res.status(409).json({
|
|
430
|
-
success: false,
|
|
431
|
-
code: 'CORDIS_SESSION_INVALID',
|
|
432
|
-
error: 'This saved session has an invalid event log. Preserve the original files and use the Cordis session repair tool before reopening it.',
|
|
433
|
-
});
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
next(error);
|
|
437
|
-
};
|
|
438
|
-
router.use(sessionErrorHandler);
|
|
439
|
-
export default router;
|
|
440
|
-
//# sourceMappingURL=cordis.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cordis.js","sourceRoot":"","sources":["../../src/routes/cordis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"libreClaw.d.ts","sourceRoot":"","sources":["../../src/routes/libreClaw.ts"],"names":[],"mappings":"AA+BA,QAAA,MAAM,MAAM,4CAAmB,CAAC;eA6UjB,MAAM"}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Libre WebUI
|
|
3
|
-
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at:
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
import express from 'express';
|
|
18
|
-
import { authenticate, requireAdmin } from '../middleware/auth.js';
|
|
19
|
-
import { agentsEnabledLockedByEnv, getAgentsEnabled, setAgentsEnabled, } from '../services/agentAccessService.js';
|
|
20
|
-
import libreClawService, { LibreClawServiceError, } from '../services/libreClawService.js';
|
|
21
|
-
const router = express.Router();
|
|
22
|
-
router.use(authenticate, requireAdmin);
|
|
23
|
-
/**
|
|
24
|
-
* The Agents feature toggle. Reachable while the feature is disabled —
|
|
25
|
-
* this is how an administrator turns it on. Everything below the gate
|
|
26
|
-
* requires the feature to be enabled.
|
|
27
|
-
*/
|
|
28
|
-
router.get('/access', async (_req, res) => {
|
|
29
|
-
sendSuccess(res, {
|
|
30
|
-
enabled: await getAgentsEnabled(),
|
|
31
|
-
lockedByEnv: agentsEnabledLockedByEnv(),
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
router.put('/access', async (req, res) => {
|
|
35
|
-
const enabled = req.body?.enabled;
|
|
36
|
-
if (typeof enabled !== 'boolean') {
|
|
37
|
-
res.status(400).json({
|
|
38
|
-
success: false,
|
|
39
|
-
error: 'enabled must be a boolean.',
|
|
40
|
-
});
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
if (agentsEnabledLockedByEnv()) {
|
|
44
|
-
res.status(409).json({
|
|
45
|
-
success: false,
|
|
46
|
-
error: 'Libre Claw is pinned by LIBRE_CLAW_ENABLED; unset the environment variable to manage it here.',
|
|
47
|
-
});
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
await setAgentsEnabled(enabled);
|
|
51
|
-
sendSuccess(res, {
|
|
52
|
-
enabled: await getAgentsEnabled(),
|
|
53
|
-
lockedByEnv: false,
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
router.use(async (_req, res, next) => {
|
|
57
|
-
if (!(await getAgentsEnabled())) {
|
|
58
|
-
res.status(403).json({
|
|
59
|
-
success: false,
|
|
60
|
-
error: 'The Agents feature is disabled on this server.',
|
|
61
|
-
});
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
next();
|
|
65
|
-
});
|
|
66
|
-
router.get('/status', async (_req, res) => {
|
|
67
|
-
const status = await libreClawService.status();
|
|
68
|
-
sendSuccess(res, status);
|
|
69
|
-
});
|
|
70
|
-
router.get('/health', async (_req, res) => {
|
|
71
|
-
await sendLibreClaw(res, () => libreClawService.health());
|
|
72
|
-
});
|
|
73
|
-
router.get('/dashboard', (_req, res) => {
|
|
74
|
-
sendSuccess(res, { url: libreClawService.dashboardUrl() });
|
|
75
|
-
});
|
|
76
|
-
router.get('/config/model', async (_req, res) => {
|
|
77
|
-
await sendLibreClaw(res, () => libreClawService.currentModel());
|
|
78
|
-
});
|
|
79
|
-
router.patch('/config/model', async (req, res) => {
|
|
80
|
-
await sendLibreClaw(res, () => libreClawService.updateModel({
|
|
81
|
-
provider: String(req.body?.provider || '').trim(),
|
|
82
|
-
model: String(req.body?.model || '').trim(),
|
|
83
|
-
persist_global: Boolean(req.body?.persist_global),
|
|
84
|
-
}));
|
|
85
|
-
});
|
|
86
|
-
router.get('/config/fallback', async (_req, res) => {
|
|
87
|
-
await sendLibreClaw(res, () => libreClawService.currentFallback());
|
|
88
|
-
});
|
|
89
|
-
router.patch('/config/fallback', async (req, res) => {
|
|
90
|
-
await sendLibreClaw(res, () => libreClawService.updateFallback(req.body || {}));
|
|
91
|
-
});
|
|
92
|
-
router.patch('/config/theme', async (req, res) => {
|
|
93
|
-
await sendLibreClaw(res, () => libreClawService.updateTheme({
|
|
94
|
-
theme: String(req.body?.theme || '').trim(),
|
|
95
|
-
persist_global: req.body?.persist_global !== false,
|
|
96
|
-
}));
|
|
97
|
-
});
|
|
98
|
-
router.get('/runs', async (req, res) => {
|
|
99
|
-
await sendLibreClaw(res, () => libreClawService.listRuns(readLimit(req, 20, 100)));
|
|
100
|
-
});
|
|
101
|
-
router.post('/runs', async (req, res) => {
|
|
102
|
-
const payload = req.body;
|
|
103
|
-
await sendLibreClaw(res, () => libreClawService.startRun({
|
|
104
|
-
message: String(payload?.message || '').trim(),
|
|
105
|
-
kind: payload?.kind === 'goal' ? 'goal' : 'chat',
|
|
106
|
-
provider: cleanOptionalString(payload?.provider),
|
|
107
|
-
model: cleanOptionalString(payload?.model),
|
|
108
|
-
surface: 'libre-webui',
|
|
109
|
-
session: payload?.session,
|
|
110
|
-
attachments: payload?.attachments,
|
|
111
|
-
}), 202);
|
|
112
|
-
});
|
|
113
|
-
router.get('/runs/:runId', async (req, res) => {
|
|
114
|
-
await sendLibreClaw(res, () => libreClawService.getRun(readParam(req, 'runId')));
|
|
115
|
-
});
|
|
116
|
-
router.get('/runs/:runId/events', async (req, res) => {
|
|
117
|
-
await sendLibreClaw(res, () => libreClawService.getEvents(readParam(req, 'runId'), readAfter(req)));
|
|
118
|
-
});
|
|
119
|
-
router.post('/runs/:runId/cancel', async (req, res) => {
|
|
120
|
-
await sendLibreClaw(res, () => libreClawService.cancelRun(readParam(req, 'runId')));
|
|
121
|
-
});
|
|
122
|
-
router.post('/runs/:runId/permissions/:toolCallId', async (req, res) => {
|
|
123
|
-
const resolution = String(req.body?.resolution || 'deny');
|
|
124
|
-
const payload = {
|
|
125
|
-
resolution: isPermissionResolution(resolution) ? resolution : 'deny',
|
|
126
|
-
};
|
|
127
|
-
await sendLibreClaw(res, () => libreClawService.resolvePermission(readParam(req, 'runId'), readParam(req, 'toolCallId'), payload));
|
|
128
|
-
});
|
|
129
|
-
router.get('/usage', async (req, res) => {
|
|
130
|
-
await sendLibreClaw(res, () => libreClawService.usage(String(req.query.provider || '').trim(), readLimit(req, 250, 1000)));
|
|
131
|
-
});
|
|
132
|
-
router.get('/automations', async (req, res) => {
|
|
133
|
-
await sendLibreClaw(res, () => libreClawService.listAutomations(readLimit(req, 50, 200)));
|
|
134
|
-
});
|
|
135
|
-
router.post('/automations', async (req, res) => {
|
|
136
|
-
await sendLibreClaw(res, () => libreClawService.createAutomation(req.body || {}), 201);
|
|
137
|
-
});
|
|
138
|
-
router.get('/automations/:automationId', async (req, res) => {
|
|
139
|
-
await sendLibreClaw(res, () => libreClawService.getAutomation(readParam(req, 'automationId')));
|
|
140
|
-
});
|
|
141
|
-
router.patch('/automations/:automationId', async (req, res) => {
|
|
142
|
-
await sendLibreClaw(res, () => libreClawService.updateAutomation(readParam(req, 'automationId'), req.body || {}));
|
|
143
|
-
});
|
|
144
|
-
router.put('/automations/:automationId', async (req, res) => {
|
|
145
|
-
await sendLibreClaw(res, () => libreClawService.updateAutomation(readParam(req, 'automationId'), req.body || {}));
|
|
146
|
-
});
|
|
147
|
-
router.post('/automations/:automationId/pause', async (req, res) => {
|
|
148
|
-
await sendLibreClaw(res, () => libreClawService.pauseAutomation(readParam(req, 'automationId')));
|
|
149
|
-
});
|
|
150
|
-
router.post('/automations/:automationId/resume', async (req, res) => {
|
|
151
|
-
await sendLibreClaw(res, () => libreClawService.resumeAutomation(readParam(req, 'automationId')));
|
|
152
|
-
});
|
|
153
|
-
router.post('/automations/:automationId/run', async (req, res) => {
|
|
154
|
-
await sendLibreClaw(res, () => libreClawService.runAutomationNow(readParam(req, 'automationId')));
|
|
155
|
-
});
|
|
156
|
-
router.delete('/automations/:automationId', async (req, res) => {
|
|
157
|
-
await sendLibreClaw(res, () => libreClawService.deleteAutomation(readParam(req, 'automationId')));
|
|
158
|
-
});
|
|
159
|
-
const sendLibreClaw = async (res, action, successStatus = 200) => {
|
|
160
|
-
try {
|
|
161
|
-
const data = await action();
|
|
162
|
-
res.status(successStatus).json({ success: true, data });
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
const status = error instanceof LibreClawServiceError ? error.status : 500;
|
|
166
|
-
const message = error instanceof Error ? error.message : 'Libre Claw request failed';
|
|
167
|
-
res.status(status).json({
|
|
168
|
-
success: false,
|
|
169
|
-
error: message,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
const sendSuccess = (res, data) => {
|
|
174
|
-
res.json({ success: true, data });
|
|
175
|
-
};
|
|
176
|
-
const readLimit = (req, fallback, max) => {
|
|
177
|
-
const raw = Number(req.query.limit);
|
|
178
|
-
if (!Number.isFinite(raw)) {
|
|
179
|
-
return fallback;
|
|
180
|
-
}
|
|
181
|
-
return Math.max(1, Math.min(max, Math.floor(raw)));
|
|
182
|
-
};
|
|
183
|
-
const readAfter = (req) => {
|
|
184
|
-
const raw = Number(req.query.after);
|
|
185
|
-
if (!Number.isFinite(raw)) {
|
|
186
|
-
return 0;
|
|
187
|
-
}
|
|
188
|
-
return Math.max(0, Math.floor(raw));
|
|
189
|
-
};
|
|
190
|
-
const readParam = (req, name) => String(req.params[name] || '').trim();
|
|
191
|
-
const cleanOptionalString = (value) => {
|
|
192
|
-
const cleaned = String(value || '').trim();
|
|
193
|
-
return cleaned || undefined;
|
|
194
|
-
};
|
|
195
|
-
const isPermissionResolution = (value) => value === 'allow_once' ||
|
|
196
|
-
value === 'deny' ||
|
|
197
|
-
value === 'always_allow_tool' ||
|
|
198
|
-
value === 'always_allow_call';
|
|
199
|
-
export default router;
|
|
200
|
-
//# sourceMappingURL=libreClaw.js.map
|