@synopackageland/cli 0.6.0 → 0.7.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 (585) hide show
  1. package/CHANGELOG.md +613 -0
  2. package/README.md +81 -78
  3. package/dist/add.js +39 -16
  4. package/dist/authorization-sdk.d.ts +7 -0
  5. package/dist/authorization-sdk.js +7 -0
  6. package/dist/build-spk/delegate-scope.d.ts +6 -0
  7. package/dist/build-spk/delegate-scope.js +34 -0
  8. package/dist/build-spk/dsm-arch.d.ts +7 -1
  9. package/dist/build-spk/dsm-arch.js +24 -28
  10. package/dist/build-spk/dsm-platforms.json +39 -0
  11. package/dist/build-spk/dsm-version.d.ts +11 -0
  12. package/dist/build-spk/dsm-version.js +17 -0
  13. package/dist/build-spk/gateway.d.ts +1 -1
  14. package/dist/build-spk/gateway.js +2 -2
  15. package/dist/build-spk/generator.js +30 -5
  16. package/dist/build-spk/notices.js +4 -1
  17. package/dist/build-spk/resource-worker.js +3 -0
  18. package/dist/build-spk/wizard-messages.d.ts +66 -0
  19. package/dist/build-spk/wizard-messages.js +75 -9
  20. package/dist/cli.js +30 -18
  21. package/dist/contract/schema-validate.js +8 -0
  22. package/dist/contract/validate.js +30 -0
  23. package/dist/deploy/deploy.d.ts +1 -1
  24. package/dist/deploy/deploy.js +8 -0
  25. package/dist/deploy/plan.js +1 -1
  26. package/dist/deploy/spk-version.js +1 -1
  27. package/dist/error-registry.js +46 -13
  28. package/dist/host/dsm-client.d.ts +8 -4
  29. package/dist/host/dsm-client.js +10 -4
  30. package/dist/host/types.d.ts +2 -1
  31. package/dist/info.js +18 -2
  32. package/dist/init.d.ts +3 -0
  33. package/dist/init.js +49 -18
  34. package/dist/package-metadata.d.ts +21 -0
  35. package/dist/package-metadata.js +101 -0
  36. package/dist/portal/alias.d.ts +25 -0
  37. package/dist/portal/alias.js +48 -0
  38. package/dist/portal/package.d.ts +33 -0
  39. package/dist/portal/package.js +116 -0
  40. package/dist/runtime/delegate-contract.d.ts +79 -0
  41. package/dist/runtime/delegate-contract.js +27 -0
  42. package/dist/runtime/executor-build.d.ts +1 -1
  43. package/dist/runtime/executor-build.js +5 -4
  44. package/dist/runtime/executor-inspect.d.ts +3 -0
  45. package/dist/runtime/executor-inspect.js +11 -5
  46. package/dist/runtime/executor-policy.d.ts +12 -0
  47. package/dist/runtime/executor-policy.js +43 -3
  48. package/dist/runtime/executor-scope-task.d.ts +4 -0
  49. package/dist/runtime/executor-scope-task.js +21 -0
  50. package/dist/runtime/executor-tasks.d.ts +2 -1
  51. package/dist/runtime/executor-tasks.js +4 -4
  52. package/dist/skill.js +1 -0
  53. package/dist/standalone/api-permissions.d.ts +10 -0
  54. package/dist/standalone/api-permissions.js +19 -2
  55. package/dist/standalone/background.d.ts +16 -0
  56. package/dist/standalone/background.js +69 -2
  57. package/dist/standalone/binary.d.ts +1 -1
  58. package/dist/standalone/binary.js +22 -8
  59. package/dist/standalone/build.d.ts +1 -1
  60. package/dist/standalone/build.js +38 -8
  61. package/dist/standalone/daemon.d.ts +1 -1
  62. package/dist/standalone/daemon.js +2 -1
  63. package/dist/standalone/dsm-window.d.ts +3 -1
  64. package/dist/standalone/dsm-window.js +72 -15
  65. package/dist/standalone/inspect-spk.d.ts +9 -1
  66. package/dist/standalone/inspect-spk.js +119 -26
  67. package/dist/standalone/lifecycle.js +86 -8
  68. package/dist/standalone/manifest.d.ts +13 -0
  69. package/dist/standalone/manifest.js +57 -8
  70. package/dist/standalone/native-authorization-window.d.ts +2 -0
  71. package/dist/standalone/native-authorization-window.js +30 -0
  72. package/dist/standalone/native-layout.d.ts +82 -0
  73. package/dist/standalone/native-layout.js +377 -0
  74. package/dist/standalone/native-root-window.d.ts +26 -0
  75. package/dist/standalone/native-root-window.js +282 -0
  76. package/dist/standalone/portal-window.d.ts +21 -0
  77. package/dist/standalone/portal-window.js +155 -0
  78. package/dist/standalone/portal.d.ts +4 -0
  79. package/dist/standalone/portal.js +4 -0
  80. package/dist/standalone/resource.d.ts +5 -3
  81. package/dist/standalone/resource.js +6 -3
  82. package/dist/standalone/root-window.js +62 -15
  83. package/dist/standalone/spk.d.ts +1 -1
  84. package/dist/standalone/spk.js +25 -7
  85. package/dist/templates/_daemon/main_test.go +61 -8
  86. package/dist/templates/_executor/README.md +127 -16
  87. package/dist/templates/_executor/anchor.go +146 -0
  88. package/dist/templates/_executor/anchor_test.go +126 -0
  89. package/dist/templates/_executor/apppriv_review_test.go +1 -1
  90. package/dist/templates/_executor/cancel_contract_test.go +236 -0
  91. package/dist/templates/_executor/copy.go +64 -0
  92. package/dist/templates/_executor/copy_test.go +88 -0
  93. package/dist/templates/_executor/dsm.go +23 -10
  94. package/dist/templates/_executor/dsm_test.go +95 -1
  95. package/dist/templates/_executor/executor.go +260 -49
  96. package/dist/templates/_executor/executor_test.go +36 -6
  97. package/dist/templates/_executor/identity.go +27 -1
  98. package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
  99. package/dist/templates/_executor/identity_linux.go +82 -0
  100. package/dist/templates/_executor/identity_security_test.go +43 -0
  101. package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  102. package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  103. package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
  104. package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  105. package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
  106. package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
  107. package/dist/templates/_executor/lifecycle_test.go +11 -0
  108. package/dist/templates/_executor/link_linux.go +28 -0
  109. package/dist/templates/_executor/long_running_test.go +530 -0
  110. package/dist/templates/_executor/main.go +72 -20
  111. package/dist/templates/_executor/move_linux.go +490 -0
  112. package/dist/templates/_executor/move_linux_test.go +460 -0
  113. package/dist/templates/_executor/move_validation.go +46 -0
  114. package/dist/templates/_executor/move_validation_test.go +187 -0
  115. package/dist/templates/_executor/operations.go +926 -0
  116. package/dist/templates/_executor/platform_linux.go +24 -173
  117. package/dist/templates/_executor/platform_linux_test.go +9 -65
  118. package/dist/templates/_executor/platform_other.go +30 -4
  119. package/dist/templates/_executor/process.go +3 -0
  120. package/dist/templates/_executor/records.go +242 -0
  121. package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
  122. package/dist/templates/_executor/scope_client.go +37 -0
  123. package/dist/templates/_executor/scope_contract.go +12 -0
  124. package/dist/templates/_executor/selected_scope.go +146 -0
  125. package/dist/templates/_executor/selected_scope_test.go +186 -0
  126. package/dist/templates/_executor/status_disabled_test.go +33 -0
  127. package/dist/templates/_executor/store.go +4 -3
  128. package/dist/templates/_executor/supervise.go +109 -0
  129. package/dist/templates/_executor/supervise_test.go +130 -0
  130. package/dist/templates/_executor/task_race_review_test.go +1 -1
  131. package/dist/templates/_executor/tasks.go +7 -8
  132. package/dist/templates/_executor/tasks_review_test.go +1 -1
  133. package/dist/templates/_executor/tasks_test.go +4 -4
  134. package/dist/templates/_executor/watch.go +8 -0
  135. package/dist/templates/_executor/watch_test.go +23 -2
  136. package/dist/templates/_executor/write_review_linux_test.go +4 -12
  137. package/dist/templates/_shared/AGENTS.md +129 -0
  138. package/dist/templates/binary/dsm-package.yaml +24 -0
  139. package/dist/templates/binary/i18n/messages/de.json +4 -0
  140. package/dist/templates/binary/i18n/messages/en.json +4 -0
  141. package/dist/templates/binary/i18n/messages/es.json +4 -0
  142. package/dist/templates/binary/i18n/messages/fr.json +4 -0
  143. package/dist/templates/binary/i18n/messages/it.json +4 -0
  144. package/dist/templates/binary/i18n/messages/ja.json +4 -0
  145. package/dist/templates/binary/i18n/messages/ko.json +4 -0
  146. package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
  147. package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
  148. package/dist/templates/binary/ui/app.js +19 -4
  149. package/dist/templates/native-authorization/AuthorizationGate.vue +91 -0
  150. package/dist/templates/native-authorization/i18n/de.json +37 -0
  151. package/dist/templates/native-authorization/i18n/en.json +37 -0
  152. package/dist/templates/native-authorization/i18n/es.json +37 -0
  153. package/dist/templates/native-authorization/i18n/fr.json +37 -0
  154. package/dist/templates/native-authorization/i18n/index.ts +15 -0
  155. package/dist/templates/native-authorization/i18n/it.json +37 -0
  156. package/dist/templates/native-authorization/i18n/ja.json +37 -0
  157. package/dist/templates/native-authorization/i18n/ko.json +37 -0
  158. package/dist/templates/native-authorization/i18n/zh-CN.json +37 -0
  159. package/dist/templates/native-authorization/i18n/zh-TW.json +37 -0
  160. package/dist/templates/native-go/README.md +43 -10
  161. package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
  162. package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
  163. package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  164. package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
  165. package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  166. package/dist/templates/native-go/backend/internal/api/server.go +18 -5
  167. package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  168. package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  169. package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
  170. package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
  171. package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
  172. package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
  173. package/dist/templates/native-go/backend/internal/background/store.go +16 -14
  174. package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
  175. package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  176. package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  177. package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  178. package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  179. package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  180. package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  181. package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
  182. package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  183. package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  184. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  185. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  186. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  187. package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  188. package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  189. package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  190. package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  191. package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  192. package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  193. package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
  194. package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
  195. package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  196. package/dist/templates/native-go/dsm-package.yaml +20 -1
  197. package/dist/templates/native-go/i18n/glossary.json +2 -1
  198. package/dist/templates/native-go/i18n/messages/de.json +1 -0
  199. package/dist/templates/native-go/i18n/messages/en.json +1 -0
  200. package/dist/templates/native-go/i18n/messages/es.json +1 -0
  201. package/dist/templates/native-go/i18n/messages/fr.json +1 -0
  202. package/dist/templates/native-go/i18n/messages/it.json +1 -0
  203. package/dist/templates/native-go/i18n/messages/ja.json +1 -0
  204. package/dist/templates/native-go/i18n/messages/ko.json +1 -0
  205. package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
  206. package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
  207. package/dist/templates/native-go/ui/app.css +10 -0
  208. package/dist/templates/native-go/ui/app.js +11 -1
  209. package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
  210. package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  211. package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  212. package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  213. package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  214. package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  215. package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  216. package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  217. package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  218. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  219. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  220. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  221. package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  222. package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  223. package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  224. package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  225. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  226. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  227. package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  228. package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  229. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  230. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  231. package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  232. package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  233. package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  234. package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  235. package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  236. package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  237. package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  238. package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  239. package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  240. package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  241. package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  242. package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  243. package/dist/templates/native-go-delegate/test.sh +1 -0
  244. package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  245. package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  246. package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  247. package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  248. package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  249. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  250. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  251. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  252. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  253. package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  254. package/dist/templates/native-go-vue/README.md +4 -0
  255. package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
  256. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  257. package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
  258. package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
  259. package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +52 -8
  260. package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  261. package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  262. package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  263. package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +4 -2
  264. package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  265. package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  266. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +46 -0
  267. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +12 -2
  268. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +46 -0
  269. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +46 -0
  270. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +46 -0
  271. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +46 -0
  272. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +46 -0
  273. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  274. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  275. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  276. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  277. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  278. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  279. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  280. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  281. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  282. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +46 -0
  283. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +15 -5
  284. package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  285. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  286. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  287. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  288. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  289. package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  290. package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  291. package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  292. package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  293. package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  294. package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  295. package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  296. package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  297. package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  298. package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  299. package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  300. package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  301. package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  302. package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  303. package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  304. package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  305. package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  306. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  307. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  308. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  309. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  310. package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  311. package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  312. package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  313. package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  314. package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  315. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  316. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  317. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  318. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  319. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  320. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  321. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  322. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  323. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  324. package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  325. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  326. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  327. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  328. package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  329. package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
  330. package/dist/validate.js +2 -1
  331. package/package.json +12 -2
  332. package/schema/package-metadata.schema.json +101 -0
  333. package/schema/synology-app.schema.json +112 -0
  334. package/skills/SKILL.md +109 -3
  335. package/skills/reference/create.md +101 -2
  336. package/skills/reference/deploy.md +2 -2
  337. package/skills/reference/files.md +113 -2
  338. package/skills/reference/identity.md +70 -1
  339. package/skills/reference/portal.md +17 -0
  340. package/skills/reference/ui-vue.md +12 -0
  341. package/templates/_daemon/main_test.go +61 -8
  342. package/templates/_executor/README.md +127 -16
  343. package/templates/_executor/anchor.go +146 -0
  344. package/templates/_executor/anchor_test.go +126 -0
  345. package/templates/_executor/apppriv_review_test.go +1 -1
  346. package/templates/_executor/cancel_contract_test.go +236 -0
  347. package/templates/_executor/copy.go +64 -0
  348. package/templates/_executor/copy_test.go +88 -0
  349. package/templates/_executor/dsm.go +23 -10
  350. package/templates/_executor/dsm_test.go +95 -1
  351. package/templates/_executor/executor.go +260 -49
  352. package/templates/_executor/executor_test.go +36 -6
  353. package/templates/_executor/identity.go +27 -1
  354. package/templates/_executor/identity_kernel_linux_test.go +60 -0
  355. package/templates/_executor/identity_linux.go +82 -0
  356. package/templates/_executor/identity_security_test.go +43 -0
  357. package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  358. package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  359. package/templates/_executor/internal/taskscript/boot.sh +9 -9
  360. package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  361. package/templates/_executor/internal/taskscript/control.sh +15 -10
  362. package/templates/_executor/internal/taskscript/tasks.go +5 -3
  363. package/templates/_executor/lifecycle_test.go +11 -0
  364. package/templates/_executor/link_linux.go +28 -0
  365. package/templates/_executor/long_running_test.go +530 -0
  366. package/templates/_executor/main.go +72 -20
  367. package/templates/_executor/move_linux.go +490 -0
  368. package/templates/_executor/move_linux_test.go +460 -0
  369. package/templates/_executor/move_validation.go +46 -0
  370. package/templates/_executor/move_validation_test.go +187 -0
  371. package/templates/_executor/operations.go +926 -0
  372. package/templates/_executor/platform_linux.go +24 -173
  373. package/templates/_executor/platform_linux_test.go +9 -65
  374. package/templates/_executor/platform_other.go +30 -4
  375. package/templates/_executor/process.go +3 -0
  376. package/templates/_executor/records.go +242 -0
  377. package/templates/_executor/scope_cancel_contract_test.go +91 -0
  378. package/templates/_executor/scope_client.go +37 -0
  379. package/templates/_executor/scope_contract.go +12 -0
  380. package/templates/_executor/selected_scope.go +146 -0
  381. package/templates/_executor/selected_scope_test.go +186 -0
  382. package/templates/_executor/status_disabled_test.go +33 -0
  383. package/templates/_executor/store.go +4 -3
  384. package/templates/_executor/supervise.go +109 -0
  385. package/templates/_executor/supervise_test.go +130 -0
  386. package/templates/_executor/task_race_review_test.go +1 -1
  387. package/templates/_executor/tasks.go +7 -8
  388. package/templates/_executor/tasks_review_test.go +1 -1
  389. package/templates/_executor/tasks_test.go +4 -4
  390. package/templates/_executor/watch.go +8 -0
  391. package/templates/_executor/watch_test.go +23 -2
  392. package/templates/_executor/write_review_linux_test.go +4 -12
  393. package/templates/_shared/AGENTS.md +129 -0
  394. package/templates/binary/dsm-package.yaml +24 -0
  395. package/templates/binary/i18n/messages/de.json +4 -0
  396. package/templates/binary/i18n/messages/en.json +4 -0
  397. package/templates/binary/i18n/messages/es.json +4 -0
  398. package/templates/binary/i18n/messages/fr.json +4 -0
  399. package/templates/binary/i18n/messages/it.json +4 -0
  400. package/templates/binary/i18n/messages/ja.json +4 -0
  401. package/templates/binary/i18n/messages/ko.json +4 -0
  402. package/templates/binary/i18n/messages/zh-CN.json +4 -0
  403. package/templates/binary/i18n/messages/zh-TW.json +4 -0
  404. package/templates/binary/ui/app.js +19 -4
  405. package/templates/native-authorization/AuthorizationGate.vue +91 -0
  406. package/templates/native-authorization/i18n/de.json +37 -0
  407. package/templates/native-authorization/i18n/en.json +37 -0
  408. package/templates/native-authorization/i18n/es.json +37 -0
  409. package/templates/native-authorization/i18n/fr.json +37 -0
  410. package/templates/native-authorization/i18n/index.ts +15 -0
  411. package/templates/native-authorization/i18n/it.json +37 -0
  412. package/templates/native-authorization/i18n/ja.json +37 -0
  413. package/templates/native-authorization/i18n/ko.json +37 -0
  414. package/templates/native-authorization/i18n/zh-CN.json +37 -0
  415. package/templates/native-authorization/i18n/zh-TW.json +37 -0
  416. package/templates/native-go/README.md +43 -10
  417. package/templates/native-go/backend/cmd/app/main.go +27 -7
  418. package/templates/native-go/backend/internal/api/entry_test.go +47 -0
  419. package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  420. package/templates/native-go/backend/internal/api/registry.go +11 -0
  421. package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  422. package/templates/native-go/backend/internal/api/server.go +18 -5
  423. package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  424. package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  425. package/templates/native-go/backend/internal/app/portal.go +30 -0
  426. package/templates/native-go/backend/internal/app/portal_test.go +55 -0
  427. package/templates/native-go/backend/internal/app/routes.go +8 -2
  428. package/templates/native-go/backend/internal/background/runner.go +1 -1
  429. package/templates/native-go/backend/internal/background/store.go +16 -14
  430. package/templates/native-go/backend/internal/dsm/admin.go +8 -2
  431. package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  432. package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  433. package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  434. package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  435. package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  436. package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  437. package/templates/native-go/backend/internal/dsm/entry.go +177 -0
  438. package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  439. package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  440. package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  441. package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  442. package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  443. package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  444. package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  445. package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  446. package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  447. package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  448. package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  449. package/templates/native-go/backend/internal/filestation/service.go +1 -1
  450. package/templates/native-go/backend/internal/portal/portal.go +138 -0
  451. package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  452. package/templates/native-go/dsm-package.yaml +20 -1
  453. package/templates/native-go/i18n/glossary.json +2 -1
  454. package/templates/native-go/i18n/messages/de.json +1 -0
  455. package/templates/native-go/i18n/messages/en.json +1 -0
  456. package/templates/native-go/i18n/messages/es.json +1 -0
  457. package/templates/native-go/i18n/messages/fr.json +1 -0
  458. package/templates/native-go/i18n/messages/it.json +1 -0
  459. package/templates/native-go/i18n/messages/ja.json +1 -0
  460. package/templates/native-go/i18n/messages/ko.json +1 -0
  461. package/templates/native-go/i18n/messages/zh-CN.json +1 -0
  462. package/templates/native-go/i18n/messages/zh-TW.json +1 -0
  463. package/templates/native-go/ui/app.css +10 -0
  464. package/templates/native-go/ui/app.js +11 -1
  465. package/templates/native-go-delegate/DELEGATE.md +126 -5
  466. package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  467. package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  468. package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  469. package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  470. package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  471. package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  472. package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  473. package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  474. package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  475. package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  476. package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  477. package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  478. package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  479. package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  480. package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  481. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  482. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  483. package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  484. package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  485. package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  486. package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  487. package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  488. package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  489. package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  490. package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  491. package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  492. package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  493. package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  494. package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  495. package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  496. package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  497. package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  498. package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  499. package/templates/native-go-delegate/test.sh +1 -0
  500. package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  501. package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  502. package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  503. package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  504. package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  505. package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  506. package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  507. package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  508. package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  509. package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  510. package/templates/native-go-vue/README.md +4 -0
  511. package/templates/native-go-vue/frontend/package-lock.json +4 -4
  512. package/templates/native-go-vue/frontend/package.json +1 -1
  513. package/templates/native-go-vue/frontend/src/App.vue +18 -13
  514. package/templates/native-go-vue/frontend/src/context.ts +31 -0
  515. package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +52 -8
  516. package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  517. package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  518. package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  519. package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +4 -2
  520. package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  521. package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  522. package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +46 -0
  523. package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +12 -2
  524. package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +46 -0
  525. package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +46 -0
  526. package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +46 -0
  527. package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +46 -0
  528. package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +46 -0
  529. package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  530. package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  531. package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  532. package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  533. package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  534. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  535. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  536. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  537. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  538. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +46 -0
  539. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +15 -5
  540. package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  541. package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  542. package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  543. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  544. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  545. package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  546. package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  547. package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  548. package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  549. package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  550. package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  551. package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  552. package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  553. package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  554. package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  555. package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  556. package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  557. package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  558. package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  559. package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  560. package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  561. package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  562. package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  563. package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  564. package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  565. package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  566. package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  567. package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  568. package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  569. package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  570. package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  571. package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  572. package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  573. package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  574. package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  575. package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  576. package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  577. package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  578. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  579. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  580. package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  581. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  582. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  583. package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  584. package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  585. package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
