@synopackageland/cli 0.4.1 → 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.
Files changed (631) hide show
  1. package/README.md +7 -3
  2. package/dist/build-spk/delete-app-data.d.ts +27 -7
  3. package/dist/build-spk/delete-app-data.js +35 -34
  4. package/dist/build-spk/dsm-arch.d.ts +6 -1
  5. package/dist/build-spk/dsm-arch.js +25 -1
  6. package/dist/build-spk/dsm-version.d.ts +14 -0
  7. package/dist/build-spk/dsm-version.js +47 -0
  8. package/dist/build-spk/gateway.d.ts +31 -0
  9. package/dist/build-spk/gateway.js +55 -0
  10. package/dist/build-spk/generator.d.ts +5 -0
  11. package/dist/build-spk/generator.js +103 -107
  12. package/dist/build-spk/install-wizard.d.ts +20 -0
  13. package/dist/build-spk/install-wizard.js +76 -0
  14. package/dist/build-spk/native-lifecycle.d.ts +5 -0
  15. package/dist/build-spk/native-lifecycle.js +12 -2
  16. package/dist/build-spk/resource-worker.d.ts +9 -4
  17. package/dist/build-spk/resource-worker.js +15 -6
  18. package/dist/build-spk/share-combobox.d.ts +3 -0
  19. package/dist/build-spk/share-combobox.js +27 -0
  20. package/dist/build-spk/uninstall-wizard.d.ts +14 -0
  21. package/dist/build-spk/uninstall-wizard.js +33 -0
  22. package/dist/build-spk/wizard-i18n.d.ts +18 -0
  23. package/dist/build-spk/wizard-i18n.js +38 -0
  24. package/dist/build-spk/wizard-messages.d.ts +388 -0
  25. package/dist/build-spk/wizard-messages.js +387 -0
  26. package/dist/cli.js +130 -30
  27. package/dist/compose/analyze.d.ts +20 -0
  28. package/dist/compose/analyze.js +75 -11
  29. package/dist/contract/validate.js +33 -1
  30. package/dist/contract/web-launch.d.ts +22 -0
  31. package/dist/contract/web-launch.js +37 -0
  32. package/dist/deploy/deploy.d.ts +3 -0
  33. package/dist/deploy/deploy.js +11 -2
  34. package/dist/error-registry.js +60 -1
  35. package/dist/host/open-url.d.ts +2 -0
  36. package/dist/host/open-url.js +4 -1
  37. package/dist/images/pin.d.ts +52 -0
  38. package/dist/images/pin.js +249 -0
  39. package/dist/init.d.ts +27 -3
  40. package/dist/init.js +104 -15
  41. package/dist/inspect.d.ts +3 -0
  42. package/dist/inspect.js +15 -3
  43. package/dist/standalone/background.d.ts +21 -0
  44. package/dist/standalone/background.js +52 -0
  45. package/dist/standalone/binary.d.ts +1 -0
  46. package/dist/standalone/binary.js +1 -1
  47. package/dist/standalone/build.d.ts +2 -0
  48. package/dist/standalone/build.js +38 -6
  49. package/dist/standalone/dsm-window.js +2 -2
  50. package/dist/standalone/helper-inventory.d.ts +15 -0
  51. package/dist/standalone/helper-inventory.js +9 -0
  52. package/dist/standalone/helper.d.ts +1 -0
  53. package/dist/standalone/helper.js +28 -10
  54. package/dist/standalone/host-adapter.d.ts +1 -1
  55. package/dist/standalone/host-adapter.js +33 -15
  56. package/dist/standalone/host-file-navigation.d.ts +7 -0
  57. package/dist/standalone/host-file-navigation.js +172 -0
  58. package/dist/standalone/inspect-helper.js +9 -4
  59. package/dist/standalone/inspect-spk.d.ts +1 -1
  60. package/dist/standalone/inspect-spk.js +200 -7
  61. package/dist/standalone/job-diagnostics.d.ts +1 -0
  62. package/dist/standalone/job-diagnostics.js +49 -0
  63. package/dist/standalone/lifecycle.js +12 -2
  64. package/dist/standalone/manifest.d.ts +15 -2
  65. package/dist/standalone/manifest.js +37 -6
  66. package/dist/standalone/native-layout.d.ts +74 -0
  67. package/dist/standalone/native-layout.js +318 -0
  68. package/dist/standalone/resource.d.ts +11 -0
  69. package/dist/standalone/resource.js +13 -0
  70. package/dist/standalone/root-window.d.ts +3 -1
  71. package/dist/standalone/root-window.js +156 -38
  72. package/dist/standalone/shared-folder.d.ts +39 -0
  73. package/dist/standalone/shared-folder.js +141 -0
  74. package/dist/standalone/spk.d.ts +2 -0
  75. package/dist/standalone/spk.js +33 -3
  76. package/dist/standalone/worker-contract-json.d.ts +8 -0
  77. package/dist/standalone/worker-contract-json.js +141 -0
  78. package/dist/standalone/worker-contract.d.ts +189 -0
  79. package/dist/standalone/worker-contract.js +175 -0
  80. package/dist/standalone/worker-registry.d.ts +40 -0
  81. package/dist/standalone/worker-registry.js +167 -0
  82. package/dist/templates/_daemon/go.mod +2 -0
  83. package/dist/templates/_gateway/auth.go +101 -0
  84. package/dist/templates/_gateway/auth_test.go +216 -0
  85. package/dist/templates/_gateway/cgi.go +133 -0
  86. package/dist/templates/_gateway/cgi_test.go +156 -0
  87. package/dist/templates/_gateway/csrf.go +73 -0
  88. package/dist/templates/_gateway/csrf_test.go +155 -0
  89. package/dist/templates/_gateway/directory.go +108 -0
  90. package/dist/templates/_gateway/directory_test.go +202 -0
  91. package/dist/templates/_gateway/gateway.go +412 -0
  92. package/dist/templates/_gateway/gateway_test.go +676 -0
  93. package/dist/templates/_gateway/go.mod +3 -0
  94. package/dist/templates/_gateway/groups.go +66 -0
  95. package/dist/templates/_gateway/main.go +45 -0
  96. package/dist/templates/binary/synology-app.yaml +1 -1
  97. package/dist/templates/compose-import/compose.yaml +1 -1
  98. package/dist/templates/compose-import/synology-app.yaml +1 -1
  99. package/dist/templates/hello-files/compose.yaml +1 -1
  100. package/dist/templates/hello-files/synology-app.yaml +1 -1
  101. package/dist/templates/hello-web/compose.yaml +5 -2
  102. package/dist/templates/hello-web/synology-app.yaml +4 -1
  103. package/dist/templates/hello-web-page/compose.yaml +5 -2
  104. package/dist/templates/hello-web-page/synology-app.yaml +4 -1
  105. package/dist/templates/native-go/README.md +93 -4
  106. package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
  107. package/dist/templates/native-go/backend/cmd/app/main.go +17 -0
  108. package/dist/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
  109. package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  110. package/dist/templates/native-go/backend/cmd/helper/main.go +10 -1
  111. package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  112. package/dist/templates/native-go/backend/go.mod +5 -3
  113. package/dist/templates/native-go/backend/go.sum +4 -4
  114. package/dist/templates/native-go/backend/internal/api/registry.go +17 -6
  115. package/dist/templates/native-go/backend/internal/api/server.go +7 -1
  116. package/dist/templates/native-go/backend/internal/app/background.go +270 -0
  117. package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
  118. package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
  119. package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  120. package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  121. package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  122. package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
  123. package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
  124. package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
  125. package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  126. package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
  127. package/dist/templates/native-go/backend/internal/app/routes.go +17 -3
  128. package/dist/templates/native-go/backend/internal/app/routes_test.go +20 -3
  129. package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  130. package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  131. package/dist/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
  132. package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
  133. package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  134. package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  135. package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  136. package/dist/templates/native-go/backend/internal/background/access.go +57 -0
  137. package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
  138. package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
  139. package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
  140. package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
  141. package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  142. package/dist/templates/native-go/backend/internal/background/store.go +807 -0
  143. package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
  144. package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  145. package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  146. package/dist/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  147. package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
  148. package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  149. package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
  150. package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  151. package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
  152. package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  153. package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  154. package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  155. package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
  156. package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  157. package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  158. package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
  159. package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  160. package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  161. package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  162. package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  163. package/dist/templates/native-go/backend/internal/helper/data_contract.go +3 -0
  164. package/dist/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
  165. package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
  166. package/dist/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
  167. package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
  168. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
  169. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
  170. package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
  171. package/dist/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  172. package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  173. package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  174. package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  175. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  176. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  177. package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  178. package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  179. package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  180. package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  181. package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  182. package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  183. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  184. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  185. package/dist/templates/native-go/backend/internal/helper/management.go +79 -0
  186. package/dist/templates/native-go/backend/internal/helper/observation.go +42 -2
  187. package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
  188. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
  189. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
  190. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  191. package/dist/templates/native-go/backend/internal/helper/process_linux.go +3 -0
  192. package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  193. package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  194. package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
  195. package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
  196. package/dist/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  197. package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  198. package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  199. package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  200. package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  201. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  202. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  203. package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  204. package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  205. package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  206. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  207. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  208. package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  209. package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  210. package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  211. package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  212. package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  213. package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  214. package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  215. package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  216. package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  217. package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  218. package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  219. package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  220. package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  221. package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  222. package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  223. package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  224. package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  225. package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  226. package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  227. package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  228. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  229. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  230. package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  231. package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  232. package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  233. package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  234. package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  235. package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  236. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  237. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  238. package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
  239. package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  240. package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  241. package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  242. package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  243. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  244. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  245. package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  246. package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  247. package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  248. package/dist/templates/native-go/backend/internal/helper/server_linux.go +3 -0
  249. package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  250. package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  251. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  252. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  253. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  254. package/dist/templates/native-go/backend/internal/helper/status.go +22 -13
  255. package/dist/templates/native-go/backend/internal/helper/status_test.go +45 -0
  256. package/dist/templates/native-go/backend/internal/helper/supervision.go +1 -1
  257. package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
  258. package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
  259. package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
  260. package/dist/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
  261. package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
  262. package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
  263. package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
  264. package/dist/templates/native-go/dsm-package.yaml +1 -1
  265. package/dist/templates/native-go-background/BACKGROUND.md +111 -0
  266. package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  267. package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  268. package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  269. package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  270. package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  271. package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  272. package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  273. package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  274. package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  275. package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  276. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  277. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  278. package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  279. package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  280. package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
  281. package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  282. package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  283. package/dist/templates/native-go-vue/README.md +38 -7
  284. package/dist/templates/native-go-vue/frontend/DESIGN.md +15 -3
  285. package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  286. package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
  287. package/dist/templates/native-go-vue/frontend/package-lock.json +5 -4
  288. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  289. package/dist/templates/native-go-vue/frontend/src/App.vue +39 -11
  290. package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  291. package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  292. package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  293. package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  294. package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  295. package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  296. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  297. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  298. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  299. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  300. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  301. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  302. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  303. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  304. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  305. package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  306. package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  307. package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  308. package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  309. package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  310. package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  311. package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  312. package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  313. package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  314. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  315. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  316. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  317. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  318. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  319. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  320. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  321. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  322. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  323. package/dist/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  324. package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  325. package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  326. package/dist/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  327. package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  328. package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  329. package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  330. package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  331. package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  332. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  333. package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  334. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  335. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  336. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  337. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  338. package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  339. package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  340. package/dist/templates/native-go-vue/frontend/src/style.css +2 -6
  341. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
  342. package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  343. package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  344. package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  345. package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  346. package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  347. package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  348. package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  349. package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  350. package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  351. package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  352. package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  353. package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  354. package/dist/templates/native-go-vue/frontend/vite.config.ts +2 -2
  355. package/dist/validate.js +6 -3
  356. package/package.json +1 -1
  357. package/schema/synology-app.schema.json +19 -0
  358. package/skills/reference/create.md +4 -0
  359. package/templates/_daemon/go.mod +2 -0
  360. package/templates/_gateway/auth.go +101 -0
  361. package/templates/_gateway/auth_test.go +216 -0
  362. package/templates/_gateway/cgi.go +133 -0
  363. package/templates/_gateway/cgi_test.go +156 -0
  364. package/templates/_gateway/csrf.go +73 -0
  365. package/templates/_gateway/csrf_test.go +155 -0
  366. package/templates/_gateway/directory.go +108 -0
  367. package/templates/_gateway/directory_test.go +202 -0
  368. package/templates/_gateway/gateway.go +412 -0
  369. package/templates/_gateway/gateway_test.go +676 -0
  370. package/templates/_gateway/go.mod +3 -0
  371. package/templates/_gateway/groups.go +66 -0
  372. package/templates/_gateway/main.go +45 -0
  373. package/templates/binary/synology-app.yaml +1 -1
  374. package/templates/compose-import/compose.yaml +1 -1
  375. package/templates/compose-import/synology-app.yaml +1 -1
  376. package/templates/hello-files/compose.yaml +1 -1
  377. package/templates/hello-files/synology-app.yaml +1 -1
  378. package/templates/hello-web/compose.yaml +5 -2
  379. package/templates/hello-web/synology-app.yaml +4 -1
  380. package/templates/hello-web-page/compose.yaml +5 -2
  381. package/templates/hello-web-page/synology-app.yaml +4 -1
  382. package/templates/native-go/README.md +93 -4
  383. package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
  384. package/templates/native-go/backend/cmd/app/main.go +17 -0
  385. package/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
  386. package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  387. package/templates/native-go/backend/cmd/helper/main.go +10 -1
  388. package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  389. package/templates/native-go/backend/go.mod +5 -3
  390. package/templates/native-go/backend/go.sum +4 -4
  391. package/templates/native-go/backend/internal/api/registry.go +17 -6
  392. package/templates/native-go/backend/internal/api/server.go +7 -1
  393. package/templates/native-go/backend/internal/app/background.go +270 -0
  394. package/templates/native-go/backend/internal/app/background_none.go +8 -0
  395. package/templates/native-go/backend/internal/app/background_owner.go +59 -0
  396. package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  397. package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  398. package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  399. package/templates/native-go/backend/internal/app/background_test.go +346 -0
  400. package/templates/native-go/backend/internal/app/integration_state.go +16 -0
  401. package/templates/native-go/backend/internal/app/migrations.go +41 -0
  402. package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  403. package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
  404. package/templates/native-go/backend/internal/app/routes.go +17 -3
  405. package/templates/native-go/backend/internal/app/routes_test.go +20 -3
  406. package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  407. package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  408. package/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
  409. package/templates/native-go/backend/internal/app/session_files.go +15 -0
  410. package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  411. package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  412. package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  413. package/templates/native-go/backend/internal/background/access.go +57 -0
  414. package/templates/native-go/backend/internal/background/owner_test.go +126 -0
  415. package/templates/native-go/backend/internal/background/runner.go +185 -0
  416. package/templates/native-go/backend/internal/background/runner_test.go +209 -0
  417. package/templates/native-go/backend/internal/background/schedule.go +300 -0
  418. package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  419. package/templates/native-go/backend/internal/background/store.go +807 -0
  420. package/templates/native-go/backend/internal/background/store_test.go +407 -0
  421. package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  422. package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  423. package/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  424. package/templates/native-go/backend/internal/filestation/client.go +251 -0
  425. package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  426. package/templates/native-go/backend/internal/filestation/doc.go +4 -0
  427. package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  428. package/templates/native-go/backend/internal/filestation/repository.go +207 -0
  429. package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  430. package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  431. package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  432. package/templates/native-go/backend/internal/filestation/service.go +254 -0
  433. package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  434. package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  435. package/templates/native-go/backend/internal/filestation/write.go +72 -0
  436. package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  437. package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  438. package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  439. package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  440. package/templates/native-go/backend/internal/helper/data_contract.go +3 -0
  441. package/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
  442. package/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
  443. package/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
  444. package/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
  445. package/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
  446. package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
  447. package/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
  448. package/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  449. package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  450. package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  451. package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  452. package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  453. package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  454. package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  455. package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  456. package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  457. package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  458. package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  459. package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  460. package/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  461. package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  462. package/templates/native-go/backend/internal/helper/management.go +79 -0
  463. package/templates/native-go/backend/internal/helper/observation.go +42 -2
  464. package/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
  465. package/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
  466. package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
  467. package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  468. package/templates/native-go/backend/internal/helper/process_linux.go +3 -0
  469. package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  470. package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  471. package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
  472. package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
  473. package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  474. package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  475. package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  476. package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  477. package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  478. package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  479. package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  480. package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  481. package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  482. package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  483. package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  484. package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  485. package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  486. package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  487. package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  488. package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  489. package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  490. package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  491. package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  492. package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  493. package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  494. package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  495. package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  496. package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  497. package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  498. package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  499. package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  500. package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  501. package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  502. package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  503. package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  504. package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  505. package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  506. package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  507. package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  508. package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  509. package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  510. package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  511. package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  512. package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  513. package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  514. package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  515. package/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
  516. package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  517. package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  518. package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  519. package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  520. package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  521. package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  522. package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  523. package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  524. package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  525. package/templates/native-go/backend/internal/helper/server_linux.go +3 -0
  526. package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  527. package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  528. package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  529. package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  530. package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  531. package/templates/native-go/backend/internal/helper/status.go +22 -13
  532. package/templates/native-go/backend/internal/helper/status_test.go +45 -0
  533. package/templates/native-go/backend/internal/helper/supervision.go +1 -1
  534. package/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
  535. package/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
  536. package/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
  537. package/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
  538. package/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
  539. package/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
  540. package/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
  541. package/templates/native-go/dsm-package.yaml +1 -1
  542. package/templates/native-go-background/BACKGROUND.md +111 -0
  543. package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  544. package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  545. package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  546. package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  547. package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  548. package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  549. package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  550. package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  551. package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  552. package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  553. package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  554. package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  555. package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  556. package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  557. package/templates/native-go-background/frontend/test/background.test.ts +179 -0
  558. package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  559. package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  560. package/templates/native-go-vue/README.md +38 -7
  561. package/templates/native-go-vue/frontend/DESIGN.md +15 -3
  562. package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  563. package/templates/native-go-vue/frontend/README-M2.md +64 -0
  564. package/templates/native-go-vue/frontend/package-lock.json +5 -4
  565. package/templates/native-go-vue/frontend/package.json +1 -1
  566. package/templates/native-go-vue/frontend/src/App.vue +39 -11
  567. package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  568. package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  569. package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  570. package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  571. package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  572. package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  573. package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  574. package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  575. package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  576. package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  577. package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  578. package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  579. package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  580. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  581. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  582. package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  583. package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  584. package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  585. package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  586. package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  587. package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  588. package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  589. package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  590. package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  591. package/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  592. package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  593. package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  594. package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  595. package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  596. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  597. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  598. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  599. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  600. package/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  601. package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  602. package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  603. package/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  604. package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  605. package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  606. package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  607. package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  608. package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  609. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  610. package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  611. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  612. package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  613. package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  614. package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  615. package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  616. package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  617. package/templates/native-go-vue/frontend/src/style.css +2 -6
  618. package/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
  619. package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  620. package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  621. package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  622. package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  623. package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  624. package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  625. package/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  626. package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  627. package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  628. package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  629. package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  630. package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  631. package/templates/native-go-vue/frontend/vite.config.ts +2 -2
