@synopackageland/cli 0.6.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +846 -0
- package/README.md +81 -89
- package/dist/add.d.ts +4 -1
- package/dist/add.js +45 -17
- package/dist/build-spk/delegate-scope.d.ts +6 -0
- package/dist/build-spk/delegate-scope.js +34 -0
- package/dist/build-spk/dsm-arch.d.ts +7 -1
- package/dist/build-spk/dsm-arch.js +24 -28
- package/dist/build-spk/dsm-platforms.json +42 -0
- package/dist/build-spk/dsm-version.d.ts +11 -0
- package/dist/build-spk/dsm-version.js +17 -0
- package/dist/build-spk/gateway.js +8 -4
- package/dist/build-spk/generator.js +30 -5
- package/dist/build-spk/go-toolchain.d.ts +20 -0
- package/dist/build-spk/go-toolchain.js +44 -0
- package/dist/build-spk/notices.js +4 -1
- package/dist/build-spk/resource-worker.js +3 -0
- package/dist/build-spk/wizard-messages.d.ts +66 -0
- package/dist/build-spk/wizard-messages.js +75 -9
- package/dist/cli.js +28 -14
- package/dist/contract/schema-validate.js +8 -0
- package/dist/contract/validate.js +30 -0
- package/dist/deploy/deploy.d.ts +1 -1
- package/dist/deploy/deploy.js +8 -0
- package/dist/deploy/native-install-values.d.ts +17 -0
- package/dist/deploy/native-install-values.js +32 -0
- package/dist/deploy/plan.d.ts +6 -2
- package/dist/deploy/plan.js +58 -7
- package/dist/deploy/spk-version.js +1 -1
- package/dist/error-registry.js +54 -20
- package/dist/host/dsm-client.d.ts +8 -4
- package/dist/host/dsm-client.js +63 -21
- package/dist/host/dsm-http.js +24 -2
- package/dist/host/types.d.ts +3 -1
- package/dist/info.js +45 -10
- package/dist/init.d.ts +3 -0
- package/dist/init.js +50 -19
- package/dist/package-metadata.d.ts +21 -0
- package/dist/package-metadata.js +101 -0
- package/dist/portal/alias.d.ts +25 -0
- package/dist/portal/alias.js +48 -0
- package/dist/portal/package.d.ts +33 -0
- package/dist/portal/package.js +116 -0
- package/dist/runtime/delegate-contract.d.ts +79 -0
- package/dist/runtime/delegate-contract.js +27 -0
- package/dist/runtime/dsm-version.d.ts +6 -0
- package/dist/runtime/dsm-version.js +8 -0
- package/dist/runtime/executor-build.js +10 -6
- package/dist/runtime/executor-inspect.d.ts +3 -0
- package/dist/runtime/executor-inspect.js +11 -5
- package/dist/runtime/executor-policy.d.ts +12 -0
- package/dist/runtime/executor-policy.js +43 -3
- package/dist/runtime/executor-scope-task.d.ts +4 -0
- package/dist/runtime/executor-scope-task.js +21 -0
- package/dist/runtime/executor-tasks.d.ts +2 -1
- package/dist/runtime/executor-tasks.js +4 -4
- package/dist/skill.js +1 -0
- package/dist/standalone/api-permissions.d.ts +10 -0
- package/dist/standalone/api-permissions.js +19 -2
- package/dist/standalone/background.d.ts +16 -0
- package/dist/standalone/background.js +69 -2
- package/dist/standalone/binary.d.ts +1 -1
- package/dist/standalone/binary.js +22 -8
- package/dist/standalone/build.d.ts +1 -1
- package/dist/standalone/build.js +38 -8
- package/dist/standalone/daemon.d.ts +1 -0
- package/dist/standalone/daemon.js +10 -5
- package/dist/standalone/dsm-window.d.ts +3 -1
- package/dist/standalone/dsm-window.js +78 -49
- package/dist/standalone/inspect-spk.d.ts +8 -0
- package/dist/standalone/inspect-spk.js +110 -27
- package/dist/standalone/lifecycle.js +86 -8
- package/dist/standalone/manifest.d.ts +13 -0
- package/dist/standalone/manifest.js +57 -8
- package/dist/standalone/native-authorization-window.d.ts +1 -1
- package/dist/standalone/native-authorization-window.js +9 -1
- package/dist/standalone/native-layout.d.ts +3 -0
- package/dist/standalone/native-layout.js +37 -5
- package/dist/standalone/native-root-window.d.ts +4 -2
- package/dist/standalone/native-root-window.js +33 -18
- package/dist/standalone/portal-window.d.ts +21 -0
- package/dist/standalone/portal-window.js +155 -0
- package/dist/standalone/portal.d.ts +4 -0
- package/dist/standalone/portal.js +4 -0
- package/dist/standalone/resource.d.ts +5 -3
- package/dist/standalone/resource.js +6 -3
- package/dist/standalone/root-window.d.ts +4 -1
- package/dist/standalone/root-window.js +193 -36
- package/dist/standalone/spk.d.ts +1 -1
- package/dist/standalone/spk.js +25 -7
- package/dist/templates/_daemon/go.mod +1 -1
- package/dist/templates/_daemon/main.go +6 -3
- package/dist/templates/_daemon/main_test.go +82 -9
- package/dist/templates/_daemon/testdata/child.go +3 -0
- package/dist/templates/_executor/README.md +130 -16
- package/dist/templates/_executor/anchor.go +156 -0
- package/dist/templates/_executor/anchor_test.go +161 -0
- package/dist/templates/_executor/apppriv_review_test.go +1 -1
- package/dist/templates/_executor/cancel_contract_test.go +236 -0
- package/dist/templates/_executor/copy.go +64 -0
- package/dist/templates/_executor/copy_test.go +88 -0
- package/dist/templates/_executor/digest_review_test.go +2 -2
- package/dist/templates/_executor/dsm.go +63 -13
- package/dist/templates/_executor/dsm_test.go +95 -1
- package/dist/templates/_executor/executor.go +260 -49
- package/dist/templates/_executor/executor_test.go +36 -6
- package/dist/templates/_executor/go.mod +2 -0
- package/dist/templates/_executor/identity.go +27 -1
- package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/dist/templates/_executor/identity_linux.go +82 -0
- package/dist/templates/_executor/identity_security_test.go +43 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
- package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/dist/templates/_executor/lifecycle_test.go +11 -0
- package/dist/templates/_executor/link_linux.go +28 -0
- package/dist/templates/_executor/long_running_test.go +530 -0
- package/dist/templates/_executor/main.go +83 -25
- package/dist/templates/_executor/managed.go +3 -3
- package/dist/templates/_executor/managed_test.go +3 -3
- package/dist/templates/_executor/move_linux.go +490 -0
- package/dist/templates/_executor/move_linux_test.go +460 -0
- package/dist/templates/_executor/move_validation.go +46 -0
- package/dist/templates/_executor/move_validation_test.go +187 -0
- package/dist/templates/_executor/operations.go +926 -0
- package/dist/templates/_executor/path_test.go +18 -0
- package/dist/templates/_executor/pid.go +37 -0
- package/dist/templates/_executor/pid_test.go +113 -0
- package/dist/templates/_executor/platform_linux.go +24 -173
- package/dist/templates/_executor/platform_linux_test.go +9 -65
- package/dist/templates/_executor/platform_other.go +38 -4
- package/dist/templates/_executor/process.go +3 -0
- package/dist/templates/_executor/purge_log.go +18 -0
- package/dist/templates/_executor/records.go +242 -0
- package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/dist/templates/_executor/scope_client.go +37 -0
- package/dist/templates/_executor/scope_contract.go +12 -0
- package/dist/templates/_executor/selected_scope.go +146 -0
- package/dist/templates/_executor/selected_scope_test.go +186 -0
- package/dist/templates/_executor/status_disabled_test.go +33 -0
- package/dist/templates/_executor/store.go +4 -3
- package/dist/templates/_executor/supervise.go +109 -0
- package/dist/templates/_executor/supervise_test.go +130 -0
- package/dist/templates/_executor/task_race_review_test.go +1 -1
- package/dist/templates/_executor/tasks.go +52 -15
- package/dist/templates/_executor/tasks_dsm71_test.go +114 -0
- package/dist/templates/_executor/tasks_review_test.go +1 -1
- package/dist/templates/_executor/tasks_test.go +62 -5
- package/dist/templates/_executor/upgrade_watch_test.go +13 -5
- package/dist/templates/_executor/watch.go +8 -0
- package/dist/templates/_executor/watch_test.go +23 -2
- package/dist/templates/_executor/write_review_linux_test.go +4 -12
- package/dist/templates/_gateway/go.mod +2 -0
- package/dist/templates/_shared/AGENTS.md +129 -0
- package/dist/templates/binary/dsm-package.yaml +24 -0
- package/dist/templates/binary/i18n/messages/de.json +4 -0
- package/dist/templates/binary/i18n/messages/en.json +4 -0
- package/dist/templates/binary/i18n/messages/es.json +4 -0
- package/dist/templates/binary/i18n/messages/fr.json +4 -0
- package/dist/templates/binary/i18n/messages/it.json +4 -0
- package/dist/templates/binary/i18n/messages/ja.json +4 -0
- package/dist/templates/binary/i18n/messages/ko.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/dist/templates/binary/ui/app.js +19 -4
- package/dist/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/dist/templates/native-authorization/i18n/de.json +1 -0
- package/dist/templates/native-authorization/i18n/en.json +1 -0
- package/dist/templates/native-authorization/i18n/es.json +2 -1
- package/dist/templates/native-authorization/i18n/fr.json +1 -0
- package/dist/templates/native-authorization/i18n/it.json +11 -10
- package/dist/templates/native-authorization/i18n/ja.json +1 -0
- package/dist/templates/native-authorization/i18n/ko.json +10 -9
- package/dist/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/dist/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/dist/templates/native-go/README.md +43 -10
- package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
- package/dist/templates/native-go/backend/go.mod +1 -1
- package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
- package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/dist/templates/native-go/backend/internal/api/server.go +18 -5
- package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
- package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
- package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
- package/dist/templates/native-go/backend/internal/background/store.go +16 -14
- package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/README.md +5 -1
- package/dist/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/dist/templates/native-go/backend/internal/identity/http.go +1 -1
- package/dist/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/dist/templates/native-go/backend/internal/identity/service.go +1 -1
- package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/dist/templates/native-go/dsm-package.yaml +20 -1
- package/dist/templates/native-go/i18n/glossary.json +2 -1
- package/dist/templates/native-go/i18n/messages/de.json +1 -0
- package/dist/templates/native-go/i18n/messages/en.json +1 -0
- package/dist/templates/native-go/i18n/messages/es.json +1 -0
- package/dist/templates/native-go/i18n/messages/fr.json +1 -0
- package/dist/templates/native-go/i18n/messages/it.json +1 -0
- package/dist/templates/native-go/i18n/messages/ja.json +1 -0
- package/dist/templates/native-go/i18n/messages/ko.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/dist/templates/native-go/ui/app.css +10 -0
- package/dist/templates/native-go/ui/app.js +11 -1
- package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
- package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/dist/templates/native-go-delegate/test.sh +1 -0
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/dist/templates/native-go-vue/README.md +4 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/dist/templates/native-go-vue/frontend/package.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
- package/package.json +5 -1
- package/schema/package-metadata.schema.json +101 -0
- package/schema/synology-app.schema.json +112 -0
- package/skills/SKILL.md +106 -4
- package/skills/reference/create.md +101 -2
- package/skills/reference/deploy.md +2 -2
- package/skills/reference/files.md +113 -2
- package/skills/reference/identity.md +70 -1
- package/skills/reference/portal.md +17 -0
- package/skills/reference/ui-vue.md +12 -0
- package/templates/_daemon/go.mod +1 -1
- package/templates/_daemon/main.go +6 -3
- package/templates/_daemon/main_test.go +82 -9
- package/templates/_daemon/testdata/child.go +3 -0
- package/templates/_executor/README.md +130 -16
- package/templates/_executor/anchor.go +156 -0
- package/templates/_executor/anchor_test.go +161 -0
- package/templates/_executor/apppriv_review_test.go +1 -1
- package/templates/_executor/cancel_contract_test.go +236 -0
- package/templates/_executor/copy.go +64 -0
- package/templates/_executor/copy_test.go +88 -0
- package/templates/_executor/digest_review_test.go +2 -2
- package/templates/_executor/dsm.go +63 -13
- package/templates/_executor/dsm_test.go +95 -1
- package/templates/_executor/executor.go +260 -49
- package/templates/_executor/executor_test.go +36 -6
- package/templates/_executor/go.mod +2 -0
- package/templates/_executor/identity.go +27 -1
- package/templates/_executor/identity_kernel_linux_test.go +60 -0
- package/templates/_executor/identity_linux.go +82 -0
- package/templates/_executor/identity_security_test.go +43 -0
- package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
- package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
- package/templates/_executor/internal/taskscript/boot.sh +9 -9
- package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
- package/templates/_executor/internal/taskscript/control.sh +15 -10
- package/templates/_executor/internal/taskscript/tasks.go +5 -3
- package/templates/_executor/lifecycle_test.go +11 -0
- package/templates/_executor/link_linux.go +28 -0
- package/templates/_executor/long_running_test.go +530 -0
- package/templates/_executor/main.go +83 -25
- package/templates/_executor/managed.go +3 -3
- package/templates/_executor/managed_test.go +3 -3
- package/templates/_executor/move_linux.go +490 -0
- package/templates/_executor/move_linux_test.go +460 -0
- package/templates/_executor/move_validation.go +46 -0
- package/templates/_executor/move_validation_test.go +187 -0
- package/templates/_executor/operations.go +926 -0
- package/templates/_executor/path_test.go +18 -0
- package/templates/_executor/pid.go +37 -0
- package/templates/_executor/pid_test.go +113 -0
- package/templates/_executor/platform_linux.go +24 -173
- package/templates/_executor/platform_linux_test.go +9 -65
- package/templates/_executor/platform_other.go +38 -4
- package/templates/_executor/process.go +3 -0
- package/templates/_executor/purge_log.go +18 -0
- package/templates/_executor/records.go +242 -0
- package/templates/_executor/scope_cancel_contract_test.go +91 -0
- package/templates/_executor/scope_client.go +37 -0
- package/templates/_executor/scope_contract.go +12 -0
- package/templates/_executor/selected_scope.go +146 -0
- package/templates/_executor/selected_scope_test.go +186 -0
- package/templates/_executor/status_disabled_test.go +33 -0
- package/templates/_executor/store.go +4 -3
- package/templates/_executor/supervise.go +109 -0
- package/templates/_executor/supervise_test.go +130 -0
- package/templates/_executor/task_race_review_test.go +1 -1
- package/templates/_executor/tasks.go +52 -15
- package/templates/_executor/tasks_dsm71_test.go +114 -0
- package/templates/_executor/tasks_review_test.go +1 -1
- package/templates/_executor/tasks_test.go +62 -5
- package/templates/_executor/upgrade_watch_test.go +13 -5
- package/templates/_executor/watch.go +8 -0
- package/templates/_executor/watch_test.go +23 -2
- package/templates/_executor/write_review_linux_test.go +4 -12
- package/templates/_gateway/go.mod +2 -0
- package/templates/_shared/AGENTS.md +129 -0
- package/templates/binary/dsm-package.yaml +24 -0
- package/templates/binary/i18n/messages/de.json +4 -0
- package/templates/binary/i18n/messages/en.json +4 -0
- package/templates/binary/i18n/messages/es.json +4 -0
- package/templates/binary/i18n/messages/fr.json +4 -0
- package/templates/binary/i18n/messages/it.json +4 -0
- package/templates/binary/i18n/messages/ja.json +4 -0
- package/templates/binary/i18n/messages/ko.json +4 -0
- package/templates/binary/i18n/messages/zh-CN.json +4 -0
- package/templates/binary/i18n/messages/zh-TW.json +4 -0
- package/templates/binary/ui/app.js +19 -4
- package/templates/native-authorization/AuthorizationGate.vue +5 -3
- package/templates/native-authorization/i18n/de.json +1 -0
- package/templates/native-authorization/i18n/en.json +1 -0
- package/templates/native-authorization/i18n/es.json +2 -1
- package/templates/native-authorization/i18n/fr.json +1 -0
- package/templates/native-authorization/i18n/it.json +11 -10
- package/templates/native-authorization/i18n/ja.json +1 -0
- package/templates/native-authorization/i18n/ko.json +10 -9
- package/templates/native-authorization/i18n/zh-CN.json +6 -5
- package/templates/native-authorization/i18n/zh-TW.json +6 -5
- package/templates/native-go/README.md +43 -10
- package/templates/native-go/backend/cmd/app/main.go +27 -7
- package/templates/native-go/backend/go.mod +1 -1
- package/templates/native-go/backend/internal/api/entry_test.go +47 -0
- package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
- package/templates/native-go/backend/internal/api/registry.go +11 -0
- package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
- package/templates/native-go/backend/internal/api/server.go +18 -5
- package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
- package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
- package/templates/native-go/backend/internal/app/portal.go +30 -0
- package/templates/native-go/backend/internal/app/portal_test.go +55 -0
- package/templates/native-go/backend/internal/app/routes.go +8 -2
- package/templates/native-go/backend/internal/background/runner.go +1 -1
- package/templates/native-go/backend/internal/background/store.go +16 -14
- package/templates/native-go/backend/internal/dsm/admin.go +8 -2
- package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
- package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
- package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
- package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
- package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
- package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
- package/templates/native-go/backend/internal/dsm/entry.go +177 -0
- package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
- package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
- package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
- package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
- package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
- package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
- package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
- package/templates/native-go/backend/internal/filestation/client.go +39 -3
- package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
- package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
- package/templates/native-go/backend/internal/filestation/service.go +1 -1
- package/templates/native-go/backend/internal/identity/README.md +5 -1
- package/templates/native-go/backend/internal/identity/dsm.go +24 -5
- package/templates/native-go/backend/internal/identity/http.go +1 -1
- package/templates/native-go/backend/internal/identity/identity_test.go +48 -1
- package/templates/native-go/backend/internal/identity/service.go +1 -1
- package/templates/native-go/backend/internal/portal/portal.go +138 -0
- package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
- package/templates/native-go/dsm-package.yaml +20 -1
- package/templates/native-go/i18n/glossary.json +2 -1
- package/templates/native-go/i18n/messages/de.json +1 -0
- package/templates/native-go/i18n/messages/en.json +1 -0
- package/templates/native-go/i18n/messages/es.json +1 -0
- package/templates/native-go/i18n/messages/fr.json +1 -0
- package/templates/native-go/i18n/messages/it.json +1 -0
- package/templates/native-go/i18n/messages/ja.json +1 -0
- package/templates/native-go/i18n/messages/ko.json +1 -0
- package/templates/native-go/i18n/messages/zh-CN.json +1 -0
- package/templates/native-go/i18n/messages/zh-TW.json +1 -0
- package/templates/native-go/ui/app.css +10 -0
- package/templates/native-go/ui/app.js +11 -1
- package/templates/native-go-delegate/DELEGATE.md +126 -5
- package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
- package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
- package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
- package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
- package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
- package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
- package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
- package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
- package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
- package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
- package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
- package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
- package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
- package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
- package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
- package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
- package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
- package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
- package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
- package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
- package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
- package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
- package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
- package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
- package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
- package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
- package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
- package/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
- package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
- package/templates/native-go-delegate/test.sh +1 -0
- package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
- package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
- package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
- package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
- package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
- package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
- package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
- package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
- package/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
- package/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
- package/templates/native-go-vue/README.md +4 -0
- package/templates/native-go-vue/frontend/package-lock.json +4 -4
- package/templates/native-go-vue/frontend/package.json +1 -1
- package/templates/native-go-vue/frontend/src/App.vue +18 -13
- package/templates/native-go-vue/frontend/src/context.ts +31 -0
- package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
- package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
- package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
- package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
- package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
- package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
- package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
- package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
- package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
- package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
- package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
- package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
- package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
- package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
- package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
- package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
- package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
- package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
- package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
- package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
- package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
- package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
- package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
- package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
- package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
- package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
- package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
|
@@ -4,9 +4,11 @@ import { contractSpan, makeError } from "../errors.js";
|
|
|
4
4
|
import { collectInstallParameters, getValuePosition, stringViolations, } from "./load.js";
|
|
5
5
|
import { validateContractSchema } from "./schema-validate.js";
|
|
6
6
|
import { DSM_GROUP_NAME, isWebAccessMode, isWebLaunchMode, readWebIntegration } from "./web-launch.js";
|
|
7
|
+
import { contractPortalSupported, readPortalDeclaration } from "../portal/alias.js";
|
|
7
8
|
import { loadCompose } from "../compose/analyze.js";
|
|
8
9
|
import { collectPosixAllSharesParameters, isPosixAllSharesType, validatePosixAllSharesSources, } from "./posix-all-shares.js";
|
|
9
10
|
import { getErrorCode } from "../error-registry.js";
|
|
11
|
+
import { isDsmAtLeast, PORTAL_MIN_DSM, portalMinDsmMessage } from "../build-spk/dsm-version.js";
|
|
10
12
|
import { FORMAL_PACKAGE_IDENTITY_MAX_LENGTH, PACKAGE_IDENTITY_MAX_LENGTH, } from "../deploy/identity-shared.js";
|
|
11
13
|
/** DSM 7.4 Package Center rejects a longer package identity outright. */
|
|
12
14
|
const DSM_PACKAGE_IDENTITY_MAX = 32;
|
|
@@ -53,6 +55,7 @@ export function validateContract(parsed, contractFile) {
|
|
|
53
55
|
errors.push(...validatePosixAllShares(parsed, contractFile));
|
|
54
56
|
errors.push(...validateWebLaunch(parsed, contractFile));
|
|
55
57
|
errors.push(...validateWebAccess(parsed, contractFile));
|
|
58
|
+
errors.push(...validateWebPortal(parsed, contractFile));
|
|
56
59
|
return errors;
|
|
57
60
|
}
|
|
58
61
|
function validatePosixAllShares(parsed, contractFile) {
|
|
@@ -119,6 +122,33 @@ function validateWebAccess(parsed, contractFile) {
|
|
|
119
122
|
}
|
|
120
123
|
return [];
|
|
121
124
|
}
|
|
125
|
+
function validateWebPortal(parsed, contractFile) {
|
|
126
|
+
const { contract, doc } = parsed;
|
|
127
|
+
const portal = readWebIntegration(contract)?.portal;
|
|
128
|
+
if (portal === undefined) {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const pos = getValuePosition(doc, ["integration", "web", "portal"]) ?? { line: 1, column: 1 };
|
|
132
|
+
const at = contractSpan(contractFile, pos.line, pos.column, "integration.web.portal");
|
|
133
|
+
if (!contractPortalSupported(contract)) {
|
|
134
|
+
return [
|
|
135
|
+
makeError("CONTRACT_PORTAL_UNSUPPORTED", at, "Application Portal 只支援以 DSM 視窗開啟、經 DSM 登入閘道的網頁 App。", "請使用 adminport、launch: dsm-window 與非 public 的 access,或移除 integration.web.portal。public App 已有同名的 Web Station 網址。"),
|
|
136
|
+
];
|
|
137
|
+
}
|
|
138
|
+
if (!readPortalDeclaration(portal, String(contract.package ?? ""))) {
|
|
139
|
+
return [
|
|
140
|
+
makeError("CONTRACT_PORTAL_INVALID", at, "integration.web.portal 必須是 {} 或 { alias },alias 為 1–64 個小寫英數字或 -,且不是 DSM 保留路徑。", "請省略 alias 以使用套件名稱,或改成例如 alias: my-app。"),
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
const osMinVer = contract.os_min_ver;
|
|
144
|
+
if (typeof osMinVer === "string" && FULL_OS_MIN_VER.test(osMinVer) && !isDsmAtLeast(osMinVer, PORTAL_MIN_DSM)) {
|
|
145
|
+
return [
|
|
146
|
+
makeError("CONTRACT_PORTAL_MIN_DSM", at, portalMinDsmMessage(osMinVer, "integration.web.portal"), `請把 os_min_ver 改成 "${PORTAL_MIN_DSM}" 或更新,或移除 integration.web.portal。`),
|
|
147
|
+
];
|
|
148
|
+
}
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
const FULL_OS_MIN_VER = /^7\.\d+(\.\d+)?-\d+$/;
|
|
122
152
|
function validateDeveloperString(value, contractFile, path, pos) {
|
|
123
153
|
const errors = [];
|
|
124
154
|
const violations = stringViolations(value);
|
package/dist/deploy/deploy.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CommandRunner } from "../standalone/build.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type NativeArchFamily } from "../build-spk/dsm-arch.js";
|
|
3
3
|
import type { ProjectRoot } from "../discovery.js";
|
|
4
4
|
import type { NasHost } from "../host/types.js";
|
|
5
5
|
import { resolveDeploySpkVersion } from "./spk-version.js";
|
package/dist/deploy/deploy.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { buildSpk } from "../build-spk/generator.js";
|
|
2
|
+
import { CONTAINER_ARCH_FAMILIES, isContainerArchFamily } from "../build-spk/dsm-arch.js";
|
|
2
3
|
import { loadContract } from "../contract/load.js";
|
|
3
4
|
import { usesAuthGateway } from "../contract/web-launch.js";
|
|
4
5
|
import { findUnsupportedInstallTypes } from "../contract/unsupported-types.js";
|
|
@@ -174,6 +175,13 @@ export async function deployProject(options) {
|
|
|
174
175
|
};
|
|
175
176
|
}
|
|
176
177
|
}
|
|
178
|
+
if (archFamily !== undefined && !isContainerArchFamily(archFamily)) {
|
|
179
|
+
return {
|
|
180
|
+
ok: false,
|
|
181
|
+
code: "CONTAINER_ARCH_UNSUPPORTED",
|
|
182
|
+
message: `Container Manager App 只支援 ${CONTAINER_ARCH_FAMILIES.join("、")};DSM 不為 ${archFamily} 提供 Container Manager。`,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
177
185
|
const build = await buildSpk({
|
|
178
186
|
project: options.project,
|
|
179
187
|
packageIdentity: identity.packageId,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StandaloneManifest } from "../standalone/manifest.js";
|
|
2
|
+
export type NativeInstallValuesResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
extraValues: Record<string, string>;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
code: string;
|
|
8
|
+
message: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Install wizard values for a native-go/binary deploy. Only an install-selected
|
|
12
|
+
* delegate asks the wizard for anything; preinst refuses an empty selection on
|
|
13
|
+
* the first install, so refuse it here before building or uploading.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveNativeInstallValues(manifest: StandaloneManifest, provided: Record<string, string>, state: {
|
|
16
|
+
installed: boolean;
|
|
17
|
+
}): NativeInstallValuesResult;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const USAGE = "synopkgland deploy --param delegate_share=<shared folder>,或 --param delegate_home=true";
|
|
2
|
+
/** Mirrors the preinst draft check in build-spk/delegate-scope.ts. */
|
|
3
|
+
function validShareName(name) {
|
|
4
|
+
return (name !== "" && name !== "." && !name.includes("..") &&
|
|
5
|
+
!/[/\\:"%\x00-\x1f\x7f]/.test(name) &&
|
|
6
|
+
!/^homes?$/i.test(name) && name.trim() === name && name.length <= 256);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Install wizard values for a native-go/binary deploy. Only an install-selected
|
|
10
|
+
* delegate asks the wizard for anything; preinst refuses an empty selection on
|
|
11
|
+
* the first install, so refuse it here before building or uploading.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveNativeInstallValues(manifest, provided, state) {
|
|
14
|
+
const fail = (code, message) => ({ ok: false, code, message });
|
|
15
|
+
const selected = manifest.capabilities.delegate?.scope === "install-selected";
|
|
16
|
+
const names = Object.keys(provided);
|
|
17
|
+
if (!selected && names.length)
|
|
18
|
+
return fail("DEPLOY_PARAM_UNDECLARED", `${manifest.package} has no install wizard values; remove --param ${names[0]}.`);
|
|
19
|
+
const unknown = names.find((name) => name !== "delegate_share" && name !== "delegate_home");
|
|
20
|
+
if (unknown)
|
|
21
|
+
return fail("DEPLOY_PARAM_UNDECLARED", `--param ${unknown} is not an install wizard value. Use: ${USAGE}.`);
|
|
22
|
+
const { delegate_share: share, delegate_home: home } = provided;
|
|
23
|
+
if (home !== undefined && home !== "true" && home !== "false")
|
|
24
|
+
return fail("DEPLOY_PARAM_TYPE_INVALID", "--param delegate_home must be true or false.");
|
|
25
|
+
if (share !== undefined && !validShareName(share))
|
|
26
|
+
return fail("DEPLOY_PARAM_TYPE_INVALID", `--param delegate_share must be one Shared Folder name, not a path, home or homes.`);
|
|
27
|
+
if (share !== undefined && home === "true")
|
|
28
|
+
return fail("DEPLOY_PARAM_TYPE_INVALID", "Choose either --param delegate_share or --param delegate_home=true, not both.");
|
|
29
|
+
if (selected && !state.installed && share === undefined && home !== "true")
|
|
30
|
+
return fail("DEPLOY_PARAM_REQUIRED", `The first install of ${manifest.package} must select the delegate scope: ${USAGE}.`);
|
|
31
|
+
return { ok: true, extraValues: { ...provided } };
|
|
32
|
+
}
|
package/dist/deploy/plan.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { type CommandRunner } from "../standalone/build.js";
|
|
1
2
|
import type { NativeArchFamily } from "../build-spk/dsm-arch.js";
|
|
2
3
|
import type { NasHost } from "../host/types.js";
|
|
3
4
|
export interface DeploymentPlan {
|
|
4
5
|
root: string;
|
|
5
|
-
kind: "native-go" | "binary" | "container";
|
|
6
|
+
kind: "native-go" | "binary" | "native-layout" | "container";
|
|
6
7
|
packageId: string;
|
|
7
8
|
version: string;
|
|
8
9
|
arch?: NativeArchFamily;
|
|
@@ -15,4 +16,7 @@ export declare function planDeployment(root: string, options?: {
|
|
|
15
16
|
arch?: NativeArchFamily;
|
|
16
17
|
dev?: boolean;
|
|
17
18
|
}): DeploymentPlan;
|
|
18
|
-
export declare function deployStandalone(plan: DeploymentPlan, host: NasHost
|
|
19
|
+
export declare function deployStandalone(plan: DeploymentPlan, host: NasHost, options?: {
|
|
20
|
+
params?: Record<string, string>;
|
|
21
|
+
run?: CommandRunner;
|
|
22
|
+
}): Promise<string>;
|
package/dist/deploy/plan.js
CHANGED
|
@@ -3,14 +3,18 @@ import { loadContract } from "../contract/load.js";
|
|
|
3
3
|
import { validateProject } from "../validate.js";
|
|
4
4
|
import { findStandaloneRoot, loadStandaloneManifest, } from "../standalone/manifest.js";
|
|
5
5
|
import { buildStandalone } from "../standalone/build.js";
|
|
6
|
+
import { buildNativeLayout, isNativeLayout, loadNativeLayout } from "../standalone/native-layout.js";
|
|
6
7
|
import { resolveDeployIdentity } from "./identity.js";
|
|
7
8
|
import { nextDeployVersion } from "./spk-version.js";
|
|
9
|
+
import { resolveNativeInstallValues } from "./native-install-values.js";
|
|
8
10
|
function fail(code, message) {
|
|
9
11
|
return Object.assign(new Error(`[${code}] ${message}`), { code });
|
|
10
12
|
}
|
|
11
13
|
/** Purely local planning: no credentials, network, build or installation. */
|
|
12
14
|
export function planDeployment(root, options = {}) {
|
|
13
15
|
const standalone = findStandaloneRoot(root);
|
|
16
|
+
if (standalone && isNativeLayout(standalone))
|
|
17
|
+
return planNativeLayout(standalone, options);
|
|
14
18
|
if (standalone) {
|
|
15
19
|
const validation = validateProject(findProjectRoot(standalone));
|
|
16
20
|
if (!validation.ok)
|
|
@@ -22,7 +26,7 @@ export function planDeployment(root, options = {}) {
|
|
|
22
26
|
if (options.dev)
|
|
23
27
|
throw fail("DEVELOPMENT_INSTANCE_UNSUPPORTED", "--dev is not supported for native-go/binary; choose a distinct package name at init");
|
|
24
28
|
if (options.arch && !m.arches.includes(options.arch))
|
|
25
|
-
throw fail("STANDALONE_ARCH_NOT_DECLARED", `Architecture not declared: ${options.arch}`);
|
|
29
|
+
throw fail("STANDALONE_ARCH_NOT_DECLARED", `Architecture not declared: ${options.arch}; add it to dsm-package.yaml arches to deploy it`);
|
|
26
30
|
return {
|
|
27
31
|
root: standalone,
|
|
28
32
|
kind: m.backend.kind === "go" ? "native-go" : "binary",
|
|
@@ -33,7 +37,7 @@ export function planDeployment(root, options = {}) {
|
|
|
33
37
|
transport: "dsm-local-spk",
|
|
34
38
|
notes: m.capabilities.rootOps || m.capabilities.delegate
|
|
35
39
|
? [
|
|
36
|
-
"Installation does not mean ready. Approve boot and control tasks once in the App window
|
|
40
|
+
"Installation does not mean ready. Approve boot and control tasks once in the App window. An executor-only upgrade stays ready without approval (INFO anchors the executor digest); a policy digest change requires approval again.",
|
|
37
41
|
]
|
|
38
42
|
: [],
|
|
39
43
|
};
|
|
@@ -59,7 +63,56 @@ export function planDeployment(root, options = {}) {
|
|
|
59
63
|
],
|
|
60
64
|
};
|
|
61
65
|
}
|
|
62
|
-
|
|
66
|
+
/** DSM reports the aarch64 family; a native layout may name it armv8. */
|
|
67
|
+
function layoutArchFor(arches, family) {
|
|
68
|
+
const names = family === "aarch64" ? ["aarch64", "armv8"] : [family];
|
|
69
|
+
return names.find((name) => arches.includes(name));
|
|
70
|
+
}
|
|
71
|
+
function loadLayout(root) {
|
|
72
|
+
const loaded = loadNativeLayout(root);
|
|
73
|
+
if (!loaded.ok)
|
|
74
|
+
throw fail(loaded.errors[0].code, loaded.errors.map((e) => e.message).join("\n"));
|
|
75
|
+
return loaded.manifest;
|
|
76
|
+
}
|
|
77
|
+
function planNativeLayout(root, options) {
|
|
78
|
+
const m = loadLayout(root);
|
|
79
|
+
if (options.dev)
|
|
80
|
+
throw fail("DEVELOPMENT_INSTANCE_UNSUPPORTED", "--dev is not supported for a native layout; choose a distinct package name");
|
|
81
|
+
if (options.arch && !layoutArchFor(m.arches, options.arch))
|
|
82
|
+
throw fail("STANDALONE_ARCH_NOT_DECLARED", `Architecture not declared: ${options.arch}; add it to dsm-package.yaml arches to deploy it`);
|
|
83
|
+
return {
|
|
84
|
+
root,
|
|
85
|
+
kind: "native-layout",
|
|
86
|
+
packageId: m.package,
|
|
87
|
+
version: `${m.version}-${String(m.build).padStart(4, "0")}`,
|
|
88
|
+
arch: options.arch,
|
|
89
|
+
capabilities: [],
|
|
90
|
+
transport: "dsm-local-spk",
|
|
91
|
+
notes: [],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async function buildForDeploy(plan, arch, installed, options) {
|
|
95
|
+
if (plan.kind === "native-layout") {
|
|
96
|
+
const m = loadLayout(plan.root);
|
|
97
|
+
const layoutArch = layoutArchFor(m.arches, arch);
|
|
98
|
+
if (!layoutArch)
|
|
99
|
+
throw fail("STANDALONE_ARCH_NOT_DECLARED", `Architecture not declared: ${arch}; add it to dsm-package.yaml arches to deploy it`);
|
|
100
|
+
const name = Object.keys(options.params ?? {})[0];
|
|
101
|
+
if (name)
|
|
102
|
+
throw fail("DEPLOY_PARAM_UNDECLARED", `${m.package} has no install wizard values; remove --param ${name}.`);
|
|
103
|
+
const { outputs } = await buildNativeLayout({ root: plan.root, arches: [layoutArch], run: options.run });
|
|
104
|
+
return { outputs, extraValues: {} };
|
|
105
|
+
}
|
|
106
|
+
const loaded = loadStandaloneManifest(plan.root);
|
|
107
|
+
if (!loaded.ok)
|
|
108
|
+
throw fail(loaded.errors[0].code, loaded.errors.map((e) => e.message).join("\n"));
|
|
109
|
+
const values = resolveNativeInstallValues(loaded.manifest, options.params ?? {}, { installed });
|
|
110
|
+
if (!values.ok)
|
|
111
|
+
throw fail(values.code, values.message);
|
|
112
|
+
const { outputs } = await buildStandalone({ root: plan.root, arches: [arch], run: options.run });
|
|
113
|
+
return { outputs, extraValues: values.extraValues };
|
|
114
|
+
}
|
|
115
|
+
export async function deployStandalone(plan, host, options = {}) {
|
|
63
116
|
if (plan.kind === "container")
|
|
64
117
|
throw fail("DEPLOY_PLAN_INVALID", "Expected native-go or binary deployment plan");
|
|
65
118
|
const arch = plan.arch ?? (await host.getArchFamily?.());
|
|
@@ -70,16 +123,14 @@ export async function deployStandalone(plan, host) {
|
|
|
70
123
|
nextDeployVersion(plan.version, installed) !== plan.version) {
|
|
71
124
|
throw fail("DEPLOY_VERSION_INVALID", `Increase dsm-package.yaml version/build above installed ${installed}`);
|
|
72
125
|
}
|
|
73
|
-
const { outputs } = await
|
|
74
|
-
root: plan.root,
|
|
75
|
-
arches: [arch],
|
|
76
|
-
});
|
|
126
|
+
const { outputs, extraValues } = await buildForDeploy(plan, arch, Boolean(installed), options);
|
|
77
127
|
if (outputs.length !== 1)
|
|
78
128
|
throw fail("DEPLOY_BUILD_OUTPUT_INVALID", "Expected one SPK");
|
|
79
129
|
await host.installFromLocalSpk({
|
|
80
130
|
packageId: plan.packageId,
|
|
81
131
|
version: plan.version,
|
|
82
132
|
spkPath: outputs[0],
|
|
133
|
+
extraValues,
|
|
83
134
|
});
|
|
84
135
|
return outputs[0];
|
|
85
136
|
}
|
|
@@ -18,7 +18,7 @@ export function nextDeployVersion(version, installed) {
|
|
|
18
18
|
break;
|
|
19
19
|
}
|
|
20
20
|
if (order < 0)
|
|
21
|
-
throw new Error(`Refusing downgrade from ${installed} to ${version}`);
|
|
21
|
+
throw new Error(`[DEPLOY_VERSION_INVALID] Refusing downgrade from ${installed} to ${version}`);
|
|
22
22
|
if (order === 0)
|
|
23
23
|
build = Math.max(build, Number(previous[2] ?? 0) + 1);
|
|
24
24
|
}
|
package/dist/error-registry.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const ERROR_REGISTRY = {
|
|
2
2
|
"NATIVE_LAYOUT_INVALID": {
|
|
3
3
|
code: "NATIVE_LAYOUT_INVALID",
|
|
4
|
-
description: "
|
|
5
|
-
suggestion: "
|
|
4
|
+
description: "native layout 的 manifest、hook、toolkit 或產物違反 package-only 契約。",
|
|
5
|
+
suggestion: "使用 schema 2 與 backend.kind: native;檢查路徑、ELF 連結與 checksum pin。"
|
|
6
6
|
},
|
|
7
7
|
"COMPOSE_ROUTE_UNSUPPORTED": {
|
|
8
8
|
"code": "COMPOSE_ROUTE_UNSUPPORTED",
|
|
@@ -59,6 +59,16 @@ export const ERROR_REGISTRY = {
|
|
|
59
59
|
"description": "Headless App 不需要宣告 Web Launch Mode。",
|
|
60
60
|
"suggestion": "請省略 integration.web.launch,或補上對應 Compose published port 的 adminport。"
|
|
61
61
|
},
|
|
62
|
+
"CONTRACT_PORTAL_INVALID": {
|
|
63
|
+
"code": "CONTRACT_PORTAL_INVALID",
|
|
64
|
+
"description": "integration.web.portal 的格式或 alias 不正確。",
|
|
65
|
+
"suggestion": "請使用 {} 或 { alias: my-app };alias 為 1–64 個小寫英數字或 -,且不是 DSM 保留路徑。"
|
|
66
|
+
},
|
|
67
|
+
"CONTRACT_PORTAL_UNSUPPORTED": {
|
|
68
|
+
"code": "CONTRACT_PORTAL_UNSUPPORTED",
|
|
69
|
+
"description": "這個 App 的網頁入口無法加入 DSM Application Portal。",
|
|
70
|
+
"suggestion": "Application Portal 需要 adminport、launch: dsm-window 與非 public 的 access;否則請移除 integration.web.portal。"
|
|
71
|
+
},
|
|
62
72
|
"CONTRACT_ACCESS_INVALID": {
|
|
63
73
|
"code": "CONTRACT_ACCESS_INVALID",
|
|
64
74
|
"description": "integration.web.access 模式無效。",
|
|
@@ -87,12 +97,12 @@ export const ERROR_REGISTRY = {
|
|
|
87
97
|
"GATEWAY_GO_MISSING": {
|
|
88
98
|
"code": "GATEWAY_GO_MISSING",
|
|
89
99
|
"description": "建置 DSM 驗證閘道需要 Go,但找不到 go 指令。",
|
|
90
|
-
"suggestion": "請安裝 Go 1.
|
|
100
|
+
"suggestion": "請安裝 Go 1.21 以上版本(https://go.dev/dl/,建置時固定使用 go1.26.9),或在 integration.web.access 明確選 public。"
|
|
91
101
|
},
|
|
92
102
|
"GATEWAY_BUILD_FAILED": {
|
|
93
103
|
"code": "GATEWAY_BUILD_FAILED",
|
|
94
104
|
"description": "DSM 驗證閘道建置失敗或產出不是對應架構的靜態 ELF。",
|
|
95
|
-
"suggestion": "請查看 go build
|
|
105
|
+
"suggestion": "請查看 go build 輸出;閘道固定以 go1.26.9 建置,離線時請安裝 go1.26.9 或讓 GOPROXY 可提供 golang.org/toolchain,並確認 templates/_gateway 未被修改。"
|
|
96
106
|
},
|
|
97
107
|
"CONTRACT_INVALID_STRING": {
|
|
98
108
|
"code": "CONTRACT_INVALID_STRING",
|
|
@@ -116,13 +126,13 @@ export const ERROR_REGISTRY = {
|
|
|
116
126
|
},
|
|
117
127
|
"CONTRACT_SECRET_UNSUPPORTED": {
|
|
118
128
|
"code": "CONTRACT_SECRET_UNSUPPORTED",
|
|
119
|
-
"description": "install.<NAME>.type: secret
|
|
120
|
-
"suggestion": "請改用 type: string(非敏感值),或把敏感值改成 App 啟動後自行取得/由管理員放進 ${SYNO_APP_SECRETS_DIR}
|
|
129
|
+
"description": "install.<NAME>.type: secret 目前沒有可用的安裝路徑:無論是否在 Compose 引用,Package Center 安裝都以 DSM broken/150 結束,且不建立 Container Manager project。",
|
|
130
|
+
"suggestion": "請改用 type: string(非敏感值),或把敏感值改成 App 啟動後自行取得/由管理員放進 ${SYNO_APP_SECRETS_DIR} 的檔案。在 DSM worker 的失敗原因可觀測之前,secret 型別不會開放。"
|
|
121
131
|
},
|
|
122
132
|
"CONTRACT_HOMES_UNSUPPORTED": {
|
|
123
133
|
"code": "CONTRACT_HOMES_UNSUPPORTED",
|
|
124
|
-
"description": "install.<NAME>.type: homes
|
|
125
|
-
"suggestion": "若 App 需要一個由管理員選定的資料夾,請改用 type: shared_folder
|
|
134
|
+
"description": "install.<NAME>.type: homes 目前沒有可用的安裝路徑:安裝精靈不產生輸入控制項,Package Center 安裝以 DSM broken/150 結束;CLI deploy 能解析出 /volume1/homes,但 DSM 於 compound install 回 4540 拒絕。",
|
|
135
|
+
"suggestion": "若 App 需要一個由管理員選定的資料夾,請改用 type: shared_folder。在補齊安裝精靈控制項與 preinst 路徑解析之前,homes 型別不會開放。"
|
|
126
136
|
},
|
|
127
137
|
"INSTALL_PARAMETER_UNREFERENCED": {
|
|
128
138
|
"code": "INSTALL_PARAMETER_UNREFERENCED",
|
|
@@ -336,8 +346,13 @@ export const ERROR_REGISTRY = {
|
|
|
336
346
|
},
|
|
337
347
|
"DEPLOY_PARAM_UNDECLARED": {
|
|
338
348
|
"code": "DEPLOY_PARAM_UNDECLARED",
|
|
339
|
-
"description": "deploy --param 提供了契約未宣告的 Install Parameter
|
|
340
|
-
"suggestion": "請只傳 synology-app.yaml install 中宣告的 string 或 boolean
|
|
349
|
+
"description": "deploy --param 提供了契約未宣告的 Install Parameter,或 native-go/binary 套件沒有的安裝精靈值。",
|
|
350
|
+
"suggestion": "Compose 請只傳 synology-app.yaml install 中宣告的 string 或 boolean 名稱;native-go/binary 只接受 install-selected delegate 的 delegate_share 或 delegate_home。"
|
|
351
|
+
},
|
|
352
|
+
"DEPLOY_PARAM_REQUIRED": {
|
|
353
|
+
"code": "DEPLOY_PARAM_REQUIRED",
|
|
354
|
+
"description": "首次安裝 install-selected delegate 套件時沒有提供安裝精靈的範圍值,preinst 會拒絕安裝。",
|
|
355
|
+
"suggestion": "加上 --param delegate_share=<共用資料夾> 或 --param delegate_home=true 再部署。"
|
|
341
356
|
},
|
|
342
357
|
"DEPLOY_PARAM_TYPE_INVALID": {
|
|
343
358
|
"code": "DEPLOY_PARAM_TYPE_INVALID",
|
|
@@ -402,7 +417,7 @@ export const ERROR_REGISTRY = {
|
|
|
402
417
|
"STANDALONE_DAEMON_BUILD_FAILED": {
|
|
403
418
|
"code": "STANDALONE_DAEMON_BUILD_FAILED",
|
|
404
419
|
"description": "無法建置套件 daemon 的 Go supervisor。",
|
|
405
|
-
"suggestion": "安裝 Go 1.
|
|
420
|
+
"suggestion": "安裝 Go 1.21 以上(建置固定使用 go1.26.9,離線時請先備妥)並檢查 compiler stderr;NAS 不需要 Go toolchain。"
|
|
406
421
|
},
|
|
407
422
|
"STANDALONE_DAEMON_PAYLOAD_INVALID": {
|
|
408
423
|
"code": "STANDALONE_DAEMON_PAYLOAD_INVALID",
|
|
@@ -472,7 +487,7 @@ export const ERROR_REGISTRY = {
|
|
|
472
487
|
"STANDALONE_ARCHES_INVALID": {
|
|
473
488
|
"code": "STANDALONE_ARCHES_INVALID",
|
|
474
489
|
"description": "arches 不合法。",
|
|
475
|
-
"suggestion": "請列出不重複的 x86_64 或
|
|
490
|
+
"suggestion": "請列出不重複的 x86_64、aarch64 或 armv7,至少一個。"
|
|
476
491
|
},
|
|
477
492
|
"STANDALONE_ARCH_NOT_DECLARED": {
|
|
478
493
|
"code": "STANDALONE_ARCH_NOT_DECLARED",
|
|
@@ -506,8 +521,8 @@ export const ERROR_REGISTRY = {
|
|
|
506
521
|
},
|
|
507
522
|
"STANDALONE_BINARY_NOT_ELF": {
|
|
508
523
|
"code": "STANDALONE_BINARY_NOT_ELF",
|
|
509
|
-
"description": "backend
|
|
510
|
-
"suggestion": "請提供為 Linux 編譯的 x86_64 或
|
|
524
|
+
"description": "backend 執行檔不是該架構需要的 little-endian Linux ELF(x86_64、aarch64 為 64-bit,armv7 為 32-bit)。",
|
|
525
|
+
"suggestion": "請提供為 Linux 編譯的 x86_64、aarch64 或 armv7 執行檔。"
|
|
511
526
|
},
|
|
512
527
|
"STANDALONE_BINARY_ARCH_MISMATCH": {
|
|
513
528
|
"code": "STANDALONE_BINARY_ARCH_MISMATCH",
|
|
@@ -574,6 +589,11 @@ export const ERROR_REGISTRY = {
|
|
|
574
589
|
"description": "go build 失敗。",
|
|
575
590
|
"suggestion": "請在 backend 目錄執行 go build ./... 並修正錯誤。"
|
|
576
591
|
},
|
|
592
|
+
"STANDALONE_PORTAL_INVALID": {
|
|
593
|
+
"code": "STANDALONE_PORTAL_INVALID",
|
|
594
|
+
"description": "dsm-package.yaml 的 portal 格式或 alias 不正確。",
|
|
595
|
+
"suggestion": "請使用 portal: {} 或 portal: { alias: my-app };alias 為 1–64 個小寫英數字或 -,且不是 DSM 保留路徑。"
|
|
596
|
+
},
|
|
577
597
|
"STANDALONE_I18N_INVALID": {
|
|
578
598
|
"code": "STANDALONE_I18N_INVALID",
|
|
579
599
|
"description": "dsm-package.yaml 的 i18n 設定不合法。",
|
|
@@ -629,6 +649,8 @@ for (const [code, description, suggestion] of [
|
|
|
629
649
|
ERROR_REGISTRY[code] = { code, description, suggestion };
|
|
630
650
|
ERROR_REGISTRY["ADD_LAYOUT_UNSUPPORTED"] = { "code": "ADD_LAYOUT_UNSUPPORTED", "description": "SDK overlay 需要標準 backend 目錄。", "suggestion": "使用 backend.dir: backend,或手動合併 SDK overlay。" };
|
|
631
651
|
ERROR_REGISTRY["MIN_DSM_CONTAINER_FLOOR"] = { "code": "MIN_DSM_CONTAINER_FLOOR", "description": "Compose 最低 DSM 版本過低。", "suggestion": "Compose 需要 DSM 7.2.1-69057 或以上。" };
|
|
652
|
+
for (const code of ["STANDALONE_PORTAL_MIN_DSM", "CONTRACT_PORTAL_MIN_DSM"])
|
|
653
|
+
ERROR_REGISTRY[code] = { code, "description": "宣告 portal 的套件 os_min_ver 低於 DSM 7.3.2-86009。", "suggestion": "DSM 7.1.1 以 320 拒裝帶 portal 的未簽章套件、7.2 未驗證;把 os_min_ver 提高到 7.3.2-86009 以上,或移除 portal。" };
|
|
632
654
|
ERROR_REGISTRY["MIN_DSM_INVALID"] = { "code": "MIN_DSM_INVALID", "description": "最低 DSM 版本格式不合法。", "suggestion": "指定 7.x release 或完整 7.x-build。" };
|
|
633
655
|
ERROR_REGISTRY["NOTICE_UNSAFE"] = { "code": "NOTICE_UNSAFE", "description": "授權檔案不符合一般檔案限制。", "suggestion": "移除 symlink、特殊檔與超大授權檔案。" };
|
|
634
656
|
ERROR_REGISTRY["NOTICE_MISSING"] = { "code": "NOTICE_MISSING", "description": "缺少第三方授權資訊。", "suggestion": "重新安裝模板依賴並產生 third-party notices。" };
|
|
@@ -641,10 +663,9 @@ ERROR_REGISTRY["SPK_INSPECTION_FAILED"] = { "code": "SPK_INSPECTION_FAILED", "de
|
|
|
641
663
|
ERROR_REGISTRY["IMAGE_PIN_REQUIRED"] = { "code": "IMAGE_PIN_REQUIRED", "description": "映像 digest 尚未固定。", "suggestion": "執行 images pin。" };
|
|
642
664
|
ERROR_REGISTRY["INIT_TEMPLATE_REQUIRED"] = { "code": "INIT_TEMPLATE_REQUIRED", "description": "未指定模板。", "suggestion": "使用 -t native-go、binary 或 compose。" };
|
|
643
665
|
ERROR_REGISTRY["INIT_TEMPLATE_UNKNOWN"] = { "code": "INIT_TEMPLATE_UNKNOWN", "description": "未知模板。", "suggestion": "使用 -t native-go、binary 或 compose。" };
|
|
644
|
-
ERROR_REGISTRY["CLI_ARCH_INVALID"] = { "code": "CLI_ARCH_INVALID", "description": "架構選項不合法。", "suggestion": "使用 x86_64 或
|
|
645
|
-
ERROR_REGISTRY["NATIVE_ARCH_UNDETERMINED"] = { "code": "NATIVE_ARCH_UNDETERMINED", "description": "無法判定 NAS 架構。", "suggestion": "指定 --arch x86_64 或
|
|
666
|
+
ERROR_REGISTRY["CLI_ARCH_INVALID"] = { "code": "CLI_ARCH_INVALID", "description": "架構選項不合法。", "suggestion": "使用 x86_64、aarch64 或 armv7(armv7 用於 native-go 與 binary,不用於 Container Manager App)。" };
|
|
667
|
+
ERROR_REGISTRY["NATIVE_ARCH_UNDETERMINED"] = { "code": "NATIVE_ARCH_UNDETERMINED", "description": "無法判定 NAS 架構。", "suggestion": "指定 --arch x86_64、aarch64 或 armv7。" };
|
|
646
668
|
ERROR_REGISTRY["DEVELOPMENT_INSTANCE_UNSUPPORTED"] = { "code": "DEVELOPMENT_INSTANCE_UNSUPPORTED", "description": "原生專案不支援 --dev。", "suggestion": "init 時指定不同 package ID。" };
|
|
647
|
-
ERROR_REGISTRY["INIT_TEMPLATE_INVALID"] = { "code": "INIT_TEMPLATE_INVALID", "description": "未知模板。", "suggestion": "使用 -t native-go、binary 或 compose。" };
|
|
648
669
|
ERROR_REGISTRY["INIT_OPTIONS_UNSUPPORTED"] = { "code": "INIT_OPTIONS_UNSUPPORTED", "description": "選項不適用於這個模板。", "suggestion": "--from 僅 compose;--ui 僅 native-go。" };
|
|
649
670
|
ERROR_REGISTRY["INIT_TARGET_NOT_EMPTY"] = { "code": "INIT_TARGET_NOT_EMPTY", "description": "init 目錄已有衝突檔案。", "suggestion": "使用空目錄;既有專案新增能力使用 add。" };
|
|
650
671
|
ERROR_REGISTRY["INIT_COMPOSE_INVALID"] = { "code": "INIT_COMPOSE_INVALID", "description": "匯入的 Compose 不合法。", "suggestion": "--from 指向有 services 的 YAML 檔案。" };
|
|
@@ -662,10 +683,23 @@ ERROR_REGISTRY["CLI_OPTION_ARGUMENT_MISSING"] = { "code": "CLI_OPTION_ARGUMENT_M
|
|
|
662
683
|
ERROR_REGISTRY["CLI_COMMAND_UNKNOWN"] = { "code": "CLI_COMMAND_UNKNOWN", "description": "未知指令。", "suggestion": "使用 synopkgland --help 查看指令。" };
|
|
663
684
|
ERROR_REGISTRY["COMMAND_FAILED"] = { "code": "COMMAND_FAILED", "description": "指令執行失敗。", "suggestion": "查看 message 與 stderr,修正問題後重試。" };
|
|
664
685
|
ERROR_REGISTRY["DEPLOY_PLAN_INVALID"] = { "code": "DEPLOY_PLAN_INVALID", "description": "部署計畫與 runtime 不符。", "suggestion": "重新 check 並產生部署計畫。" };
|
|
665
|
-
ERROR_REGISTRY["DEPLOY_ARCH_UNDETERMINED"] = { "code": "DEPLOY_ARCH_UNDETERMINED", "description": "無法判定 NAS 架構。", "suggestion": "使用 --arch x86_64 或
|
|
686
|
+
ERROR_REGISTRY["DEPLOY_ARCH_UNDETERMINED"] = { "code": "DEPLOY_ARCH_UNDETERMINED", "description": "無法判定 NAS 架構。", "suggestion": "使用 --arch x86_64、aarch64 或 armv7。" };
|
|
687
|
+
ERROR_REGISTRY["CONTAINER_ARCH_UNSUPPORTED"] = { "code": "CONTAINER_ARCH_UNSUPPORTED", "description": "Container Manager App 只支援 x86_64 與 aarch64;DSM 不為 armv7 提供 Container Manager。", "suggestion": "改用 --arch x86_64 或 aarch64,或改用 native-go 模板。" };
|
|
666
688
|
ERROR_REGISTRY["DEPLOY_BUILD_OUTPUT_INVALID"] = { "code": "DEPLOY_BUILD_OUTPUT_INVALID", "description": "部署建置輸出數量不符。", "suggestion": "指定單一架構並重新 build。" };
|
|
667
689
|
export function getErrorCode(code) {
|
|
668
690
|
return ERROR_REGISTRY[code];
|
|
669
691
|
}
|
|
670
|
-
for (const code
|
|
671
|
-
|
|
692
|
+
for (const [code, description, suggestion] of [
|
|
693
|
+
["EXECUTOR_BUILD_FAILED", "executor 或 lifecycle helper 編譯失敗,或 CLI 套件缺少 executor 原始碼。", "確認已安裝 Go 1.21 以上且可取得 go1.26.9(離線時請先備妥),查看訊息中的編譯器輸出;原始碼缺少時重新安裝 CLI。"],
|
|
694
|
+
["EXECUTOR_PIN_REQUIRED", "宣告 rootOps 或 delegate 的套件建置時沒有 executor 產物。", "使用 synopkgland build,讓 CLI 編譯並 pin executor;不要直接呼叫低階 SPK API。"],
|
|
695
|
+
["EXECUTOR_POLICY", "capabilities.delegate 的 operations 或 scope 不合法,無法產生 executor policy。", "改用 init/add 產生的 delegate 宣告,或依 manifest 參考修正 scope 與 operations。"],
|
|
696
|
+
["EXECUTOR_PACKAGE", "pin 進 root task 的套件名稱不合法。", "package 必須以英文字母開頭,只含英數字(2–64 字)。"],
|
|
697
|
+
["EXECUTOR_DIGEST", "executor 或 policy 的 sha256 pin 格式不合法。", "重新 build,讓 CLI 重新計算 pin;不要手改 SPK 內的 pin。"],
|
|
698
|
+
["EXECUTOR_TASK_PERCENT", "root task 腳本含有 %,DSM 工作排程器無法保存。", "從 root/ 腳本移除 % 字元(例如 date 格式改用其他寫法)。"],
|
|
699
|
+
["EXECUTOR_TASK_LENGTH", "root task 腳本超過 DSM 工作排程器的長度上限。", "縮短 root/ 腳本,把邏輯移到套件內的檔案再由腳本呼叫。"],
|
|
700
|
+
])
|
|
701
|
+
ERROR_REGISTRY[code] = { code, description, suggestion };
|
|
702
|
+
ERROR_REGISTRY["STANDALONE_ENTRY_INVALID"] = { "code": "STANDALONE_ENTRY_INVALID", "description": "entry 設定不合法。", "suggestion": "entry 填 admin-only 或 app-privilege;app-privilege 需要至少一個 authenticated route。" };
|
|
703
|
+
ERROR_REGISTRY["STANDALONE_ENTRY_WIDENED"] = { "code": "STANDALONE_ENTRY_WIDENED", "description": "entry: admin-only 與放寬權限的 route 設定衝突。", "suggestion": "把 permissions.json 中 authenticated 或 public 的 route 改為 administrators;要開放給一般使用者請改用 entry: app-privilege 或省略 entry。" };
|
|
704
|
+
ERROR_REGISTRY["STANDALONE_ENTRY_UNSUPPORTED"] = { "code": "STANDALONE_ENTRY_UNSUPPORTED", "description": "backend 無法強制 entry 模式。", "suggestion": "使用 Go backend,複製 SDK 的 internal/dsm entry gate 並在 cmd/app/main.go 呼叫 dsm.NewEntryGate。" };
|
|
705
|
+
ERROR_REGISTRY["DSM_TLS_UNTRUSTED"] = { "code": "DSM_TLS_UNTRUSTED", "description": "DSM 的 TLS 憑證不受這台電腦信任(自簽、過期或名稱不符)。", "suggestion": "把 NAS 憑證或其 CA 匯出成 PEM,用 NODE_EXTRA_CA_CERTS=<該檔> 執行;或讓 DSM 使用與 host profile 名稱相符的受信任憑證。不要關閉憑證驗證。" };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { HostCredentials, NasHost } from "./types.js";
|
|
2
|
+
import type { NativeArchFamily } from "../build-spk/dsm-arch.js";
|
|
2
3
|
export interface CreateNasHostOptions {
|
|
3
4
|
host?: string;
|
|
4
5
|
credentials?: HostCredentials;
|
|
@@ -17,9 +18,12 @@ declare function synoagentcli(args: string[], profileName?: string): {
|
|
|
17
18
|
export declare function homesPathFromDsmUserHomeRead(result: Pick<ReturnType<typeof synoagentcli>, "status" | "stdout">): string | undefined;
|
|
18
19
|
/**
|
|
19
20
|
* DSM reports the CPU vendor, not the ISA. Every x86_64 platform Synology
|
|
20
|
-
* ships is Intel or AMD;
|
|
21
|
-
* Rockchip
|
|
22
|
-
*
|
|
21
|
+
* ships is Intel or AMD; the aarch64 ones are Realtek (rtd1296, rtd1619b) and
|
|
22
|
+
* Rockchip; Annapurna Labs is DSM 7's alpine/alpine4k, which are armv7 (DS416
|
|
23
|
+
* reports "ANNAPURNALABS"). Marvell makes both armada37xx (aarch64) and
|
|
24
|
+
* armada38x (armv7), so it, like an unrecognised vendor, returns undefined and
|
|
25
|
+
* `deploy` asks for `--arch` rather than guessing wrong and building an
|
|
26
|
+
* unusable SPK.
|
|
23
27
|
*/
|
|
24
|
-
export declare function archFamilyForCpuVendor(vendor: string | undefined):
|
|
28
|
+
export declare function archFamilyForCpuVendor(vendor: string | undefined): NativeArchFamily | undefined;
|
|
25
29
|
export {};
|
package/dist/host/dsm-client.js
CHANGED
|
@@ -3,6 +3,7 @@ import { listShareNamesWithSynoagentcli, lookupSharePathWithSynoagentcli, } from
|
|
|
3
3
|
import { createSynoagentcliApiCall, fetchSharePermissions, fetchUserGroups, } from "./share-permission-lookup.js";
|
|
4
4
|
import { fetchPortInfo } from "./port-info-lookup.js";
|
|
5
5
|
import { dsmFetch } from "./dsm-http.js";
|
|
6
|
+
import { versionUnsupported } from "../runtime/dsm-version.js";
|
|
6
7
|
import { fetchDsmPortProfileInventory } from "./dsm-port-profile.js";
|
|
7
8
|
import { installPackageFromLocalSpk, fetchInstalledPackageState, packageStateFromRecord, } from "./catalog-install.js";
|
|
8
9
|
import { resolveHostCredentials } from "./credentials.js";
|
|
@@ -53,6 +54,16 @@ export function homesPathFromDsmUserHomeRead(result) {
|
|
|
53
54
|
}
|
|
54
55
|
return `${volume}/homes`;
|
|
55
56
|
}
|
|
57
|
+
function setCookiePairs(headers) {
|
|
58
|
+
const lines = typeof headers.getSetCookie === "function"
|
|
59
|
+
? headers.getSetCookie()
|
|
60
|
+
: headers.get("set-cookie")
|
|
61
|
+
? [headers.get("set-cookie")]
|
|
62
|
+
: [];
|
|
63
|
+
return lines
|
|
64
|
+
.map((line) => line.split(";")[0]?.trim())
|
|
65
|
+
.filter((pair) => Boolean(pair));
|
|
66
|
+
}
|
|
56
67
|
function createDsmNasHost(credentials, profileName) {
|
|
57
68
|
const dsmOrigin = credentials.dsmOrigin.replace(/\/$/, "");
|
|
58
69
|
let cookieHeader = credentials.cookieHeader;
|
|
@@ -77,15 +88,7 @@ function createDsmNasHost(credentials, profileName) {
|
|
|
77
88
|
const login = (await response.json());
|
|
78
89
|
if (!response.ok || login.success !== true)
|
|
79
90
|
throw new Error("DSM login failed");
|
|
80
|
-
|
|
81
|
-
? response.headers.getSetCookie()
|
|
82
|
-
: response.headers.get("set-cookie")
|
|
83
|
-
? [response.headers.get("set-cookie")]
|
|
84
|
-
: [];
|
|
85
|
-
const pairs = setCookie
|
|
86
|
-
.map((line) => line.split(";")[0]?.trim())
|
|
87
|
-
.filter((pair) => Boolean(pair));
|
|
88
|
-
cookieHeader = pairs.join("; ");
|
|
91
|
+
cookieHeader = setCookiePairs(response.headers).join("; ");
|
|
89
92
|
if (!cookieHeader)
|
|
90
93
|
throw new Error("DSM login returned no session cookie");
|
|
91
94
|
};
|
|
@@ -106,12 +109,38 @@ function createDsmNasHost(credentials, profileName) {
|
|
|
106
109
|
async getExecutorStatus(packageIdentity) {
|
|
107
110
|
try {
|
|
108
111
|
await ensureLogin();
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
const appCall = async (method, cookie) => {
|
|
113
|
+
const response = await dsmFetch(`${dsmOrigin}/webman/3rdparty/${encodeURIComponent(packageIdentity)}/cgi/api.cgi`, {
|
|
114
|
+
method: "POST", headers: { cookie, origin: dsmOrigin, "content-type": "application/json" },
|
|
115
|
+
body: JSON.stringify({ method, params: method === "identity.session" ? { bootstrap: true } : {} }),
|
|
116
|
+
});
|
|
117
|
+
const body = await response.json();
|
|
118
|
+
return { body, setCookie: setCookiePairs(response.headers) };
|
|
119
|
+
};
|
|
120
|
+
// A paused executor answers with why and what to do next.
|
|
121
|
+
const explain = (status) => status.state === "paused" ? { ...status, error: `Executor paused (${status.reason}). ${status.next}` } : status;
|
|
122
|
+
const direct = await appCall("executor.status", cookieHeader ?? "");
|
|
123
|
+
if (direct.body.success)
|
|
124
|
+
return explain(direct.body.data);
|
|
125
|
+
// identity: standalone wraps business methods in an App session; trade the
|
|
126
|
+
// administrator's DSM cookie for one, read once, then end that session.
|
|
127
|
+
if (direct.body.error?.code !== "session_required")
|
|
128
|
+
return undefined;
|
|
129
|
+
const session = await appCall("identity.session", cookieHeader ?? "");
|
|
130
|
+
if (!session.body.success) {
|
|
131
|
+
const code = session.body.error?.code;
|
|
132
|
+
return { ready: false, executor_digest: "", policy_digest: "", error: code === "https_required"
|
|
133
|
+
? "identity: standalone status needs an https:// DSM host profile to open an App session."
|
|
134
|
+
: `identity: standalone App session bootstrap failed (${code ?? "error"}).` };
|
|
135
|
+
}
|
|
136
|
+
const appCookie = [cookieHeader ?? "", ...session.setCookie].filter(Boolean).join("; ");
|
|
137
|
+
try {
|
|
138
|
+
const status = await appCall("executor.status", appCookie);
|
|
139
|
+
return status.body.success ? explain(status.body.data) : undefined;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
await appCall("identity.logout", appCookie).catch(() => undefined);
|
|
143
|
+
}
|
|
115
144
|
}
|
|
116
145
|
catch {
|
|
117
146
|
return undefined;
|
|
@@ -130,6 +159,12 @@ function createDsmNasHost(credentials, profileName) {
|
|
|
130
159
|
throw Object.assign(new Error(`DSM ${body.error?.code ?? "error"}: scheduler readback denied; check the administrator session. No retry was made.`), { code: body.error?.code });
|
|
131
160
|
return body.data;
|
|
132
161
|
};
|
|
162
|
+
// DSM 7.1 stops at TaskScheduler list v2 (offset) and get v3; only an unsupported version falls back.
|
|
163
|
+
const taskRead = (method, version, params, legacyVersion, legacyParams) => call("SYNO.Core.TaskScheduler", method, version, params).catch((e) => {
|
|
164
|
+
if (!versionUnsupported(e.code))
|
|
165
|
+
throw e;
|
|
166
|
+
return call("SYNO.Core.TaskScheduler", method, legacyVersion, legacyParams);
|
|
167
|
+
});
|
|
133
168
|
const records = await call("SYNO.Core.EventScheduler", "list", 1, {});
|
|
134
169
|
if (!Array.isArray(records))
|
|
135
170
|
throw new Error("Invalid EventScheduler readback.");
|
|
@@ -142,13 +177,14 @@ function createDsmNasHost(credentials, profileName) {
|
|
|
142
177
|
throw new Error("Invalid boot task readback.");
|
|
143
178
|
tasks.push({ ...detail, name: detail.task_name, kind: "boot" });
|
|
144
179
|
}
|
|
145
|
-
const listed = await
|
|
180
|
+
const listed = await taskRead("list", 3, { start: 0, limit: 500 }, 2, { offset: 0, limit: 500 });
|
|
146
181
|
if (!Array.isArray(listed?.tasks) || !Number.isInteger(listed.total) || listed.total !== listed.tasks.length || listed.total > 500)
|
|
147
182
|
throw new Error("Incomplete TaskScheduler readback.");
|
|
148
183
|
for (const summary of listed.tasks) {
|
|
149
184
|
if (summary?.name !== `${packageIdentity} executor control`)
|
|
150
185
|
continue;
|
|
151
|
-
const
|
|
186
|
+
const ref = { id: summary.id, real_owner: summary.real_owner };
|
|
187
|
+
const detail = await taskRead("get", 4, ref, 3, ref);
|
|
152
188
|
if (!detail || String(detail.id) !== String(summary.id) || detail.name !== summary.name)
|
|
153
189
|
throw new Error("Invalid control task readback.");
|
|
154
190
|
tasks.push({ ...detail, kind: "control" });
|
|
@@ -275,17 +311,23 @@ function createDsmNasHost(credentials, profileName) {
|
|
|
275
311
|
}
|
|
276
312
|
/**
|
|
277
313
|
* DSM reports the CPU vendor, not the ISA. Every x86_64 platform Synology
|
|
278
|
-
* ships is Intel or AMD;
|
|
279
|
-
* Rockchip
|
|
280
|
-
*
|
|
314
|
+
* ships is Intel or AMD; the aarch64 ones are Realtek (rtd1296, rtd1619b) and
|
|
315
|
+
* Rockchip; Annapurna Labs is DSM 7's alpine/alpine4k, which are armv7 (DS416
|
|
316
|
+
* reports "ANNAPURNALABS"). Marvell makes both armada37xx (aarch64) and
|
|
317
|
+
* armada38x (armv7), so it, like an unrecognised vendor, returns undefined and
|
|
318
|
+
* `deploy` asks for `--arch` rather than guessing wrong and building an
|
|
319
|
+
* unusable SPK.
|
|
281
320
|
*/
|
|
282
321
|
export function archFamilyForCpuVendor(vendor) {
|
|
283
322
|
const normalized = (vendor ?? "").trim().toLowerCase();
|
|
284
323
|
if (normalized === "intel" || normalized === "amd") {
|
|
285
324
|
return "x86_64";
|
|
286
325
|
}
|
|
287
|
-
if (["realtek", "
|
|
326
|
+
if (["realtek", "rockchip"].includes(normalized)) {
|
|
288
327
|
return "aarch64";
|
|
289
328
|
}
|
|
329
|
+
if (["annapurnalabs", "annapurna labs", "annapurna"].includes(normalized)) {
|
|
330
|
+
return "armv7";
|
|
331
|
+
}
|
|
290
332
|
return undefined;
|
|
291
333
|
}
|