@@ -0,0 +1,46 @@
1
+ {
2
+ "title": "后台文件访问",
3
+ "help": "关闭 App 后下载仍会继续。每项任务只能在一小时内写入所选的文件夹,现有文件绝不会被替换。",
4
+ "setupTitle": "管理员设置",
5
+ "setupHelp": "批准一次,让 App 在用户离线时也能完成文件任务。",
6
+ "password": "DSM 密码",
7
+ "authorize": "批准后台文件访问",
8
+ "confirmShare": "确认共享文件夹",
9
+ "scopeNeeds": "共享文件夹尚待确认。请在下方选择共享文件夹,并输入 DSM 密码确认。",
10
+ "ready": "后台文件访问已就绪。",
11
+ "needs": "需要管理员批准后台文件访问。",
12
+ "blocked": "后台文件访问不可用,请管理员检查 App 设置。",
13
+ "refresh": "刷新",
14
+ "revoke": "撤销",
15
+ "cancel": "取消任务",
16
+ "noDelegations": "目前没有有效委托。",
17
+ "delegations": "我的委托",
18
+ "expires": "到期时间",
19
+ "downloads": "我的下载",
20
+ "noJobs": "目前没有下载任务。",
21
+ "url": "下载网址",
22
+ "name": "文件名",
23
+ "choose": "选择文件夹",
24
+ "submit": "下载到我的文件夹",
25
+ "destination": "目标文件夹",
26
+ "pending": "任务已取消。委托撤销尚未完成,App 将自动重试。",
27
+ "error": "操作未完成,请刷新后重试。若持续失败,请联系管理员。",
28
+ "setupError": "批准未完成,请重新输入 DSM 密码后重试,或检查 App 设置。",
29
+ "denied": "访问被拒绝,请检查文件夹权限后重试。",
30
+ "session": "请重新登录 DSM,然后刷新。",
31
+ "size": "下载上限为 64 MB、60 秒。",
32
+ "queued": "等待中",
33
+ "running": "下载中",
34
+ "succeeded": "已保存",
35
+ "failed": "失败",
36
+ "canceled": "已取消",
37
+ "interrupted": "已中断",
38
+ "homeScope": "各用户的 home 文件夹",
39
+ "scopeLabel": "后台保存范围",
40
+ "protectedScope": "已确认范围",
41
+ "preselection": "安装时的预选",
42
+ "preselectionHelp": "安装时的预选仅供参考。启用后台访问时,请用 DSM 密码确认此范围。",
43
+ "scopeMismatch": "安装时的预选与已确认范围不同。后台保存将按已确认范围执行。",
44
+ "scopeChangeHelp": "更改范围会撤销现有目标,并取消待完成的保存。用户必须重新选择目标。已保存的文件会保留。",
45
+ "confirmScope": "确认更改范围"
46
+ }
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "title": "背景檔案存取",
3
- "help": "關閉 App 後下載仍會繼續。每項工作只能寫入您選取的資料夾,委託最長一小時,不會取代既有檔案。",
3
+ "help": "關閉 App 後下載仍會繼續。每項工作只能在一小時內寫入所選的資料夾,既有檔案一律不會被取代。",
4
4
  "setupTitle": "管理員設定",
