@synopackageland/cli 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/CHANGELOG.md +846 -0
  2. package/README.md +81 -89
  3. package/dist/add.d.ts +4 -1
  4. package/dist/add.js +45 -17
  5. package/dist/build-spk/delegate-scope.d.ts +6 -0
  6. package/dist/build-spk/delegate-scope.js +34 -0
  7. package/dist/build-spk/dsm-arch.d.ts +7 -1
  8. package/dist/build-spk/dsm-arch.js +24 -28
  9. package/dist/build-spk/dsm-platforms.json +42 -0
  10. package/dist/build-spk/dsm-version.d.ts +11 -0
  11. package/dist/build-spk/dsm-version.js +17 -0
  12. package/dist/build-spk/gateway.js +8 -4
  13. package/dist/build-spk/generator.js +30 -5
  14. package/dist/build-spk/go-toolchain.d.ts +20 -0
  15. package/dist/build-spk/go-toolchain.js +44 -0
  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 +28 -14
  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/native-install-values.d.ts +17 -0
  26. package/dist/deploy/native-install-values.js +32 -0
  27. package/dist/deploy/plan.d.ts +6 -2
  28. package/dist/deploy/plan.js +58 -7
  29. package/dist/deploy/spk-version.js +1 -1
  30. package/dist/error-registry.js +54 -20
  31. package/dist/host/dsm-client.d.ts +8 -4
  32. package/dist/host/dsm-client.js +63 -21
  33. package/dist/host/dsm-http.js +24 -2
  34. package/dist/host/types.d.ts +3 -1
  35. package/dist/info.js +45 -10
  36. package/dist/init.d.ts +3 -0
  37. package/dist/init.js +50 -19
  38. package/dist/package-metadata.d.ts +21 -0
  39. package/dist/package-metadata.js +101 -0
  40. package/dist/portal/alias.d.ts +25 -0
  41. package/dist/portal/alias.js +48 -0
  42. package/dist/portal/package.d.ts +33 -0
  43. package/dist/portal/package.js +116 -0
  44. package/dist/runtime/delegate-contract.d.ts +79 -0
  45. package/dist/runtime/delegate-contract.js +27 -0
  46. package/dist/runtime/dsm-version.d.ts +6 -0
  47. package/dist/runtime/dsm-version.js +8 -0
  48. package/dist/runtime/executor-build.js +10 -6
  49. package/dist/runtime/executor-inspect.d.ts +3 -0
  50. package/dist/runtime/executor-inspect.js +11 -5
  51. package/dist/runtime/executor-policy.d.ts +12 -0
  52. package/dist/runtime/executor-policy.js +43 -3
  53. package/dist/runtime/executor-scope-task.d.ts +4 -0
  54. package/dist/runtime/executor-scope-task.js +21 -0
  55. package/dist/runtime/executor-tasks.d.ts +2 -1
  56. package/dist/runtime/executor-tasks.js +4 -4
  57. package/dist/skill.js +1 -0
  58. package/dist/standalone/api-permissions.d.ts +10 -0
  59. package/dist/standalone/api-permissions.js +19 -2
  60. package/dist/standalone/background.d.ts +16 -0
  61. package/dist/standalone/background.js +69 -2
  62. package/dist/standalone/binary.d.ts +1 -1
  63. package/dist/standalone/binary.js +22 -8
  64. package/dist/standalone/build.d.ts +1 -1
  65. package/dist/standalone/build.js +38 -8
  66. package/dist/standalone/daemon.d.ts +1 -0
  67. package/dist/standalone/daemon.js +10 -5
  68. package/dist/standalone/dsm-window.d.ts +3 -1
  69. package/dist/standalone/dsm-window.js +78 -49
  70. package/dist/standalone/inspect-spk.d.ts +8 -0
  71. package/dist/standalone/inspect-spk.js +110 -27
  72. package/dist/standalone/lifecycle.js +86 -8
  73. package/dist/standalone/manifest.d.ts +13 -0
  74. package/dist/standalone/manifest.js +57 -8
  75. package/dist/standalone/native-authorization-window.d.ts +1 -1
  76. package/dist/standalone/native-authorization-window.js +9 -1
  77. package/dist/standalone/native-layout.d.ts +3 -0
  78. package/dist/standalone/native-layout.js +37 -5
  79. package/dist/standalone/native-root-window.d.ts +4 -2
  80. package/dist/standalone/native-root-window.js +33 -18
  81. package/dist/standalone/portal-window.d.ts +21 -0
  82. package/dist/standalone/portal-window.js +155 -0
  83. package/dist/standalone/portal.d.ts +4 -0
  84. package/dist/standalone/portal.js +4 -0
  85. package/dist/standalone/resource.d.ts +5 -3
  86. package/dist/standalone/resource.js +6 -3
  87. package/dist/standalone/root-window.d.ts +4 -1
  88. package/dist/standalone/root-window.js +193 -36
  89. package/dist/standalone/spk.d.ts +1 -1
  90. package/dist/standalone/spk.js +25 -7
  91. package/dist/templates/_daemon/go.mod +1 -1
  92. package/dist/templates/_daemon/main.go +6 -3
  93. package/dist/templates/_daemon/main_test.go +82 -9
  94. package/dist/templates/_daemon/testdata/child.go +3 -0
  95. package/dist/templates/_executor/README.md +130 -16
  96. package/dist/templates/_executor/anchor.go +156 -0
  97. package/dist/templates/_executor/anchor_test.go +161 -0
  98. package/dist/templates/_executor/apppriv_review_test.go +1 -1
  99. package/dist/templates/_executor/cancel_contract_test.go +236 -0
  100. package/dist/templates/_executor/copy.go +64 -0
  101. package/dist/templates/_executor/copy_test.go +88 -0
  102. package/dist/templates/_executor/digest_review_test.go +2 -2
  103. package/dist/templates/_executor/dsm.go +63 -13
  104. package/dist/templates/_executor/dsm_test.go +95 -1
  105. package/dist/templates/_executor/executor.go +260 -49
  106. package/dist/templates/_executor/executor_test.go +36 -6
  107. package/dist/templates/_executor/go.mod +2 -0
  108. package/dist/templates/_executor/identity.go +27 -1
  109. package/dist/templates/_executor/identity_kernel_linux_test.go +60 -0
  110. package/dist/templates/_executor/identity_linux.go +82 -0
  111. package/dist/templates/_executor/identity_security_test.go +43 -0
  112. package/dist/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  113. package/dist/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  114. package/dist/templates/_executor/internal/taskscript/boot.sh +9 -9
  115. package/dist/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  116. package/dist/templates/_executor/internal/taskscript/control.sh +15 -10
  117. package/dist/templates/_executor/internal/taskscript/tasks.go +5 -3
  118. package/dist/templates/_executor/lifecycle_test.go +11 -0
  119. package/dist/templates/_executor/link_linux.go +28 -0
  120. package/dist/templates/_executor/long_running_test.go +530 -0
  121. package/dist/templates/_executor/main.go +83 -25
  122. package/dist/templates/_executor/managed.go +3 -3
  123. package/dist/templates/_executor/managed_test.go +3 -3
  124. package/dist/templates/_executor/move_linux.go +490 -0
  125. package/dist/templates/_executor/move_linux_test.go +460 -0
  126. package/dist/templates/_executor/move_validation.go +46 -0
  127. package/dist/templates/_executor/move_validation_test.go +187 -0
  128. package/dist/templates/_executor/operations.go +926 -0
  129. package/dist/templates/_executor/path_test.go +18 -0
  130. package/dist/templates/_executor/pid.go +37 -0
  131. package/dist/templates/_executor/pid_test.go +113 -0
  132. package/dist/templates/_executor/platform_linux.go +24 -173
  133. package/dist/templates/_executor/platform_linux_test.go +9 -65
  134. package/dist/templates/_executor/platform_other.go +38 -4
  135. package/dist/templates/_executor/process.go +3 -0
  136. package/dist/templates/_executor/purge_log.go +18 -0
  137. package/dist/templates/_executor/records.go +242 -0
  138. package/dist/templates/_executor/scope_cancel_contract_test.go +91 -0
  139. package/dist/templates/_executor/scope_client.go +37 -0
  140. package/dist/templates/_executor/scope_contract.go +12 -0
  141. package/dist/templates/_executor/selected_scope.go +146 -0
  142. package/dist/templates/_executor/selected_scope_test.go +186 -0
  143. package/dist/templates/_executor/status_disabled_test.go +33 -0
  144. package/dist/templates/_executor/store.go +4 -3
  145. package/dist/templates/_executor/supervise.go +109 -0
  146. package/dist/templates/_executor/supervise_test.go +130 -0
  147. package/dist/templates/_executor/task_race_review_test.go +1 -1
  148. package/dist/templates/_executor/tasks.go +52 -15
  149. package/dist/templates/_executor/tasks_dsm71_test.go +114 -0
  150. package/dist/templates/_executor/tasks_review_test.go +1 -1
  151. package/dist/templates/_executor/tasks_test.go +62 -5
  152. package/dist/templates/_executor/upgrade_watch_test.go +13 -5
  153. package/dist/templates/_executor/watch.go +8 -0
  154. package/dist/templates/_executor/watch_test.go +23 -2
  155. package/dist/templates/_executor/write_review_linux_test.go +4 -12
  156. package/dist/templates/_gateway/go.mod +2 -0
  157. package/dist/templates/_shared/AGENTS.md +129 -0
  158. package/dist/templates/binary/dsm-package.yaml +24 -0
  159. package/dist/templates/binary/i18n/messages/de.json +4 -0
  160. package/dist/templates/binary/i18n/messages/en.json +4 -0
  161. package/dist/templates/binary/i18n/messages/es.json +4 -0
  162. package/dist/templates/binary/i18n/messages/fr.json +4 -0
  163. package/dist/templates/binary/i18n/messages/it.json +4 -0
  164. package/dist/templates/binary/i18n/messages/ja.json +4 -0
  165. package/dist/templates/binary/i18n/messages/ko.json +4 -0
  166. package/dist/templates/binary/i18n/messages/zh-CN.json +4 -0
  167. package/dist/templates/binary/i18n/messages/zh-TW.json +4 -0
  168. package/dist/templates/binary/ui/app.js +19 -4
  169. package/dist/templates/native-authorization/AuthorizationGate.vue +5 -3
  170. package/dist/templates/native-authorization/i18n/de.json +1 -0
  171. package/dist/templates/native-authorization/i18n/en.json +1 -0
  172. package/dist/templates/native-authorization/i18n/es.json +2 -1
  173. package/dist/templates/native-authorization/i18n/fr.json +1 -0
  174. package/dist/templates/native-authorization/i18n/it.json +11 -10
  175. package/dist/templates/native-authorization/i18n/ja.json +1 -0
  176. package/dist/templates/native-authorization/i18n/ko.json +10 -9
  177. package/dist/templates/native-authorization/i18n/zh-CN.json +6 -5
  178. package/dist/templates/native-authorization/i18n/zh-TW.json +6 -5
  179. package/dist/templates/native-go/README.md +43 -10
  180. package/dist/templates/native-go/backend/cmd/app/main.go +27 -7
  181. package/dist/templates/native-go/backend/go.mod +1 -1
  182. package/dist/templates/native-go/backend/internal/api/entry_test.go +47 -0
  183. package/dist/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  184. package/dist/templates/native-go/backend/internal/api/registry.go +11 -0
  185. package/dist/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  186. package/dist/templates/native-go/backend/internal/api/server.go +18 -5
  187. package/dist/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  188. package/dist/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  189. package/dist/templates/native-go/backend/internal/app/portal.go +30 -0
  190. package/dist/templates/native-go/backend/internal/app/portal_test.go +55 -0
  191. package/dist/templates/native-go/backend/internal/app/routes.go +8 -2
  192. package/dist/templates/native-go/backend/internal/background/runner.go +1 -1
  193. package/dist/templates/native-go/backend/internal/background/store.go +16 -14
  194. package/dist/templates/native-go/backend/internal/dsm/admin.go +8 -2
  195. package/dist/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  196. package/dist/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  197. package/dist/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  198. package/dist/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  199. package/dist/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  200. package/dist/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  201. package/dist/templates/native-go/backend/internal/dsm/entry.go +177 -0
  202. package/dist/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  203. package/dist/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  204. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  205. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  206. package/dist/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  207. package/dist/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  208. package/dist/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  209. package/dist/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  210. package/dist/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  211. package/dist/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  212. package/dist/templates/native-go/backend/internal/filestation/client.go +39 -3
  213. package/dist/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
  214. package/dist/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  215. package/dist/templates/native-go/backend/internal/filestation/service.go +1 -1
  216. package/dist/templates/native-go/backend/internal/identity/README.md +5 -1
  217. package/dist/templates/native-go/backend/internal/identity/dsm.go +24 -5
  218. package/dist/templates/native-go/backend/internal/identity/http.go +1 -1
  219. package/dist/templates/native-go/backend/internal/identity/identity_test.go +48 -1
  220. package/dist/templates/native-go/backend/internal/identity/service.go +1 -1
  221. package/dist/templates/native-go/backend/internal/portal/portal.go +138 -0
  222. package/dist/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  223. package/dist/templates/native-go/dsm-package.yaml +20 -1
  224. package/dist/templates/native-go/i18n/glossary.json +2 -1
  225. package/dist/templates/native-go/i18n/messages/de.json +1 -0
  226. package/dist/templates/native-go/i18n/messages/en.json +1 -0
  227. package/dist/templates/native-go/i18n/messages/es.json +1 -0
  228. package/dist/templates/native-go/i18n/messages/fr.json +1 -0
  229. package/dist/templates/native-go/i18n/messages/it.json +1 -0
  230. package/dist/templates/native-go/i18n/messages/ja.json +1 -0
  231. package/dist/templates/native-go/i18n/messages/ko.json +1 -0
  232. package/dist/templates/native-go/i18n/messages/zh-CN.json +1 -0
  233. package/dist/templates/native-go/i18n/messages/zh-TW.json +1 -0
  234. package/dist/templates/native-go/ui/app.css +10 -0
  235. package/dist/templates/native-go/ui/app.js +11 -1
  236. package/dist/templates/native-go-delegate/DELEGATE.md +126 -5
  237. package/dist/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  238. package/dist/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  239. package/dist/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  240. package/dist/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  241. package/dist/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  242. package/dist/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  243. package/dist/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  244. package/dist/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  245. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  246. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  247. package/dist/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  248. package/dist/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  249. package/dist/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  250. package/dist/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  251. package/dist/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  252. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  253. package/dist/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  254. package/dist/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  255. package/dist/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  256. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  257. package/dist/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  258. package/dist/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  259. package/dist/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  260. package/dist/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  261. package/dist/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  262. package/dist/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  263. package/dist/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  264. package/dist/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  265. package/dist/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  266. package/dist/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  267. package/dist/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  268. package/dist/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  269. package/dist/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
  270. package/dist/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  271. package/dist/templates/native-go-delegate/test.sh +1 -0
  272. package/dist/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  273. package/dist/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  274. package/dist/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  275. package/dist/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  276. package/dist/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  277. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  278. package/dist/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  279. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  280. package/dist/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  281. package/dist/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  282. package/dist/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
  283. package/dist/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
  284. package/dist/templates/native-go-vue/README.md +4 -0
  285. package/dist/templates/native-go-vue/frontend/package-lock.json +4 -4
  286. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  287. package/dist/templates/native-go-vue/frontend/src/App.vue +18 -13
  288. package/dist/templates/native-go-vue/frontend/src/context.ts +31 -0
  289. package/dist/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
  290. package/dist/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  291. package/dist/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  292. package/dist/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  293. package/dist/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
  294. package/dist/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
  295. package/dist/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  296. package/dist/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  297. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
  298. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
  299. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
  300. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
  301. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
  302. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
  303. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
  304. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  305. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  306. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  307. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  308. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  309. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  310. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  311. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  312. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  313. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
  314. package/dist/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
  315. package/dist/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  316. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  317. package/dist/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  318. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  319. package/dist/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  320. package/dist/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  321. package/dist/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  322. package/dist/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  323. package/dist/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  324. package/dist/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  325. package/dist/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  326. package/dist/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  327. package/dist/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  328. package/dist/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  329. package/dist/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  330. package/dist/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  331. package/dist/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  332. package/dist/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  333. package/dist/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  334. package/dist/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  335. package/dist/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  336. package/dist/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  337. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  338. package/dist/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  339. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  340. package/dist/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  341. package/dist/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  342. package/dist/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  343. package/dist/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  344. package/dist/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  345. package/dist/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  346. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  347. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  348. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  349. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  350. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  351. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  352. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  353. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  354. package/dist/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  355. package/dist/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  356. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  357. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  358. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  359. package/dist/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  360. package/dist/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
  361. package/package.json +5 -1
  362. package/schema/package-metadata.schema.json +101 -0
  363. package/schema/synology-app.schema.json +112 -0
  364. package/skills/SKILL.md +106 -4
  365. package/skills/reference/create.md +101 -2
  366. package/skills/reference/deploy.md +2 -2
  367. package/skills/reference/files.md +113 -2
  368. package/skills/reference/identity.md +70 -1
  369. package/skills/reference/portal.md +17 -0
  370. package/skills/reference/ui-vue.md +12 -0
  371. package/templates/_daemon/go.mod +1 -1
  372. package/templates/_daemon/main.go +6 -3
  373. package/templates/_daemon/main_test.go +82 -9
  374. package/templates/_daemon/testdata/child.go +3 -0
  375. package/templates/_executor/README.md +130 -16
  376. package/templates/_executor/anchor.go +156 -0
  377. package/templates/_executor/anchor_test.go +161 -0
  378. package/templates/_executor/apppriv_review_test.go +1 -1
  379. package/templates/_executor/cancel_contract_test.go +236 -0
  380. package/templates/_executor/copy.go +64 -0
  381. package/templates/_executor/copy_test.go +88 -0
  382. package/templates/_executor/digest_review_test.go +2 -2
  383. package/templates/_executor/dsm.go +63 -13
  384. package/templates/_executor/dsm_test.go +95 -1
  385. package/templates/_executor/executor.go +260 -49
  386. package/templates/_executor/executor_test.go +36 -6
  387. package/templates/_executor/go.mod +2 -0
  388. package/templates/_executor/identity.go +27 -1
  389. package/templates/_executor/identity_kernel_linux_test.go +60 -0
  390. package/templates/_executor/identity_linux.go +82 -0
  391. package/templates/_executor/identity_security_test.go +43 -0
  392. package/templates/_executor/internal/lifecycle/lifecycle.go +5 -0
  393. package/templates/_executor/internal/lifecycle/lifecycle_test.go +61 -3
  394. package/templates/_executor/internal/taskscript/boot.sh +9 -9
  395. package/templates/_executor/internal/taskscript/cmd/main.go +2 -2
  396. package/templates/_executor/internal/taskscript/control.sh +15 -10
  397. package/templates/_executor/internal/taskscript/tasks.go +5 -3
  398. package/templates/_executor/lifecycle_test.go +11 -0
  399. package/templates/_executor/link_linux.go +28 -0
  400. package/templates/_executor/long_running_test.go +530 -0
  401. package/templates/_executor/main.go +83 -25
  402. package/templates/_executor/managed.go +3 -3
  403. package/templates/_executor/managed_test.go +3 -3
  404. package/templates/_executor/move_linux.go +490 -0
  405. package/templates/_executor/move_linux_test.go +460 -0
  406. package/templates/_executor/move_validation.go +46 -0
  407. package/templates/_executor/move_validation_test.go +187 -0
  408. package/templates/_executor/operations.go +926 -0
  409. package/templates/_executor/path_test.go +18 -0
  410. package/templates/_executor/pid.go +37 -0
  411. package/templates/_executor/pid_test.go +113 -0
  412. package/templates/_executor/platform_linux.go +24 -173
  413. package/templates/_executor/platform_linux_test.go +9 -65
  414. package/templates/_executor/platform_other.go +38 -4
  415. package/templates/_executor/process.go +3 -0
  416. package/templates/_executor/purge_log.go +18 -0
  417. package/templates/_executor/records.go +242 -0
  418. package/templates/_executor/scope_cancel_contract_test.go +91 -0
  419. package/templates/_executor/scope_client.go +37 -0
  420. package/templates/_executor/scope_contract.go +12 -0
  421. package/templates/_executor/selected_scope.go +146 -0
  422. package/templates/_executor/selected_scope_test.go +186 -0
  423. package/templates/_executor/status_disabled_test.go +33 -0
  424. package/templates/_executor/store.go +4 -3
  425. package/templates/_executor/supervise.go +109 -0
  426. package/templates/_executor/supervise_test.go +130 -0
  427. package/templates/_executor/task_race_review_test.go +1 -1
  428. package/templates/_executor/tasks.go +52 -15
  429. package/templates/_executor/tasks_dsm71_test.go +114 -0
  430. package/templates/_executor/tasks_review_test.go +1 -1
  431. package/templates/_executor/tasks_test.go +62 -5
  432. package/templates/_executor/upgrade_watch_test.go +13 -5
  433. package/templates/_executor/watch.go +8 -0
  434. package/templates/_executor/watch_test.go +23 -2
  435. package/templates/_executor/write_review_linux_test.go +4 -12
  436. package/templates/_gateway/go.mod +2 -0
  437. package/templates/_shared/AGENTS.md +129 -0
  438. package/templates/binary/dsm-package.yaml +24 -0
  439. package/templates/binary/i18n/messages/de.json +4 -0
  440. package/templates/binary/i18n/messages/en.json +4 -0
  441. package/templates/binary/i18n/messages/es.json +4 -0
  442. package/templates/binary/i18n/messages/fr.json +4 -0
  443. package/templates/binary/i18n/messages/it.json +4 -0
  444. package/templates/binary/i18n/messages/ja.json +4 -0
  445. package/templates/binary/i18n/messages/ko.json +4 -0
  446. package/templates/binary/i18n/messages/zh-CN.json +4 -0
  447. package/templates/binary/i18n/messages/zh-TW.json +4 -0
  448. package/templates/binary/ui/app.js +19 -4
  449. package/templates/native-authorization/AuthorizationGate.vue +5 -3
  450. package/templates/native-authorization/i18n/de.json +1 -0
  451. package/templates/native-authorization/i18n/en.json +1 -0
  452. package/templates/native-authorization/i18n/es.json +2 -1
  453. package/templates/native-authorization/i18n/fr.json +1 -0
  454. package/templates/native-authorization/i18n/it.json +11 -10
  455. package/templates/native-authorization/i18n/ja.json +1 -0
  456. package/templates/native-authorization/i18n/ko.json +10 -9
  457. package/templates/native-authorization/i18n/zh-CN.json +6 -5
  458. package/templates/native-authorization/i18n/zh-TW.json +6 -5
  459. package/templates/native-go/README.md +43 -10
  460. package/templates/native-go/backend/cmd/app/main.go +27 -7
  461. package/templates/native-go/backend/go.mod +1 -1
  462. package/templates/native-go/backend/internal/api/entry_test.go +47 -0
  463. package/templates/native-go/backend/internal/api/permissions_test.go +3 -3
  464. package/templates/native-go/backend/internal/api/registry.go +11 -0
  465. package/templates/native-go/backend/internal/api/sdk-permissions.json +14 -1
  466. package/templates/native-go/backend/internal/api/server.go +18 -5
  467. package/templates/native-go/backend/internal/app/delegate_config.go +57 -0
  468. package/templates/native-go/backend/internal/app/delegate_config_test.go +28 -0
  469. package/templates/native-go/backend/internal/app/portal.go +30 -0
  470. package/templates/native-go/backend/internal/app/portal_test.go +55 -0
  471. package/templates/native-go/backend/internal/app/routes.go +8 -2
  472. package/templates/native-go/backend/internal/background/runner.go +1 -1
  473. package/templates/native-go/backend/internal/background/store.go +16 -14
  474. package/templates/native-go/backend/internal/dsm/admin.go +8 -2
  475. package/templates/native-go/backend/internal/dsm/admin_linux.go +43 -13
  476. package/templates/native-go/backend/internal/dsm/admin_linux_test.go +56 -0
  477. package/templates/native-go/backend/internal/dsm/admin_other.go +4 -1
  478. package/templates/native-go/backend/internal/dsm/apppriv.go +30 -0
  479. package/templates/native-go/backend/internal/dsm/bridge_file.go +75 -0
  480. package/templates/native-go/backend/internal/dsm/bridge_file_test.go +57 -0
  481. package/templates/native-go/backend/internal/dsm/entry.go +177 -0
  482. package/templates/native-go/backend/internal/dsm/entry_test.go +315 -0
  483. package/templates/native-go/backend/internal/dsm/native/admin-armv7.elf +0 -0
  484. package/templates/native-go/backend/internal/dsm/native/apppriv-aarch64.elf +0 -0
  485. package/templates/native-go/backend/internal/dsm/native/apppriv-armv7.elf +0 -0
  486. package/templates/native-go/backend/internal/dsm/native/apppriv-x86_64.elf +0 -0
  487. package/templates/native-go/backend/internal/dsm/native/apppriv_check.c +33 -0
  488. package/templates/native-go/backend/internal/dsm/native/build.sh +13 -4
  489. package/templates/native-go/backend/internal/dsm/native/provenance.json +9 -3
  490. package/templates/native-go/backend/internal/filestation/check_permission.go +71 -0
  491. package/templates/native-go/backend/internal/filestation/check_permission_test.go +77 -0
  492. package/templates/native-go/backend/internal/filestation/client.go +39 -3
  493. package/templates/native-go/backend/internal/filestation/download_dsm71_test.go +82 -0
  494. package/templates/native-go/backend/internal/filestation/sdk_policy_test.go +39 -0
  495. package/templates/native-go/backend/internal/filestation/service.go +1 -1
  496. package/templates/native-go/backend/internal/identity/README.md +5 -1
  497. package/templates/native-go/backend/internal/identity/dsm.go +24 -5
  498. package/templates/native-go/backend/internal/identity/http.go +1 -1
  499. package/templates/native-go/backend/internal/identity/identity_test.go +48 -1
  500. package/templates/native-go/backend/internal/identity/service.go +1 -1
  501. package/templates/native-go/backend/internal/portal/portal.go +138 -0
  502. package/templates/native-go/backend/internal/portal/portal_test.go +89 -0
  503. package/templates/native-go/dsm-package.yaml +20 -1
  504. package/templates/native-go/i18n/glossary.json +2 -1
  505. package/templates/native-go/i18n/messages/de.json +1 -0
  506. package/templates/native-go/i18n/messages/en.json +1 -0
  507. package/templates/native-go/i18n/messages/es.json +1 -0
  508. package/templates/native-go/i18n/messages/fr.json +1 -0
  509. package/templates/native-go/i18n/messages/it.json +1 -0
  510. package/templates/native-go/i18n/messages/ja.json +1 -0
  511. package/templates/native-go/i18n/messages/ko.json +1 -0
  512. package/templates/native-go/i18n/messages/zh-CN.json +1 -0
  513. package/templates/native-go/i18n/messages/zh-TW.json +1 -0
  514. package/templates/native-go/ui/app.css +10 -0
  515. package/templates/native-go/ui/app.js +11 -1
  516. package/templates/native-go-delegate/DELEGATE.md +126 -5
  517. package/templates/native-go-delegate/backend/cmd/background-worker/main.go +7 -0
  518. package/templates/native-go-delegate/backend/internal/app/delegate.go +11 -1
  519. package/templates/native-go-delegate/backend/internal/app/delegate_routes_test.go +14 -0
  520. package/templates/native-go-delegate/backend/internal/background/delegated_moves.go +270 -0
  521. package/templates/native-go-delegate/backend/internal/delegate/admission_recovery_test.go +410 -0
  522. package/templates/native-go-delegate/backend/internal/delegate/cancel_contract_test.go +95 -0
  523. package/templates/native-go-delegate/backend/internal/delegate/client.go +8 -0
  524. package/templates/native-go-delegate/backend/internal/delegate/destination.go +110 -0
  525. package/templates/native-go-delegate/backend/internal/delegate/destination_state.go +117 -0
  526. package/templates/native-go-delegate/backend/internal/delegate/destination_state_test.go +60 -0
  527. package/templates/native-go-delegate/backend/internal/delegate/destination_test.go +116 -0
  528. package/templates/native-go-delegate/backend/internal/delegate/example.go +81 -0
  529. package/templates/native-go-delegate/backend/internal/delegate/example_test.go +91 -0
  530. package/templates/native-go-delegate/backend/internal/delegate/executor_contract_test.go +511 -0
  531. package/templates/native-go-delegate/backend/internal/delegate/files.go +1 -1
  532. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes.go +92 -0
  533. package/templates/native-go-delegate/backend/internal/delegate/long_running_routes_test.go +99 -0
  534. package/templates/native-go-delegate/backend/internal/delegate/move.go +348 -0
  535. package/templates/native-go-delegate/backend/internal/delegate/move_test.go +351 -0
  536. package/templates/native-go-delegate/backend/internal/delegate/operations_list.go +65 -0
  537. package/templates/native-go-delegate/backend/internal/delegate/operations_list_test.go +114 -0
  538. package/templates/native-go-delegate/backend/internal/delegate/retry_test.go +1 -1
  539. package/templates/native-go-delegate/backend/internal/delegate/service.go +58 -17
  540. package/templates/native-go-delegate/backend/internal/delegate/staging.go +121 -0
  541. package/templates/native-go-delegate/backend/internal/delegate/status_disabled_test.go +51 -0
  542. package/templates/native-go-delegate/backend/internal/delegate/testdata/executor_contract.txt +112 -0
  543. package/templates/native-go-delegate/backend/internal/delegate/transient_contract_test.go +137 -0
  544. package/templates/native-go-delegate/backend/internal/filestation/files.go +1 -31
  545. package/templates/native-go-delegate/frontend/src/CapabilityPanels.vue +30 -3
  546. package/templates/native-go-delegate/frontend/src/delegate/BackgroundSavePanel.vue +113 -0
  547. package/templates/native-go-delegate/frontend/src/delegate/copy.ts +5 -6
  548. package/templates/native-go-delegate/frontend/test/background-save.test.ts +121 -0
  549. package/templates/native-go-delegate/frontend/test/delegate.test.ts +15 -0
  550. package/templates/native-go-delegate/frontend/test/scope-settings.test.ts +49 -0
  551. package/templates/native-go-delegate/test.sh +1 -0
  552. package/templates/native-go-jobs/frontend/src/background/i18n/de.json +2 -2
  553. package/templates/native-go-jobs/frontend/src/background/i18n/en.json +2 -2
  554. package/templates/native-go-jobs/frontend/src/background/i18n/es.json +12 -12
  555. package/templates/native-go-jobs/frontend/src/background/i18n/fr.json +4 -4
  556. package/templates/native-go-jobs/frontend/src/background/i18n/it.json +17 -17
  557. package/templates/native-go-jobs/frontend/src/background/i18n/ja.json +7 -7
  558. package/templates/native-go-jobs/frontend/src/background/i18n/ko.json +15 -15
  559. package/templates/native-go-jobs/frontend/src/background/i18n/zh-CN.json +3 -3
  560. package/templates/native-go-jobs/frontend/src/background/i18n/zh-TW.json +2 -2
  561. package/templates/native-go-jobs/frontend/test/background.test.ts +25 -28
  562. package/templates/native-go-root-ops/backend/internal/app/executor.go +30 -2
  563. package/templates/native-go-root-ops/backend/internal/app/executor_test.go +64 -0
  564. package/templates/native-go-vue/README.md +4 -0
  565. package/templates/native-go-vue/frontend/package-lock.json +4 -4
  566. package/templates/native-go-vue/frontend/package.json +1 -1
  567. package/templates/native-go-vue/frontend/src/App.vue +18 -13
  568. package/templates/native-go-vue/frontend/src/context.ts +31 -0
  569. package/templates/native-go-vue/frontend/src/delegate/ExecutorSettings.vue +54 -9
  570. package/templates/native-go-vue/frontend/src/delegate/catalogs.ts +11 -0
  571. package/templates/native-go-vue/frontend/src/delegate/copy.test.ts +12 -0
  572. package/templates/native-go-vue/frontend/src/delegate/copy.ts +4 -4
  573. package/templates/native-go-vue/frontend/src/delegate/executor-settings.test.ts +23 -0
  574. package/templates/native-go-vue/frontend/src/delegate/executor-setup.ts +8 -2
  575. package/templates/native-go-vue/frontend/src/delegate/facade.test.ts +100 -0
  576. package/templates/native-go-vue/frontend/src/delegate/facade.ts +85 -0
  577. package/templates/native-go-vue/frontend/src/delegate/i18n/de.json +47 -0
  578. package/templates/native-go-vue/frontend/src/delegate/i18n/en.json +13 -2
  579. package/templates/native-go-vue/frontend/src/delegate/i18n/es.json +47 -0
  580. package/templates/native-go-vue/frontend/src/delegate/i18n/fr.json +47 -0
  581. package/templates/native-go-vue/frontend/src/delegate/i18n/it.json +47 -0
  582. package/templates/native-go-vue/frontend/src/delegate/i18n/ja.json +47 -0
  583. package/templates/native-go-vue/frontend/src/delegate/i18n/ko.json +47 -0
  584. package/templates/native-go-vue/frontend/src/delegate/i18n/save/de.json +42 -0
  585. package/templates/native-go-vue/frontend/src/delegate/i18n/save/en.json +42 -0
  586. package/templates/native-go-vue/frontend/src/delegate/i18n/save/es.json +42 -0
  587. package/templates/native-go-vue/frontend/src/delegate/i18n/save/fr.json +42 -0
  588. package/templates/native-go-vue/frontend/src/delegate/i18n/save/it.json +42 -0
  589. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ja.json +42 -0
  590. package/templates/native-go-vue/frontend/src/delegate/i18n/save/ko.json +42 -0
  591. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-CN.json +42 -0
  592. package/templates/native-go-vue/frontend/src/delegate/i18n/save/zh-TW.json +42 -0
  593. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-CN.json +47 -0
  594. package/templates/native-go-vue/frontend/src/delegate/i18n/zh-TW.json +16 -5
  595. package/templates/native-go-vue/frontend/src/delegate/long-running.ts +57 -0
  596. package/templates/native-go-vue/frontend/src/delegate/save-copy.test.ts +12 -0
  597. package/templates/native-go-vue/frontend/src/delegate/save-copy.ts +24 -0
  598. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.test.ts +12 -0
  599. package/templates/native-go-vue/frontend/src/delegate/scoped-picker.ts +21 -0
  600. package/templates/native-go-vue/frontend/src/files/files.test.ts +7 -0
  601. package/templates/native-go-vue/frontend/src/i18n/de.json +20 -0
  602. package/templates/native-go-vue/frontend/src/i18n/en.json +20 -0
  603. package/templates/native-go-vue/frontend/src/i18n/es.json +20 -0
  604. package/templates/native-go-vue/frontend/src/i18n/fr.json +20 -0
  605. package/templates/native-go-vue/frontend/src/i18n/it.json +20 -0
  606. package/templates/native-go-vue/frontend/src/i18n/ja.json +20 -0
  607. package/templates/native-go-vue/frontend/src/i18n/ko.json +20 -0
  608. package/templates/native-go-vue/frontend/src/i18n/zh-CN.json +20 -0
  609. package/templates/native-go-vue/frontend/src/i18n/zh-TW.json +20 -0
  610. package/templates/native-go-vue/frontend/src/i18n.ts +13 -0
  611. package/templates/native-go-vue/frontend/src/identity/LoginPage.vue +16 -14
  612. package/templates/native-go-vue/frontend/src/identity/i18n/de.json +27 -0
  613. package/templates/native-go-vue/frontend/src/identity/i18n/en.json +27 -0
  614. package/templates/native-go-vue/frontend/src/identity/i18n/es.json +27 -0
  615. package/templates/native-go-vue/frontend/src/identity/i18n/fr.json +27 -0
  616. package/templates/native-go-vue/frontend/src/identity/i18n/it.json +27 -0
  617. package/templates/native-go-vue/frontend/src/identity/i18n/ja.json +27 -0
  618. package/templates/native-go-vue/frontend/src/identity/i18n/ko.json +27 -0
  619. package/templates/native-go-vue/frontend/src/identity/i18n/zh-CN.json +27 -0
  620. package/templates/native-go-vue/frontend/src/identity/i18n/zh-TW.json +27 -0
  621. package/templates/native-go-vue/frontend/src/identity/i18n.ts +14 -0
  622. package/templates/native-go-vue/frontend/src/identity/session.test.ts +4 -0
  623. package/templates/native-go-vue/frontend/src/identity/session.ts +9 -8
  624. package/templates/native-go-vue/frontend/src/nas/NasPicker.vue +31 -12
  625. package/templates/native-go-vue/frontend/src/nas/destination.test.ts +48 -0
  626. package/templates/native-go-vue/frontend/src/nas/i18n/files/de.json +1 -1
  627. package/templates/native-go-vue/frontend/src/nas/i18n/files/en.json +1 -1
  628. package/templates/native-go-vue/frontend/src/nas/i18n/files/es.json +10 -10
  629. package/templates/native-go-vue/frontend/src/nas/i18n/files/fr.json +1 -1
  630. package/templates/native-go-vue/frontend/src/nas/i18n/files/it.json +12 -12
  631. package/templates/native-go-vue/frontend/src/nas/i18n/files/ja.json +15 -15
  632. package/templates/native-go-vue/frontend/src/nas/i18n/files/ko.json +12 -12
  633. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-CN.json +1 -1
  634. package/templates/native-go-vue/frontend/src/nas/i18n/files/zh-TW.json +1 -1
  635. package/templates/native-go-vue/frontend/src/portal/PortalSettings.vue +39 -0
  636. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +1 -1
  637. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +1 -1
  638. package/templates/native-go-vue/frontend/test/apps.test.ts +14 -0
  639. package/templates/native-go-vue/frontend/test/portal-settings.test.ts +71 -0
  640. package/templates/native-go-vue/frontend/test/shell-i18n.test.ts +50 -0
