@synopackageland/cli 0.6.1 → 0.7.1
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/CHANGELOG.md +846 -0
- package/README.md +81 -89
- package/dist/add.d.ts +4 -1
- package/dist/add.js +45 -17
- package/dist/build-spk/delegate-scope.d.ts +6 -0
- package/dist/build-spk/delegate-scope.js +34 -0
- package/dist/build-spk/dsm-arch.d.ts +7 -1
- package/dist/build-spk/dsm-arch.js +24 -28
- package/dist/build-spk/dsm-platforms.json +42 -0
- package/dist/build-spk/dsm-version.d.ts +11 -0
- package/dist/build-spk/dsm-version.js +17 -0
- package/dist/build-spk/gateway.js +8 -4
- package/dist/build-spk/generator.js +30 -5
- package/dist/build-spk/go-toolchain.d.ts +20 -0
- package/dist/build-spk/go-toolchain.js +44 -0
- package/dist/build-spk/notices.js +4 -1
- package/dist/build-spk/resource-worker.js +3 -0
- package/dist/build-spk/wizard-messages.d.ts +66 -0
- package/dist/build-spk/wizard-messages.js +75 -9
- package/dist/cli.js +28 -14
- package/dist/contract/schema-validate.js +8 -0
- package/dist/contract/validate.js +30 -0
- package/dist/deploy/deploy.d.ts +1 -1
- package/dist/deploy/deploy.js +8 -0
- package/dist/deploy/native-install-values.d.ts +17 -0
- package/dist/deploy/native-install-values.js +32 -0
- package/dist/deploy/plan.d.ts +6 -2
- package/dist/deploy/plan.js +58 -7
- package/dist/deploy/spk-version.js +1 -1
- package/dist/error-registry.js +54 -20
- package/dist/host/dsm-client.d.ts +8 -4
- package/dist/host/dsm-client.js +63 -21
- package/dist/host/dsm-http.js +24 -2
- package/dist/host/types.d.ts +3 -1
- package/dist/info.js +45 -10
- package/dist/init.d.ts +3 -0
- package/dist/init.js +50 -19
- package/dist/package-metadata.d.ts +21 -0
- package/dist/package-metadata.js +101 -0
- package/dist/portal/alias.d.ts +25 -0
- package/dist/portal/alias.js +48 -0
- package/dist/portal/package.d.ts +33 -0
- package/dist/portal/package.js +116 -0
- package/dist/runtime/delegate-contract.d.ts +79 -0
- package/dist/runtime/delegate-contract.js +27 -0
- package/dist/runtime/dsm-version.d.ts +6 -0
- package/dist/runtime/dsm-version.js +8 -0
- package/dist/runtime/executor-build.js +10 -6
- package/dist/runtime/executor-inspect.d.ts +3 -0
- package/dist/runtime/executor-inspect.js +11 -5
- package/dist/runtime/executor-policy.d.ts +12 -0
- package/dist/runtime/executor-policy.js +43 -3
- package/dist/runtime/executor-scope-task.d.ts +4 -0
- package/dist/runtime/executor-scope-task.js +21 -0
- package/dist/runtime/executor-tasks.d.ts +2 -1
- package/dist/runtime/executor-tasks.js +4 -4
- package/dist/skill.js +1 -0
- package/dist/standalone/api-permissions.d.ts +10 -0
- package/dist/standalone/api-permissions.js +19 -2
- package/dist/standalone/background.d.ts +16 -0
- package/dist/standalone/background.js +69 -2
- package/dist/standalone/binary.d.ts +1 -1
- package/dist/standalone/binary.js +22 -8
- package/dist/standalone/build.d.ts +1 -1
- package/dist/standalone/build.js +38 -8
- package/dist/standalone/daemon.d.ts +1 -0
- package/dist/standalone/daemon.js +10 -5
- package/dist/standalone/dsm-window.d.ts +3 -1
- package/dist/standalone/dsm-window.js +78 -49
- package/dist/standalone/inspect-spk.d.ts +8 -0
- package/dist/standalone/inspect-spk.js +110 -27
- package/dist/standalone/lifecycle.js +86 -8
- package/dist/standalone/manifest.d.ts +13 -0
- package/dist/standalone/manifest.js +57 -8
- package/dist/standalone/native-authorization-window.d.ts +1 -1
- package/dist/standalone/native-authorization-window.js +9 -1
- package/dist/standalone/native-layout.d.ts +3 -0
- package/dist/standalone/native-layout.js +37 -5
- package/dist/standalone/native-root-window.d.ts +4 -2
- package/dist/standalone/native-root-window.js +33 -18
- package/dist/standalone/portal-window.d.ts +21 -0
- package/dist/standalone/portal-window.js +155 -0
- package/dist/standalone/portal.d.ts +4 -0
- package/dist/standalone/portal.js +4 -0
- package/dist/standalone/resource.d.ts +5 -3
- package/dist/standalone/resource.js +6 -3
- package/dist/standalone/root-window.d.ts +4 -1
- package/dist/standalone/root-window.js +193 -36
- package/dist/standalone/spk.d.ts +1 -1
- package/dist/standalone/spk.js +25 -7
- package/dist/templates/_daemon/go.mod +1 -1
- package/dist/templates/_daemon/main.go +6 -3
- package/dist/templates/_daemon/main_test.go +82 -9
- package/dist/templates/_daemon/testdata/child.go +3 -0
- package/dist/templates/_executor/README.md +130 -16
- package/dist/templates/_executor/anchor.go +156 -0
- package/dist/templates/_executor/anchor_test.go +161 -0
- package/dist/templates/_executor/apppriv_review_test.go +1 -1
- package/dist/templates/_executor/cancel_contract_test.go +236 -0
- package/dist/templates/_executor/copy.go +64 -0
- package/dist/templates/_executor/copy_test.go +88 -0
- package/dist/templates/_executor/digest_review_test.go +2 -2
- package/dist/templates/_executor/dsm.go +63 -13
- package/dist/templates/_executor/dsm_test.go +95 -1
- package/dist/templates/_executor/executor.go +260 -49
- package/dist/templates/_executor/executor_test.go +36 -6
- package/dist/templates/_executor/go.mod +2 -0
- package/dist/templates/_executor/identity.go +27 -1
- package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/dist/templates/_executor/identity_linux.go +82 -0
- package/dist/templates/_executor/identity_security_test.go +43 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
- package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/dist/templates/_executor/lifecycle_test.go +11 -0
- package/dist/templates/_executor/link_linux.go +28 -0
- package/dist/templates/_executor/long_running_test.go +530 -0
- package/dist/templates/_executor/main.go +83 -25
- package/dist/templates/_executor/managed.go +3 -3
- package/dist/templates/_executor/managed_test.go +3 -3
- package/dist/templates/_executor/move_linux.go +490 -0
- package/dist/templates/_executor/move_linux_test.go +460 -0
- package/dist/templates/_executor/move_validation.go +46 -0
- package/dist/templates/_executor/move_validation_test.go +187 -0
- package/dist/templates/_executor/operations.go +926 -0
- package/dist/templates/_executor/path_test.go +18 -0
- package/dist/templates/_executor/pid.go +37 -0
- package/dist/templates/_executor/pid_test.go +113 -0
- package/dist/templates/_executor/platform_linux.go +24 -173
- package/dist/templates/_executor/platform_linux_test.go +9 -65
- package/dist/templates/_executor/platform_other.go +38 -4
- package/dist/templates/_executor/process.go +3 -0
- package/dist/templates/_executor/purge_log.go +18 -0
- package/dist/templates/_executor/records.go +242 -0
- package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/dist/templates/_executor/scope_client.go +37 -0
- package/dist/templates/_executor/scope_contract.go +12 -0
- package/dist/templates/_executor/selected_scope.go +146 -0
- package/dist/templates/_executor/selected_scope_test.go +186 -0
- package/dist/templates/_executor/status_disabled_test.go +33 -0
- package/dist/templates/_executor/store.go +4 -3
- package/dist/templates/_executor/supervise.go +109 -0
- package/dist/templates/_executor/supervise_test.go +130 -0
- package/dist/templates/_executor/task_race_review_test.go +1 -1
- package/dist/templates/_executor/tasks.go +52 -15
- package/dist/templates/_executor/tasks_dsm71_test.go +114 -0
- package/dist/templates/_executor/tasks_review_test.go +1 -1
- package/dist/templates/_executor/tasks_test.go +62 -5
- package/dist/templates/_executor/upgrade_watch_test.go +13 -5
- package/dist/templates/_executor/watch.go +8 -0
- package/dist/templates/_executor/watch_test.go +23 -2
- package/dist/templates/_executor/write_review_linux_test.go +4 -12
- package/dist/templates/_gateway/go.mod +2 -0
- package/dist/templates/_shared/AGENTS.md +129 -0
- package/dist/templates/binary/dsm-package.yaml +24 -0
- package/dist/templates/binary/i18n/messages/de.json +4 -0
- package/dist/templates/binary/i18n/messages/en.json +4 -0
- package/dist/templates/binary/i18n/messages/es.json +4 -0
- package/dist/templates/binary/i18n/messages/fr.json +4 -0
- package/dist/templates/binary/i18n/messages/it.json +4 -0
- package/dist/templates/binary/i18n/messages/ja.json +4 -0
- package/dist/templates/binary/i18n/messages/ko.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/dist/templates/binary/ui/app.js +19 -4
- package/dist/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/dist/templates/native-authorization/i18n/de.json +1 -0
- package/dist/templates/native-authorization/i18n/en.json +1 -0
- package/dist/templates/native-authorization/i18n/es.json +2 -1
- package/dist/templates/native-authorization/i18n/fr.json +1 -0
- package/dist/templates/native-authorization/i18n/it.json +11 -10
- package/dist/templates/native-authorization/i18n/ja.json +1 -0
- package/dist/templates/native-authorization/i18n/ko.json +10 -9
- package/dist/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/dist/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/dist/templates/native-go/README.md +43 -10
- package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
- package/dist/templates/native-go/backend/go.mod +1 -1
- package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
- package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/dist/templates/native-go/backend/internal/api/server.go +18 -5
- package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
- package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
- package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
- package/dist/templates/native-go/backend/internal/background/store.go +16 -14
- package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/README.md +5 -1
- package/dist/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/dist/templates/native-go/backend/internal/identity/http.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/dist/templates/native-go/backend/internal/identity/service.go +1 -1
- package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/dist/templates/native-go/dsm-package.yaml +20 -1
- package/dist/templates/native-go/i18n/glossary.json +2 -1
- package/dist/templates/native-go/i18n/messages/de.json +1 -0
- package/dist/templates/native-go/i18n/messages/en.json +1 -0
- package/dist/templates/native-go/i18n/messages/es.json +1 -0
- package/dist/templates/native-go/i18n/messages/fr.json +1 -0
- package/dist/templates/native-go/i18n/messages/it.json +1 -0
- package/dist/templates/native-go/i18n/messages/ja.json +1 -0
- package/dist/templates/native-go/i18n/messages/ko.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/dist/templates/native-go/ui/app.css +10 -0
- package/dist/templates/native-go/ui/app.js +11 -1
- package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
- package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/dist/templates/native-go-delegate/test.sh +1 -0
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/dist/templates/native-go-vue/README.md +4 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/dist/templates/native-go-vue/frontend/package.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
- package/package.json +5 -1
- package/schema/package-metadata.schema.json +101 -0
- package/schema/synology-app.schema.json +112 -0
- package/skills/SKILL.md +106 -4
- package/skills/reference/create.md +101 -2
- package/skills/reference/deploy.md +2 -2
- package/skills/reference/files.md +113 -2
- package/skills/reference/identity.md +70 -1
- package/skills/reference/portal.md +17 -0
- package/skills/reference/ui-vue.md +12 -0
- package/templates/_daemon/go.mod +1 -1
- package/templates/_daemon/main.go +6 -3
- package/templates/_daemon/main_test.go +82 -9
- package/templates/_daemon/testdata/child.go +3 -0
- package/templates/_executor/README.md +130 -16
- package/templates/_executor/anchor.go +156 -0
- package/templates/_executor/anchor_test.go +161 -0
- package/templates/_executor/apppriv_review_test.go +1 -1
- package/templates/_executor/cancel_contract_test.go +236 -0
- package/templates/_executor/copy.go +64 -0
- package/templates/_executor/copy_test.go +88 -0
- package/templates/_executor/digest_review_test.go +2 -2
- package/templates/_executor/dsm.go +63 -13
- package/templates/_executor/dsm_test.go +95 -1
- package/templates/_executor/executor.go +260 -49
- package/templates/_executor/executor_test.go +36 -6
- package/templates/_executor/go.mod +2 -0
- package/templates/_executor/identity.go +27 -1
- package/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/templates/_executor/identity_linux.go +82 -0
- package/templates/_executor/identity_security_test.go +43 -0
- package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/templates/_executor/internal/taskscript/control.sh +15 -10
- package/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/templates/_executor/lifecycle_test.go +11 -0
- package/templates/_executor/link_linux.go +28 -0
- package/templates/_executor/long_running_test.go +530 -0
- package/templates/_executor/main.go +83 -25
- package/templates/_executor/managed.go +3 -3
- package/templates/_executor/managed_test.go +3 -3
- package/templates/_executor/move_linux.go +490 -0
- package/templates/_executor/move_linux_test.go +460 -0
- package/templates/_executor/move_validation.go +46 -0
- package/templates/_executor/move_validation_test.go +187 -0
- package/templates/_executor/operations.go +926 -0
- package/templates/_executor/path_test.go +18 -0
- package/templates/_executor/pid.go +37 -0
- package/templates/_executor/pid_test.go +113 -0
- package/templates/_executor/platform_linux.go +24 -173
- package/templates/_executor/platform_linux_test.go +9 -65
- package/templates/_executor/platform_other.go +38 -4
- package/templates/_executor/process.go +3 -0
- package/templates/_executor/purge_log.go +18 -0
- package/templates/_executor/records.go +242 -0
- package/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/templates/_executor/scope_client.go +37 -0
- package/templates/_executor/scope_contract.go +12 -0
- package/templates/_executor/selected_scope.go +146 -0
- package/templates/_executor/selected_scope_test.go +186 -0
- package/templates/_executor/status_disabled_test.go +33 -0
- package/templates/_executor/store.go +4 -3
- package/templates/_executor/supervise.go +109 -0
- package/templates/_executor/supervise_test.go +130 -0
- package/templates/_executor/task_race_review_test.go +1 -1
- package/templates/_executor/tasks.go +52 -15
- package/templates/_executor/tasks_dsm71_test.go +114 -0
- package/templates/_executor/tasks_review_test.go +1 -1
- package/templates/_executor/tasks_test.go +62 -5
- package/templates/_executor/upgrade_watch_test.go +13 -5
- package/templates/_executor/watch.go +8 -0
- package/templates/_executor/watch_test.go +23 -2
- package/templates/_executor/write_review_linux_test.go +4 -12
- package/templates/_gateway/go.mod +2 -0
- package/templates/_shared/AGENTS.md +129 -0
- package/templates/binary/dsm-package.yaml +24 -0
- package/templates/binary/i18n/messages/de.json +4 -0
- package/templates/binary/i18n/messages/en.json +4 -0
- package/templates/binary/i18n/messages/es.json +4 -0
- package/templates/binary/i18n/messages/fr.json +4 -0
- package/templates/binary/i18n/messages/it.json +4 -0
- package/templates/binary/i18n/messages/ja.json +4 -0
- package/templates/binary/i18n/messages/ko.json +4 -0
- package/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/templates/binary/ui/app.js +19 -4
- package/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/templates/native-authorization/i18n/de.json +1 -0
- package/templates/native-authorization/i18n/en.json +1 -0
- package/templates/native-authorization/i18n/es.json +2 -1
- package/templates/native-authorization/i18n/fr.json +1 -0
- package/templates/native-authorization/i18n/it.json +11 -10
- package/templates/native-authorization/i18n/ja.json +1 -0
- package/templates/native-authorization/i18n/ko.json +10 -9
- package/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/templates/native-go/README.md +43 -10
- package/templates/native-go/backend/cmd/app/main.go +27 -7
- package/templates/native-go/backend/go.mod +1 -1
- package/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/templates/native-go/backend/internal/api/registry.go +11 -0
- package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/templates/native-go/backend/internal/api/server.go +18 -5
- package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/templates/native-go/backend/internal/app/portal.go +30 -0
- package/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/templates/native-go/backend/internal/app/routes.go +8 -2
- package/templates/native-go/backend/internal/background/runner.go +1 -1
- package/templates/native-go/backend/internal/background/store.go +16 -14
- package/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/templates/native-go/backend/internal/identity/README.md +5 -1
- package/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/templates/native-go/backend/internal/identity/http.go +1 -1
- package/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/templates/native-go/backend/internal/identity/service.go +1 -1
- package/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/templates/native-go/dsm-package.yaml +20 -1
- package/templates/native-go/i18n/glossary.json +2 -1
- package/templates/native-go/i18n/messages/de.json +1 -0
- package/templates/native-go/i18n/messages/en.json +1 -0
- package/templates/native-go/i18n/messages/es.json +1 -0
- package/templates/native-go/i18n/messages/fr.json +1 -0
- package/templates/native-go/i18n/messages/it.json +1 -0
- package/templates/native-go/i18n/messages/ja.json +1 -0
- package/templates/native-go/i18n/messages/ko.json +1 -0
- package/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/templates/native-go/ui/app.css +10 -0
- package/templates/native-go/ui/app.js +11 -1
- package/templates/native-go-delegate/DELEGATE.md +126 -5
- package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/templates/native-go-delegate/test.sh +1 -0
- package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/templates/native-go-vue/README.md +4 -0
- package/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/templates/native-go-vue/frontend/package.json +1 -1
- package/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import {afterEach,expect,test,vi} from 'vitest'
|
|
3
|
+
import {createApp,h,nextTick} from 'vue'
|
|
4
|
+
import {AppRoot,ConfigProvider} from '@synopackageland/ui'
|
|
5
|
+
import BackgroundSavePanel from '../src/delegate/BackgroundSavePanel.vue'
|
|
6
|
+
import CapabilityPanels from '../src/CapabilityPanels.vue'
|
|
7
|
+
import type {BackgroundSaveFacade,SaveOperation} from '../src/delegate/long-running'
|
|
8
|
+
import {saveCopy} from '../src/delegate/save-copy'
|
|
9
|
+
const cleanup:Array<()=>void>=[]
|
|
10
|
+
afterEach(()=>cleanup.splice(0).forEach(fn=>fn()))
|
|
11
|
+
async function settle(){for(let i=0;i<30;i++){await Promise.resolve();await nextTick()}}
|
|
12
|
+
function facade(operations:SaveOperation[]=[]){
|
|
13
|
+
let revoked=false,disabled=false
|
|
14
|
+
const grant={id:'mine',key:'save',path:'/home/Exports',username:'normal1',lifetime:'until-revoked' as const}
|
|
15
|
+
return {
|
|
16
|
+
destination:vi.fn(async(key:string)=>({key,selection:{scope:'home',root:'/home',generation:0},destination:revoked?null:grant,status:revoked?'reselection-required' as const:'active' as const})),
|
|
17
|
+
exportExample:vi.fn(async({job_id}:{key:string;job_id:string})=>({delegation_id:'mine',job_id})),
|
|
18
|
+
selectDestination:vi.fn(async()=>grant),status:vi.fn(async()=>({disabled})),
|
|
19
|
+
list:vi.fn(async()=>revoked?[]:[grant]),operations:vi.fn(async()=>operations),
|
|
20
|
+
revoke:vi.fn(async()=>{revoked=true;return {revoked:true as const}}),
|
|
21
|
+
cancel:vi.fn(async({job_id,delegation_id})=>({job_id,delegation_id,state:'canceled' as const})),
|
|
22
|
+
disable:vi.fn(async()=>{disabled=true;revoked=true;return {disabled:true as const}}),
|
|
23
|
+
enable:vi.fn(async()=>{disabled=false;return {disabled:false as const}}),
|
|
24
|
+
} satisfies BackgroundSaveFacade
|
|
25
|
+
}
|
|
26
|
+
function mount(sdk:BackgroundSaveFacade,admin=false,locale='en'){
|
|
27
|
+
const root=document.createElement('div');document.body.append(root)
|
|
28
|
+
const app=createApp({render:()=>h(ConfigProvider,{locale:locale as any},()=>h(AppRoot,{},()=>h(BackgroundSavePanel,{sdk,admin,locale})))})
|
|
29
|
+
app.config.idPrefix='background-save-test';app.mount(root)
|
|
30
|
+
cleanup.push(()=>{app.unmount();root.remove()});return {root,app}
|
|
31
|
+
}
|
|
32
|
+
function button(root:HTMLElement,label:string){const b=[...root.querySelectorAll('button')].find(n=>n.textContent?.trim()===label);expect(b,label).toBeTruthy();return b!}
|
|
33
|
+
test('personal management lists/revokes only server-provided references without passing owner or UID',async()=>{
|
|
34
|
+
const sdk=facade(),{root}=mount(sdk);await settle()
|
|
35
|
+
expect(root.textContent).toContain('/home/Exports');expect(root.textContent).toContain('Until you revoke access')
|
|
36
|
+
button(root,'Revoke access').click();await settle()
|
|
37
|
+
expect(sdk.revoke).toHaveBeenCalledExactlyOnceWith({delegation_id:'mine'})
|
|
38
|
+
expect(root.textContent).toContain('You have no active destinations.')
|
|
39
|
+
expect(sdk.list.mock.calls.every(args=>args.length===0)).toBe(true)
|
|
40
|
+
expect(root.textContent).not.toContain('Disable background saves');expect(sdk.disable).not.toHaveBeenCalled()
|
|
41
|
+
})
|
|
42
|
+
test('administrator disable refreshes protected status and enable never resurrects grants',async()=>{
|
|
43
|
+
const sdk=facade(),{root}=mount(sdk,true);await settle()
|
|
44
|
+
button(root,'Disable background saves').click();await settle()
|
|
45
|
+
expect(sdk.disable).toHaveBeenCalledOnce();expect(root.textContent).toContain('Background saves are disabled.')
|
|
46
|
+
expect(root.textContent).not.toContain('/home/Exports')
|
|
47
|
+
button(root,'Enable background saves').click();await settle()
|
|
48
|
+
expect(sdk.enable).toHaveBeenCalledOnce();expect(root.textContent).toContain('You have no active destinations.')
|
|
49
|
+
})
|
|
50
|
+
test.each(['uncertain','interrupted'] as const)('%s is visible, retains the original job ID and offers no replay action',async state=>{
|
|
51
|
+
const sdk=facade([{job_id:'original-job',delegation_id:'mine',name:'export.csv',state}]),{root}=mount(sdk);await settle()
|
|
52
|
+
expect(root.textContent).toContain('original-job');expect(root.textContent).toContain('will not')
|
|
53
|
+
expect(root.textContent).not.toContain('Saved');expect(root.textContent).not.toContain('Retry')
|
|
54
|
+
button(root,'Refresh').click();await settle();expect(sdk.operations).toHaveBeenCalledTimes(2)
|
|
55
|
+
expect(sdk.selectDestination).not.toHaveBeenCalled();expect(sdk.cancel).not.toHaveBeenCalled()
|
|
56
|
+
})
|
|
57
|
+
test('only a committed executor receipt displays Saved and its destination',async()=>{
|
|
58
|
+
const sdk=facade([{job_id:'missing-receipt',delegation_id:'mine',name:'a',state:'committed'},{job_id:'done',delegation_id:'mine',name:'b',state:'committed',receipt:{path:'/home/Exports/b',size:1}}]),{root}=mount(sdk);await settle()
|
|
59
|
+
const missing=root.querySelector('[data-job-id="missing-receipt"]')!,done=root.querySelector('[data-job-id="done"]')!
|
|
60
|
+
expect(missing.textContent).toContain('Result unknown');expect(missing.textContent).not.toContain('Saved')
|
|
61
|
+
expect(done.textContent).toContain('Saved');expect(done.textContent).toContain('/home/Exports/b')
|
|
62
|
+
})
|
|
63
|
+
test('failed refresh removes stale authority, hides raw errors and allows a read-only retry',async()=>{
|
|
64
|
+
const sdk=facade(),{root}=mount(sdk,true);await settle()
|
|
65
|
+
sdk.status.mockRejectedValue({code:'AUTH_DENIED',message:'secret SID'})
|
|
66
|
+
button(root,'Refresh').click();await settle()
|
|
67
|
+
expect(root.querySelector('[role=alert]')?.textContent).toContain('Sign in to DSM again')
|
|
68
|
+
expect(root.textContent).not.toContain('secret SID');expect(root.textContent).not.toContain('/home/Exports')
|
|
69
|
+
expect(root.textContent).not.toContain('Enable background saves');expect(root.textContent).not.toContain('Disable background saves')
|
|
70
|
+
})
|
|
71
|
+
test('revoke is not announced until acknowledged and double clicks cannot duplicate a pending action',async()=>{
|
|
72
|
+
const sdk=facade();sdk.revoke.mockRejectedValue({code:'commit-uncertain'});const {root}=mount(sdk);await settle()
|
|
73
|
+
button(root,'Revoke access').click();button(root,'Revoke access').click();await settle()
|
|
74
|
+
expect(sdk.revoke).toHaveBeenCalledOnce();expect(root.textContent).not.toContain('Access revoked.')
|
|
75
|
+
expect(root.querySelector('[role=alert]')?.textContent).toContain('result is unknown')
|
|
76
|
+
})
|
|
77
|
+
test('cancel uses the original job reference and an unmount ignores late refresh results',async()=>{
|
|
78
|
+
const sdk=facade([{job_id:'queued-id',delegation_id:'mine',name:'export.csv',state:'queued'}]),{root,app}=mount(sdk);await settle()
|
|
79
|
+
button(root,'Cancel save').click();await settle();expect(sdk.cancel).toHaveBeenCalledExactlyOnceWith({delegation_id:'mine',job_id:'queued-id'})
|
|
80
|
+
const before=sdk.operations.mock.calls.length;app.unmount();await settle();expect(sdk.operations).toHaveBeenCalledTimes(before)
|
|
81
|
+
})
|
|
82
|
+
test('an acknowledged cancel shows Canceling until the original job is terminal, without a second cancel',async()=>{
|
|
83
|
+
const sdk=facade([{job_id:'copy-id',delegation_id:'mine',name:'export.csv',state:'copying',code:'CANCEL_REQUESTED',reason:'operation-canceled-by-user'}]),{root}=mount(sdk);await settle()
|
|
84
|
+
const row=root.querySelector('[data-job-id=copy-id]')!
|
|
85
|
+
expect(row.getAttribute('data-save-state')).toBe('canceling');expect(row.textContent).toContain(saveCopy().canceling)
|
|
86
|
+
expect(row.textContent).not.toContain(saveCopy().error);expect([...row.querySelectorAll('button')].map(b=>b.textContent)).not.toContain('Cancel save')
|
|
87
|
+
})
|
|
88
|
+
test('Traditional Chinese shows the uncertain recovery instruction',async()=>{
|
|
89
|
+
const sdk=facade([{job_id:'same-job',delegation_id:'mine',name:'export.csv',state:'uncertain'}]),{root}=mount(sdk,false,'zh-TW');await settle()
|
|
90
|
+
expect(root.textContent).toContain(saveCopy('zh-TW').uncertain);expect(root.textContent).toContain(saveCopy('zh-TW').uncertainHelp)
|
|
91
|
+
})
|
|
92
|
+
test('the generated capability surface uses the explicit long-running facade and preserves the legacy default',async()=>{
|
|
93
|
+
const sdk=facade(),call=vi.fn(async()=>{throw {code:'unexpected-legacy-call'}})
|
|
94
|
+
const root=document.createElement('div');document.body.append(root)
|
|
95
|
+
const app=createApp({render:()=>h(AppRoot,{},()=>h(CapabilityPanels,{ctx:{delegate:sdk,call,locale:'en'} as any,admin:false}))})
|
|
96
|
+
app.mount(root);cleanup.push(()=>{app.unmount();root.remove()});await settle()
|
|
97
|
+
expect(root.textContent).toContain('My destinations');expect(root.textContent).toContain('/home/Exports')
|
|
98
|
+
expect(root.querySelector('input[type=url]')).toBeNull();expect(call).not.toHaveBeenCalled()
|
|
99
|
+
})
|
|
100
|
+
test('the default generated long-running surface binds real routes and its existing session-only picker',async()=>{
|
|
101
|
+
const grant={id:'g1',key:'save',path:'/home',username:'normal1',lifetime:'until-revoked'}
|
|
102
|
+
let selected=false
|
|
103
|
+
const call=vi.fn(async(method:string)=>{
|
|
104
|
+
if(method==='delegate.status')return {state:'ready',disabled:false,lifetime:'until-revoked',destinations:['save']}
|
|
105
|
+
if(method==='delegate.destination')return {key:'save',selection:{scope:'home',root:'/home',generation:0},destination:selected?grant:null,status:selected?'active':'missing'}
|
|
106
|
+
if(method==='delegate.list')return {delegations:selected?[{delegation_id:'g1',destination:'save',path:'/home',subject:{username:'normal1'},lifetime:'until-revoked',revoked:false}]:[]}
|
|
107
|
+
if(method==='delegate.operations.list')return {operations:[]}
|
|
108
|
+
if(method==='bg.browse')return {shares:[{name:'home',path:'/home',isdir:true}],offset:0,total:1}
|
|
109
|
+
if(method==='delegate.select_destination'){selected=true;return grant}
|
|
110
|
+
throw {code:'unexpected'}
|
|
111
|
+
})
|
|
112
|
+
const root=document.createElement('div');document.body.append(root)
|
|
113
|
+
const app=createApp({render:()=>h(AppRoot,{},()=>h(CapabilityPanels,{ctx:{call,locale:'en'} as any,admin:false}))})
|
|
114
|
+
app.mount(root);cleanup.push(()=>{app.unmount();root.remove()});await settle()
|
|
115
|
+
expect(root.textContent).toContain('My destinations');expect(root.querySelector('input[type=url]')).toBeNull()
|
|
116
|
+
button(root,'Choose save destination (save)').click();await settle()
|
|
117
|
+
const select=[...root.querySelectorAll('button')].find(n=>n.getAttribute('aria-label')==='Select home')!;expect(select).toBeTruthy();select.click();await settle()
|
|
118
|
+
button(root,'Confirm selection').click();await settle()
|
|
119
|
+
expect(call).toHaveBeenCalledWith('delegate.select_destination',{key:'save',path:'/home'})
|
|
120
|
+
expect(root.textContent).toContain('/home');expect(root.querySelector('[role=dialog]')).toBeNull()
|
|
121
|
+
})
|
|
@@ -128,3 +128,18 @@ test('startup waiting catalog covers exactly nine distinct language messages',()
|
|
|
128
128
|
expect(Object.keys(waitingMessages).sort()).toEqual(['en','zh-TW','zh-CN','de','es','fr','it','ja','ko'].sort())
|
|
129
129
|
expect(new Set(Object.values(waitingMessages)).size).toBe(9)
|
|
130
130
|
})
|
|
131
|
+
test('a blocked approval shows the DSM reason, not only the generic unavailable text',async()=>{
|
|
132
|
+
const setup:ExecutorSetup={control:vi.fn(async()=>({state:'ready'})),status:vi.fn(async()=>({state:'needs-admin-approval'})),authorize:vi.fn(async()=>({state:'blocked',reason:'dsm_104: scheduler readback or operation failed.'}))}
|
|
133
|
+
const root=mount(ExecutorSettings,{admin:true},setup);await settle();const password=root.querySelector('input[type="password"]') as HTMLInputElement;password.value='once';password.dispatchEvent(new Event('input',{bubbles:true}));await settle();root.querySelector('form')!.dispatchEvent(new Event('submit',{bubbles:true,cancelable:true}));await settle()
|
|
134
|
+
expect(root.textContent).toContain('Background file access is unavailable.');expect(root.textContent).toContain('Details: dsm_104: scheduler readback or operation failed.')
|
|
135
|
+
})
|
|
136
|
+
test('a task that is only missing shows no extra details',async()=>{
|
|
137
|
+
const setup:ExecutorSetup={control:vi.fn(async()=>({state:'ready'})),status:vi.fn(async()=>({state:'needs-admin-approval',reason:'Task is missing.'})),authorize:vi.fn(async()=>({state:'ready'}))}
|
|
138
|
+
const root=mount(ExecutorSettings,{admin:true},setup);await settle();expect(root.textContent).not.toContain('Task is missing.')
|
|
139
|
+
})
|
|
140
|
+
test('settings follow an approval made from the window panel',async()=>{
|
|
141
|
+
let notify:((r:{state:'ready'})=>void)|undefined
|
|
142
|
+
const setup={control:vi.fn(async()=>({state:'ready'})),status:vi.fn(async()=>({state:'needs-admin-approval'})),authorize:vi.fn(async()=>({state:'ready'})),subscribe:(listener:any)=>{notify=listener}} as ExecutorSetup
|
|
143
|
+
const root=mount(ExecutorSettings,{admin:true},setup);await settle();expect(root.textContent).toContain('An administrator must approve')
|
|
144
|
+
notify!({state:'ready'});await settle();expect(root.textContent).toContain('Background file access is ready.')
|
|
145
|
+
})
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import {afterEach,expect,test,vi} from 'vitest'
|
|
3
|
+
import {createApp,h,nextTick} from 'vue'
|
|
4
|
+
import {AppRoot} from '@synopackageland/ui'
|
|
5
|
+
import ExecutorSettings from '../src/delegate/ExecutorSettings.vue'
|
|
6
|
+
import {ExecutorSetupKey} from '../src/delegate/executor-setup'
|
|
7
|
+
const cleanup:Array<()=>void>=[]
|
|
8
|
+
afterEach(()=>cleanup.splice(0).forEach(fn=>fn()))
|
|
9
|
+
async function settle(){for(let i=0;i<40;i++){await Promise.resolve();await nextTick()}}
|
|
10
|
+
function mount(approved=false,admin=true,tasksReady=false){
|
|
11
|
+
const status=vi.fn(async()=>({state:approved||tasksReady?'ready':'needs-admin-approval'}))
|
|
12
|
+
const authorize=vi.fn(async(_pw:string,_scope?:string)=>{approved=true;return {state:'ready'}})
|
|
13
|
+
const call=vi.fn(async(method:string)=>{
|
|
14
|
+
if(method==='delegate.status')return {scope_mode:'install-selected',preselection:'shared:draft',mismatch:approved,selection:approved?{scope:'shared:reports',root:'/reports',generation:1}:null}
|
|
15
|
+
if(method==='bg.browse')return {shares:[{name:'reports',path:'/reports',isdir:true},{name:'draft',path:'/draft',isdir:true}],offset:0,total:2}
|
|
16
|
+
throw {code:'unexpected'}
|
|
17
|
+
})
|
|
18
|
+
const root=document.createElement('div');document.body.append(root)
|
|
19
|
+
const app=createApp({render:()=>h(AppRoot,{},()=>h(ExecutorSettings,{admin,locale:'en',ctx:{call} as any}))})
|
|
20
|
+
app.provide(ExecutorSetupKey,{status,authorize,control:vi.fn() as any});app.mount(root)
|
|
21
|
+
cleanup.push(()=>{app.unmount();root.remove()});return {root,authorize,call}
|
|
22
|
+
}
|
|
23
|
+
test('first approval displays installer preselection and confirms it with the existing password form',async()=>{
|
|
24
|
+
const {root,authorize}=mount();await settle()
|
|
25
|
+
expect(root.textContent).toContain('draft');expect(root.textContent).toContain('pre-selection')
|
|
26
|
+
expect(root.querySelectorAll('input[type=password]')).toHaveLength(1)
|
|
27
|
+
const input=root.querySelector('input[type=password]') as HTMLInputElement;input.value='entered';input.dispatchEvent(new Event('input',{bubbles:true}));await settle()
|
|
28
|
+
root.querySelector('form')!.dispatchEvent(new Event('submit',{cancelable:true,bubbles:true}));await settle()
|
|
29
|
+
expect(authorize).toHaveBeenCalledExactlyOnceWith('entered','shared:draft');expect(input.value).toBe('')
|
|
30
|
+
})
|
|
31
|
+
test('Settings follows protected scope, shows mismatch and uses the same single password form',async()=>{
|
|
32
|
+
const {root,authorize}=mount(true);await settle()
|
|
33
|
+
expect(root.textContent).toContain('/reports');expect(root.textContent).toContain('differs');expect(root.textContent).toContain('draft')
|
|
34
|
+
expect(root.querySelectorAll('input[type=password]')).toHaveLength(1)
|
|
35
|
+
expect(root.querySelectorAll('[role=dialog]')).toHaveLength(0)
|
|
36
|
+
expect(authorize).not.toHaveBeenCalled()
|
|
37
|
+
})
|
|
38
|
+
test('ordinary users cannot load or change scope settings',async()=>{
|
|
39
|
+
const {root,authorize,call}=mount(true,false);await settle()
|
|
40
|
+
expect(root.querySelector('input')).toBeNull();expect(call).not.toHaveBeenCalled();expect(authorize).not.toHaveBeenCalled()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('ready tasks without protected scope show confirmation status and its action',async()=>{
|
|
44
|
+
const {root}=mount(false,true,true);await settle()
|
|
45
|
+
expect(root.querySelector('[role=status]')?.textContent).toContain('Share needs confirmation')
|
|
46
|
+
expect(root.textContent).not.toContain('Background file access is ready.')
|
|
47
|
+
expect(root.querySelector('input[type=password]')).toBeTruthy()
|
|
48
|
+
expect(root.textContent).toContain('Confirm share')
|
|
49
|
+
})
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
repo=$(cd "$(dirname "$0")/../../../.." && pwd)
|
|
5
5
|
overlay="$repo/packages/app-cli/templates/native-go-delegate"
|
|
6
|
+
export SYNOPKGLAND_EXECUTOR_SOURCE="$repo/packages/app-cli/templates/_executor"
|
|
6
7
|
fixture=$(mktemp -d "${TMPDIR:-/tmp}/delegate.XXXXXX")
|
|
7
8
|
trap 'rm -rf "$fixture"' EXIT
|
|
8
9
|
cp -R "$repo/packages/app-cli/templates/native-go/backend" "$fixture/backend"
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"state_failed": "Fehlgeschlagen",
|
|
21
21
|
"state_canceled": "Abgebrochen",
|
|
22
22
|
"state_interrupted": "Unterbrochen",
|
|
23
|
-
"limits": "Bis zu {size}
|
|
23
|
+
"limits": "Bis zu {size} KB pro Datei, {queue} Aufträge in der Warteschlange, {seconds} Sekunden pro Auftrag.",
|
|
24
24
|
"errors": {
|
|
25
25
|
"jobs_busy": "Das System ist beschäftigt. Bitte versuchen Sie es später erneut.",
|
|
26
26
|
"failed": "Die Anfrage konnte nicht abgeschlossen werden. Aktualisieren und erneut versuchen.",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "Sie können nur eigene Aufträge sehen, abbrechen und herunterladen.",
|
|
42
42
|
"adminScope": "Administratoren können Aufträge aller Benutzer sehen und abbrechen.",
|
|
43
|
-
"ownerLimits": "Pro Benutzer: {jobs} offene Aufträge und {size}
|
|
43
|
+
"ownerLimits": "Pro Benutzer: {jobs} offene Aufträge und {size} KB für Eingaben und reservierte Ergebnisse.",
|
|
44
44
|
"owner": "Besitzer: {user} (UID {uid})",
|
|
45
45
|
"purgeOwner": "Aufträge des Besitzers löschen",
|
|
46
46
|
"purgeConfirm": "Alle Aufträge von {user} (UID {uid}) löschen? Laufende Aufträge werden abgebrochen und beendet; gespeicherte Ergebnisse werden entfernt.",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"state_failed": "Failed",
|
|
21
21
|
"state_canceled": "Canceled",
|
|
22
22
|
"state_interrupted": "Interrupted",
|
|
23
|
-
"limits": "Up to {size}
|
|
23
|
+
"limits": "Up to {size} KB per file, {queue} queued jobs, {seconds} seconds per job.",
|
|
24
24
|
"errors": {
|
|
25
25
|
"jobs_busy": "Busy, please try again later.",
|
|
26
26
|
"failed": "The request could not be completed. Refresh and try again.",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "You can see, cancel and download only your own jobs.",
|
|
42
42
|
"adminScope": "Administrators can see and cancel every user’s jobs.",
|
|
43
|
-
"ownerLimits": "Per user: {jobs} pending jobs and {size}
|
|
43
|
+
"ownerLimits": "Per user: {jobs} pending jobs and {size} KB of input and reserved result storage.",
|
|
44
44
|
"owner": "Owner: {user} (UID {uid})",
|
|
45
45
|
"purgeOwner": "Clear owner’s jobs",
|
|
46
46
|
"purgeConfirm": "Clear all jobs owned by {user} (UID {uid})? Running jobs are canceled and drained; this removes their saved results.",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Trabajos en segundo plano",
|
|
3
|
-
"help": "Copia un archivo seleccionado al paquete y calcula su SHA-256 con la cuenta del paquete. Los trabajos continúan al cerrar sesión. El paquete conserva la copia y el resultado; cambiar los permisos de origen no los retira.
|
|
3
|
+
"help": "Copia un archivo seleccionado al paquete y calcula su SHA-256 con la cuenta del paquete. Los trabajos continúan al cerrar sesión. El paquete conserva la copia y el resultado; cambiar los permisos de origen no los retira. Inicie sesión de nuevo para ver su resultado.",
|
|
4
4
|
"worker": "Worker",
|
|
5
5
|
"workerRunning": "El worker se ejecuta como {user}",
|
|
6
6
|
"workerStopped": "El worker no se está ejecutando",
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"state_failed": "Error",
|
|
21
21
|
"state_canceled": "Cancelado",
|
|
22
22
|
"state_interrupted": "Interrumpido",
|
|
23
|
-
"limits": "Hasta {size}
|
|
23
|
+
"limits": "Hasta {size} KB por archivo, {queue} trabajos en cola, {seconds} segundos por trabajo.",
|
|
24
24
|
"errors": {
|
|
25
|
-
"jobs_busy": "
|
|
25
|
+
"jobs_busy": "Sistema ocupado. Vuelva a intentarlo más tarde.",
|
|
26
26
|
"failed": "No se pudo completar la solicitud. Actualice e inténtelo de nuevo.",
|
|
27
27
|
"limit-exceeded": "El archivo supera el límite.",
|
|
28
28
|
"queue-full": "La cola está llena.",
|
|
@@ -31,16 +31,16 @@
|
|
|
31
31
|
"not_found": "No encontrado.",
|
|
32
32
|
"denied": "Acceso denegado.",
|
|
33
33
|
"session_required": "Su sesión de DSM caducó. Inicie sesión de nuevo.",
|
|
34
|
-
"owner-queue-full": "
|
|
35
|
-
"owner-quota-exceeded": "
|
|
36
|
-
"identity_unavailable": "No se pudo verificar
|
|
34
|
+
"owner-queue-full": "Ha alcanzado el límite de trabajos pendientes. Espere a que termine uno o cancele uno.",
|
|
35
|
+
"owner-quota-exceeded": "Ha alcanzado el límite de almacenamiento. Pida a un administrador que borre sus trabajos antiguos.",
|
|
36
|
+
"identity_unavailable": "No se pudo verificar su UID de usuario DSM. Inicie sesión de nuevo o contacte con un administrador.",
|
|
37
37
|
"schedule-full": "Se alcanzó el límite de 8 programaciones. Elimine una.",
|
|
38
38
|
"input-unavailable": "La copia privada no está disponible o cambió. Impórtela de nuevo.",
|
|
39
|
-
"unsupported": "Los trabajos en segundo plano no están disponibles.
|
|
39
|
+
"unsupported": "Los trabajos en segundo plano no están disponibles. Actualice e inténtelo de nuevo."
|
|
40
40
|
},
|
|
41
|
-
"ownerScope": "Solo
|
|
41
|
+
"ownerScope": "Solo puede ver, cancelar y descargar sus propios trabajos.",
|
|
42
42
|
"adminScope": "Los administradores pueden ver y cancelar los trabajos de todos los usuarios.",
|
|
43
|
-
"ownerLimits": "Por usuario: {jobs} trabajos pendientes y {size}
|
|
43
|
+
"ownerLimits": "Por usuario: {jobs} trabajos pendientes y {size} KB para entradas y resultados reservados.",
|
|
44
44
|
"owner": "Propietario: {user} (UID {uid})",
|
|
45
45
|
"purgeOwner": "Borrar trabajos del propietario",
|
|
46
46
|
"purgeConfirm": "¿Borrar todos los trabajos de {user} (UID {uid})? Los trabajos en curso se cancelarán y terminarán; se eliminarán los resultados guardados.",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"scheduleConsent": "Acepto conservar esta copia fija y recalcularla como usuario del paquete. No se leen nuevos archivos de origen ni ACL personales.",
|
|
58
58
|
"createSchedule": "Crear programación",
|
|
59
59
|
"noSchedules": "No hay programaciones",
|
|
60
|
-
"scheduleOn": "
|
|
61
|
-
"scheduleOff": "
|
|
60
|
+
"scheduleOn": "Habilitado",
|
|
61
|
+
"scheduleOff": "Deshabilitado",
|
|
62
62
|
"nextRun": "Próxima ejecución: {time}",
|
|
63
63
|
"missedRuns": "Ejecuciones perdidas: {count}",
|
|
64
64
|
"disableSchedule": "Desactivar programación",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"revisionChanged": "La revisión del worker cambió. Un administrador debe revisar y activar explícitamente esta programación.",
|
|
72
72
|
"scheduledJob": "Ejecución programada",
|
|
73
73
|
"unknownTime": "Desconocida",
|
|
74
|
-
"unsupported": "Los trabajos en segundo plano no están disponibles.
|
|
74
|
+
"unsupported": "Los trabajos en segundo plano no están disponibles. Actualice e inténtelo de nuevo."
|
|
75
75
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"state_failed": "Échec",
|
|
21
21
|
"state_canceled": "Annulée",
|
|
22
22
|
"state_interrupted": "Interrompue",
|
|
23
|
-
"limits": "Jusqu’à {size}
|
|
23
|
+
"limits": "Jusqu’à {size} KB par fichier, {queue} tâches en attente, {seconds} secondes par tâche.",
|
|
24
24
|
"errors": {
|
|
25
25
|
"jobs_busy": "Le système est occupé. Veuillez réessayer plus tard.",
|
|
26
26
|
"failed": "La requête n’a pas pu aboutir. Actualisez puis réessayez.",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "Vous pouvez voir, annuler et télécharger uniquement vos propres tâches.",
|
|
42
42
|
"adminScope": "Les administrateurs peuvent voir et annuler les tâches de tous les utilisateurs.",
|
|
43
|
-
"ownerLimits": "Par utilisateur : {jobs} tâches en attente et {size}
|
|
43
|
+
"ownerLimits": "Par utilisateur : {jobs} tâches en attente et {size} KB pour les entrées et résultats réservés.",
|
|
44
44
|
"owner": "Propriétaire : {user} (UID {uid})",
|
|
45
45
|
"purgeOwner": "Effacer les tâches du propriétaire",
|
|
46
46
|
"purgeConfirm": "Effacer toutes les tâches de {user} (UID {uid}) ? Les tâches en cours seront annulées et terminées ; les résultats enregistrés seront supprimés.",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"scheduleConsent": "J’accepte de conserver cette copie fixe et de la recalculer avec le compte du paquet. Aucun nouveau fichier source ni ACL personnel n’est lu.",
|
|
58
58
|
"createSchedule": "Créer la planification",
|
|
59
59
|
"noSchedules": "Aucune planification",
|
|
60
|
-
"scheduleOn": "
|
|
61
|
-
"scheduleOff": "
|
|
60
|
+
"scheduleOn": "Activé",
|
|
61
|
+
"scheduleOff": "Désactivé",
|
|
62
62
|
"nextRun": "Prochaine exécution : {time}",
|
|
63
63
|
"missedRuns": "Exécutions manquées : {count}",
|
|
64
64
|
"disableSchedule": "Désactiver la planification",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "Processi in background",
|
|
3
|
-
"help": "Copia un file selezionato nel pacchetto e calcola il suo SHA-256 con l’account del pacchetto. I processi continuano dopo la disconnessione. Il pacchetto conserva copia e risultato; i cambiamenti ai permessi di origine non li revocano.
|
|
3
|
+
"help": "Copia un file selezionato nel pacchetto e calcola il suo SHA-256 con l’account del pacchetto. I processi continuano dopo la disconnessione. Il pacchetto conserva copia e risultato; i cambiamenti ai permessi di origine non li revocano. Accedere di nuovo per vedere il proprio risultato.",
|
|
4
4
|
"worker": "Worker",
|
|
5
5
|
"workerRunning": "Il worker è in esecuzione come {user}",
|
|
6
6
|
"workerStopped": "Il worker non è in esecuzione",
|
|
@@ -20,27 +20,27 @@
|
|
|
20
20
|
"state_failed": "Non riuscito",
|
|
21
21
|
"state_canceled": "Annullato",
|
|
22
22
|
"state_interrupted": "Interrotto",
|
|
23
|
-
"limits": "Fino a {size}
|
|
23
|
+
"limits": "Fino a {size} KB per file, {queue} processi in coda, {seconds} secondi per processo.",
|
|
24
24
|
"errors": {
|
|
25
|
-
"jobs_busy": "
|
|
26
|
-
"failed": "Impossibile completare la richiesta.
|
|
25
|
+
"jobs_busy": "Sistema occupato. Riprovare in seguito.",
|
|
26
|
+
"failed": "Impossibile completare la richiesta. Aggiornare e riprovare.",
|
|
27
27
|
"limit-exceeded": "Il file supera il limite.",
|
|
28
28
|
"queue-full": "La coda è piena.",
|
|
29
29
|
"quota-exceeded": "Lo spazio di archiviazione in background è pieno.",
|
|
30
|
-
"conflict": "Lo stato del processo è cambiato.
|
|
30
|
+
"conflict": "Lo stato del processo è cambiato. Aggiornare.",
|
|
31
31
|
"not_found": "Non trovato.",
|
|
32
32
|
"denied": "Accesso negato.",
|
|
33
|
-
"session_required": "La sessione DSM è scaduta.
|
|
34
|
-
"owner-queue-full": "
|
|
35
|
-
"owner-quota-exceeded": "
|
|
36
|
-
"identity_unavailable": "Impossibile verificare l’UID dell’utente DSM.
|
|
37
|
-
"schedule-full": "Limite di 8 pianificazioni raggiunto.
|
|
38
|
-
"input-unavailable": "La copia privata non è disponibile o è cambiata.
|
|
39
|
-
"unsupported": "I processi in background non sono disponibili.
|
|
33
|
+
"session_required": "La sessione DSM è scaduta. Accedere di nuovo.",
|
|
34
|
+
"owner-queue-full": "È stato raggiunto il limite dei processi in attesa. Attendere il completamento di un processo o annullarne uno.",
|
|
35
|
+
"owner-quota-exceeded": "È stato raggiunto il limite di archiviazione. Chiedere a un amministratore di cancellare i vecchi processi.",
|
|
36
|
+
"identity_unavailable": "Impossibile verificare l’UID dell’utente DSM. Accedere di nuovo o contattare un amministratore.",
|
|
37
|
+
"schedule-full": "Limite di 8 pianificazioni raggiunto. Eliminarne una.",
|
|
38
|
+
"input-unavailable": "La copia privata non è disponibile o è cambiata. Importarla di nuovo.",
|
|
39
|
+
"unsupported": "I processi in background non sono disponibili. Aggiornare e riprovare."
|
|
40
40
|
},
|
|
41
|
-
"ownerScope": "
|
|
41
|
+
"ownerScope": "È possibile vedere, annullare e scaricare solo i propri processi.",
|
|
42
42
|
"adminScope": "Gli amministratori possono vedere e annullare i processi di tutti gli utenti.",
|
|
43
|
-
"ownerLimits": "Per utente: {jobs} processi in attesa e {size}
|
|
43
|
+
"ownerLimits": "Per utente: {jobs} processi in attesa e {size} KB per input e risultati riservati.",
|
|
44
44
|
"owner": "Proprietario: {user} (UID {uid})",
|
|
45
45
|
"purgeOwner": "Cancella processi del proprietario",
|
|
46
46
|
"purgeConfirm": "Cancellare tutti i processi di {user} (UID {uid})? I processi in corso saranno annullati e terminati; i risultati salvati saranno rimossi.",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"scheduleConsent": "Acconsento a conservare questa copia fissa e a ricalcolarla come utente del pacchetto. Non vengono letti nuovi file di origine o ACL personali.",
|
|
58
58
|
"createSchedule": "Crea pianificazione",
|
|
59
59
|
"noSchedules": "Nessuna pianificazione",
|
|
60
|
-
"scheduleOn": "
|
|
61
|
-
"scheduleOff": "
|
|
60
|
+
"scheduleOn": "Abilitato",
|
|
61
|
+
"scheduleOff": "Disabilitato",
|
|
62
62
|
"nextRun": "Prossima esecuzione: {time}",
|
|
63
63
|
"missedRuns": "Esecuzioni perse: {count}",
|
|
64
64
|
"disableSchedule": "Disattiva pianificazione",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"revisionChanged": "La revisione del worker è cambiata. Un amministratore deve verificare e attivare esplicitamente questa pianificazione.",
|
|
72
72
|
"scheduledJob": "Esecuzione pianificata",
|
|
73
73
|
"unknownTime": "Sconosciuta",
|
|
74
|
-
"unsupported": "I processi in background non sono disponibili.
|
|
74
|
+
"unsupported": "I processi in background non sono disponibili. Aggiornare e riprovare."
|
|
75
75
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"pickerTitle": "インポートするファイルを選択",
|
|
10
10
|
"pickerConsent": "選択したファイルは現在の DSM サインインで一度だけ読み取られ、バックグラウンドジョブに渡されます。権限は保存されません。",
|
|
11
11
|
"submit": "インポートして送信",
|
|
12
|
-
"refresh": "
|
|
12
|
+
"refresh": "最新の情報に更新",
|
|
13
13
|
"cancel": "キャンセル",
|
|
14
14
|
"result": "結果",
|
|
15
15
|
"download": "結果をダウンロード",
|
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
"state_failed": "失敗",
|
|
21
21
|
"state_canceled": "キャンセル済み",
|
|
22
22
|
"state_interrupted": "中断",
|
|
23
|
-
"limits": "1 ファイル最大 {size}
|
|
23
|
+
"limits": "1 ファイル最大 {size} KB、キュー {queue} 件、1 ジョブ {seconds} 秒。",
|
|
24
24
|
"errors": {
|
|
25
25
|
"jobs_busy": "処理が混み合っています。しばらくしてから再試行してください。",
|
|
26
|
-
"failed": "
|
|
26
|
+
"failed": "要求を完了できませんでした。最新の情報に更新して再試行してください。",
|
|
27
27
|
"limit-exceeded": "ファイルが上限を超えています。",
|
|
28
28
|
"queue-full": "キューがいっぱいです。",
|
|
29
29
|
"quota-exceeded": "バックグラウンド用の容量がいっぱいです。",
|
|
30
|
-
"conflict": "
|
|
30
|
+
"conflict": "ジョブの状態が変わりました。最新の情報に更新してください。",
|
|
31
31
|
"not_found": "見つかりません。",
|
|
32
32
|
"denied": "アクセスが拒否されました。",
|
|
33
33
|
"session_required": "DSM セッションの有効期限が切れました。再度サインインしてください。",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"identity_unavailable": "DSM ユーザーの UID を確認できません。再度サインインするか、管理者に連絡してください。",
|
|
37
37
|
"schedule-full": "スケジュールは最大 8 件です。削除してください。",
|
|
38
38
|
"input-unavailable": "非公開コピーがないか変更されています。再度インポートしてください。",
|
|
39
|
-
"unsupported": "
|
|
39
|
+
"unsupported": "バックグラウンドジョブを利用できません。最新の情報に更新して再試行してください。"
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "自分のジョブのみ表示、キャンセル、ダウンロードできます。",
|
|
42
42
|
"adminScope": "管理者はすべてのユーザーのジョブを表示、キャンセルできます。",
|
|
43
|
-
"ownerLimits": "ユーザーごとの上限:保留中 {jobs} 件、入力と予約済み結果の保存領域 {size}
|
|
43
|
+
"ownerLimits": "ユーザーごとの上限:保留中 {jobs} 件、入力と予約済み結果の保存領域 {size} KB。",
|
|
44
44
|
"owner": "所有者:{user}(UID {uid})",
|
|
45
45
|
"purgeOwner": "所有者のジョブを消去",
|
|
46
46
|
"purgeConfirm": "{user}(UID {uid})の全ジョブを消去しますか?実行中のジョブはキャンセルして終了を待ち、保存済み結果は削除します。",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"revisionChanged": "ワーカーのリビジョンが変更されました。管理者が確認して明示的に有効にしてください。",
|
|
72
72
|
"scheduledJob": "定期実行",
|
|
73
73
|
"unknownTime": "不明",
|
|
74
|
-
"unsupported": "
|
|
74
|
+
"unsupported": "バックグラウンドジョブを利用できません。最新の情報に更新して再試行してください。"
|
|
75
75
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"title": "백그라운드 작업",
|
|
3
|
-
"help": "선택한 파일 하나를 패키지에 복사하고 패키지 계정으로 SHA-256을 계산합니다. 로그아웃 후에도 작업은 계속됩니다. 복사본과 결과는 패키지가 보관하며 원본 권한 변경으로 회수되지 않습니다. 다시 로그인하여 자신의 결과를
|
|
3
|
+
"help": "선택한 파일 하나를 패키지에 복사하고 패키지 계정으로 SHA-256을 계산합니다. 로그아웃 후에도 작업은 계속됩니다. 복사본과 결과는 패키지가 보관하며 원본 권한 변경으로 회수되지 않습니다. 다시 로그인하여 자신의 결과를 확인하십시오.",
|
|
4
4
|
"worker": "워커",
|
|
5
5
|
"workerRunning": "워커가 {user} 계정으로 실행 중",
|
|
6
6
|
"workerStopped": "워커가 실행 중이 아닙니다",
|
|
@@ -20,27 +20,27 @@
|
|
|
20
20
|
"state_failed": "실패",
|
|
21
21
|
"state_canceled": "취소됨",
|
|
22
22
|
"state_interrupted": "중단됨",
|
|
23
|
-
"limits": "파일당 최대 {size}
|
|
23
|
+
"limits": "파일당 최대 {size} KB, 대기 {queue}개, 작업당 {seconds}초.",
|
|
24
24
|
"errors": {
|
|
25
|
-
"jobs_busy": "
|
|
26
|
-
"failed": "요청을 완료할 수 없습니다. 새로 고친 후 다시
|
|
25
|
+
"jobs_busy": "시스템이 사용 중입니다. 나중에 다시 시도하십시오.",
|
|
26
|
+
"failed": "요청을 완료할 수 없습니다. 새로 고친 후 다시 시도하십시오.",
|
|
27
27
|
"limit-exceeded": "파일이 한도를 초과했습니다.",
|
|
28
28
|
"queue-full": "대기열이 가득 찼습니다.",
|
|
29
29
|
"quota-exceeded": "백그라운드 저장 공간이 가득 찼습니다.",
|
|
30
|
-
"conflict": "작업 상태가 변경되었습니다. 새로
|
|
30
|
+
"conflict": "작업 상태가 변경되었습니다. 새로 고치십시오.",
|
|
31
31
|
"not_found": "찾을 수 없습니다.",
|
|
32
32
|
"denied": "액세스가 거부되었습니다.",
|
|
33
|
-
"session_required": "DSM 세션이 만료되었습니다. 다시
|
|
34
|
-
"owner-queue-full": "대기 작업 한도에 도달했습니다. 완료를 기다리거나 작업 하나를
|
|
35
|
-
"owner-quota-exceeded": "저장 공간 한도에 도달했습니다. 관리자에게 이전 작업 삭제를
|
|
36
|
-
"identity_unavailable": "DSM 사용자 UID를 확인할 수 없습니다. 다시 로그인하거나 관리자에게
|
|
37
|
-
"schedule-full": "일정은 최대 8개입니다. 일정을
|
|
38
|
-
"input-unavailable": "비공개 사본이 없거나 변경되었습니다. 다시
|
|
39
|
-
"unsupported": "백그라운드 작업을 사용할 수 없습니다. 새로 고친 후 다시
|
|
33
|
+
"session_required": "DSM 세션이 만료되었습니다. 다시 로그인하십시오.",
|
|
34
|
+
"owner-queue-full": "대기 작업 한도에 도달했습니다. 완료를 기다리거나 작업 하나를 취소하십시오.",
|
|
35
|
+
"owner-quota-exceeded": "저장 공간 한도에 도달했습니다. 관리자에게 이전 작업 삭제를 요청하십시오.",
|
|
36
|
+
"identity_unavailable": "DSM 사용자 UID를 확인할 수 없습니다. 다시 로그인하거나 관리자에게 문의하십시오.",
|
|
37
|
+
"schedule-full": "일정은 최대 8개입니다. 일정을 삭제하십시오.",
|
|
38
|
+
"input-unavailable": "비공개 사본이 없거나 변경되었습니다. 다시 가져오십시오.",
|
|
39
|
+
"unsupported": "백그라운드 작업을 사용할 수 없습니다. 새로 고친 후 다시 시도하십시오."
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "자신의 작업만 보고 취소하고 다운로드할 수 있습니다.",
|
|
42
42
|
"adminScope": "관리자는 모든 사용자의 작업을 보고 취소할 수 있습니다.",
|
|
43
|
-
"ownerLimits": "사용자당 한도: 대기 중인 작업 {jobs}개, 입력 및 결과 예약 저장 공간 {size}
|
|
43
|
+
"ownerLimits": "사용자당 한도: 대기 중인 작업 {jobs}개, 입력 및 결과 예약 저장 공간 {size} KB.",
|
|
44
44
|
"owner": "소유자: {user} (UID {uid})",
|
|
45
45
|
"purgeOwner": "소유자의 작업 지우기",
|
|
46
46
|
"purgeConfirm": "{user} (UID {uid})의 모든 작업을 지울까요? 실행 중인 작업은 취소 후 종료를 기다리며 저장된 결과는 삭제됩니다.",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"createSchedule": "일정 만들기",
|
|
59
59
|
"noSchedules": "일정 없음",
|
|
60
60
|
"scheduleOn": "활성화됨",
|
|
61
|
-
"scheduleOff": "
|
|
61
|
+
"scheduleOff": "사용 안함",
|
|
62
62
|
"nextRun": "다음 실행: {time}",
|
|
63
63
|
"missedRuns": "놓친 실행: {count}회",
|
|
64
64
|
"disableSchedule": "일정 비활성화",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"revisionChanged": "작업자 리비전이 변경되었습니다. 관리자가 검토하고 명시적으로 활성화해야 합니다.",
|
|
72
72
|
"scheduledJob": "예약 실행",
|
|
73
73
|
"unknownTime": "알 수 없음",
|
|
74
|
-
"unsupported": "백그라운드 작업을 사용할 수 없습니다. 새로 고친 후 다시
|
|
74
|
+
"unsupported": "백그라운드 작업을 사용할 수 없습니다. 새로 고친 후 다시 시도하십시오."
|
|
75
75
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"state_failed": "失败",
|
|
21
21
|
"state_canceled": "已取消",
|
|
22
22
|
"state_interrupted": "已中断",
|
|
23
|
-
"limits": "每个文件最多 {size}
|
|
23
|
+
"limits": "每个文件最多 {size} KB、最多 {queue} 个排队任务、每个任务最长 {seconds} 秒。",
|
|
24
24
|
"errors": {
|
|
25
25
|
"jobs_busy": "忙碌中,请稍后重试",
|
|
26
26
|
"failed": "无法完成请求。请刷新后重试。",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "你只能查看、取消及下载自己的任务。",
|
|
42
42
|
"adminScope": "管理员可查看及取消所有用户的任务。",
|
|
43
|
-
"ownerLimits": "每人上限:{jobs} 个待处理任务、{size}
|
|
43
|
+
"ownerLimits": "每人上限:{jobs} 个待处理任务、{size} KB 输入与预留结果存储。",
|
|
44
44
|
"owner": "所有者:{user}(UID {uid})",
|
|
45
45
|
"purgeOwner": "清除所有者的任务",
|
|
46
46
|
"purgeConfirm": "清除 {user}(UID {uid})的所有任务?运行中的任务会取消并等待结束;已保存的结果会移除。",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"scheduleConsent": "我同意保留此固定副本,并由套件账户重新计算。不读取新来源文件或个人 ACL。",
|
|
58
58
|
"createSchedule": "创建计划",
|
|
59
59
|
"noSchedules": "暂无计划",
|
|
60
|
-
"scheduleOn": "
|
|
60
|
+
"scheduleOn": "已启动",
|
|
61
61
|
"scheduleOff": "已停用",
|
|
62
62
|
"nextRun": "下次执行:{time}",
|
|
63
63
|
"missedRuns": "错过执行:{count} 次",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"state_failed": "失敗",
|
|
21
21
|
"state_canceled": "已取消",
|
|
22
22
|
"state_interrupted": "已中斷",
|
|
23
|
-
"limits": "每個檔案最多 {size}
|
|
23
|
+
"limits": "每個檔案最多 {size} KB、最多 {queue} 個排隊工作、每個工作最長 {seconds} 秒。",
|
|
24
24
|
"errors": {
|
|
25
25
|
"jobs_busy": "忙碌中,請稍後重試",
|
|
26
26
|
"failed": "無法完成要求。請重新整理後再試。",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"ownerScope": "你只能檢視、取消及下載自己的工作。",
|
|
42
42
|
"adminScope": "管理員可檢視及取消所有使用者的工作。",
|
|
43
|
-
"ownerLimits": "每人上限:{jobs} 個待處理工作、{size}
|
|
43
|
+
"ownerLimits": "每人上限:{jobs} 個待處理工作、{size} KB 輸入與預留結果儲存。",
|
|
44
44
|
"owner": "擁有者:{user}(UID {uid})",
|
|
45
45
|
"purgeOwner": "清除擁有者的工作",
|
|
46
46
|
"purgeConfirm": "清除 {user}(UID {uid})的所有工作?執行中的工作會取消並等待結束;已儲存的結果會移除。",
|