5
- "setupHelp": "核准一次,讓 App 在使用者離線後完成檔案工作。",
5
+ "setupHelp": "核准一次,讓 App 在使用者離線時也能完成檔案工作。",
6
6
  "password": "DSM 密碼",
7
7
  "authorize": "核准背景檔案存取",
8
+ "confirmShare": "確認共用資料夾",
9
+ "scopeNeeds": "共用資料夾尚待確認。請在下方選擇共用資料夾,並輸入 DSM 密碼確認。",
8
10
  "ready": "背景檔案存取已就緒。",
9
11
  "needs": "需要管理員核准背景檔案存取。",
10
12
  "blocked": "背景檔案存取無法使用,請管理員檢查 App 設定。",
@@ -21,16 +23,24 @@
21
23
  "choose": "選擇資料夾",
22
24
  "submit": "下載到我的資料夾",
23
25
  "destination": "目的資料夾",
24
- "pending": "工作已取消,委託撤銷待完成,App 將自動重試。",
26
+ "pending": "工作已取消。委託尚未撤銷完成,App 會自動重試。",
25
27
  "error": "操作未完成,請重新整理後再試。若持續失敗,請聯絡管理員。",
26
28
  "setupError": "核准未完成,請重新輸入 DSM 密碼再試,或檢查 App 設定。",
