@synopackageland/cli 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +42 -1
- package/dist/build-spk/delete-app-data.d.ts +27 -7
- package/dist/build-spk/delete-app-data.js +35 -34
- package/dist/build-spk/dsm-arch.d.ts +6 -1
- package/dist/build-spk/dsm-arch.js +25 -1
- package/dist/build-spk/dsm-version.d.ts +14 -0
- package/dist/build-spk/dsm-version.js +47 -0
- package/dist/build-spk/gateway.d.ts +31 -0
- package/dist/build-spk/gateway.js +55 -0
- package/dist/build-spk/generator.d.ts +5 -0
- package/dist/build-spk/generator.js +106 -107
- package/dist/build-spk/install-wizard.d.ts +20 -0
- package/dist/build-spk/install-wizard.js +76 -0
- package/dist/build-spk/native-lifecycle.d.ts +5 -0
- package/dist/build-spk/native-lifecycle.js +12 -2
- package/dist/build-spk/notices.d.ts +5 -0
- package/dist/build-spk/notices.js +60 -0
- package/dist/build-spk/resource-worker.d.ts +9 -4
- package/dist/build-spk/resource-worker.js +15 -6
- package/dist/build-spk/share-combobox.d.ts +3 -0
- package/dist/build-spk/share-combobox.js +27 -0
- package/dist/build-spk/uninstall-wizard.d.ts +14 -0
- package/dist/build-spk/uninstall-wizard.js +33 -0
- package/dist/build-spk/wizard-i18n.d.ts +18 -0
- package/dist/build-spk/wizard-i18n.js +38 -0
- package/dist/build-spk/wizard-messages.d.ts +388 -0
- package/dist/build-spk/wizard-messages.js +387 -0
- package/dist/cli.js +136 -29
- package/dist/compose/analyze.d.ts +20 -0
- package/dist/compose/analyze.js +75 -11
- package/dist/contract/validate.js +33 -1
- package/dist/contract/web-launch.d.ts +22 -0
- package/dist/contract/web-launch.js +37 -0
- package/dist/deploy/deploy.d.ts +3 -0
- package/dist/deploy/deploy.js +11 -2
- package/dist/error-registry.js +80 -1
- package/dist/host/open-url.d.ts +2 -0
- package/dist/host/open-url.js +4 -1
- package/dist/images/pin.d.ts +52 -0
- package/dist/images/pin.js +249 -0
- package/dist/init.d.ts +29 -1
- package/dist/init.js +122 -25
- package/dist/inspect.d.ts +3 -0
- package/dist/inspect.js +15 -3
- package/dist/standalone/background.d.ts +21 -0
- package/dist/standalone/background.js +52 -0
- package/dist/standalone/binary.d.ts +1 -0
- package/dist/standalone/binary.js +1 -1
- package/dist/standalone/build.d.ts +2 -0
- package/dist/standalone/build.js +40 -6
- package/dist/standalone/daemon.d.ts +23 -0
- package/dist/standalone/daemon.js +114 -0
- package/dist/standalone/dsm-window.d.ts +1 -1
- package/dist/standalone/dsm-window.js +52 -12
- package/dist/standalone/helper-inventory.d.ts +31 -0
- package/dist/standalone/helper-inventory.js +11 -0
- package/dist/standalone/helper.d.ts +3 -12
- package/dist/standalone/helper.js +31 -12
- package/dist/standalone/host-adapter.d.ts +5 -0
- package/dist/standalone/host-adapter.js +166 -0
- package/dist/standalone/host-file-navigation.d.ts +7 -0
- package/dist/standalone/host-file-navigation.js +172 -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/inspect-helper.d.ts +6 -0
- package/dist/standalone/inspect-helper.js +93 -0
- package/dist/standalone/inspect-spk.d.ts +3 -1
- package/dist/standalone/inspect-spk.js +247 -5
- package/dist/standalone/job-diagnostics.d.ts +1 -0
- package/dist/standalone/job-diagnostics.js +49 -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 +63 -0
- package/dist/standalone/manifest.d.ts +17 -2
- package/dist/standalone/manifest.js +40 -6
- package/dist/standalone/native-layout.d.ts +74 -0
- package/dist/standalone/native-layout.js +318 -0
- package/dist/standalone/reopen-events.d.ts +2 -0
- package/dist/standalone/reopen-events.js +28 -0
- package/dist/standalone/resource.d.ts +11 -0
- package/dist/standalone/resource.js +13 -0
- package/dist/standalone/root-messages.js +9 -0
- package/dist/standalone/root-window.d.ts +6 -3
- package/dist/standalone/root-window.js +160 -30
- package/dist/standalone/shared-folder.d.ts +39 -0
- package/dist/standalone/shared-folder.js +141 -0
- package/dist/standalone/spk.d.ts +6 -3
- package/dist/standalone/spk.js +52 -35
- package/dist/standalone/worker-contract-json.d.ts +8 -0
- package/dist/standalone/worker-contract-json.js +141 -0
- package/dist/standalone/worker-contract.d.ts +189 -0
- package/dist/standalone/worker-contract.js +175 -0
- package/dist/standalone/worker-registry.d.ts +40 -0
- package/dist/standalone/worker-registry.js +167 -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 +5 -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/_gateway/auth.go +101 -0
- package/dist/templates/_gateway/auth_test.go +216 -0
- package/dist/templates/_gateway/cgi.go +133 -0
- package/dist/templates/_gateway/cgi_test.go +156 -0
- package/dist/templates/_gateway/csrf.go +73 -0
- package/dist/templates/_gateway/csrf_test.go +155 -0
- package/dist/templates/_gateway/directory.go +108 -0
- package/dist/templates/_gateway/directory_test.go +202 -0
- package/dist/templates/_gateway/gateway.go +412 -0
- package/dist/templates/_gateway/gateway_test.go +676 -0
- package/dist/templates/_gateway/go.mod +3 -0
- package/dist/templates/_gateway/groups.go +66 -0
- package/dist/templates/_gateway/main.go +45 -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 +1 -1
- package/dist/templates/compose-import/compose.yaml +1 -1
- package/dist/templates/compose-import/synology-app.yaml +1 -1
- package/dist/templates/hello-files/compose.yaml +1 -1
- package/dist/templates/hello-files/synology-app.yaml +1 -1
- package/dist/templates/hello-web/compose.yaml +5 -2
- package/dist/templates/hello-web/synology-app.yaml +4 -1
- package/dist/templates/hello-web-page/compose.yaml +5 -2
- package/dist/templates/hello-web-page/synology-app.yaml +4 -1
- package/dist/templates/native-go/README.md +149 -4
- package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +61 -0
- package/dist/templates/native-go/backend/cmd/app/main.go +17 -0
- package/dist/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
- package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -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 +10 -1
- package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
- package/dist/templates/native-go/backend/go.mod +7 -1
- 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/registry.go +28 -7
- package/dist/templates/native-go/backend/internal/api/server.go +11 -1
- package/dist/templates/native-go/backend/internal/app/background.go +270 -0
- package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
- package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
- package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
- package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
- package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
- package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
- package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
- package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
- package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
- package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +129 -0
- package/dist/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
- package/dist/templates/native-go/backend/internal/app/routes.go +28 -3
- package/dist/templates/native-go/backend/internal/app/routes_test.go +27 -5
- package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
- package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
- package/dist/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
- package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
- package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
- package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
- package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
- package/dist/templates/native-go/backend/internal/background/access.go +57 -0
- package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
- package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
- package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
- package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
- package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
- package/dist/templates/native-go/backend/internal/background/store.go +807 -0
- package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
- package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
- package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -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/filestation/browse_test.go +67 -0
- package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
- package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
- package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
- package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
- package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
- package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
- package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
- package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
- package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
- package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
- package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
- package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
- package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -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 +226 -21
- package/dist/templates/native-go/backend/internal/helper/control_test.go +10 -2
- package/dist/templates/native-go/backend/internal/helper/data_contract.go +245 -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 +419 -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 +519 -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 +416 -0
- package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +469 -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 +78 -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/jobcontract/bindings.go +48 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
- package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -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/legacy_authority_schema_linux_test.go +34 -0
- package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -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/management.go +79 -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 +244 -0
- package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +127 -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 +155 -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 +130 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
- package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -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/process_linux.go +14 -1
- package/dist/templates/native-go/backend/internal/helper/publication_test.go +178 -0
- package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
- package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -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 +203 -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 +250 -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/sdk_assembly_linux.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
- package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
- package/dist/templates/native-go/backend/internal/helper/server_linux.go +47 -3
- package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
- package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
- package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
- package/dist/templates/native-go/backend/internal/helper/status.go +83 -11
- package/dist/templates/native-go/backend/internal/helper/status_test.go +128 -0
- package/dist/templates/native-go/backend/internal/helper/supervision.go +28 -5
- package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +79 -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 +191 -16
- package/dist/templates/native-go/backend/internal/helper/supervisor_linux_test.go +618 -7
- 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 +151 -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 +368 -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 +115 -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 +205 -0
- package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +225 -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 +1 -1
- package/dist/templates/native-go/ui/app.js +8 -1
- package/dist/templates/native-go-background/BACKGROUND.md +111 -0
- package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
- package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
- package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
- package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
- package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
- package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
- package/dist/templates/native-go-better-auth/node/build.mjs +2 -0
- package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
- package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
- package/dist/templates/native-go-vue/README.md +151 -6
- package/dist/templates/native-go-vue/frontend/DESIGN.md +16 -4
- package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
- package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
- package/dist/templates/native-go-vue/frontend/package-lock.json +137 -233
- package/dist/templates/native-go-vue/frontend/package.json +2 -2
- package/dist/templates/native-go-vue/frontend/src/App.vue +71 -16
- package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
- package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
- package/dist/templates/native-go-vue/frontend/src/context.ts +41 -2
- package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
- package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
- package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
- package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
- package/dist/templates/native-go-vue/frontend/src/main.ts +4 -1
- package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
- package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -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/m2/de.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
- package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -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/m2-contract.ts +33 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
- package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -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-m2-request.ts +18 -0
- package/dist/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
- package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
- package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
- package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
- package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
- package/dist/templates/native-go-vue/frontend/src/style.css +19 -6
- package/dist/templates/native-go-vue/frontend/test/apps.test.ts +65 -2
- package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
- package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
- package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
- package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
- package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
- package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -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/test/native-controls.test.ts +27 -0
- package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
- package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
- package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
- package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
- package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
- package/dist/templates/native-go-vue/frontend/tsconfig.json +1 -1
- package/dist/templates/native-go-vue/frontend/vite.config.ts +8 -6
- package/dist/validate.js +6 -3
- package/package.json +3 -2
- package/schema/synology-app.schema.json +19 -0
- package/skills/reference/create.md +4 -0
- package/templates/_daemon/fixture_linux_test.go +15 -0
- package/templates/_daemon/fixture_other_test.go +7 -0
- package/templates/_daemon/go.mod +5 -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/_gateway/auth.go +101 -0
- package/templates/_gateway/auth_test.go +216 -0
- package/templates/_gateway/cgi.go +133 -0
- package/templates/_gateway/cgi_test.go +156 -0
- package/templates/_gateway/csrf.go +73 -0
- package/templates/_gateway/csrf_test.go +155 -0
- package/templates/_gateway/directory.go +108 -0
- package/templates/_gateway/directory_test.go +202 -0
- package/templates/_gateway/gateway.go +412 -0
- package/templates/_gateway/gateway_test.go +676 -0
- package/templates/_gateway/go.mod +3 -0
- package/templates/_gateway/groups.go +66 -0
- package/templates/_gateway/main.go +45 -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 +1 -1
- package/templates/compose-import/compose.yaml +1 -1
- package/templates/compose-import/synology-app.yaml +1 -1
- package/templates/hello-files/compose.yaml +1 -1
- package/templates/hello-files/synology-app.yaml +1 -1
- package/templates/hello-web/compose.yaml +5 -2
- package/templates/hello-web/synology-app.yaml +4 -1
- package/templates/hello-web-page/compose.yaml +5 -2
- package/templates/hello-web-page/synology-app.yaml +4 -1
- package/templates/native-go/README.md +149 -4
- package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +61 -0
- package/templates/native-go/backend/cmd/app/main.go +17 -0
- package/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
- package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
- package/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
- package/templates/native-go/backend/cmd/helper/main.go +10 -1
- package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
- package/templates/native-go/backend/go.mod +7 -1
- 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/registry.go +28 -7
- package/templates/native-go/backend/internal/api/server.go +11 -1
- package/templates/native-go/backend/internal/app/background.go +270 -0
- package/templates/native-go/backend/internal/app/background_none.go +8 -0
- package/templates/native-go/backend/internal/app/background_owner.go +59 -0
- package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
- package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
- package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
- package/templates/native-go/backend/internal/app/background_test.go +346 -0
- package/templates/native-go/backend/internal/app/integration_state.go +16 -0
- package/templates/native-go/backend/internal/app/migrations.go +41 -0
- package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
- package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +129 -0
- package/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
- package/templates/native-go/backend/internal/app/routes.go +28 -3
- package/templates/native-go/backend/internal/app/routes_test.go +27 -5
- package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
- package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
- package/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
- package/templates/native-go/backend/internal/app/session_files.go +15 -0
- package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
- package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
- package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
- package/templates/native-go/backend/internal/background/access.go +57 -0
- package/templates/native-go/backend/internal/background/owner_test.go +126 -0
- package/templates/native-go/backend/internal/background/runner.go +185 -0
- package/templates/native-go/backend/internal/background/runner_test.go +209 -0
- package/templates/native-go/backend/internal/background/schedule.go +300 -0
- package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
- package/templates/native-go/backend/internal/background/store.go +807 -0
- package/templates/native-go/backend/internal/background/store_test.go +407 -0
- package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
- package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -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/filestation/browse_test.go +67 -0
- package/templates/native-go/backend/internal/filestation/client.go +251 -0
- package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
- package/templates/native-go/backend/internal/filestation/doc.go +4 -0
- package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
- package/templates/native-go/backend/internal/filestation/repository.go +207 -0
- package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
- package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
- package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
- package/templates/native-go/backend/internal/filestation/service.go +254 -0
- package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
- package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
- package/templates/native-go/backend/internal/filestation/write.go +72 -0
- package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
- package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
- package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
- package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -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 +226 -21
- package/templates/native-go/backend/internal/helper/control_test.go +10 -2
- package/templates/native-go/backend/internal/helper/data_contract.go +245 -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 +419 -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 +519 -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 +416 -0
- package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +469 -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 +78 -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/jobcontract/bindings.go +48 -0
- package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
- package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
- package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
- package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
- package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
- package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
- package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
- package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
- package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
- package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
- package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -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/legacy_authority_schema_linux_test.go +34 -0
- package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -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/management.go +79 -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 +244 -0
- package/templates/native-go/backend/internal/helper/observation_health_test.go +127 -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 +155 -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 +130 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
- package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -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/process_linux.go +14 -1
- package/templates/native-go/backend/internal/helper/publication_test.go +178 -0
- package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
- package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -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 +203 -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 +250 -0
- package/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
- package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
- package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
- package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
- package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
- package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
- package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
- package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
- package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
- package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
- package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
- package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
- package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
- package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
- package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
- package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
- package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
- package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
- package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
- package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
- package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
- package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
- package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
- package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
- package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
- package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
- package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
- package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
- package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
- package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
- package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
- package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
- package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
- package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
- package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
- package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
- package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
- package/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
- package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
- package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
- package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
- package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
- package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
- package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
- package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
- package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
- package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
- package/templates/native-go/backend/internal/helper/server_linux.go +47 -3
- package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
- package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
- package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
- package/templates/native-go/backend/internal/helper/status.go +83 -11
- package/templates/native-go/backend/internal/helper/status_test.go +128 -0
- package/templates/native-go/backend/internal/helper/supervision.go +28 -5
- package/templates/native-go/backend/internal/helper/supervisor_frame.go +79 -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 +191 -16
- package/templates/native-go/backend/internal/helper/supervisor_linux_test.go +618 -7
- 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 +151 -0
- package/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
- package/templates/native-go/backend/internal/helper/unit_linux.go +368 -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 +115 -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 +205 -0
- package/templates/native-go/backend/internal/helper/write_files_linux_test.go +225 -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 +1 -1
- package/templates/native-go/ui/app.js +8 -1
- package/templates/native-go-background/BACKGROUND.md +111 -0
- package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
- package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
- package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
- package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
- package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
- package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
- package/templates/native-go-background/frontend/test/background.test.ts +179 -0
- package/templates/native-go-better-auth/node/build.mjs +2 -0
- package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
- package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
- package/templates/native-go-vue/README.md +151 -6
- package/templates/native-go-vue/frontend/DESIGN.md +16 -4
- package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
- package/templates/native-go-vue/frontend/README-M2.md +64 -0
- package/templates/native-go-vue/frontend/package-lock.json +137 -233
- package/templates/native-go-vue/frontend/package.json +2 -2
- package/templates/native-go-vue/frontend/src/App.vue +71 -16
- package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
- package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
- package/templates/native-go-vue/frontend/src/context.ts +41 -2
- package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
- package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
- package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
- package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
- package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
- package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
- package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
- package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
- package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
- package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
- package/templates/native-go-vue/frontend/src/main.ts +4 -1
- package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
- package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
- package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -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/m2/de.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
- package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -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/m2-contract.ts +33 -0
- package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
- package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -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-m2-request.ts +18 -0
- package/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
- package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
- package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
- package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
- package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
- package/templates/native-go-vue/frontend/src/style.css +19 -6
- package/templates/native-go-vue/frontend/test/apps.test.ts +65 -2
- package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
- package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
- package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
- package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
- package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
- package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -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/test/native-controls.test.ts +27 -0
- package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
- package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
- package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
- package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
- package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
- package/templates/native-go-vue/frontend/tsconfig.json +1 -1
- package/templates/native-go-vue/frontend/vite.config.ts +8 -6
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type {Context} from '../context'
|
|
2
|
+
import {M2_MAX_BYTES,M2_PAGE_SIZE,type M2Code,type M2Entry,type M2Page,type M2Provider,type M2Selection,type M2Session} from './m2-contract'
|
|
3
|
+
|
|
4
|
+
const codes=new Set<M2Code>(['session_required','auth_unavailable','denied','not_found','conflict','invalid-request','unavailable','unknown_method','unsupported','commit-uncertain','limit-exceeded','canceled','timeout'])
|
|
5
|
+
function refuse(code:M2Code='invalid-request'):never{throw {code}}
|
|
6
|
+
const record=(value:unknown):Record<string,unknown>=>{
|
|
7
|
+
if(!value||typeof value!=='object'||Array.isArray(value))return refuse('unavailable')
|
|
8
|
+
return value as Record<string,unknown>
|
|
9
|
+
}
|
|
10
|
+
const length=(s:string)=>new TextEncoder().encode(s).length
|
|
11
|
+
const name=(s:unknown):s is string=>typeof s==='string'&&length(s)<=255&&s!==''&&s!=='.'&&s!=='..'&&!/[/\\\x00\r\n,"]/.test(s)
|
|
12
|
+
const path=(s:unknown):s is string=>typeof s==='string'&&s.startsWith('/')&&length(s)<=4096&&s.slice(1).split('/').every(name)
|
|
13
|
+
const relative=(s:string)=>s===''||(!s.startsWith('/')&&s.split('/').every(name))
|
|
14
|
+
const id=(s:unknown):s is string=>typeof s==='string'&&/^[a-fA-F0-9]{64}$/.test(s)
|
|
15
|
+
const integer=(v:unknown):v is number=>typeof v==='number'&&Number.isSafeInteger(v)&&v>=0
|
|
16
|
+
function selection(value:unknown):M2Selection{
|
|
17
|
+
const v=record(value)
|
|
18
|
+
if(!id(v.grantId)||!path(v.folder)||typeof v.writable!=='boolean')refuse('unavailable')
|
|
19
|
+
return {grantId:v.grantId,folder:v.folder,writable:v.writable}
|
|
20
|
+
}
|
|
21
|
+
function entry(value:unknown):M2Entry{
|
|
22
|
+
const v=record(value),additional=record(v.additional??{})
|
|
23
|
+
if(!name(v.name)||!path(v.path)||typeof v.isdir!=='boolean'||(additional.size!==undefined&&!integer(additional.size)))refuse('unavailable')
|
|
24
|
+
return {name:v.name,path:v.path,isDir:v.isdir,...(additional.size===undefined?{}:{bytes:additional.size as number})}
|
|
25
|
+
}
|
|
26
|
+
function page(value:unknown,offset:number):M2Page{
|
|
27
|
+
const v=record(value)
|
|
28
|
+
if(!('files' in v)&&!('shares' in v))refuse('unavailable')
|
|
29
|
+
const raw=v.shares??v.files??[]
|
|
30
|
+
if(!Array.isArray(raw)||raw.length>M2_PAGE_SIZE||!integer(v.total)||v.offset!==offset||offset+raw.length>v.total)refuse('unavailable')
|
|
31
|
+
const entries=raw.map(entry),next=offset+entries.length
|
|
32
|
+
return {entries,total:v.total,offset,...(entries.length&&next<v.total&&next<=1000000?{nextOffset:next}:{})}
|
|
33
|
+
}
|
|
34
|
+
function encode(data:Uint8Array):string{
|
|
35
|
+
let raw=''
|
|
36
|
+
for(const byte of data)raw+=String.fromCharCode(byte)
|
|
37
|
+
return btoa(raw)
|
|
38
|
+
}
|
|
39
|
+
function bytes(value:unknown):Uint8Array{
|
|
40
|
+
const v=record(value)
|
|
41
|
+
if(!integer(v.bytes)||v.bytes>M2_MAX_BYTES||typeof v.data!=='string'||v.data.length>4*Math.ceil(M2_MAX_BYTES/3)||! /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(v.data))refuse('unavailable')
|
|
42
|
+
const raw=atob(v.data)
|
|
43
|
+
if(raw.length!==v.bytes||btoa(raw)!==v.data)refuse('unavailable')
|
|
44
|
+
return Uint8Array.from(raw,c=>c.charCodeAt(0))
|
|
45
|
+
}
|
|
46
|
+
export function createM2Provider(ctx:Pick<Context,'call'>):M2Provider{
|
|
47
|
+
let disposed=false
|
|
48
|
+
const life=new AbortController()
|
|
49
|
+
async function request(method:string,args:Record<string,unknown>,signal:AbortSignal,mutates=false):Promise<unknown>{
|
|
50
|
+
if(disposed||signal.aborted)refuse('canceled')
|
|
51
|
+
let cleanup=()=>{}
|
|
52
|
+
const stop=new Promise<never>((_,reject)=>{
|
|
53
|
+
const abort=()=>reject({code:mutates?'commit-uncertain':'canceled'})
|
|
54
|
+
const timer=setTimeout(()=>reject({code:mutates?'commit-uncertain':'timeout'}),22000)
|
|
55
|
+
signal.addEventListener('abort',abort,{once:true});life.signal.addEventListener('abort',abort,{once:true})
|
|
56
|
+
cleanup=()=>{clearTimeout(timer);signal.removeEventListener('abort',abort);life.signal.removeEventListener('abort',abort)}
|
|
57
|
+
})
|
|
58
|
+
try{
|
|
59
|
+
// ctx.call retains DSM's existing same-origin session and CSRF transport.
|
|
60
|
+
// It has no abort API: canceling local observation cannot prove rollback.
|
|
61
|
+
const value=await Promise.race([ctx.call(method,args),stop])
|
|
62
|
+
if(disposed||signal.aborted)refuse(mutates?'commit-uncertain':'canceled')
|
|
63
|
+
return value
|
|
64
|
+
}catch(e){
|
|
65
|
+
const code=(e as {code?:M2Code})?.code
|
|
66
|
+
if(mutates&&(!code||!codes.has(code)||['timeout','canceled'].includes(code)))refuse('commit-uncertain')
|
|
67
|
+
throw {code:code&&codes.has(code)?code:'unavailable'}
|
|
68
|
+
}finally{cleanup()}
|
|
69
|
+
}
|
|
70
|
+
function fileArgs(grantId:string,rel:string){if(!id(grantId)||!relative(rel))refuse();return {grantId,relative:rel}}
|
|
71
|
+
function offsetArgs(offset:number){if(!integer(offset)||offset>1000000)refuse();return {offset}}
|
|
72
|
+
function dispose(){if(disposed)return;disposed=true;life.abort();if(typeof window!=='undefined')window.removeEventListener('pagehide',dispose)}
|
|
73
|
+
if(typeof window!=='undefined')window.addEventListener('pagehide',dispose)
|
|
74
|
+
return {
|
|
75
|
+
mode:'filestation-session',
|
|
76
|
+
async status(signal){
|
|
77
|
+
const v=record(await request('nas.session.status',{},signal))
|
|
78
|
+
if(v.mode!=='filestation-session'||v.interactive!=='session-required'||v.background!=='unavailable'||v.validation!=='local-only')refuse('unavailable')
|
|
79
|
+
return {mode:v.mode,interactive:v.interactive,background:v.background,validation:v.validation} as M2Session
|
|
80
|
+
},
|
|
81
|
+
async discovery(folder,offset,signal){if(folder!==undefined&&!path(folder))refuse();return page(await request('nas.discovery',{...(folder?{folder}:{}),...offsetArgs(offset)},signal),offset)},
|
|
82
|
+
async confirm(folder,writable,signal){
|
|
83
|
+
if(!path(folder)||typeof writable!=='boolean')refuse()
|
|
84
|
+
const value=await request('nas.grants.confirm',{folder,writable},signal,true)
|
|
85
|
+
try{const s=selection(value);if(s.folder!==folder||s.writable!==writable)refuse();return s}catch{refuse('commit-uncertain')}
|
|
86
|
+
},
|
|
87
|
+
async selections(signal){const values=await request('nas.grants.list',{},signal);if(!Array.isArray(values)||values.length>256)refuse('unavailable');return values.map(selection)},
|
|
88
|
+
async revoke(grantId,signal){if(!id(grantId))refuse();const result=await request('nas.grants.revoke',{grantId},signal,true);if(!result||typeof result!=='object'||(result as {revoked?:unknown}).revoked!==true)refuse('commit-uncertain')},
|
|
89
|
+
async list(grantId,rel,offset,signal){return page(await request('nas.files.list',{...fileArgs(grantId,rel),...offsetArgs(offset)},signal),offset)},
|
|
90
|
+
async stat(grantId,rel,signal){return entry(await request('nas.files.stat',fileArgs(grantId,rel),signal))},
|
|
91
|
+
async read(grantId,rel,signal){if(!rel)refuse();return bytes(await request('nas.files.read',fileArgs(grantId,rel),signal))},
|
|
92
|
+
async create(grantId,rel,n,signal){
|
|
93
|
+
if(!name(n))refuse()
|
|
94
|
+
const v=await request('nas.files.create',{...fileArgs(grantId,rel),name:n},signal,true)
|
|
95
|
+
if(!v||typeof v!=='object'||(v as {created?:unknown}).created!==true)refuse('commit-uncertain')
|
|
96
|
+
},
|
|
97
|
+
async upload(grantId,rel,n,data,signal){
|
|
98
|
+
if(!name(n)||!(data instanceof Uint8Array))refuse()
|
|
99
|
+
if(data.byteLength>M2_MAX_BYTES)refuse('limit-exceeded')
|
|
100
|
+
const v=await request('nas.files.write',{...fileArgs(grantId,rel),name:n,data:encode(data)},signal,true)
|
|
101
|
+
if(!v||typeof v!=='object'||(v as {written?:unknown}).written!==true)refuse('commit-uncertain')
|
|
102
|
+
},dispose,
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {readActions, type DiscoveryAnchor, type FolderEntry, type GrantView, type NasProvider, type PickerContext, type PreparedIntent, type SafeCode, type ScopeKind} from './provider'
|
|
2
|
+
|
|
3
|
+
// In-memory fixtures only. This does NOT validate DSM identity/ACL, implement
|
|
4
|
+
// durable R/Q, issue protocol-2 tickets or connect a helper. Never use as auth.
|
|
5
|
+
type Subject = 'admin' | 'normal1' | 'normal2'
|
|
6
|
+
type Binding = {subject: Subject; session: number; epoch: number}
|
|
7
|
+
type Browse = Binding & PickerContext & {canceled: boolean}
|
|
8
|
+
type Candidate = Binding & FolderEntry & {contextId: string; scopeKind: ScopeKind; location: string; depth: number}
|
|
9
|
+
type Intent = Binding & PreparedIntent & {candidateId: string; consumed: boolean}
|
|
10
|
+
type Record = {owner: Subject; view: GrantView}
|
|
11
|
+
function opaque() {return Array.from(crypto.getRandomValues(new Uint8Array(32)), b=>b.toString(16).padStart(2,'0')).join('')}
|
|
12
|
+
function fail(code:SafeCode):never {throw {code}}
|
|
13
|
+
function aborted(signal:AbortSignal) {if(signal.aborted) fail('canceled')}
|
|
14
|
+
const clone = <T>(value:T):T => JSON.parse(JSON.stringify(value))
|
|
15
|
+
|
|
16
|
+
export function createMockNasService(options:{now?:()=>number; drained?:boolean; appName?:string; pageSize?:number; homeAvailable?:boolean; personalFolders?:readonly string[]} = {}) {
|
|
17
|
+
const now=options.now ?? Date.now
|
|
18
|
+
const subjects = new Map<Subject, {session:number; admin:boolean}>([['admin',{session:1,admin:true}],['normal1',{session:1,admin:false}],['normal2',{session:1,admin:false}]])
|
|
19
|
+
const contexts=new Map<string,Browse>(), candidates=new Map<string,Candidate>(), intents=new Map<string,Intent>(), records=new Map<string,Record>()
|
|
20
|
+
const cursors=new Map<string,Binding & {contextId:string; nodeId?:string; offset:number}>()
|
|
21
|
+
// References have S1's shape but are synthetic fixtures, not native proofs.
|
|
22
|
+
const principals = new Map([...subjects.keys()].map(subject=>[subject,{kind:'local' as const,subjectRef:opaque(),instanceRef:opaque()}]))
|
|
23
|
+
const epoch={value:1}
|
|
24
|
+
function connect(subject:Subject):NasProvider {
|
|
25
|
+
const actor=()=>subjects.get(subject)!
|
|
26
|
+
const binding=():Binding=>({subject,session:actor().session,epoch:epoch.value})
|
|
27
|
+
function check(b:Binding) {
|
|
28
|
+
if(b.subject!==subject) fail('denied')
|
|
29
|
+
if(b.session!==actor().session || b.epoch!==epoch.value) fail('stale')
|
|
30
|
+
}
|
|
31
|
+
function browse(id:string) {
|
|
32
|
+
const ctx=contexts.get(id); if(!ctx) fail('denied'); check(ctx)
|
|
33
|
+
if(ctx.canceled) fail('canceled')
|
|
34
|
+
if(now()>=ctx.expiresAt) fail('expired')
|
|
35
|
+
if(ctx.scopeKind==='app-shared' && !actor().admin) fail('denied')
|
|
36
|
+
return ctx
|
|
37
|
+
}
|
|
38
|
+
function candidate(id:string) {
|
|
39
|
+
const node=candidates.get(id); if(!node) fail('denied'); check(node); browse(node.contextId)
|
|
40
|
+
return node
|
|
41
|
+
}
|
|
42
|
+
function entry(ctx:Browse, displayName:string, depth:number, parent?:Candidate):Candidate {
|
|
43
|
+
const node:Candidate={...binding(),contextId:ctx.contextId,scopeKind:ctx.scopeKind,nodeId:opaque(),displayName,targetKind:'directory',selectable:true,depth,location:parent?`${parent.location} / ${displayName}`:`${ctx.scopeKind==='user-personal'?'My home':'Shared folders'} / ${displayName}`}
|
|
44
|
+
candidates.set(node.nodeId,node); return node
|
|
45
|
+
}
|
|
46
|
+
const visible=()=>[...records.values()].filter(r=>r.owner===subject || r.view.scopeKind==='app-shared').map(r=>({...clone(r.view),canRevoke:r.view.scopeKind==='app-shared'?actor().admin:r.owner===subject}))
|
|
47
|
+
const provider:NasProvider = {
|
|
48
|
+
mode:'mock',
|
|
49
|
+
async begin(scopeKind,signal) {
|
|
50
|
+
aborted(signal)
|
|
51
|
+
if(!['user-personal','app-shared'].includes(scopeKind)) fail('invalid-request')
|
|
52
|
+
if(scopeKind==='app-shared' && !actor().admin) fail('denied')
|
|
53
|
+
if(scopeKind==='user-personal' && options.homeAvailable===false) fail('unavailable')
|
|
54
|
+
// Bound retained fixtures; never evict unexpired replay/intent state.
|
|
55
|
+
if(contexts.size>=256) fail('limit-exceeded')
|
|
56
|
+
const ctx:Browse={...binding(),contextId:opaque(),scopeKind,expiresAt:now()+60_000,canceled:false}
|
|
57
|
+
contexts.set(ctx.contextId,ctx)
|
|
58
|
+
return {contextId:ctx.contextId,scopeKind,expiresAt:ctx.expiresAt}
|
|
59
|
+
},
|
|
60
|
+
async list(contextId,nodeId,cursor,signal) {
|
|
61
|
+
aborted(signal); const ctx=browse(contextId), parent=nodeId?candidate(nodeId):undefined
|
|
62
|
+
if(parent && parent.contextId!==contextId) fail('denied')
|
|
63
|
+
let offset=0
|
|
64
|
+
if(cursor) {
|
|
65
|
+
const c=cursors.get(cursor); if(!c) fail('denied'); check(c)
|
|
66
|
+
if(c.contextId!==contextId || c.nodeId!==nodeId) fail('denied'); offset=c.offset
|
|
67
|
+
}
|
|
68
|
+
// Own home never returns a selectable home root. Only subdirectories do.
|
|
69
|
+
// Shared discovery first supplies S1 anchor metadata; no absolute paths.
|
|
70
|
+
const anchors:DiscoveryAnchor[]=[{ref:opaque(),displayName:'Team documents',kind:ctx.scopeKind,owner:principals.get(subject)!,localFilesystem:true}]
|
|
71
|
+
const names=parent?(parent.displayName==='Empty folder' || parent.depth>=2?[]:['Reports']):(ctx.scopeKind==='user-personal'?(options.personalFolders ?? ['Projects','Empty folder']):anchors.map(a=>a.displayName))
|
|
72
|
+
const size=Math.max(1,Math.min(200,options.pageSize ?? 200)), slice=names.slice(offset,offset+size)
|
|
73
|
+
const entries=slice.map(name=>{
|
|
74
|
+
const n=entry(ctx,name,(parent?.depth ?? 0)+1,parent)
|
|
75
|
+
return {nodeId:n.nodeId,displayName:n.displayName,targetKind:n.targetKind,selectable:n.selectable}
|
|
76
|
+
})
|
|
77
|
+
let nextCursor:string|undefined
|
|
78
|
+
if(offset+size<names.length) {nextCursor=opaque();cursors.set(nextCursor,{...binding(),contextId,nodeId,offset:offset+size})}
|
|
79
|
+
return {entries,nextCursor}
|
|
80
|
+
},
|
|
81
|
+
async prepare(candidateId,signal) {
|
|
82
|
+
aborted(signal);const node=candidate(candidateId)
|
|
83
|
+
if(!node.selectable) fail('denied')
|
|
84
|
+
if([...intents.values()].filter(i=>i.subject===subject && !i.consumed && i.expiresAt>now() && !contexts.get(candidates.get(i.candidateId)!.contextId)!.canceled).length>=8) fail('limit-exceeded')
|
|
85
|
+
const intent:Intent={...binding(),intentId:opaque(),candidateId,consumed:false,summaryDigest:opaque(),expiresAt:now()+30_000,summary:{appName:options.appName ?? 'Mock package',scopeKind:node.scopeKind,displayName:node.location,targetKind:'directory',actions:[...readActions],persistent:true}}
|
|
86
|
+
// Synthetic digest-shaped token bound to this immutable fixture summary;
|
|
87
|
+
// the real S3 adapter must supply its actual exact-summary digest.
|
|
88
|
+
intents.set(intent.intentId,intent);return clone({intentId:intent.intentId,summaryDigest:intent.summaryDigest,expiresAt:intent.expiresAt,summary:intent.summary})
|
|
89
|
+
},
|
|
90
|
+
async confirm(intentId,summaryDigest,signal) {
|
|
91
|
+
aborted(signal);const intent=intents.get(intentId);if(!intent) fail('denied');check(intent)
|
|
92
|
+
if(intent.consumed) fail('replay')
|
|
93
|
+
if(now()>=intent.expiresAt) fail('expired')
|
|
94
|
+
if(summaryDigest!==intent.summaryDigest) fail('stale')
|
|
95
|
+
const node=candidate(intent.candidateId)
|
|
96
|
+
if(node.scopeKind==='app-shared' && !actor().admin) fail('denied')
|
|
97
|
+
if(records.size>=256) fail('limit-exceeded')
|
|
98
|
+
intent.consumed=true
|
|
99
|
+
const view:GrantView={grantId:opaque(),revision:1,scopeKind:node.scopeKind,displayName:node.location,targetKind:'directory',actions:[...readActions],effectiveState:'active',createdAt:now(),canRevoke:true}
|
|
100
|
+
records.set(view.grantId,{owner:subject,view});return clone(view)
|
|
101
|
+
},
|
|
102
|
+
async cancel(contextId) {
|
|
103
|
+
const ctx=contexts.get(contextId);if(!ctx) return;check(ctx);ctx.canceled=true
|
|
104
|
+
},
|
|
105
|
+
async grants(signal) {aborted(signal);return visible()},
|
|
106
|
+
async settings(signal) {aborted(signal);return {items:visible(),canManageShared:actor().admin}},
|
|
107
|
+
async revoke(grantId,revision,signal) {
|
|
108
|
+
aborted(signal);const record=records.get(grantId);if(!record) fail('denied')
|
|
109
|
+
if(record.view.scopeKind==='app-shared'?!actor().admin:record.owner!==subject) fail('denied')
|
|
110
|
+
if(record.view.revision!==revision) fail('stale')
|
|
111
|
+
if(record.view.effectiveState!=='revoked') {record.view.revision++;record.view.effectiveState='revoked'}
|
|
112
|
+
record.view.drained=options.drained ?? true
|
|
113
|
+
return {grantId,grantRevision:record.view.revision,revoked:true,drained:record.view.drained}
|
|
114
|
+
},
|
|
115
|
+
}
|
|
116
|
+
return provider
|
|
117
|
+
}
|
|
118
|
+
return {connect,setAdmin(subject:Subject,admin:boolean){subjects.get(subject)!.admin=admin},invalidate(subject:Subject){subjects.get(subject)!.session++},newEpoch(){epoch.value++;for(const r of records.values()) if(r.view.effectiveState==='active') r.view.effectiveState='suspended'}}
|
|
119
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type {InjectionKey} from 'vue'
|
|
2
|
+
|
|
3
|
+
// S0 protocol-2 display projections, not root Grant/Intent authority records.
|
|
4
|
+
// IDs index provider-owned mappings. No paths, credentials, UID or role claims
|
|
5
|
+
// travel in picker/consent arguments. S1 discovery metadata is not a grant.
|
|
6
|
+
export type ScopeKind = 'app-shared' | 'user-personal'
|
|
7
|
+
export const readActions = ['nas.files.list', 'nas.files.stat', 'nas.files.read'] as const
|
|
8
|
+
export type ReadAction = typeof readActions[number]
|
|
9
|
+
export type SafeCode = 'unknown_method' | 'session_required' | 'auth_unavailable' | 'invalid-request' | 'incompatible' | 'unsupported' | 'replay' | 'stale' | 'expired' | 'denied' | 'unavailable' | 'suspended' | 'revoked' | 'fenced' | 'busy' | 'limit-exceeded' | 'canceled' | 'timeout' | 'partial' | 'commit-uncertain' | 'cleanup-required' | 'internal'
|
|
10
|
+
export interface SafeError {code: SafeCode; operationId?: string}
|
|
11
|
+
export interface DiscoveryAnchor {
|
|
12
|
+
ref: string
|
|
13
|
+
displayName: string
|
|
14
|
+
kind: ScopeKind
|
|
15
|
+
owner: {kind: 'local'; subjectRef: string; instanceRef: string}
|
|
16
|
+
localFilesystem: boolean
|
|
17
|
+
}
|
|
18
|
+
export interface PickerContext {contextId: string; scopeKind: ScopeKind; expiresAt: number}
|
|
19
|
+
export interface FolderEntry {nodeId: string; displayName: string; targetKind: 'directory'; selectable: boolean}
|
|
20
|
+
export interface FolderPage {entries: FolderEntry[]; nextCursor?: string}
|
|
21
|
+
export interface ConsentSummary {
|
|
22
|
+
appName: string
|
|
23
|
+
scopeKind: ScopeKind
|
|
24
|
+
displayName: string
|
|
25
|
+
targetKind: 'directory'
|
|
26
|
+
actions: readonly ReadAction[]
|
|
27
|
+
persistent: true
|
|
28
|
+
}
|
|
29
|
+
export interface PreparedIntent {intentId: string; summaryDigest: string; expiresAt: number; summary: ConsentSummary}
|
|
30
|
+
export interface GrantHandle {
|
|
31
|
+
grantId: string
|
|
32
|
+
revision: number
|
|
33
|
+
scopeKind: ScopeKind
|
|
34
|
+
displayName: string
|
|
35
|
+
targetKind: 'directory'
|
|
36
|
+
actions: readonly ReadAction[]
|
|
37
|
+
}
|
|
38
|
+
export interface GrantView extends GrantHandle {
|
|
39
|
+
effectiveState: 'active' | 'suspended' | 'revoked'
|
|
40
|
+
createdAt: number
|
|
41
|
+
canRevoke: boolean
|
|
42
|
+
// S0 R/Q receipt: undefined means Q has not been observed, never assume true.
|
|
43
|
+
drained?: boolean
|
|
44
|
+
cleanupRequired?: boolean
|
|
45
|
+
}
|
|
46
|
+
export interface GrantList {items: GrantView[]; canManageShared: boolean}
|
|
47
|
+
export interface RevokeResult {grantId: string; grantRevision: number; revoked: boolean; drained: boolean}
|
|
48
|
+
export interface NasProvider {
|
|
49
|
+
readonly mode: 'mock' | 'connected'
|
|
50
|
+
begin(kind: ScopeKind, signal: AbortSignal): Promise<PickerContext>
|
|
51
|
+
list(contextId: string, nodeId: string | undefined, cursor: string | undefined, signal: AbortSignal): Promise<FolderPage>
|
|
52
|
+
prepare(candidateId: string, signal: AbortSignal): Promise<PreparedIntent>
|
|
53
|
+
confirm(intentId: string, summaryDigest: string, signal: AbortSignal): Promise<GrantHandle>
|
|
54
|
+
cancel(contextId: string): Promise<void>
|
|
55
|
+
grants(signal: AbortSignal): Promise<GrantView[]>
|
|
56
|
+
settings(signal: AbortSignal): Promise<GrantList>
|
|
57
|
+
revoke(grantId: string, revision: number, signal: AbortSignal): Promise<RevokeResult>
|
|
58
|
+
}
|
|
59
|
+
export const NasProviderKey: InjectionKey<NasProvider> = Symbol('nas-provider')
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {onBeforeUnmount,ref} from 'vue'
|
|
2
|
+
|
|
3
|
+
// The provider owns the 22 s bound (backend handlers are bounded to 20 s).
|
|
4
|
+
// Local cancellation suppresses late display updates, never promises rollback.
|
|
5
|
+
export function useM2Request(){
|
|
6
|
+
const busy=ref(false),error=ref<unknown>()
|
|
7
|
+
let disposed=false,generation=0,active:AbortController|undefined
|
|
8
|
+
function cancel(){generation++;active?.abort();active=undefined;busy.value=false;error.value=undefined}
|
|
9
|
+
async function run<T>(fn:(signal:AbortSignal)=>Promise<T>):Promise<T|undefined>{
|
|
10
|
+
if(disposed||busy.value)return
|
|
11
|
+
const version=++generation,controller=new AbortController();active=controller;busy.value=true;error.value=undefined
|
|
12
|
+
try{const value=await fn(controller.signal);return !disposed&&version===generation?value:undefined}
|
|
13
|
+
catch(e){if(!disposed&&version===generation)error.value=e;return undefined}
|
|
14
|
+
finally{if(!disposed&&version===generation){busy.value=false;active=undefined}}
|
|
15
|
+
}
|
|
16
|
+
onBeforeUnmount(()=>{disposed=true;cancel()})
|
|
17
|
+
return {busy,error,run,cancel}
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {onBeforeUnmount, ref} from 'vue'
|
|
2
|
+
|
|
3
|
+
// One admission at a time per component, bounded metadata requests, and no late
|
|
4
|
+
// responses after close/unmount. An abort is not a server rollback/Q receipt.
|
|
5
|
+
export function useNasRequest() {
|
|
6
|
+
const busy=ref(false), error=ref<unknown>()
|
|
7
|
+
let generation=0, disposed=false, controller:AbortController|undefined
|
|
8
|
+
function cancel() {generation++;controller?.abort();controller=undefined;busy.value=false;error.value=undefined}
|
|
9
|
+
async function run<T>(operation:(signal:AbortSignal,current:()=>boolean)=>Promise<T>):Promise<T|undefined> {
|
|
10
|
+
if(busy.value || disposed) return
|
|
11
|
+
const version=++generation, active=new AbortController();controller=active;busy.value=true;error.value=undefined
|
|
12
|
+
const current=()=>!disposed && generation===version
|
|
13
|
+
let timer:ReturnType<typeof setTimeout>|undefined
|
|
14
|
+
let onAbort:()=>void=()=>{}
|
|
15
|
+
try {
|
|
16
|
+
const stop=new Promise<never>((_,reject)=> {
|
|
17
|
+
onAbort=()=>reject({code:'canceled'});active.signal.addEventListener('abort',onAbort,{once:true})
|
|
18
|
+
timer=setTimeout(()=>{reject({code:'timeout'});active.abort()},5000)
|
|
19
|
+
})
|
|
20
|
+
const value=await Promise.race([operation(active.signal,current),stop])
|
|
21
|
+
return current()?value:undefined
|
|
22
|
+
} catch(e) {if(current()) error.value=e;return undefined}
|
|
23
|
+
finally {clearTimeout(timer);active.signal.removeEventListener('abort',onAbort);if(current()){busy.value=false;controller=undefined}}
|
|
24
|
+
}
|
|
25
|
+
onBeforeUnmount(()=>{disposed=true;cancel()})
|
|
26
|
+
return {busy,error,run,cancel}
|
|
27
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {createApp} from 'vue'
|
|
2
|
+
import App from './SDKApp.vue'
|
|
3
|
+
import {JobsProviderKey,JobsAdminProviderKey} from './jobs/provider'
|
|
4
|
+
import {createConnectedJobsProvider,createConnectedJobsAdminProvider} from './jobs/connected-provider'
|
|
5
|
+
import type {Context} from './context'
|
|
6
|
+
import {NasProviderKey, type NasProvider} from './nas/provider'
|
|
7
|
+
import {M2ProviderKey} from './nas/m2-contract'
|
|
8
|
+
import {createM2Provider} from './nas/m2-provider'
|
|
9
|
+
import '@synopackageland/ui/themes/dsm7-embedded.css'
|
|
10
|
+
import './style.css'
|
|
11
|
+
import './m2-style.css'
|
|
12
|
+
|
|
13
|
+
let mountSequence = 0
|
|
14
|
+
export function mount(root: HTMLElement, ctx: Context, options: {nasProvider?: NasProvider} = {}) {
|
|
15
|
+
const app = createApp(App, {ctx})
|
|
16
|
+
const jobs=createConnectedJobsProvider(ctx)
|
|
17
|
+
const selections=createM2Provider(ctx)
|
|
18
|
+
app.provide(M2ProviderKey,selections)
|
|
19
|
+
app.provide(JobsProviderKey,jobs)
|
|
20
|
+
app.provide(JobsAdminProviderKey,createConnectedJobsAdminProvider(ctx))
|
|
21
|
+
// The shipped strict-S1 build never installs a NAS provider. Preview is dev/mock only.
|
|
22
|
+
if(import.meta.env.DEV && options.nasProvider?.mode === 'mock') app.provide(NasProviderKey, options.nasProvider)
|
|
23
|
+
// Include the generated package ID, an instance counter and randomness even
|
|
24
|
+
// across separately loaded bundles. getRandomValues also works on DSM HTTP.
|
|
25
|
+
app.config.idPrefix = `__PACKAGE__-${++mountSequence}-${crypto.getRandomValues(new Uint32Array(4)).join('-')}`
|
|
26
|
+
const hadRootClass = root.classList.contains('dsmapp-vue-root')
|
|
27
|
+
root.classList.add('dsmapp-vue-root')
|
|
28
|
+
app.mount(root)
|
|
29
|
+
return {unmount() {app.unmount(); jobs.disconnect(); selections.dispose(); if(!hadRootClass) root.classList.remove('dsmapp-vue-root')}}
|
|
30
|
+
}
|
|
31
|
+
// Register with the existing per-package DSM window loader. Never share a
|
|
32
|
+
// singleton app or user/session state between different mount calls.
|
|
33
|
+
const script = document.currentScript as HTMLScriptElement | null
|
|
34
|
+
const packageID = script?.getAttribute('data-package')
|
|
35
|
+
const host = window as unknown as {DsmPackageApps: Record<string, {mount: typeof mount}>}
|
|
36
|
+
if (packageID) {
|
|
37
|
+
host.DsmPackageApps = host.DsmPackageApps || {}
|
|
38
|
+
host.DsmPackageApps[packageID] = {mount}
|
|
39
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
// DSM-style shell: a fixed left navigation and one right-hand page with a
|
|
3
|
+
// header. Pages stay mounted (v-show) so provider leases and job polling keep
|
|
4
|
+
// running while the user moves between them.
|
|
5
|
+
import {computed, type Component} from 'vue'
|
|
6
|
+
import {AppLayout, AppSidebar, PageContent, PageHeader, type AppSidebarGroup} from '@synopackageland/ui'
|
|
7
|
+
import {FolderOpen, Info, KeyRound, ListChecks, MousePointerClick, NotebookPen, Shield, Timer} from '@lucide/vue'
|
|
8
|
+
import {shellCopy} from './i18n'
|
|
9
|
+
import type {ShellPage} from './pages'
|
|
10
|
+
|
|
11
|
+
const props = defineProps<{
|
|
12
|
+
locale: string
|
|
13
|
+
modelValue: ShellPage
|
|
14
|
+
pages: readonly ShellPage[]
|
|
15
|
+
description?: string
|
|
16
|
+
}>()
|
|
17
|
+
const emit = defineEmits<{'update:modelValue': [value: ShellPage]}>()
|
|
18
|
+
const copy = computed(() => shellCopy(props.locale))
|
|
19
|
+
const icons: Record<ShellPage, Component> = {status:Info,sample:NotebookPen,nas:FolderOpen,interactive:MousePointerClick,background:Timer,admin:ListChecks,identity:KeyRound,folders:Shield}
|
|
20
|
+
const groups = computed<AppSidebarGroup[]>(() => [{
|
|
21
|
+
items: props.pages.map(page => ({key:page,label:copy.value[page],icon:icons[page]})),
|
|
22
|
+
}])
|
|
23
|
+
const title = computed(() => copy.value[props.modelValue] ?? copy.value.status)
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<template>
|
|
27
|
+
<AppLayout class="app-shell" min-height="0">
|
|
28
|
+
<template #sidebar>
|
|
29
|
+
<AppSidebar :model-value="modelValue" :groups="groups" @update:model-value="emit('update:modelValue', $event as ShellPage)" />
|
|
30
|
+
</template>
|
|
31
|
+
<PageContent class="app-page">
|
|
32
|
+
<PageHeader :title="title" :description="description">
|
|
33
|
+
<template #actions><slot name="actions" /></template>
|
|
34
|
+
</PageHeader>
|
|
35
|
+
<div class="app-page-content"><slot /></div>
|
|
36
|
+
</PageContent>
|
|
37
|
+
</AppLayout>
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<style scoped>
|
|
41
|
+
/* The library clips AppLayout at window height; the page body scrolls while
|
|
42
|
+
the sidebar keeps its own height. Modeled on syno-reclaim's AppShell. */
|
|
43
|
+
.app-shell { height: 100%; min-width: 0; grid-template-rows: minmax(0, 1fr); }
|
|
44
|
+
.app-shell :deep(> div) { min-height: 0; }
|
|
45
|
+
.app-shell :deep(main) { display: flex; flex-direction: column; overflow: hidden; }
|
|
46
|
+
.app-page { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
|
|
47
|
+
.app-page-content { padding-bottom: var(--ui-space-6, 24px); }
|
|
48
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Status",
|
|
3
|
+
"sample": "Meine Beispieldaten",
|
|
4
|
+
"nas": "NAS-Ordnerzugriff",
|
|
5
|
+
"interactive": "Interaktive Aufträge",
|
|
6
|
+
"background": "Hintergrundaufträge",
|
|
7
|
+
"admin": "Auftragsverwaltung",
|
|
8
|
+
"identity": "Optionale App-Identität",
|
|
9
|
+
"folders": "Ordnerauswahl"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Status",
|
|
3
|
+
"sample": "My sample data",
|
|
4
|
+
"nas": "NAS folder access",
|
|
5
|
+
"interactive": "Interactive jobs",
|
|
6
|
+
"background": "Background jobs",
|
|
7
|
+
"admin": "Job management",
|
|
8
|
+
"identity": "Optional app identity",
|
|
9
|
+
"folders": "Folder selections"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Estado",
|
|
3
|
+
"sample": "Mis datos de ejemplo",
|
|
4
|
+
"nas": "Acceso a carpetas NAS",
|
|
5
|
+
"interactive": "Tareas interactivas",
|
|
6
|
+
"background": "Tareas en segundo plano",
|
|
7
|
+
"admin": "Gestión de tareas",
|
|
8
|
+
"identity": "Identidad de aplicación opcional",
|
|
9
|
+
"folders": "Selección de carpetas"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "État",
|
|
3
|
+
"sample": "Mes données d'exemple",
|
|
4
|
+
"nas": "Accès aux dossiers NAS",
|
|
5
|
+
"interactive": "Tâches interactives",
|
|
6
|
+
"background": "Tâches en arrière-plan",
|
|
7
|
+
"admin": "Gestion des tâches",
|
|
8
|
+
"identity": "Identité d'application facultative",
|
|
9
|
+
"folders": "Sélection de dossiers"
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "Stato",
|
|
3
|
+
"sample": "I miei dati di esempio",
|
|
4
|
+
"nas": "Accesso alle cartelle NAS",
|
|
5
|
+
"interactive": "Attività interattive",
|
|
6
|
+
"background": "Attività in background",
|
|
7
|
+
"admin": "Gestione attività",
|
|
8
|
+
"identity": "Identità app opzionale",
|
|
9
|
+
"folders": "Selezione cartelle"
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import en from './i18n/en.json'
|
|
2
|
+
import zhTW from './i18n/zh-TW.json'
|
|
3
|
+
import zhCN from './i18n/zh-CN.json'
|
|
4
|
+
import ja from './i18n/ja.json'
|
|
5
|
+
import ko from './i18n/ko.json'
|
|
6
|
+
import de from './i18n/de.json'
|
|
7
|
+
import fr from './i18n/fr.json'
|
|
8
|
+
import es from './i18n/es.json'
|
|
9
|
+
import it from './i18n/it.json'
|
|
10
|
+
|
|
11
|
+
export type ShellCopy = typeof en
|
|
12
|
+
export const shellCatalogs: Record<string, ShellCopy> = {en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
|
|
13
|
+
const aliases: Record<string,string> = {enu:'en',cht:'zh-TW',chs:'zh-CN',jpn:'ja',krn:'ko',ger:'de',fre:'fr',spn:'es',ita:'it'}
|
|
14
|
+
export function shellCopy(locale: string): ShellCopy {
|
|
15
|
+
const normalized = locale.replaceAll('_','-')
|
|
16
|
+
return shellCatalogs[aliases[normalized] ?? normalized] ?? shellCatalogs[normalized.split('-')[0]!] ?? en
|
|
17
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// The DSM-style shell shows one sidebar entry per feature that this build
|
|
2
|
+
// actually provides. The manifest is resolved at build time, so the entries
|
|
3
|
+
// here are driven by runtime feature flags rather than by the YAML itself.
|
|
4
|
+
export type ShellPage =
|
|
5
|
+
| 'status'
|
|
6
|
+
| 'sample'
|
|
7
|
+
| 'nas'
|
|
8
|
+
| 'interactive'
|
|
9
|
+
| 'background'
|
|
10
|
+
| 'admin'
|
|
11
|
+
| 'identity'
|
|
12
|
+
| 'folders'
|
|
13
|
+
|
|
14
|
+
export interface ShellFeatureFlags {
|
|
15
|
+
sample?: boolean
|
|
16
|
+
nas?: boolean
|
|
17
|
+
interactive?: boolean
|
|
18
|
+
background?: boolean
|
|
19
|
+
admin?: boolean
|
|
20
|
+
identity?: boolean
|
|
21
|
+
folders?: boolean
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** 'status' is the integration/account page every Vue build has. */
|
|
25
|
+
const ORDER: readonly ShellPage[] = ['status','sample','nas','interactive','background','admin','identity','folders']
|
|
26
|
+
|
|
27
|
+
export function shellPages(features: ShellFeatureFlags): ShellPage[] {
|
|
28
|
+
return ORDER.filter(page => page === 'status' || features[page] === true)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Keeps a selection that still exists; otherwise the first page wins. */
|
|
32
|
+
export function activePage(current: ShellPage | undefined, pages: readonly ShellPage[]): ShellPage {
|
|
33
|
+
return current !== undefined && pages.includes(current) ? current : (pages[0] ?? 'status')
|
|
34
|
+
}
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
.dsmapp-vue-root {height: 100%; min-height: 0; width: 100%; overflow: hidden;}
|
|
2
|
-
[data-ui-app] .integration-app {padding: var(--ui-
|
|
3
|
-
[data-ui-app] .integration-
|
|
4
|
-
[data-ui-app] .integration-heading h1 {font-size: 20px; font-weight: 600; margin: 0;}
|
|
5
|
-
[data-ui-app] .integration-heading p {color: var(--ui-text); margin: 4px 0 0;}
|
|
6
|
-
[data-ui-app] .integration-app section {margin-top: 24px;}
|
|
2
|
+
[data-ui-app] .integration-app {padding: 0 var(--ui-page-padding-x, 16px); color: var(--ui-text); font-family: var(--ui-font-sans); font-size: 13px; line-height: 1.5;}
|
|
3
|
+
[data-ui-app] .integration-app section {margin-top: var(--ui-space-4, 16px);}
|
|
7
4
|
[data-ui-app] .integration-status h2 {font-size: 15px; font-weight: 600; margin: 0;}
|
|
8
5
|
[data-ui-app] .integration-status p {margin: 6px 0;}
|
|
9
6
|
[data-ui-app] .integration-status dl {display: grid; grid-template-columns: max-content 1fr; gap: 4px 16px; margin: 12px 0;}
|
|
10
7
|
[data-ui-app] .integration-status dt, [data-ui-app] .integration-help {color: var(--ui-text);}
|
|
11
8
|
[data-ui-app] .integration-status dd {margin: 0;}
|
|
12
9
|
[data-ui-app] .integration-actions {display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px;}
|
|
13
|
-
[data-ui-app] .integration-field {display: grid; gap: 6px; margin: 12px 0;}
|
|
14
10
|
[data-ui-app] .integration-notice {color: var(--ui-text);}
|
|
11
|
+
[data-ui-app] .nas-summary {display: grid; grid-template-columns: minmax(6ch, max-content) minmax(0, 1fr); gap: var(--ui-space-2, 8px) var(--ui-space-4, 16px);}
|
|
12
|
+
[data-ui-app] .nas-summary dd {margin: 0; overflow-wrap: anywhere;}
|
|
13
|
+
[data-ui-app] .nas-breadcrumb {display: flex; flex-wrap: wrap; gap: var(--ui-space-2, 8px); margin-block: var(--ui-space-3, 12px);}
|
|
14
|
+
[data-ui-app] .nas-browser {display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ui-space-3, 12px);}
|
|
15
|
+
[data-ui-app] .nas-tree {display: none;}
|
|
16
|
+
[data-ui-app] .nas-folder-list {min-width: 0; overflow: auto;}
|
|
17
|
+
[data-ui-app] .nas-folder-name {white-space: normal; overflow-wrap: anywhere; text-align: start;}
|
|
18
|
+
[data-ui-app] .nas-folder-action {white-space: normal; max-width: 100%;}
|
|
19
|
+
[data-ui-app] .nas-picker {max-height: 55vh; overflow: auto; overflow-wrap: anywhere;}
|
|
20
|
+
[data-ui-app] .nas-grants {list-style: none; padding: 0;}
|
|
21
|
+
[data-ui-app] .nas-grants > li {padding-block: var(--ui-space-4, 16px); border-bottom: 1px solid var(--ui-border);}
|
|
22
|
+
[data-ui-app] .nas-grant-heading {display: flex; align-items: start; justify-content: space-between; gap: var(--ui-space-3, 12px);}
|
|
23
|
+
[data-ui-app] .nas-grant-heading strong {overflow-wrap: anywhere;}
|
|
24
|
+
@media (min-width: 960px) {
|
|
25
|
+
[data-ui-app] .nas-browser {grid-template-columns: minmax(8ch, 1fr) minmax(0, 3fr);}
|
|
26
|
+
[data-ui-app] .nas-tree {display: block; overflow: auto;}
|
|
27
|
+
}
|