libre-webui 0.26.0 → 0.28.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 +57 -29
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +7 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/persistence/postgresAutomationWorkTargetMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresAutomationWorkTargetMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresAutomationWorkTargetMigration.js +44 -0
- package/backend/dist/persistence/postgresAutomationWorkTargetMigration.js.map +1 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js +107 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js.map +1 -0
- package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
- package/backend/dist/persistence/postgresMigrationRegistry.js +8 -0
- package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
- package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresResourceRepositories.js +179 -4
- package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
- package/backend/dist/persistence/postgresSecurityRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresSecurityRepositories.js +154 -0
- package/backend/dist/persistence/postgresSecurityRepositories.js.map +1 -1
- package/backend/dist/persistence/postgresWorkComputerMigration.d.ts +8 -0
- package/backend/dist/persistence/postgresWorkComputerMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresWorkComputerMigration.js +37 -0
- package/backend/dist/persistence/postgresWorkComputerMigration.js.map +1 -0
- package/backend/dist/persistence/postgresWorkTakeoverMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresWorkTakeoverMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresWorkTakeoverMigration.js +38 -0
- package/backend/dist/persistence/postgresWorkTakeoverMigration.js.map +1 -0
- package/backend/dist/persistence/resourceTypes.d.ts +64 -0
- package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
- package/backend/dist/persistence/resourceTypes.js.map +1 -1
- package/backend/dist/persistence/securityTypes.d.ts +60 -0
- package/backend/dist/persistence/securityTypes.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.d.ts +4 -0
- package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.js +267 -0
- package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
- package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteResourceRepositories.js +151 -7
- package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteSecurityRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteSecurityRepositories.js +140 -0
- package/backend/dist/persistence/sqliteSecurityRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.js +45 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
- package/backend/dist/platform/jobs/domainJobContracts.d.ts +2 -0
- package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobContracts.js +2 -0
- package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.js +152 -2
- package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -1
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +7 -3
- 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 +8 -4
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -1
- package/backend/dist/platform/workPersistence/types.d.ts +2 -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/auth.d.ts.map +1 -1
- package/backend/dist/routes/auth.js +427 -5
- package/backend/dist/routes/auth.js.map +1 -1
- package/backend/dist/routes/automations.d.ts.map +1 -1
- package/backend/dist/routes/automations.js +5 -0
- package/backend/dist/routes/automations.js.map +1 -1
- package/backend/dist/routes/documents.d.ts.map +1 -1
- package/backend/dist/routes/documents.js +4 -0
- package/backend/dist/routes/documents.js.map +1 -1
- package/backend/dist/routes/push.d.ts +3 -0
- package/backend/dist/routes/push.d.ts.map +1 -0
- package/backend/dist/routes/push.js +105 -0
- package/backend/dist/routes/push.js.map +1 -0
- package/backend/dist/routes/recovery.d.ts +3 -0
- package/backend/dist/routes/recovery.d.ts.map +1 -0
- package/backend/dist/routes/recovery.js +83 -0
- package/backend/dist/routes/recovery.js.map +1 -0
- package/backend/dist/routes/users.d.ts.map +1 -1
- package/backend/dist/routes/users.js +35 -0
- package/backend/dist/routes/users.js.map +1 -1
- package/backend/dist/routes/work.d.ts.map +1 -1
- package/backend/dist/routes/work.js +205 -1
- package/backend/dist/routes/work.js.map +1 -1
- package/backend/dist/services/authService.d.ts +8 -0
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +29 -0
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/automationSchedulerService.d.ts.map +1 -1
- package/backend/dist/services/automationSchedulerService.js +31 -0
- package/backend/dist/services/automationSchedulerService.js.map +1 -1
- package/backend/dist/services/automationService.d.ts +4 -1
- package/backend/dist/services/automationService.d.ts.map +1 -1
- package/backend/dist/services/automationService.js +27 -0
- package/backend/dist/services/automationService.js.map +1 -1
- package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
- package/backend/dist/services/dataArchiveService.js +3 -0
- package/backend/dist/services/dataArchiveService.js.map +1 -1
- package/backend/dist/services/documentMediaExtractionService.d.ts +40 -0
- package/backend/dist/services/documentMediaExtractionService.d.ts.map +1 -0
- package/backend/dist/services/documentMediaExtractionService.js +157 -0
- package/backend/dist/services/documentMediaExtractionService.js.map +1 -0
- package/backend/dist/services/documentService.d.ts +6 -0
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +58 -4
- package/backend/dist/services/documentService.js.map +1 -1
- package/backend/dist/services/encryptionService.d.ts +6 -0
- package/backend/dist/services/encryptionService.d.ts.map +1 -1
- package/backend/dist/services/encryptionService.js +12 -0
- package/backend/dist/services/encryptionService.js.map +1 -1
- package/backend/dist/services/mfaService.d.ts +64 -0
- package/backend/dist/services/mfaService.d.ts.map +1 -0
- package/backend/dist/services/mfaService.js +262 -0
- package/backend/dist/services/mfaService.js.map +1 -0
- package/backend/dist/services/notificationService.d.ts +5 -0
- package/backend/dist/services/notificationService.d.ts.map +1 -1
- package/backend/dist/services/notificationService.js +33 -1
- package/backend/dist/services/notificationService.js.map +1 -1
- package/backend/dist/services/preferencesService.d.ts +1 -1
- package/backend/dist/services/preferencesService.d.ts.map +1 -1
- package/backend/dist/services/preferencesService.js +1 -0
- package/backend/dist/services/preferencesService.js.map +1 -1
- package/backend/dist/services/recoveryDrillService.d.ts +57 -0
- package/backend/dist/services/recoveryDrillService.d.ts.map +1 -0
- package/backend/dist/services/recoveryDrillService.js +363 -0
- package/backend/dist/services/recoveryDrillService.js.map +1 -0
- package/backend/dist/services/webPushService.d.ts +71 -0
- package/backend/dist/services/webPushService.d.ts.map +1 -0
- package/backend/dist/services/webPushService.js +328 -0
- package/backend/dist/services/webPushService.js.map +1 -0
- package/backend/dist/services/webauthnService.d.ts +58 -0
- package/backend/dist/services/webauthnService.d.ts.map +1 -0
- package/backend/dist/services/webauthnService.js +301 -0
- package/backend/dist/services/webauthnService.js.map +1 -0
- package/backend/dist/services/websocketTicketService.d.ts +1 -1
- package/backend/dist/services/websocketTicketService.d.ts.map +1 -1
- package/backend/dist/services/websocketTicketService.js +3 -1
- package/backend/dist/services/websocketTicketService.js.map +1 -1
- package/backend/dist/services/workAgentGuidance.d.ts +14 -0
- package/backend/dist/services/workAgentGuidance.d.ts.map +1 -1
- package/backend/dist/services/workAgentGuidance.js +38 -2
- package/backend/dist/services/workAgentGuidance.js.map +1 -1
- package/backend/dist/services/workAgentService.d.ts +9 -0
- package/backend/dist/services/workAgentService.d.ts.map +1 -1
- package/backend/dist/services/workAgentService.js +503 -13
- package/backend/dist/services/workAgentService.js.map +1 -1
- package/backend/dist/services/workComputerSetupService.d.ts +33 -0
- package/backend/dist/services/workComputerSetupService.d.ts.map +1 -0
- package/backend/dist/services/workComputerSetupService.js +164 -0
- package/backend/dist/services/workComputerSetupService.js.map +1 -0
- package/backend/dist/services/workComputerTeachService.d.ts +105 -0
- package/backend/dist/services/workComputerTeachService.d.ts.map +1 -0
- package/backend/dist/services/workComputerTeachService.js +513 -0
- package/backend/dist/services/workComputerTeachService.js.map +1 -0
- package/backend/dist/services/workKubernetesDriver.d.ts +8 -0
- package/backend/dist/services/workKubernetesDriver.d.ts.map +1 -1
- package/backend/dist/services/workKubernetesDriver.js +22 -0
- package/backend/dist/services/workKubernetesDriver.js.map +1 -1
- package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
- package/backend/dist/services/workModelProviderService.js +102 -8
- package/backend/dist/services/workModelProviderService.js.map +1 -1
- package/backend/dist/services/workPolicyService.d.ts +8 -0
- package/backend/dist/services/workPolicyService.d.ts.map +1 -1
- package/backend/dist/services/workPolicyService.js +25 -0
- package/backend/dist/services/workPolicyService.js.map +1 -1
- package/backend/dist/services/workRuntimeDriver.d.ts +32 -0
- package/backend/dist/services/workRuntimeDriver.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeDriver.js +54 -8
- package/backend/dist/services/workRuntimeDriver.js.map +1 -1
- package/backend/dist/services/workRuntimeService.d.ts +212 -1
- package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeService.js +1184 -9
- package/backend/dist/services/workRuntimeService.js.map +1 -1
- package/backend/dist/services/workRuntimeShared.d.ts +11 -1
- package/backend/dist/services/workRuntimeShared.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeShared.js +24 -1
- package/backend/dist/services/workRuntimeShared.js.map +1 -1
- package/backend/dist/services/workScreenControlService.d.ts +60 -0
- package/backend/dist/services/workScreenControlService.d.ts.map +1 -0
- package/backend/dist/services/workScreenControlService.js +201 -0
- package/backend/dist/services/workScreenControlService.js.map +1 -0
- package/backend/dist/services/workTaskService.d.ts +11 -0
- package/backend/dist/services/workTaskService.d.ts.map +1 -1
- package/backend/dist/services/workTaskService.js +31 -0
- package/backend/dist/services/workTaskService.js.map +1 -1
- package/backend/dist/types/index.d.ts +10 -2
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/index.js.map +1 -1
- package/backend/dist/types/work.d.ts +13 -0
- package/backend/dist/types/work.d.ts.map +1 -1
- package/backend/dist/utils/documentExtraction.d.ts +31 -3
- package/backend/dist/utils/documentExtraction.d.ts.map +1 -1
- package/backend/dist/utils/documentExtraction.js +106 -0
- package/backend/dist/utils/documentExtraction.js.map +1 -1
- package/backend/dist/utils/toolEgress.d.ts +2 -1
- package/backend/dist/utils/toolEgress.d.ts.map +1 -1
- package/backend/dist/utils/toolEgress.js +14 -2
- package/backend/dist/utils/toolEgress.js.map +1 -1
- package/backend/dist/utils/totp.d.ts +19 -0
- package/backend/dist/utils/totp.d.ts.map +1 -0
- package/backend/dist/utils/totp.js +117 -0
- package/backend/dist/utils/totp.js.map +1 -0
- package/backend/dist/utils/webauthn.d.ts +47 -0
- package/backend/dist/utils/webauthn.d.ts.map +1 -0
- package/backend/dist/utils/webauthn.js +323 -0
- package/backend/dist/utils/webauthn.js.map +1 -0
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +9 -0
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/dist/workScreenServer.d.ts +12 -0
- package/backend/dist/workScreenServer.d.ts.map +1 -0
- package/backend/dist/workScreenServer.js +291 -0
- package/backend/dist/workScreenServer.js.map +1 -0
- package/backend/package.json +1 -1
- package/deploy/work-computer/Dockerfile +48 -0
- package/deploy/work-computer/README.md +93 -0
- package/deploy/work-computer/fonts/fonts.css +335 -0
- package/deploy/work-computer/fonts/v16-aFTR7PB1QTsUX8KYvumzEY2tbYf-Vlh3uA.woff2 +0 -0
- package/deploy/work-computer/fonts/v16-aFTR7PB1QTsUX8KYvumzEYOtbYf-Vlg.woff2 +0 -0
- package/deploy/work-computer/fonts/v16-aFTU7PB1QTsUX8KYthSQBK6PYK3EXw.woff2 +0 -0
- package/deploy/work-computer/fonts/v16-aFTU7PB1QTsUX8KYthqQBK6PYK0.woff2 +0 -0
- package/deploy/work-computer/fonts/v20-xn7gYHE41ni1AdIRggOxSvfedN62Zw.woff2 +0 -0
- package/deploy/work-computer/fonts/v20-xn7gYHE41ni1AdIRggSxSvfedN62Zw.woff2 +0 -0
- package/deploy/work-computer/fonts/v20-xn7gYHE41ni1AdIRggexSvfedN4.woff2 +0 -0
- package/deploy/work-computer/fonts/v20-xn7gYHE41ni1AdIRggixSvfedN62Zw.woff2 +0 -0
- package/deploy/work-computer/fonts/v20-xn7gYHE41ni1AdIRggmxSvfedN62Zw.woff2 +0 -0
- package/deploy/work-computer/fonts/v20-xn7gYHE41ni1AdIRggqxSvfedN62Zw.woff2 +0 -0
- package/deploy/work-computer/fonts/v22-V8mDoQDjQSkFtoMM3T6r8E7mPb54C_k3HqUtEw.woff2 +0 -0
- package/deploy/work-computer/fonts/v22-V8mDoQDjQSkFtoMM3T6r8E7mPb94C_k3HqUtEw.woff2 +0 -0
- package/deploy/work-computer/fonts/v22-V8mDoQDjQSkFtoMM3T6r8E7mPbF4C_k3HqU.woff2 +0 -0
- package/deploy/work-computer/start-computer.sh +155 -0
- package/deploy/work-computer/start-page.html +251 -0
- package/deploy/work-computer/tint2rc +76 -0
- package/deploy/work-computer/wallpaper.png +0 -0
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/assets/index-DGy6mo0B.js +33 -0
- package/frontend/dist/assets/index-DqLJKWF-.css +1 -0
- package/frontend/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/frontend/dist/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
- package/frontend/dist/fonts/jetbrains-mono.css +24 -0
- package/frontend/dist/index.html +40 -18
- package/frontend/dist/js/ArtifactContainer-DvIMxleC.js +1 -0
- package/frontend/dist/js/{ArtifactDemoPage-D0JEIAbZ.js → ArtifactDemoPage-BqYskFqc.js} +1 -1
- package/frontend/dist/js/ArtifactSandboxFrame-9wuufHn6.js +111 -0
- package/frontend/dist/js/ArtifactSlideOutPanel-DXESMtPh.js +1 -0
- package/frontend/dist/js/AutomationsPage-DByxhIKj.js +1 -0
- package/frontend/dist/js/AvatarUpload-DnCGQ46o.js +1 -0
- package/frontend/dist/js/{Button-C0r3J9G_.js → Button-CpobxJ2P.js} +1 -1
- package/frontend/dist/js/CalendarPage-JywVP-9y.js +1 -0
- package/frontend/dist/js/ChannelsPage-B31rcARd.js +1 -0
- package/frontend/dist/js/ChatPage-CHXJY8m3.js +14 -0
- package/frontend/dist/js/{EvaluationsPage-Bm8FRoeX.js → EvaluationsPage-CcmB5wdF.js} +1 -1
- package/frontend/dist/js/FirstTimeSetup-DDU7SowM.js +1 -0
- package/frontend/dist/js/GalleryPage-XfX_7iCf.js +1 -0
- package/frontend/dist/js/HomePage-DAZAkoAV.js +1 -0
- package/frontend/dist/js/LibreClawPage-De0gZmbF.js +1 -0
- package/frontend/dist/js/Logo-yKM43xGa.js +1 -0
- package/frontend/dist/js/LogoMark-PmpKQOre.js +1 -0
- package/frontend/dist/js/{ModelManagerModals-DX9eT5r2.js → ModelManagerModals-hz2cZZ4a.js} +1 -1
- package/frontend/dist/js/ModelSelector-BoFehQy-.js +1 -0
- package/frontend/dist/js/NotesPage-BGPI3gG6.js +3 -0
- package/frontend/dist/js/OptimizedSyntaxHighlighter-DrejdNUm.js +1 -0
- package/frontend/dist/js/OptimizedSyntaxHighlighter-hNqZPLiB.js +1 -0
- package/frontend/dist/js/PasswordStrengthMeter-RwModpZ1.js +1 -0
- package/frontend/dist/js/PersonasPage-BkNRD2wO.js +13 -0
- package/frontend/dist/js/PluginUsagePage-Cqt7V2SQ.js +1 -0
- package/frontend/dist/js/RichMessageContent-B2QSyX-l.js +1 -0
- package/frontend/dist/js/RichMessageContent-CYEhT6uU.js +3 -0
- package/frontend/dist/js/SettingsModal-IbIvVyss.js +19 -0
- package/frontend/dist/js/{SettingsToggle-BIVyfGjl.js → SettingsToggle-3GxA96E0.js} +1 -1
- package/frontend/dist/js/ShareDialog-BoE4OVhV.js +1 -0
- package/frontend/dist/js/SystemPage-B5ecz5H3.js +1 -0
- package/frontend/dist/js/TurnstileWidget-DHU9IUM1.js +1 -0
- package/frontend/dist/js/UserManagementPage-C0VUfbMk.js +1 -0
- package/frontend/dist/js/WorkPage-EweYI5Dx.js +74 -0
- package/frontend/dist/js/api-Bbh2AHHN.js +1 -0
- package/frontend/dist/js/api-F0CnlVH8.js +14 -0
- package/frontend/dist/js/appNavigation-DqV69ohR.js +1 -0
- package/frontend/dist/js/appStore-SLLBamo2.js +2 -0
- package/frontend/dist/js/appVersion-46bF9UkF.js +1 -0
- package/frontend/dist/js/ar-C4yo7x5J.js +2 -0
- package/frontend/dist/js/artifactHtml-DDmfpcB0.js +41 -0
- package/frontend/dist/js/authStore-CcfL8T6T.js +1 -0
- package/frontend/dist/js/authStore-DlSQ1TcP.js +4 -0
- package/frontend/dist/js/axios-_ZpUYd3e.js +1 -0
- package/frontend/dist/js/bn-BeZ6d2qF.js +2 -0
- package/frontend/dist/js/chatStore-DI79tEJ-.js +3 -0
- package/frontend/dist/js/classPrivateMethodInitSpec-B31Q4d2M.js +1 -0
- package/frontend/dist/js/{config-8KdgjtEx.js → config-0QgGZCrI.js} +1 -1
- package/frontend/dist/js/cs-9K5LILI5.js +2 -0
- package/frontend/dist/js/da-BWbBhLK8.js +2 -0
- package/frontend/dist/js/de-BXD9t2uY.js +2 -0
- package/frontend/dist/js/es-Dv4wZKlU.js +2 -0
- package/frontend/dist/js/{estree-BU5-LV_1.js → estree-WDwviHUZ.js} +1 -1
- package/frontend/dist/js/evaluationsApi-wjf0nh5J.js +1 -0
- package/frontend/dist/js/fr-BkXGyEei.js +2 -0
- package/frontend/dist/js/hi-BS1ldbWk.js +2 -0
- package/frontend/dist/js/{html-DeoAy2bo.js → html-Cj0HNcRt.js} +1 -1
- package/frontend/dist/js/id-Cr1njx5M.js +2 -0
- package/frontend/dist/js/is-BqpNCtDd.js +2 -0
- package/frontend/dist/js/it-Dp-iwH27.js +2 -0
- package/frontend/dist/js/ja-_e4v_6Mn.js +2 -0
- package/frontend/dist/js/ko-CjXf2pIX.js +2 -0
- package/frontend/dist/js/{logger-DSXjF4ye.js → logger-CpCQz3Vi.js} +1 -1
- package/frontend/dist/js/{markdown-DOLsYkBY.js → markdown-DTahdtRF.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-DhVgizF-.js → messageCodeStyles-COJFoq4P.js} +2 -2
- package/frontend/dist/js/ms-xpn-zACj.js +2 -0
- package/frontend/dist/js/nl-Baf0a2X0.js +2 -0
- package/frontend/dist/js/pl-BEOTrcUv.js +2 -0
- package/frontend/dist/js/pt-B5FUaihM.js +2 -0
- package/frontend/dist/js/rfb-bJaPz33m.js +5 -0
- package/frontend/dist/js/ru-BjzgMmkJ.js +2 -0
- package/frontend/dist/js/{standalone-BO5pzI8_.js → standalone-C04jT26m.js} +1 -1
- package/frontend/dist/js/sv-DDX_gP1z.js +2 -0
- package/frontend/dist/js/{syntax-highlight-DcR9Vhb7.js → syntax-highlight-P2zo9o06.js} +1 -1
- package/frontend/dist/js/teamEventStream-CgUkgjFC.js +8 -0
- package/frontend/dist/js/th-BXr3KovE.js +2 -0
- package/frontend/dist/js/tr-CdqxHEM8.js +2 -0
- package/frontend/dist/js/ttsBatching-BfhNT3c5.js +2 -0
- package/frontend/dist/js/{typescript-6GJ8APmn.js → typescript-FtGI7Y5P.js} +1 -1
- package/frontend/dist/js/ui-DFa2W4QC.js +2 -0
- package/frontend/dist/js/ui-vendor-CRZXLK0Q.js +177 -0
- package/frontend/dist/js/uk-CotKDP2Q.js +2 -0
- package/frontend/dist/js/useChat-BawGm7ua.js +10 -0
- package/frontend/dist/js/useQuery-BboI5V5G.js +1 -0
- package/frontend/dist/js/{useTranslation-5b5UhAc9.js → useTranslation-D7uLySn1.js} +1 -1
- package/frontend/dist/js/{utils-BGrdX9ie.js → utils-sD-qFh8D.js} +1 -1
- package/frontend/dist/js/utils-vendor-DTLgmsuc.js +9 -0
- package/frontend/dist/js/vi-F2NC1HaJ.js +2 -0
- package/frontend/dist/js/webauthnClient-CPSq528Q.js +1 -0
- package/frontend/dist/js/workApi-8mBuh_-J.js +6 -0
- package/frontend/dist/js/workApi-DJtLOslf.js +1 -0
- package/frontend/dist/js/workStatus-CcO9Fg41.js +1 -0
- package/frontend/dist/js/zh-DZ-kpEEA.js +2 -0
- package/frontend/dist/manifest.webmanifest +32 -0
- package/frontend/dist/sw.js +125 -0
- package/package.json +4 -2
- package/frontend/dist/assets/index-BPsH9FII.js +0 -80
- package/frontend/dist/assets/index-BtXF0Oxa.css +0 -1
- package/frontend/dist/js/ArtifactContainer-CIoFoMv8.js +0 -1
- package/frontend/dist/js/ArtifactSandboxFrame-REazyIrx.js +0 -151
- package/frontend/dist/js/ArtifactSlideOutPanel-A-i94ghF.js +0 -1
- package/frontend/dist/js/AutomationsPage-Dow_lbIf.js +0 -1
- package/frontend/dist/js/CalendarPage-DLjasZOd.js +0 -1
- package/frontend/dist/js/ChannelsPage-C8hvTD7J.js +0 -1
- package/frontend/dist/js/ChatPage-BAgBHUES.js +0 -16
- package/frontend/dist/js/FirstTimeSetup-BxJapNul.js +0 -1
- package/frontend/dist/js/GalleryPage-DHz9DkK7.js +0 -1
- package/frontend/dist/js/HomePage-BqNy-FWX.js +0 -1
- package/frontend/dist/js/LibreClawPage-BDzDILjY.js +0 -1
- package/frontend/dist/js/ModelSelector-ol8mK2ja.js +0 -1
- package/frontend/dist/js/NotesPage-DzHEx2O4.js +0 -3
- package/frontend/dist/js/OptimizedSyntaxHighlighter-CZNPwN0i.js +0 -1
- package/frontend/dist/js/PersonasPage-M_WKH2a9.js +0 -13
- package/frontend/dist/js/PluginUsagePage-Ctoka6JZ.js +0 -1
- package/frontend/dist/js/RichMessageContent-BqgafH4p.js +0 -3
- package/frontend/dist/js/SettingsModal-R9EDadAV.js +0 -19
- package/frontend/dist/js/SystemPage-aOkrSuY7.js +0 -1
- package/frontend/dist/js/UserManagementPage-BOuaX3ay.js +0 -1
- package/frontend/dist/js/WorkPage-DxZISerQ.js +0 -6
- package/frontend/dist/js/api-6bSMtSNh.js +0 -14
- package/frontend/dist/js/appStore-CdObhQBb.js +0 -2
- package/frontend/dist/js/ar-DT_VLBO3.js +0 -2
- package/frontend/dist/js/authStore-DbqqrfZv.js +0 -4
- package/frontend/dist/js/bn-BrvEqhGA.js +0 -2
- package/frontend/dist/js/chatStore-DbZPJNsu.js +0 -3
- package/frontend/dist/js/cs-BthnM_YI.js +0 -2
- package/frontend/dist/js/da-DCth-6_j.js +0 -2
- package/frontend/dist/js/de-BBWt0gJ_.js +0 -2
- package/frontend/dist/js/es-DuslOPqM.js +0 -2
- package/frontend/dist/js/evaluationsApi-CwZJsgeG.js +0 -1
- package/frontend/dist/js/fr-DZAeg46S.js +0 -2
- package/frontend/dist/js/hi-ijDSiY77.js +0 -2
- package/frontend/dist/js/id-BS6qS0oq.js +0 -2
- package/frontend/dist/js/is-CO2PMDte.js +0 -2
- package/frontend/dist/js/it-ChhxT4hs.js +0 -2
- package/frontend/dist/js/ja-cyeqUeJN.js +0 -2
- package/frontend/dist/js/ko-CfqHTLXj.js +0 -2
- package/frontend/dist/js/ms-DZ5pACe1.js +0 -2
- package/frontend/dist/js/nl-BsRsnOVp.js +0 -2
- package/frontend/dist/js/pl-DXSTAW4M.js +0 -2
- package/frontend/dist/js/pt-DmDx0JxB.js +0 -2
- package/frontend/dist/js/ru-d2g8EWfY.js +0 -2
- package/frontend/dist/js/sv-CIhYUTVQ.js +0 -2
- package/frontend/dist/js/th-B3wSxanB.js +0 -2
- package/frontend/dist/js/tr-R4UGgPOY.js +0 -2
- package/frontend/dist/js/ui-CV0LYmkM.js +0 -2
- package/frontend/dist/js/ui-vendor-CWjIBW-z.js +0 -177
- package/frontend/dist/js/uk-BzUF4Vkt.js +0 -2
- package/frontend/dist/js/utils-vendor-9bQ62WeD.js +0 -9
- package/frontend/dist/js/vi-CKc6Fg4h.js +0 -2
- package/frontend/dist/js/workApi-BruWTlHM.js +0 -6
- package/frontend/dist/js/zh-CXL-kDe8.js +0 -2
|
@@ -0,0 +1,513 @@
|
|
|
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
|
+
* Work Computer teach mode: turn a recorded human demonstration (raw
|
|
19
|
+
* pointer/key/wheel events captured by the Screen pane during a held
|
|
20
|
+
* control lease) into a reusable playbook, deterministically — no model in
|
|
21
|
+
* the loop. The playbook is a natural-language procedure the agent
|
|
22
|
+
* re-interprets with computer_observe on replay, not a pixel-exact macro,
|
|
23
|
+
* and it is stored as an ordinary user skill so it shows up in the Skills
|
|
24
|
+
* UI with versioning and sharing for free. Computer-enabled Work runs load
|
|
25
|
+
* the owner's taught skills into their system prompt, so replay is just a
|
|
26
|
+
* normal agent run.
|
|
27
|
+
*/
|
|
28
|
+
import { createSkill, getSkillBySlug, listSkills, updateSkill, } from './skillService.js';
|
|
29
|
+
import { WorkRuntimeError } from './workRuntimeShared.js';
|
|
30
|
+
/** Slug namespace for demonstration-taught skills. */
|
|
31
|
+
export const WORK_TAUGHT_SKILL_PREFIX = 'taught-';
|
|
32
|
+
/** Taught skills loaded into one Work run, newest first. */
|
|
33
|
+
export const WORK_TAUGHT_SKILLS_PER_RUN = 8;
|
|
34
|
+
export const WORK_TEACH_MAX_EVENTS = 10000;
|
|
35
|
+
/** A pause longer than this between steps becomes an explicit wait step. */
|
|
36
|
+
const WAIT_GAP_MS = 3000;
|
|
37
|
+
/** Down/up farther apart than this is a drag, not a click. */
|
|
38
|
+
const DRAG_THRESHOLD_PX = 8;
|
|
39
|
+
/** Two clicks this close in time and space collapse to a double-click. */
|
|
40
|
+
const DOUBLE_CLICK_MS = 400;
|
|
41
|
+
/** Words that mark surrounding typed text as secret material. */
|
|
42
|
+
const SECRET_CONTEXT_PATTERN = /password|secret|token|api[_-]?key|passphrase/i;
|
|
43
|
+
const REDACTED_PLACEHOLDER = '[REDACTED — never type this value; use request_takeover so the user enters it]';
|
|
44
|
+
const invalidRecording = (reason) => new WorkRuntimeError(`The recording is invalid: ${reason}`, 400, 'WORK_TEACH_INVALID_RECORDING');
|
|
45
|
+
const finite = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
46
|
+
export function validateWorkTeachEvents(events) {
|
|
47
|
+
if (!Array.isArray(events) || events.length === 0) {
|
|
48
|
+
throw invalidRecording('it contains no events.');
|
|
49
|
+
}
|
|
50
|
+
if (events.length > WORK_TEACH_MAX_EVENTS) {
|
|
51
|
+
throw invalidRecording(`it exceeds ${WORK_TEACH_MAX_EVENTS} events; record a shorter demonstration.`);
|
|
52
|
+
}
|
|
53
|
+
const validated = [];
|
|
54
|
+
for (const value of events) {
|
|
55
|
+
const event = value;
|
|
56
|
+
if (!event ||
|
|
57
|
+
typeof event !== 'object' ||
|
|
58
|
+
!finite(event.t) ||
|
|
59
|
+
event.t < 0) {
|
|
60
|
+
throw invalidRecording('an event is malformed.');
|
|
61
|
+
}
|
|
62
|
+
switch (event.kind) {
|
|
63
|
+
case 'down':
|
|
64
|
+
case 'up':
|
|
65
|
+
case 'move':
|
|
66
|
+
if (!finite(event.x) || !finite(event.y)) {
|
|
67
|
+
throw invalidRecording('a pointer event has no coordinates.');
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
70
|
+
case 'wheel':
|
|
71
|
+
if (!finite(event.dy)) {
|
|
72
|
+
throw invalidRecording('a wheel event has no delta.');
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
case 'key':
|
|
76
|
+
if (typeof event.key !== 'string' || event.key.length === 0) {
|
|
77
|
+
throw invalidRecording('a key event has no key.');
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
throw invalidRecording('an event has an unknown kind.');
|
|
82
|
+
}
|
|
83
|
+
// Anchors and URLs are best-effort enrichment from the recorder's
|
|
84
|
+
// probe: keep them only when well-formed, never fail the recording.
|
|
85
|
+
const copy = { ...event };
|
|
86
|
+
delete copy.anchor;
|
|
87
|
+
delete copy.url;
|
|
88
|
+
if (event.kind === 'down' &&
|
|
89
|
+
typeof event.anchor === 'string' &&
|
|
90
|
+
event.anchor.trim()) {
|
|
91
|
+
copy.anchor = event.anchor.trim().slice(0, 200);
|
|
92
|
+
}
|
|
93
|
+
if (typeof event.url === 'string' && event.url.trim()) {
|
|
94
|
+
copy.url = event.url.trim().slice(0, 300);
|
|
95
|
+
}
|
|
96
|
+
validated.push(copy);
|
|
97
|
+
}
|
|
98
|
+
return validated.sort((left, right) => left.t - right.t);
|
|
99
|
+
}
|
|
100
|
+
const round = (value) => Math.round(value);
|
|
101
|
+
/** Map DOM KeyboardEvent.key names to xdotool keysyms the agent can use. */
|
|
102
|
+
const KEYSYM_BY_DOM_KEY = {
|
|
103
|
+
Enter: 'Return',
|
|
104
|
+
Escape: 'Escape',
|
|
105
|
+
Backspace: 'BackSpace',
|
|
106
|
+
Delete: 'Delete',
|
|
107
|
+
Tab: 'Tab',
|
|
108
|
+
ArrowUp: 'Up',
|
|
109
|
+
ArrowDown: 'Down',
|
|
110
|
+
ArrowLeft: 'Left',
|
|
111
|
+
ArrowRight: 'Right',
|
|
112
|
+
Home: 'Home',
|
|
113
|
+
End: 'End',
|
|
114
|
+
PageUp: 'Prior',
|
|
115
|
+
PageDown: 'Next',
|
|
116
|
+
' ': 'space',
|
|
117
|
+
};
|
|
118
|
+
const chordFor = (event) => {
|
|
119
|
+
const key = event.key ?? '';
|
|
120
|
+
const parts = [];
|
|
121
|
+
if (event.ctrl)
|
|
122
|
+
parts.push('ctrl');
|
|
123
|
+
if (event.alt)
|
|
124
|
+
parts.push('alt');
|
|
125
|
+
if (event.meta)
|
|
126
|
+
parts.push('super');
|
|
127
|
+
if (event.shift && key.length > 1)
|
|
128
|
+
parts.push('shift');
|
|
129
|
+
const keysym = KEYSYM_BY_DOM_KEY[key] ?? (key.length === 1 ? key.toLowerCase() : key);
|
|
130
|
+
if (['Shift', 'Control', 'Alt', 'Meta'].includes(key))
|
|
131
|
+
return undefined;
|
|
132
|
+
if (key.length === 1 && parts.length === 0)
|
|
133
|
+
return undefined; // plain text
|
|
134
|
+
if (parts.length === 0 && !KEYSYM_BY_DOM_KEY[key])
|
|
135
|
+
return undefined;
|
|
136
|
+
return [...parts, keysym].join('+');
|
|
137
|
+
};
|
|
138
|
+
const isPlainCharacter = (event) => typeof event.key === 'string' &&
|
|
139
|
+
event.key.length === 1 &&
|
|
140
|
+
!event.ctrl &&
|
|
141
|
+
!event.alt &&
|
|
142
|
+
!event.meta;
|
|
143
|
+
/**
|
|
144
|
+
* Deterministic secret redaction. Two rules: typed text mentioning secret
|
|
145
|
+
* vocabulary is masked, and any whitespace-free run of 8+ characters mixing
|
|
146
|
+
* three character classes is masked as credential-shaped — a demo should
|
|
147
|
+
* never carry a password into a stored skill, that is what request_takeover
|
|
148
|
+
* is for.
|
|
149
|
+
*/
|
|
150
|
+
export function isSecretLikeText(text) {
|
|
151
|
+
if (SECRET_CONTEXT_PATTERN.test(text))
|
|
152
|
+
return true;
|
|
153
|
+
if (text.length >= 8 && !/\s/.test(text)) {
|
|
154
|
+
const classes = [
|
|
155
|
+
/[a-z]/.test(text),
|
|
156
|
+
/[A-Z]/.test(text),
|
|
157
|
+
/[0-9]/.test(text),
|
|
158
|
+
/[^a-zA-Z0-9]/.test(text),
|
|
159
|
+
].filter(Boolean).length;
|
|
160
|
+
if (classes >= 3)
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
function collectSteps(events) {
|
|
166
|
+
const steps = [];
|
|
167
|
+
let typeRun;
|
|
168
|
+
let pendingDown;
|
|
169
|
+
let lastStepTime = 0;
|
|
170
|
+
const flushType = () => {
|
|
171
|
+
if (typeRun && typeRun.text.length > 0) {
|
|
172
|
+
steps.push({ kind: 'type', text: typeRun.text, t: typeRun.t });
|
|
173
|
+
}
|
|
174
|
+
typeRun = undefined;
|
|
175
|
+
};
|
|
176
|
+
const noteGap = (t) => {
|
|
177
|
+
if (steps.length > 0 && t - lastStepTime >= WAIT_GAP_MS) {
|
|
178
|
+
steps.push({ kind: 'wait', ms: t - lastStepTime, t });
|
|
179
|
+
}
|
|
180
|
+
lastStepTime = t;
|
|
181
|
+
};
|
|
182
|
+
for (const event of events) {
|
|
183
|
+
switch (event.kind) {
|
|
184
|
+
case 'down':
|
|
185
|
+
flushType();
|
|
186
|
+
pendingDown = event;
|
|
187
|
+
break;
|
|
188
|
+
case 'up': {
|
|
189
|
+
if (!pendingDown)
|
|
190
|
+
break;
|
|
191
|
+
noteGap(pendingDown.t);
|
|
192
|
+
const fromX = round(pendingDown.x ?? 0);
|
|
193
|
+
const fromY = round(pendingDown.y ?? 0);
|
|
194
|
+
const toX = round(event.x ?? fromX);
|
|
195
|
+
const toY = round(event.y ?? fromY);
|
|
196
|
+
const distance = Math.hypot(toX - fromX, toY - fromY);
|
|
197
|
+
if (distance >= DRAG_THRESHOLD_PX) {
|
|
198
|
+
steps.push({
|
|
199
|
+
kind: 'drag',
|
|
200
|
+
fromX,
|
|
201
|
+
fromY,
|
|
202
|
+
toX,
|
|
203
|
+
toY,
|
|
204
|
+
t: event.t,
|
|
205
|
+
...(pendingDown.anchor ? { anchor: pendingDown.anchor } : {}),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const previous = steps[steps.length - 1];
|
|
210
|
+
if (previous?.kind === 'click' &&
|
|
211
|
+
previous.button === (pendingDown.button ?? 0) &&
|
|
212
|
+
event.t - previous.t <= DOUBLE_CLICK_MS &&
|
|
213
|
+
Math.hypot(previous.x - toX, previous.y - toY) < DRAG_THRESHOLD_PX) {
|
|
214
|
+
previous.count += 1;
|
|
215
|
+
previous.t = event.t;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
steps.push({
|
|
219
|
+
kind: 'click',
|
|
220
|
+
x: toX,
|
|
221
|
+
y: toY,
|
|
222
|
+
button: pendingDown.button ?? 0,
|
|
223
|
+
count: 1,
|
|
224
|
+
t: event.t,
|
|
225
|
+
...(pendingDown.anchor ? { anchor: pendingDown.anchor } : {}),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
lastStepTime = event.t;
|
|
230
|
+
pendingDown = undefined;
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
case 'move':
|
|
234
|
+
break;
|
|
235
|
+
case 'wheel': {
|
|
236
|
+
flushType();
|
|
237
|
+
noteGap(event.t);
|
|
238
|
+
const direction = (event.dy ?? 0) < 0 ? 'up' : 'down';
|
|
239
|
+
const previous = steps[steps.length - 1];
|
|
240
|
+
if (previous?.kind === 'scroll' &&
|
|
241
|
+
previous.direction === direction &&
|
|
242
|
+
event.t - previous.t <= 1000) {
|
|
243
|
+
previous.t = event.t;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
steps.push({
|
|
247
|
+
kind: 'scroll',
|
|
248
|
+
direction,
|
|
249
|
+
x: round(event.x ?? 0),
|
|
250
|
+
y: round(event.y ?? 0),
|
|
251
|
+
t: event.t,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
lastStepTime = event.t;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case 'key': {
|
|
258
|
+
const chord = chordFor(event);
|
|
259
|
+
if (chord) {
|
|
260
|
+
flushType();
|
|
261
|
+
noteGap(event.t);
|
|
262
|
+
steps.push({ kind: 'key', chord, t: event.t });
|
|
263
|
+
lastStepTime = event.t;
|
|
264
|
+
}
|
|
265
|
+
else if (isPlainCharacter(event)) {
|
|
266
|
+
if (!typeRun) {
|
|
267
|
+
noteGap(event.t);
|
|
268
|
+
typeRun = { text: '', t: event.t };
|
|
269
|
+
}
|
|
270
|
+
typeRun.text += event.key;
|
|
271
|
+
lastStepTime = event.t;
|
|
272
|
+
}
|
|
273
|
+
// Bare modifiers and unmapped specials are dropped.
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
flushType();
|
|
279
|
+
return steps;
|
|
280
|
+
}
|
|
281
|
+
const BUTTON_NAMES = {
|
|
282
|
+
0: 'Click',
|
|
283
|
+
1: 'Middle-click',
|
|
284
|
+
2: 'Right-click',
|
|
285
|
+
};
|
|
286
|
+
function describeStep(step, onRedact) {
|
|
287
|
+
switch (step.kind) {
|
|
288
|
+
case 'click': {
|
|
289
|
+
const verb = step.count >= 2
|
|
290
|
+
? 'Double-click'
|
|
291
|
+
: (BUTTON_NAMES[step.button] ?? 'Click');
|
|
292
|
+
return step.anchor
|
|
293
|
+
? `${verb} "${step.anchor}" — it was at about (${step.x}, ${step.y}) in the demonstration.`
|
|
294
|
+
: `${verb} at about (${step.x}, ${step.y}).`;
|
|
295
|
+
}
|
|
296
|
+
case 'drag':
|
|
297
|
+
return step.anchor
|
|
298
|
+
? `Drag "${step.anchor}" from about (${step.fromX}, ${step.fromY}) to (${step.toX}, ${step.toY}).`
|
|
299
|
+
: `Drag from about (${step.fromX}, ${step.fromY}) to (${step.toX}, ${step.toY}).`;
|
|
300
|
+
case 'type': {
|
|
301
|
+
if (isSecretLikeText(step.text)) {
|
|
302
|
+
onRedact(step.text);
|
|
303
|
+
return `Type ${REDACTED_PLACEHOLDER} into the focused field.`;
|
|
304
|
+
}
|
|
305
|
+
return `Type "${step.text}" into the focused field.`;
|
|
306
|
+
}
|
|
307
|
+
case 'key':
|
|
308
|
+
return `Press ${step.chord}.`;
|
|
309
|
+
case 'scroll':
|
|
310
|
+
return `Scroll ${step.direction} around (${step.x}, ${step.y}).`;
|
|
311
|
+
case 'wait':
|
|
312
|
+
return `Wait for the screen to settle (about ${Math.min(10, Math.round(step.ms / 1000))}s in the demonstration).`;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Build the playbook from a validated recording. Pure and deterministic:
|
|
317
|
+
* the same demonstration always yields the same skill text.
|
|
318
|
+
*/
|
|
319
|
+
export function buildWorkComputerPlaybook(events, options) {
|
|
320
|
+
const steps = collectSteps(events);
|
|
321
|
+
if (steps.length === 0) {
|
|
322
|
+
throw invalidRecording('it contains no usable actions.');
|
|
323
|
+
}
|
|
324
|
+
let redactions = 0;
|
|
325
|
+
const typedInputs = [];
|
|
326
|
+
const lines = [];
|
|
327
|
+
for (const step of steps) {
|
|
328
|
+
const line = describeStep(step, () => {
|
|
329
|
+
redactions += 1;
|
|
330
|
+
});
|
|
331
|
+
if (!line)
|
|
332
|
+
continue;
|
|
333
|
+
if (step.kind === 'type' && !isSecretLikeText(step.text)) {
|
|
334
|
+
if (!typedInputs.includes(step.text))
|
|
335
|
+
typedInputs.push(step.text);
|
|
336
|
+
}
|
|
337
|
+
lines.push(`${lines.length + 1}. ${line}`);
|
|
338
|
+
}
|
|
339
|
+
const screen = options.screenWidth && options.screenHeight
|
|
340
|
+
? `${options.screenWidth}×${options.screenHeight}`
|
|
341
|
+
: '1280×800';
|
|
342
|
+
// The demonstration's own footprint becomes the replay envelope: the
|
|
343
|
+
// distinct web hosts it touched, derived deterministically from the
|
|
344
|
+
// recorded page URLs. A taught procedure never inherits open-ended
|
|
345
|
+
// authority beyond what the human actually showed.
|
|
346
|
+
const hosts = [
|
|
347
|
+
...new Set(events
|
|
348
|
+
.map(event => event.url)
|
|
349
|
+
.filter((url) => Boolean(url))
|
|
350
|
+
.map(url => {
|
|
351
|
+
try {
|
|
352
|
+
return new URL(url).host;
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return '';
|
|
356
|
+
}
|
|
357
|
+
})
|
|
358
|
+
.filter(Boolean)),
|
|
359
|
+
].sort();
|
|
360
|
+
const anchored = steps.some(step => (step.kind === 'click' || step.kind === 'drag') && step.anchor);
|
|
361
|
+
const inputsSection = typedInputs.length > 0
|
|
362
|
+
? typedInputs
|
|
363
|
+
.map(value => `- "${value}" was typed in the demonstration; substitute the value the current request calls for.`)
|
|
364
|
+
.join('\n')
|
|
365
|
+
: '- None recorded; follow the request.';
|
|
366
|
+
const instructions = `Demonstrated procedure recorded on the Work Computer (${screen} screen).
|
|
367
|
+
${anchored
|
|
368
|
+
? 'Quoted anchors name the demonstrated targets — find the same control by its label or role first; coordinates are only where it sat during the demonstration. computer_observe first and adapt when the layout differs.'
|
|
369
|
+
: 'Coordinates are hints from the demonstration, not exact targets: computer_observe first, find the equivalent element on the current screen, and adapt when the layout differs.'}
|
|
370
|
+
|
|
371
|
+
## When to use
|
|
372
|
+
When the request matches "${options.name}".
|
|
373
|
+
|
|
374
|
+
## Inputs
|
|
375
|
+
${inputsSection}
|
|
376
|
+
|
|
377
|
+
## Steps
|
|
378
|
+
${lines.join('\n')}
|
|
379
|
+
|
|
380
|
+
## How to check
|
|
381
|
+
Re-observe after each consequential step and confirm the screen changed as the step intended before continuing.
|
|
382
|
+
|
|
383
|
+
## Allowed scope
|
|
384
|
+
${hosts.length > 0
|
|
385
|
+
? `The demonstration stayed on: ${hosts.join(', ')}. Replay within that scope only — if the flow leads to a different site, stop and ask instead of extending the procedure to new territory.`
|
|
386
|
+
: 'The demonstration recorded no web destination. If replaying takes you onto the web, stop and confirm the destination with the user first.'}
|
|
387
|
+
|
|
388
|
+
## Approval boundaries
|
|
389
|
+
Never type credentials, one-time codes, or CAPTCHA answers — call request_takeover so the user enters them directly. Stop and ask before destructive or payment actions${redactions > 0 ? '. This demonstration contained redacted secret input at the marked step; a takeover is required there' : ''}.
|
|
390
|
+
|
|
391
|
+
## What to return
|
|
392
|
+
Summarize the end state and how it was verified.
|
|
393
|
+
|
|
394
|
+
## Failure handling
|
|
395
|
+
If a step cannot be completed as demonstrated, stop and ask the user; do not improvise around errors.`;
|
|
396
|
+
return { steps: lines, redactions, typedInputs, hosts, instructions };
|
|
397
|
+
}
|
|
398
|
+
const slugify = (name) => name
|
|
399
|
+
.toLowerCase()
|
|
400
|
+
.normalize('NFKD')
|
|
401
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
402
|
+
.replace(/^-+|-+$/g, '')
|
|
403
|
+
.slice(0, 40) || 'procedure';
|
|
404
|
+
export class WorkComputerTeachService {
|
|
405
|
+
/**
|
|
406
|
+
* Build the playbook and store it as a user skill in the taught-skill
|
|
407
|
+
* namespace. A name collision gets a numeric suffix instead of failing —
|
|
408
|
+
* re-teaching a task is normal.
|
|
409
|
+
*/
|
|
410
|
+
async saveDemonstration(userId, input) {
|
|
411
|
+
const name = typeof input.name === 'string' && input.name.trim()
|
|
412
|
+
? input.name.trim().slice(0, 120)
|
|
413
|
+
: undefined;
|
|
414
|
+
if (!name) {
|
|
415
|
+
throw invalidRecording('a name for the taught task is required.');
|
|
416
|
+
}
|
|
417
|
+
const events = validateWorkTeachEvents(input.events);
|
|
418
|
+
const playbook = buildWorkComputerPlaybook(events, {
|
|
419
|
+
name,
|
|
420
|
+
screenWidth: finite(input.screenWidth) ? input.screenWidth : undefined,
|
|
421
|
+
screenHeight: finite(input.screenHeight) ? input.screenHeight : undefined,
|
|
422
|
+
});
|
|
423
|
+
const base = `${WORK_TAUGHT_SKILL_PREFIX}${slugify(name)}`;
|
|
424
|
+
let slug = base;
|
|
425
|
+
for (let suffix = 2; await getSkillBySlug(userId, slug); suffix++) {
|
|
426
|
+
if (suffix > 50) {
|
|
427
|
+
throw invalidRecording('too many taught skills share this name.');
|
|
428
|
+
}
|
|
429
|
+
slug = `${base}-${suffix}`;
|
|
430
|
+
}
|
|
431
|
+
const skill = await createSkill(userId, {
|
|
432
|
+
slug,
|
|
433
|
+
name,
|
|
434
|
+
description: `Taught on the Work Computer: ${name}`,
|
|
435
|
+
instructions: playbook.instructions,
|
|
436
|
+
enabled: true,
|
|
437
|
+
});
|
|
438
|
+
return { skill, playbook };
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Record a user-reviewed replay outcome on a taught skill: a dated
|
|
442
|
+
* "worked / failed" line in the skill's Track record section, newest
|
|
443
|
+
* first and bounded. Goes through updateSkill, so every annotation is a
|
|
444
|
+
* reviewable skill version.
|
|
445
|
+
*/
|
|
446
|
+
async recordSkillTrace(userId, slug, input) {
|
|
447
|
+
if (input.outcome !== 'success' && input.outcome !== 'failure') {
|
|
448
|
+
throw new WorkRuntimeError('A skill trace outcome must be "success" or "failure".', 400, 'WORK_TEACH_INVALID_TRACE');
|
|
449
|
+
}
|
|
450
|
+
const note = typeof input.note === 'string' && input.note.trim()
|
|
451
|
+
? input.note.trim().split('\n').join(' ').slice(0, 300)
|
|
452
|
+
: undefined;
|
|
453
|
+
const skill = await getSkillBySlug(userId, slug);
|
|
454
|
+
if (!skill || !skill.slug.startsWith(WORK_TAUGHT_SKILL_PREFIX)) {
|
|
455
|
+
throw new WorkRuntimeError('No taught skill with this slug exists for you.', 404, 'WORK_TEACH_SKILL_NOT_FOUND');
|
|
456
|
+
}
|
|
457
|
+
const line = `- ${new Date().toISOString().slice(0, 10)}: ` +
|
|
458
|
+
`${input.outcome === 'success' ? 'Worked' : 'Failed'}${note ? ` — ${note}` : ''}`;
|
|
459
|
+
const header = '## Track record';
|
|
460
|
+
const intro = 'User-reviewed replay outcomes, newest first.';
|
|
461
|
+
const sectionStart = skill.instructions.indexOf(`${header}\n`);
|
|
462
|
+
let instructions;
|
|
463
|
+
if (sectionStart < 0) {
|
|
464
|
+
instructions = `${skill.instructions.trimEnd()}\n\n${header}\n${intro}\n${line}\n`;
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
const afterHeader = sectionStart + header.length + 1;
|
|
468
|
+
const rest = skill.instructions.slice(afterHeader);
|
|
469
|
+
const nextSection = rest.indexOf('\n## ');
|
|
470
|
+
const sectionBody = nextSection < 0 ? rest : rest.slice(0, nextSection);
|
|
471
|
+
const tail = nextSection < 0 ? '' : rest.slice(nextSection);
|
|
472
|
+
const existing = sectionBody
|
|
473
|
+
.split('\n')
|
|
474
|
+
.filter(entry => entry.startsWith('- '))
|
|
475
|
+
.slice(0, 4);
|
|
476
|
+
instructions =
|
|
477
|
+
skill.instructions.slice(0, afterHeader) +
|
|
478
|
+
`${intro}\n${[line, ...existing].join('\n')}\n` +
|
|
479
|
+
tail;
|
|
480
|
+
}
|
|
481
|
+
const updated = await updateSkill(skill.id, { userId }, {
|
|
482
|
+
name: skill.name,
|
|
483
|
+
description: skill.description,
|
|
484
|
+
instructions,
|
|
485
|
+
enabled: skill.enabled,
|
|
486
|
+
});
|
|
487
|
+
if (!updated) {
|
|
488
|
+
throw new WorkRuntimeError('No taught skill with this slug exists for you.', 404, 'WORK_TEACH_SKILL_NOT_FOUND');
|
|
489
|
+
}
|
|
490
|
+
return { skill: updated, outcome: input.outcome };
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* The owner's enabled taught skills, newest first and bounded, for
|
|
494
|
+
* injection into a computer-enabled Work run's system prompt.
|
|
495
|
+
*/
|
|
496
|
+
async taughtSkillsForUser(userId) {
|
|
497
|
+
const all = await listSkills(userId);
|
|
498
|
+
return all
|
|
499
|
+
.filter(skill => skill.enabled && skill.slug.startsWith(WORK_TAUGHT_SKILL_PREFIX))
|
|
500
|
+
.sort((left, right) => right.updatedAt - left.updatedAt)
|
|
501
|
+
.slice(0, WORK_TAUGHT_SKILLS_PER_RUN)
|
|
502
|
+
.map(skill => ({
|
|
503
|
+
slug: skill.slug,
|
|
504
|
+
name: skill.name,
|
|
505
|
+
// A hand-edited taught skill can grow; keep one skill from
|
|
506
|
+
// dominating the run's system prompt.
|
|
507
|
+
instructions: skill.instructions.slice(0, 6000),
|
|
508
|
+
}));
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
export const workComputerTeachService = new WorkComputerTeachService();
|
|
512
|
+
export default workComputerTeachService;
|
|
513
|
+
//# sourceMappingURL=workComputerTeachService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workComputerTeachService.js","sourceRoot":"","sources":["../../src/services/workComputerTeachService.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,14 @@ export declare class KubernetesWorkRuntimeDriver implements WorkRuntimeDriver {
|
|
|
36
36
|
host: string;
|
|
37
37
|
port: number;
|
|
38
38
|
} | undefined>;
|
|
39
|
+
screenEndpoint(task: WorkTaskRecord): Promise<{
|
|
40
|
+
host: string;
|
|
41
|
+
port: number;
|
|
42
|
+
} | undefined>;
|
|
43
|
+
audioEndpoint(task: WorkTaskRecord): Promise<{
|
|
44
|
+
host: string;
|
|
45
|
+
port: number;
|
|
46
|
+
} | undefined>;
|
|
39
47
|
listManaged(): Promise<DiscoveredWorkContainer[]>;
|
|
40
48
|
removeOrphan(name: string): Promise<void>;
|
|
41
49
|
listWorkspaces(): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workKubernetesDriver.d.ts","sourceRoot":"","sources":["../../src/services/workKubernetesDriver.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workKubernetesDriver.d.ts","sourceRoot":"","sources":["../../src/services/workKubernetesDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -219,6 +219,28 @@ export class KubernetesWorkRuntimeDriver {
|
|
|
219
219
|
return undefined;
|
|
220
220
|
return { host: podIp, port: config.previewPort };
|
|
221
221
|
}
|
|
222
|
+
async screenEndpoint(task) {
|
|
223
|
+
// Same shape as the preview: the backend reaches websockify on the Pod
|
|
224
|
+
// IP directly; nothing is published outside the cluster.
|
|
225
|
+
const pod = await this.readPod(task.containerName);
|
|
226
|
+
if (!pod)
|
|
227
|
+
return undefined;
|
|
228
|
+
assertOwnedRuntime(pod.metadata?.labels, task);
|
|
229
|
+
const podIp = pod.status?.podIP;
|
|
230
|
+
if (!podIp)
|
|
231
|
+
return undefined;
|
|
232
|
+
return { host: podIp, port: config.screenPort };
|
|
233
|
+
}
|
|
234
|
+
async audioEndpoint(task) {
|
|
235
|
+
const pod = await this.readPod(task.containerName);
|
|
236
|
+
if (!pod)
|
|
237
|
+
return undefined;
|
|
238
|
+
assertOwnedRuntime(pod.metadata?.labels, task);
|
|
239
|
+
const podIp = pod.status?.podIP;
|
|
240
|
+
if (!podIp)
|
|
241
|
+
return undefined;
|
|
242
|
+
return { host: podIp, port: config.audioPort };
|
|
243
|
+
}
|
|
222
244
|
async listManaged() {
|
|
223
245
|
const { core } = await this.client();
|
|
224
246
|
const pods = await core.listNamespacedPod({
|