27
29
  "denied": "存取遭拒,請檢查資料夾權限後再試。",
28
30
  "session": "請重新登入 DSM,再重新整理。",
29
- "size": "下載上限為 64 MiB、60 秒。",
31
+ "size": "下載上限為 64 MB、60 秒。",
30
32
  "queued": "等待中",
31
33
  "running": "下載中",
32
34
  "succeeded": "已儲存",
33
35
  "failed": "失敗",
34
36
  "canceled": "已取消",
35
- "interrupted": "已中斷"
37
+ "interrupted": "已中斷",
38
+ "homeScope": "各使用者的 home 資料夾",
39
+ "scopeLabel": "背景儲存範圍",
40
+ "protectedScope": "已確認範圍",
41
+ "preselection": "安裝時的預選",
42
+ "preselectionHelp": "安裝時的預選只供參考。啟用背景存取時,請以 DSM 密碼確認這個範圍。",
43
+ "scopeMismatch": "安裝時的預選與已確認範圍不同。背景儲存會依已確認範圍執行。",
44
+ "scopeChangeHelp": "更換範圍會撤銷既有目的地,並取消待完成的儲存。使用者必須重新選擇目的地。已儲存的檔案會保留。",
45
+ "confirmScope": "確認更換範圍"
36
46
  }
