@synopackageland/cli 0.8.0 → 0.9.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/CHANGELOG.md +124 -0
- package/README.md +26 -4
- package/dist/add.js +4 -17
- package/dist/authorization-sdk.d.ts +0 -1
- package/dist/authorization-sdk.js +0 -1
- package/dist/build-spk/gateway.js +2 -2
- package/dist/build-spk/notices.js +12 -8
- package/dist/capability-overlays.d.ts +15 -0
- package/dist/capability-overlays.js +18 -0
- package/dist/cli-version.d.ts +2 -0
- package/dist/cli-version.js +3 -0
- package/dist/cli.js +3 -1
- package/dist/error-registry.js +12 -4
- package/dist/info.js +2 -1
- package/dist/init.js +52 -58
- package/dist/reproducible.js +1 -1
- package/dist/runtime/delegate-contract.d.ts +15 -0
- package/dist/runtime/delegate-contract.js +2 -0
- package/dist/runtime/executor-build.d.ts +15 -1
- package/dist/runtime/executor-build.js +42 -11
- package/dist/runtime/executor-digests.json +13 -0
- package/dist/runtime/executor-inspect.d.ts +1 -0
- package/dist/runtime/executor-inspect.js +5 -2
- package/dist/runtime/executor-policy.d.ts +3 -1
- package/dist/runtime/executor-policy.js +7 -2
- package/dist/runtime/executor-source.d.ts +21 -0
- package/dist/runtime/executor-source.js +35 -0
- package/dist/runtime/executor-tasks.d.ts +5 -2
- package/dist/runtime/executor-tasks.js +6 -4
- package/dist/runtime/sdk-source.d.ts +31 -0
- package/dist/runtime/sdk-source.js +92 -0
- package/dist/standalone/api-permissions.d.ts +4 -1
- package/dist/standalone/api-permissions.js +10 -18
- package/dist/standalone/build.d.ts +1 -0
- package/dist/standalone/build.js +11 -4
- package/dist/standalone/daemon.js +2 -2
- package/dist/standalone/dsm-window.js +2 -2
- package/dist/standalone/manifest.d.ts +5 -2
- package/dist/standalone/manifest.js +9 -3
- package/dist/standalone/root-window.d.ts +1 -1
- package/dist/standalone/root-window.js +0 -1
- package/dist/standalone/sdk-check.d.ts +9 -0
- package/dist/standalone/sdk-check.js +43 -0
- package/dist/standalone/spk.js +1 -1
- package/dist/template-paths.d.ts +7 -2
- package/dist/template-paths.js +18 -6
- package/package.json +13 -3
- package/dist/templates/_executor/README.md +0 -318
- package/dist/templates/_executor/anchor.go +0 -156
- package/dist/templates/_executor/anchor_test.go +0 -161
- package/dist/templates/_executor/apppriv_review_test.go +0 -28
- package/dist/templates/_executor/auth_presence_review_test.go +0 -38
- package/dist/templates/_executor/cancel_contract_test.go +0 -236
- package/dist/templates/_executor/cmd/lifecycle/main.go +0 -42
- package/dist/templates/_executor/cookie_review_test.go +0 -27
- package/dist/templates/_executor/copy.go +0 -64
- package/dist/templates/_executor/copy_test.go +0 -88
- package/dist/templates/_executor/digest_review_test.go +0 -120
- package/dist/templates/_executor/directories.go +0 -40
- package/dist/templates/_executor/dsm.go +0 -369
- package/dist/templates/_executor/dsm_test.go +0 -290
- package/dist/templates/_executor/executor.go +0 -735
- package/dist/templates/_executor/executor_test.go +0 -314
- package/dist/templates/_executor/go.mod +0 -5
- package/dist/templates/_executor/identity.go +0 -74
- package/dist/templates/_executor/identity_kernel_linux_test.go +0 -60
- package/dist/templates/_executor/identity_linux.go +0 -82
- package/dist/templates/_executor/identity_security_test.go +0 -43
- package/dist/templates/_executor/internal/lifecycle/lifecycle.go +0 -95
- package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +0 -232
- package/dist/templates/_executor/internal/taskscript/boot.sh +0 -31
- package/dist/templates/_executor/internal/taskscript/cmd/main.go +0 -19
- package/dist/templates/_executor/internal/taskscript/control.sh +0 -31
- package/dist/templates/_executor/internal/taskscript/tasks.go +0 -44
- package/dist/templates/_executor/json_review_test.go +0 -40
- package/dist/templates/_executor/lifecycle_test.go +0 -97
- package/dist/templates/_executor/link_linux.go +0 -28
- package/dist/templates/_executor/long_running_test.go +0 -530
- package/dist/templates/_executor/main.go +0 -576
- package/dist/templates/_executor/managed.go +0 -117
- package/dist/templates/_executor/managed_test.go +0 -137
- package/dist/templates/_executor/move_linux.go +0 -490
- package/dist/templates/_executor/move_linux_test.go +0 -460
- package/dist/templates/_executor/move_validation.go +0 -46
- package/dist/templates/_executor/move_validation_test.go +0 -187
- package/dist/templates/_executor/operations.go +0 -926
- package/dist/templates/_executor/path_test.go +0 -35
- package/dist/templates/_executor/pid.go +0 -37
- package/dist/templates/_executor/pid_test.go +0 -113
- package/dist/templates/_executor/platform_linux.go +0 -187
- package/dist/templates/_executor/platform_linux_test.go +0 -191
- package/dist/templates/_executor/platform_other.go +0 -76
- package/dist/templates/_executor/process.go +0 -142
- package/dist/templates/_executor/purge_log.go +0 -18
- package/dist/templates/_executor/records.go +0 -242
- package/dist/templates/_executor/scope_cancel_contract_test.go +0 -91
- package/dist/templates/_executor/scope_client.go +0 -37
- package/dist/templates/_executor/scope_contract.go +0 -12
- package/dist/templates/_executor/selected_scope.go +0 -146
- package/dist/templates/_executor/selected_scope_test.go +0 -186
- package/dist/templates/_executor/socket_linux_test.go +0 -46
- package/dist/templates/_executor/status_disabled_test.go +0 -33
- package/dist/templates/_executor/store.go +0 -91
- package/dist/templates/_executor/supervise.go +0 -109
- package/dist/templates/_executor/supervise_test.go +0 -130
- package/dist/templates/_executor/task_race_review_test.go +0 -47
- package/dist/templates/_executor/tasks.go +0 -320
- package/dist/templates/_executor/tasks_dsm71_test.go +0 -114
- package/dist/templates/_executor/tasks_review_test.go +0 -43
- package/dist/templates/_executor/tasks_test.go +0 -223
- package/dist/templates/_executor/testdata/evidence/cleanup.json +0 -24
- package/dist/templates/_executor/testdata/evidence/final-smoke.jsonl +0 -9
- package/dist/templates/_executor/testdata/evidence/kernel-acl.json +0 -6
- package/dist/templates/_executor/testdata/evidence/linux-tests.log +0 -123
- package/dist/templates/_executor/testdata/evidence/live.jsonl +0 -23
- package/dist/templates/_executor/testdata/evidence/storage.json +0 -90
- package/dist/templates/_executor/testdata/evidence/validation.json +0 -55
- package/dist/templates/_executor/testdata/live_probe.py +0 -98
- package/dist/templates/_executor/upgrade_watch_test.go +0 -244
- package/dist/templates/_executor/watch.go +0 -164
- package/dist/templates/_executor/watch_test.go +0 -291
- package/dist/templates/_executor/write_review_linux_test.go +0 -87
- package/dist/templates/_shared/AGENTS.md +0 -146
- package/dist/templates/_shared/CLAUDE.md +0 -1
- package/dist/templates/_shared/third-party-notices.mjs +0 -51
- package/dist/templates/binary/LICENSES/GO-LICENSE +0 -27
- package/dist/templates/binary/LICENSES/GO-PATENTS +0 -22
- package/dist/templates/binary/dsm-package.yaml +0 -46
- package/dist/templates/binary/example/main.go +0 -16
- package/dist/templates/binary/gitignore +0 -2
- package/dist/templates/binary/i18n/messages/de.json +0 -4
- package/dist/templates/binary/i18n/messages/en.json +0 -4
- package/dist/templates/binary/i18n/messages/es.json +0 -4
- package/dist/templates/binary/i18n/messages/fr.json +0 -4
- package/dist/templates/binary/i18n/messages/it.json +0 -4
- package/dist/templates/binary/i18n/messages/ja.json +0 -4
- package/dist/templates/binary/i18n/messages/ko.json +0 -4
- package/dist/templates/binary/i18n/messages/zh-CN.json +0 -4
- package/dist/templates/binary/i18n/messages/zh-TW.json +0 -4
- package/dist/templates/binary/ui/app.css +0 -4
- package/dist/templates/binary/ui/app.js +0 -32
- package/dist/templates/compose/compose.yaml +0 -8
- package/dist/templates/compose/synology-app.yaml +0 -16
- package/dist/templates/native-authorization/AuthorizationGate.vue +0 -91
- package/dist/templates/native-authorization/i18n/de.json +0 -37
- package/dist/templates/native-authorization/i18n/en.json +0 -37
- package/dist/templates/native-authorization/i18n/es.json +0 -37
- package/dist/templates/native-authorization/i18n/fr.json +0 -37
- package/dist/templates/native-authorization/i18n/index.ts +0 -15
- package/dist/templates/native-authorization/i18n/it.json +0 -37
- package/dist/templates/native-authorization/i18n/ja.json +0 -37
- package/dist/templates/native-authorization/i18n/ko.json +0 -37
- package/dist/templates/native-authorization/i18n/zh-CN.json +0 -37
- package/dist/templates/native-authorization/i18n/zh-TW.json +0 -37
- package/dist/templates/native-go/README.md +0 -459
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +0 -61
- package/dist/templates/native-go/backend/cmd/app/main.go +0 -95
- package/dist/templates/native-go/backend/cmd/background-worker/main.go +0 -38
- package/dist/templates/native-go/backend/go.mod +0 -9
- package/dist/templates/native-go/backend/go.sum +0 -4
- package/dist/templates/native-go/backend/internal/api/cgi_framing_test.go +0 -32
- package/dist/templates/native-go/backend/internal/api/cookie_review_test.go +0 -28
- package/dist/templates/native-go/backend/internal/api/deadline_test.go +0 -114
- package/dist/templates/native-go/backend/internal/api/dsm-session.go +0 -54
- package/dist/templates/native-go/backend/internal/api/dsm-session_test.go +0 -51
- package/dist/templates/native-go/backend/internal/api/entry_test.go +0 -47
- package/dist/templates/native-go/backend/internal/api/errors.go +0 -47
- package/dist/templates/native-go/backend/internal/api/permissions.go +0 -161
- package/dist/templates/native-go/backend/internal/api/permissions.json +0 -5
- package/dist/templates/native-go/backend/internal/api/permissions_test.go +0 -113
- package/dist/templates/native-go/backend/internal/api/policy_fixture_test.go +0 -8
- package/dist/templates/native-go/backend/internal/api/registry.go +0 -142
- package/dist/templates/native-go/backend/internal/api/registry_test.go +0 -344
- package/dist/templates/native-go/backend/internal/api/resource_limits_test.go +0 -87
- package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +0 -59
- package/dist/templates/native-go/backend/internal/api/sdk_policy_test.go +0 -31
- package/dist/templates/native-go/backend/internal/api/server.go +0 -305
- package/dist/templates/native-go/backend/internal/api/testdata/permissions-cases.json +0 -172
- package/dist/templates/native-go/backend/internal/app/background.go +0 -249
- package/dist/templates/native-go/backend/internal/app/background_none.go +0 -8
- package/dist/templates/native-go/backend/internal/app/background_owner.go +0 -38
- package/dist/templates/native-go/backend/internal/app/background_owner_test.go +0 -163
- package/dist/templates/native-go/backend/internal/app/background_schedule.go +0 -69
- package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +0 -62
- package/dist/templates/native-go/backend/internal/app/background_test.go +0 -320
- package/dist/templates/native-go/backend/internal/app/delegate_config.go +0 -57
- package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +0 -28
- package/dist/templates/native-go/backend/internal/app/delegate_none.go +0 -5
- package/dist/templates/native-go/backend/internal/app/identity.go +0 -20
- package/dist/templates/native-go/backend/internal/app/identity_test.go +0 -15
- package/dist/templates/native-go/backend/internal/app/migrations.go +0 -41
- package/dist/templates/native-go/backend/internal/app/migrations_test.go +0 -41
- package/dist/templates/native-go/backend/internal/app/portal.go +0 -30
- package/dist/templates/native-go/backend/internal/app/portal_test.go +0 -55
- package/dist/templates/native-go/backend/internal/app/root_none.go +0 -9
- package/dist/templates/native-go/backend/internal/app/routes.go +0 -137
- package/dist/templates/native-go/backend/internal/app/routes_test.go +0 -165
- package/dist/templates/native-go/backend/internal/app/session_files.go +0 -9
- package/dist/templates/native-go/backend/internal/app/session_files_test.go +0 -14
- package/dist/templates/native-go/backend/internal/app/shared_folder.go +0 -144
- package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +0 -158
- package/dist/templates/native-go/backend/internal/background/access.go +0 -57
- package/dist/templates/native-go/backend/internal/background/lock_test.go +0 -131
- package/dist/templates/native-go/backend/internal/background/owner_test.go +0 -118
- package/dist/templates/native-go/backend/internal/background/runner.go +0 -185
- package/dist/templates/native-go/backend/internal/background/runner_test.go +0 -209
- package/dist/templates/native-go/backend/internal/background/schedule.go +0 -336
- package/dist/templates/native-go/backend/internal/background/schedule_test.go +0 -368
- package/dist/templates/native-go/backend/internal/background/store.go +0 -825
- package/dist/templates/native-go/backend/internal/background/store_test.go +0 -365
- package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +0 -191
- package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +0 -177
- package/dist/templates/native-go/backend/internal/dsm/admin.go +0 -76
- package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +0 -110
- package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +0 -105
- package/dist/templates/native-go/backend/internal/dsm/admin_other.go +0 -15
- package/dist/templates/native-go/backend/internal/dsm/admin_test.go +0 -67
- package/dist/templates/native-go/backend/internal/dsm/apppriv.go +0 -30
- package/dist/templates/native-go/backend/internal/dsm/auth.go +0 -94
- package/dist/templates/native-go/backend/internal/dsm/auth_test.go +0 -159
- package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +0 -75
- package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +0 -57
- package/dist/templates/native-go/backend/internal/dsm/entry.go +0 -177
- package/dist/templates/native-go/backend/internal/dsm/entry_test.go +0 -315
- package/dist/templates/native-go/backend/internal/dsm/native/admin-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin_check.c +0 -28
- 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 +0 -33
- package/dist/templates/native-go/backend/internal/dsm/native/build.sh +0 -18
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/GLIBC-NOTICES.txt +0 -400
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/LGPL-2.1.txt +0 -501
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/SOURCE.txt +0 -5
- package/dist/templates/native-go/backend/internal/dsm/native/licenses/ZIG-MIT.txt +0 -21
- package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +0 -18
- package/dist/templates/native-go/backend/internal/filestation/browse_test.go +0 -67
- package/dist/templates/native-go/backend/internal/filestation/check_permission.go +0 -71
- package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +0 -77
- package/dist/templates/native-go/backend/internal/filestation/client.go +0 -337
- package/dist/templates/native-go/backend/internal/filestation/client_test.go +0 -155
- package/dist/templates/native-go/backend/internal/filestation/doc.go +0 -4
- package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +0 -82
- package/dist/templates/native-go/backend/internal/filestation/http.go +0 -70
- package/dist/templates/native-go/backend/internal/filestation/http_test.go +0 -188
- package/dist/templates/native-go/backend/internal/filestation/operations_test.go +0 -206
- package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +0 -89
- package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +0 -39
- package/dist/templates/native-go/backend/internal/filestation/service.go +0 -254
- package/dist/templates/native-go/backend/internal/filestation/service_test.go +0 -74
- package/dist/templates/native-go/backend/internal/filestation/upload_stream.go +0 -76
- package/dist/templates/native-go/backend/internal/filestation/upload_stream_test.go +0 -77
- package/dist/templates/native-go/backend/internal/filestation/write.go +0 -32
- package/dist/templates/native-go/backend/internal/filestation/write_test.go +0 -124
- package/dist/templates/native-go/backend/internal/identity/README.md +0 -59
- package/dist/templates/native-go/backend/internal/identity/dsm.go +0 -115
- package/dist/templates/native-go/backend/internal/identity/http.go +0 -291
- package/dist/templates/native-go/backend/internal/identity/identity_test.go +0 -530
- package/dist/templates/native-go/backend/internal/identity/service.go +0 -159
- package/dist/templates/native-go/backend/internal/identity/store.go +0 -109
- package/dist/templates/native-go/backend/internal/jsonlimits/limits.go +0 -48
- package/dist/templates/native-go/backend/internal/jsonlimits/limits_test.go +0 -52
- package/dist/templates/native-go/backend/internal/portal/portal.go +0 -138
- package/dist/templates/native-go/backend/internal/portal/portal_test.go +0 -89
- package/dist/templates/native-go/dsm-package.yaml +0 -71
- package/dist/templates/native-go/gitignore +0 -1
- package/dist/templates/native-go/i18n/glossary.json +0 -663
- package/dist/templates/native-go/i18n/messages/de.json +0 -29
- package/dist/templates/native-go/i18n/messages/en.json +0 -29
- package/dist/templates/native-go/i18n/messages/es.json +0 -29
- package/dist/templates/native-go/i18n/messages/fr.json +0 -29
- package/dist/templates/native-go/i18n/messages/it.json +0 -29
- package/dist/templates/native-go/i18n/messages/ja.json +0 -29
- package/dist/templates/native-go/i18n/messages/ko.json +0 -29
- package/dist/templates/native-go/i18n/messages/zh-CN.json +0 -29
- package/dist/templates/native-go/i18n/messages/zh-TW.json +0 -29
- package/dist/templates/native-go/ui/app.css +0 -45
- package/dist/templates/native-go/ui/app.js +0 -111
- package/dist/templates/native-go-delegate/DELEGATE.md +0 -263
- package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +0 -48
- package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +0 -25
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_on.go +0 -5
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +0 -31
- package/dist/templates/native-go-delegate/backend/internal/background/delegate_review_test.go +0 -174
- package/dist/templates/native-go-delegate/backend/internal/background/delegated.go +0 -277
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +0 -270
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_test.go +0 -34
- package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +0 -410
- package/dist/templates/native-go-delegate/backend/internal/delegate/busy_review_test.go +0 -15
- package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +0 -95
- package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +0 -151
- package/dist/templates/native-go-delegate/backend/internal/delegate/client_test.go +0 -214
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +0 -110
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +0 -117
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +0 -60
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +0 -116
- package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +0 -81
- package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +0 -91
- package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +0 -511
- package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +0 -132
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +0 -92
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +0 -99
- package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +0 -348
- package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +0 -351
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +0 -65
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +0 -114
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry.go +0 -106
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +0 -143
- package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +0 -364
- package/dist/templates/native-go-delegate/backend/internal/delegate/service_test.go +0 -318
- package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +0 -121
- package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +0 -51
- package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +0 -112
- package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +0 -137
- package/dist/templates/native-go-delegate/backend/internal/delegate/wait_cancel_test.go +0 -101
- package/dist/templates/native-go-delegate/backend/internal/delegate/worker.go +0 -225
- package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +0 -43
- package/dist/templates/native-go-delegate/backend/internal/filestation/files_test.go +0 -59
- package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +0 -37
- package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +0 -113
- package/dist/templates/native-go-delegate/frontend/src/delegate/DelegatePanel.vue +0 -70
- package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +0 -8
- package/dist/templates/native-go-delegate/frontend/src/delegate/i18n/waiting.json +0 -11
- package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +0 -121
- package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +0 -145
- package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +0 -49
- package/dist/templates/native-go-delegate/test-frontend.sh +0 -12
- package/dist/templates/native-go-delegate/test.sh +0 -18
- package/dist/templates/native-go-jobs/BACKGROUND.md +0 -108
- package/dist/templates/native-go-jobs/backend/internal/app/background_on.go +0 -7
- package/dist/templates/native-go-jobs/backend/internal/app/background_routes_test.go +0 -90
- package/dist/templates/native-go-jobs/frontend/src/background/BackgroundPanel.vue +0 -170
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +0 -75
- package/dist/templates/native-go-jobs/frontend/src/background/i18n.ts +0 -19
- package/dist/templates/native-go-jobs/frontend/src/background/picker-provider.ts +0 -12
- package/dist/templates/native-go-jobs/frontend/src/background/request-key.ts +0 -5
- package/dist/templates/native-go-jobs/frontend/test/background.test.ts +0 -205
- package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +0 -140
- package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +0 -117
- package/dist/templates/native-go-root-ops/root/whoami.sh +0 -3
- package/dist/templates/native-go-vue/README.md +0 -47
- package/dist/templates/native-go-vue/frontend/DESIGN.md +0 -61
- package/dist/templates/native-go-vue/frontend/package-lock.json +0 -2530
- package/dist/templates/native-go-vue/frontend/package.json +0 -6
- package/dist/templates/native-go-vue/frontend/src/App.vue +0 -96
- package/dist/templates/native-go-vue/frontend/src/CapabilityPanels.vue +0 -6
- package/dist/templates/native-go-vue/frontend/src/context.ts +0 -78
- package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +0 -70
- package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +0 -11
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +0 -4
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +0 -23
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +0 -24
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +0 -100
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +0 -85
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +0 -42
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +0 -47
- package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +0 -57
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +0 -24
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +0 -21
- package/dist/templates/native-go-vue/frontend/src/files/FileBrowser.vue +0 -131
- package/dist/templates/native-go-vue/frontend/src/files/FilesPage.vue +0 -35
- package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +0 -100
- package/dist/templates/native-go-vue/frontend/src/files/provider.test.ts +0 -48
- package/dist/templates/native-go-vue/frontend/src/files/transfers.test.ts +0 -27
- package/dist/templates/native-go-vue/frontend/src/files/transfers.ts +0 -25
- package/dist/templates/native-go-vue/frontend/src/i18n/de.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/en.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/es.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/it.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +0 -20
- package/dist/templates/native-go-vue/frontend/src/i18n.ts +0 -13
- package/dist/templates/native-go-vue/frontend/src/identity/DESIGN.md +0 -46
- package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +0 -78
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +0 -27
- package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +0 -14
- package/dist/templates/native-go-vue/frontend/src/identity/login.test.ts +0 -32
- package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +0 -33
- package/dist/templates/native-go-vue/frontend/src/identity/session.ts +0 -74
- package/dist/templates/native-go-vue/frontend/src/main.ts +0 -32
- package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +0 -42
- package/dist/templates/native-go-vue/frontend/src/nas/contract.ts +0 -12
- package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +0 -48
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +0 -41
- package/dist/templates/native-go-vue/frontend/src/nas/i18n.ts +0 -2
- package/dist/templates/native-go-vue/frontend/src/nas/locale.ts +0 -24
- package/dist/templates/native-go-vue/frontend/src/nas/provider.ts +0 -50
- package/dist/templates/native-go-vue/frontend/src/nas/use-request.ts +0 -18
- package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +0 -39
- package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +0 -48
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +0 -4
- package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +0 -17
- package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +0 -15
- package/dist/templates/native-go-vue/frontend/src/style.css +0 -27
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +0 -57
- package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +0 -27
- package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +0 -71
- package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +0 -50
- package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +0 -20
- package/dist/templates/native-go-vue/frontend/test/shell.test.ts +0 -30
- package/dist/templates/native-go-vue/frontend/tsconfig.json +0 -1
- package/dist/templates/native-go-vue/frontend/vite.config.ts +0 -10
- package/dist/templates/native-go-vue/gitignore +0 -2
- package/templates/_daemon/fixture_linux_test.go +0 -15
- package/templates/_daemon/fixture_other_test.go +0 -7
- package/templates/_daemon/go.mod +0 -5
- package/templates/_daemon/main.go +0 -611
- package/templates/_daemon/main_test.go +0 -315
- package/templates/_daemon/process_linux.go +0 -55
- package/templates/_daemon/process_linux_test.go +0 -161
- package/templates/_daemon/process_other.go +0 -14
- package/templates/_daemon/testdata/child.go +0 -44
- package/templates/_executor/README.md +0 -318
- package/templates/_executor/anchor.go +0 -156
- package/templates/_executor/anchor_test.go +0 -161
- package/templates/_executor/apppriv_review_test.go +0 -28
- package/templates/_executor/auth_presence_review_test.go +0 -38
- package/templates/_executor/cancel_contract_test.go +0 -236
- package/templates/_executor/cmd/lifecycle/main.go +0 -42
- package/templates/_executor/cookie_review_test.go +0 -27
- package/templates/_executor/copy.go +0 -64
- package/templates/_executor/copy_test.go +0 -88
- package/templates/_executor/digest_review_test.go +0 -120
- package/templates/_executor/directories.go +0 -40
- package/templates/_executor/dsm.go +0 -369
- package/templates/_executor/dsm_test.go +0 -290
- package/templates/_executor/executor.go +0 -735
- package/templates/_executor/executor_test.go +0 -314
- package/templates/_executor/go.mod +0 -5
- package/templates/_executor/identity.go +0 -74
- package/templates/_executor/identity_kernel_linux_test.go +0 -60
- package/templates/_executor/identity_linux.go +0 -82
- package/templates/_executor/identity_security_test.go +0 -43
- package/templates/_executor/internal/lifecycle/lifecycle.go +0 -95
- package/templates/_executor/internal/lifecycle/lifecycle_test.go +0 -232
- package/templates/_executor/internal/taskscript/boot.sh +0 -31
- package/templates/_executor/internal/taskscript/cmd/main.go +0 -19
- package/templates/_executor/internal/taskscript/control.sh +0 -31
- package/templates/_executor/internal/taskscript/tasks.go +0 -44
- package/templates/_executor/json_review_test.go +0 -40
- package/templates/_executor/lifecycle_test.go +0 -97
- package/templates/_executor/link_linux.go +0 -28
- package/templates/_executor/long_running_test.go +0 -530
- package/templates/_executor/main.go +0 -576
- package/templates/_executor/managed.go +0 -117
- package/templates/_executor/managed_test.go +0 -137
- package/templates/_executor/move_linux.go +0 -490
- package/templates/_executor/move_linux_test.go +0 -460
- package/templates/_executor/move_validation.go +0 -46
- package/templates/_executor/move_validation_test.go +0 -187
- package/templates/_executor/operations.go +0 -926
- package/templates/_executor/path_test.go +0 -35
- package/templates/_executor/pid.go +0 -37
- package/templates/_executor/pid_test.go +0 -113
- package/templates/_executor/platform_linux.go +0 -187
- package/templates/_executor/platform_linux_test.go +0 -191
- package/templates/_executor/platform_other.go +0 -76
- package/templates/_executor/process.go +0 -142
- package/templates/_executor/purge_log.go +0 -18
- package/templates/_executor/records.go +0 -242
- package/templates/_executor/scope_cancel_contract_test.go +0 -91
- package/templates/_executor/scope_client.go +0 -37
- package/templates/_executor/scope_contract.go +0 -12
- package/templates/_executor/selected_scope.go +0 -146
- package/templates/_executor/selected_scope_test.go +0 -186
- package/templates/_executor/socket_linux_test.go +0 -46
- package/templates/_executor/status_disabled_test.go +0 -33
- package/templates/_executor/store.go +0 -91
- package/templates/_executor/supervise.go +0 -109
- package/templates/_executor/supervise_test.go +0 -130
- package/templates/_executor/task_race_review_test.go +0 -47
- package/templates/_executor/tasks.go +0 -320
- package/templates/_executor/tasks_dsm71_test.go +0 -114
- package/templates/_executor/tasks_review_test.go +0 -43
- package/templates/_executor/tasks_test.go +0 -223
- package/templates/_executor/testdata/evidence/cleanup.json +0 -24
- package/templates/_executor/testdata/evidence/final-smoke.jsonl +0 -9
- package/templates/_executor/testdata/evidence/kernel-acl.json +0 -6
- package/templates/_executor/testdata/evidence/linux-tests.log +0 -123
- package/templates/_executor/testdata/evidence/live.jsonl +0 -23
- package/templates/_executor/testdata/evidence/storage.json +0 -90
- package/templates/_executor/testdata/evidence/validation.json +0 -55
- package/templates/_executor/testdata/live_probe.py +0 -98
- package/templates/_executor/upgrade_watch_test.go +0 -244
- package/templates/_executor/watch.go +0 -164
- package/templates/_executor/watch_test.go +0 -291
- package/templates/_executor/write_review_linux_test.go +0 -87
- package/templates/_gateway/auth.go +0 -101
- package/templates/_gateway/auth_test.go +0 -216
- package/templates/_gateway/cgi.go +0 -133
- package/templates/_gateway/cgi_test.go +0 -156
- package/templates/_gateway/csrf.go +0 -73
- package/templates/_gateway/csrf_test.go +0 -155
- package/templates/_gateway/directory.go +0 -108
- package/templates/_gateway/directory_test.go +0 -202
- package/templates/_gateway/gateway.go +0 -412
- package/templates/_gateway/gateway_test.go +0 -676
- package/templates/_gateway/go.mod +0 -5
- package/templates/_gateway/groups.go +0 -66
- package/templates/_gateway/main.go +0 -45
- package/templates/_shared/AGENTS.md +0 -146
- package/templates/_shared/CLAUDE.md +0 -1
- package/templates/_shared/GO-LICENSE +0 -27
- package/templates/_shared/GO-PATENTS +0 -22
- package/templates/_shared/LICENSES/TEMPLATE.txt +0 -21
- package/templates/_shared/third-party-notices.mjs +0 -51
- package/templates/binary/LICENSES/GO-LICENSE +0 -27
- package/templates/binary/LICENSES/GO-PATENTS +0 -22
- package/templates/binary/dsm-package.yaml +0 -46
- package/templates/binary/example/main.go +0 -16
- package/templates/binary/gitignore +0 -2
- package/templates/binary/i18n/messages/de.json +0 -4
- package/templates/binary/i18n/messages/en.json +0 -4
- package/templates/binary/i18n/messages/es.json +0 -4
- package/templates/binary/i18n/messages/fr.json +0 -4
- package/templates/binary/i18n/messages/it.json +0 -4
- package/templates/binary/i18n/messages/ja.json +0 -4
- package/templates/binary/i18n/messages/ko.json +0 -4
- package/templates/binary/i18n/messages/zh-CN.json +0 -4
- package/templates/binary/i18n/messages/zh-TW.json +0 -4
- package/templates/binary/ui/app.css +0 -4
- package/templates/binary/ui/app.js +0 -32
- package/templates/compose/compose.yaml +0 -8
- package/templates/compose/synology-app.yaml +0 -16
- package/templates/native-authorization/AuthorizationGate.vue +0 -91
- package/templates/native-authorization/i18n/de.json +0 -37
- package/templates/native-authorization/i18n/en.json +0 -37
- package/templates/native-authorization/i18n/es.json +0 -37
- package/templates/native-authorization/i18n/fr.json +0 -37
- package/templates/native-authorization/i18n/index.ts +0 -15
- package/templates/native-authorization/i18n/it.json +0 -37
- package/templates/native-authorization/i18n/ja.json +0 -37
- package/templates/native-authorization/i18n/ko.json +0 -37
- package/templates/native-authorization/i18n/zh-CN.json +0 -37
- package/templates/native-authorization/i18n/zh-TW.json +0 -37
- package/templates/native-go/README.md +0 -459
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +0 -61
- package/templates/native-go/backend/cmd/app/main.go +0 -95
- package/templates/native-go/backend/cmd/background-worker/main.go +0 -38
- package/templates/native-go/backend/go.mod +0 -9
- package/templates/native-go/backend/go.sum +0 -4
- package/templates/native-go/backend/internal/api/cgi_framing_test.go +0 -32
- package/templates/native-go/backend/internal/api/cookie_review_test.go +0 -28
- package/templates/native-go/backend/internal/api/deadline_test.go +0 -114
- package/templates/native-go/backend/internal/api/dsm-session.go +0 -54
- package/templates/native-go/backend/internal/api/dsm-session_test.go +0 -51
- package/templates/native-go/backend/internal/api/entry_test.go +0 -47
- package/templates/native-go/backend/internal/api/errors.go +0 -47
- package/templates/native-go/backend/internal/api/permissions.go +0 -161
- package/templates/native-go/backend/internal/api/permissions.json +0 -5
- package/templates/native-go/backend/internal/api/permissions_test.go +0 -113
- package/templates/native-go/backend/internal/api/policy_fixture_test.go +0 -8
- package/templates/native-go/backend/internal/api/registry.go +0 -142
- package/templates/native-go/backend/internal/api/registry_test.go +0 -344
- package/templates/native-go/backend/internal/api/resource_limits_test.go +0 -87
- package/templates/native-go/backend/internal/api/sdk-permissions.json +0 -59
- package/templates/native-go/backend/internal/api/sdk_policy_test.go +0 -31
- package/templates/native-go/backend/internal/api/server.go +0 -305
- package/templates/native-go/backend/internal/api/testdata/permissions-cases.json +0 -172
- package/templates/native-go/backend/internal/app/background.go +0 -249
- package/templates/native-go/backend/internal/app/background_none.go +0 -8
- package/templates/native-go/backend/internal/app/background_owner.go +0 -38
- package/templates/native-go/backend/internal/app/background_owner_test.go +0 -163
- package/templates/native-go/backend/internal/app/background_schedule.go +0 -69
- package/templates/native-go/backend/internal/app/background_schedule_test.go +0 -62
- package/templates/native-go/backend/internal/app/background_test.go +0 -320
- package/templates/native-go/backend/internal/app/delegate_config.go +0 -57
- package/templates/native-go/backend/internal/app/delegate_config_test.go +0 -28
- package/templates/native-go/backend/internal/app/delegate_none.go +0 -5
- package/templates/native-go/backend/internal/app/identity.go +0 -20
- package/templates/native-go/backend/internal/app/identity_test.go +0 -15
- package/templates/native-go/backend/internal/app/migrations.go +0 -41
- package/templates/native-go/backend/internal/app/migrations_test.go +0 -41
- package/templates/native-go/backend/internal/app/portal.go +0 -30
- package/templates/native-go/backend/internal/app/portal_test.go +0 -55
- package/templates/native-go/backend/internal/app/root_none.go +0 -9
- package/templates/native-go/backend/internal/app/routes.go +0 -137
- package/templates/native-go/backend/internal/app/routes_test.go +0 -165
- package/templates/native-go/backend/internal/app/session_files.go +0 -9
- package/templates/native-go/backend/internal/app/session_files_test.go +0 -14
- package/templates/native-go/backend/internal/app/shared_folder.go +0 -144
- package/templates/native-go/backend/internal/app/shared_folder_test.go +0 -158
- package/templates/native-go/backend/internal/background/access.go +0 -57
- package/templates/native-go/backend/internal/background/lock_test.go +0 -131
- package/templates/native-go/backend/internal/background/owner_test.go +0 -118
- package/templates/native-go/backend/internal/background/runner.go +0 -185
- package/templates/native-go/backend/internal/background/runner_test.go +0 -209
- package/templates/native-go/backend/internal/background/schedule.go +0 -336
- package/templates/native-go/backend/internal/background/schedule_test.go +0 -368
- package/templates/native-go/backend/internal/background/store.go +0 -825
- package/templates/native-go/backend/internal/background/store_test.go +0 -365
- package/templates/native-go/backend/internal/datamigrate/migrate.go +0 -191
- package/templates/native-go/backend/internal/datamigrate/migrate_test.go +0 -177
- package/templates/native-go/backend/internal/dsm/admin.go +0 -76
- package/templates/native-go/backend/internal/dsm/admin_linux.go +0 -110
- package/templates/native-go/backend/internal/dsm/admin_linux_test.go +0 -105
- package/templates/native-go/backend/internal/dsm/admin_other.go +0 -15
- package/templates/native-go/backend/internal/dsm/admin_test.go +0 -67
- package/templates/native-go/backend/internal/dsm/apppriv.go +0 -30
- package/templates/native-go/backend/internal/dsm/auth.go +0 -94
- package/templates/native-go/backend/internal/dsm/auth_test.go +0 -159
- package/templates/native-go/backend/internal/dsm/bridge_file.go +0 -75
- package/templates/native-go/backend/internal/dsm/bridge_file_test.go +0 -57
- package/templates/native-go/backend/internal/dsm/entry.go +0 -177
- package/templates/native-go/backend/internal/dsm/entry_test.go +0 -315
- package/templates/native-go/backend/internal/dsm/native/admin-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/admin-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/admin_check.c +0 -28
- 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 +0 -33
- package/templates/native-go/backend/internal/dsm/native/build.sh +0 -18
- package/templates/native-go/backend/internal/dsm/native/licenses/GLIBC-NOTICES.txt +0 -400
- package/templates/native-go/backend/internal/dsm/native/licenses/LGPL-2.1.txt +0 -501
- package/templates/native-go/backend/internal/dsm/native/licenses/SOURCE.txt +0 -5
- package/templates/native-go/backend/internal/dsm/native/licenses/ZIG-MIT.txt +0 -21
- package/templates/native-go/backend/internal/dsm/native/provenance.json +0 -18
- package/templates/native-go/backend/internal/filestation/browse_test.go +0 -67
- package/templates/native-go/backend/internal/filestation/check_permission.go +0 -71
- package/templates/native-go/backend/internal/filestation/check_permission_test.go +0 -77
- package/templates/native-go/backend/internal/filestation/client.go +0 -337
- package/templates/native-go/backend/internal/filestation/client_test.go +0 -155
- package/templates/native-go/backend/internal/filestation/doc.go +0 -4
- package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +0 -82
- package/templates/native-go/backend/internal/filestation/http.go +0 -70
- package/templates/native-go/backend/internal/filestation/http_test.go +0 -188
- package/templates/native-go/backend/internal/filestation/operations_test.go +0 -206
- package/templates/native-go/backend/internal/filestation/read_file_test.go +0 -89
- package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +0 -39
- package/templates/native-go/backend/internal/filestation/service.go +0 -254
- package/templates/native-go/backend/internal/filestation/service_test.go +0 -74
- package/templates/native-go/backend/internal/filestation/upload_stream.go +0 -76
- package/templates/native-go/backend/internal/filestation/upload_stream_test.go +0 -77
- package/templates/native-go/backend/internal/filestation/write.go +0 -32
- package/templates/native-go/backend/internal/filestation/write_test.go +0 -124
- package/templates/native-go/backend/internal/identity/README.md +0 -59
- package/templates/native-go/backend/internal/identity/dsm.go +0 -115
- package/templates/native-go/backend/internal/identity/http.go +0 -291
- package/templates/native-go/backend/internal/identity/identity_test.go +0 -530
- package/templates/native-go/backend/internal/identity/service.go +0 -159
- package/templates/native-go/backend/internal/identity/store.go +0 -109
- package/templates/native-go/backend/internal/jsonlimits/limits.go +0 -48
- package/templates/native-go/backend/internal/jsonlimits/limits_test.go +0 -52
- package/templates/native-go/backend/internal/portal/portal.go +0 -138
- package/templates/native-go/backend/internal/portal/portal_test.go +0 -89
- package/templates/native-go/dsm-package.yaml +0 -71
- package/templates/native-go/gitignore +0 -1
- package/templates/native-go/i18n/glossary.json +0 -663
- package/templates/native-go/i18n/messages/de.json +0 -29
- package/templates/native-go/i18n/messages/en.json +0 -29
- package/templates/native-go/i18n/messages/es.json +0 -29
- package/templates/native-go/i18n/messages/fr.json +0 -29
- package/templates/native-go/i18n/messages/it.json +0 -29
- package/templates/native-go/i18n/messages/ja.json +0 -29
- package/templates/native-go/i18n/messages/ko.json +0 -29
- package/templates/native-go/i18n/messages/zh-CN.json +0 -29
- package/templates/native-go/i18n/messages/zh-TW.json +0 -29
- package/templates/native-go/ui/app.css +0 -45
- package/templates/native-go/ui/app.js +0 -111
- package/templates/native-go-delegate/DELEGATE.md +0 -263
- package/templates/native-go-delegate/backend/cmd/background-worker/main.go +0 -48
- package/templates/native-go-delegate/backend/internal/app/delegate.go +0 -25
- package/templates/native-go-delegate/backend/internal/app/delegate_on.go +0 -5
- package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +0 -31
- package/templates/native-go-delegate/backend/internal/background/delegate_review_test.go +0 -174
- package/templates/native-go-delegate/backend/internal/background/delegated.go +0 -277
- package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +0 -270
- package/templates/native-go-delegate/backend/internal/background/delegated_test.go +0 -34
- package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +0 -410
- package/templates/native-go-delegate/backend/internal/delegate/busy_review_test.go +0 -15
- package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +0 -95
- package/templates/native-go-delegate/backend/internal/delegate/client.go +0 -151
- package/templates/native-go-delegate/backend/internal/delegate/client_test.go +0 -214
- package/templates/native-go-delegate/backend/internal/delegate/destination.go +0 -110
- package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +0 -117
- package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +0 -60
- package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +0 -116
- package/templates/native-go-delegate/backend/internal/delegate/example.go +0 -81
- package/templates/native-go-delegate/backend/internal/delegate/example_test.go +0 -91
- package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +0 -511
- package/templates/native-go-delegate/backend/internal/delegate/files.go +0 -132
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +0 -92
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +0 -99
- package/templates/native-go-delegate/backend/internal/delegate/move.go +0 -348
- package/templates/native-go-delegate/backend/internal/delegate/move_test.go +0 -351
- package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +0 -65
- package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +0 -114
- package/templates/native-go-delegate/backend/internal/delegate/retry.go +0 -106
- package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +0 -143
- package/templates/native-go-delegate/backend/internal/delegate/service.go +0 -364
- package/templates/native-go-delegate/backend/internal/delegate/service_test.go +0 -318
- package/templates/native-go-delegate/backend/internal/delegate/staging.go +0 -121
- package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +0 -51
- package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +0 -112
- package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +0 -137
- package/templates/native-go-delegate/backend/internal/delegate/wait_cancel_test.go +0 -101
- package/templates/native-go-delegate/backend/internal/delegate/worker.go +0 -225
- package/templates/native-go-delegate/backend/internal/filestation/files.go +0 -43
- package/templates/native-go-delegate/backend/internal/filestation/files_test.go +0 -59
- package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +0 -37
- package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +0 -113
- package/templates/native-go-delegate/frontend/src/delegate/DelegatePanel.vue +0 -70
- package/templates/native-go-delegate/frontend/src/delegate/copy.ts +0 -8
- package/templates/native-go-delegate/frontend/src/delegate/i18n/waiting.json +0 -11
- package/templates/native-go-delegate/frontend/test/background-save.test.ts +0 -121
- package/templates/native-go-delegate/frontend/test/delegate.test.ts +0 -145
- package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +0 -49
- package/templates/native-go-delegate/test-frontend.sh +0 -12
- package/templates/native-go-delegate/test.sh +0 -18
- package/templates/native-go-jobs/BACKGROUND.md +0 -108
- package/templates/native-go-jobs/backend/internal/app/background_on.go +0 -7
- package/templates/native-go-jobs/backend/internal/app/background_routes_test.go +0 -90
- package/templates/native-go-jobs/frontend/src/background/BackgroundPanel.vue +0 -170
- package/templates/native-go-jobs/frontend/src/background/i18n/de.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/en.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/es.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/it.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +0 -75
- package/templates/native-go-jobs/frontend/src/background/i18n.ts +0 -19
- package/templates/native-go-jobs/frontend/src/background/picker-provider.ts +0 -12
- package/templates/native-go-jobs/frontend/src/background/request-key.ts +0 -5
- package/templates/native-go-jobs/frontend/test/background.test.ts +0 -205
- package/templates/native-go-root-ops/backend/internal/app/executor.go +0 -140
- package/templates/native-go-root-ops/backend/internal/app/executor_test.go +0 -117
- package/templates/native-go-root-ops/root/whoami.sh +0 -3
- package/templates/native-go-vue/README.md +0 -47
- package/templates/native-go-vue/frontend/DESIGN.md +0 -61
- package/templates/native-go-vue/frontend/package-lock.json +0 -2530
- package/templates/native-go-vue/frontend/package.json +0 -6
- package/templates/native-go-vue/frontend/src/App.vue +0 -96
- package/templates/native-go-vue/frontend/src/CapabilityPanels.vue +0 -6
- package/templates/native-go-vue/frontend/src/context.ts +0 -78
- package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +0 -70
- package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +0 -11
- package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +0 -12
- package/templates/native-go-vue/frontend/src/delegate/copy.ts +0 -4
- package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +0 -23
- package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +0 -24
- package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +0 -100
- package/templates/native-go-vue/frontend/src/delegate/facade.ts +0 -85
- package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +0 -42
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +0 -47
- package/templates/native-go-vue/frontend/src/delegate/long-running.ts +0 -57
- package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +0 -12
- package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +0 -24
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +0 -12
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +0 -21
- package/templates/native-go-vue/frontend/src/files/FileBrowser.vue +0 -131
- package/templates/native-go-vue/frontend/src/files/FilesPage.vue +0 -35
- package/templates/native-go-vue/frontend/src/files/files.test.ts +0 -100
- package/templates/native-go-vue/frontend/src/files/provider.test.ts +0 -48
- package/templates/native-go-vue/frontend/src/files/transfers.test.ts +0 -27
- package/templates/native-go-vue/frontend/src/files/transfers.ts +0 -25
- package/templates/native-go-vue/frontend/src/i18n/de.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/en.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/es.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/fr.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/it.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/ja.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/ko.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +0 -20
- package/templates/native-go-vue/frontend/src/i18n.ts +0 -13
- package/templates/native-go-vue/frontend/src/identity/DESIGN.md +0 -46
- package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +0 -78
- package/templates/native-go-vue/frontend/src/identity/i18n/de.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/en.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/es.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/it.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +0 -27
- package/templates/native-go-vue/frontend/src/identity/i18n.ts +0 -14
- package/templates/native-go-vue/frontend/src/identity/login.test.ts +0 -32
- package/templates/native-go-vue/frontend/src/identity/session.test.ts +0 -33
- package/templates/native-go-vue/frontend/src/identity/session.ts +0 -74
- package/templates/native-go-vue/frontend/src/main.ts +0 -32
- package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +0 -42
- package/templates/native-go-vue/frontend/src/nas/contract.ts +0 -12
- package/templates/native-go-vue/frontend/src/nas/destination.test.ts +0 -48
- package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +0 -41
- package/templates/native-go-vue/frontend/src/nas/i18n.ts +0 -2
- package/templates/native-go-vue/frontend/src/nas/locale.ts +0 -24
- package/templates/native-go-vue/frontend/src/nas/provider.ts +0 -50
- package/templates/native-go-vue/frontend/src/nas/use-request.ts +0 -18
- package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +0 -39
- package/templates/native-go-vue/frontend/src/shell/AppShell.vue +0 -48
- package/templates/native-go-vue/frontend/src/shell/i18n/de.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/en.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/es.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/it.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +0 -4
- package/templates/native-go-vue/frontend/src/shell/i18n.ts +0 -17
- package/templates/native-go-vue/frontend/src/shell/pages.ts +0 -15
- package/templates/native-go-vue/frontend/src/style.css +0 -27
- package/templates/native-go-vue/frontend/test/apps.test.ts +0 -57
- package/templates/native-go-vue/frontend/test/native-controls.test.ts +0 -27
- package/templates/native-go-vue/frontend/test/portal-settings.test.ts +0 -71
- package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +0 -50
- package/templates/native-go-vue/frontend/test/shell-ui.test.ts +0 -20
- package/templates/native-go-vue/frontend/test/shell.test.ts +0 -30
- package/templates/native-go-vue/frontend/tsconfig.json +0 -1
- package/templates/native-go-vue/frontend/vite.config.ts +0 -10
- package/templates/native-go-vue/gitignore +0 -2
- /package/{dist/templates/_daemon → assets/go/daemon}/fixture_linux_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/fixture_other_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/go.mod +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/main.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/main_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/process_linux.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/process_linux_test.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/process_other.go +0 -0
- /package/{dist/templates/_daemon → assets/go/daemon}/testdata/child.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/auth.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/auth_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/cgi.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/cgi_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/csrf.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/csrf_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/directory.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/directory_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/gateway.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/gateway_test.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/go.mod +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/groups.go +0 -0
- /package/{dist/templates/_gateway → assets/go/gateway}/main.go +0 -0
- /package/{dist/templates/_shared → assets/licenses}/GO-LICENSE +0 -0
- /package/{dist/templates/_shared → assets/licenses}/GO-PATENTS +0 -0
- /package/{dist/templates/_shared/LICENSES → assets/licenses}/TEMPLATE.txt +0 -0
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {computed,onBeforeUnmount,onMounted,ref} from 'vue'
|
|
3
|
-
import {Button,Callout,SettingsSection} from '@synopackageland/ui'
|
|
4
|
-
import type {BackgroundSaveFacade,BackgroundSaveStatus,DestinationGrant,DestinationState,SaveOperation} from './long-running'
|
|
5
|
-
import {scopedPicker} from './scoped-picker'
|
|
6
|
-
import {saveCopy,saveError} from './save-copy'
|
|
7
|
-
import NasPicker from '../nas/NasPicker.vue'
|
|
8
|
-
import type {NasProvider} from '../nas/contract'
|
|
9
|
-
const props=defineProps<{sdk:BackgroundSaveFacade;admin:boolean;locale:string;picker?:{provider:NasProvider;keys:string[]}}>()
|
|
10
|
-
const emit=defineEmits<{authorized:[grant:DestinationGrant]}>()
|
|
11
|
-
const picking=ref(false),destinationKey=ref('')
|
|
12
|
-
const copy=computed(()=>saveCopy(props.locale)),status=ref<BackgroundSaveStatus>(),grants=ref<DestinationGrant[]>([]),operations=ref<SaveOperation[]>([])
|
|
13
|
-
const busy=ref(false),error=ref<unknown>(),notice=ref('')
|
|
14
|
-
const destinations=ref<DestinationState[]>([])
|
|
15
|
-
const pickerProvider=computed(()=>props.picker&&(status.value?.selection?scopedPicker(props.picker.provider,status.value.selection.root):status.value?.scopeMode==='install-selected'?undefined:props.picker.provider))
|
|
16
|
-
let disposed=false,timer:ReturnType<typeof setInterval>|undefined
|
|
17
|
-
// An acknowledged cancel keeps copying until the writer stops; poll, never resend.
|
|
18
|
-
const canceling=(job:SaveOperation)=>job.state==='copying'&&job.code==='CANCEL_REQUESTED'
|
|
19
|
-
const state=(job:SaveOperation)=>canceling(job)?'canceling':job.state==='committed'&&!job.receipt?.path?'uncertain':job.state
|
|
20
|
-
const pending=(job:SaveOperation)=>['queued','copying'].includes(job.state)&&!canceling(job)
|
|
21
|
-
function clear(){status.value=undefined;grants.value=[];operations.value=[];destinations.value=[];picking.value=false}
|
|
22
|
-
async function refresh(){
|
|
23
|
-
const [current,listed,jobs,choices]=await Promise.all([props.sdk.status(),props.sdk.list(),props.sdk.operations(),Promise.all((props.picker?.keys??[]).map(key=>props.sdk.destination(key)))])
|
|
24
|
-
if(disposed)return
|
|
25
|
-
// Display only an acknowledged snapshot; never infer authority from cached paths.
|
|
26
|
-
if(!current||typeof current.disabled!=='boolean'||!Array.isArray(listed)||!Array.isArray(jobs))throw {code:'unavailable'}
|
|
27
|
-
if(status.value?.selection?.generation!==current.selection?.generation||status.value?.selection?.scope!==current.selection?.scope)picking.value=false
|
|
28
|
-
status.value=current;grants.value=choices.length?listed.filter(g=>choices.some(d=>d.status==='active'&&d.destination?.id===g.id)):listed;operations.value=jobs;destinations.value=choices
|
|
29
|
-
}
|
|
30
|
-
async function action(work:()=>Promise<void>){
|
|
31
|
-
if(disposed||busy.value)return
|
|
32
|
-
busy.value=true;error.value=undefined;notice.value=''
|
|
33
|
-
try{await work()}
|
|
34
|
-
catch(e){if(!disposed){clear();error.value=e}}
|
|
35
|
-
finally{if(!disposed)busy.value=false}
|
|
36
|
-
}
|
|
37
|
-
const reload=()=>action(refresh)
|
|
38
|
-
function authorized(grant:DestinationGrant){emit('authorized',grant);void reload()}
|
|
39
|
-
const revoke=(id:string)=>action(async()=>{
|
|
40
|
-
const result=await props.sdk.revoke({delegation_id:id})
|
|
41
|
-
if(result?.revoked!==true)throw {code:'commit-uncertain'}
|
|
42
|
-
await refresh();if(!disposed)notice.value=copy.value.revoked
|
|
43
|
-
})
|
|
44
|
-
const cancel=(job:SaveOperation)=>action(async()=>{await props.sdk.cancel({delegation_id:job.delegation_id,job_id:job.job_id});await refresh()})
|
|
45
|
-
const toggle=()=>action(async()=>{
|
|
46
|
-
if(!props.admin||!status.value)return
|
|
47
|
-
const wasDisabled=status.value.disabled
|
|
48
|
-
const result=wasDisabled?await props.sdk.enable():await props.sdk.disable()
|
|
49
|
-
if(result?.disabled!==!wasDisabled)throw {code:'commit-uncertain'}
|
|
50
|
-
await refresh()
|
|
51
|
-
})
|
|
52
|
-
const example=(key:string)=>action(async()=>{
|
|
53
|
-
const job_id='example-'+Array.from(crypto.getRandomValues(new Uint8Array(16)),b=>b.toString(16).padStart(2,'0')).join('')
|
|
54
|
-
await props.sdk.exportExample({key,job_id})
|
|
55
|
-
await refresh()
|
|
56
|
-
})
|
|
57
|
-
onMounted(()=>{void reload();timer=setInterval(()=>{if(operations.value.some(pending))void reload()},3000)})
|
|
58
|
-
onBeforeUnmount(()=>{disposed=true;if(timer)clearInterval(timer)})
|
|
59
|
-
</script>
|
|
60
|
-
<template>
|
|
61
|
-
<SettingsSection :title="copy.title" :collapsible="false" :aria-busy="busy" class="background-save-panel">
|
|
62
|
-
<p>{{ copy.help }}</p>
|
|
63
|
-
<Callout v-if="error" tone="danger" role="alert" class="save-message">{{ saveError(error,copy) }}</Callout>
|
|
64
|
-
<p v-if="busy&&!status" role="status">{{ copy.loading }}</p>
|
|
65
|
-
<p v-if="notice" role="status">{{ notice }}</p>
|
|
66
|
-
<p v-if="status?.selection"><strong>{{ copy.scope }}</strong>: {{ status.selection.root }}</p>
|
|
67
|
-
<Callout v-if="status?.mismatch" tone="warning">{{ copy.scopeMismatch }} {{ status.preselection }} → {{ status.selection?.root }}</Callout>
|
|
68
|
-
<Callout v-if="status?.scopeMode==='install-selected'&&!status.selection" tone="warning">{{ copy.scopeNeeds }}</Callout>
|
|
69
|
-
<Callout v-if="status?.disabled" tone="warning" role="status" class="save-message">{{ copy.disabled }}</Callout>
|
|
70
|
-
<p v-else-if="status" role="status">{{ copy.enabled }}</p>
|
|
71
|
-
<div class="save-actions">
|
|
72
|
-
<Button variant="secondary" :disabled="busy" @click="reload">{{ copy.refresh }}</Button>
|
|
73
|
-
<Button v-if="admin&&status" :variant="status.disabled?'secondary':'danger'" :disabled="busy" @click="toggle">{{ status.disabled?copy.enable:copy.disable }}</Button>
|
|
74
|
-
</div>
|
|
75
|
-
<p v-if="admin&&status">{{ copy.disableHelp }}</p>
|
|
76
|
-
<h3>{{ copy.delegations }}</h3>
|
|
77
|
-
<Callout v-if="destinations.some(d=>d.status==='reselection-required')" tone="warning">{{ copy.reselect }}</Callout>
|
|
78
|
-
<div v-if="picker" class="save-actions"><Button v-for="key in picker.keys" :key="key" variant="secondary" :disabled="busy||!status||status.disabled||!pickerProvider" @click="destinationKey=key;picking=true">{{ copy.choose }} ({{ key }})</Button></div>
|
|
79
|
-
<NasPicker v-if="pickerProvider" :key="status?.selection?.scope" v-model:open="picking" :provider="pickerProvider" :locale="locale" mode="folder" :destination="{key:destinationKey,selectDestination:sdk.selectDestination}" @authorized="authorized" />
|
|
80
|
-
<p v-if="status&&!grants.length">{{ copy.empty }}</p>
|
|
81
|
-
<ul class="save-records"><li v-for="grant in grants" :key="grant.id">
|
|
82
|
-
<div><strong>{{ grant.path }}</strong><p>{{ copy.untilRevoked }}</p></div>
|
|
83
|
-
<Button variant="secondary" :disabled="busy" @click="revoke(grant.id)">{{ copy.revoke }}</Button>
|
|
84
|
-
</li></ul>
|
|
85
|
-
<template v-if="destinations.some(d=>d.status==='active')">
|
|
86
|
-
<p>{{ copy.exampleHelp }}</p>
|
|
87
|
-
<div class="save-actions"><Button v-for="d in destinations.filter(d=>d.status==='active')" :key="d.key" variant="secondary" :disabled="busy||status?.disabled" @click="example(d.key)">{{ copy.example }} ({{ d.key }})</Button></div>
|
|
88
|
-
</template>
|
|
89
|
-
<h3>{{ copy.operations }}</h3>
|
|
90
|
-
<p v-if="status&&!operations.length">{{ copy.noOperations }}</p>
|
|
91
|
-
<ul class="save-records"><li v-for="job in operations" :key="job.job_id" :data-job-id="job.job_id" :data-save-state="state(job)">
|
|
92
|
-
<div>
|
|
93
|
-
<strong>{{ job.name }}</strong><p>{{ copy[state(job)] }} · {{ job.job_id }}</p>
|
|
94
|
-
<p v-if="state(job)==='committed'">{{ job.receipt?.path }}</p>
|
|
95
|
-
<Callout v-if="state(job)==='uncertain'" tone="warning" class="save-message">{{ copy.uncertainHelp }}</Callout>
|
|
96
|
-
<Callout v-else-if="state(job)==='interrupted'" tone="warning" class="save-message">{{ copy.interruptedHelp }}</Callout>
|
|
97
|
-
<p v-if="job.code&&!canceling(job)">{{ saveError({code:job.code},copy) }}</p>
|
|
98
|
-
</div>
|
|
99
|
-
<Button v-if="pending(job)" variant="secondary" :disabled="busy" @click="cancel(job)">{{ copy.cancel }}</Button>
|
|
100
|
-
</li></ul>
|
|
101
|
-
</SettingsSection>
|
|
102
|
-
</template>
|
|
103
|
-
<style scoped>
|
|
104
|
-
.background-save-panel {min-width:0;overflow-wrap:anywhere;}
|
|
105
|
-
.save-message {--ui-text-secondary:var(--ui-text);}
|
|
106
|
-
h3 {font-size:var(--ui-font-size-base,14px);font-weight:600;margin:var(--ui-space-6,24px) 0 var(--ui-space-3,12px);}
|
|
107
|
-
.save-actions,.save-records li {display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-3,12px);}
|
|
108
|
-
.save-actions {justify-content:flex-start;}
|
|
109
|
-
.save-records {list-style:none;margin:0;padding:0;}
|
|
110
|
-
.save-records li {padding-block:var(--ui-space-4,16px);border-bottom:1px solid var(--ui-border);}
|
|
111
|
-
.save-records li>div {min-width:0;max-width:100%;}
|
|
112
|
-
.save-records p {margin:var(--ui-space-2,8px) 0;}
|
|
113
|
-
</style>
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import {computed,onBeforeUnmount,onMounted,ref,watch} from 'vue'
|
|
3
|
-
import {Button,Callout,Form,FormActions,FormItem,Input,SettingsSection} from '@synopackageland/ui'
|
|
4
|
-
import type {Context} from '../context'
|
|
5
|
-
import NasPicker from '../nas/NasPicker.vue'
|
|
6
|
-
import {createNasProvider} from '../nas/provider'
|
|
7
|
-
import type {CapabilityStatus} from './executor-setup'
|
|
8
|
-
import {delegateCopy,errorCopy} from './copy'
|
|
9
|
-
interface Grant{delegation_id:string;job_id:string;path:string;expires_at:string;revoked?:boolean}
|
|
10
|
-
interface Job{id:string;name:string;state:'waiting_executor'|'queued'|'running'|'succeeded'|'failed'|'canceled'|'interrupted'}
|
|
11
|
-
const props=defineProps<{ctx:Pick<Context,'call'|'locale'>}>()
|
|
12
|
-
const copy=computed(()=>delegateCopy(props.ctx.locale)),provider=createNasProvider(props.ctx)
|
|
13
|
-
const status=ref<CapabilityStatus>(),grants=ref<Grant[]>([]),jobs=ref<Job[]>([]),busy=ref(false),error=ref<unknown>(),notice=ref(''),picking=ref(false),dest=ref(''),url=ref(''),name=ref('')
|
|
14
|
-
let disposed=false,timer:ReturnType<typeof setInterval>|undefined,submissionKey:string|undefined
|
|
15
|
-
watch([url,dest,name],()=>{submissionKey=undefined},{flush:'sync'})
|
|
16
|
-
const pending=(j:Job)=>['queued','running','waiting_executor'].includes(j.state)
|
|
17
|
-
const waitingForExecutor=computed(()=>jobs.value.some(j=>j.state==='waiting_executor'))
|
|
18
|
-
const startupCodes=['EXECUTOR_UNAVAILABLE','EXECUTOR_TIMEOUT']
|
|
19
|
-
const waitingError=computed(()=>waitingForExecutor.value&&startupCodes.includes((error.value as {code?:string})?.code??''))
|
|
20
|
-
const showCapability=computed(()=>status.value&&status.value.state!=='ready'&&!(waitingForExecutor.value&&status.value.state==='needs-admin-approval'&&startupCodes.includes(status.value.reason??'')))
|
|
21
|
-
async function refresh(){
|
|
22
|
-
if(disposed)return
|
|
23
|
-
const [capability,list,work]=await Promise.allSettled([props.ctx.call<CapabilityStatus>('delegate.status'),props.ctx.call<{delegations:Grant[]}>('delegate.list'),props.ctx.call<{jobs:Job[]}>('delegate.jobs.list')])
|
|
24
|
-
if(disposed)return
|
|
25
|
-
if(capability.status==='fulfilled')status.value=capability.value
|
|
26
|
-
if(list.status==='fulfilled')grants.value=(list.value.delegations??[]).filter(g=>!g.revoked)
|
|
27
|
-
if(work.status==='fulfilled')jobs.value=work.value.jobs??[]
|
|
28
|
-
for(const result of [capability,list,work])if(result.status==='rejected')throw result.reason
|
|
29
|
-
}
|
|
30
|
-
async function action(work:()=>Promise<unknown>){if(busy.value||disposed)return;busy.value=true;error.value=undefined;try{await work()}catch(e){if(!disposed)error.value=e}finally{if(!disposed)busy.value=false}}
|
|
31
|
-
const reload=()=>action(refresh)
|
|
32
|
-
const revoke=(id:string)=>action(async()=>{await props.ctx.call('delegate.revoke',{delegation_id:id});await refresh()})
|
|
33
|
-
const cancel=(id:string)=>action(async()=>{const out=await props.ctx.call<{revocation_pending:boolean}>('delegate.jobs.cancel',{id});if(!disposed)notice.value=out.revocation_pending?copy.value.pending:'';await refresh()})
|
|
34
|
-
const canSubmit=computed(()=>status.value?.state==='ready'&&!!dest.value&&!!url.value&&!!name.value)
|
|
35
|
-
const submit=()=>action(async()=>{if(!canSubmit.value)return;await props.ctx.call('delegate.jobs.submit',{key:submissionKey??(submissionKey=crypto.randomUUID()),url:url.value,dest:dest.value,name:name.value});if(!disposed){url.value='';name.value='';dest.value=''};await refresh()})
|
|
36
|
-
const time=(date:string)=>{const d=new Date(date);return Number.isNaN(d.getTime())?'—':d.toLocaleString(props.ctx.locale)}
|
|
37
|
-
onMounted(()=>{void reload();timer=setInterval(()=>{if(jobs.value.some(pending))void reload()},3000)})
|
|
38
|
-
onBeforeUnmount(()=>{disposed=true;if(timer)clearInterval(timer);provider.dispose()})
|
|
39
|
-
</script>
|
|
40
|
-
<template>
|
|
41
|
-
<SettingsSection :title="copy.title" :collapsible="false" :aria-busy="busy" class="delegate-panel">
|
|
42
|
-
<p>{{ copy.help }}</p>
|
|
43
|
-
<Callout v-if="error&&!waitingError" tone="danger" role="alert">{{ errorCopy(error,copy) }}</Callout>
|
|
44
|
-
<p v-if="notice" role="status">{{ notice }}</p>
|
|
45
|
-
<p v-if="showCapability" role="status">{{ status?.state==='needs-admin-approval'?copy.needs:copy.blocked }}</p>
|
|
46
|
-
<Form @submit.prevent="submit">
|
|
47
|
-
<FormItem :label="copy.url" label-for="delegate-url"><Input id="delegate-url" v-model="url" type="url" :disabled="busy||status?.state!=='ready'" /></FormItem>
|
|
48
|
-
<FormItem :label="copy.name" label-for="delegate-name"><Input id="delegate-name" v-model="name" data-file-name :disabled="busy||status?.state!=='ready'" /></FormItem>
|
|
49
|
-
<p>{{ copy.size }}</p>
|
|
50
|
-
<p v-if="dest" role="status" class="destination">{{ copy.destination }}: {{ dest }}</p>
|
|
51
|
-
<FormActions><Button type="button" variant="secondary" :disabled="busy||status?.state!=='ready'" @click="picking=true">{{ copy.choose }}</Button><Button type="submit" variant="primary" :disabled="busy||!canSubmit">{{ copy.submit }}</Button></FormActions>
|
|
52
|
-
</Form>
|
|
53
|
-
<NasPicker v-model:open="picking" :locale="ctx.locale" :provider="provider" mode="folder" @selected="dest=$event" />
|
|
54
|
-
<div class="section-heading"><h3>{{ copy.downloads }}</h3><Button variant="secondary" :disabled="busy" @click="reload">{{ copy.refresh }}</Button></div>
|
|
55
|
-
<p v-if="!jobs.length&&!error">{{ copy.noJobs }}</p>
|
|
56
|
-
<ul v-else class="records"><li v-for="job in jobs" :key="job.id" :data-job-state="job.state"><span :role="job.state==='waiting_executor'?'status':undefined">{{ job.name }} · {{ copy[job.state] }}</span><Button v-if="pending(job)" variant="secondary" :disabled="busy" @click="cancel(job.id)">{{ copy.cancel }}</Button></li></ul>
|
|
57
|
-
<h3>{{ copy.delegations }}</h3>
|
|
58
|
-
<p v-if="!grants.length&&!error">{{ copy.noDelegations }}</p>
|
|
59
|
-
<ul v-else class="records"><li v-for="grant in grants" :key="grant.delegation_id"><div><strong>{{ grant.path }}</strong><p>{{ copy.expires }}: {{ time(grant.expires_at) }}</p></div><Button variant="secondary" :disabled="busy" @click="revoke(grant.delegation_id)">{{ copy.revoke }}</Button></li></ul>
|
|
60
|
-
</SettingsSection>
|
|
61
|
-
</template>
|
|
62
|
-
<style scoped>
|
|
63
|
-
.delegate-panel {min-width:0;overflow-wrap:anywhere;}
|
|
64
|
-
h3 {font-size:var(--ui-font-size-base,14px);font-weight:600;margin:var(--ui-space-6,24px) 0 var(--ui-space-3,12px);}
|
|
65
|
-
.section-heading {display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-3,12px);}
|
|
66
|
-
.records {list-style:none;padding:0;margin:0;}
|
|
67
|
-
.records li {display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--ui-space-3,12px);padding-block:var(--ui-space-4,16px);border-bottom:1px solid var(--ui-border);}
|
|
68
|
-
.records li>div,.records li>span,.destination {min-width:0;max-width:100%;overflow-wrap:anywhere;}
|
|
69
|
-
.records p {margin:var(--ui-space-2,8px) 0 0;}
|
|
70
|
-
</style>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import {uiLocale} from '../nas/locale'
|
|
2
|
-
import {delegateCatalogs,type DelegateCopy} from './catalogs'
|
|
3
|
-
import waiting from './i18n/waiting.json'
|
|
4
|
-
export function delegateCopy(locale='en'){
|
|
5
|
-
const key=uiLocale(locale)
|
|
6
|
-
return {...delegateCatalogs[key]!,waiting_executor:waiting[key as keyof typeof waiting]??waiting.en}
|
|
7
|
-
}
|
|
8
|
-
export function errorCopy(error:unknown,copy:DelegateCopy){const code=(error as {code?:string})?.code;return ['session_required','AUTH_DENIED'].includes(code??'')?copy.session:['DENIED','SCOPE_DENIED','PERMISSION_DENIED','APP_DENIED','INELIGIBLE','denied'].includes(code??'')?copy.denied:copy.error}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"en": "Waiting for system services to start",
|
|
3
|
-
"zh-TW": "等待系統服務啟動",
|
|
4
|
-
"zh-CN": "等待系统服务启动",
|
|
5
|
-
"de": "Warten auf den Start der Systemdienste",
|
|
6
|
-
"es": "Esperando a que se inicien los servicios del sistema",
|
|
7
|
-
"fr": "En attente du démarrage des services système",
|
|
8
|
-
"it": "In attesa dell’avvio dei servizi di sistema",
|
|
9
|
-
"ja": "システムサービスの起動を待っています",
|
|
10
|
-
"ko": "시스템 서비스 시작을 기다리는 중"
|
|
11
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
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
|
-
})
|
|
@@ -1,145 +0,0 @@
|
|
|
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 DelegatePanel from '../src/delegate/DelegatePanel.vue'
|
|
6
|
-
import ExecutorSettings from '../src/delegate/ExecutorSettings.vue'
|
|
7
|
-
import waitingMessages from '../src/delegate/i18n/waiting.json'
|
|
8
|
-
import {ExecutorSetupKey,type ExecutorSetup} from '../src/delegate/executor-setup'
|
|
9
|
-
const disposers:Array<()=>void>=[]
|
|
10
|
-
afterEach(()=>disposers.splice(0).forEach(fn=>fn()))
|
|
11
|
-
async function settle(){for(let i=0;i<25;i++){await Promise.resolve();await nextTick()}}
|
|
12
|
-
function mount(component:any,props:Record<string,unknown>,setup?:ExecutorSetup){const root=document.createElement('div');document.body.append(root);const app=createApp({render:()=>h(AppRoot,{},()=>h(component,props))});if(setup)app.provide(ExecutorSetupKey,setup);app.mount(root);disposers.push(()=>{app.unmount();root.remove()});return root}
|
|
13
|
-
function button(root:HTMLElement,label:string){const b=Array.from(root.querySelectorAll('button')).find(b=>b.textContent?.trim()===label||b.getAttribute('aria-label')===label);expect(b,label).toBeTruthy();return b!}
|
|
14
|
-
const context=(call:any)=>({call,locale:'en'})
|
|
15
|
-
test('personal delegation list revokes only its selected ID and refreshes',async()=>{
|
|
16
|
-
let revoked=false
|
|
17
|
-
const call=vi.fn(async(method:string)=>{if(method==='delegate.status')return {state:'ready'};if(method==='delegate.jobs.list')return {jobs:[]};if(method==='delegate.list')return {delegations:revoked?[]:[{delegation_id:'d1',job_id:'j1',path:'/home/Downloads',expires_at:'2030-01-01T00:00:00Z'}]};if(method==='delegate.revoke'){revoked=true;return {revoked:true}};throw {code:'unknown_method'}})
|
|
18
|
-
const root=mount(DelegatePanel,{ctx:context(call)});await settle();expect(root.textContent).toContain('/home/Downloads');button(root,'Revoke').click();await settle();expect(call).toHaveBeenCalledWith('delegate.revoke',{delegation_id:'d1'});expect(root.textContent).toContain('You have no active delegations.')
|
|
19
|
-
})
|
|
20
|
-
test('errors hide executor messages and retain a retry action',async()=>{
|
|
21
|
-
const call=vi.fn(async()=>{throw {code:'DENIED',message:'secret SID'}}),root=mount(DelegatePanel,{ctx:context(call)});await settle();expect(root.querySelector('[role="alert"]')).toBeTruthy();expect(root.textContent).not.toContain('secret SID');button(root,'Refresh').click();await settle();expect(call.mock.calls.length).toBeGreaterThan(1)
|
|
22
|
-
})
|
|
23
|
-
test('administrator setup uses only status and authorize and clears password',async()=>{
|
|
24
|
-
const setup:ExecutorSetup={control:vi.fn(async()=>({state:'ready'})),status:vi.fn(async()=>({state:'needs-admin-approval'})),authorize:vi.fn(async()=>({state:'ready'}))}
|
|
25
|
-
const root=mount(ExecutorSettings,{admin:true},setup);await settle();const password=root.querySelector('input[type="password"]') as HTMLInputElement;expect(password).toBeTruthy();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();expect(setup.authorize).toHaveBeenCalledWith('once');expect(root.querySelector('input[type="password"]')).toBeNull();expect(root.textContent).toContain('Background file access is ready.')
|
|
26
|
-
})
|
|
27
|
-
test('ordinary users never call setup or see a password field',async()=>{
|
|
28
|
-
const setup:ExecutorSetup={control:vi.fn(async()=>({state:'ready'})),status:vi.fn(async()=>({state:'ready'})),authorize:vi.fn(async()=>({state:'ready'}))};const root=mount(ExecutorSettings,{admin:false},setup);await settle();expect(setup.status).not.toHaveBeenCalled();expect(root.querySelector('input')).toBeNull()
|
|
29
|
-
})
|
|
30
|
-
test('setup failures erase the entered password and explain recovery',async()=>{
|
|
31
|
-
const setup:ExecutorSetup={control:vi.fn(async()=>({state:'ready'})),status:vi.fn(async()=>({state:'needs-admin-approval'})),authorize:vi.fn(async()=>{throw {code:'DENIED',message:'secret'}})};const root=mount(ExecutorSettings,{admin:true},setup);await settle();const password=root.querySelector('input')!;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();expect(password.value).toBe('');expect(root.textContent).not.toContain('secret');expect(root.querySelector('[role="alert"]')).toBeTruthy()
|
|
32
|
-
})
|
|
33
|
-
test('download requires a folder selected through the existing NAS picker',async()=>{
|
|
34
|
-
const call=vi.fn(async(method:string)=>{if(method==='delegate.status')return {state:'ready'};if(method==='delegate.list')return {delegations:[]};if(method==='delegate.jobs.list')return {jobs:[]};if(method==='nas.files.shares')return {shares:[{name:'home',path:'/home',isdir:true}],total:1,offset:0};if(method==='delegate.jobs.submit')return {id:'job1'};throw {code:'unknown_method'}})
|
|
35
|
-
const root=mount(DelegatePanel,{ctx:context(call)});await settle();const url=root.querySelector('input[type="url"]')!;url.value='https://example.com/file';url.dispatchEvent(new Event('input',{bubbles:true}));const name=root.querySelector('input[data-file-name]')!;name.value='file.txt';name.dispatchEvent(new Event('input',{bubbles:true}));await settle();expect(button(root,'Download to my folder').disabled).toBe(true);button(root,'Choose folder').click();await settle();const picker=document.body;button(picker,'Select home').click();await settle();button(picker,'Confirm selection').click();await settle();button(root,'Download to my folder').click();await settle();const submitted=call.mock.calls.find(([m])=>m==='delegate.jobs.submit');expect(submitted).toBeTruthy();expect((submitted as unknown as [string,any])[1]).toMatchObject({url:'https://example.com/file',dest:'/home',name:'file.txt'})
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
test('an unavailable delegation list still displays approval status and owner jobs',async()=>{
|
|
39
|
-
const call=vi.fn(async(method:string)=>{if(method==='delegate.status')return {state:'needs-admin-approval'};if(method==='delegate.jobs.list')return {jobs:[{id:'j',name:'file.txt',state:'queued'}]};throw {code:'EXECUTOR_UNAVAILABLE'}})
|
|
40
|
-
const root=mount(DelegatePanel,{ctx:context(call)});await settle();expect(root.textContent).toContain('An administrator must approve background file access.');expect(root.textContent).toContain('file.txt');expect(root.querySelector('[role="alert"]')).toBeTruthy()
|
|
41
|
-
})
|
|
42
|
-
test('retrying an uncertain submission reuses the original idempotency key',async()=>{
|
|
43
|
-
let attempts=0
|
|
44
|
-
const call=vi.fn(async(method:string)=>{if(method==='delegate.status')return {state:'ready'};if(method==='delegate.list')return {delegations:[]};if(method==='delegate.jobs.list')return {jobs:[]};if(method==='nas.files.shares')return {shares:[{name:'home',path:'/home',isdir:true}],total:1,offset:0};if(method==='delegate.jobs.submit'){attempts++;if(attempts===1)throw {code:'commit-uncertain'};return {id:'j'}};throw {code:'unknown_method'}})
|
|
45
|
-
const root=mount(DelegatePanel,{ctx:context(call)});await settle();const url=root.querySelector('input[type="url"]')!;url.value='https://example.com/file';url.dispatchEvent(new Event('input',{bubbles:true}));const name=root.querySelector('input[data-file-name]')!;name.value='file';name.dispatchEvent(new Event('input',{bubbles:true}));await settle();button(root,'Choose folder').click();await settle();button(document.body,'Select home').click();await settle();button(document.body,'Confirm selection').click();await settle();button(root,'Download to my folder').click();await settle();button(root,'Download to my folder').click();await settle();const submissions=call.mock.calls.filter(([m])=>m==='delegate.jobs.submit') as unknown as Array<[string,{key:string}]>;expect(submissions).toHaveLength(2);expect(submissions[0][1].key).toBe(submissions[1][1].key)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
test('generated app mount forwards ctx.executor to admin setup and renders ordinary delegation UI',async()=>{
|
|
49
|
-
const {mount:mountApp}=await import('../src/main')
|
|
50
|
-
for(const admin of [true,false]){
|
|
51
|
-
const status=vi.fn(async()=>({state:'needs-admin-approval' as const}))
|
|
52
|
-
const authorize=vi.fn(async()=>({state:'ready' as const}))
|
|
53
|
-
const call=vi.fn(async(method:string)=>{
|
|
54
|
-
if(method==='app.status')return {package:'DelegateApp',version:'1',user:admin?'admin':'alice',admin}
|
|
55
|
-
if(method==='greeting.get')return {text:'Hello'}
|
|
56
|
-
if(method==='delegate.status')return {state:'needs-admin-approval'}
|
|
57
|
-
if(method==='delegate.list')return {delegations:[]}
|
|
58
|
-
if(method==='delegate.jobs.list')return {jobs:[]}
|
|
59
|
-
throw {code:'unknown_method'}
|
|
60
|
-
})
|
|
61
|
-
const root=document.createElement('div');document.body.append(root)
|
|
62
|
-
const app=mountApp(root,{locale:'en',call,reopen:()=>()=>{},executor:{status,authorize,control:vi.fn(async()=>({state:'ready' as const}))}} as any)
|
|
63
|
-
disposers.push(()=>{app.unmount();root.remove()});await settle()
|
|
64
|
-
expect(root.textContent).toContain('You have no active delegations.')
|
|
65
|
-
if(admin){
|
|
66
|
-
expect(status).toHaveBeenCalled()
|
|
67
|
-
const password=root.querySelector('input[type=password]')! as HTMLInputElement
|
|
68
|
-
password.value='one-time';password.dispatchEvent(new Event('input',{bubbles:true}));await settle()
|
|
69
|
-
password.closest('form')!.dispatchEvent(new Event('submit',{bubbles:true,cancelable:true}));await settle()
|
|
70
|
-
expect(authorize).toHaveBeenCalledWith('one-time')
|
|
71
|
-
}else{
|
|
72
|
-
expect(status).not.toHaveBeenCalled()
|
|
73
|
-
expect(root.querySelector('input[type=password]')).toBeNull()
|
|
74
|
-
expect(call).not.toHaveBeenCalledWith('greeting.get',undefined)
|
|
75
|
-
expect(root.querySelector('textarea')).toBeNull()
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
test.each(Object.entries(waitingMessages))('waiting jobs show startup status and remain cancelable in %s',async(locale,message)=>{
|
|
81
|
-
const {delegateCopy}=await import('../src/delegate/copy')
|
|
82
|
-
const call=vi.fn(async(method:string)=>{
|
|
83
|
-
if(method==='delegate.status')return {state:'needs-admin-approval',reason:'EXECUTOR_UNAVAILABLE'}
|
|
84
|
-
if(method==='delegate.jobs.list')return {jobs:[{id:'waiting',name:'file.txt',state:'waiting_executor'}]}
|
|
85
|
-
if(method==='delegate.jobs.cancel')return {revocation_pending:true}
|
|
86
|
-
throw {code:'EXECUTOR_UNAVAILABLE'}
|
|
87
|
-
})
|
|
88
|
-
const root=mount(DelegatePanel,{ctx:{call,locale}});await settle()
|
|
89
|
-
expect(root.textContent).toContain(message)
|
|
90
|
-
expect(root.querySelector('[role=alert]')).toBeNull()
|
|
91
|
-
expect(root.textContent).not.toContain(delegateCopy(locale).needs)
|
|
92
|
-
button(root,delegateCopy(locale).cancel).click();await settle()
|
|
93
|
-
expect(call).toHaveBeenCalledWith('delegate.jobs.cancel',{id:'waiting'})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
test('waiting startup status keeps polling until the saved result arrives',async()=>{
|
|
97
|
-
vi.useFakeTimers()
|
|
98
|
-
try{
|
|
99
|
-
let lists=0
|
|
100
|
-
const call=vi.fn(async(method:string)=>{
|
|
101
|
-
if(method==='delegate.status')return {state:'ready'}
|
|
102
|
-
if(method==='delegate.list')return {delegations:[]}
|
|
103
|
-
if(method==='delegate.jobs.list')return {jobs:[{id:'waiting',name:'file.txt',state:++lists===1?'waiting_executor':'succeeded'}]}
|
|
104
|
-
throw {code:'unknown_method'}
|
|
105
|
-
})
|
|
106
|
-
const root=mount(DelegatePanel,{ctx:context(call)});await settle()
|
|
107
|
-
expect(root.querySelector('[data-job-state=waiting_executor]')).toBeTruthy()
|
|
108
|
-
vi.advanceTimersByTime(3000);await settle()
|
|
109
|
-
expect(root.querySelector('[data-job-state=succeeded]')).toBeTruthy()
|
|
110
|
-
expect(root.textContent).toContain('Saved')
|
|
111
|
-
expect(Array.from(root.querySelectorAll('button')).some(b=>b.textContent?.trim()==='Cancel job')).toBe(false)
|
|
112
|
-
}finally{vi.useRealTimers()}
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
test('a waiting job still displays unrelated permission errors',async()=>{
|
|
116
|
-
const call=vi.fn(async(method:string)=>{
|
|
117
|
-
if(method==='delegate.status')return {state:'blocked'}
|
|
118
|
-
if(method==='delegate.jobs.list')return {jobs:[{id:'waiting',name:'file.txt',state:'waiting_executor'}]}
|
|
119
|
-
throw {code:'AUTH_DENIED'}
|
|
120
|
-
})
|
|
121
|
-
const root=mount(DelegatePanel,{ctx:context(call)});await settle()
|
|
122
|
-
expect(root.querySelector('[role=alert]')?.textContent).toContain('Sign in to DSM again')
|
|
123
|
-
expect(root.textContent).toContain('Waiting for system services to start')
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
test('startup waiting catalog covers exactly nine distinct language messages',()=>{
|
|
128
|
-
expect(Object.keys(waitingMessages).sort()).toEqual(['en','zh-TW','zh-CN','de','es','fr','it','ja','ko'].sort())
|
|
129
|
-
expect(new Set(Object.values(waitingMessages)).size).toBe(9)
|
|
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
|
-
})
|
|
@@ -1,49 +0,0 @@
|
|
|
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
|
-
})
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
repo=$(cd "$(dirname "$0")/../../../.." && pwd)
|
|
4
|
-
overlay="$repo/packages/app-cli/templates/native-go-delegate"
|
|
5
|
-
fixture=$(mktemp -d "${TMPDIR:-/tmp}/delegate-ui.XXXXXX")
|
|
6
|
-
trap 'rm -rf "$fixture"' EXIT
|
|
7
|
-
cp -R "$repo/packages/app-cli/templates/native-go-vue/frontend/" "$fixture/"
|
|
8
|
-
cp -R "$repo/packages/app-cli/templates/native-go-jobs/frontend/" "$fixture/"
|
|
9
|
-
cp -R "$overlay/frontend/" "$fixture/"
|
|
10
|
-
# The normal CLI supplies this notices module when it creates a project.
|
|
11
|
-
cp "$repo/packages/app-cli/templates/_shared/third-party-notices.mjs" "$fixture/third-party-notices.mjs"
|
|
12
|
-
(cd "$fixture" && npm ci && npx vitest run test/delegate.test.ts && npm run build)
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Test the overlay as shipped, without editing the base or CLI-owned files.
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
repo=$(cd "$(dirname "$0")/../../../.." && pwd)
|
|
5
|
-
overlay="$repo/packages/app-cli/templates/native-go-delegate"
|
|
6
|
-
export SYNOPKGLAND_EXECUTOR_SOURCE="$repo/packages/app-cli/templates/_executor"
|
|
7
|
-
fixture=$(mktemp -d "${TMPDIR:-/tmp}/delegate.XXXXXX")
|
|
8
|
-
trap 'rm -rf "$fixture"' EXIT
|
|
9
|
-
cp -R "$repo/packages/app-cli/templates/native-go/backend" "$fixture/backend"
|
|
10
|
-
cp -R "$repo/packages/app-cli/templates/native-go-jobs/backend/" "$fixture/backend/"
|
|
11
|
-
rm "$fixture/backend/internal/app/background_none.go" "$fixture/backend/internal/app/delegate_none.go"
|
|
12
|
-
cp -R "$overlay/backend/" "$fixture/backend/"
|
|
13
|
-
python3 - "$fixture/backend/internal/app/routes_test.go" <<'PYCODE'
|
|
14
|
-
import sys
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
p=Path(sys.argv[1]);s=p.read_text().replace('want := ""','want := sampleOutcome[r.Method()]');p.write_text(s)
|
|
17
|
-
PYCODE
|
|
18
|
-
(cd "$fixture/backend" && go test -race -json ./... > "$overlay/.go-results.json" && go vet ./... && GOOS=linux GOARCH=amd64 go vet ./... && GOOS=linux GOARCH=arm64 go vet ./... && test -z "$(gofmt -l .)")
|