@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,245 @@
|
|
|
1
|
+
package helper
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"io"
|
|
6
|
+
"net"
|
|
7
|
+
"os"
|
|
8
|
+
"time"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
type linuxWriteOperation struct {
|
|
12
|
+
*linuxOperation
|
|
13
|
+
writeWork writeWork
|
|
14
|
+
receipt MutationReceipt
|
|
15
|
+
resultCode Code
|
|
16
|
+
ready bool
|
|
17
|
+
resultReleased bool
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
func startLinuxWriteOperation(c Client, binary string, a NativeActor, b operationBinding, pin *pinnedReadOnlyRoot, w writeWork, input net.Conn) (operationProcess, error) {
|
|
21
|
+
if w.validate() != "" || pin == nil || pin.path != w.RootPath {
|
|
22
|
+
return nil, ErrDenied
|
|
23
|
+
}
|
|
24
|
+
w.Segments = append([]string{}, w.Segments...)
|
|
25
|
+
return startLinuxOperationWork(c, binary, a, b, input, pin, nil, &w)
|
|
26
|
+
}
|
|
27
|
+
func (p *linuxWriteOperation) idle() (bool, error) {
|
|
28
|
+
idle, e := p.linuxOperation.idle()
|
|
29
|
+
if p.result != nil && p.result.Mutation != nil {
|
|
30
|
+
p.receipt = *p.result.Mutation
|
|
31
|
+
p.resultCode = p.result.Code
|
|
32
|
+
p.ready = true
|
|
33
|
+
p.result = nil
|
|
34
|
+
}
|
|
35
|
+
return idle, e
|
|
36
|
+
}
|
|
37
|
+
func (p *linuxWriteOperation) mutationResult() (MutationReceipt, Code, bool) {
|
|
38
|
+
idle, e := p.idle()
|
|
39
|
+
if e != nil {
|
|
40
|
+
return p.receipt, ErrCleanupRequired, false
|
|
41
|
+
}
|
|
42
|
+
return p.receipt, p.resultCode, p.ready && idle
|
|
43
|
+
}
|
|
44
|
+
func (p *linuxWriteOperation) chunk(n uint32) error { return p.chunkWithActor(n, NativeActor{}) }
|
|
45
|
+
func (p *linuxWriteOperation) chunkWithActor(n uint32, a NativeActor) error {
|
|
46
|
+
if !a.valid || !nativeFresh(a.account.CheckedAt, time.Now()) {
|
|
47
|
+
return ErrStale
|
|
48
|
+
}
|
|
49
|
+
return p.beginWrite(a, n, false)
|
|
50
|
+
}
|
|
51
|
+
func (p *linuxWriteOperation) commitWithActor(a NativeActor) error { return p.beginWrite(a, 0, true) }
|
|
52
|
+
func (p *linuxWriteOperation) beginWrite(a NativeActor, n uint32, commit bool) error {
|
|
53
|
+
idle, e := p.idle()
|
|
54
|
+
if e != nil {
|
|
55
|
+
return e
|
|
56
|
+
}
|
|
57
|
+
if !idle || p.closed || !p.ready || p.resultCode != "" || p.finishSent || !a.valid || !nativeFresh(a.account.CheckedAt, time.Now()) || !commit && (n == 0 || n > MaxChunkBytes) {
|
|
58
|
+
return errTrust
|
|
59
|
+
}
|
|
60
|
+
p.proofDeadline = a.account.CheckedAt.Add(NativeProofFreshness)
|
|
61
|
+
p.sequence++
|
|
62
|
+
lease := operationLease{Token: p.token, Sequence: p.sequence, Bytes: n, SubjectRef: a.Principal().SubjectRef, SessionRef: a.SessionRef(), ProofDeadline: p.proofDeadline.UnixNano(), Commit: commit}
|
|
63
|
+
info, e := openOperationFDInfo(p.process.Pid)
|
|
64
|
+
if e != nil {
|
|
65
|
+
return e
|
|
66
|
+
}
|
|
67
|
+
done := make(chan operationRelayOutcome, 1)
|
|
68
|
+
p.pending = done
|
|
69
|
+
p.ready = false
|
|
70
|
+
control, data, input := p.control, p.data, p.output
|
|
71
|
+
boot, w := p.bootstrap, p.writeWork
|
|
72
|
+
sequence, mounts, deadline := p.sequence, p.mountSequence, p.proofDeadline
|
|
73
|
+
previous := p.receipt
|
|
74
|
+
results := make(chan readOnlyPacketOutcome, 1)
|
|
75
|
+
p.resultPending = results
|
|
76
|
+
// One outstanding lease. Read only the admitted bytes from the fixed binary
|
|
77
|
+
// input, then hand them to the actor. No bytes or file descriptors enter JSON.
|
|
78
|
+
go func() {
|
|
79
|
+
var e error
|
|
80
|
+
if !commit {
|
|
81
|
+
e = input.SetReadDeadline(deadline)
|
|
82
|
+
buffer := make([]byte, n)
|
|
83
|
+
if e == nil {
|
|
84
|
+
_, e = io.ReadFull(input, buffer)
|
|
85
|
+
}
|
|
86
|
+
if e == nil {
|
|
87
|
+
e = writeOperationPacket(control, lease)
|
|
88
|
+
}
|
|
89
|
+
if e == nil {
|
|
90
|
+
var written int
|
|
91
|
+
written, e = data.Write(buffer)
|
|
92
|
+
if e == nil && written != len(buffer) {
|
|
93
|
+
e = io.ErrShortWrite
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
e = writeOperationPacket(control, lease)
|
|
98
|
+
}
|
|
99
|
+
outcome := readOnlyPacketOutcome{}
|
|
100
|
+
if e == nil {
|
|
101
|
+
outcome = receiveWriteProof(control, info, boot, w, p.process.Pid, mounts, sequence, time.Until(deadline))
|
|
102
|
+
e = outcome.err
|
|
103
|
+
if e == nil {
|
|
104
|
+
m := outcome.result.Mutation
|
|
105
|
+
upper := previous.BytesWritten + uint64(n)
|
|
106
|
+
if commit {
|
|
107
|
+
upper = previous.BytesWritten
|
|
108
|
+
}
|
|
109
|
+
if m.BytesWritten < previous.BytesWritten || m.BytesWritten > upper || outcome.result.Code == "" && m.BytesWritten != upper || !commit && (m.Published || m.Committed) {
|
|
110
|
+
e = errTrust
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if closeErr := info.Close(); e == nil {
|
|
115
|
+
e = closeErr
|
|
116
|
+
}
|
|
117
|
+
outcome.err = e
|
|
118
|
+
results <- outcome
|
|
119
|
+
done <- operationRelayOutcome{err: e, mountSequence: outcome.mountSequence}
|
|
120
|
+
}()
|
|
121
|
+
if commit {
|
|
122
|
+
p.finishSent = true
|
|
123
|
+
}
|
|
124
|
+
return nil
|
|
125
|
+
}
|
|
126
|
+
func receiveWriteProof(control *net.UnixConn, info *os.File, boot operationBootstrap, w writeWork, pid int, mounts, sequence uint64, timeout time.Duration) readOnlyPacketOutcome {
|
|
127
|
+
deadline := time.Now().Add(timeout)
|
|
128
|
+
for {
|
|
129
|
+
var packet readOnlyPacket
|
|
130
|
+
cred, e := readOperationPacketBound(control, &packet, MaxControlBytes, time.Until(deadline))
|
|
131
|
+
if e != nil {
|
|
132
|
+
return readOnlyPacketOutcome{err: e}
|
|
133
|
+
}
|
|
134
|
+
if cred == nil || int(cred.Pid) != pid || cred.Uid != boot.UID || cred.Gid != boot.GID || packet.Binding != boot.Binding || packet.Token != boot.Token {
|
|
135
|
+
return readOnlyPacketOutcome{err: errTrust}
|
|
136
|
+
}
|
|
137
|
+
if packet.Result != nil {
|
|
138
|
+
r := packet.Result
|
|
139
|
+
m := r.Mutation
|
|
140
|
+
if packet.MountFD != nil || packet.MountSequence != 0 || packet.ChunkSequence != sequence || m == nil || m.EffectsUnknown || m.BytesWritten > w.MaxBytes || m.Committed && !m.Published || m.Published && !m.Created || r.Bytes != 0 || r.Entry != nil || r.List != nil || r.Code != "" && !r.Code.Valid() {
|
|
141
|
+
return readOnlyPacketOutcome{err: errTrust}
|
|
142
|
+
}
|
|
143
|
+
return readOnlyPacketOutcome{result: r, mountSequence: mounts}
|
|
144
|
+
}
|
|
145
|
+
if packet.MountFD == nil || packet.ChunkSequence != 0 || packet.MountSequence != mounts+1 || mounts >= maxReadOnlyMountQueries {
|
|
146
|
+
return readOnlyPacketOutcome{err: errTrust}
|
|
147
|
+
}
|
|
148
|
+
mounts++
|
|
149
|
+
id, c := operationFDInfoMount(info, *packet.MountFD)
|
|
150
|
+
if e := writeOperationPacket(control, readOnlyMountReply{Token: boot.Token, Sequence: mounts, Mount: id, Code: c}); e != nil {
|
|
151
|
+
return readOnlyPacketOutcome{err: e}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
func operationWriteChild(ctx context.Context, control *net.UnixConn, boot operationBootstrap) error {
|
|
156
|
+
w := *boot.Write
|
|
157
|
+
witness := os.NewFile(6, "write-root-witness")
|
|
158
|
+
if witness == nil {
|
|
159
|
+
return errTrust
|
|
160
|
+
}
|
|
161
|
+
defer witness.Close()
|
|
162
|
+
input := os.NewFile(5, "write-input")
|
|
163
|
+
if input == nil {
|
|
164
|
+
return errTrust
|
|
165
|
+
}
|
|
166
|
+
defer input.Close()
|
|
167
|
+
operationMountIDFallback = operationMountIDProxy(control, boot)
|
|
168
|
+
pin := &pinnedReadOnlyRoot{path: w.RootPath, file: witness}
|
|
169
|
+
x, c := openActorWriteTransfer(ctx, pin, w, operationReadOnlyACL)
|
|
170
|
+
receipt := MutationReceipt{}
|
|
171
|
+
if x != nil {
|
|
172
|
+
defer x.Close()
|
|
173
|
+
receipt = x.Receipt()
|
|
174
|
+
}
|
|
175
|
+
send := func(sequence uint64, r MutationReceipt, c Code) error {
|
|
176
|
+
return writeOperationPacketBound(control, readOnlyPacket{Binding: boot.Binding, Token: boot.Token, ChunkSequence: sequence, Result: &readOnlyResult{Code: c, Mutation: &r}}, MaxControlBytes)
|
|
177
|
+
}
|
|
178
|
+
if e := send(0, receipt, c); e != nil {
|
|
179
|
+
return e
|
|
180
|
+
}
|
|
181
|
+
if c != "" {
|
|
182
|
+
return awaitReadOnlyFinish(control, boot.Token)
|
|
183
|
+
}
|
|
184
|
+
var sequence, total uint64
|
|
185
|
+
for {
|
|
186
|
+
var lease operationLease
|
|
187
|
+
timeout := BoundedTimeout
|
|
188
|
+
if w.Staged {
|
|
189
|
+
timeout = StreamIdleTimeout
|
|
190
|
+
}
|
|
191
|
+
if deadline, ok := ctx.Deadline(); ok && time.Until(deadline) < timeout {
|
|
192
|
+
timeout = time.Until(deadline)
|
|
193
|
+
}
|
|
194
|
+
if _, e := readOperationPacketBound(control, &lease, MaxHealthBytes, timeout); e != nil {
|
|
195
|
+
return e
|
|
196
|
+
}
|
|
197
|
+
if lease.Token != boot.Token || lease.Sequence != sequence+1 || lease.SubjectRef != boot.SubjectRef || lease.SessionRef != boot.SessionRef || lease.ProofDeadline == 0 {
|
|
198
|
+
return errTrust
|
|
199
|
+
}
|
|
200
|
+
proofDeadline := time.Unix(0, lease.ProofDeadline)
|
|
201
|
+
if !time.Now().Before(proofDeadline) || time.Until(proofDeadline) > NativeProofFreshness {
|
|
202
|
+
return ErrStale
|
|
203
|
+
}
|
|
204
|
+
proofCtx, cancel := context.WithDeadline(ctx, proofDeadline)
|
|
205
|
+
sequence++
|
|
206
|
+
var r MutationReceipt
|
|
207
|
+
if lease.Commit {
|
|
208
|
+
if lease.Bytes != 0 {
|
|
209
|
+
cancel()
|
|
210
|
+
return errTrust
|
|
211
|
+
}
|
|
212
|
+
r, c = x.Commit(proofCtx)
|
|
213
|
+
} else {
|
|
214
|
+
if lease.Bytes == 0 || lease.Bytes > MaxChunkBytes || total+uint64(lease.Bytes) > w.MaxBytes {
|
|
215
|
+
cancel()
|
|
216
|
+
return errTrust
|
|
217
|
+
}
|
|
218
|
+
b := make([]byte, lease.Bytes)
|
|
219
|
+
input.SetReadDeadline(proofDeadline)
|
|
220
|
+
if _, e := io.ReadFull(input, b); e != nil {
|
|
221
|
+
cancel()
|
|
222
|
+
return e
|
|
223
|
+
}
|
|
224
|
+
total += uint64(lease.Bytes)
|
|
225
|
+
r, c = x.WriteChunk(proofCtx, b)
|
|
226
|
+
}
|
|
227
|
+
cancel()
|
|
228
|
+
if e := send(sequence, r, c); e != nil {
|
|
229
|
+
return e
|
|
230
|
+
}
|
|
231
|
+
// Retain lifetime/FDs until parent acknowledges or drains; receipt available
|
|
232
|
+
// even for partial effects. No named file is automatically cleaned up.
|
|
233
|
+
if lease.Commit || c != "" {
|
|
234
|
+
return awaitReadOnlyFinish(control, boot.Token)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
func (p *linuxWriteOperation) releaseWriteResult() error {
|
|
240
|
+
if p.resultReleased {
|
|
241
|
+
return nil
|
|
242
|
+
}
|
|
243
|
+
p.resultReleased = true
|
|
244
|
+
return writeOperationPacket(p.control, operationReadOnlyFinish{Token: p.token})
|
|
245
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
package helper
|
|
2
|
+
|
|
3
|
+
import "testing"
|
|
4
|
+
|
|
5
|
+
func TestWriteGatesDefaultDenyAndPublishIsIndependent(t *testing.T) {
|
|
6
|
+
for _, tc := range []struct {
|
|
7
|
+
gates writeGates
|
|
8
|
+
action Action
|
|
9
|
+
allowed bool
|
|
10
|
+
}{
|
|
11
|
+
{writeGates{}, ActionCreate, false}, {writeGates{}, ActionWriteStream, false},
|
|
12
|
+
{writeGates{Create: true}, ActionCreate, true}, {writeGates{Create: true}, ActionWriteStream, false},
|
|
13
|
+
{writeGates{Stream: true}, ActionWriteStream, false}, {writeGates{Create: true, Stream: true}, ActionWriteStream, false},
|
|
14
|
+
{writeGates{Create: true, Stream: true, Publish: true}, ActionWriteStream, true},
|
|
15
|
+
{writeGates{Publish: true}, ActionPublish, false}, {writeGates{Create: true, Publish: true}, ActionPublish, true},
|
|
16
|
+
} {
|
|
17
|
+
if tc.gates.allows(tc.action) != tc.allowed {
|
|
18
|
+
t.Fatal(tc)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
func TestWriteWorkRejectsPathsLimitsAndUngatedStage(t *testing.T) {
|
|
23
|
+
valid := writeWork{RootPath: "/trusted/root", Action: ActionCreate, Segments: []string{"file"}, MaxBytes: MaxBoundedBytes}
|
|
24
|
+
if c := valid.validate(); c != "" {
|
|
25
|
+
t.Fatal(c)
|
|
26
|
+
}
|
|
27
|
+
for _, kind := range []string{"root", "escape", "zero", "limit", "action", "stage"} {
|
|
28
|
+
w := valid
|
|
29
|
+
switch kind {
|
|
30
|
+
case "root":
|
|
31
|
+
w.RootPath = "/"
|
|
32
|
+
case "escape":
|
|
33
|
+
w.Segments = []string{"..", "file"}
|
|
34
|
+
case "zero":
|
|
35
|
+
w.MaxBytes = 0
|
|
36
|
+
case "limit":
|
|
37
|
+
w.MaxBytes++
|
|
38
|
+
case "action":
|
|
39
|
+
w.Action = ActionRead
|
|
40
|
+
case "stage":
|
|
41
|
+
w.Staged = true
|
|
42
|
+
}
|
|
43
|
+
if c := w.validate(); c == "" {
|
|
44
|
+
t.Fatal("accepted", kind)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func TestWriteProofPacketDoesNotBecomeReadMetadata(t *testing.T) {
|
|
50
|
+
if (readOnlyResult{Mutation: &MutationReceipt{Created: true}}).validFor(readOnlyWork{Action: ActionRead, MaxBytes: 10}) {
|
|
51
|
+
t.Fatal("write receipt accepted as read metadata")
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -11,7 +11,7 @@ build: 1
|
|
|
11
11
|
displayname: __DISPLAY_NAME__
|
|
12
12
|
description: A native DSM package with a Go backend and a DSM window UI.
|
|
13
13
|
maintainer: Your Name
|
|
14
|
-
os_min_ver: "7.
|
|
14
|
+
os_min_ver: "7.1-42661"
|
|
15
15
|
|
|
16
16
|
# One SPK per architecture. Supported: x86_64, aarch64.
|
|
17
17
|
arches: [x86_64, aarch64]
|
|
@@ -7,7 +7,14 @@
|
|
|
7
7
|
// language ({name} placeholders, key.one/.other
|
|
8
8
|
// plurals with { count }), English as fallback
|
|
9
9
|
// ctx.locale -> "en", "zh-TW", … (use it for Intl formatting)
|
|
10
|
-
// ctx.reopen(fn) -> fn runs
|
|
10
|
+
// ctx.reopen(fn) -> idempotent unsubscribe; fn runs on re-show
|
|
11
|
+
// ctx.host.platform() -> read-only host/launch mode/language/version snapshot
|
|
12
|
+
// ctx.host.setTitle(text) -> encoded DSM title or standalone document.title;
|
|
13
|
+
// inspect the returned status, not host authority
|
|
14
|
+
// ctx.host.subscribe(event, fn) -> status + dispose for window-resize;
|
|
15
|
+
// host-theme/language-change unsupported
|
|
16
|
+
// ctx.host.openFileManager(path) / revealFile(path) -> File Station virtual path
|
|
17
|
+
// request only; preview/details/settings return unsupported, never a grant
|
|
11
18
|
// Replace everything below with your own UI (plain JS, or a bundle you build
|
|
12
19
|
// with Vite/Vue into this folder -- see README.md).
|
|
13
20
|
(function () {
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Background jobs
|
|
2
|
+
|
|
3
|
+
This package opted in with `synopkgland init --background`. `dsm-package.yaml` has
|
|
4
|
+
`background: {worker: sha256-v1}`. The build adds a package-user worker that DSM
|
|
5
|
+
runs as a systemd user unit. Nothing runs as root, and the CGI never starts a
|
|
6
|
+
process in the background.
|
|
7
|
+
|
|
8
|
+
## What runs
|
|
9
|
+
|
|
10
|
+
- `conf/resource` is `{"systemd-user-unit":{}}` and `conf/systemd/pkguser-<Package>-background.service`
|
|
11
|
+
starts `target/background/worker`. `start-stop-status` only calls `synosystemctl`.
|
|
12
|
+
- The worker is fixed: `sha256-v1` reads one imported file and writes its SHA-256.
|
|
13
|
+
Replace it by editing `backend/internal/background/runner.go` and bump `WorkerRevision`
|
|
14
|
+
(queued jobs of an older revision become `interrupted`, never replayed).
|
|
15
|
+
- The spool is `/var/packages/<Package>/var/background` (dirs `0700`, files `0600`).
|
|
16
|
+
Limits: 1 job at a time, 16 queued, 512 KiB per file, 16 MiB total, 60 s per job.
|
|
17
|
+
- Job states: `queued → running → succeeded | failed | canceled | interrupted`.
|
|
18
|
+
After a crash or forced stop a running job becomes `interrupted` and is not run again.
|
|
19
|
+
|
|
20
|
+
## API and ownership
|
|
21
|
+
|
|
22
|
+
`bg.status`, `bg.mode.set {enabled}`, `bg.users.set {allowOrdinaryUsers}`, `bg.jobs.purge {owner: {user, uid}}`, `bg.browse {folder?, offset?}`, `bg.jobs.submit {key, folder, relative}`,
|
|
23
|
+
`bg.jobs.list`, `bg.jobs.get {id}`, `bg.jobs.cancel {id}`, `bg.jobs.result {id}`.
|
|
24
|
+
|
|
25
|
+
The panel's **Choose a file** button opens the shared File Station picker, which lists shares and folders
|
|
26
|
+
with `bg.browse`: read-only metadata from the signed-in caller's own DSM session. A pick stores no
|
|
27
|
+
grant and adds no permission; `submit` still re-reads the file through the same session.
|
|
28
|
+
|
|
29
|
+
`submit` copies `relative` below the shared `folder` through the caller's File Station session, so the signed-in
|
|
30
|
+
administrator's own DSM permissions decide what can be imported. The job ID is returned
|
|
31
|
+
only after the journal is durable, and `key` makes a retry return the same job.
|
|
32
|
+
No cookie, SynoToken or password is stored. Closing the window or signing out does not
|
|
33
|
+
cancel a job; sign in as the same owner again to read, download or cancel it.
|
|
34
|
+
|
|
35
|
+
## Access
|
|
36
|
+
|
|
37
|
+
Background mode is off until an administrator turns it on. Ordinary-user access
|
|
38
|
+
has its own administrator switch.
|
|
39
|
+
|
|
40
|
+
## Ordinary users (U1)
|
|
41
|
+
|
|
42
|
+
Background mode and `allowOrdinaryUsers` are independent administrator switches,
|
|
43
|
+
initially off. With ordinary users allowed, signed-in users can browse through
|
|
44
|
+
**their own live File Station session**, import a copy, and list/get/cancel/download
|
|
45
|
+
only their own jobs. `bg.mode.set`, `bg.users.set` and `bg.jobs.purge` remain admin-only.
|
|
46
|
+
Administrators can see and cancel all jobs. Turning ordinary access off returns
|
|
47
|
+
`unsupported` on owner routes; it does not delete or cancel previously admitted jobs.
|
|
48
|
+
Turning background mode off cancels queued work and drains running work as before.
|
|
49
|
+
|
|
50
|
+
Owners are matched by both authenticated username and freshly resolved numeric UID.
|
|
51
|
+
An unknown UID refuses owner access and submission with `identity_unavailable`.
|
|
52
|
+
Legacy jobs with an unknown UID remain admin-only. Recreated same-name accounts
|
|
53
|
+
with different UIDs cannot access old jobs. This does not detect reuse of the same
|
|
54
|
+
username **and** UID. Account disablement is enforced by DSM session authentication;
|
|
55
|
+
this feature does not provide a separate account-lifecycle directory service.
|
|
56
|
+
|
|
57
|
+
Idempotency keys are scoped to that owner. Cross-owner and missing IDs both return
|
|
58
|
+
`not_found`. Queue/running counts for ordinary users include only their own jobs.
|
|
59
|
+
Per-owner limits (including administrators): 2 queued/running jobs, 1 MiB of pending
|
|
60
|
+
and retained imported inputs, schedule copies, plus 512 bytes reserved for each pending or retained result. The 16-job/16-MiB
|
|
61
|
+
global bounds and 64 finished-job history remain. Two full 512-KiB inputs exceed the
|
|
62
|
+
owner byte limit because of their result reservations. `owner-queue-full` and
|
|
63
|
+
`owner-quota-exceeded` are distinct from global `queue-full`/`quota-exceeded`.
|
|
64
|
+
|
|
65
|
+
An administrator may explicitly clear an exact owner `{user, uid}` (including
|
|
66
|
+
unknown legacy UIDs). This removes saved results and queued inputs, requests cancel
|
|
67
|
+
for running jobs, and hides those jobs until Finish/Recover drains them. A bounded
|
|
68
|
+
64-entry audit stores actor, exact owner, time and counts in the durable journal;
|
|
69
|
+
it contains no credentials or input contents. Uninstall retains data by default;
|
|
70
|
+
the existing explicit delete-data wizard remains available.
|
|
71
|
+
|
|
72
|
+
The package copy/result is not recalled when source-file permissions change.
|
|
73
|
+
Offline access under a user's ACL, AD/LDAP UID stability and DSM reboot recovery
|
|
74
|
+
are not claimed. No user credentials are stored.
|
|
75
|
+
|
|
76
|
+
## Private-copy schedules (S1-a)
|
|
77
|
+
|
|
78
|
+
Import a file and wait for its success, then choose **Schedule this copy** and
|
|
79
|
+
explicitly consent. The package pins a separate copy and digest, without accessing
|
|
80
|
+
File Station offline. `bg.schedules.create {key, jobId, intervalSeconds, consent:true}`
|
|
81
|
+
accepts only 3600, 86400 or 604800 seconds; up to 8 schedules per package.
|
|
82
|
+
`key` is scoped to username/UID and retries the exact definition.
|
|
83
|
+
`bg.schedules.list`, `bg.schedules.disable {id}`, `bg.schedules.delete {id}` are
|
|
84
|
+
owner-scoped; administrators see and can disable/delete all. Only an administrator
|
|
85
|
+
can call `bg.schedules.enable {id, consent:true}` after reviewing the current revision.
|
|
86
|
+
An administrator cannot create a schedule from another owner's imported copy.
|
|
87
|
+
|
|
88
|
+
Successful manual inputs are retained with the bounded 64-job history. Old U1
|
|
89
|
+
results whose input was deleted cannot be scheduled: import again. Copies and
|
|
90
|
+
schedule pins count toward the 1-MiB owner/16-MiB global storage limits; a full
|
|
91
|
+
512-KiB source plus its pinned copy exceeds the owner limit, so use smaller inputs.
|
|
92
|
+
A scheduled run also needs input/result quota and shares the 2-pending-owner limit.
|
|
93
|
+
At least 4 global queue positions remain available for manual jobs.
|
|
94
|
+
|
|
95
|
+
The package-user worker ticks its journal; no root task, crontab or global service
|
|
96
|
+
is created. `nextAt` and the run's `scheduleId`/`scheduledAt` commit atomically.
|
|
97
|
+
Completed jobs never replay. Each start records overdue ticks as `missed` and
|
|
98
|
+
advances to the next future period. Delays over 5 seconds, a full quota/queue, and
|
|
99
|
+
multi-period gaps are also missed; no catch-up. The latest missed time/reason and
|
|
100
|
+
aggregate missed count are retained, not an unbounded event log. This is neither
|
|
101
|
+
an exact-time nor exactly-once guarantee.
|
|
102
|
+
|
|
103
|
+
Disabling/deleting cancels queued runs and requests running cancellation/drain;
|
|
104
|
+
finished results remain. Background mode off also disables every schedule, and
|
|
105
|
+
turning it on does not revive them. Blocking ordinary access hides owner routes,
|
|
106
|
+
but admitted private-copy schedules continue, like admitted U1 jobs. Clearing an
|
|
107
|
+
owner also deletes that owner's schedules/pins and drains running jobs. A worker
|
|
108
|
+
revision mismatch disables the schedule (`worker-changed`) and requires explicit
|
|
109
|
+
administrator re-enable; a package build +1 with the same worker revision preserves
|
|
110
|
+
compatible definitions/results. Changed or missing pinned bytes disable the schedule.
|
|
111
|
+
No S1-b share authorization or offline personal ACL reading is provided.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
package app
|
|
2
|
+
|
|
3
|
+
import "dsmapp/internal/api"
|
|
4
|
+
|
|
5
|
+
// backgroundRoutes serves the owner-scoped background job API. Jobs run
|
|
6
|
+
// in the package-user worker unit (conf/systemd), never as root.
|
|
7
|
+
func (cfg Config) backgroundRoutes() []api.Route { return BackgroundRoutes(cfg.DataDir) }
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package app
|
|
2
|
+
|
|
3
|
+
func init() {
|
|
4
|
+
// The generic route tests need valid params for every background route.
|
|
5
|
+
// Background mode is off in a fresh data dir, so submit is refused before
|
|
6
|
+
// any file is read and the id routes find nothing.
|
|
7
|
+
const id = `{"id":"missing"}`
|
|
8
|
+
sampleParams["bg.users.set"] = `{"allowOrdinaryUsers":true}`
|
|
9
|
+
sampleParams["bg.jobs.purge"] = `{"owner":{"user":"missing","uid":"9999"}}`
|
|
10
|
+
sampleParams["bg.schedules.list"] = `{}`
|
|
11
|
+
sampleParams["bg.schedules.create"] = `{"key":"schedule","jobId":"missing","intervalSeconds":3600,"consent":true}`
|
|
12
|
+
sampleParams["bg.schedules.disable"] = id
|
|
13
|
+
sampleParams["bg.schedules.delete"] = id
|
|
14
|
+
sampleParams["bg.schedules.enable"] = `{"id":"missing","consent":true}`
|
|
15
|
+
sampleOutcome["bg.schedules.create"] = "disabled"
|
|
16
|
+
sampleOutcome["bg.schedules.disable"] = "not_found"
|
|
17
|
+
sampleOutcome["bg.schedules.delete"] = "not_found"
|
|
18
|
+
sampleOutcome["bg.schedules.enable"] = "not_found"
|
|
19
|
+
sampleParams["bg.status"] = `{}`
|
|
20
|
+
sampleParams["bg.mode.set"] = `{"enabled":true}`
|
|
21
|
+
sampleParams["bg.browse"] = `{}`
|
|
22
|
+
sampleParams["bg.jobs.submit"] = `{"key":"k1","folder":"/share","relative":"a.bin"}`
|
|
23
|
+
sampleParams["bg.jobs.list"] = `{}`
|
|
24
|
+
sampleParams["bg.jobs.get"] = id
|
|
25
|
+
sampleParams["bg.jobs.cancel"] = id
|
|
26
|
+
sampleParams["bg.jobs.result"] = id
|
|
27
|
+
sampleOutcome["bg.browse"] = "session_required"
|
|
28
|
+
sampleOutcome["bg.jobs.submit"] = "disabled"
|
|
29
|
+
sampleOutcome["bg.jobs.get"] = "not_found"
|
|
30
|
+
sampleOutcome["bg.jobs.cancel"] = "not_found"
|
|
31
|
+
sampleOutcome["bg.jobs.result"] = "not_found"
|
|
32
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {computed,onBeforeUnmount,onMounted,provide,ref} from 'vue'
|
|
3
|
+
import {Button,Callout,Checkbox,Form,FormActions,FormItem,Link,Select,SettingsSection} from '@synopackageland/ui'
|
|
4
|
+
import type {Context} from '../context'
|
|
5
|
+
import M2PathPicker from '../nas/M2PathPicker.vue'
|
|
6
|
+
import {M2ProviderKey,type M2JobSource} from '../nas/m2-contract'
|
|
7
|
+
import {backgroundCopy,backgroundErrorCopy} from './i18n'
|
|
8
|
+
import {createBackgroundPickerProvider} from './picker-provider'
|
|
9
|
+
interface Status{owner?:Owner;enabled:boolean;admin:boolean;allowOrdinaryUsers:boolean;revision:number;worker:{username:string;alive:boolean}|null;limits:{maxInputBytes:number;maxQueued:number;maxOwnerPending:number;maxOwnerBytes:number;jobTimeoutSeconds:number}}
|
|
10
|
+
interface Owner{user:string;uid:string}
|
|
11
|
+
interface Job{copyRetained?:boolean;scheduleId?:string;submitter:Owner;id:string;name:string;state:'queued'|'running'|'succeeded'|'failed'|'canceled'|'interrupted'}
|
|
12
|
+
interface Schedule{id:string;name:string;owner:Owner;enabled:boolean;nextAt:string;intervalSeconds:number;workerRevision:number;missed:number;reason?:string}
|
|
13
|
+
const props=defineProps<{ctx:Pick<Context,'call'|'locale'>}>()
|
|
14
|
+
const copy=computed(()=>backgroundCopy(props.ctx.locale))
|
|
15
|
+
const fill=(text:string,values:Record<string,string|number>)=>text.replace(/\{(\w+)\}/g,(_,k)=>String(values[k]??''))
|
|
16
|
+
const status=ref<Status>(),jobs=ref<Job[]>([]),error=ref<unknown>(),unsupported=ref(false),busy=ref(false)
|
|
17
|
+
const schedules=ref<Schedule[]>([]),scheduleSource=ref<Job>(),scheduleConsent=ref(false),scheduleInterval=ref('3600'),scheduleDelete=ref<Schedule>(),scheduleEnable=ref<Schedule>()
|
|
18
|
+
const purgeOwner=ref<Owner>(),refreshing=ref(false)
|
|
19
|
+
const picking=ref(false),picked=ref<{folder:string;relative:string}>(),download=ref(''),downloadName=ref('')
|
|
20
|
+
const picker=createBackgroundPickerProvider(props.ctx);provide(M2ProviderKey,picker)
|
|
21
|
+
let timer:ReturnType<typeof setInterval>|undefined,disposed=false
|
|
22
|
+
const settled=(j:Job)=>!['queued','running'].includes(j.state)
|
|
23
|
+
async function call<T>(method:string,params?:Record<string,unknown>):Promise<T|undefined>{
|
|
24
|
+
try{return await props.ctx.call<T>(method,params)}
|
|
25
|
+
catch(e){
|
|
26
|
+
if(disposed)return undefined
|
|
27
|
+
if((e as {code?:string})?.code==='unsupported'){unsupported.value=true;jobs.value=[];schedules.value=[];scheduleSource.value=undefined;scheduleDelete.value=undefined;scheduleEnable.value=undefined;status.value=undefined;purgeOwner.value=undefined;picked.value=undefined;if(download.value)URL.revokeObjectURL(download.value);download.value=''}
|
|
28
|
+
else if(!disposed)error.value=e
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function refresh(){
|
|
33
|
+
if(disposed||refreshing.value)return
|
|
34
|
+
refreshing.value=true
|
|
35
|
+
try{
|
|
36
|
+
const s=await call<Status>('bg.status')
|
|
37
|
+
if(!s||disposed)return
|
|
38
|
+
if(!s.limits||typeof s.enabled!=='boolean'||typeof s.admin!=='boolean'){error.value={code:'unavailable'};return}
|
|
39
|
+
unsupported.value=false;status.value=s
|
|
40
|
+
const list=await call<{jobs:Job[]}>('bg.jobs.list')
|
|
41
|
+
if(list&&!disposed)jobs.value=list.jobs??[]
|
|
42
|
+
const scheduleList=await call<{schedules:Schedule[]}>('bg.schedules.list')
|
|
43
|
+
if(scheduleList&&!disposed)schedules.value=scheduleList.schedules??[]
|
|
44
|
+
if(!disposed&&!status.value?.enabled&&jobs.value.every(settled)&&timer){clearInterval(timer);timer=undefined}
|
|
45
|
+
}finally{refreshing.value=false}
|
|
46
|
+
}
|
|
47
|
+
function poll(){if(!timer)timer=setInterval(()=>void refresh(),3000)}
|
|
48
|
+
async function guarded(work:()=>Promise<unknown>){
|
|
49
|
+
if(busy.value)return
|
|
50
|
+
busy.value=true;error.value=undefined
|
|
51
|
+
try{await work();await refresh();if(status.value?.enabled||jobs.value.some(j=>!settled(j)))poll()}finally{if(!disposed)busy.value=false}
|
|
52
|
+
}
|
|
53
|
+
const setMode=(enabled:boolean)=>guarded(()=>call('bg.mode.set',{enabled}))
|
|
54
|
+
const setUsers=(allowOrdinaryUsers:boolean)=>guarded(()=>call('bg.users.set',{allowOrdinaryUsers}))
|
|
55
|
+
const purge=()=>guarded(async()=>{if(!purgeOwner.value)return;const out=await call('bg.jobs.purge',{owner:purgeOwner.value});if(out)purgeOwner.value=undefined})
|
|
56
|
+
const intervalOptions=computed(()=>[{value:'3600',label:copy.value.hourly},{value:'86400',label:copy.value.daily},{value:'604800',label:copy.value.weekly}])
|
|
57
|
+
const selectSchedule=(job:Job)=>{scheduleSource.value=job;scheduleConsent.value=false;scheduleInterval.value='3600'}
|
|
58
|
+
const createSchedule=()=>guarded(async()=>{if(!scheduleSource.value||!scheduleConsent.value)return;const out=await call('bg.schedules.create',{key:crypto.randomUUID(),jobId:scheduleSource.value.id,intervalSeconds:Number(scheduleInterval.value),consent:true});if(out)scheduleSource.value=undefined})
|
|
59
|
+
const disableSchedule=(id:string)=>guarded(()=>call('bg.schedules.disable',{id}))
|
|
60
|
+
const deleteSchedule=()=>guarded(async()=>{if(!scheduleDelete.value)return;const out=await call('bg.schedules.delete',{id:scheduleDelete.value.id});if(out)scheduleDelete.value=undefined})
|
|
61
|
+
const enableSchedule=()=>guarded(async()=>{if(!scheduleEnable.value)return;const out=await call('bg.schedules.enable',{id:scheduleEnable.value.id,consent:true});if(out)scheduleEnable.value=undefined})
|
|
62
|
+
const formatTime=(value:string)=>{const date=new Date(value);return Number.isFinite(date.getTime())?date.toLocaleString():copy.value.unknownTime}
|
|
63
|
+
const ownCopy=(job:Job)=>job.copyRetained&&job.state==='succeeded'&&!job.scheduleId&&job.submitter?.user===status.value?.owner?.user&&job.submitter?.uid===status.value?.owner?.uid
|
|
64
|
+
const cancel=(id:string)=>guarded(()=>call('bg.jobs.cancel',{id}))
|
|
65
|
+
const pick=(value:M2JobSource)=>{picked.value={folder:value.selection.folder,relative:value.segments.join('/')}}
|
|
66
|
+
// The signed-in caller's own File Station session decides whether the
|
|
67
|
+
// file can be read; the submit itself is the consent to copy that one file.
|
|
68
|
+
const submit=()=>guarded(async()=>{
|
|
69
|
+
if(!picked.value)return
|
|
70
|
+
const sent=await call('bg.jobs.submit',{key:crypto.randomUUID(),...picked.value})
|
|
71
|
+
if(sent)picked.value=undefined
|
|
72
|
+
})
|
|
73
|
+
async function fetchResult(job:Job){
|
|
74
|
+
const value=await call<{result:unknown}>('bg.jobs.result',{id:job.id})
|
|
75
|
+
if(!value||disposed)return
|
|
76
|
+
if(download.value)URL.revokeObjectURL(download.value)
|
|
77
|
+
download.value=URL.createObjectURL(new Blob([JSON.stringify(value.result,null,2)],{type:'application/json'}))
|
|
78
|
+
downloadName.value=`${job.name||job.id}.sha256.json`
|
|
79
|
+
}
|
|
80
|
+
onMounted(()=>void refresh().then(()=>{if(status.value?.enabled||jobs.value.some(j=>!settled(j)))poll()}))
|
|
81
|
+
onBeforeUnmount(()=>{disposed=true;picker.dispose();if(timer)clearInterval(timer);if(download.value)URL.revokeObjectURL(download.value)})
|
|
82
|
+
</script>
|
|
83
|
+
<template>
|
|
84
|
+
<SettingsSection :aria-busy="busy||refreshing" :title="copy.title" :collapsible="false" data-background-panel>
|
|
85
|
+
<Callout v-if="unsupported" tone="warning">{{ copy.unsupported }}</Callout>
|
|
86
|
+
<template v-else>
|
|
87
|
+
<p class="integration-help">{{ copy.help }}</p>
|
|
88
|
+
<Callout v-if="error" tone="danger" role="alert">{{ backgroundErrorCopy(error,copy) }}</Callout>
|
|
89
|
+
<template v-if="status">
|
|
90
|
+
<p role="status">{{ status.enabled ? copy.modeOn : copy.modeOff }} · {{ status.worker?.alive ? fill(copy.workerRunning,{user:status.worker.username}) : copy.workerStopped }}</p>
|
|
91
|
+
<p class="integration-help">{{ fill(copy.limits,{size:status.limits.maxInputBytes/1024,queue:status.limits.maxQueued,seconds:status.limits.jobTimeoutSeconds}) }}</p>
|
|
92
|
+
<p class="integration-help">{{ status.admin ? copy.adminScope : copy.ownerScope }}</p>
|
|
93
|
+
<p class="integration-help">{{ fill(copy.ownerLimits,{jobs:status.limits.maxOwnerPending,size:status.limits.maxOwnerBytes/1024}) }}</p>
|
|
94
|
+
<div class="integration-actions">
|
|
95
|
+
<Button v-if="status.admin&&!status.enabled" variant="primary" :disabled="busy" @click="setMode(true)">{{ copy.enable }}</Button>
|
|
96
|
+
<Button v-else-if="status.admin" variant="secondary" :disabled="busy" @click="setMode(false)">{{ copy.disable }}</Button>
|
|
97
|
+
<Button variant="secondary" :disabled="busy" @click="refresh">{{ copy.refresh }}</Button>
|
|
98
|
+
</div>
|
|
99
|
+
<div v-if="status.admin" class="integration-actions">
|
|
100
|
+
<Button variant="secondary" :disabled="busy" @click="setUsers(!status.allowOrdinaryUsers)">{{ status.allowOrdinaryUsers ? copy.blockUsers : copy.allowUsers }}</Button>
|
|
101
|
+
<span role="status">{{ status.allowOrdinaryUsers ? copy.usersOn : copy.usersOff }}</span>
|
|
102
|
+
</div>
|
|
103
|
+
<template v-if="status.enabled">
|
|
104
|
+
<div class="integration-actions">
|
|
105
|
+
<Button variant="secondary" :disabled="busy" @click="picking=true">{{ copy.chooseFile }}</Button>
|
|
106
|
+
<Button variant="primary" :disabled="busy||!picked" @click="submit">{{ copy.submit }}</Button>
|
|
107
|
+
</div>
|
|
108
|
+
<p v-if="picked" role="status" data-bg-picked>{{ fill(copy.chosen,{path:`${picked.folder}/${picked.relative}`}) }}</p>
|
|
109
|
+
<M2PathPicker v-model:open="picking" :locale="ctx.locale" select-files read-only :title="copy.pickerTitle" :consent="copy.pickerConsent" @source="pick" />
|
|
110
|
+
</template>
|
|
111
|
+
<Callout v-if="purgeOwner&&status.admin" tone="warning">
|
|
112
|
+
<p>{{ fill(copy.purgeConfirm,{user:purgeOwner.user,uid:purgeOwner.uid}) }}</p>
|
|
113
|
+
<div class="integration-actions">
|
|
114
|
+
<Button variant="secondary" :disabled="busy" @click="purge">{{ copy.confirmPurge }}</Button>
|
|
115
|
+
<Button variant="secondary" :disabled="busy" @click="purgeOwner=undefined">{{ copy.keepJobs }}</Button>
|
|
116
|
+
</div>
|
|
117
|
+
</Callout>
|
|
118
|
+
<p v-if="!jobs.length">{{ copy.noJobs }}</p>
|
|
119
|
+
<ul v-else class="integration-jobs">
|
|
120
|
+
<li v-for="job in jobs" :key="job.id" :data-job-state="job.state" :data-job-id="job.id">
|
|
121
|
+
<span class="nas-folder-name">{{ job.name }} — {{ copy[`state_${job.state}`] }}</span>
|
|
122
|
+
<span v-if="status.admin&&job.submitter" class="integration-help">{{ fill(copy.owner,{user:job.submitter.user,uid:job.submitter.uid}) }}</span>
|
|
123
|
+
<Button v-if="status.admin&&job.submitter" variant="secondary" :disabled="busy" @click="purgeOwner=job.submitter">{{ copy.purgeOwner }}</Button>
|
|
124
|
+
<Button v-if="!settled(job)" variant="secondary" :disabled="busy" @click="cancel(job.id)">{{ copy.cancel }}</Button>
|
|
125
|
+
<Button v-if="status.enabled&&ownCopy(job)" variant="secondary" :disabled="busy" @click="selectSchedule(job)">{{ copy.scheduleCopy }}</Button>
|
|
126
|
+
<span v-if="job.scheduleId" class="integration-help">{{ copy.scheduledJob }}</span>
|
|
127
|
+
<Button v-if="job.state==='succeeded'" variant="secondary" :disabled="busy" @click="fetchResult(job)">{{ copy.result }}</Button>
|
|
128
|
+
</li>
|
|
129
|
+
</ul>
|
|
130
|
+
<section data-bg-schedules class="bg-schedules" :aria-label="copy.schedulesTitle">
|
|
131
|
+
<h3>{{ copy.schedulesTitle }}</h3>
|
|
132
|
+
<p class="integration-help">{{ copy.scheduleHelp }}</p>
|
|
133
|
+
<Form v-if="scheduleSource&&status.enabled" class="bg-schedule-form" @submit.prevent="createSchedule">
|
|
134
|
+
<p>{{ fill(copy.scheduleSource,{name:scheduleSource.name}) }}</p>
|
|
135
|
+
<FormItem :label="copy.interval"><Select v-model="scheduleInterval" data-schedule-interval :options="intervalOptions" :disabled="busy" /></FormItem>
|
|
136
|
+
<Checkbox v-model="scheduleConsent" data-schedule-consent :disabled="busy" :label="copy.scheduleConsent" />
|
|
137
|
+
<FormActions><Button type="submit" variant="primary" :disabled="busy||!scheduleConsent">{{ copy.createSchedule }}</Button><Button type="button" variant="secondary" :disabled="busy" @click="scheduleSource=undefined">{{ copy.cancel }}</Button></FormActions>
|
|
138
|
+
</Form>
|
|
139
|
+
<p v-if="!schedules.length">{{ copy.noSchedules }}</p>
|
|
140
|
+
<ul v-else class="integration-jobs">
|
|
141
|
+
<li v-for="schedule in schedules" :key="schedule.id" :data-schedule-id="schedule.id">
|
|
142
|
+
<span class="nas-folder-name">{{ schedule.name }} — {{ schedule.enabled ? copy.scheduleOn : copy.scheduleOff }}</span>
|
|
143
|
+
<span v-if="status.admin" class="integration-help">{{ fill(copy.owner,{user:schedule.owner.user,uid:schedule.owner.uid}) }}</span>
|
|
144
|
+
<span v-if="schedule.enabled" class="integration-help">{{ fill(copy.nextRun,{time:formatTime(schedule.nextAt)}) }}</span>
|
|
145
|
+
<span class="integration-help">{{ fill(copy.missedRuns,{count:schedule.missed}) }}</span>
|
|
146
|
+
<Callout v-if="schedule.reason==='worker-changed'" tone="warning">{{ copy.revisionChanged }}</Callout>
|
|
147
|
+
<Callout v-else-if="schedule.reason==='input-unavailable'" tone="warning">{{ copy.errors['input-unavailable'] }}</Callout>
|
|
148
|
+
<div class="integration-actions">
|
|
149
|
+
<Button v-if="schedule.enabled" variant="secondary" :disabled="busy" @click="disableSchedule(schedule.id)">{{ copy.disableSchedule }}</Button>
|
|
150
|
+
<Button v-else-if="status.admin&&status.enabled" variant="secondary" :disabled="busy" @click="scheduleEnable=schedule">{{ copy.enableSchedule }}</Button>
|
|
151
|
+
<Button variant="secondary" :disabled="busy" @click="scheduleDelete=schedule">{{ copy.deleteSchedule }}</Button>
|
|
152
|
+
</div>
|
|
153
|
+
</li>
|
|
154
|
+
</ul>
|
|
155
|
+
<Callout v-if="scheduleDelete" tone="warning">
|
|
156
|
+
<p>{{ fill(copy.deleteScheduleConsent,{name:scheduleDelete.name}) }}</p>
|
|
157
|
+
<div class="integration-actions"><Button variant="danger" :disabled="busy" @click="deleteSchedule">{{ copy.confirmDeleteSchedule }}</Button><Button variant="secondary" :disabled="busy" @click="scheduleDelete=undefined">{{ copy.cancel }}</Button></div>
|
|
158
|
+
</Callout>
|
|
159
|
+
<Callout v-if="scheduleEnable" tone="warning">
|
|
160
|
+
<p>{{ fill(copy.enableScheduleConsent,{name:scheduleEnable.name}) }}</p>
|
|
161
|
+
<div class="integration-actions"><Button variant="primary" :disabled="busy" @click="enableSchedule">{{ copy.confirmEnableSchedule }}</Button><Button variant="secondary" :disabled="busy" @click="scheduleEnable=undefined">{{ copy.cancel }}</Button></div>
|
|
162
|
+
</Callout>
|
|
163
|
+
</section>
|
|
164
|
+
<Link v-if="download" :href="download" :download="downloadName">{{ copy.download }}</Link>
|
|
165
|
+
</template>
|
|
166
|
+
</template>
|
|
167
|
+
</SettingsSection>
|
|
168
|
+
</template>
|
|
169
|
+
|
|
170
|
+
<style scoped>
|
|
171
|
+
.integration-jobs { overflow-wrap:anywhere; min-width:0; }
|
|
172
|
+
.bg-schedules { margin-block-start: var(--ui-space-6,24px); min-width:0; overflow-wrap:anywhere; }
|
|
173
|
+
.bg-schedules .integration-jobs { display:grid; gap:var(--ui-space-4,16px); padding-inline-start:var(--ui-space-5,20px); }
|
|
174
|
+
.bg-schedules .integration-jobs li { display:flex; flex-direction:column; align-items:flex-start; gap:var(--ui-space-2,8px); min-width:0; }
|
|
175
|
+
.bg-schedules p, .bg-schedules li > span { min-width:0; max-width:100%; }
|
|
176
|
+
.bg-schedules h3 { font-size:15px; font-weight:600; }
|
|
177
|
+
.bg-schedule-form { margin-block:var(--ui-space-4,16px); }
|
|
178
|
+
</style>
|