@@ -0,0 +1,57 @@
1
+ // Portable copies of the frozen W1 DTOs in src/runtime/delegate-contract.ts.
2
+ // The generated frontend cannot import CLI source. Contract tests check parity.
3
+ export interface SelectDestination {key:string;path:string}
4
+ // The executor supplies selection; installation draft is display-only.
5
+ export interface ScopeSelection {scope:string;root:string;generation:number}
6
+ export interface DestinationState {
7
+ key:string
8
+ selection:ScopeSelection|null
9
+ destination:DestinationGrant|null
10
+ status:'active'|'missing'|'reselection-required'|'needs-scope-confirmation'|'disabled'
11
+ }
12
+ export interface DestinationGrant {
13
+ id:string
14
+ key:string
15
+ path:string
16
+ username:string
17
+ lifetime:'until-revoked'
18
+ }
19
+ export type DelegateOperationState='queued'|'copying'|'committed'|'canceled'|'interrupted'|'uncertain'
20
+ export interface OperationRef {delegation_id:string;job_id:string}
21
+ export interface OperationResult {
22
+ job_id:string
23
+ state:DelegateOperationState
24
+ receipt?:{path:string;size:number}
25
+ code?:string
26
+ reason?:string
27
+ }
28
+ export interface MoveFromStaging {
29
+ delegation_id:string
30
+ job_id:string
31
+ staging:string
32
+ name:string
33
+ size:number
34
+ }
35
+ // Display metadata comes from App-owned jobs; only OperationResult is executor evidence.
36
+ export interface SaveOperation extends OperationResult,OperationRef {name:string}
37
+ // createBackgroundSaveFacade binds these methods to W2 and App-owned metadata.
38
+ // No method accepts an owner/UID selector.
39
+ export interface BackgroundSaveStatus {disabled:boolean;selection?:ScopeSelection|null;scopeMode?:string;preselection?:string;mismatch?:boolean}
40
+ export interface DestinationSelection {
41
+ key:string
42
+ selectDestination(input:SelectDestination):Promise<DestinationGrant>
43
+ }
44
+ export interface BackgroundSaveFacade {
45
+ destination(key:string):Promise<DestinationState>
46
+ exportExample(input:{key:string;job_id:string}):Promise<OperationRef>
47
+ selectDestination(input:SelectDestination):Promise<DestinationGrant>
48
+ status():Promise<BackgroundSaveStatus>
49
+ list():Promise<DestinationGrant[]>
50
+ operations():Promise<SaveOperation[]>
51
+ revoke(input:{delegation_id:string}):Promise<{revoked:true}>
52
+ // Same-ref and idempotent. copying+CANCEL_REQUESTED is an accepted cancel, not
53
+ // completion: poll operations() until canceled, or committed if publish won.
54
+ cancel(input:OperationRef):Promise<OperationResult>
55
+ disable():Promise<{disabled:true}>
56
+ enable():Promise<{disabled:false}>
57
+ }
@@ -0,0 +1,12 @@
1
+ import {expect,test} from 'vitest'
2
+ import {saveCopy,saveError} from './save-copy'
3
+ test('formal executor refusals explain destination and identity recovery in every locale',()=>{
4
+ for(const locale of ['en','zh-TW','zh-CN','ja','ko','de','fr','es','it']){
5
+ const copy=saveCopy(locale)
6
+ expect(saveError({code:'destination-exists'},copy)).toBe(copy.conflict)
7
+ expect(saveError({code:'DELEGATION_DENIED'},copy)).toBe(copy.denied)
8
+ expect(saveError({code:'IDENTITY_CHANGED'},copy)).toBe(copy.denied)
9
+ expect(saveError({code:'NO_SPACE'},copy)).toBe(copy.space)
10
+ expect(saveError({code:'EXECUTOR_TIMEOUT'},copy)).toBe(copy.error)
11
+ }
12
+ })
@@ -0,0 +1,24 @@
1
+ // Background-save copy is separate from the legacy download copy in ./i18n.
2
+ import {uiLocale} from '../nas/locale'
3
+ import en from './i18n/save/en.json'
4
+ import zhTW from './i18n/save/zh-TW.json'
5
+ import zhCN from './i18n/save/zh-CN.json'
6
+ import ja from './i18n/save/ja.json'
7
+ import ko from './i18n/save/ko.json'
8
+ import de from './i18n/save/de.json'
9
+ import fr from './i18n/save/fr.json'
10
+ import es from './i18n/save/es.json'
11
+ import it from './i18n/save/it.json'
12
+ const catalogs:Record<string,typeof en>={en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
13
+ export function saveCopy(locale='en'){return catalogs[uiLocale(locale)]!}
14
+ export function saveError(error:unknown,copy=saveCopy()){
15
+ const code=(error as {code?:string})?.code
16
+ if(code==='disabled')return copy.disabled
17
+ if(['EXECUTOR_UNAVAILABLE','needs-admin-approval','needs-scope-confirmation'].includes(code??''))return copy.needs
18
+ if(['session_required','dsm_session_required','AUTH_DENIED'].includes(code??''))return copy.session
19
+ if(['DENIED','DELEGATION_DENIED','IDENTITY_CHANGED','PERMISSION_DENIED','SCOPE_DENIED','APP_DENIED','INELIGIBLE','DESTINATION_CHANGED','denied','grant-revoked','identity-changed','permission-changed'].includes(code??''))return copy.denied
20
+ if(['CONFLICT','conflict','file-exists','destination-exists'].includes(code??''))return copy.conflict
21
+ if(['NO_SPACE','ENOSPC','no-space'].includes(code??''))return copy.space
22
+ if(['uncertain','commit-uncertain'].includes(code??''))return copy.uncertainHelp
23
+ return copy.error
24
+ }
@@ -0,0 +1,12 @@
1
+ import {expect,test,vi} from 'vitest'
2
+ import {scopedPicker} from './scoped-picker'
3
+ import type {NasProvider} from '../nas/contract'
4
+ test('the picker exposes only the confirmed root and refuses traversal before contacting DSM',async()=>{
5
+ const entry={name:'reports',path:'/reports',isDir:true},signal=new AbortController().signal
6
+ const source={info:vi.fn(async()=>entry),shares:vi.fn(),list:vi.fn(async()=>({entries:[entry],offset:0,total:1})),createFolder:vi.fn(),dispose:vi.fn()} as NasProvider
7
+ const picker=scopedPicker(source,'/reports')
8
+ expect((await picker.shares(0,signal)).entries).toEqual([entry]);expect(source.shares).not.toHaveBeenCalled()
9
+ for(const path of ['/reports2','/reports/../other','/other'])await expect(picker.list(path,{},signal)).rejects.toMatchObject({code:'SCOPE_DENIED'})
10
+ expect(source.list).not.toHaveBeenCalled();await picker.list('/reports',{},signal);expect(source.list).toHaveBeenCalledOnce()
11
+ picker.dispose();expect(source.dispose).not.toHaveBeenCalled()
12
+ })
@@ -0,0 +1,21 @@
1
+ import type {NasProvider} from '../nas/contract'
2
+ /** A UX bound only; the executor independently enforces its protected scope. */
3
+ export function scopedPicker(source:NasProvider,root:string):NasProvider{
4
+ const check=(path:string)=>{
5
+ if(!root||!(path===root||path.startsWith(root+'/'))||path.includes('\\')||path.slice(1).split('/').some(p=>!p||p==='.'||p==='..'))throw {code:'SCOPE_DENIED'}
6
+ }
7
+ return {
8
+ async shares(offset,signal){
9
+ check(root)
10
+ if(offset!==0)return {entries:[],offset,total:1}
11
+ const entry=await source.info(root,signal)
12
+ if(entry.path!==root||!entry.isDir)throw {code:'SCOPE_DENIED'}
13
+ return {entries:[entry],offset:0,total:1}
14
+ },
15
+ async list(path,options,signal){check(path);const page=await source.list(path,options,signal);page.entries.forEach(e=>check(e.path));return page},
16
+ async info(path,signal){check(path);const entry=await source.info(path,signal);check(entry.path);return entry},
17
+ async createFolder(parent,name,signal){check(parent);check(parent+'/'+name);return source.createFolder(parent,name,signal)},
18
+ // The parent owns the shared session provider; closing a picker must not dispose it.
19
+ dispose(){},
20
+ }
21
+ }
@@ -81,6 +81,13 @@ test('reopening picker clears the old path and reloads current DSM visibility',a
81
81
  expect(call.mock.calls.filter(([m])=>m==='nas.files.shares')).toHaveLength(2)
82
82
  })
83
83
 