@@ -0,0 +1,42 @@
1
+ {
2
+ "title": "Salvataggi in background",
3
+ "help": "Questa app può continuare a salvare file interi nelle cartelle selezionate dopo la disconnessione, fino alla revoca dell’accesso. I file esistenti non vengono mai sostituiti.",
4
+ "selection": "Consentire a questa app di salvare qui dopo la disconnessione, fino alla revoca dell’accesso.",
5
+ "delegations": "Le mie destinazioni",
6
+ "operations": "I miei salvataggi",
7
+ "empty": "Nessuna destinazione attiva.",
8
+ "noOperations": "Nessuna operazione di salvataggio.",
9
+ "revoke": "Revoca accesso",
10
+ "choose": "Scegli destinazione di salvataggio",
11
+ "needs": "Un amministratore deve approvare l’accesso in background prima di poter scegliere una destinazione.",
12
+ "cancel": "Annulla salvataggio",
13
+ "refresh": "Aggiorna",
14
+ "disable": "Disattiva salvataggi in background",
15
+ "enable": "Attiva salvataggi in background",
16
+ "disableHelp": "La disattivazione revoca tutte le destinazioni di questa app e annulla i salvataggi in sospeso. I file già salvati restano.",
17
+ "disabled": "I salvataggi in background sono disattivati. Un amministratore può attivarli; sarà poi necessario scegliere di nuovo una destinazione.",
18
+ "enabled": "I salvataggi in background sono attivi.",
19
+ "revoked": "Accesso revocato. I file già salvati restano.",
20
+ "untilRevoked": "Fino alla revoca dell’accesso",
21
+ "queued": "In coda",
22
+ "copying": "Salvataggio in corso",
23
+ "committed": "Salvato",
24
+ "canceled": "Annullato",
25
+ "canceling": "Annullamento in corso",
26
+ "interrupted": "Interrotto",
27
+ "uncertain": "Risultato sconosciuto",
28
+ "uncertainHelp": "Il risultato è sconosciuto. Controllare questo processo originale e la destinazione prima di intraprendere altre azioni. Questa app non lo salverà di nuovo automaticamente.",
29
+ "interruptedHelp": "Il salvataggio è stato interrotto. Controllare la destinazione; questa app non riproverà automaticamente.",
30
+ "loading": "Caricamento delle destinazioni e dei salvataggi…",
31
+ "denied": "Accesso negato. Controllare le autorizzazioni della cartella, quindi scegliere di nuovo la destinazione.",
32
+ "session": "Accedere di nuovo a DSM, quindi aggiornare.",
33
+ "conflict": "Esiste già un file con questo nome. Controllare la destinazione e scegliere un altro nome per un nuovo processo.",
34
+ "space": "Spazio insufficiente. Controllare la destinazione prima di avviare un nuovo processo.",
35
+ "error": "Impossibile confermare l’azione. Aggiornare per controllare il risultato attuale prima di intraprendere altre azioni.",
36
+ "scope": "Ambito di salvataggio confermato",
37
+ "scopeNeeds": "Un amministratore deve confermare la preselezione dell’installazione in «Configurazione amministratore» prima di poter scegliere una destinazione.",
38
+ "scopeMismatch": "La preselezione dell’installazione è diversa dall’ambito confermato. I salvataggi seguono l’ambito confermato:",
39
+ "reselect": "L’ambito di salvataggio è cambiato o l’autorizzazione è stata revocata. Scegliere di nuovo la destinazione. I file salvati in precedenza restano.",
40
+ "example": "Salva file di esempio",
41
+ "exampleHelp": "Salva un piccolo file di esempio nella destinazione attiva. L’app lo genera in privato, quindi lo salva con le autorizzazioni dell’utente. Controllare il risultato in «I miei salvataggi»."
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "title": "バックグラウンド保存",
3
+ "help": "このアプリは、サインアウト後もアクセスを取り消すまで、選択したフォルダにファイル全体を保存し続けることができます。既存のファイルは置き換えられません。",
4
+ "selection": "アクセスを取り消すまで、サインアウト後もこのアプリがここに保存することを許可します。",
5
+ "delegations": "自分の保存先",
6
+ "operations": "自分の保存",
7
+ "empty": "有効な保存先はありません。",
8
+ "noOperations": "保存操作はありません。",
9
+ "revoke": "アクセスを取り消す",
10
+ "choose": "保存先を選択",
11
+ "needs": "保存先を選択する前に、管理者がバックグラウンドアクセスを承認する必要があります。",
12
+ "cancel": "保存をキャンセル",
13
+ "refresh": "最新の情報に更新",
14
+ "disable": "バックグラウンド保存を無効にする",
15
+ "enable": "バックグラウンド保存を有効にする",
16
+ "disableHelp": "無効にすると、このアプリのすべての保存先が取り消され、保留中の保存がキャンセルされます。保存済みのファイルは残ります。",
17
+ "disabled": "バックグラウンド保存は無効です。管理者が有効にできます。その後、保存先を選び直す必要があります。",
18
+ "enabled": "バックグラウンド保存は有効です。",
19
+ "revoked": "アクセスを取り消しました。保存済みのファイルは残ります。",
20
+ "untilRevoked": "アクセスを取り消すまで",
21
+ "queued": "待機中",
22
+ "copying": "保存中",
23
+ "committed": "保存済み",
24
+ "canceled": "キャンセル済み",
25
+ "canceling": "キャンセル中",
26
+ "interrupted": "中断",
27
+ "uncertain": "結果不明",
28
+ "uncertainHelp": "結果が不明です。次の操作を行う前に、この元のジョブと保存先を確認してください。このアプリが自動的に再保存することはありません。",
29
+ "interruptedHelp": "保存が中断されました。保存先を確認してください。このアプリは自動的に再試行しません。",
30
+ "loading": "保存先と保存を読み込み中…",
31
+ "denied": "アクセスが拒否されました。フォルダの権限を確認してから、保存先を選び直してください。",
32
+ "session": "DSM に再度サインインしてから、最新の情報に更新してください。",
33
+ "conflict": "同じ名前のファイルがすでに存在します。保存先を確認し、新しいジョブには別の名前を選んでください。",
34
+ "space": "空き容量が不足しています。新しいジョブを開始する前に保存先を確認してください。",
35
+ "error": "操作の結果を確認できませんでした。次の操作を行う前に、最新の情報に更新して現在の結果を確認してください。",
36
+ "scope": "確認済みの保存範囲",
37
+ "scopeNeeds": "保存先を選択する前に、管理者が「管理者設定」でインストール時の事前選択を確認する必要があります。",
38
+ "scopeMismatch": "インストール時の事前選択が確認済みの範囲と異なります。保存は確認済みの範囲に従います:",
39
+ "reselect": "保存範囲が変更されたか、許可が取り消されました。保存先を選び直してください。以前に保存したファイルは残ります。",
40
+ "example": "サンプルファイルを保存",
41
+ "exampleHelp": "小さなサンプルファイルを有効な保存先に保存します。アプリが非公開で作成し、自分の権限で保存します。結果は「自分の保存」で確認してください。"
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "title": "백그라운드 저장",
3
+ "help": "이 앱은 로그아웃한 후에도 액세스를 취소할 때까지 선택한 폴더에 전체 파일을 계속 저장할 수 있습니다. 기존 파일은 덮어쓰지 않습니다.",
4
+ "selection": "액세스를 취소할 때까지 로그아웃한 후에도 이 앱이 여기에 저장하도록 허용합니다.",
5
+ "delegations": "내 대상",
6
+ "operations": "내 저장",
7
+ "empty": "활성 대상이 없습니다.",
8
+ "noOperations": "저장 작업이 없습니다.",
9
+ "revoke": "액세스 취소",
10
+ "choose": "저장 대상 선택",
11
+ "needs": "대상을 선택하려면 먼저 관리자가 백그라운드 액세스를 승인해야 합니다.",
12
+ "cancel": "저장 취소",
13
+ "refresh": "새로 고침",
14
+ "disable": "백그라운드 저장 비활성화",
15
+ "enable": "백그라운드 저장 활성화",
16
+ "disableHelp": "비활성화하면 이 앱의 모든 대상이 취소되고 대기 중인 저장이 취소됩니다. 이미 저장된 파일은 유지됩니다.",
17
+ "disabled": "백그라운드 저장이 비활성화되었습니다. 관리자가 활성화할 수 있으며, 그 후 대상을 다시 선택해야 합니다.",
18
+ "enabled": "백그라운드 저장이 활성화되었습니다.",
19
+ "revoked": "액세스가 취소되었습니다. 이미 저장된 파일은 유지됩니다.",
20
+ "untilRevoked": "액세스를 취소할 때까지",
21
+ "queued": "대기 중",
22
+ "copying": "저장 중",
23
+ "committed": "저장됨",
24
+ "canceled": "취소됨",
25
+ "canceling": "취소 중",
26
+ "interrupted": "중단됨",
27
+ "uncertain": "결과 알 수 없음",
28
+ "uncertainHelp": "결과를 알 수 없습니다. 다른 작업을 하기 전에 이 원래 작업과 대상을 확인하십시오. 이 앱은 자동으로 다시 저장하지 않습니다.",
29
+ "interruptedHelp": "저장이 중단되었습니다. 대상을 확인하십시오. 이 앱은 자동으로 다시 시도하지 않습니다.",
30
+ "loading": "대상과 저장을 불러오는 중…",
31
+ "denied": "액세스가 거부되었습니다. 폴더 권한을 확인한 후 대상을 다시 선택하십시오.",
32
+ "session": "DSM에 다시 로그인한 후 새로 고치십시오.",
33
+ "conflict": "같은 이름의 파일이 이미 있습니다. 대상을 확인하고 새 작업에는 다른 이름을 선택하십시오.",
34
+ "space": "공간이 부족합니다. 새 작업을 시작하기 전에 대상을 확인하십시오.",
35
+ "error": "작업 결과를 확인할 수 없습니다. 다른 작업을 하기 전에 새로 고쳐 현재 결과를 확인하십시오.",
36
+ "scope": "확인된 저장 범위",
37
+ "scopeNeeds": "대상을 선택하려면 먼저 관리자가 ‘관리자 설정’에서 설치 시 사전 선택을 확인해야 합니다.",
38
+ "scopeMismatch": "설치 시 사전 선택이 확인된 범위와 다릅니다. 저장은 확인된 범위를 따릅니다:",
39
+ "reselect": "저장 범위가 변경되었거나 권한이 취소되었습니다. 대상을 다시 선택하십시오. 이전에 저장된 파일은 유지됩니다.",
40
+ "example": "예제 파일 저장",
41
+ "exampleHelp": "작은 예제 파일을 활성 대상에 저장합니다. 앱이 비공개로 생성한 다음 사용자 자신의 권한으로 저장합니다. 결과는 ‘내 저장’에서 확인하십시오."
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "title": "后台保存",
3
+ "help": "注销后,此 App 仍可将完整文件保存到你选择的文件夹,直到你撤销访问权限。现有文件绝不会被替换。",
4
+ "selection": "允许此 App 在你注销后继续保存到这里,直到你撤销访问权限。",
5
+ "delegations": "我的目标",
6
+ "operations": "我的保存",
7
+ "empty": "目前没有有效的目标。",
8
+ "noOperations": "目前没有保存操作。",
9
+ "revoke": "撤销访问权限",
10
+ "choose": "选择保存目标",
11
+ "needs": "管理员必须先批准后台访问,你才能选择目标。",
12
+ "cancel": "取消保存",
13
+ "refresh": "刷新",
14
+ "disable": "停用后台保存",
15
+ "enable": "启用后台保存",
16
+ "disableHelp": "停用会撤销此 App 的所有目标并取消待完成的保存。已保存的文件会保留。",
17
+ "disabled": "后台保存已停用。管理员可以重新启用,之后你必须重新选择目标。",
18
+ "enabled": "后台保存已启用。",
19
+ "revoked": "访问权限已撤销。已保存的文件会保留。",
20
+ "untilRevoked": "直到你撤销访问权限",
21
+ "queued": "等待中",
22
+ "copying": "保存中",
23
+ "committed": "已保存",
24
+ "canceled": "已取消",
25
+ "canceling": "取消中",
26
+ "interrupted": "已中断",
27
+ "uncertain": "结果未知",
28
+ "uncertainHelp": "结果未知。请先检查这项原始任务和目标位置,再采取进一步操作。此 App 不会自动再次保存。",
29
+ "interruptedHelp": "保存已中断。请检查目标位置;此 App 不会自动重试。",
30
+ "loading": "正在加载目标与保存…",
31
+ "denied": "访问被拒绝。请检查文件夹权限,然后重新选择目标。",
32
+ "session": "请重新登录 DSM,然后刷新。",
33
+ "conflict": "已有同名文件。请检查目标位置,并为新任务选择其他名称。",
34
+ "space": "空间不足。请先检查目标位置,再开始新任务。",
35
+ "error": "无法确认操作结果。请刷新以检查当前结果,再采取进一步操作。",
36
+ "scope": "已确认的保存范围",
37
+ "scopeNeeds": "管理员必须先在“管理员设置”中确认安装时的预选,你才能选择目标。",
38
+ "scopeMismatch": "安装时的预选与已确认范围不同。保存将按已确认范围执行:",
39
+ "reselect": "保存范围已更改,或授权已被撤销。请重新选择目标。之前保存的文件会保留。",
40
+ "example": "保存示例文件",
41
+ "exampleHelp": "将一个小型示例文件保存到你的有效目标。App 先私下生成该文件,再以你自己的权限保存。请在“我的保存”中查看结果。"
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "title": "背景存檔",
3
+ "help": "登出後,App 仍可將完整檔案存入你選取的資料夾,直到你撤銷授權。既有檔案一律不會被取代。",
4
+ "selection": "允許此 App 在你登出後繼續儲存到這裡,直到你撤銷授權。",
5
+ "delegations": "我的目的地",
6
+ "operations": "我的存檔",
7
+ "empty": "目前沒有有效目的地。",
8
+ "noOperations": "目前沒有存檔工作。",
9
+ "revoke": "撤銷授權",
10
+ "choose": "選擇存檔目的地",
11
+ "needs": "管理員必須先核准背景存取,你才能選擇存檔目的地。",
12
+ "cancel": "取消存檔",
13
+ "refresh": "重新整理",
14
+ "disable": "停用背景存檔",
15
+ "enable": "啟用背景存檔",
16
+ "disableHelp": "停用會撤銷此 App 的所有目的地授權,並取消待完成的存檔。已儲存的檔案會保留。",
17
+ "disabled": "背景存檔已停用。管理員可重新啟用,之後你須重新選取目的地。",
18
+ "enabled": "背景存檔已啟用。",
19
+ "revoked": "授權已撤銷。已儲存的檔案會保留。",
20
+ "untilRevoked": "直到撤銷授權",
21
+ "queued": "等待中",
22
+ "copying": "存檔中",
23
+ "committed": "已儲存",
24
+ "canceled": "已取消",
25
+ "canceling": "取消中",
26
+ "interrupted": "已中斷",
27
+ "uncertain": "結果不明",
28
+ "uncertainHelp": "結果不明。請先檢查原工作與目的地,再決定後續操作。App 不會自動重新儲存。",
29
+ "interruptedHelp": "存檔已中斷。請檢查目的地;App 不會自動重試。",
30
+ "loading": "正在載入目的地與存檔…",
31
+ "denied": "存取遭拒。請檢查資料夾權限,再重新選取目的地。",
32
+ "session": "請重新登入 DSM,再重新整理。",
33
+ "conflict": "已存在同名檔案。請檢查目的地,並為新工作選擇另一個名稱。",
34
+ "space": "空間不足。請檢查目的地,再開始新工作。",
35
+ "error": "無法確認操作結果。請重新整理查詢目前結果,再決定後續操作。",
36
+ "scope": "已確認的儲存範圍",
37
+ "scopeNeeds": "管理員必須先在「管理員設定」確認安裝時的預選,你才能選擇目的地。",
38
+ "scopeMismatch": "安裝時的預選與已確認範圍不同。儲存會依已確認範圍執行:",
39
+ "reselect": "儲存範圍已更換,或授權已被撤銷。請重新選擇目的地。先前儲存的檔案會保留。",
40
+ "example": "儲存範例檔案",
41
+ "exampleHelp": "將小型範例檔案儲存到有效目的地。App 先在私有空間產生檔案,再以你自己的權限儲存。結果請在「我的存檔」查看。"
42
+ }
@@ -0,0 +1,47 @@
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
+ "details": "详情",
14
+ "refresh": "刷新",
15
+ "revoke": "撤销",
16
+ "cancel": "取消任务",
17
+ "noDelegations": "目前没有有效委托。",
18
+ "delegations": "我的委托",
19
+ "expires": "到期时间",
20
+ "downloads": "我的下载",
21
+ "noJobs": "目前没有下载任务。",
22
+ "url": "下载网址",
23
+ "name": "文件名",
24
+ "choose": "选择文件夹",
25
+ "submit": "下载到我的文件夹",
26
+ "destination": "目标文件夹",
27
+ "pending": "任务已取消。委托撤销尚未完成,App 将自动重试。",
28
+ "error": "操作未完成,请刷新后重试。若持续失败,请联系管理员。",
29
+ "setupError": "批准未完成,请重新输入 DSM 密码后重试,或检查 App 设置。",
30
+ "denied": "访问被拒绝,请检查文件夹权限后重试。",
31
+ "session": "请重新登录 DSM,然后刷新。",
32
+ "size": "下载上限为 64 MB、60 秒。",
33
+ "queued": "等待中",
34
+ "running": "下载中",
35
+ "succeeded": "已保存",
36
+ "failed": "失败",
37
+ "canceled": "已取消",
38
+ "interrupted": "已中断",
39
+ "homeScope": "各用户的 home 文件夹",
40
+ "scopeLabel": "后台保存范围",
41
+ "protectedScope": "已确认范围",
42
+ "preselection": "安装时的预选",
43
+ "preselectionHelp": "安装时的预选仅供参考。启用后台访问时,请用 DSM 密码确认此范围。",
44
+ "scopeMismatch": "安装时的预选与已确认范围不同。后台保存将按已确认范围执行。",
45
+ "scopeChangeHelp": "更改范围会撤销现有目标,并取消待完成的保存。用户必须重新选择目标。已保存的文件会保留。",
46
+ "confirmScope": "确认更改范围"
47
+ }
@@ -1,13 +1,16 @@
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 設定。",
13
+ "details": "詳情",
11
14
  "refresh": "重新整理",