@@ -0,0 +1,94 @@
1
+ <script setup lang="ts">
2
+ import {computed,inject,onBeforeUnmount,onMounted,ref,watch} from 'vue'
3
+ import {Button,Callout,DataGrid,FilePicker,Form,FormActions,FormItem,Input,Link,type FileRejection} from '@synopackageland/ui'
4
+ import {M2_MAX_BYTES,M2ProviderKey,type M2Entry,type M2Selection} from './m2-contract'
5
+ import {m2Copy,m2ErrorCopy} from './m2-i18n'
6
+ import {format} from './i18n'
7
+ import {useM2Request} from './use-m2-request'
8
+ const props=defineProps<{selection:M2Selection;locale:string}>()
9
+ const emit=defineEmits<{busy:[value:boolean]}>()
10
+ const copy=computed(()=>m2Copy(props.locale)),provider=inject(M2ProviderKey)!
11
+ const request=useM2Request(),{busy,error}=request
12
+ watch(busy,value=>emit('busy',value),{flush:'sync'})
13
+ const entries=ref<M2Entry[]>([]),trail=ref<string[]>([]),next=ref<number>(),metadata=ref<M2Entry>(),folderName=ref(''),files=ref<File[]>([]),notice=ref(''),download=ref(''),downloadName=ref('')
14
+ const columns=computed(()=>[{key:'name',label:copy.value.fileKind},{key:'actions',label:copy.value.inspect}])
15
+ const relative=computed(()=>trail.value.join('/'))
16
+ function release(){if(download.value)URL.revokeObjectURL(download.value);download.value='';downloadName.value='';metadata.value=undefined;notice.value=''}
17
+ async function browse(target:string[],more=false){
18
+ if(busy.value)return
19
+ release()
20
+ const page=await request.run(signal=>provider.list(props.selection.grantId,target.join('/'),more?next.value??0:0,signal))
21
+ if(page){trail.value=target;entries.value=(more?[...entries.value,...page.entries]:page.entries).slice(-200);next.value=page.nextOffset}
22
+ else {entries.value=[];next.value=undefined}
23
+ }
24
+ function child(name:string){return [...trail.value,name].join('/')}
25
+ async function inspect(entry:M2Entry){release();const value=await request.run(signal=>provider.stat(props.selection.grantId,child(entry.name),signal));if(value)metadata.value=value}
26
+ async function read(entry:M2Entry){
27
+ release()
28
+ const value=await request.run(signal=>provider.read(props.selection.grantId,child(entry.name),signal))
29
+ if(value){download.value=URL.createObjectURL(new Blob([new Uint8Array(value).buffer],{type:'application/octet-stream'}));downloadName.value=entry.name;notice.value=copy.value.readComplete}
30
+ }
31
+ async function create(){
32
+ if(busy.value||!props.selection.writable)return
33
+ release()
34
+ const done=await request.run(async signal=>{await provider.create(props.selection.grantId,relative.value,folderName.value,signal);return true})
35
+ if(done){folderName.value='';await browse(trail.value);notice.value=copy.value.created}
36
+ }
37
+ // The compact FilePicker enforces the size limit and reports the first refused file.
38
+ function pick(selected:File[]){
39
+ if(busy.value)return
40
+ error.value=undefined;files.value=selected.slice(0,1)
41
+ }
42
+ function refuse(items:FileRejection[]){
43
+ if(busy.value)return
44
+ files.value=[];error.value=items.some(item=>item.reason==='size')?{code:'limit-exceeded'}:{code:'invalid-request'}
45
+ }
46
+ async function upload(){
47
+ if(busy.value||!props.selection.writable||!files.value[0])return
48
+ release()
49
+ const selected=files.value[0]!,rel=relative.value
50
+ const done=await request.run(async signal=>{
51
+ if(selected.size>M2_MAX_BYTES)throw {code:'limit-exceeded'}
52
+ const data=new Uint8Array(await selected.arrayBuffer())
53
+ if(signal.aborted)throw {code:'canceled'}
54
+ await provider.upload(props.selection.grantId,rel,selected.name,data,signal);return true
55
+ })
56
+ // Never retain a retryable upload after an uncertain outcome.
57
+ files.value=[]
58
+ if(done){await browse(trail.value);notice.value=copy.value.uploaded}
59
+ }
60
+ onMounted(()=>void browse([]))
61
+ onBeforeUnmount(()=>{emit('busy',false);release();files.value=[];entries.value=[];trail.value=[];folderName.value=''})
62
+ </script>
63
+ <template>
64
+ <div class="m2-files" :aria-busy="busy">
65
+ <h3 class="nas-folder-name">{{ selection.folder }}<span v-if="relative"> / {{ relative }}</span></h3>
66
+ <p>{{ selection.writable ? copy.writable : copy.readOnly }}</p>
67
+ <p>{{ copy.limit }}</p>
68
+ <Callout v-if="error" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
69
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
70
+ <nav class="nas-breadcrumb" :aria-label="copy.directoryKind">
71
+ <Button v-if="trail.length" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,-1))">{{ copy.back }}</Button>
72
+ <Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
73
+ <Button variant="secondary" :disabled="busy" @click="browse(trail)">{{ copy.refresh }}</Button>
74
+ </nav>
75
+ <DataGrid :columns="columns" :rows="entries.map(e=>({...e}))" row-key="path" :footer="false" :resizable="false" :labels="{empty:copy.emptyFolder}" :loading="busy" :loading-text="copy.loading">
76
+ <template #cell-name="{row}"><Button v-if="row.isDir" variant="secondary" class="nas-folder-name" :disabled="busy" @click="browse([...trail,String(row.name)])">{{ format(copy.open,String(row.name)) }}</Button><span v-else class="nas-folder-name">{{ row.name }}</span></template>
77
+ <template #cell-actions="{row}"><div class="integration-actions">
78
+ <Button variant="secondary" :disabled="busy" @click="inspect(entries.find(e=>e.path===row.path)!)">{{ copy.inspect }}</Button>
79
+ <Button v-if="!row.isDir" variant="secondary" :disabled="busy || (typeof row.bytes==='number' && row.bytes>M2_MAX_BYTES)" @click="read(entries.find(e=>e.path===row.path)!)">{{ copy.read }}</Button>
80
+ </div></template>
81
+ </DataGrid>
82
+ <Button v-if="next!==undefined" variant="secondary" :disabled="busy" @click="browse(trail,true)">{{ copy.loadMore }}</Button>
83
+ <dl v-if="metadata" class="nas-summary" :aria-label="copy.metadata"><dt>{{ copy.metadata }}</dt><dd>{{ metadata.name }}</dd><dt>{{ copy.directoryKind }}</dt><dd>{{ metadata.isDir ? copy.directoryKind : copy.fileKind }}</dd><dt>Bytes</dt><dd>{{ metadata.bytes ?? '—' }}</dd></dl>
84
+ <p v-if="notice" role="status">{{ notice }}</p>
85
+ <Link v-if="download" :href="download" :download="downloadName">{{ copy.download }}</Link>
86
+ <Form v-if="selection.writable" @submit.prevent>
87
+ <FormItem :label="copy.folderName"><Input v-model="folderName" data-folder-name :disabled="busy" :maxlength="255" /></FormItem>
88
+ <FormActions><Button variant="secondary" :disabled="busy||!folderName" @click="create">{{ copy.create }}</Button></FormActions>
89
+ <FormItem :label="copy.uploadFile"><FilePicker :model-value="files" variant="compact" :max-size="M2_MAX_BYTES" :show-list="false" :disabled="busy" @update:model-value="pick" @rejected="refuse" /></FormItem>
90
+ <p v-if="files[0]" class="nas-folder-name">{{ files[0].name }}</p>
91
+ <FormActions><Button variant="primary" :disabled="busy||!files[0]" @click="upload">{{ copy.upload }}</Button></FormActions>
92
+ </Form>
93
+ </div>
94
+ </template>
@@ -0,0 +1,70 @@
1
+ <script setup lang="ts">
2
+ import {computed,inject,onBeforeUnmount,ref,watch} from 'vue'
3
+ import {Button,Callout,Checkbox,DataGrid,Dialog,TreeView,type TreeNode} from '@synopackageland/ui'
4
+ import {M2ProviderKey,type M2Entry,type M2Selection,type M2JobSource} from './m2-contract'
5
+ import {m2Copy,m2ErrorCopy} from './m2-i18n'
6
+ import {format} from './i18n'
7
+ import {useM2Request} from './use-m2-request'
8
+ const props=defineProps<{open:boolean;locale:string;selectFiles?:boolean;readOnly?:boolean;title?:string;consent?:string}>()
9
+ const emit=defineEmits<{'update:open':[open:boolean];selected:[value:M2Selection];source:[value:M2JobSource];busy:[value:boolean]}>()
10
+ const provider=inject(M2ProviderKey)!,copy=computed(()=>m2Copy(props.locale))
11
+ const request=useM2Request(),{busy,error}=request
12
+ watch(busy,value=>emit('busy',value),{flush:'sync'})
13
+ const entries=ref<M2Entry[]>([]),roots=ref<TreeNode[]>([]),trail=ref<M2Entry[]>([]),chosen=ref<M2Entry>(),next=ref<number>(),writable=ref(false)
14
+ const columns=computed(()=>[{key:'name',label:props.selectFiles?copy.value.metadata:copy.value.directoryKind},{key:'selection',label:props.selectFiles?copy.value.confirm:copy.value.choose}])
15
+ function discard(){request.cancel();entries.value=[];roots.value=[];trail.value=[];chosen.value=undefined;next.value=undefined;writable.value=false}
16
+ function close(){discard();emit('update:open',false)}
17
+ async function browse(target:M2Entry[],more=false){
18
+ if(busy.value)return
19
+ const page=await request.run(signal=>provider.discovery(target.at(-1)?.path,more?next.value??0:0,signal))
20
+ if(page){
21
+ trail.value=target;chosen.value=undefined;next.value=page.nextOffset
22
+ // Cursor progression uses the full page, even when files are filtered out.
23
+ const folders=page.entries.filter(e=>e.isDir||props.selectFiles)
24
+ entries.value=(more?[...entries.value,...folders]:folders).slice(-200)
25
+ if(!target.length)roots.value=entries.value.filter(e=>e.isDir).map(e=>({id:e.path,label:e.name}))
26
+ }
27
+ }
28
+ async function confirm(){
29
+ if(!chosen.value)return
30
+ const entry={...chosen.value},segments=entry.isDir?[]:[entry.name]
31
+ const folder=entry.isDir?entry.path:trail.value.at(-1)?.path,write=props.readOnly?false:writable.value
32
+ if(!folder||(!entry.isDir&&entry.path!==`${folder}/${entry.name}`)){error.value={code:'invalid-request'};return}
33
+ const result=await request.run(signal=>provider.confirm(folder,write,signal))
34
+ if(result){emit('selected',result);emit('source',{selection:result,entry,segments});close()}
35
+ }
36
+ watch(()=>props.open,open=>{discard();if(open)void browse([])},{immediate:true})
37
+ onBeforeUnmount(discard)
38
+ </script>
39
+ <template>
40
+ <Dialog :open="open" :title="title??copy.choose" :description="copy.ownPermissions" :close-label="copy.close" width="720px" @update:open="value=>{if(!value)close()}">
41
+ <div class="nas-picker" :aria-busy="busy">
42
+ <p>{{ consent??copy.consent }}</p>
43
+ <Callout v-if="error" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
44
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
45
+ <nav class="nas-breadcrumb" :aria-label="copy.directoryKind">
46
+ <Button v-if="trail.length" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,-1))">{{ copy.back }}</Button>
47
+ <Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
48
+ <Button v-for="(part,index) in trail" :key="part.path" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,index+1))">{{ part.name }}</Button>
49
+ </nav>
50
+ <div class="nas-browser">
51
+ <aside class="nas-tree" :inert="busy||undefined" :aria-label="copy.roots"><TreeView :nodes="roots" :show-icons="false" @select="node=>browse([{path:node.id,name:node.label,isDir:true}])" /></aside>
52
+ <div class="nas-folder-list">
53
+ <DataGrid :columns="columns" :rows="entries.map(e=>({...e}))" row-key="path" :footer="false" :labels="{empty:copy.emptyFolder}" :resizable="false" :loading="busy" :loading-text="copy.loading">
54
+ <template #cell-name="{row}"><Button v-if="row.isDir" variant="secondary" class="nas-folder-name" :disabled="busy" @click="browse([...trail,{path:String(row.path),name:String(row.name),isDir:true}])">{{ format(copy.open,String(row.name)) }}</Button><span v-else>{{ row.name }} · {{ copy.fileKind }}</span></template>
55
+ <template #cell-selection="{row}"><Button variant="secondary" :disabled="busy" :aria-label="format(copy.select,String(row.name))" :aria-pressed="chosen?.path===row.path" @click="chosen=entries.find(e=>e.path===row.path)">{{ selectFiles?format(copy.select,String(row.name)):copy.choose }}</Button></template>
56
+ </DataGrid>
57
+ <Button v-if="next!==undefined" variant="secondary" :disabled="busy" @click="browse(trail,true)">{{ copy.loadMore }}</Button>
58
+ <Button v-if="trail.length" variant="secondary" :disabled="busy" @click="chosen=trail.at(-1)">{{ format(copy.select,trail.at(-1)!.name) }}</Button>
59
+ </div>
60
+ </div>
61
+ <p v-if="chosen" role="status">{{ format(copy.selected,chosen.path) }}</p>
62
+ <Checkbox v-if="!readOnly" v-model="writable" class="m2-checkbox" :disabled="busy" :label="copy.writable" />
63
+ </div>
64
+ <template #footer>
65
+ <Button variant="secondary" @click="close">{{ copy.cancel }}</Button>
66
+ <Button variant="secondary" :disabled="busy" @click="browse(trail)">{{ copy.refresh }}</Button>
67
+ <Button variant="primary" :disabled="busy||!chosen" @click="confirm">{{ copy.confirm }}</Button>
68
+ </template>
69
+ </Dialog>
70
+ </template>
@@ -0,0 +1,69 @@
1
+ <script setup lang="ts">
2
+ import {computed,inject,onMounted,ref,watch} from 'vue'
3
+ import {Button,Callout,Dialog,SettingsSection} from '@synopackageland/ui'
4
+ import {M2ProviderKey,type M2Selection} from './m2-contract'
5
+ import {m2Copy,m2ErrorCopy} from './m2-i18n'
6
+ import {useM2Request} from './use-m2-request'
7
+ import M2PathPicker from './M2PathPicker.vue'
8
+ import M2Files from './M2Files.vue'
9
+ const emit=defineEmits<{busy:[value:boolean]}>()
10
+ const filesBusy=ref(false),pickerBusy=ref(false)
11
+ const props=defineProps<{locale:string}>(),copy=computed(()=>m2Copy(props.locale)),provider=inject(M2ProviderKey)!
12
+ const request=useM2Request(),{busy,error}=request
13
+ const occupied=computed(()=>busy.value||filesBusy.value||pickerBusy.value)
14
+ watch(occupied,value=>emit('busy',value),{flush:'sync'})
15
+ const selections=ref<M2Selection[]>([]),pickerOpen=ref(false),revoking=ref<M2Selection>(),active=ref<M2Selection>(),notice=ref(''),loaded=ref(false)
16
+ async function refresh(){
17
+ if(occupied.value)return
18
+ active.value=undefined;notice.value='';loaded.value=false;selections.value=[]
19
+ const result=await request.run(async signal=>{await provider.status(signal);return provider.selections(signal)})
20
+ if(result){selections.value=result;loaded.value=true}
21
+ }
22
+ function selected(selection:M2Selection){selections.value=[...selections.value,selection];notice.value=copy.value.selectionAdded;loaded.value=true}
23
+ async function revoke(){
24
+ if(!revoking.value)return
25
+ const selection=revoking.value
26
+ const done=await request.run(async signal=>{await provider.revoke(selection.grantId,signal);return true})
27
+ if(done){selections.value=selections.value.filter(s=>s.grantId!==selection.grantId);revoking.value=undefined;notice.value=copy.value.revokedNotice}
28
+ }
29
+ function askRevoke(selection:M2Selection){active.value=undefined;notice.value='';error.value=undefined;revoking.value=selection}
30
+ onMounted(()=>void refresh())
31
+ </script>
32
+ <template>
33
+ <SettingsSection :title="copy.title" :collapsible="false">
34
+ <div :aria-busy="occupied">
35
+ <p>{{ copy.ownPermissions }}</p><p>{{ copy.consent }}</p>
36
+ <p class="integration-help">{{ copy.localOnly }}</p>
37
+ <p class="integration-help">{{ copy.identityRisk }}</p><p class="integration-help">{{ copy.pathRisk }}</p>
38
+ <p>{{ copy.unsupported }}</p>
39
+ <Callout v-if="error && !revoking" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
40
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
41
+ <p v-if="notice" role="status">{{ notice }}</p>
42
+ <div class="integration-actions">
43
+ <Button variant="primary" :disabled="occupied||!loaded" @click="pickerOpen=true">{{ copy.choose }}</Button>
44
+ <Button variant="secondary" :disabled="occupied" @click="refresh">{{ copy.refresh }}</Button>
45
+ </div>
46
+ <p v-if="loaded&&!selections.length">{{ copy.emptySelections }}</p>
47
+ <ul class="nas-grants">
48
+ <li v-for="selection in selections" :key="selection.grantId">
49
+ <div class="nas-grant-heading"><strong>{{ selection.folder }}</strong></div>
50
+ <p>{{ selection.writable ? copy.writable : copy.readOnly }}</p>
51
+ <div class="integration-actions">
52
+ <Button variant="secondary" :disabled="occupied" @click="active=selection">{{ copy.openFiles }}</Button>
53
+ <Button variant="secondary" :disabled="occupied" @click="askRevoke(selection)">{{ copy.revoke }}</Button>
54
+ </div>
55
+ </li>
56
+ </ul>
57
+ <M2Files v-if="active" :key="active.grantId" :selection="active" :locale="locale" @busy="value=>filesBusy=value" />
58
+ </div>
59
+ <M2PathPicker v-model:open="pickerOpen" :locale="locale" @selected="selected" @busy="value=>pickerBusy=value" />
60
+ <Dialog :open="!!revoking" :title="copy.confirmRevoke" :description="copy.revokeWarning" :close-label="copy.close" @update:open="value=>{if(!value){request.cancel();revoking=undefined}}">
61
+ <p class="nas-folder-name">{{ revoking?.folder }}</p>
62
+ <Callout v-if="error" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
63
+ <template #footer>
64
+ <Button variant="secondary" @click="request.cancel();revoking=undefined">{{ copy.cancel }}</Button>
65
+ <Button variant="danger" :disabled="busy" @click="revoke">{{ copy.confirmRevoke }}</Button>
66
+ </template>
67
+ </Dialog>
68
+ </SettingsSection>
69
+ </template>
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "NAS-Ordner — File Station",
3
+ "ownPermissions": "Aktionen verwenden Ihre eigene DSM-Sitzung und die aktuellen File-Station-Rechte.",
4
+ "consent": "Eine gespeicherte Auswahl dokumentiert Ihre Zustimmung und gewährt keine zusätzlichen DSM-Rechte.",
5
+ "writable": "Ordner erstellen und Dateien hochladen erlauben (DSM-Rechte erforderlich)",
6
+ "readOnly": "Nur lesen",
7
+ "unsupported": "Hintergrundaufträge, Offlinezugriff, Streaming und atomare Veröffentlichung werden nicht unterstützt.",
8
+ "localOnly": "Experimentell: nur lokal getestet; DSM-Kompatibilität noch nicht geprüft.",
9
+ "identityRisk": "Ein neu erstelltes Konto mit gleichem Benutzernamen und gleicher UID kann Auswahlen behalten.",
10
+ "pathRisk": "Auswahlen verwenden Pfade; sie fixieren keine Inodes und begrenzen keine Symlinks oder Umbenennungen.",
11
+ "choose": "Ordner auswählen",
12
+ "confirm": "Auswahl bestätigen",
13
+ "emptySelections": "Keine gespeicherten Ordner. Wählen Sie einen Ordner aus.",
14
+ "refresh": "Ordner aktualisieren",
15
+ "openFiles": "Dateien durchsuchen",
16
+ "revoke": "Widerrufen",
17
+ "confirmRevoke": "Widerruf bestätigen",
18
+ "revokeWarning": "Der Widerruf verweigert neue Aktionen. Geschriebene Daten bleiben erhalten; ein abgebrochener Aufruf beweist keinen Stillstand.",
19
+ "loading": "Wird geladen…",
20
+ "emptyFolder": "Dieser Ordner ist leer.",
21
+ "roots": "Ordner",
22
+ "back": "Zurück",
23
+ "select": "{name} auswählen",
24
+ "open": "{name} öffnen",
25
+ "selected": "Ausgewählt: {name}",
26
+ "cancel": "Abbrechen",
27
+ "close": "Schließen",
28
+ "loadMore": "Mehr laden",
29
+ "inspect": "Informationen",
30
+ "read": "Datei lesen",
31
+ "readComplete": "Datei gelesen. Laden Sie die Daten unten herunter.",
32
+ "create": "Ordner erstellen",
33
+ "folderName": "Neuer Ordnername",
34
+ "upload": "Hochladen",
35
+ "uploadFile": "Lokale Datei auswählen",
36
+ "limit": "Lesen und Hochladen: maximal 512 KiB pro Datei. Neue Dateien werden erstellt, vorhandene nicht überschrieben.",
37
+ "selectionAdded": "Ordnerauswahl gespeichert.",
38
+ "revokedNotice": "Auswahl widerrufen.",
39
+ "created": "Ordner erstellt.",
40
+ "uploaded": "Datei hochgeladen.",
41
+ "accountChanged": "Konto oder Paket geändert. Schließen und öffnen Sie dieses Fenster erneut.",
42
+ "errorSession": "DSM-Sitzung abgelaufen. Melden Sie sich erneut bei DSM an und aktualisieren Sie die Ordner.",
43
+ "errorDenied": "Zugriff durch aktuelle DSM-Rechte oder Auswahl verweigert. Wählen Sie einen anderen Ordner.",
44
+ "errorNotFound": "Datei oder Ordner nicht mehr vorhanden. Aktualisieren Sie die Liste.",
45
+ "errorConflict": "Dieser Name existiert bereits. Wählen Sie einen anderen Namen.",
46
+ "errorUncertain": "Die Aktion wurde möglicherweise ausgeführt. Aktualisieren Sie Auswahl oder Ziel und prüfen Sie das Ergebnis vor einer erneuten Übermittlung.",
47
+ "errorInvalid": "Ungültiger Ordner, Dateiname oder Aufruf. Prüfen Sie die Eingabe.",
48
+ "errorUnavailable": "File Station ist nicht verfügbar oder der Sitzungsadapter fehlt. Aktualisieren Sie später.",
49
+ "errorLimit": "512 KiB oder ein anderes Dienstlimit überschritten. Wählen Sie eine kleinere Datei.",
50
+ "errorCanceled": "Aufruf abgebrochen. Aktualisieren Sie vor dem Fortfahren.",
51
+ "errorTimeout": "Zeitüberschreitung. Aktualisieren Sie die Liste vor dem Fortfahren.",
52
+ "metadata": "Metadaten",
53
+ "fileKind": "Datei",
54
+ "directoryKind": "Ordner",
55
+ "download": "Datei herunterladen"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "NAS folders — File Station",
3
+ "ownPermissions": "Operations use your own DSM session and current File Station permissions.",
4
+ "consent": "A saved selection records your consent; it does not grant additional DSM permissions.",
5
+ "writable": "Allow creating folders and uploading files (subject to DSM permissions)",
6
+ "readOnly": "Read only",
7
+ "unsupported": "Background jobs, offline access, streaming and atomic publish are unsupported.",
8
+ "localOnly": "Experimental: local tests only; DSM compatibility is not yet verified.",
9
+ "identityRisk": "Recreating an account with the same username and UID may retain its saved selections.",
10
+ "pathRisk": "Selections route paths; they do not pin an inode or confine symlinks and renames.",
11
+ "choose": "Choose folder",
12
+ "confirm": "Confirm selection",
13
+ "emptySelections": "No saved folders. Choose a folder to begin.",
14
+ "refresh": "Refresh folders",
15
+ "openFiles": "Browse files",
16
+ "revoke": "Revoke",
17
+ "confirmRevoke": "Confirm revoke",
18
+ "revokeWarning": "Revoke this selection to refuse new operations. Previously written data remains; canceling a request does not prove it stopped.",
19
+ "loading": "Loading…",
20
+ "emptyFolder": "This folder is empty.",
21
+ "roots": "Folders",
22
+ "back": "Back",
23
+ "select": "Select {name}",
24
+ "open": "Open {name}",
25
+ "selected": "Selected: {name}",
26
+ "cancel": "Cancel",
27
+ "close": "Close",
28
+ "loadMore": "Load more",
29
+ "inspect": "Inspect",
30
+ "read": "Read file",
31
+ "readComplete": "File read completed. Download the bytes below.",
32
+ "create": "Create folder",
33
+ "folderName": "New folder name",
34
+ "upload": "Upload",
35
+ "uploadFile": "Choose a local file",
36
+ "limit": "Single-file read and upload limit: 512 KiB. Upload creates a new file; it does not overwrite.",
37
+ "selectionAdded": "Folder selection saved.",
38
+ "revokedNotice": "Selection revoked.",
39
+ "created": "Folder created.",
40
+ "uploaded": "File uploaded.",
41
+ "accountChanged": "Account or package changed. Close and reopen this window before continuing.",
42
+ "errorSession": "Your DSM session expired. Sign in to DSM again, then refresh folders.",
43
+ "errorDenied": "Access denied by your current DSM permissions or selection. Choose another folder.",
44
+ "errorNotFound": "The file or folder no longer exists. Refresh the listing.",
45
+ "errorConflict": "A file or folder with that name already exists. Choose another name.",
46
+ "errorUncertain": "The operation may have completed. Refresh selections or the destination and inspect the result before submitting again.",
47
+ "errorInvalid": "Invalid folder, filename or request. Check the input and try again.",
48
+ "errorUnavailable": "File Station is unavailable or this package lacks the session adapter. Refresh later.",
49
+ "errorLimit": "The request exceeds the 512 KiB file limit or another service limit. Choose a smaller file.",
50
+ "errorCanceled": "Request canceled. Refresh before continuing.",
51
+ "errorTimeout": "The request timed out. Refresh the listing before continuing.",
52
+ "metadata": "Metadata",
53
+ "fileKind": "File",
54
+ "directoryKind": "Folder",
55
+ "download": "Download file"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "Carpetas NAS — File Station",
3
+ "ownPermissions": "Las operaciones usan tu sesión DSM y tus permisos actuales de File Station.",
4
+ "consent": "Una selección guardada registra tu consentimiento sin otorgar permisos DSM adicionales.",
5
+ "writable": "Permitir crear carpetas y subir archivos (requiere permisos DSM)",
6
+ "readOnly": "Solo lectura",
7
+ "unsupported": "No se admiten tareas en segundo plano, acceso sin conexión, streaming ni publicación atómica.",
8
+ "localOnly": "Experimental: solo pruebas locales; compatibilidad DSM sin verificar.",
9
+ "identityRisk": "Una cuenta recreada con el mismo nombre y UID puede conservar sus selecciones.",
10
+ "pathRisk": "Las selecciones usan rutas; no fijan inodos ni limitan enlaces simbólicos o cambios de nombre.",
11
+ "choose": "Elegir carpeta",
12
+ "confirm": "Confirmar selección",
13
+ "emptySelections": "No hay carpetas guardadas. Elige una carpeta.",
14
+ "refresh": "Actualizar carpetas",
15
+ "openFiles": "Explorar archivos",
16
+ "revoke": "Revocar",
17
+ "confirmRevoke": "Confirmar revocación",
18
+ "revokeWarning": "La revocación rechaza operaciones nuevas. Los datos escritos permanecen; cancelar una solicitud no demuestra que se detuvo.",
19
+ "loading": "Cargando…",
20
+ "emptyFolder": "Esta carpeta está vacía.",
21
+ "roots": "Carpetas",
22
+ "back": "Atrás",
23
+ "select": "Seleccionar {name}",
24
+ "open": "Abrir {name}",
25
+ "selected": "Seleccionado: {name}",
26
+ "cancel": "Cancelar",
27
+ "close": "Cerrar",
28
+ "loadMore": "Cargar más",
29
+ "inspect": "Inspeccionar",
30
+ "read": "Leer archivo",
31
+ "readComplete": "Lectura completada. Descarga los datos abajo.",
32
+ "create": "Crear carpeta",
33
+ "folderName": "Nombre de la carpeta nueva",
34
+ "upload": "Subir",
35
+ "uploadFile": "Elegir archivo local",
36
+ "limit": "Lectura y subida: máximo 512 KiB por archivo. Se crea un archivo nuevo, sin sobrescribir.",
37
+ "selectionAdded": "Selección de carpeta guardada.",
38
+ "revokedNotice": "Selección revocada.",
39
+ "created": "Carpeta creada.",
40
+ "uploaded": "Archivo subido.",
41
+ "accountChanged": "La cuenta o el paquete cambió. Cierra y vuelve a abrir esta ventana.",
42
+ "errorSession": "La sesión DSM caducó. Inicia sesión en DSM y actualiza las carpetas.",
43
+ "errorDenied": "Acceso denegado por los permisos DSM actuales o la selección. Elige otra carpeta.",
44
+ "errorNotFound": "El archivo o la carpeta ya no existe. Actualiza la lista.",
45
+ "errorConflict": "Ya existe un archivo o carpeta con ese nombre. Usa otro nombre.",
46
+ "errorUncertain": "La operación puede haber terminado. Actualiza las selecciones o el destino y comprueba el resultado antes de enviarla de nuevo.",
47
+ "errorInvalid": "Carpeta, nombre o solicitud inválidos. Revisa los datos.",
48
+ "errorUnavailable": "File Station no está disponible o falta el adaptador de sesión. Actualiza más tarde.",
49
+ "errorLimit": "Se supera el límite de 512 KiB u otro límite del servicio. Elige un archivo más pequeño.",
50
+ "errorCanceled": "Solicitud cancelada. Actualiza antes de continuar.",
51
+ "errorTimeout": "La solicitud agotó el tiempo. Actualiza la lista antes de continuar.",
52
+ "metadata": "Metadatos",
53
+ "fileKind": "Archivo",
54
+ "directoryKind": "Carpeta",
55
+ "download": "Descargar archivo"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "Dossiers NAS — File Station",
3
+ "ownPermissions": "Les opérations utilisent votre session DSM et vos droits File Station actuels.",
4
+ "consent": "Une sélection enregistrée consigne votre consentement sans accorder de droits DSM supplémentaires.",
5
+ "writable": "Autoriser la création de dossiers et le téléversement (droits DSM requis)",
6
+ "readOnly": "Lecture seule",
7
+ "unsupported": "Les tâches en arrière-plan, l’accès hors ligne, le streaming et la publication atomique ne sont pas pris en charge.",
8
+ "localOnly": "Expérimental : tests locaux uniquement ; compatibilité DSM non vérifiée.",
9
+ "identityRisk": "Un compte recréé avec le même nom et le même UID peut conserver ses sélections.",
10
+ "pathRisk": "Les sélections utilisent des chemins ; elles ne fixent pas les inodes et ne limitent ni les liens symboliques ni les renommages.",
11
+ "choose": "Choisir un dossier",
12
+ "confirm": "Confirmer la sélection",
13
+ "emptySelections": "Aucun dossier enregistré. Choisissez un dossier.",
14
+ "refresh": "Actualiser les dossiers",
15
+ "openFiles": "Parcourir les fichiers",
16
+ "revoke": "Révoquer",
17
+ "confirmRevoke": "Confirmer la révocation",
18
+ "revokeWarning": "La révocation refuse les nouvelles opérations. Les données écrites restent ; annuler une requête ne prouve pas son arrêt.",
19
+ "loading": "Chargement…",
20
+ "emptyFolder": "Ce dossier est vide.",
21
+ "roots": "Dossiers",
22
+ "back": "Retour",
23
+ "select": "Sélectionner {name}",
24
+ "open": "Ouvrir {name}",
25
+ "selected": "Sélection : {name}",
26
+ "cancel": "Annuler",
27
+ "close": "Fermer",
28
+ "loadMore": "Charger plus",
29
+ "inspect": "Informations",
30
+ "read": "Lire le fichier",
31
+ "readComplete": "Lecture terminée. Téléchargez les données ci-dessous.",
32
+ "create": "Créer un dossier",
33
+ "folderName": "Nom du nouveau dossier",
34
+ "upload": "Téléverser",
35
+ "uploadFile": "Choisir un fichier local",
36
+ "limit": "Lecture et téléversement : 512 KiB par fichier. Un nouveau fichier est créé, sans écrasement.",
37
+ "selectionAdded": "Sélection de dossier enregistrée.",
38
+ "revokedNotice": "Sélection révoquée.",
39
+ "created": "Dossier créé.",
40
+ "uploaded": "Fichier téléversé.",
41
+ "accountChanged": "Le compte ou le paquet a changé. Fermez puis rouvrez cette fenêtre.",
42
+ "errorSession": "Votre session DSM a expiré. Reconnectez-vous à DSM puis actualisez les dossiers.",
43
+ "errorDenied": "Accès refusé par vos droits DSM actuels ou la sélection. Choisissez un autre dossier.",
44
+ "errorNotFound": "Le fichier ou dossier n’existe plus. Actualisez la liste.",
45
+ "errorConflict": "Ce nom existe déjà. Choisissez un autre nom.",
46
+ "errorUncertain": "L’opération a peut-être abouti. Actualisez les sélections ou la destination et vérifiez le résultat avant de soumettre à nouveau.",
47
+ "errorInvalid": "Dossier, nom de fichier ou requête invalide. Vérifiez la saisie.",
48
+ "errorUnavailable": "File Station est indisponible ou l’adaptateur de session manque. Actualisez plus tard.",
49
+ "errorLimit": "Limite de 512 KiB ou autre limite du service dépassée. Choisissez un fichier plus petit.",
50
+ "errorCanceled": "Requête annulée. Actualisez avant de continuer.",
51
+ "errorTimeout": "Délai dépassé. Actualisez la liste avant de continuer.",
52
+ "metadata": "Métadonnées",
53
+ "fileKind": "Fichier",
54
+ "directoryKind": "Dossier",
55
+ "download": "Télécharger le fichier"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "Cartelle NAS — File Station",
3
+ "ownPermissions": "Le operazioni usano la tua sessione DSM e i permessi File Station attuali.",
4
+ "consent": "Una selezione salvata registra il consenso senza concedere ulteriori permessi DSM.",
5
+ "writable": "Consenti creazione di cartelle e caricamento di file (servono permessi DSM)",
6
+ "readOnly": "Sola lettura",
7
+ "unsupported": "Processi in background, accesso offline, streaming e pubblicazione atomica non sono supportati.",
8
+ "localOnly": "Sperimentale: solo test locali; compatibilità DSM non verificata.",
9
+ "identityRisk": "Un account ricreato con lo stesso nome e UID può conservare le selezioni.",
10
+ "pathRisk": "Le selezioni usano percorsi; non fissano inode né limitano link simbolici o rinomine.",
11
+ "choose": "Scegli cartella",
12
+ "confirm": "Conferma selezione",
13
+ "emptySelections": "Nessuna cartella salvata. Scegli una cartella.",
14
+ "refresh": "Aggiorna cartelle",
15
+ "openFiles": "Sfoglia file",
16
+ "revoke": "Revoca",
17
+ "confirmRevoke": "Conferma revoca",
18
+ "revokeWarning": "La revoca rifiuta nuove operazioni. I dati scritti restano; annullare una richiesta non dimostra che si sia fermata.",
19
+ "loading": "Caricamento…",
20
+ "emptyFolder": "Questa cartella è vuota.",
21
+ "roots": "Cartelle",
22
+ "back": "Indietro",
23
+ "select": "Seleziona {name}",
24
+ "open": "Apri {name}",
25
+ "selected": "Selezionato: {name}",
26
+ "cancel": "Annulla",
27
+ "close": "Chiudi",
28
+ "loadMore": "Carica altro",
29
+ "inspect": "Informazioni",
30
+ "read": "Leggi file",
31
+ "readComplete": "Lettura completata. Scarica i dati qui sotto.",
32
+ "create": "Crea cartella",
33
+ "folderName": "Nome della nuova cartella",
34
+ "upload": "Carica",
35
+ "uploadFile": "Scegli un file locale",
36
+ "limit": "Lettura e caricamento: massimo 512 KiB per file. Crea nuovi file senza sovrascrivere.",
37
+ "selectionAdded": "Selezione della cartella salvata.",
38
+ "revokedNotice": "Selezione revocata.",
39
+ "created": "Cartella creata.",
40
+ "uploaded": "File caricato.",
41
+ "accountChanged": "Account o pacchetto cambiato. Chiudi e riapri questa finestra.",
42
+ "errorSession": "Sessione DSM scaduta. Accedi di nuovo a DSM e aggiorna le cartelle.",
43
+ "errorDenied": "Accesso negato dai permessi DSM attuali o dalla selezione. Scegli un’altra cartella.",
44
+ "errorNotFound": "Il file o la cartella non esiste più. Aggiorna l’elenco.",
45
+ "errorConflict": "Esiste già un file o una cartella con questo nome. Scegli un altro nome.",
46
+ "errorUncertain": "L’operazione potrebbe essere completata. Aggiorna selezioni o destinazione e controlla il risultato prima di inviarla di nuovo.",
47
+ "errorInvalid": "Cartella, nome o richiesta non validi. Controlla i dati.",
48
+ "errorUnavailable": "File Station non disponibile o adattatore di sessione mancante. Aggiorna più tardi.",
49
+ "errorLimit": "Superato il limite di 512 KiB o un altro limite del servizio. Scegli un file più piccolo.",
50
+ "errorCanceled": "Richiesta annullata. Aggiorna prima di continuare.",
51
+ "errorTimeout": "Tempo scaduto. Aggiorna l’elenco prima di continuare.",
52
+ "metadata": "Metadati",
53
+ "fileKind": "File",
54
+ "directoryKind": "Cartella",
55
+ "download": "Scarica file"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "NAS フォルダー — File Station",
3
+ "ownPermissions": "自分の DSM セッションと現在の File Station 権限で操作します。",
4
+ "consent": "保存した選択は同意の記録であり、DSM 権限を追加しません。",
5
+ "writable": "フォルダー作成とアップロードを許可(DSM 権限が必要)",
6
+ "readOnly": "読み取り専用",
7
+ "unsupported": "バックグラウンド処理、オフラインアクセス、ストリーミング、アトミック公開は非対応です。",
8
+ "localOnly": "実験機能:ローカルテストのみ。DSM 互換性は未検証です。",
9
+ "identityRisk": "同じユーザー名と UID でアカウントを再作成すると選択が残る場合があります。",
10
+ "pathRisk": "選択はパスを使用し、inode の固定やシンボリックリンク・名前変更の制限は行いません。",
11
+ "choose": "フォルダーを選択",
12
+ "confirm": "選択を確定",
13
+ "emptySelections": "保存したフォルダーはありません。フォルダーを選択してください。",
14
+ "refresh": "フォルダーを更新",
15
+ "openFiles": "ファイルを参照",
16
+ "revoke": "取り消す",
17
+ "confirmRevoke": "取り消しを確定",
18
+ "revokeWarning": "取り消すと新しい操作を拒否します。書き込み済みデータは残り、リクエストのキャンセルは停止の証明になりません。",
19
+ "loading": "読み込み中…",
20
+ "emptyFolder": "空のフォルダーです。",
21
+ "roots": "フォルダー",
22
+ "back": "戻る",
23
+ "select": "{name} を選択",
24
+ "open": "{name} を開く",
25
+ "selected": "選択済み:{name}",
26
+ "cancel": "キャンセル",
27
+ "close": "閉じる",
28
+ "loadMore": "さらに読み込む",
29
+ "inspect": "情報を表示",
30
+ "read": "ファイルを読む",
31
+ "readComplete": "読み取りが完了しました。以下からダウンロードできます。",
32
+ "create": "フォルダーを作成",
33
+ "folderName": "新しいフォルダー名",
34
+ "upload": "アップロード",
35
+ "uploadFile": "ローカルファイルを選択",
36
+ "limit": "読み取り・アップロードは 1 ファイル 512 KiB まで。新規ファイルを作成し、上書きしません。",
37
+ "selectionAdded": "フォルダーの選択を保存しました。",
38
+ "revokedNotice": "選択を取り消しました。",
39
+ "created": "フォルダーを作成しました。",
40
+ "uploaded": "ファイルをアップロードしました。",
41
+ "accountChanged": "アカウントまたはパッケージが変わりました。ウィンドウを閉じて開き直してください。",
42
+ "errorSession": "DSM セッションが期限切れです。DSM に再ログインし、フォルダーを更新してください。",
43
+ "errorDenied": "現在の DSM 権限または選択でアクセスが拒否されました。別のフォルダーを選んでください。",
44
+ "errorNotFound": "ファイルまたはフォルダーがありません。一覧を更新してください。",
45
+ "errorConflict": "同名のファイルまたはフォルダーがあります。別の名前を指定してください。",
46
+ "errorUncertain": "操作が完了した可能性があります。再送信する前に選択または保存先を更新し、結果を確認してください。",
47
+ "errorInvalid": "フォルダー、ファイル名またはリクエストが無効です。入力を確認してください。",
48
+ "errorUnavailable": "File Station が利用できないか、このパッケージにセッション adapter がありません。後で更新してください。",
49
+ "errorLimit": "512 KiB またはサービスの上限を超えました。小さいファイルを選んでください。",
50
+ "errorCanceled": "リクエストをキャンセルしました。更新してから続けてください。",
51
+ "errorTimeout": "リクエストがタイムアウトしました。一覧を更新してください。",
52
+ "metadata": "情報",
53
+ "fileKind": "ファイル",
54
+ "directoryKind": "フォルダー",
55
+ "download": "ファイルをダウンロード"
56
+ }