84
+ test('upload picker states the same 16 GB limit as the size error',async()=>{
85
+ const call=fixture(),provider=createNasProvider({call:call as any})
86
+ const root=mount(FileBrowser,call,{transfers:true,provider:{...provider,upload:vi.fn(),download:vi.fn(),info:vi.fn()}});await settle()
87
+ button(root,'Open homes').click();await settle()
88
+ expect(nasCopy('en').errorUploadSize).toContain('16 GB')
89
+ expect(root.textContent).toContain('max 16 GB')
90
+ })
84
91
  test('file browser downloads selected files and streams uploads to the current folder',async()=>{
85
92
  const call=fixture(),provider=createNasProvider({call:call as any}),upload=vi.fn(async()=>{}),download=vi.fn(),info=vi.fn(async()=>({name:'a.txt',path:'/homes/a.txt',isDir:false}))
86
93
  const root=mount(FileBrowser,call,{transfers:true,provider:{...provider,upload,download,info}});await settle()
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "Sitzung wird geprüft…",
3
+ "refresh": "Aktualisieren",
4
+ "signOut": "Abmelden",
5
+ "settings": "Paketeinstellungen",
6
+ "loading": "Paketdaten werden geladen…",
7
+ "actionRequired": "Aktion erforderlich",
8
+ "statusTitle": "Paketstatus",
9
+ "statusError": "Der Status konnte nicht geladen werden. Aktualisieren Sie die Ansicht und versuchen Sie es erneut.",
10
+ "greeting": "Begrüßung",
11
+ "save": "Speichern",
12
+ "saved": "Begrüßung gespeichert.",
13
+ "errors": {
14
+ "session_required": "Ihre DSM-Sitzung ist abgelaufen. Melden Sie sich erneut an.",
15
+ "admin_required": "Diese Aktion muss ein DSM-Administrator ausführen.",
16
+ "app_privilege_denied": "Die DSM-Anwendungsberechtigungen erlauben diesem Konto nicht, diese App zu verwenden.",
17
+ "auth_unavailable": "Die DSM-Authentifizierung ist nicht verfügbar. Aktualisieren Sie die Ansicht und versuchen Sie es erneut.",
18
+ "request_failed": "Anfrage fehlgeschlagen ({code}). Aktualisieren Sie die Ansicht und versuchen Sie es erneut."
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "Checking session…",
3
+ "refresh": "Refresh",
4
+ "signOut": "Sign out",
5
+ "settings": "Package settings",
6
+ "loading": "Loading package data…",
7
+ "actionRequired": "Action required",
8
+ "statusTitle": "Package status",
9
+ "statusError": "Status could not be loaded. Refresh to try again.",
10
+ "greeting": "Greeting",
11
+ "save": "Save",
12
+ "saved": "Greeting saved.",
13
+ "errors": {
14
+ "session_required": "Your DSM session expired. Sign in again.",
15
+ "admin_required": "A DSM administrator must perform this action.",
16
+ "app_privilege_denied": "DSM Application Privileges do not allow this account to use this app.",
17
+ "auth_unavailable": "DSM authentication is unavailable. Refresh to try again.",
18
+ "request_failed": "Request failed ({code}). Refresh and try again."
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "Comprobando la sesión…",
3
+ "refresh": "Actualizar",
4
+ "signOut": "Cerrar sesión",
5
+ "settings": "Configuración del paquete",
6
+ "loading": "Cargando datos del paquete…",
7
+ "actionRequired": "Acción necesaria",
8
+ "statusTitle": "Estado del paquete",
9
+ "statusError": "No se pudo cargar el estado. Actualice e inténtelo de nuevo.",
10
+ "greeting": "Saludo",
11
+ "save": "Guardar",
12
+ "saved": "Saludo guardado.",
13
+ "errors": {
14
+ "session_required": "Su sesión de DSM ha caducado. Vuelva a iniciar sesión.",
15
+ "admin_required": "Un administrador de DSM debe realizar esta acción.",
16
+ "app_privilege_denied": "Los privilegios de aplicación de DSM no permiten que esta cuenta use esta aplicación.",
17
+ "auth_unavailable": "La autenticación de DSM no está disponible. Actualice e inténtelo de nuevo.",
18
+ "request_failed": "La solicitud falló ({code}). Actualice e inténtelo de nuevo."
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "Vérification de la session…",
3
+ "refresh": "Actualiser",
4
+ "signOut": "Se déconnecter",
5
+ "settings": "Paramètres du paquet",
6
+ "loading": "Chargement des données du paquet…",
7
+ "actionRequired": "Action requise",
8
+ "statusTitle": "État du paquet",
9
+ "statusError": "Impossible de charger l’état. Actualisez et réessayez.",
10
+ "greeting": "Message d’accueil",
11
+ "save": "Sauvegarder",
12
+ "saved": "Message d’accueil enregistré.",
13
+ "errors": {
14
+ "session_required": "Votre session DSM a expiré. Reconnectez-vous.",
15
+ "admin_required": "Un administrateur DSM doit effectuer cette action.",
16
+ "app_privilege_denied": "Les privilèges d’application DSM n’autorisent pas ce compte à utiliser cette application.",
17
+ "auth_unavailable": "L’authentification DSM n’est pas disponible. Actualisez et réessayez.",
18
+ "request_failed": "La requête a échoué ({code}). Actualisez et réessayez."
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "Verifica della sessione…",
3
+ "refresh": "Aggiorna",
4
+ "signOut": "Disconnetti",
5
+ "settings": "Impostazioni del pacchetto",
6
+ "loading": "Caricamento dei dati del pacchetto…",
7
+ "actionRequired": "Azione richiesta",
8
+ "statusTitle": "Stato del pacchetto",
9
+ "statusError": "Impossibile caricare lo stato. Aggiornare e riprovare.",
10
+ "greeting": "Saluto",
11
+ "save": "Salva",
12
+ "saved": "Saluto salvato.",
13
+ "errors": {
14
+ "session_required": "La sessione DSM è scaduta. Accedere di nuovo.",
15
+ "admin_required": "Questa azione deve essere eseguita da un amministratore DSM.",
16
+ "app_privilege_denied": "I privilegi delle applicazioni DSM non consentono a questo account di usare questa app.",
17
+ "auth_unavailable": "L’autenticazione DSM non è disponibile. Aggiornare e riprovare.",
18
+ "request_failed": "Richiesta non riuscita ({code}). Aggiornare e riprovare."
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "セッションを確認しています…",
3
+ "refresh": "最新の情報に更新",
4
+ "signOut": "サインアウト",
5
+ "settings": "パッケージ設定",
6
+ "loading": "パッケージデータを読み込み中…",
7
+ "actionRequired": "対応が必要です",
8
+ "statusTitle": "パッケージの状態",
9
+ "statusError": "状態を読み込めませんでした。最新の情報に更新してから、もう一度お試しください。",
10
+ "greeting": "あいさつ",
11
+ "save": "保存",
12
+ "saved": "あいさつを保存しました。",
13
+ "errors": {
14
+ "session_required": "DSM セッションの有効期限が切れました。もう一度サインインしてください。",
15
+ "admin_required": "この操作は DSM 管理者が行う必要があります。",
16
+ "app_privilege_denied": "DSM のアプリケーション権限により、このアカウントはこのアプリを使用できません。",
17
+ "auth_unavailable": "DSM 認証を利用できません。最新の情報に更新してから、もう一度お試しください。",
18
+ "request_failed": "リクエストに失敗しました({code})。最新の情報に更新してから、もう一度お試しください。"
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "세션 확인 중…",
3
+ "refresh": "새로 고침",
4
+ "signOut": "로그아웃",
5
+ "settings": "패키지 설정",
6
+ "loading": "패키지 데이터를 불러오는 중…",
7
+ "actionRequired": "조치 필요",
8
+ "statusTitle": "패키지 상태",
9
+ "statusError": "상태를 불러올 수 없습니다. 새로 고친 후 다시 시도하십시오.",
10
+ "greeting": "인사말",
11
+ "save": "저장",
12
+ "saved": "인사말이 저장되었습니다.",
13
+ "errors": {
14
+ "session_required": "DSM 세션이 만료되었습니다. 다시 로그인하십시오.",
15
+ "admin_required": "이 작업은 DSM 관리자가 수행해야 합니다.",
16
+ "app_privilege_denied": "DSM 응용 프로그램 권한에서 이 계정의 앱 사용이 허용되지 않습니다.",
17
+ "auth_unavailable": "DSM 인증을 사용할 수 없습니다. 새로 고친 후 다시 시도하십시오.",
18
+ "request_failed": "요청이 실패했습니다({code}). 새로 고친 후 다시 시도하십시오."
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "正在检查登录状态…",
3
+ "refresh": "刷新",
4
+ "signOut": "注销",
5
+ "settings": "套件设置",
6
+ "loading": "正在加载套件数据…",
7
+ "actionRequired": "需要处理",
8
+ "statusTitle": "套件状态",
9
+ "statusError": "无法加载状态,请刷新后重试。",
10
+ "greeting": "问候语",
11
+ "save": "保存",
12
+ "saved": "问候语已保存。",
13
+ "errors": {
14
+ "session_required": "DSM 登录已过期,请重新登录。",
15
+ "admin_required": "此操作必须由 DSM 管理员执行。",
16
+ "app_privilege_denied": "DSM 应用程序权限不允许此帐户使用此 App。",
17
+ "auth_unavailable": "DSM 验证暂时不可用,请刷新后重试。",
18
+ "request_failed": "请求失败({code}),请刷新后重试。"
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "checking": "正在檢查登入狀態…",
3
+ "refresh": "重新整理",
4
+ "signOut": "登出",
5
+ "settings": "套件設定",
6
+ "loading": "正在載入套件資料…",
7
+ "actionRequired": "需要處理",
8
+ "statusTitle": "套件狀態",
9
+ "statusError": "無法載入狀態,請重新整理後再試。",
10
+ "greeting": "問候語",
11
+ "save": "儲存",
12
+ "saved": "問候語已儲存。",
13
+ "errors": {
14
+ "session_required": "DSM 登入已逾時,請重新登入。",
15
+ "admin_required": "此操作須由 DSM 管理員執行。",
16
+ "app_privilege_denied": "DSM 應用程式權限不允許此帳號使用這個 App。",
17
+ "auth_unavailable": "DSM 驗證目前無法使用,請重新整理後再試。",
18
+ "request_failed": "要求失敗({code}),請重新整理後再試。"
19
+ }
20
+ }
@@ -0,0 +1,13 @@
1
+ import en from './i18n/en.json'
2
+ import zhTW from './i18n/zh-TW.json'
3
+ import zhCN from './i18n/zh-CN.json'
4
+ import ja from './i18n/ja.json'
5
+ import ko from './i18n/ko.json'
6
+ import de from './i18n/de.json'
7
+ import fr from './i18n/fr.json'
8
+ import es from './i18n/es.json'
9
+ import it from './i18n/it.json'
10
+ import {uiLocale} from './nas/locale'
11
+ export type AppCopy=typeof en
12
+ export const appCatalogs:Record<string,AppCopy>={en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
13
+ export function appCopy(locale:string):AppCopy{return appCatalogs[uiLocale(locale)]!}
@@ -2,7 +2,9 @@
2
2
  import {computed, nextTick, onUnmounted, ref} from 'vue'
3
3
  import {Button, Callout, Form, FormActions, FormItem, Input, SettingsSection} from '@synopackageland/ui'
4
4
  import type {IdentitySession} from './session'
5
- const props = defineProps<{session: IdentitySession}>()
5
+ import {identityCopy} from './i18n'
6
+ const props = defineProps<{session: IdentitySession; locale: string}>()
7
+ const copy = computed(() => identityCopy(props.locale))
6
8
  const account = ref('')
7
9
  const password = ref('')
8
10
  const otp = ref('')
@@ -14,7 +16,7 @@ const secure = computed(() => window.location.protocol === 'https:')
14
16
  let disposed = false
15
17
  function message(e: unknown) {
16
18
  const code = (e as {code?: string})?.code
17
- return ({rate_limited: 'Too many sign-in attempts. Wait one minute and try again.', https_required: 'Open this app using HTTPS to sign in.', auth_unavailable: 'DSM sign-in is unavailable. Try again.', session_required: 'Sign in to DSM in this browser, then try again.'} as Record<string, string>)[code || ''] || 'Sign-in could not be completed. Check your credentials or contact your administrator.'
19
+ return (copy.value.errors as Record<string, string>)[code || ''] || copy.value.errors.failed
18
20
  }
19
21
  async function submit() {
20
22
  if (busy.value || !secure.value || !account.value || !password.value || (needsOTP.value && !otp.value)) return
@@ -48,22 +50,22 @@ onUnmounted(() => {disposed = true; password.value = ''; otp.value = ''})
48
50
 
49
51
  <template>
50
52
  <main class="identity-login" :aria-busy="busy">
51
- <SettingsSection title="Sign in with your Synology account" :collapsible="false">
52
- <p>Use your account on this NAS to sign in to the app.</p>
53
- <Callout v-if="!secure" tone="warning" title="HTTPS required">Open this app using HTTPS to sign in.</Callout>
54
- <p v-if="session.notice.value" role="status">{{ session.notice.value }}</p>
55
- <Callout v-if="error" tone="danger" title="Sign-in failed"><span role="alert">{{ error }}</span></Callout>
53
+ <SettingsSection :title="copy.title" :collapsible="false">
54
+ <p>{{ copy.intro }}</p>
55
+ <Callout v-if="!secure" tone="warning" :title="copy.httpsTitle">{{ copy.errors.https_required }}</Callout>
56
+ <p v-if="session.notice.value" role="status">{{ copy.notices[session.notice.value] }}</p>
57
+ <Callout v-if="error" tone="danger" :title="copy.failedTitle"><span role="alert">{{ error }}</span></Callout>
56
58
  <Form @submit.prevent="submit">
57
- <FormItem label="Account"><Input v-model="account" autocomplete="username" :disabled="busy || needsOTP || !secure" /></FormItem>
58
- <FormItem v-if="!needsOTP" label="Password"><Input v-model="password" type="password" autocomplete="current-password" :disabled="busy || !secure" /></FormItem>
59
+ <FormItem :label="copy.account"><Input v-model="account" autocomplete="username" :disabled="busy || needsOTP || !secure" /></FormItem>
60
+ <FormItem v-if="!needsOTP" :label="copy.password"><Input v-model="password" type="password" autocomplete="current-password" :disabled="busy || !secure" /></FormItem>
59
61
  <template v-else>
60
- <p role="status">Enter the verification code from your authenticator app.</p>
61
- <div ref="otpField"><FormItem label="Verification code"><Input v-model="otp" inputmode="numeric" autocomplete="one-time-code" :disabled="busy" /></FormItem></div>
62
+ <p role="status">{{ copy.otpPrompt }}</p>
63
+ <div ref="otpField"><FormItem :label="copy.otp"><Input v-model="otp" inputmode="numeric" autocomplete="one-time-code" :disabled="busy" /></FormItem></div>
62
64
  </template>
63
65
  <FormActions>
64
- <Button type="submit" variant="primary" :disabled="busy || !secure || !account || !password || (needsOTP && !otp)">{{ busy ? 'Signing in…' : needsOTP ? 'Verify and sign in' : 'Sign in' }}</Button>
65
- <Button v-if="needsOTP" variant="secondary" :disabled="busy" @click="restart">Use another account</Button>
66
- <Button v-else variant="secondary" :disabled="busy || !secure" @click="useDSM">Continue with DSM</Button>
66
+ <Button type="submit" variant="primary" :disabled="busy || !secure || !account || !password || (needsOTP && !otp)">{{ busy ? copy.signingIn : needsOTP ? copy.verify : copy.signIn }}</Button>
67
+ <Button v-if="needsOTP" variant="secondary" :disabled="busy" @click="restart">{{ copy.otherAccount }}</Button>
68
+ <Button v-else variant="secondary" :disabled="busy || !secure" @click="useDSM">{{ copy.continueDSM }}</Button>
67
69
  </FormActions>
68
70
  </Form>
69
71
  </SettingsSection>
@@ -0,0 +1,27 @@
1
+ {
2
+ "title": "Mit Ihrem Synology-Konto anmelden",
3
+ "intro": "Melden Sie sich mit Ihrem Konto auf diesem NAS bei der App an.",
4
+ "httpsTitle": "HTTPS erforderlich",
5
+ "failedTitle": "Anmeldung fehlgeschlagen",
6
+ "account": "Konto",
7
+ "password": "Passwort",
8
+ "otpPrompt": "Geben Sie den Bestätigungscode aus Ihrer Authentifizierungs-App ein.",
9
+ "otp": "Bestätigungscode",
10
+ "signingIn": "Anmeldung läuft…",
11
+ "verify": "Bestätigen und anmelden",
12
+ "signIn": "Anmelden",
13
+ "otherAccount": "Anderes Konto verwenden",
14
+ "continueDSM": "Mit DSM fortfahren",
15
+ "errors": {
16
+ "rate_limited": "Zu viele Anmeldeversuche. Warten Sie eine Minute und versuchen Sie es erneut.",
17
+ "https_required": "Öffnen Sie diese App über HTTPS, um sich anzumelden.",
18
+ "auth_unavailable": "Die DSM-Anmeldung ist nicht verfügbar. Versuchen Sie es erneut.",
19
+ "session_required": "Melden Sie sich in diesem Browser bei DSM an und versuchen Sie es dann erneut.",
20
+ "failed": "Die Anmeldung konnte nicht abgeschlossen werden. Prüfen Sie Ihre Anmeldedaten oder wenden Sie sich an Ihren Administrator."
21
+ },
22
+ "notices": {
23
+ "expired": "Ihre Sitzung ist abgelaufen. Melden Sie sich erneut an.",
24
+ "revalidate": "Melden Sie sich in diesem Browser bei DSM an und wählen Sie dann „Mit DSM fortfahren“.",
25
+ "unavailable": "Die Anmeldung ist nicht verfügbar. Aktualisieren Sie die Ansicht und versuchen Sie es erneut."
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "title": "Sign in with your Synology account",
3
+ "intro": "Use your account on this NAS to sign in to the app.",
4
+ "httpsTitle": "HTTPS required",
5
+ "failedTitle": "Sign-in failed",
6
+ "account": "Account",
7
+ "password": "Password",
8
+ "otpPrompt": "Enter the verification code from your authenticator app.",
9
+ "otp": "Verification code",
10
+ "signingIn": "Signing in…",
11
+ "verify": "Verify and sign in",
12
+ "signIn": "Sign in",
13
+ "otherAccount": "Use another account",
14
+ "continueDSM": "Continue with DSM",
15
+ "errors": {
16
+ "rate_limited": "Too many sign-in attempts. Wait one minute and try again.",
17
+ "https_required": "Open this app using HTTPS to sign in.",
18
+ "auth_unavailable": "DSM sign-in is unavailable. Try again.",
19
+ "session_required": "Sign in to DSM in this browser, then try again.",
20
+ "failed": "Sign-in could not be completed. Check your credentials or contact your administrator."
21
+ },
22
+ "notices": {
23
+ "expired": "Your session expired. Sign in again.",
24
+ "revalidate": "Sign in to DSM in this browser, then choose Continue with DSM.",
25
+ "unavailable": "Sign-in is unavailable. Refresh to try again."
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "title": "Iniciar sesión con su cuenta de Synology",
3
+ "intro": "Use su cuenta de este NAS para iniciar sesión en la aplicación.",
4
+ "httpsTitle": "Se requiere HTTPS",
5
+ "failedTitle": "Error al iniciar sesión",
6
+ "account": "Cuenta",
7
+ "password": "Contraseña",
8
+ "otpPrompt": "Introduzca el código de verificación de su aplicación de autenticación.",
9
+ "otp": "Código de verificación",
10
+ "signingIn": "Iniciando sesión…",
11
+ "verify": "Verificar e iniciar sesión",
12
+ "signIn": "Iniciar sesión",
13
+ "otherAccount": "Usar otra cuenta",
14
+ "continueDSM": "Continuar con DSM",
15
+ "errors": {
16
+ "rate_limited": "Demasiados intentos de inicio de sesión. Espere un minuto e inténtelo de nuevo.",
17
+ "https_required": "Abra esta aplicación con HTTPS para iniciar sesión.",
18
+ "auth_unavailable": "El inicio de sesión de DSM no está disponible. Inténtelo de nuevo.",
19
+ "session_required": "Inicie sesión en DSM en este navegador e inténtelo de nuevo.",
20
+ "failed": "No se pudo completar el inicio de sesión. Compruebe sus credenciales o póngase en contacto con su administrador."
21
+ },
22
+ "notices": {
23
+ "expired": "Su sesión ha caducado. Vuelva a iniciar sesión.",
24
+ "revalidate": "Inicie sesión en DSM en este navegador y luego elija «Continuar con DSM».",
25
+ "unavailable": "El inicio de sesión no está disponible. Actualice e inténtelo de nuevo."
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "title": "Se connecter avec votre compte Synology",
3
+ "intro": "Utilisez votre compte sur ce NAS pour vous connecter à l’application.",
4
+ "httpsTitle": "HTTPS requis",
5
+ "failedTitle": "Échec de la connexion",
6
+ "account": "Compte",
7
+ "password": "Mot de passe",
8
+ "otpPrompt": "Saisissez le code de vérification de votre application d’authentification.",
9
+ "otp": "Code de vérification",
10
+ "signingIn": "Connexion…",
11
+ "verify": "Vérifier et se connecter",
12
+ "signIn": "Se connecter",
13
+ "otherAccount": "Utiliser un autre compte",
14
+ "continueDSM": "Continuer avec DSM",
15
+ "errors": {
16
+ "rate_limited": "Trop de tentatives de connexion. Patientez une minute et réessayez.",
17
+ "https_required": "Ouvrez cette application en HTTPS pour vous connecter.",
18
+ "auth_unavailable": "La connexion DSM n’est pas disponible. Réessayez.",
19
+ "session_required": "Connectez-vous à DSM dans ce navigateur, puis réessayez.",
20
+ "failed": "La connexion n’a pas pu aboutir. Vérifiez vos identifiants ou contactez votre administrateur."
21
+ },
22
+ "notices": {
23
+ "expired": "Votre session a expiré. Reconnectez-vous.",
24
+ "revalidate": "Connectez-vous à DSM dans ce navigateur, puis choisissez « Continuer avec DSM ».",
25
+ "unavailable": "La connexion n’est pas disponible. Actualisez et réessayez."
26
+ }
27
+ }