@synopackageland/cli 0.3.10 → 0.4.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/LICENSE +21 -0
- package/README.md +57 -9
- package/dist/bin.js +1 -2
- package/dist/build-spk/generator.d.ts +0 -3
- package/dist/build-spk/generator.js +138 -287
- package/dist/build-spk/native-lifecycle.js +0 -3
- package/dist/build-spk/native-payload.js +0 -1
- package/dist/build-spk/notices.d.ts +5 -0
- package/dist/build-spk/notices.js +60 -0
- package/dist/cli.js +178 -151
- package/dist/compose/analyze.d.ts +1 -2
- package/dist/compose/analyze.js +5 -48
- package/dist/contract/unsupported-types.d.ts +10 -0
- package/dist/contract/unsupported-types.js +49 -0
- package/dist/contract/validate.js +25 -2
- package/dist/contract/web-launch.js +0 -2
- package/dist/deploy/deploy.d.ts +1 -4
- package/dist/deploy/deploy.js +45 -156
- package/dist/deploy/homes-values.js +1 -1
- package/dist/deploy/plan.d.ts +18 -0
- package/dist/deploy/plan.js +54 -0
- package/dist/deploy/spk-version.d.ts +2 -14
- package/dist/deploy/spk-version.js +25 -111
- package/dist/dev.d.ts +1 -3
- package/dist/dev.js +14 -28
- package/dist/error-registry.js +830 -862
- package/dist/host/dsm-client.js +12 -272
- package/dist/host/dsm-port-profile.d.ts +0 -1
- package/dist/host/dsm-port-profile.js +0 -2
- package/dist/host/types.d.ts +1 -83
- package/dist/index.d.ts +0 -9
- package/dist/index.js +0 -6
- package/dist/info.d.ts +0 -1
- package/dist/info.js +3 -10
- package/dist/init.d.ts +15 -1
- package/dist/init.js +128 -12
- package/dist/log.js +2 -3
- package/dist/native/validate.js +0 -1
- package/dist/standalone/binary.d.ts +9 -0
- package/dist/standalone/binary.js +67 -0
- package/dist/standalone/build.d.ts +25 -0
- package/dist/standalone/build.js +110 -0
- package/dist/standalone/daemon.d.ts +23 -0
- package/dist/standalone/daemon.js +114 -0
- package/dist/standalone/dsm-window.d.ts +26 -0
- package/dist/standalone/dsm-window.js +291 -0
- package/dist/standalone/helper-inventory.d.ts +16 -0
- package/dist/standalone/helper-inventory.js +2 -0
- package/dist/standalone/helper.d.ts +21 -0
- package/dist/standalone/helper.js +105 -0
- package/dist/standalone/host-adapter.d.ts +5 -0
- package/dist/standalone/host-adapter.js +148 -0
- package/dist/standalone/host-platform.d.ts +13 -0
- package/dist/standalone/host-platform.js +42 -0
- package/dist/standalone/host-types.d.ts +49 -0
- package/dist/standalone/host-types.js +1 -0
- package/dist/standalone/i18n.d.ts +28 -0
- package/dist/standalone/i18n.js +161 -0
- package/dist/standalone/inspect-helper.d.ts +6 -0
- package/dist/standalone/inspect-helper.js +88 -0
- package/dist/standalone/inspect-spk.d.ts +23 -0
- package/dist/standalone/inspect-spk.js +209 -0
- package/dist/standalone/lifecycle-helper.d.ts +2 -0
- package/dist/standalone/lifecycle-helper.js +12 -0
- package/dist/standalone/lifecycle.d.ts +3 -0
- package/dist/standalone/lifecycle.js +53 -0
- package/dist/standalone/manifest.d.ts +73 -0
- package/dist/standalone/manifest.js +279 -0
- package/dist/standalone/reopen-events.d.ts +2 -0
- package/dist/standalone/reopen-events.js +28 -0
- package/dist/standalone/root-messages.d.ts +7 -0
- package/dist/standalone/root-messages.js +259 -0
- package/dist/standalone/root-ops.d.ts +42 -0
- package/dist/standalone/root-ops.js +101 -0
- package/dist/standalone/root-window.d.ts +36 -0
- package/dist/standalone/root-window.js +302 -0
- package/dist/standalone/spk.d.ts +23 -0
- package/dist/standalone/spk.js +192 -0
- package/dist/template-paths.d.ts +2 -0
- package/dist/template-paths.js +9 -0
- package/dist/templates/_daemon/fixture_linux_test.go +15 -0
- package/dist/templates/_daemon/fixture_other_test.go +7 -0
- package/dist/templates/_daemon/go.mod +3 -0
- package/dist/templates/_daemon/main.go +608 -0
- package/dist/templates/_daemon/main_test.go +242 -0
- package/dist/templates/_daemon/process_linux.go +55 -0
- package/dist/templates/_daemon/process_linux_test.go +161 -0
- package/dist/templates/_daemon/process_other.go +14 -0
- package/dist/templates/_daemon/testdata/child.go +41 -0
- package/dist/templates/_shared/GO-LICENSE +27 -0
- package/dist/templates/_shared/GO-PATENTS +22 -0
- package/dist/templates/_shared/LICENSES/TEMPLATE.txt +21 -0
- package/dist/templates/_shared/notice-overrides/index.json +14 -0
- package/dist/templates/_shared/notice-overrides/utils-0.4.2-LICENSE +21 -0
- package/dist/templates/_shared/notice-overrides/utils-0.5.0-LICENSE +21 -0
- package/dist/templates/_shared/third-party-notices.mjs +51 -0
- package/dist/templates/binary/synology-app.yaml +7 -0
- package/dist/templates/hello-files/compose.yaml +0 -1
- package/dist/templates/hello-web/compose.yaml +13 -10
- package/dist/templates/hello-web/html/app.js +1 -23
- package/dist/templates/hello-web/html/index.html +1 -3
- package/dist/templates/hello-web-page/compose.yaml +13 -10
- package/dist/templates/hello-web-page/html/app.js +1 -23
- package/dist/templates/hello-web-page/html/index.html +1 -3
- package/dist/templates/native-go/README.md +324 -0
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +59 -0
- package/dist/templates/native-go/backend/cmd/app/main.go +49 -0
- package/dist/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
- package/dist/templates/native-go/backend/cmd/helper/main.go +38 -0
- package/dist/templates/native-go/backend/go.mod +7 -0
- package/dist/templates/native-go/backend/go.sum +4 -0
- package/dist/templates/native-go/backend/internal/api/binary.go +154 -0
- package/dist/templates/native-go/backend/internal/api/binary_test.go +165 -0
- package/dist/templates/native-go/backend/internal/api/errors.go +33 -0
- package/dist/templates/native-go/backend/internal/api/registry.go +104 -0
- package/dist/templates/native-go/backend/internal/api/registry_test.go +329 -0
- package/dist/templates/native-go/backend/internal/api/server.go +159 -0
- package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +121 -0
- package/dist/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
- package/dist/templates/native-go/backend/internal/app/root_none.go +9 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +138 -0
- package/dist/templates/native-go/backend/internal/app/routes_test.go +172 -0
- package/dist/templates/native-go/backend/internal/dsm/auth.go +118 -0
- package/dist/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/collector_linux.go +335 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/collector_linux_test.go +41 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/protocol.go +179 -0
- package/dist/templates/native-go/backend/internal/dsmprobe/protocol_test.go +29 -0
- package/dist/templates/native-go/backend/internal/helper/cohort.go +393 -0
- package/dist/templates/native-go/backend/internal/helper/cohort_publication.go +18 -0
- package/dist/templates/native-go/backend/internal/helper/cohort_publication_test.go +105 -0
- package/dist/templates/native-go/backend/internal/helper/cohort_test.go +372 -0
- package/dist/templates/native-go/backend/internal/helper/control.go +424 -0
- package/dist/templates/native-go/backend/internal/helper/control_test.go +250 -0
- package/dist/templates/native-go/backend/internal/helper/data_contract.go +242 -0
- package/dist/templates/native-go/backend/internal/helper/data_contract_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/data_decode.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/data_decode_pointer_test.go +30 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol.go +416 -0
- package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +449 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_linux.go +139 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_linux_test.go +121 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux.go +95 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux_test.go +56 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_bridge_linux.go +144 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_bridge_linux_test.go +89 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_home_linux.go +107 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_home_linux_test.go +82 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_probe_transport_linux.go +151 -0
- package/dist/templates/native-go/backend/internal/helper/dsm_probe_transport_linux_test.go +66 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority.go +516 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority_contract.go +88 -0
- package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +510 -0
- package/dist/templates/native-go/backend/internal/helper/grant_cohort.go +389 -0
- package/dist/templates/native-go/backend/internal/helper/grant_cohort_test.go +239 -0
- package/dist/templates/native-go/backend/internal/helper/grant_delivery.go +49 -0
- package/dist/templates/native-go/backend/internal/helper/grant_delivery_methods.go +273 -0
- package/dist/templates/native-go/backend/internal/helper/grant_delivery_test.go +322 -0
- package/dist/templates/native-go/backend/internal/helper/grant_operation_contract.go +47 -0
- package/dist/templates/native-go/backend/internal/helper/grant_readonly_test.go +180 -0
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +415 -0
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +468 -0
- package/dist/templates/native-go/backend/internal/helper/grant_rpc.go +147 -0
- package/dist/templates/native-go/backend/internal/helper/grant_rpc_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +75 -0
- package/dist/templates/native-go/backend/internal/helper/grant_supervisor_linux.go +134 -0
- package/dist/templates/native-go/backend/internal/helper/grant_supervisor_linux_test.go +254 -0
- package/dist/templates/native-go/backend/internal/helper/lease.go +112 -0
- package/dist/templates/native-go/backend/internal/helper/lease_linux.go +44 -0
- package/dist/templates/native-go/backend/internal/helper/lease_other.go +8 -0
- package/dist/templates/native-go/backend/internal/helper/lifecycle.go +234 -0
- package/dist/templates/native-go/backend/internal/helper/lifecycle_test.go +473 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot.go +284 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot_repository_linux.go +74 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot_repository_linux_test.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/managed_pilot_test.go +210 -0
- package/dist/templates/native-go/backend/internal/helper/nas_shipped_refusal_linux_test.go +97 -0
- package/dist/templates/native-go/backend/internal/helper/native_discovery.go +79 -0
- package/dist/templates/native-go/backend/internal/helper/native_identity.go +89 -0
- package/dist/templates/native-go/backend/internal/helper/native_provider.go +159 -0
- package/dist/templates/native-go/backend/internal/helper/native_provider_test.go +421 -0
- package/dist/templates/native-go/backend/internal/helper/observation.go +204 -0
- package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +115 -0
- package/dist/templates/native-go/backend/internal/helper/observation_reload_budget_test.go +117 -0
- package/dist/templates/native-go/backend/internal/helper/observation_test.go +196 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +109 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
- package/dist/templates/native-go/backend/internal/helper/operation_bootstrap_linux.go +193 -0
- package/dist/templates/native-go/backend/internal/helper/operation_credentials_linux.go +56 -0
- package/dist/templates/native-go/backend/internal/helper/operation_linux.go +480 -0
- package/dist/templates/native-go/backend/internal/helper/operation_linux_test.go +528 -0
- package/dist/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
- package/dist/templates/native-go/backend/internal/helper/peer_other.go +7 -0
- package/dist/templates/native-go/backend/internal/helper/process_linux.go +177 -0
- package/dist/templates/native-go/backend/internal/helper/process_other.go +5 -0
- package/dist/templates/native-go/backend/internal/helper/publication_test.go +178 -0
- package/dist/templates/native-go/backend/internal/helper/read_stream_cohort_linux_test.go +156 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer_linux.go +109 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer_linux_test.go +118 -0
- package/dist/templates/native-go/backend/internal/helper/read_transfer_test.go +177 -0
- package/dist/templates/native-go/backend/internal/helper/readonly.go +105 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_admission.go +85 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_cohort_linux_test.go +253 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_linux_test.go +378 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_mount_linux.go +65 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_mount_proxy_linux.go +113 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_operations_linux.go +168 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_resolver_linux.go +241 -0
- package/dist/templates/native-go/backend/internal/helper/readonly_test.go +40 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_identity.go +252 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_identity_contract.go +105 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_identity_test.go +406 -0
- package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +200 -0
- package/dist/templates/native-go/backend/internal/helper/repair.go +132 -0
- package/dist/templates/native-go/backend/internal/helper/repair_test.go +271 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_acl_linux_test.go +303 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_fixture_linux_test.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +231 -0
- package/dist/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
- package/dist/templates/native-go/backend/internal/helper/server_linux.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/status.go +334 -0
- package/dist/templates/native-go/backend/internal/helper/status_test.go +288 -0
- package/dist/templates/native-go/backend/internal/helper/supervision.go +107 -0
- package/dist/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame_linux_test.go +69 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame_test.go +107 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +363 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux_test.go +913 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_socket_eof_test.go +74 -0
- package/dist/templates/native-go/backend/internal/helper/supervisor_socket_test.go +45 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/create.json +23 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/frames.json +67 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/grant-store.json +52 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/intent.json +20 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/list.json +20 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/publish.json +20 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/read.json +22 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/stat.json +22 -0
- package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/write-stream.json +22 -0
- package/dist/templates/native-go/backend/internal/helper/unit_connection.go +75 -0
- package/dist/templates/native-go/backend/internal/helper/unit_connection_linux_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +133 -0
- package/dist/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
- package/dist/templates/native-go/backend/internal/helper/unit_linux.go +364 -0
- package/dist/templates/native-go/backend/internal/helper/unit_linux_test.go +46 -0
- package/dist/templates/native-go/backend/internal/helper/unit_mechanisms_linux_test.go +217 -0
- package/dist/templates/native-go/backend/internal/helper/unit_padding_linux_test.go +178 -0
- package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +111 -0
- package/dist/templates/native-go/backend/internal/helper/unit_reload_linux_test.go +372 -0
- package/dist/templates/native-go/backend/internal/helper/unit_reload_sequence_linux_test.go +232 -0
- package/dist/templates/native-go/backend/internal/helper/write.go +77 -0
- package/dist/templates/native-go/backend/internal/helper/write_admission.go +260 -0
- package/dist/templates/native-go/backend/internal/helper/write_admission_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/write_cohort_linux_test.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +202 -0
- package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +199 -0
- package/dist/templates/native-go/backend/internal/helper/write_intent_linux.go +116 -0
- package/dist/templates/native-go/backend/internal/helper/write_intent_linux_test.go +74 -0
- package/dist/templates/native-go/backend/internal/helper/write_operation_linux.go +245 -0
- package/dist/templates/native-go/backend/internal/helper/write_test.go +53 -0
- package/dist/templates/native-go/dsm-package.yaml +58 -0
- package/dist/templates/native-go/gitignore +1 -0
- package/dist/templates/native-go/i18n/glossary.json +662 -0
- package/dist/templates/native-go/i18n/messages/de.json +28 -0
- package/dist/templates/native-go/i18n/messages/en.json +28 -0
- package/dist/templates/native-go/i18n/messages/es.json +28 -0
- package/dist/templates/native-go/i18n/messages/fr.json +28 -0
- package/dist/templates/native-go/i18n/messages/it.json +28 -0
- package/dist/templates/native-go/i18n/messages/ja.json +28 -0
- package/dist/templates/native-go/i18n/messages/ko.json +28 -0
- package/dist/templates/native-go/i18n/messages/zh-CN.json +28 -0
- package/dist/templates/native-go/i18n/messages/zh-TW.json +28 -0
- package/dist/templates/native-go/ui/app.css +35 -0
- package/dist/templates/native-go/ui/app.js +101 -0
- package/dist/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
- package/dist/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
- package/dist/templates/native-go-better-auth/node/app.mjs +72 -0
- package/dist/templates/native-go-better-auth/node/build.mjs +4 -0
- package/dist/templates/native-go-better-auth/node/package-lock.json +862 -0
- package/dist/templates/native-go-better-auth/node/package.json +1 -0
- package/dist/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
- package/dist/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal.go +203 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
- package/dist/templates/native-go-root/backend/internal/app/root.go +107 -0
- package/dist/templates/native-go-root/backend/internal/app/root_test.go +124 -0
- package/dist/templates/native-go-root/root/whoami.sh +6 -0
- package/dist/templates/native-go-vue/README.md +224 -0
- package/dist/templates/native-go-vue/frontend/DESIGN.md +78 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +2410 -0
- package/dist/templates/native-go-vue/frontend/package.json +6 -0
- package/dist/templates/native-go-vue/frontend/src/App.vue +159 -0
- package/dist/templates/native-go-vue/frontend/src/context.ts +56 -0
- package/dist/templates/native-go-vue/frontend/src/main.ts +29 -0
- package/dist/templates/native-go-vue/frontend/src/nas/NasGrantSettings.vue +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/NasPathPicker.vue +106 -0
- package/dist/templates/native-go-vue/frontend/src/nas/NasUnavailable.vue +20 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/de.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/en.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/es.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/fr.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/it.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/ja.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/ko.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/zh-CN.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/zh-TW.json +74 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n.ts +38 -0
- package/dist/templates/native-go-vue/frontend/src/nas/mock-provider.ts +119 -0
- package/dist/templates/native-go-vue/frontend/src/nas/provider.ts +59 -0
- package/dist/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
- package/dist/templates/native-go-vue/frontend/src/style.css +31 -0
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +190 -0
- package/dist/templates/native-go-vue/frontend/test/nas-provider.test.ts +81 -0
- package/dist/templates/native-go-vue/frontend/test/nas-request.test.ts +21 -0
- package/dist/templates/native-go-vue/frontend/test/nas-ui.test.ts +261 -0
- package/dist/templates/native-go-vue/frontend/tsconfig.json +1 -0
- package/dist/templates/native-go-vue/frontend/vite.config.ts +10 -0
- package/dist/templates/native-go-vue/gitignore +2 -0
- package/dist/types.d.ts +1 -1
- package/dist/validate.js +11 -7
- package/package.json +5 -8
- package/schema/synology-app.schema.json +36 -37
- package/skills/SKILL.md +4 -48
- package/skills/reference/create.md +11 -83
- package/skills/reference/deploy.md +7 -78
- package/skills/reference/diagnose.md +4 -101
- package/skills/reference/files.md +5 -41
- package/skills/reference/identity.md +3 -29
- package/skills/reference/wrap.md +0 -2
- package/templates/_daemon/fixture_linux_test.go +15 -0
- package/templates/_daemon/fixture_other_test.go +7 -0
- package/templates/_daemon/go.mod +3 -0
- package/templates/_daemon/main.go +608 -0
- package/templates/_daemon/main_test.go +242 -0
- package/templates/_daemon/process_linux.go +55 -0
- package/templates/_daemon/process_linux_test.go +161 -0
- package/templates/_daemon/process_other.go +14 -0
- package/templates/_daemon/testdata/child.go +41 -0
- package/templates/_shared/GO-LICENSE +27 -0
- package/templates/_shared/GO-PATENTS +22 -0
- package/templates/_shared/LICENSES/TEMPLATE.txt +21 -0
- package/templates/_shared/notice-overrides/index.json +14 -0
- package/templates/_shared/notice-overrides/utils-0.4.2-LICENSE +21 -0
- package/templates/_shared/notice-overrides/utils-0.5.0-LICENSE +21 -0
- package/templates/_shared/third-party-notices.mjs +51 -0
- package/templates/binary/synology-app.yaml +7 -0
- package/templates/hello-files/compose.yaml +0 -1
- package/templates/hello-web/compose.yaml +13 -10
- package/templates/hello-web/html/app.js +1 -23
- package/templates/hello-web/html/index.html +1 -3
- package/templates/hello-web-page/compose.yaml +13 -10
- package/templates/hello-web-page/html/app.js +1 -23
- package/templates/hello-web-page/html/index.html +1 -3
- package/templates/native-go/README.md +324 -0
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +59 -0
- package/templates/native-go/backend/cmd/app/main.go +49 -0
- package/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
- package/templates/native-go/backend/cmd/helper/main.go +38 -0
- package/templates/native-go/backend/go.mod +7 -0
- package/templates/native-go/backend/go.sum +4 -0
- package/templates/native-go/backend/internal/api/binary.go +154 -0
- package/templates/native-go/backend/internal/api/binary_test.go +165 -0
- package/templates/native-go/backend/internal/api/errors.go +33 -0
- package/templates/native-go/backend/internal/api/registry.go +104 -0
- package/templates/native-go/backend/internal/api/registry_test.go +329 -0
- package/templates/native-go/backend/internal/api/server.go +159 -0
- package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +121 -0
- package/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
- package/templates/native-go/backend/internal/app/root_none.go +9 -0
- package/templates/native-go/backend/internal/app/routes.go +138 -0
- package/templates/native-go/backend/internal/app/routes_test.go +172 -0
- package/templates/native-go/backend/internal/dsm/auth.go +118 -0
- package/templates/native-go/backend/internal/dsm/auth_test.go +139 -0
- package/templates/native-go/backend/internal/dsmprobe/collector_linux.go +335 -0
- package/templates/native-go/backend/internal/dsmprobe/collector_linux_test.go +41 -0
- package/templates/native-go/backend/internal/dsmprobe/protocol.go +179 -0
- package/templates/native-go/backend/internal/dsmprobe/protocol_test.go +29 -0
- package/templates/native-go/backend/internal/helper/cohort.go +393 -0
- package/templates/native-go/backend/internal/helper/cohort_publication.go +18 -0
- package/templates/native-go/backend/internal/helper/cohort_publication_test.go +105 -0
- package/templates/native-go/backend/internal/helper/cohort_test.go +372 -0
- package/templates/native-go/backend/internal/helper/control.go +424 -0
- package/templates/native-go/backend/internal/helper/control_test.go +250 -0
- package/templates/native-go/backend/internal/helper/data_contract.go +242 -0
- package/templates/native-go/backend/internal/helper/data_contract_test.go +51 -0
- package/templates/native-go/backend/internal/helper/data_decode.go +184 -0
- package/templates/native-go/backend/internal/helper/data_decode_pointer_test.go +30 -0
- package/templates/native-go/backend/internal/helper/data_protocol.go +416 -0
- package/templates/native-go/backend/internal/helper/data_protocol_test.go +449 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_linux.go +139 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_linux_test.go +121 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux.go +95 -0
- package/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux_test.go +56 -0
- package/templates/native-go/backend/internal/helper/dsm_bridge_linux.go +144 -0
- package/templates/native-go/backend/internal/helper/dsm_bridge_linux_test.go +89 -0
- package/templates/native-go/backend/internal/helper/dsm_home_linux.go +107 -0
- package/templates/native-go/backend/internal/helper/dsm_home_linux_test.go +82 -0
- package/templates/native-go/backend/internal/helper/dsm_probe_transport_linux.go +151 -0
- package/templates/native-go/backend/internal/helper/dsm_probe_transport_linux_test.go +66 -0
- package/templates/native-go/backend/internal/helper/grant_authority.go +516 -0
- package/templates/native-go/backend/internal/helper/grant_authority_contract.go +88 -0
- package/templates/native-go/backend/internal/helper/grant_authority_test.go +510 -0
- package/templates/native-go/backend/internal/helper/grant_cohort.go +389 -0
- package/templates/native-go/backend/internal/helper/grant_cohort_test.go +239 -0
- package/templates/native-go/backend/internal/helper/grant_delivery.go +49 -0
- package/templates/native-go/backend/internal/helper/grant_delivery_methods.go +273 -0
- package/templates/native-go/backend/internal/helper/grant_delivery_test.go +322 -0
- package/templates/native-go/backend/internal/helper/grant_operation_contract.go +47 -0
- package/templates/native-go/backend/internal/helper/grant_readonly_test.go +180 -0
- package/templates/native-go/backend/internal/helper/grant_repository_linux.go +415 -0
- package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +468 -0
- package/templates/native-go/backend/internal/helper/grant_rpc.go +147 -0
- package/templates/native-go/backend/internal/helper/grant_rpc_test.go +51 -0
- package/templates/native-go/backend/internal/helper/grant_snapshot.go +75 -0
- package/templates/native-go/backend/internal/helper/grant_supervisor_linux.go +134 -0
- package/templates/native-go/backend/internal/helper/grant_supervisor_linux_test.go +254 -0
- package/templates/native-go/backend/internal/helper/lease.go +112 -0
- package/templates/native-go/backend/internal/helper/lease_linux.go +44 -0
- package/templates/native-go/backend/internal/helper/lease_other.go +8 -0
- package/templates/native-go/backend/internal/helper/lifecycle.go +234 -0
- package/templates/native-go/backend/internal/helper/lifecycle_test.go +473 -0
- package/templates/native-go/backend/internal/helper/managed_pilot.go +284 -0
- package/templates/native-go/backend/internal/helper/managed_pilot_repository_linux.go +74 -0
- package/templates/native-go/backend/internal/helper/managed_pilot_repository_linux_test.go +40 -0
- package/templates/native-go/backend/internal/helper/managed_pilot_test.go +210 -0
- package/templates/native-go/backend/internal/helper/nas_shipped_refusal_linux_test.go +97 -0
- package/templates/native-go/backend/internal/helper/native_discovery.go +79 -0
- package/templates/native-go/backend/internal/helper/native_identity.go +89 -0
- package/templates/native-go/backend/internal/helper/native_provider.go +159 -0
- package/templates/native-go/backend/internal/helper/native_provider_test.go +421 -0
- package/templates/native-go/backend/internal/helper/observation.go +204 -0
- package/templates/native-go/backend/internal/helper/observation_health_test.go +115 -0
- package/templates/native-go/backend/internal/helper/observation_reload_budget_test.go +117 -0
- package/templates/native-go/backend/internal/helper/observation_test.go +196 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic.go +109 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_linux.go +76 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +124 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
- package/templates/native-go/backend/internal/helper/operation_bootstrap_linux.go +193 -0
- package/templates/native-go/backend/internal/helper/operation_credentials_linux.go +56 -0
- package/templates/native-go/backend/internal/helper/operation_linux.go +480 -0
- package/templates/native-go/backend/internal/helper/operation_linux_test.go +528 -0
- package/templates/native-go/backend/internal/helper/peer_linux.go +44 -0
- package/templates/native-go/backend/internal/helper/peer_other.go +7 -0
- package/templates/native-go/backend/internal/helper/process_linux.go +177 -0
- package/templates/native-go/backend/internal/helper/process_other.go +5 -0
- package/templates/native-go/backend/internal/helper/publication_test.go +178 -0
- package/templates/native-go/backend/internal/helper/read_stream_cohort_linux_test.go +156 -0
- package/templates/native-go/backend/internal/helper/read_transfer.go +40 -0
- package/templates/native-go/backend/internal/helper/read_transfer_linux.go +109 -0
- package/templates/native-go/backend/internal/helper/read_transfer_linux_test.go +118 -0
- package/templates/native-go/backend/internal/helper/read_transfer_test.go +177 -0
- package/templates/native-go/backend/internal/helper/readonly.go +105 -0
- package/templates/native-go/backend/internal/helper/readonly_admission.go +85 -0
- package/templates/native-go/backend/internal/helper/readonly_cohort_linux_test.go +253 -0
- package/templates/native-go/backend/internal/helper/readonly_linux_test.go +378 -0
- package/templates/native-go/backend/internal/helper/readonly_mount_linux.go +65 -0
- package/templates/native-go/backend/internal/helper/readonly_mount_proxy_linux.go +113 -0
- package/templates/native-go/backend/internal/helper/readonly_operations_linux.go +168 -0
- package/templates/native-go/backend/internal/helper/readonly_resolver_linux.go +241 -0
- package/templates/native-go/backend/internal/helper/readonly_test.go +40 -0
- package/templates/native-go/backend/internal/helper/relaxed_identity.go +252 -0
- package/templates/native-go/backend/internal/helper/relaxed_identity_contract.go +105 -0
- package/templates/native-go/backend/internal/helper/relaxed_identity_test.go +406 -0
- package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +200 -0
- package/templates/native-go/backend/internal/helper/repair.go +132 -0
- package/templates/native-go/backend/internal/helper/repair_test.go +271 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_acl_linux_test.go +303 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_fixture_linux_test.go +184 -0
- package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +231 -0
- package/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
- package/templates/native-go/backend/internal/helper/server_linux.go +124 -0
- package/templates/native-go/backend/internal/helper/status.go +334 -0
- package/templates/native-go/backend/internal/helper/status_test.go +288 -0
- package/templates/native-go/backend/internal/helper/supervision.go +107 -0
- package/templates/native-go/backend/internal/helper/supervision_test.go +124 -0
- package/templates/native-go/backend/internal/helper/supervisor_frame.go +76 -0
- package/templates/native-go/backend/internal/helper/supervisor_frame_linux_test.go +69 -0
- package/templates/native-go/backend/internal/helper/supervisor_frame_test.go +107 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux.go +363 -0
- package/templates/native-go/backend/internal/helper/supervisor_linux_test.go +913 -0
- package/templates/native-go/backend/internal/helper/supervisor_socket_eof_test.go +74 -0
- package/templates/native-go/backend/internal/helper/supervisor_socket_test.go +45 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/create.json +23 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/frames.json +67 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/grant-store.json +52 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/intent.json +20 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/list.json +20 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/publish.json +20 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/read.json +22 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/stat.json +22 -0
- package/templates/native-go/backend/internal/helper/testdata/protocol2/write-stream.json +22 -0
- package/templates/native-go/backend/internal/helper/unit_connection.go +75 -0
- package/templates/native-go/backend/internal/helper/unit_connection_linux_test.go +135 -0
- package/templates/native-go/backend/internal/helper/unit_connection_test.go +133 -0
- package/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
- package/templates/native-go/backend/internal/helper/unit_linux.go +364 -0
- package/templates/native-go/backend/internal/helper/unit_linux_test.go +46 -0
- package/templates/native-go/backend/internal/helper/unit_mechanisms_linux_test.go +217 -0
- package/templates/native-go/backend/internal/helper/unit_padding_linux_test.go +178 -0
- package/templates/native-go/backend/internal/helper/unit_query_linux.go +111 -0
- package/templates/native-go/backend/internal/helper/unit_reload_linux_test.go +372 -0
- package/templates/native-go/backend/internal/helper/unit_reload_sequence_linux_test.go +232 -0
- package/templates/native-go/backend/internal/helper/write.go +77 -0
- package/templates/native-go/backend/internal/helper/write_admission.go +260 -0
- package/templates/native-go/backend/internal/helper/write_admission_test.go +135 -0
- package/templates/native-go/backend/internal/helper/write_cohort_linux_test.go +218 -0
- package/templates/native-go/backend/internal/helper/write_files_linux.go +202 -0
- package/templates/native-go/backend/internal/helper/write_files_linux_test.go +199 -0
- package/templates/native-go/backend/internal/helper/write_intent_linux.go +116 -0
- package/templates/native-go/backend/internal/helper/write_intent_linux_test.go +74 -0
- package/templates/native-go/backend/internal/helper/write_operation_linux.go +245 -0
- package/templates/native-go/backend/internal/helper/write_test.go +53 -0
- package/templates/native-go/dsm-package.yaml +58 -0
- package/templates/native-go/gitignore +1 -0
- package/templates/native-go/i18n/glossary.json +662 -0
- package/templates/native-go/i18n/messages/de.json +28 -0
- package/templates/native-go/i18n/messages/en.json +28 -0
- package/templates/native-go/i18n/messages/es.json +28 -0
- package/templates/native-go/i18n/messages/fr.json +28 -0
- package/templates/native-go/i18n/messages/it.json +28 -0
- package/templates/native-go/i18n/messages/ja.json +28 -0
- package/templates/native-go/i18n/messages/ko.json +28 -0
- package/templates/native-go/i18n/messages/zh-CN.json +28 -0
- package/templates/native-go/i18n/messages/zh-TW.json +28 -0
- package/templates/native-go/ui/app.css +35 -0
- package/templates/native-go/ui/app.js +101 -0
- package/templates/native-go-better-auth/backend/internal/app/identity.go +208 -0
- package/templates/native-go-better-auth/backend/internal/app/identity_test.go +113 -0
- package/templates/native-go-better-auth/node/app.mjs +72 -0
- package/templates/native-go-better-auth/node/build.mjs +4 -0
- package/templates/native-go-better-auth/node/package-lock.json +862 -0
- package/templates/native-go-better-auth/node/package.json +1 -0
- package/templates/native-go-better-auth/node/test/auth.test.mjs +31 -0
- package/templates/native-go-integration/backend/internal/app/identity_none.go +6 -0
- package/templates/native-go-integration/backend/internal/app/personal.go +203 -0
- package/templates/native-go-integration/backend/internal/app/personal_test.go +119 -0
- package/templates/native-go-root/backend/internal/app/root.go +107 -0
- package/templates/native-go-root/backend/internal/app/root_test.go +124 -0
- package/templates/native-go-root/root/whoami.sh +6 -0
- package/templates/native-go-vue/README.md +224 -0
- package/templates/native-go-vue/frontend/DESIGN.md +78 -0
- package/templates/native-go-vue/frontend/package-lock.json +2410 -0
- package/templates/native-go-vue/frontend/package.json +6 -0
- package/templates/native-go-vue/frontend/src/App.vue +159 -0
- package/templates/native-go-vue/frontend/src/context.ts +56 -0
- package/templates/native-go-vue/frontend/src/main.ts +29 -0
- package/templates/native-go-vue/frontend/src/nas/NasGrantSettings.vue +74 -0
- package/templates/native-go-vue/frontend/src/nas/NasPathPicker.vue +106 -0
- package/templates/native-go-vue/frontend/src/nas/NasUnavailable.vue +20 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/de.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/en.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/es.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/fr.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/it.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/ja.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/ko.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/zh-CN.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/zh-TW.json +74 -0
- package/templates/native-go-vue/frontend/src/nas/i18n.ts +38 -0
- package/templates/native-go-vue/frontend/src/nas/mock-provider.ts +119 -0
- package/templates/native-go-vue/frontend/src/nas/provider.ts +59 -0
- package/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
- package/templates/native-go-vue/frontend/src/style.css +31 -0
- package/templates/native-go-vue/frontend/test/apps.test.ts +190 -0
- package/templates/native-go-vue/frontend/test/nas-provider.test.ts +81 -0
- package/templates/native-go-vue/frontend/test/nas-request.test.ts +21 -0
- package/templates/native-go-vue/frontend/test/nas-ui.test.ts +261 -0
- package/templates/native-go-vue/frontend/tsconfig.json +1 -0
- package/templates/native-go-vue/frontend/vite.config.ts +10 -0
- package/templates/native-go-vue/gitignore +2 -0
- package/dist/attestation/app-package.d.ts +0 -86
- package/dist/attestation/app-package.js +0 -206
- package/dist/attestation/install-on-host.d.ts +0 -14
- package/dist/attestation/install-on-host.js +0 -52
- package/dist/attestation/keyring.d.ts +0 -21
- package/dist/attestation/keyring.js +0 -168
- package/dist/attestation/platform-service.d.ts +0 -70
- package/dist/attestation/platform-service.js +0 -250
- package/dist/build-spk/broker-glue.d.ts +0 -16
- package/dist/build-spk/broker-glue.js +0 -40
- package/dist/deploy/catalog-publish.d.ts +0 -3
- package/dist/deploy/catalog-publish.js +0 -7
- package/dist/doctor.d.ts +0 -22
- package/dist/doctor.js +0 -822
- package/dist/error-collector.d.ts +0 -2
- package/dist/error-collector.js +0 -46
- package/dist/host/broker-paths.d.ts +0 -1
- package/dist/host/broker-paths.js +0 -1
- package/dist/host/broker-upgrade-preflight.d.ts +0 -61
- package/dist/host/broker-upgrade-preflight.js +0 -156
- package/dist/host/digests.d.ts +0 -5
- package/dist/host/digests.js +0 -63
- package/dist/host/fake-nas.d.ts +0 -49
- package/dist/host/fake-nas.js +0 -193
- package/dist/mock-broker/bootstrap.d.ts +0 -2
- package/dist/mock-broker/bootstrap.js +0 -8
- package/dist/mock-broker/files.d.ts +0 -60
- package/dist/mock-broker/files.js +0 -408
- package/dist/mock-broker/oidc.d.ts +0 -31
- package/dist/mock-broker/oidc.js +0 -161
- package/dist/mock-broker/path.d.ts +0 -9
- package/dist/mock-broker/path.js +0 -50
- package/dist/mock-broker/server.d.ts +0 -19
- package/dist/mock-broker/server.js +0 -350
- package/dist/publish/build-ledger.d.ts +0 -22
- package/dist/publish/build-ledger.js +0 -26
- package/dist/publish/community-path.d.ts +0 -6
- package/dist/publish/community-path.js +0 -41
- package/dist/publish/curated-release.d.ts +0 -78
- package/dist/publish/curated-release.js +0 -883
- package/dist/publish/file-build-ledger.d.ts +0 -18
- package/dist/publish/file-build-ledger.js +0 -268
- package/dist/publish/github-pr.d.ts +0 -25
- package/dist/publish/github-pr.js +0 -85
- package/dist/publish/github-repo.d.ts +0 -8
- package/dist/publish/github-repo.js +0 -21
- package/dist/publish/platform-service-release.d.ts +0 -60
- package/dist/publish/platform-service-release.js +0 -333
- package/dist/publish/preflight.d.ts +0 -24
- package/dist/publish/preflight.js +0 -138
- package/dist/publish/publish.d.ts +0 -27
- package/dist/publish/publish.js +0 -136
- package/dist/publish/sync-definition.d.ts +0 -4
- package/dist/publish/sync-definition.js +0 -48
- package/dist/release-bin.d.ts +0 -2
- package/dist/release-bin.js +0 -23
- package/dist/templates/hello-web/html/sdk.js +0 -68
- package/dist/templates/hello-web-page/html/sdk.js +0 -68
- package/dist/templates/native/synology-app.yaml +0 -7
- package/dist/test-host.d.ts +0 -15
- package/dist/test-host.js +0 -37
- package/templates/hello-web/html/sdk.js +0 -68
- package/templates/hello-web-page/html/sdk.js +0 -68
- package/templates/native/synology-app.yaml +0 -7
- /package/dist/templates/{native → binary}/native.yaml +0 -0
- /package/templates/{native → binary}/native.yaml +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "native-dsm-vue-app", "private": true, "type": "module",
|
|
3
|
+
"scripts": {"build": "vue-tsc --noEmit && vite build", "test": "vitest run"},
|
|
4
|
+
"dependencies": {"@synopackageland/ui": "0.4.0", "vue": "3.5.43"},
|
|
5
|
+
"devDependencies": {"@vitejs/plugin-vue": "6.0.9", "vite": "7.3.6", "typescript": "5.9.3", "vue-tsc": "3.3.11", "vitest": "4.1.11", "jsdom": "26.1.0"}
|
|
6
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {computed, inject, onMounted, onUnmounted, ref} from 'vue'
|
|
3
|
+
import {AppRoot, Button, Callout, Dialog, SettingsSection, Textarea} from '@synopackageland/ui'
|
|
4
|
+
import {stateCopy, type AppStatus, type Context, type Status} from './context'
|
|
5
|
+
import {NasProviderKey} from './nas/provider'
|
|
6
|
+
import {errorCopy, nasCopy} from './nas/i18n'
|
|
7
|
+
import NasGrantSettings from './nas/NasGrantSettings.vue'
|
|
8
|
+
import NasUnavailable from './nas/NasUnavailable.vue'
|
|
9
|
+
const nasProvider = inject(NasProviderKey, null)
|
|
10
|
+
// A mount owns one provider binding. A native subject/package switch must
|
|
11
|
+
// discard its UI and pending work; the host supplies a new provider on remount.
|
|
12
|
+
const nasInvalidated = ref(false)
|
|
13
|
+
const props = defineProps<{ctx: Context}>()
|
|
14
|
+
const app = ref<AppStatus>()
|
|
15
|
+
const status = ref<Status>()
|
|
16
|
+
const busy = ref(false)
|
|
17
|
+
const error = ref('')
|
|
18
|
+
const notice = ref('')
|
|
19
|
+
const disableOpen = ref(false)
|
|
20
|
+
const id = ref('')
|
|
21
|
+
const text = ref('')
|
|
22
|
+
const identity = ref('')
|
|
23
|
+
let disposed = false
|
|
24
|
+
const refreshing = ref(false)
|
|
25
|
+
let appCookie = ''
|
|
26
|
+
const configured = computed(() => status.value?.reason !== "not-requested")
|
|
27
|
+
const details = computed(() => {
|
|
28
|
+
if(status.value?.state === 'pending') {
|
|
29
|
+
const copy = nasCopy(props.ctx.locale)
|
|
30
|
+
return {label:copy.healthPending,description:copy.healthPendingHelp}
|
|
31
|
+
}
|
|
32
|
+
return status.value ? stateCopy[status.value.state] : undefined
|
|
33
|
+
})
|
|
34
|
+
function message(e: unknown) {
|
|
35
|
+
const code = (e as {code?: string})?.code || 'request_failed'
|
|
36
|
+
if(['denied','unknown_method','unavailable','unsupported','session_required','auth_unavailable'].includes(code)) return errorCopy(e,nasCopy(props.ctx.locale))
|
|
37
|
+
return ({session_required:'Your DSM session expired. Sign in again.',access_denied:'This sample belongs to another account.',integration_unavailable:'Integration is unavailable. Ask an administrator to activate or recover it.',personal_unavailable:'Sample storage is unavailable. Ask an administrator to check package data.',root_conflict:'A conflicting scheduler task exists. Ask an administrator to review it.',root_verify_failed:'Scheduler verification failed. Refresh and review the task.',root_run_failed:'The approved operation failed. Review integration status and cleanup.'} as Record<string,string>)[code] || `Request failed (${code}). Refresh and try again.`
|
|
38
|
+
}
|
|
39
|
+
async function refresh() {
|
|
40
|
+
if(disposed || refreshing.value) return
|
|
41
|
+
refreshing.value = true; error.value = ''
|
|
42
|
+
try {
|
|
43
|
+
const [a,s] = await Promise.all([props.ctx.call<AppStatus>('app.status'),props.ctx.call<Status>('integration.status')])
|
|
44
|
+
if(disposed) return
|
|
45
|
+
if(app.value && (app.value.user!==a.user || app.value.package!==a.package)) nasInvalidated.value=true
|
|
46
|
+
app.value = a; status.value = s
|
|
47
|
+
if(s.state !== 'ready') {id.value='';text.value='';return}
|
|
48
|
+
// Plain --ui vue has no personal routes; not-enabled status hides this.
|
|
49
|
+
const list = await props.ctx.call<{items:Array<{id:string;name:string}>}>('personal.list')
|
|
50
|
+
if(disposed) return
|
|
51
|
+
id.value = list.items[0]?.id || ''
|
|
52
|
+
if(id.value) {
|
|
53
|
+
const note = await props.ctx.call<{text:string}>('personal.read',{id:id.value})
|
|
54
|
+
if(!disposed) text.value = note.text
|
|
55
|
+
}
|
|
56
|
+
} catch(e) {if(!disposed) {error.value = message(e);status.value=undefined;id.value='';text.value=''}} finally {refreshing.value=false}
|
|
57
|
+
}
|
|
58
|
+
async function action(op: string) {
|
|
59
|
+
if(busy.value || refreshing.value || disposed) return
|
|
60
|
+
busy.value=true;error.value='';notice.value=''
|
|
61
|
+
try {
|
|
62
|
+
if(!props.ctx.root) throw {code:'unsupported'}
|
|
63
|
+
const approved = await props.ctx.root.authorize(op)
|
|
64
|
+
if(disposed) return
|
|
65
|
+
if(approved !== 'ready') {notice.value='Approval cancelled. No operation was run.';return}
|
|
66
|
+
await props.ctx.root.run(op)
|
|
67
|
+
if(disposed) return
|
|
68
|
+
notice.value=op==='helper_repair' ? 'Cleanup repaired. Use Recover or Approve and activate when ready.' : 'Operation completed. Integration status was checked again.'
|
|
69
|
+
await refresh()
|
|
70
|
+
} catch(e) {if(!disposed) {
|
|
71
|
+
await refresh()
|
|
72
|
+
if(!disposed) {
|
|
73
|
+
const code=(e as {code?:string})?.code
|
|
74
|
+
if(code==='root_cancelled') notice.value='Repair confirmation cancelled. No operation was run.'
|
|
75
|
+
else error.value=op==='helper_repair' && (code==='root_run_failed' || code==='root_task_failed') ? 'Repair could not verify safe cleanup. Review the package recovery instructions before trying again.' : message(e)
|
|
76
|
+
}
|
|
77
|
+
}}
|
|
78
|
+
finally {if(!disposed) busy.value=false}
|
|
79
|
+
}
|
|
80
|
+
async function save() {
|
|
81
|
+
if(busy.value || refreshing.value || !id.value || disposed) return
|
|
82
|
+
busy.value=true;error.value='';notice.value=''
|
|
83
|
+
try {await props.ctx.call('personal.write',{id:id.value,text:text.value});if(!disposed) notice.value='Your sample note was saved.'}
|
|
84
|
+
catch(e) {if(!disposed) error.value=message(e)} finally {if(!disposed) busy.value=false}
|
|
85
|
+
}
|
|
86
|
+
async function login() {
|
|
87
|
+
if(busy.value || refreshing.value || disposed) return
|
|
88
|
+
busy.value=true;error.value=''
|
|
89
|
+
try {
|
|
90
|
+
const result=await props.ctx.call<{cookie:string;user:string}>('identity.login')
|
|
91
|
+
if(!disposed){appCookie=result.cookie;identity.value=`App session for ${result.user}`}
|
|
92
|
+
} catch(e) {if(!disposed) error.value=message(e)} finally {if(!disposed) busy.value=false}
|
|
93
|
+
}
|
|
94
|
+
async function checkIdentity() {
|
|
95
|
+
if(busy.value || refreshing.value || disposed) return
|
|
96
|
+
busy.value=true;error.value=''
|
|
97
|
+
try {const result=await props.ctx.call<{user:string}>('identity.current',{cookie:appCookie});if(!disposed) identity.value=`App session for ${result.user}`}
|
|
98
|
+
catch(e) {if(!disposed) {appCookie='';identity.value='';error.value=message(e)}} finally {if(!disposed) busy.value=false}
|
|
99
|
+
}
|
|
100
|
+
const hasIdentity = ref(false)
|
|
101
|
+
onMounted(async()=>{
|
|
102
|
+
props.ctx.reopen(()=>{if(!disposed) void refresh()})
|
|
103
|
+
await refresh()
|
|
104
|
+
if(disposed || !app.value) return
|
|
105
|
+
try {const result = await props.ctx.call<{mode:string}>('identity.status');if(!disposed) hasIdentity.value = result.mode==='better-auth'} catch { /* Optional route absent in Go-only. */ }
|
|
106
|
+
})
|
|
107
|
+
onUnmounted(()=>{disposed=true;appCookie='';text.value='';id.value=''})
|
|
108
|
+
</script>
|
|
109
|
+
|
|
110
|
+
<template>
|
|
111
|
+
<AppRoot modal-scope="app" style="height: 100%">
|
|
112
|
+
<main class="integration-app" :aria-busy="busy || refreshing" aria-label="Package settings">
|
|
113
|
+
<header class="integration-heading">
|
|
114
|
+
<div><h1>{{ app?.package || 'Package settings' }}</h1><p v-if="app">{{ app.user }} · {{ app.version }}</p></div>
|
|
115
|
+
<Button variant="secondary" :disabled="busy || refreshing" @click="error=''; refresh()">Refresh</Button>
|
|
116
|
+
</header>
|
|
117
|
+
<p v-if="refreshing" role="status">Refreshing status…</p>
|
|
118
|
+
<p v-else-if="busy" role="status">Completing operation…</p>
|
|
119
|
+
<Callout v-if="error" tone="danger" title="Action required"><span role="alert">{{ error }}</span></Callout>
|
|
120
|
+
<p v-if="notice" class="integration-notice" role="status">{{ notice }}</p>
|
|
121
|
+
<SettingsSection title="DSM integration" :collapsible="false">
|
|
122
|
+
<div v-if="status && details" :data-integration-state="status.state" class="integration-status" role="status">
|
|
123
|
+
<h2>{{ details.label }}</h2><p>{{ details.description }}</p>
|
|
124
|
+
<p v-if="status.cleanup === 'required'">Cleanup is required. Ask an administrator to run teardown or disable. If the helper supervisor was lost, use Repair cleanup and follow the package recovery instructions.</p>
|
|
125
|
+
<dl><dt>Package running</dt><dd>{{ status.packageRunning }}</dd><dt>Scheduler</dt><dd>{{ status.scheduler }}</dd></dl>
|
|
126
|
+
</div>
|
|
127
|
+
<p v-else-if="error" role="status">Status could not be loaded. Refresh to try again.</p>
|
|
128
|
+
<p v-else role="status">Loading integration status…</p>
|
|
129
|
+
<div v-if="app?.admin && ctx.root && configured" class="integration-actions">
|
|
130
|
+
<Button variant="primary" :disabled="busy || refreshing" @click="action('helper_enable')">Approve and activate</Button>
|
|
131
|
+
<Button variant="secondary" :disabled="busy || refreshing" @click="action('helper_recover')">Recover</Button>
|
|
132
|
+
<Button variant="secondary" :disabled="busy || refreshing" @click="action('helper_teardown')">Teardown</Button>
|
|
133
|
+
<Button variant="secondary" :disabled="busy || refreshing" @click="disableOpen=true">Disable</Button>
|
|
134
|
+
<Button variant="secondary" :disabled="busy || refreshing" @click="action('helper_repair')">Repair cleanup</Button>
|
|
135
|
+
</div>
|
|
136
|
+
<p v-if="app?.admin && ctx.root && configured" class="integration-help">Repair cleanup clears verified leftover helper state. It does not restart integration.</p>
|
|
137
|
+
<Callout v-if="app && !app.admin && status?.state !== 'ready' && status?.state !== 'pending'" title="Administrator action needed">Ask a DSM administrator to open this package's settings. Your login cannot approve root operations.</Callout>
|
|
138
|
+
</SettingsSection>
|
|
139
|
+
<SettingsSection v-if="status?.state === 'ready'" title="My sample data" :collapsible="false">
|
|
140
|
+
<p class="integration-help">This synthetic note belongs to your DSM account and is stored in package data.</p>
|
|
141
|
+
<p v-if="refreshing" role="status">Loading your sample data…</p>
|
|
142
|
+
<Callout v-else-if="!id" title="No sample data">Refresh to request your sample data again.</Callout>
|
|
143
|
+
<label v-if="id" class="integration-field"><span>My sample note</span><Textarea v-model="text" aria-label="My sample note" :disabled="busy || refreshing" /></label>
|
|
144
|
+
<Button v-if="id" variant="primary" :disabled="busy || refreshing" @click="save">Save my note</Button>
|
|
145
|
+
</SettingsSection>
|
|
146
|
+
<NasGrantSettings v-if="nasProvider && app && status && !nasInvalidated" :locale="ctx.locale" />
|
|
147
|
+
<NasUnavailable v-else :locale="ctx.locale" />
|
|
148
|
+
<SettingsSection v-if="hasIdentity" title="Optional app identity" :collapsible="false">
|
|
149
|
+
<p class="integration-help">Your DSM login is checked again for every app session request.</p>
|
|
150
|
+
<div class="integration-actions"><Button variant="primary" :disabled="busy || refreshing" @click="login">Create app session</Button><Button variant="secondary" :disabled="busy || refreshing || !identity" @click="checkIdentity">Check app session</Button></div>
|
|
151
|
+
<p v-if="identity" role="status">{{ identity }}</p>
|
|
152
|
+
</SettingsSection>
|
|
153
|
+
<Dialog v-model:open="disableOpen" title="Disable integration?" description="New integration requests will be refused before helper cleanup begins.">
|
|
154
|
+
<p>Your sample data and historical root output are retained. A failed cleanup remains visible.</p>
|
|
155
|
+
<template #footer><Button variant="secondary" @click="disableOpen=false">Cancel</Button><Button variant="danger" :disabled="busy || refreshing" @click="disableOpen=false; action('helper_disable')">Confirm disable</Button></template>
|
|
156
|
+
</Dialog>
|
|
157
|
+
</main>
|
|
158
|
+
</AppRoot>
|
|
159
|
+
</template>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type IntegrationState = 'not-enabled' | 'ready' | 'needs-approval' | 'incompatible' | 'stopped' | 'failed' | 'pending'
|
|
2
|
+
export interface Status {state: IntegrationState; reason?: string; cleanup?: string; packageRunning: string; scheduler: string}
|
|
3
|
+
export interface HostPlatformSnapshot {
|
|
4
|
+
readonly web: boolean
|
|
5
|
+
readonly host: 'dsm' | 'standalone-web' | 'unavailable'
|
|
6
|
+
readonly dsmStandalone: boolean | null
|
|
7
|
+
readonly dsmLanguage: string | null
|
|
8
|
+
readonly appLocale: string | null
|
|
9
|
+
readonly systemVersion: string | null
|
|
10
|
+
readonly fullVersion: string | null
|
|
11
|
+
readonly theme: null
|
|
12
|
+
}
|
|
13
|
+
export type HostTitleResult = {status: 'ok'; target: 'dsm-window' | 'document'} |
|
|
14
|
+
{status: 'unsupported' | 'unavailable' | 'invalid-input' | 'failed'}
|
|
15
|
+
export type HostRequestResult = {status: 'requested'} |
|
|
16
|
+
{status: 'unsupported' | 'unavailable' | 'invalid-input' | 'blocked' | 'failed'}
|
|
17
|
+
export type HostURLResult = {status: 'requested'; windowHandleAvailable: boolean} |
|
|
18
|
+
{status: 'unsupported' | 'unavailable' | 'invalid-input' | 'failed'}
|
|
19
|
+
export type HostEvent = 'window-resize' | 'host-theme-change' | 'host-language-change'
|
|
20
|
+
export type HostSubscriptionResult = {status: 'subscribed'; dispose(): void} |
|
|
21
|
+
{status: 'unsupported' | 'unavailable' | 'invalid-input' | 'failed'}
|
|
22
|
+
export type HostFileNavigationResult = {status: 'requested'; action: 'locate-folder' | 'highlight-file'} |
|
|
23
|
+
{status: 'unsupported' | 'unavailable' | 'invalid-input' | 'failed'}
|
|
24
|
+
export type HostUnsupportedResult = {status: 'unsupported' | 'unavailable'}
|
|
25
|
+
export interface HostAdapter {
|
|
26
|
+
platform(): HostPlatformSnapshot
|
|
27
|
+
setTitle(title: string): HostTitleResult
|
|
28
|
+
activateWindow(): HostRequestResult
|
|
29
|
+
requestClose(): HostRequestResult
|
|
30
|
+
openApp(appId: string): HostRequestResult
|
|
31
|
+
openURL(url: string): HostURLResult
|
|
32
|
+
openFileManager(path: string): HostFileNavigationResult
|
|
33
|
+
revealFile(path: string): HostFileNavigationResult
|
|
34
|
+
openFile(path: string): HostUnsupportedResult
|
|
35
|
+
showFileDetails(paths: readonly string[]): HostUnsupportedResult
|
|
36
|
+
openAppSetting(): HostUnsupportedResult
|
|
37
|
+
subscribe(event: HostEvent, listener: () => void): HostSubscriptionResult
|
|
38
|
+
dispose(): void
|
|
39
|
+
}
|
|
40
|
+
export interface Context {
|
|
41
|
+
call<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>
|
|
42
|
+
reopen(fn: () => void): () => void
|
|
43
|
+
locale: string
|
|
44
|
+
host: HostAdapter
|
|
45
|
+
root?: {state(op: string): Promise<string>; authorize(op: string): Promise<string>; run(op: string): Promise<unknown>; remove(op: string): Promise<string>}
|
|
46
|
+
}
|
|
47
|
+
export interface AppStatus {package: string; version: string; user: string; admin: boolean}
|
|
48
|
+
export const stateCopy: Record<IntegrationState, {label: string; description: string}> = {
|
|
49
|
+
'not-enabled': {label: 'Not enabled', description: 'An administrator can enable integration for this package.'},
|
|
50
|
+
pending: {label: 'Temporarily revalidating', description: 'Integration is temporarily revalidating. Wait, then refresh. New access is unavailable until verification completes.'},
|
|
51
|
+
ready: {label: 'Ready', description: 'The helper passed a fresh trusted health check.'},
|
|
52
|
+
'needs-approval': {label: 'Approval required', description: 'Ask an administrator to approve and activate integration.'},
|
|
53
|
+
incompatible: {label: 'Incompatible', description: 'Inventory or trust checks failed. Ask an administrator to review this package.'},
|
|
54
|
+
stopped: {label: 'Stopped', description: 'An administrator must recover integration after start or reboot.'},
|
|
55
|
+
failed: {label: 'Failed', description: 'Integration could not finish. Review cleanup status before retrying.'},
|
|
56
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {createApp} from 'vue'
|
|
2
|
+
import App from './App.vue'
|
|
3
|
+
import type {Context} from './context'
|
|
4
|
+
import {NasProviderKey, type NasProvider} from './nas/provider'
|
|
5
|
+
import '@synopackageland/ui/themes/dsm7-embedded.css'
|
|
6
|
+
import './style.css'
|
|
7
|
+
|
|
8
|
+
let mountSequence = 0
|
|
9
|
+
export function mount(root: HTMLElement, ctx: Context, options: {nasProvider?: NasProvider} = {}) {
|
|
10
|
+
const app = createApp(App, {ctx})
|
|
11
|
+
// The shipped strict-S1 build never installs a NAS provider. Preview is dev/mock only.
|
|
12
|
+
if(import.meta.env.DEV && options.nasProvider?.mode === 'mock') app.provide(NasProviderKey, options.nasProvider)
|
|
13
|
+
// Include the generated package ID, an instance counter and randomness even
|
|
14
|
+
// across separately loaded bundles. getRandomValues also works on DSM HTTP.
|
|
15
|
+
app.config.idPrefix = `__PACKAGE__-${++mountSequence}-${crypto.getRandomValues(new Uint32Array(4)).join('-')}`
|
|
16
|
+
const hadRootClass = root.classList.contains('dsmapp-vue-root')
|
|
17
|
+
root.classList.add('dsmapp-vue-root')
|
|
18
|
+
app.mount(root)
|
|
19
|
+
return {unmount() {app.unmount(); if(!hadRootClass) root.classList.remove('dsmapp-vue-root')}}
|
|
20
|
+
}
|
|
21
|
+
// Register with the existing per-package DSM window loader. Never share a
|
|
22
|
+
// singleton app or user/session state between different mount calls.
|
|
23
|
+
const script = document.currentScript as HTMLScriptElement | null
|
|
24
|
+
const packageID = script?.getAttribute('data-package')
|
|
25
|
+
const host = window as unknown as {DsmPackageApps: Record<string, {mount: typeof mount}>}
|
|
26
|
+
if (packageID) {
|
|
27
|
+
host.DsmPackageApps = host.DsmPackageApps || {}
|
|
28
|
+
host.DsmPackageApps[packageID] = {mount}
|
|
29
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {computed, inject, onMounted, ref} from 'vue'
|
|
3
|
+
import {Button, Callout, Dialog, SettingsSection} from '@synopackageland/ui'
|
|
4
|
+
import {NasProviderKey, type GrantView, type ScopeKind} from './provider'
|
|
5
|
+
import {actionCopy, errorCopy, nasCopy} from './i18n'
|
|
6
|
+
import {useNasRequest} from './use-request'
|
|
7
|
+
import NasPathPicker from './NasPathPicker.vue'
|
|
8
|
+
|
|
9
|
+
const props=defineProps<{locale:string}>()
|
|
10
|
+
const provider=inject(NasProviderKey)!
|
|
11
|
+
const copy=computed(()=>nasCopy(props.locale))
|
|
12
|
+
const request=useNasRequest(), {busy,error}=request
|
|
13
|
+
const items=ref<GrantView[]>([]), canManageShared=ref(false), pickerOpen=ref(false), kind=ref<ScopeKind>('user-personal'), revokeTarget=ref<GrantView>(), notice=ref('')
|
|
14
|
+
const revokeOpen=computed({get:()=>!!revokeTarget.value,set:value=>{if(!value){request.cancel();revokeTarget.value=undefined}}})
|
|
15
|
+
async function refresh() {
|
|
16
|
+
const result=await request.run(signal=>provider.settings(signal))
|
|
17
|
+
if(result) {items.value=result.items;canManageShared.value=result.canManageShared}
|
|
18
|
+
}
|
|
19
|
+
function choose(scope:ScopeKind) {kind.value=scope;notice.value='';pickerOpen.value=true}
|
|
20
|
+
async function granted() {notice.value=copy.value.noticeCreated;await refresh()}
|
|
21
|
+
function state(item:GrantView) {
|
|
22
|
+
if(item.effectiveState==='active') return copy.value.active
|
|
23
|
+
if(item.effectiveState==='suspended') return copy.value.suspended
|
|
24
|
+
if(item.cleanupRequired) return copy.value.cleanup
|
|
25
|
+
return item.drained===true?copy.value.revoked:copy.value.draining
|
|
26
|
+
}
|
|
27
|
+
function created(time:number) {
|
|
28
|
+
try {return new Intl.DateTimeFormat(props.locale.replace('_','-'),{dateStyle:'medium',timeStyle:'short'}).format(time)}
|
|
29
|
+
catch {return new Intl.DateTimeFormat('en',{dateStyle:'medium',timeStyle:'short'}).format(time)}
|
|
30
|
+
}
|
|
31
|
+
async function revoke() {
|
|
32
|
+
const target=revokeTarget.value;if(!target) return
|
|
33
|
+
const result=await request.run(signal=>provider.revoke(target.grantId,target.revision,signal))
|
|
34
|
+
if(result) {
|
|
35
|
+
// Only an R receipt sets revoked; only Q sets drained. Timeout is neither.
|
|
36
|
+
if(result.revoked) {const item=items.value.find(i=>i.grantId===result.grantId);if(item){item.effectiveState='revoked';item.revision=result.grantRevision;item.drained=result.drained}}
|
|
37
|
+
revokeTarget.value=undefined
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
onMounted(refresh)
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<template>
|
|
44
|
+
<SettingsSection :title="copy.title" :collapsible="false" class="nas-settings" :aria-busy="busy">
|
|
45
|
+
<Callout tone="info" :title="copy.pilotOff">{{ copy.pilotRestrictions }}</Callout>
|
|
46
|
+
<p v-if="provider.mode === 'mock'" class="integration-help">{{ copy.mock }}</p>
|
|
47
|
+
<Callout v-if="error" tone="danger" :title="copy.errorTitle" role="alert">{{ errorCopy(error,copy) }}</Callout>
|
|
48
|
+
<div class="integration-actions">
|
|
49
|
+
<Button variant="primary" :disabled="busy || pickerOpen" @click="choose('user-personal')">{{ copy.choosePersonal }}</Button>
|
|
50
|
+
<Button v-if="canManageShared" variant="secondary" :disabled="busy || pickerOpen" @click="choose('app-shared')">{{ copy.chooseShared }}</Button>
|
|
51
|
+
<Button variant="secondary" :disabled="busy || pickerOpen" @click="refresh">{{ copy.refresh }}</Button>
|
|
52
|
+
</div>
|
|
53
|
+
<p v-if="notice" role="status">{{ notice }}</p>
|
|
54
|
+
<p v-if="busy" role="status">{{ copy.loading }}</p>
|
|
55
|
+
<p v-else-if="!items.length">{{ copy.emptyGrant }}</p>
|
|
56
|
+
<ul v-else class="nas-grants">
|
|
57
|
+
<li v-for="item in items" :key="item.grantId">
|
|
58
|
+
<div class="nas-grant-heading"><strong>{{ item.displayName }}</strong><Button v-if="item.canRevoke && item.effectiveState !== 'revoked'" variant="secondary" :disabled="busy || pickerOpen" @click="revokeTarget=item">{{ copy.revoke }}</Button></div>
|
|
59
|
+
<dl class="nas-summary">
|
|
60
|
+
<dt>{{ copy.scope }}</dt><dd>{{ item.scopeKind === 'user-personal' ? copy.personal : copy.shared }}</dd>
|
|
61
|
+
<dt>{{ copy.actions }}</dt><dd>{{ actionCopy(item.actions,copy) }}</dd>
|
|
62
|
+
<dt>{{ copy.state }}</dt><dd role="status">{{ state(item) }}</dd>
|
|
63
|
+
<dt>{{ copy.createdAt }}</dt><dd>{{ created(item.createdAt) }}</dd>
|
|
64
|
+
</dl>
|
|
65
|
+
</li>
|
|
66
|
+
</ul>
|
|
67
|
+
<NasPathPicker v-model:open="pickerOpen" :scope-kind="kind" :locale="locale" @granted="granted" />
|
|
68
|
+
<Dialog v-model:open="revokeOpen" :title="copy.revokeTitle" :description="copy.revokeWarning" :close-label="copy.close">
|
|
69
|
+
<p>{{ revokeTarget?.displayName }}</p>
|
|
70
|
+
<Callout v-if="error" tone="danger" :title="copy.errorTitle" role="alert">{{ errorCopy(error,copy) }}</Callout>
|
|
71
|
+
<template #footer><Button variant="secondary" @click="revokeOpen=false">{{ copy.cancel }}</Button><Button variant="danger" :disabled="busy" @click="revoke">{{ copy.confirmRevoke }}</Button></template>
|
|
72
|
+
</Dialog>
|
|
73
|
+
</SettingsSection>
|
|
74
|
+
</template>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {computed, inject, onBeforeUnmount, ref, watch} from 'vue'
|
|
3
|
+
import {Button, Callout, DataGrid, Dialog, TreeView, type TreeNode} from '@synopackageland/ui'
|
|
4
|
+
import {NasProviderKey, type FolderEntry, type PickerContext, type PreparedIntent, type GrantHandle, type ScopeKind} from './provider'
|
|
5
|
+
import {actionCopy, errorCopy, format, nasCopy} from './i18n'
|
|
6
|
+
import {useNasRequest} from './use-request'
|
|
7
|
+
|
|
8
|
+
const props=defineProps<{open:boolean; scopeKind:ScopeKind; locale:string}>()
|
|
9
|
+
const emit=defineEmits<{'update:open':[value:boolean]; granted:[grant:GrantHandle]}>()
|
|
10
|
+
const provider=inject(NasProviderKey)!
|
|
11
|
+
const copy=computed(()=>nasCopy(props.locale))
|
|
12
|
+
const request=useNasRequest(), {busy,error}=request
|
|
13
|
+
const context=ref<PickerContext>(), entries=ref<FolderEntry[]>([]), roots=ref<TreeNode[]>([])
|
|
14
|
+
const path=ref<Array<{id:string;name:string}>>([]), selected=ref<FolderEntry>(), intent=ref<PreparedIntent>(), nextCursor=ref<string>()
|
|
15
|
+
const columns=computed(()=>[{key:'displayName',label:copy.value.folder,width:'65%'},{key:'selection',label:copy.value.selection,width:'35%'}])
|
|
16
|
+
const rows=computed(()=>entries.value.map(e=>({...e})))
|
|
17
|
+
|
|
18
|
+
function discard() {
|
|
19
|
+
request.cancel()
|
|
20
|
+
const id=context.value?.contextId;context.value=undefined
|
|
21
|
+
entries.value=[];roots.value=[];path.value=[];selected.value=undefined;intent.value=undefined;nextCursor.value=undefined
|
|
22
|
+
if(id) void provider.cancel(id).catch(()=>{})
|
|
23
|
+
}
|
|
24
|
+
function close() {discard();emit('update:open',false)}
|
|
25
|
+
async function start() {
|
|
26
|
+
discard()
|
|
27
|
+
const result=await request.run(async(signal,current)=> {
|
|
28
|
+
const ctx=await provider.begin(props.scopeKind,signal)
|
|
29
|
+
// A provider which ignores abort must still have its late context canceled.
|
|
30
|
+
if(!current() || signal.aborted) {await provider.cancel(ctx.contextId);throw {code:'canceled'}}
|
|
31
|
+
context.value=ctx
|
|
32
|
+
return provider.list(ctx.contextId,undefined,undefined,signal)
|
|
33
|
+
})
|
|
34
|
+
if(result) {entries.value=result.entries;roots.value=result.entries.map(e=>({id:e.nodeId,label:e.displayName}));nextCursor.value=result.nextCursor}
|
|
35
|
+
}
|
|
36
|
+
async function browse(target:Array<{id:string;name:string}>, more=false) {
|
|
37
|
+
if(!context.value) return
|
|
38
|
+
const ctx=context.value, node=target.at(-1)?.id
|
|
39
|
+
const result=await request.run(signal=>provider.list(ctx.contextId,node,more?nextCursor.value:undefined,signal))
|
|
40
|
+
if(result) {
|
|
41
|
+
path.value=target;entries.value=more?[...entries.value,...result.entries]:result.entries
|
|
42
|
+
// Bound the rendered list too; pages do not grow an unbounded DOM.
|
|
43
|
+
if(entries.value.length>200) entries.value=entries.value.slice(-200)
|
|
44
|
+
if(target.length===0) roots.value=entries.value.map(e=>({id:e.nodeId,label:e.displayName}))
|
|
45
|
+
nextCursor.value=result.nextCursor;selected.value=undefined;intent.value=undefined
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function openFolder(id:string,name:string) {void browse([...path.value,{id,name}])}
|
|
49
|
+
async function review() {
|
|
50
|
+
if(!selected.value) return
|
|
51
|
+
const result=await request.run(signal=>provider.prepare(selected.value!.nodeId,signal))
|
|
52
|
+
if(result) intent.value=result
|
|
53
|
+
}
|
|
54
|
+
async function confirm() {
|
|
55
|
+
if(!intent.value) return
|
|
56
|
+
const prepared=intent.value
|
|
57
|
+
const result=await request.run(signal=>provider.confirm(prepared.intentId,prepared.summaryDigest,signal))
|
|
58
|
+
if(result) {emit('granted',result);close()}
|
|
59
|
+
}
|
|
60
|
+
watch(()=>props.open,open=>{if(open) void start();else discard()},{immediate:true})
|
|
61
|
+
watch(()=>props.scopeKind,()=>{if(props.open) void start()})
|
|
62
|
+
onBeforeUnmount(discard)
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<template>
|
|
66
|
+
<Dialog :open="open" :title="intent ? copy.summaryTitle : copy.pickerTitle" :description="copy.pickerHelp" :close-label="copy.close" width="720px" @update:open="value => {if(!value) close()}">
|
|
67
|
+
<div class="nas-picker" :aria-busy="busy">
|
|
68
|
+
<p v-if="provider.mode === 'mock'" class="integration-help">{{ copy.mock }}</p>
|
|
69
|
+
<Callout v-if="error" tone="danger" :title="copy.errorTitle" role="alert">{{ errorCopy(error,copy) }}</Callout>
|
|
70
|
+
<p v-if="busy" role="status">{{ copy.loading }}</p>
|
|
71
|
+
<template v-if="intent">
|
|
72
|
+
<dl class="nas-summary">
|
|
73
|
+
<dt>{{ copy.app }}</dt><dd>{{ intent.summary.appName }}</dd>
|
|
74
|
+
<dt>{{ copy.scope }}</dt><dd>{{ intent.summary.scopeKind === 'user-personal' ? copy.personal : copy.shared }}</dd>
|
|
75
|
+
<dt>{{ copy.folder }}</dt><dd>{{ intent.summary.displayName }}</dd>
|
|
76
|
+
<dt>{{ copy.actions }}</dt><dd>{{ actionCopy(intent.summary.actions,copy) }}</dd>
|
|
77
|
+
</dl>
|
|
78
|
+
<p>{{ copy.persistent }}</p><p>{{ copy.revokeHow }}</p><p>{{ copy.expires }}</p>
|
|
79
|
+
</template>
|
|
80
|
+
<template v-else-if="context">
|
|
81
|
+
<nav class="nas-breadcrumb" :aria-label="copy.folder">
|
|
82
|
+
<Button v-if="path.length" variant="secondary" :disabled="busy" @click="browse(path.slice(0,-1))">{{ copy.back }}</Button>
|
|
83
|
+
<Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
|
|
84
|
+
<Button v-for="(part,index) in path" :key="part.id" variant="secondary" :disabled="busy" @click="browse(path.slice(0,index+1))">{{ part.name }}</Button>
|
|
85
|
+
</nav>
|
|
86
|
+
<div class="nas-browser">
|
|
87
|
+
<aside class="nas-tree" :aria-label="copy.roots" :inert="busy || undefined"><TreeView :nodes="roots" :show-icons="false" @select="node => browse([{id:node.id,name:node.label}])" /></aside>
|
|
88
|
+
<div class="nas-folder-list">
|
|
89
|
+
<DataGrid :columns="columns" :rows="rows" row-key="nodeId" :footer="false" :labels="{empty:copy.emptyFolder}" :resizable="false" :loading="busy" :loading-text="copy.loading">
|
|
90
|
+
<template #cell-displayName="{row}"><Button variant="secondary" class="nas-folder-name" :disabled="busy" @click="openFolder(String(row.nodeId),String(row.displayName))">{{ format(copy.open,String(row.displayName)) }}</Button></template>
|
|
91
|
+
<template #cell-selection="{row}"><Button variant="secondary" class="nas-folder-action" :disabled="busy || !row.selectable" :aria-label="format(copy.select,String(row.displayName))" :aria-pressed="selected?.nodeId === row.nodeId" @click="selected=entries.find(e=>e.nodeId===row.nodeId)">{{ copy.selection }}</Button></template>
|
|
92
|
+
</DataGrid>
|
|
93
|
+
<Button v-if="nextCursor" variant="secondary" :disabled="busy" @click="browse(path,true)">{{ copy.loadMore }}</Button>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
<p v-if="selected" role="status">{{ format(copy.selected,selected.displayName) }}</p>
|
|
97
|
+
</template>
|
|
98
|
+
</div>
|
|
99
|
+
<template #footer>
|
|
100
|
+
<Button variant="secondary" @click="close">{{ copy.cancel }}</Button>
|
|
101
|
+
<Button v-if="!context && !busy" variant="secondary" @click="start">{{ copy.retry }}</Button>
|
|
102
|
+
<Button v-if="intent" variant="primary" :disabled="busy" @click="confirm">{{ copy.confirm }}</Button>
|
|
103
|
+
<Button v-else variant="primary" :disabled="busy || !selected" @click="review">{{ copy.review }}</Button>
|
|
104
|
+
</template>
|
|
105
|
+
</Dialog>
|
|
106
|
+
</template>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {computed} from 'vue'
|
|
3
|
+
import {Callout, SettingsSection} from '@synopackageland/ui'
|
|
4
|
+
import {nasCopy} from './i18n'
|
|
5
|
+
const props=defineProps<{locale:string}>()
|
|
6
|
+
const copy=computed(()=>nasCopy(props.locale))
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<SettingsSection :title="copy.title" :collapsible="false" data-nas-state="unavailable">
|
|
11
|
+
<Callout :title="copy.unavailableTitle">
|
|
12
|
+
<p>{{ copy.unavailableMessage }}</p>
|
|
13
|
+
<p>{{ copy.pilotUnavailable }}</p>
|
|
14
|
+
<p>{{ copy.noUnlock }}</p>
|
|
15
|
+
<p>{{ copy.relaxedRisk }}</p>
|
|
16
|
+
<p>{{ copy.relaxedReauthorize }}</p>
|
|
17
|
+
<p>{{ copy.relaxedPermissions }}</p>
|
|
18
|
+
</Callout>
|
|
19
|
+
</SettingsSection>
|
|
20
|
+
</template>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "NAS-Ordnerzugriff",
|
|
3
|
+
"mock": "Mock-Vorschau — NAS-Dateien und Berechtigungen bleiben unverändert.",
|
|
4
|
+
"personal": "Meine Ordner",
|
|
5
|
+
"shared": "Gemeinsame App-Ordner",
|
|
6
|
+
"choosePersonal": "Eigenen Ordner wählen",
|
|
7
|
+
"chooseShared": "Gemeinsamen Ordner wählen",
|
|
8
|
+
"refresh": "Zugriff aktualisieren",
|
|
9
|
+
"emptyGrant": "Keine Ordner freigegeben. Wählen Sie einen Ordner für die Vorschau des Lesezugriffs.",
|
|
10
|
+
"pickerTitle": "NAS-Ordner wählen",
|
|
11
|
+
"pickerHelp": "Ordner durchsuchen, auswählen und den Lesezugriff prüfen.",
|
|
12
|
+
"roots": "Ordner",
|
|
13
|
+
"back": "Zurück",
|
|
14
|
+
"open": "{name} öffnen",
|
|
15
|
+
"select": "{name} auswählen",
|
|
16
|
+
"selected": "Ausgewählt: {name}",
|
|
17
|
+
"review": "Zugriff prüfen",
|
|
18
|
+
"cancel": "Abbrechen",
|
|
19
|
+
"confirm": "Zugriff bestätigen",
|
|
20
|
+
"summaryTitle": "Ordnerzugriff prüfen",
|
|
21
|
+
"app": "App",
|
|
22
|
+
"scope": "Bereich",
|
|
23
|
+
"folder": "Ordner",
|
|
24
|
+
"actions": "Erlaubte Aktionen",
|
|
25
|
+
"readOnly": "Ordner auflisten, Metadaten prüfen und Dateien lesen",
|
|
26
|
+
"persistent": "Dauerhafter Zugriff bis zum Widerruf oder bis die Bindung ungültig wird.",
|
|
27
|
+
"revokeHow": "Widerrufen Sie einzelne Ordner hier. Eine neue Freigabe erzeugt einen neuen Grant.",
|
|
28
|
+
"expires": "Innerhalb von 30 Sekunden bestätigen.",
|
|
29
|
+
"loading": "Ordner werden geladen…",
|
|
30
|
+
"emptyFolder": "Dieser Ordner ist leer",
|
|
31
|
+
"loadMore": "Mehr laden",
|
|
32
|
+
"state": "Zugriffsstatus",
|
|
33
|
+
"active": "Aktiv",
|
|
34
|
+
"suspended": "Ausgesetzt — erneut auswählen und freigeben",
|
|
35
|
+
"revoked": "Widerrufen",
|
|
36
|
+
"draining": "Widerrufen; Übertragungen werden gestoppt",
|
|
37
|
+
"cleanup": "Widerrufen; Bereinigung muss geprüft werden",
|
|
38
|
+
"createdAt": "Erstellt",
|
|
39
|
+
"revoke": "Widerrufen",
|
|
40
|
+
"revokeTitle": "Ordnerzugriff widerrufen?",
|
|
41
|
+
"revokeWarning": "Neuen Zugriff und laufende Übertragungen stoppen. Bereits gesendete oder geschriebene Daten werden nicht zurückgesetzt.",
|
|
42
|
+
"confirmRevoke": "Widerruf bestätigen",
|
|
43
|
+
"noticeCreated": "Ordnerzugriff hinzugefügt.",
|
|
44
|
+
"errorTitle": "Ordnerzugriff konnte nicht aktualisiert werden",
|
|
45
|
+
"errorDenied": "Zugriff verweigert. Wählen Sie einen für Ihr aktuelles Konto sichtbaren Ordner.",
|
|
46
|
+
"errorExpired": "Auswahl oder Bestätigung abgelaufen. Abbrechen und den Ordner erneut wählen.",
|
|
47
|
+
"errorStale": "Sitzung oder Auswahl geändert. Abbrechen und den Ordner erneut wählen.",
|
|
48
|
+
"errorUnavailable": "Ordnerdienst nicht verfügbar. Bitten Sie einen Administrator, Integration und Home-Dienste zu prüfen.",
|
|
49
|
+
"errorBusy": "Anfragelimit erreicht. Warten Sie und versuchen Sie es erneut.",
|
|
50
|
+
"errorCanceled": "Anfrage abgebrochen. Wählen Sie den Ordner erneut, wenn Sie bereit sind.",
|
|
51
|
+
"errorInternal": "Anfrage fehlgeschlagen. Aktualisieren Sie den Zugriff vor einem neuen Versuch.",
|
|
52
|
+
"retry": "Erneut versuchen",
|
|
53
|
+
"close": "Schließen",
|
|
54
|
+
"selection": "Ordner auswählen",
|
|
55
|
+
"actionList": "Ordner auflisten",
|
|
56
|
+
"actionStat": "Metadaten prüfen",
|
|
57
|
+
"actionRead": "Dateien lesen",
|
|
58
|
+
"pilotOff": "Pilot für verwaltete Konten: aus",
|
|
59
|
+
"pilotRestrictions": "Die Freigabe durch einen Administrator und ein geprüfter Ablauf zur Kontenpflege sind erforderlich. Kontoänderungen oder eine ungeprüfte Identität entziehen den Zugriff und erfordern eine neue Anmeldung und Freigabe. Diese Version kann den Pilotbetrieb nicht aktivieren.",
|
|
60
|
+
"unavailableTitle": "Noch nicht verfügbar",
|
|
61
|
+
"unavailableMessage": "NAS-Ordnerfreigaben und Dateioperationen sind noch nicht verfügbar. Die erforderlichen nativen Identitäts- und Berechtigungsnachweise können derzeit nicht geprüft werden.",
|
|
62
|
+
"pilotUnavailable": "Der Pilot B für verwaltete Konten ist experimental und kann nicht aktiviert werden.",
|
|
63
|
+
"noUnlock": "Das Aktivieren der Integration oder erneutes Anmelden schaltet den NAS-Dateizugriff nicht frei.",
|
|
64
|
+
"errorUnknownMethod": "Diese Paketversion stellt diese Methode nicht bereit.",
|
|
65
|
+
"errorNativeProof": "Der erforderliche native Identitäts- oder Berechtigungsnachweis fehlt. Der NAS-Zugriff bleibt gesperrt.",
|
|
66
|
+
"errorSession": "Ihre DSM-Sitzung ist abgelaufen. Melden Sie sich erneut für die App-Sitzung an; der NAS-Dateizugriff bleibt nicht verfügbar.",
|
|
67
|
+
"errorAuthentication": "Die DSM-Authentifizierung ist nicht verfügbar. Aktualisieren Sie den App-Status später.",
|
|
68
|
+
"errorUnsupported": "NAS-Dateioperationen sind in diesem Build nicht verfügbar.",
|
|
69
|
+
"healthPending": "Vorübergehende erneute Prüfung",
|
|
70
|
+
"healthPendingHelp": "Die Integration wird vorübergehend erneut geprüft. Warten Sie und aktualisieren Sie anschließend. Neuer Zugriff ist erst nach Abschluss der Prüfung möglich.",
|
|
71
|
+
"relaxedRisk": "Bei gelockerter Identität können mit derselben UID und demselben username neu erstellte Konten bestehende Freigaben übernehmen.",
|
|
72
|
+
"relaxedReauthorize": "Ändert sich die UID oder der username, werden alle Ihre Freigaben ungültig und müssen erneut genehmigt werden.",
|
|
73
|
+
"relaxedPermissions": "Dateioperationen verwenden Ihre UID und Gruppen und bleiben auf NAS-Berechtigungen und genehmigte Ordner beschränkt. Deaktivierte Konten oder entzogene App-Berechtigungen führen zur Zugriffsverweigerung."
|
|
74
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "NAS folder access",
|
|
3
|
+
"mock": "Mock preview — no NAS files or permissions are changed.",
|
|
4
|
+
"personal": "My folders",
|
|
5
|
+
"shared": "App shared folders",
|
|
6
|
+
"choosePersonal": "Choose my folder",
|
|
7
|
+
"chooseShared": "Choose shared folder",
|
|
8
|
+
"refresh": "Refresh access",
|
|
9
|
+
"emptyGrant": "No folders authorized. Choose a folder to preview read-only access.",
|
|
10
|
+
"pickerTitle": "Choose a NAS folder",
|
|
11
|
+
"pickerHelp": "Browse folders, select one, then review read-only access.",
|
|
12
|
+
"roots": "Folders",
|
|
13
|
+
"back": "Back",
|
|
14
|
+
"open": "Open {name}",
|
|
15
|
+
"select": "Select {name}",
|
|
16
|
+
"selected": "Selected: {name}",
|
|
17
|
+
"review": "Review access",
|
|
18
|
+
"cancel": "Cancel",
|
|
19
|
+
"confirm": "Confirm access",
|
|
20
|
+
"summaryTitle": "Review folder access",
|
|
21
|
+
"app": "App",
|
|
22
|
+
"scope": "Scope",
|
|
23
|
+
"folder": "Folder",
|
|
24
|
+
"actions": "Allowed actions",
|
|
25
|
+
"readOnly": "List folders, inspect metadata and read files",
|
|
26
|
+
"persistent": "Persistent access — until you revoke it or its binding becomes invalid.",
|
|
27
|
+
"revokeHow": "Revoke individual folders here. Reauthorization creates a new grant.",
|
|
28
|
+
"expires": "Confirm within 30 seconds.",
|
|
29
|
+
"loading": "Loading folders…",
|
|
30
|
+
"emptyFolder": "This folder is empty",
|
|
31
|
+
"loadMore": "Load more",
|
|
32
|
+
"state": "Access state",
|
|
33
|
+
"active": "Active",
|
|
34
|
+
"suspended": "Suspended — select again to authorize",
|
|
35
|
+
"revoked": "Revoked",
|
|
36
|
+
"draining": "Revoked; stopping transfers",
|
|
37
|
+
"cleanup": "Revoked; cleanup needs verification",
|
|
38
|
+
"createdAt": "Created",
|
|
39
|
+
"revoke": "Revoke",
|
|
40
|
+
"revokeTitle": "Revoke folder access?",
|
|
41
|
+
"revokeWarning": "Stop new access and in-progress transfers. Data already sent or written will not be restored.",
|
|
42
|
+
"confirmRevoke": "Confirm revoke",
|
|
43
|
+
"noticeCreated": "Folder access added.",
|
|
44
|
+
"errorTitle": "Folder access could not be updated",
|
|
45
|
+
"errorDenied": "Access denied. Choose a folder visible to your current account.",
|
|
46
|
+
"errorExpired": "The selection or confirmation expired. Cancel and choose the folder again.",
|
|
47
|
+
"errorStale": "Your session or selection changed. Cancel and choose the folder again.",
|
|
48
|
+
"errorUnavailable": "Folder service is unavailable. Ask an administrator to check integration and home services.",
|
|
49
|
+
"errorBusy": "The request limit was reached. Wait, then retry.",
|
|
50
|
+
"errorCanceled": "The request was canceled. Choose the folder again when ready.",
|
|
51
|
+
"errorInternal": "The request failed. Refresh access before trying again.",
|
|
52
|
+
"retry": "Retry",
|
|
53
|
+
"close": "Close",
|
|
54
|
+
"selection": "Select folder",
|
|
55
|
+
"actionList": "List folders",
|
|
56
|
+
"actionStat": "Inspect metadata",
|
|
57
|
+
"actionRead": "Read files",
|
|
58
|
+
"pilotOff": "Managed account pilot: off",
|
|
59
|
+
"pilotRestrictions": "Administrator approval and a verified account-maintenance process are required. Account changes or unverified identity revoke access and require a new sign-in and approval. Enabling this pilot is unavailable in this build.",
|
|
60
|
+
"unavailableTitle": "Not available yet",
|
|
61
|
+
"unavailableMessage": "NAS folder grants and file operations are not available yet. Required native identity and permission proof cannot currently be verified.",
|
|
62
|
+
"pilotUnavailable": "Managed account pilot B is experimental and cannot be enabled.",
|
|
63
|
+
"noUnlock": "Enabling integration or signing in again does not unlock NAS file access.",
|
|
64
|
+
"errorUnknownMethod": "This method is not provided by this package version.",
|
|
65
|
+
"errorNativeProof": "Required native identity or permission proof is unavailable. NAS access remains closed.",
|
|
66
|
+
"errorSession": "Your DSM session expired. Sign in to restore the app session; NAS file access remains unavailable.",
|
|
67
|
+
"errorAuthentication": "DSM authentication is unavailable. Refresh the app status later.",
|
|
68
|
+
"errorUnsupported": "NAS file operations are not available in this build.",
|
|
69
|
+
"healthPending": "Temporarily revalidating",
|
|
70
|
+
"healthPendingHelp": "Integration is temporarily revalidating. Wait, then refresh. New access is unavailable until verification completes.",
|
|
71
|
+
"relaxedRisk": "When relaxed identity is selected, accounts recreated with the same UID and username may retain grants.",
|
|
72
|
+
"relaxedReauthorize": "A UID or username change invalidates all your grants and requires new authorization.",
|
|
73
|
+
"relaxedPermissions": "File operations use your UID and groups, within NAS permissions and authorized folders. Disabled accounts or revoked app access are denied."
|
|
74
|
+
}
|