12
15
  "revoke": "撤銷",
13
16
  "cancel": "取消工作",
@@ -21,16 +24,24 @@
21
24
  "choose": "選擇資料夾",
22
25
  "submit": "下載到我的資料夾",
23
26
  "destination": "目的資料夾",
24
- "pending": "工作已取消,委託撤銷待完成,App 將自動重試。",
27
+ "pending": "工作已取消。委託尚未撤銷完成,App 會自動重試。",
25
28
  "error": "操作未完成,請重新整理後再試。若持續失敗,請聯絡管理員。",
26
29
  "setupError": "核准未完成,請重新輸入 DSM 密碼再試,或檢查 App 設定。",
27
30
  "denied": "存取遭拒,請檢查資料夾權限後再試。",
28
31
  "session": "請重新登入 DSM,再重新整理。",
29
- "size": "下載上限為 64 MiB、60 秒。",
32
+ "size": "下載上限為 64 MB、60 秒。",
30
33
  "queued": "等待中",
31
34
  "running": "下載中",
32
35
  "succeeded": "已儲存",
33
36
  "failed": "失敗",
34
37
  "canceled": "已取消",
35
- "interrupted": "已中斷"
38
+ "interrupted": "已中斷",
39
+ "homeScope": "各使用者的 home 資料夾",
40
+ "scopeLabel": "背景儲存範圍",
41
+ "protectedScope": "已確認範圍",
42
+ "preselection": "安裝時的預選",
43
+ "preselectionHelp": "安裝時的預選只供參考。啟用背景存取時,請以 DSM 密碼確認這個範圍。",
44
+ "scopeMismatch": "安裝時的預選與已確認範圍不同。背景儲存會依已確認範圍執行。",
45
+ "scopeChangeHelp": "更換範圍會撤銷既有目的地,並取消待完成的儲存。使用者必須重新選擇目的地。已儲存的檔案會保留。",
46
+ "confirmScope": "確認更換範圍"
36
47
  }
@@ -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
+ }