@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,91 @@
1
+ <script setup lang="ts">
2
+ import {computed,onMounted,onUnmounted,ref} from 'vue'
3
+ import {Button,Callout,Dialog,Surface} from '@synopackageland/ui'
4
+ import {ShieldCheck,TriangleAlert} from '@lucide/vue'
5
+ import type {AuthorizationStatus,Context} from '../context'
6
+ import {authorizationCopy} from './i18n'
7
+ const props=defineProps<{ctx:Context}>()
8
+ const emit=defineEmits<{ready:[]}>()
9
+ const state=ref<AuthorizationStatus>()
10
+ const pendingState=ref<AuthorizationStatus>()
11
+ const busy=ref(false)
12
+ const failure=ref(false)
13
+ const confirmRevoke=ref(false)
14
+ let disposed=false,sequence=0,pendingRecheck=false
15
+ let unsubscribe:(()=>void)|undefined
16
+ const text=computed(()=>authorizationCopy(props.ctx.locale,props.ctx.displayName||'__DISPLAY_NAME__'))
17
+ const ready=computed(()=>state.value?.state==='ready')
18
+ const shown=computed(()=>state.value||pendingState.value)
19
+ const required=computed(()=>shown.value?.state==='authorization_required')
20
+ const untrusted=computed(()=>['helper_untrusted','cli_untrusted'].includes(shown.value?.reason||''))
21
+ const canAuthorize=computed(()=>required.value&&!untrusted.value)
22
+ const unavailableKey=computed(()=>shown.value?.reason==='credential_not_ready'?'credential':'unavailable')
23
+ const title=computed(()=>!shown.value?text.value('checking'):required.value?text.value('title'):shown.value.state==='ready'?text.value('ready'):shown.value.state==='not_admin'?text.value('not_admin.title'):shown.value.state==='session_expired'?text.value('session_expired.title'):text.value(unavailableKey.value+'.title'))
24
+ const body=computed(()=>required.value?text.value('purpose'):shown.value?.state==='not_admin'?text.value('not_admin.body'):shown.value?.state==='session_expired'?text.value('session_expired.body'):shown.value?.state==='unavailable'?text.value(unavailableKey.value+'.body'):text.value('purpose'))
25
+ const reasons=['grant_missing','upgrade_reapproval','helper_untrusted','cli_untrusted','grant_incompatible','package_identity_changed','maintenance_task_missing','maintenance_task_mismatch','helper_health_rejected','capability_missing']
26
+ const reason=computed(()=>reasons.includes(shown.value?.reason||'')?shown.value!.reason!:'unknown')
27
+ const next=computed(()=>untrusted.value?'next.reinstall':reason.value==='grant_missing'?'next.install':reason.value==='upgrade_reapproval'||reason.value==='grant_incompatible'?'next.update':'next.repair')
28
+ async function action(method:'status'|'request'|'revoke'){
29
+ if(busy.value||disposed)return
30
+ const current=++sequence
31
+ pendingState.value=method==='request'&&state.value?.state==='authorization_required'?state.value:undefined
32
+ busy.value=true;failure.value=false
33
+ // Mutation/revalidation immediately hides application content. A request
34
+ // keeps its prior reason visible while DSM's confirmation is pending.
35
+ state.value=undefined
36
+ try {
37
+ const result=await props.ctx.authorization?.[method]()
38
+ if(disposed||current!==sequence)return
39
+ if(!result||result.command!=='authorization'||result.schema_version!==1||!['ready','authorization_required','not_admin','session_expired','unavailable'].includes(result.state))throw Error('invalid status')
40
+ // A reason-only upgrade tombstone never accompanies a usable authorization.
41
+ if(result.reason==='upgrade_reapproval'&&result.state!=='authorization_required')throw Error('invalid status')
42
+ state.value=result
43
+ if(result.state==='ready')emit('ready')
44
+ } catch(e){if(!disposed&&current===sequence){
45
+ state.value=(e as {code?:string}).code==='session_required'?{command:'authorization',schema_version:1,state:'session_expired',reason:'session_expired'}:pendingState.value||{command:'authorization',schema_version:1,state:'unavailable',reason:'service_unavailable'}
46
+ failure.value=true
47
+ }} finally{if(!disposed&&current===sequence){busy.value=false;pendingState.value=undefined;if(pendingRecheck){pendingRecheck=false;void action('status')}}}
48
+ }
49
+ onMounted(()=>{unsubscribe=props.ctx.reopen(()=>{if(busy.value)pendingRecheck=true;else void action('status')});void action('status')})
50
+ onUnmounted(()=>{disposed=true;sequence++;if(typeof unsubscribe==='function')unsubscribe()})
51
+ </script>
52
+ <template>
53
+ <p class="authorization-announcement" role="status" aria-live="polite" aria-atomic="true">{{ busy ? text('authorizing') : title }}</p>
54
+ <div v-if="!ready" class="authorization-view" :aria-busy="busy" :data-authorization-state="state?.state || 'checking'">
55
+ <Surface class="authorization-card" padding="lg" raised :aria-label="title">
56
+ <span class="authorization-icon" aria-hidden="true"><component :is="shown?.state==='unavailable'||shown?.state==='session_expired'?TriangleAlert:ShieldCheck" class="authorization-icon-glyph" /></span>
57
+ <h1 class="authorization-title">{{ title }}</h1>
58
+ <p class="authorization-body">{{ body }}</p>
59
+ <Callout v-if="required" class="authorization-status" :tone="['grant_missing','upgrade_reapproval'].includes(reason)?'info':'warning'" :title="text('reason.'+reason)">{{ text(next) }}</Callout>
60
+ <Callout v-if="failure" class="authorization-failed" tone="warning">{{ text('failed') }}</Callout>
61
+ <div class="authorization-actions">
62
+ <Button v-if="canAuthorize" variant="primary" :loading="busy" :disabled="busy" @click="action('request')">{{ busy ? text('authorizing') : text('authorize') }}</Button>
63
+ <Button v-else variant="primary" :loading="busy" :disabled="busy" @click="action('status')">{{ busy ? text('checking') : text('retry') }}</Button>
64
+ </div>
65
+ </Surface>
66
+ </div>
67
+ <div v-else class="authorization-authorized">
68
+ <div class="authorization-ready"><ShieldCheck :size="16" aria-hidden="true"/><span>{{ text('ready') }}</span><Button v-if="ctx.authorization?.canManage?.()" variant="secondary" :disabled="busy" @click="confirmRevoke=true">{{ text('revoke') }}</Button></div>
69
+ <slot />
70
+ </div>
71
+ <Dialog v-model:open="confirmRevoke" :title="text('revoke.title')" :description="text('revoke.body')">
72
+ <template #footer><Button variant="secondary" @click="confirmRevoke=false">{{ text('cancel') }}</Button><Button variant="danger" :disabled="busy" @click="confirmRevoke=false;action('revoke')">{{ text('revoke') }}</Button></template>
73
+ </Dialog>
74
+ </template>
75
+ <style scoped>
76
+ .authorization-announcement{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
77
+ /* T0156: auto margins center the whole card but preserve top scrolling in a short window. */
78
+ .authorization-view{display:flex;align-items:flex-start;justify-content:center;min-height:100%;height:100%;box-sizing:border-box;padding:24px;overflow-y:auto;color:var(--ui-text);font-family:var(--ui-font-sans)}
79
+ .authorization-card{display:flex;flex-direction:column;align-items:center;gap:12px;width:100%;max-width:28rem;margin:auto;text-align:center}
80
+ .authorization-icon{display:flex;align-items:center;justify-content:center;width:48px;height:48px;flex-shrink:0;border-radius:9999px;background:var(--ui-primary-soft);color:var(--ui-primary)}
81
+ .authorization-icon-glyph{width:24px;height:24px}
82
+ .authorization-title{font-size:16px;font-weight:600;line-height:1.4;color:var(--ui-text);margin:0;text-wrap:balance}
83
+ .authorization-body{max-width:24rem;font-size:13px;line-height:1.6;color:var(--ui-text);margin:0;text-align:center;text-wrap:pretty}
84
+ .authorization-status,.authorization-failed{width:100%;text-align:left}
85
+ /* Essential recovery text uses the full foreground; DSM's muted token is below 4.5:1. */
86
+ .authorization-status,.authorization-failed{color:var(--ui-text)}
87
+ .authorization-actions{display:flex;justify-content:center;width:100%;margin-top:4px}
88
+ .authorization-authorized{display:flex;flex-direction:column;height:100%;min-height:0}.authorization-authorized :deep(.app-shell){flex:1;min-height:0;height:auto}
89
+ .authorization-ready{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:8px 16px;color:var(--ui-text);font:13px var(--ui-font-sans)}
90
+ @media(max-width:480px){.authorization-view{padding:16px}}
91
+ </style>
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} benötigt Ihre Erlaubnis",
3
+ "authorization.purpose": "Dieses Paket benötigt eine Genehmigung für feste Root-Operationen. DSM verarbeitet Ihr Passwort; das Paket sieht oder speichert es nicht.",
4
+ "authorization.reason.grant_missing": "Root-Operationen sind noch nicht autorisiert.",
5
+ "authorization.reason.upgrade_reapproval": "Das Paket wurde im Paket-Zentrum aktualisiert, daher wurde die bisherige Autorisierung widerrufen.",
6
+ "authorization.reason.helper_untrusted": "Dem privilegierten Helfer konnte nicht vertraut werden.",
7
+ "authorization.reason.cli_untrusted": "Dem privilegierten Befehl konnte nicht vertraut werden.",
8
+ "authorization.reason.grant_incompatible": "Der privilegierte Helfer muss aktualisiert werden.",
9
+ "authorization.reason.package_identity_changed": "Das Paketkonto hat sich geändert.",
10
+ "authorization.reason.maintenance_task_missing": "Die Wartungsaufgabe fehlt.",
11
+ "authorization.reason.maintenance_task_mismatch": "Die Wartungsaufgabe passt nicht mehr zur Berechtigung.",
12
+ "authorization.reason.helper_health_rejected": "Der privilegierte Helfer hat seine Integritätsprüfung nicht bestanden.",
13
+ "authorization.reason.capability_missing": "Dem privilegierten Helfer fehlt eine erforderliche Fähigkeit.",
14
+ "authorization.reason.unknown": "Die Berechtigung fehlt oder ist nicht mehr gültig.",
15
+ "authorization.next.install": "Wählen Sie Autorisieren und bestätigen Sie Ihr DSM-Passwort, um diesen Build zu genehmigen.",
16
+ "authorization.next.update": "Dieser Build benötigt eine neue Autorisierung. Wählen Sie Autorisieren und bestätigen Sie Ihr DSM-Passwort.",
17
+ "authorization.next.repair": "Prüfen Sie die Aufgaben dieses Pakets im Aufgabenplaner und versuchen Sie es erneut.",
18
+ "authorization.authorize": "Berechtigen",
19
+ "authorization.authorizing": "Warten auf DSM…",
20
+ "authorization.failed": "Die Berechtigung wurde nicht abgeschlossen. Sie können es erneut versuchen.",
21
+ "authorization.unavailable.title": "Berechtigung konnte nicht geprüft werden",
22
+ "authorization.unavailable.body": "Das ist meist vorübergehend. Versuchen Sie es erneut; {package} fragt nicht nach Ihrem Passwort.",
23
+ "authorization.credential.title": "Die DSM-Anmeldeinformationen sind nicht bereit",
24
+ "authorization.credential.body": "Diese DSM-Sitzung wurde ohne Anmeldung mit Kennwort wiederhergestellt, daher kann DSM die Anfragen von {package} nicht bestätigen. Melden Sie sich bei DSM ab, melden Sie sich erneut mit Ihrem Kennwort an und öffnen Sie dann {package} erneut.",
25
+ "authorization.retry": "Erneut versuchen",
26
+ "authorization.next.reinstall": "Die installierten Dateien stimmen nicht mit diesem Build überein. Installieren Sie das Paket aus einer vertrauenswürdigen Quelle neu.",
27
+ "authorization.not_admin.title": "Administrator erforderlich",
28
+ "authorization.not_admin.body": "Bitten Sie einen DSM-Administrator, dieses Paket zu öffnen und zu autorisieren.",
29
+ "authorization.session_expired.title": "Sitzung abgelaufen",
30
+ "authorization.session_expired.body": "Melden Sie sich erneut bei DSM an und öffnen Sie dieses Paket wieder.",
31
+ "authorization.ready": "Autorisiert",
32
+ "authorization.revoke": "Autorisierung widerrufen",
33
+ "authorization.revoke.title": "Autorisierung widerrufen?",
34
+ "authorization.revoke.body": "Neuer Helper-Zugriff wird deaktiviert. Paketdaten und bisherige Ergebnisse bleiben erhalten.",
35
+ "authorization.cancel": "Abbrechen",
36
+ "authorization.checking": "Autorisierung wird geprüft…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} needs your permission",
3
+ "authorization.purpose": "This package needs approval for its fixed root operations. DSM handles your password; the package never sees or stores it.",
4
+ "authorization.reason.grant_missing": "Root operations are not authorized yet.",
5
+ "authorization.reason.upgrade_reapproval": "The package was updated in Package Center, so its previous authorization was revoked.",
6
+ "authorization.reason.helper_untrusted": "The privileged helper could not be trusted.",
7
+ "authorization.reason.cli_untrusted": "The privileged command could not be trusted.",
8
+ "authorization.reason.grant_incompatible": "The privileged helper needs an update.",
9
+ "authorization.reason.package_identity_changed": "The package account changed.",
10
+ "authorization.reason.maintenance_task_missing": "The maintenance task is missing.",
11
+ "authorization.reason.maintenance_task_mismatch": "The maintenance task no longer matches the authorization.",
12
+ "authorization.reason.helper_health_rejected": "The privileged helper did not pass its health check.",
13
+ "authorization.reason.capability_missing": "The privileged helper lacks a required capability.",
14
+ "authorization.reason.unknown": "The authorization is missing or no longer valid.",
15
+ "authorization.next.install": "Choose Authorize and confirm your DSM password to approve this build.",
16
+ "authorization.next.update": "This build needs fresh authorization. Choose Authorize and confirm your DSM password.",
17
+ "authorization.next.repair": "Review this package and its tasks in Task Scheduler, then retry.",
18
+ "authorization.authorize": "Authorize",
19
+ "authorization.authorizing": "Waiting for DSM…",
20
+ "authorization.failed": "Authorization did not finish. You can try again.",
21
+ "authorization.unavailable.title": "Authorization could not be checked",
22
+ "authorization.unavailable.body": "This is usually temporary. Try again — {package} will not ask for your password.",
23
+ "authorization.credential.title": "DSM's sign-in credential is not ready",
24
+ "authorization.credential.body": "This DSM session was restored without a password sign-in, so DSM cannot vouch for {package}'s requests. Sign out of DSM, sign in again with your password, then reopen {package}.",
25
+ "authorization.retry": "Try again",
26
+ "authorization.next.reinstall": "The installed files do not match this build. Reinstall the package from a trusted source, then retry.",
27
+ "authorization.not_admin.title": "Administrator needed",
28
+ "authorization.not_admin.body": "Ask a DSM administrator to open this package and authorize it.",
29
+ "authorization.session_expired.title": "Session expired",
30
+ "authorization.session_expired.body": "Sign in to DSM again, then reopen this package.",
31
+ "authorization.ready": "Authorized",
32
+ "authorization.revoke": "Revoke authorization",
33
+ "authorization.revoke.title": "Revoke authorization?",
34
+ "authorization.revoke.body": "New helper access will be disabled. Package data and past results are retained.",
35
+ "authorization.cancel": "Cancel",
36
+ "authorization.checking": "Checking authorization…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} necesita su permiso",
3
+ "authorization.purpose": "Este paquete requiere aprobación para sus operaciones root fijas. DSM gestiona su contraseña; el paquete no la ve ni la almacena.",
4
+ "authorization.reason.grant_missing": "Las operaciones root aún no están autorizadas.",
5
+ "authorization.reason.upgrade_reapproval": "El paquete se actualizó en el Centro de paquetes, por lo que se revocó la autorización anterior.",
6
+ "authorization.reason.helper_untrusted": "No se pudo confiar en el asistente privilegiado.",
7
+ "authorization.reason.cli_untrusted": "No se pudo confiar en el comando privilegiado.",
8
+ "authorization.reason.grant_incompatible": "El asistente privilegiado necesita una actualización.",
9
+ "authorization.reason.package_identity_changed": "La cuenta del paquete ha cambiado.",
10
+ "authorization.reason.maintenance_task_missing": "Falta la tarea de mantenimiento.",
11
+ "authorization.reason.maintenance_task_mismatch": "La tarea de mantenimiento ya no coincide con la autorización.",
12
+ "authorization.reason.helper_health_rejected": "El asistente privilegiado no superó su comprobación de estado.",
13
+ "authorization.reason.capability_missing": "Al asistente privilegiado le falta una capacidad necesaria.",
14
+ "authorization.reason.unknown": "La autorización falta o ya no es válida.",
15
+ "authorization.next.install": "Elija Autorizar y confirme su contraseña de DSM para aprobar esta versión.",
16
+ "authorization.next.update": "Esta versión requiere una nueva autorización. Elija Autorizar y confirme su contraseña de DSM.",
17
+ "authorization.next.repair": "Revise las tareas de este paquete en el Programador de tareas y vuelva a intentarlo.",
18
+ "authorization.authorize": "Autorizar",
19
+ "authorization.authorizing": "Esperando a DSM…",
20
+ "authorization.failed": "La autorización no se completó. Puede intentarlo de nuevo.",
21
+ "authorization.unavailable.title": "No se pudo comprobar la autorización",
22
+ "authorization.unavailable.body": "Suele ser temporal. Inténtelo de nuevo; {package} no le pedirá la contraseña.",
23
+ "authorization.credential.title": "Las credenciales de inicio de sesión de DSM no están listas",
24
+ "authorization.credential.body": "Esta sesión de DSM se restauró sin iniciar sesión con contraseña, por lo que DSM no puede avalar las solicitudes de {package}. Cierre sesión en DSM, inicie sesión de nuevo con su contraseña y vuelva a abrir {package}.",
25
+ "authorization.retry": "Reintentar",
26
+ "authorization.next.reinstall": "Los archivos instalados no coinciden con esta versión. Reinstale el paquete desde una fuente fiable y vuelva a intentarlo.",
27
+ "authorization.not_admin.title": "Se requiere un administrador",
28
+ "authorization.not_admin.body": "Pida a un administrador de DSM que abra y autorice este paquete.",
29
+ "authorization.session_expired.title": "Sesión caducada",
30
+ "authorization.session_expired.body": "Inicie sesión de nuevo en DSM y vuelva a abrir este paquete.",
31
+ "authorization.ready": "Autorizado",
32
+ "authorization.revoke": "Revocar autorización",
33
+ "authorization.revoke.title": "¿Revocar autorización?",
34
+ "authorization.revoke.body": "Se desactivarán los nuevos accesos del asistente privilegiado. Se conservan los datos del paquete y los resultados anteriores.",
35
+ "authorization.cancel": "Cancelar",
36
+ "authorization.checking": "Comprobando autorización…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} demande votre autorisation",
3
+ "authorization.purpose": "Ce paquet nécessite une autorisation pour ses opérations root fixes. DSM traite votre mot de passe ; le paquet ne le voit ni ne le stocke.",
4
+ "authorization.reason.grant_missing": "Les opérations root ne sont pas encore autorisées.",
5
+ "authorization.reason.upgrade_reapproval": "Le paquet a été mis à jour dans le Centre de paquets ; l'autorisation précédente a donc été révoquée.",
6
+ "authorization.reason.helper_untrusted": "L'assistant privilégié n'a pas pu être approuvé.",
7
+ "authorization.reason.cli_untrusted": "La commande privilégiée n'a pas pu être approuvée.",
8
+ "authorization.reason.grant_incompatible": "L'assistant privilégié doit être mis à jour.",
9
+ "authorization.reason.package_identity_changed": "Le compte du paquet a changé.",
10
+ "authorization.reason.maintenance_task_missing": "La tâche de maintenance est introuvable.",
11
+ "authorization.reason.maintenance_task_mismatch": "La tâche de maintenance ne correspond plus à l'autorisation.",
12
+ "authorization.reason.helper_health_rejected": "L'assistant privilégié n'a pas réussi son contrôle d'intégrité.",
13
+ "authorization.reason.capability_missing": "Il manque à l'assistant privilégié une capacité requise.",
14
+ "authorization.reason.unknown": "L'autorisation est absente ou n'est plus valide.",
15
+ "authorization.next.install": "Choisissez Autoriser et confirmez votre mot de passe DSM pour approuver cette version.",
16
+ "authorization.next.update": "Cette version nécessite une nouvelle autorisation. Choisissez Autoriser et confirmez votre mot de passe DSM.",
17
+ "authorization.next.repair": "Vérifiez les tâches de ce paquet dans le Planificateur de tâches, puis réessayez.",
18
+ "authorization.authorize": "Autoriser",
19
+ "authorization.authorizing": "En attente de DSM…",
20
+ "authorization.failed": "L'autorisation ne s'est pas terminée. Vous pouvez réessayer.",
21
+ "authorization.unavailable.title": "Impossible de vérifier l'autorisation",
22
+ "authorization.unavailable.body": "C'est généralement temporaire. Réessayez ; {package} ne demandera pas votre mot de passe.",
23
+ "authorization.credential.title": "Les identifiants de connexion DSM ne sont pas prêts",
24
+ "authorization.credential.body": "Cette session DSM a été restaurée sans connexion par mot de passe : DSM ne peut donc pas authentifier les requêtes de {package}. Déconnectez-vous de DSM, reconnectez-vous avec votre mot de passe, puis rouvrez {package}.",
25
+ "authorization.retry": "Réessayer",
26
+ "authorization.next.reinstall": "Les fichiers installés ne correspondent pas à cette version. Réinstallez le paquet depuis une source fiable, puis réessayez.",
27
+ "authorization.not_admin.title": "Administrateur requis",
28
+ "authorization.not_admin.body": "Demandez à un administrateur DSM d’ouvrir ce paquet et de l’autoriser.",
29
+ "authorization.session_expired.title": "Session expirée",
30
+ "authorization.session_expired.body": "Reconnectez-vous à DSM, puis rouvrez ce paquet.",
31
+ "authorization.ready": "Autorisé",
32
+ "authorization.revoke": "Révoquer l’autorisation",
33
+ "authorization.revoke.title": "Révoquer l’autorisation ?",
34
+ "authorization.revoke.body": "Les nouveaux accès helper seront désactivés. Les données du paquet et les résultats précédents sont conservés.",
35
+ "authorization.cancel": "Annuler",
36
+ "authorization.checking": "Vérification de l’autorisation…"
37
+ }
@@ -0,0 +1,15 @@
1
+ import en from './en.json'
2
+ import zhTW from './zh-TW.json'
3
+ import zhCN from './zh-CN.json'
4
+ import ja from './ja.json'
5
+ import ko from './ko.json'
6
+ import de from './de.json'
7
+ import fr from './fr.json'
8
+ import es from './es.json'
9
+ import it from './it.json'
10
+ const catalogs:Record<string,Record<string,string>>={en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
11
+ /** Copy follows Reclaim T0156; root-task semantics are template-owned. */
12
+ export function authorizationCopy(locale:string,packageName:string){
13
+ const catalog={...en,...catalogs[locale]}
14
+ return (key:string)=>((catalog as Record<string,string>)[`authorization.${key}`]||key).replaceAll('{package}',packageName)
15
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} richiede l’autorizzazione",
3
+ "authorization.purpose": "Questo pacchetto richiede l’approvazione per le sue operazioni root fisse. DSM gestisce la password; il pacchetto non la vede né la memorizza.",
4
+ "authorization.reason.grant_missing": "Le operazioni root non sono ancora autorizzate.",
5
+ "authorization.reason.upgrade_reapproval": "Il pacchetto è stato aggiornato in Centro pacchetti, quindi l'autorizzazione precedente è stata revocata.",
6
+ "authorization.reason.helper_untrusted": "Non è stato possibile considerare attendibile l'helper privilegiato.",
7
+ "authorization.reason.cli_untrusted": "Non è stato possibile considerare attendibile il comando privilegiato.",
8
+ "authorization.reason.grant_incompatible": "L'helper privilegiato deve essere aggiornato.",
9
+ "authorization.reason.package_identity_changed": "L'account del pacchetto è cambiato.",
10
+ "authorization.reason.maintenance_task_missing": "L'attività di manutenzione non è presente.",
11
+ "authorization.reason.maintenance_task_mismatch": "L'attività di manutenzione non corrisponde più all'autorizzazione.",
12
+ "authorization.reason.helper_health_rejected": "L'helper privilegiato non ha superato il controllo di integrità.",
13
+ "authorization.reason.capability_missing": "All'helper privilegiato manca una capacità necessaria.",
14
+ "authorization.reason.unknown": "L'autorizzazione è mancante o non più valida.",
15
+ "authorization.next.install": "Scegliere «Autorizza» e confermare la password DSM per approvare questa versione.",
16
+ "authorization.next.update": "Questa versione richiede una nuova autorizzazione. Scegliere «Autorizza» e confermare la password DSM.",
17
+ "authorization.next.repair": "Controllare le attività del pacchetto nell’Utilità di pianificazione, quindi riprovare.",
18
+ "authorization.authorize": "Autorizza",
19
+ "authorization.authorizing": "In attesa di DSM…",
20
+ "authorization.failed": "L’autorizzazione non è stata completata. È possibile riprovare.",
21
+ "authorization.unavailable.title": "Impossibile verificare l'autorizzazione",
22
+ "authorization.unavailable.body": "Di solito è temporaneo. Riprovare; {package} non chiederà la password.",
23
+ "authorization.credential.title": "Le credenziali di accesso di DSM non sono pronte",
24
+ "authorization.credential.body": "Questa sessione DSM è stata ripristinata senza accesso con password, quindi DSM non può garantire per le richieste di {package}. Disconnettersi da DSM, accedere di nuovo con la password e riaprire {package}.",
25
+ "authorization.retry": "Riprova",
26
+ "authorization.next.reinstall": "I file installati non corrispondono a questa versione. Reinstallare il pacchetto da una fonte attendibile, quindi riprovare.",
27
+ "authorization.not_admin.title": "Amministratore necessario",
28
+ "authorization.not_admin.body": "Chiedere a un amministratore DSM di aprire e autorizzare questo pacchetto.",
29
+ "authorization.session_expired.title": "Sessione scaduta",
30
+ "authorization.session_expired.body": "Accedere nuovamente a DSM e riaprire questo pacchetto.",
31
+ "authorization.ready": "Autorizzato",
32
+ "authorization.revoke": "Revoca autorizzazione",
33
+ "authorization.revoke.title": "Revocare l’autorizzazione?",
34
+ "authorization.revoke.body": "I nuovi accessi helper saranno disabilitati. I dati del pacchetto e i risultati precedenti vengono conservati.",
35
+ "authorization.cancel": "Annulla",
36
+ "authorization.checking": "Verifica dell’autorizzazione…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} に承認が必要です",
3
+ "authorization.purpose": "このパッケージの固定 root 操作には承認が必要です。パスワードは DSM が処理し、パッケージは閲覧も保存もしません。",
4
+ "authorization.reason.grant_missing": "root 操作はまだ承認されていません。",
5
+ "authorization.reason.upgrade_reapproval": "パッケージ センターでパッケージが更新されたため、以前の承認は取り消されました。",
6
+ "authorization.reason.helper_untrusted": "特権ヘルパーを信頼できませんでした。",
7
+ "authorization.reason.cli_untrusted": "特権コマンドを信頼できませんでした。",
8
+ "authorization.reason.grant_incompatible": "特権ヘルパーの更新が必要です。",
9
+ "authorization.reason.package_identity_changed": "パッケージ アカウントが変更されました。",
10
+ "authorization.reason.maintenance_task_missing": "メンテナンス タスクが見つかりません。",
11
+ "authorization.reason.maintenance_task_mismatch": "メンテナンス タスクが認可と一致しません。",
12
+ "authorization.reason.helper_health_rejected": "特権ヘルパーがヘルス チェックに合格しませんでした。",
13
+ "authorization.reason.capability_missing": "特権ヘルパーに必要な機能がありません。",
14
+ "authorization.reason.unknown": "認可が見つからないか、無効になっています。",
15
+ "authorization.next.install": "「承認」を選び、DSM パスワードでこのビルドを承認してください。",
16
+ "authorization.next.update": "このビルドには再承認が必要です。「承認」を選び、DSM パスワードで確認してください。",
17
+ "authorization.next.repair": "タスク スケジューラでこのパッケージのタスクを確認し、再試行してください。",
18
+ "authorization.authorize": "認可",
19
+ "authorization.authorizing": "DSM を待機しています…",
20
+ "authorization.failed": "認可が完了しませんでした。もう一度お試しください。",
21
+ "authorization.unavailable.title": "認可を確認できませんでした",
22
+ "authorization.unavailable.body": "通常は一時的な問題です。もう一度お試しください。{package} がパスワードを求めることはありません。",
23
+ "authorization.credential.title": "DSM のサインイン資格情報が準備できていません",
24
+ "authorization.credential.body": "この DSM セッションはパスワードによるサインインなしで復元されたため、DSM は {package} のリクエストを保証できません。DSM からサインアウトし、パスワードで再度サインインしてから、{package} を開き直してください。",
25
+ "authorization.retry": "再試行",
26
+ "authorization.next.reinstall": "インストールされたファイルがこのビルドと一致しません。信頼できる配布元から再インストールし、再試行してください。",
27
+ "authorization.not_admin.title": "管理者が必要です",
28
+ "authorization.not_admin.body": "DSM 管理者にこのパッケージの承認を依頼してください。",
29
+ "authorization.session_expired.title": "セッションが期限切れです",
30
+ "authorization.session_expired.body": "DSM に再ログインし、このパッケージを開き直してください。",
31
+ "authorization.ready": "承認済み",
32
+ "authorization.revoke": "承認を取り消す",
33
+ "authorization.revoke.title": "承認を取り消しますか?",
34
+ "authorization.revoke.body": "新しい helper アクセスを無効にします。パッケージのデータと過去の結果は保持されます。",
35
+ "authorization.cancel": "キャンセル",
36
+ "authorization.checking": "承認を確認中…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} 승인 필요",
3
+ "authorization.purpose": "이 패키지의 고정 root 작업에는 승인이 필요합니다. 암호는 DSM이 처리하며 패키지는 암호를 보거나 저장하지 않습니다.",
4
+ "authorization.reason.grant_missing": "root 작업이 아직 승인되지 않았습니다.",
5
+ "authorization.reason.upgrade_reapproval": "패키지 센터에서 패키지가 업데이트되어 이전 승인이 취소되었습니다.",
6
+ "authorization.reason.helper_untrusted": "권한 있는 도우미를 신뢰할 수 없습니다.",
7
+ "authorization.reason.cli_untrusted": "권한 있는 명령을 신뢰할 수 없습니다.",
8
+ "authorization.reason.grant_incompatible": "권한 있는 도우미를 업데이트해야 합니다.",
9
+ "authorization.reason.package_identity_changed": "패키지 계정이 변경되었습니다.",
10
+ "authorization.reason.maintenance_task_missing": "유지 관리 작업이 없습니다.",
11
+ "authorization.reason.maintenance_task_mismatch": "유지 관리 작업이 권한과 일치하지 않습니다.",
12
+ "authorization.reason.helper_health_rejected": "권한 있는 도우미가 상태 검사를 통과하지 못했습니다.",
13
+ "authorization.reason.capability_missing": "권한 있는 도우미에 필요한 기능이 없습니다.",
14
+ "authorization.reason.unknown": "권한이 없거나 더 이상 유효하지 않습니다.",
15
+ "authorization.next.install": "승인을 선택하고 DSM 암호로 이 빌드를 승인하십시오.",
16
+ "authorization.next.update": "이 빌드는 새 승인이 필요합니다. 승인을 선택하고 DSM 암호로 확인하십시오.",
17
+ "authorization.next.repair": "작업 스케줄러에서 패키지 작업을 확인한 후 다시 시도하십시오.",
18
+ "authorization.authorize": "권한 부여",
19
+ "authorization.authorizing": "DSM을 기다리는 중…",
20
+ "authorization.failed": "권한 부여가 완료되지 않았습니다. 다시 시도할 수 있습니다.",
21
+ "authorization.unavailable.title": "권한을 확인할 수 없습니다",
22
+ "authorization.unavailable.body": "일반적으로 일시적인 문제입니다. 다시 시도하십시오. {package}은 암호를 요구하지 않습니다.",
23
+ "authorization.credential.title": "DSM 로그인 자격 증명이 준비되지 않았습니다",
24
+ "authorization.credential.body": "이 DSM 세션은 암호 로그인 없이 복원되었으므로 DSM이 {package}의 요청을 보증할 수 없습니다. DSM에서 로그아웃한 후 암호로 다시 로그인하고 {package}을 다시 여십시오.",
25
+ "authorization.retry": "다시 시도",
26
+ "authorization.next.reinstall": "설치된 파일이 이 빌드와 일치하지 않습니다. 신뢰할 수 있는 출처에서 패키지를 다시 설치한 후 다시 시도하십시오.",
27
+ "authorization.not_admin.title": "관리자가 필요합니다",
28
+ "authorization.not_admin.body": "DSM 관리자에게 이 패키지를 열고 승인하도록 요청하십시오.",
29
+ "authorization.session_expired.title": "세션이 만료되었습니다",
30
+ "authorization.session_expired.body": "DSM에 다시 로그인한 후 패키지를 다시 여십시오.",
31
+ "authorization.ready": "승인됨",
32
+ "authorization.revoke": "승인 취소",
33
+ "authorization.revoke.title": "승인을 취소하시겠습니까?",
34
+ "authorization.revoke.body": "새 helper 액세스가 비활성화됩니다. 패키지 데이터와 이전 결과는 유지됩니다.",
35
+ "authorization.cancel": "취소",
36
+ "authorization.checking": "승인 확인 중…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} 需要授权",
3
+ "authorization.purpose": "此套件执行固定的 root 操作前需要批准。密码由 DSM 处理,套件不会看到或存储。",
4
+ "authorization.reason.grant_missing": "尚未授权 root 操作。",
5
+ "authorization.reason.upgrade_reapproval": "套件已通过套件中心更新,之前的授权已撤销。",
6
+ "authorization.reason.helper_untrusted": "无法信任特权 helper。",
7
+ "authorization.reason.cli_untrusted": "无法信任特权命令。",
8
+ "authorization.reason.grant_incompatible": "特权 helper 需要更新。",
9
+ "authorization.reason.package_identity_changed": "套件账号已更改。",
10
+ "authorization.reason.maintenance_task_missing": "找不到维护任务。",
11
+ "authorization.reason.maintenance_task_mismatch": "维护任务已与授权不符。",
12
+ "authorization.reason.helper_health_rejected": "特权 helper 未通过健康检查。",
13
+ "authorization.reason.capability_missing": "特权 helper 缺少必要的能力。",
14
+ "authorization.reason.unknown": "授权已丢失或不再有效。",
15
+ "authorization.next.install": "选择“授权”,并使用 DSM 密码确认,即可批准此版本。",
16
+ "authorization.next.update": "此版本需要重新授权。请选择“授权”,并使用 DSM 密码确认。",
17
+ "authorization.next.repair": "请在任务计划中检查此套件的任务,再重试。",
18
+ "authorization.authorize": "授权",
19
+ "authorization.authorizing": "正在等待 DSM…",
20
+ "authorization.failed": "授权未完成,请重试。",
21
+ "authorization.unavailable.title": "无法检查授权",
22
+ "authorization.unavailable.body": "这通常是暂时的。请重试,{package} 不会要求输入密码。",
23
+ "authorization.credential.title": "DSM 的登录凭据尚未就绪",
24
+ "authorization.credential.body": "此 DSM 会话是恢复而来,并未使用密码登录,因此 DSM 无法为 {package} 的请求作证。请注销 DSM,使用密码重新登录,然后再打开 {package}。",
25
+ "authorization.retry": "重试",
26
+ "authorization.next.reinstall": "安装的文件与此版本不符。请从可信任的来源重新安装套件,再重试。",
27
+ "authorization.not_admin.title": "需要管理员处理",
28
+ "authorization.not_admin.body": "请 DSM 管理员打开此套件并完成授权。",
29
+ "authorization.session_expired.title": "登录已超时",
30
+ "authorization.session_expired.body": "请重新登录 DSM,再打开此套件。",
31
+ "authorization.ready": "已授权",
32
+ "authorization.revoke": "撤销授权",
33
+ "authorization.revoke.title": "撤销授权?",
34
+ "authorization.revoke.body": "新的 helper 访问将被禁用。套件数据与过往结果会保留。",
35
+ "authorization.cancel": "取消",
36
+ "authorization.checking": "正在检查授权…"
37
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "authorization.title": "{package} 需要授權",
3
+ "authorization.purpose": "此套件執行固定的 root 操作前需要核准。密碼由 DSM 處理,套件不會看到或儲存。",
4
+ "authorization.reason.grant_missing": "尚未授權 root 操作。",
5
+ "authorization.reason.upgrade_reapproval": "套件已透過套件中心更新,先前的授權已撤銷。",
6
+ "authorization.reason.helper_untrusted": "無法信任特權 helper。",
7
+ "authorization.reason.cli_untrusted": "無法信任特權命令。",
8
+ "authorization.reason.grant_incompatible": "特權 helper 需要更新。",
9
+ "authorization.reason.package_identity_changed": "套件帳號已變更。",
10
+ "authorization.reason.maintenance_task_missing": "找不到維護任務。",
11
+ "authorization.reason.maintenance_task_mismatch": "維護任務已與授權不符。",
12
+ "authorization.reason.helper_health_rejected": "特權 helper 未通過健康檢查。",
13
+ "authorization.reason.capability_missing": "特權 helper 缺少必要的能力。",
14
+ "authorization.reason.unknown": "授權已遺失或不再有效。",
15
+ "authorization.next.install": "選擇「授權」,並以 DSM 密碼確認,即可核准此版本。",
16
+ "authorization.next.update": "此版本需要重新授權。請選擇「授權」,並以 DSM 密碼確認。",
17
+ "authorization.next.repair": "請在任務排程表中檢查此套件的任務,再重試。",
18
+ "authorization.authorize": "授權",
19
+ "authorization.authorizing": "正在等待 DSM…",
20
+ "authorization.failed": "授權未完成,請再試一次。",
21
+ "authorization.unavailable.title": "無法檢查授權",
22
+ "authorization.unavailable.body": "這通常是暫時的。請再試一次,{package} 不會要求輸入密碼。",
23
+ "authorization.credential.title": "DSM 的登入憑證尚未就緒",
24
+ "authorization.credential.body": "此 DSM 工作階段是還原而來,並未使用密碼登入,因此 DSM 無法為 {package} 的要求作證。請登出 DSM,以密碼重新登入,然後再開啟 {package}。",
25
+ "authorization.retry": "重試",
26
+ "authorization.next.reinstall": "安裝的檔案與此版本不符。請從可信任的來源重新安裝套件,再重試。",
27
+ "authorization.not_admin.title": "需要管理員處理",
28
+ "authorization.not_admin.body": "請 DSM 管理員開啟此套件並完成授權。",
29
+ "authorization.session_expired.title": "登入已逾時",
30
+ "authorization.session_expired.body": "請重新登入 DSM,再開啟此套件。",
31
+ "authorization.ready": "已授權",
32
+ "authorization.revoke": "撤銷授權",
33
+ "authorization.revoke.title": "撤銷授權?",
34
+ "authorization.revoke.body": "新的 helper 存取將被停用。套件資料與過往結果會保留。",
35
+ "authorization.cancel": "取消",
36
+ "authorization.checking": "正在檢查授權…"
37
+ }
@@ -38,8 +38,9 @@ Declare `capabilities.files: session` for interactive File Station access,
38
38
  `capabilities.jobs: true` for persistent package-account jobs,
39
39
  `capabilities.identity: standalone` for independent DSM login, and
40
40
  `capabilities.rootOps: true` for administrator-approved fixed executor operations.
41
- `init --with files,jobs,login,root-ops` supports plain and Vue UI.
42
- Jobs and `daemon` are mutually exclusive; `delegate` is not implemented until P2.
41
+ `init --with files,jobs,root-ops` supports plain and Vue UI; `login` and
42
+ `delegate` need the Vue UI. `daemon` cannot be combined with `jobs`, but it can
43
+ be combined with an until-revoked `delegate`.
43
44
 
44
45
  ```sh
45
46
  synopkgland add files jobs login
@@ -126,7 +127,7 @@ access. The template ships no exceptions and sets DSM `allUsers` to `false`.
126
127
  | absent or `administrators` | `session_required` | `admin_required` | runs |
127
128
  | explicit `authenticated` | `session_required` | runs | runs |
128
129
  | explicit `public` | runs | runs | runs |
129
- | unregistered method | `session_required` | `admin_required` | `unknown_method` |
130
+ | unregistered method | `session_required` | `unknown_method` | `unknown_method` |
130
131
 
131
132
  Missing or invalid JSON, duplicate keys, unknown permissions and rules for
132
133
  unregistered methods fail closed. The CLI validates the file and binds its
@@ -193,13 +194,24 @@ Known limits:
193
194
  - Directory reachability and DSM name-service freshness affect native role
194
195
  checks. The bridge bypasses DSM's administrator-role cache but cannot force
195
196
  an upstream directory replica to be current. It refuses unknown results.
196
- - The static Go CGI embeds a minimal native bridge for Linux amd64/arm64,
197
+ - The static Go CGI embeds a minimal native bridge for Linux amd64/arm64/armv7,
197
198
  reproduced with Zig 0.16.0 from `internal/dsm/native/admin_check.c`. The bridge
198
199
  runs from a sealed memory file with a clean environment, a 3-second deadline
199
200
  and bounded output; no runtime Zig, compiler, writable executable or root
200
201
  privilege is required. The ELF files and build/source hashes are recorded in
201
202
  `native/provenance.json`. DSM must expose the native SDK symbol; otherwise
202
203
  authentication refuses access.
204
+ - Kernels without `memfd_create` (DSM 7 on Linux 3.10: armv7 and the x86_64
205
+ `avoton`, `braswell`, `bromolow`, `grantley` and `cedarview` platforms) cannot
206
+ seal the bridge. Only there, the CGI stages it in the package's own
207
+ `/var/packages/<package>/tmp` (DSM mounts `/tmp` noexec): a fresh 0700
208
+ directory, a 0500 file reopened read-only and unlinked before it runs. The
209
+ seal guarantee is lost: between the write and the unlink, a process running
210
+ as the same package account could replace the bridge. That account already
211
+ runs the CGI, so the bridge never trusts anything that account does not
212
+ already control; other accounts cannot write the directory, which must be
213
+ owned by the package account and not group- or world-writable. Any other
214
+ memfd failure still refuses.
203
215
 
204
216
  ## Customize the UI
205
217
 
@@ -323,6 +335,11 @@ use a DSM term, copy its `text` from the glossary and add your key to the
323
335
  term's `keys`. A Vue or React UI can keep its own i18n library; `ctx.t` and
324
336
  `ctx.locale` are there if you want them.
325
337
 
338
+ The Vue shell (`--ui vue`) keeps its text in `frontend/src/**/i18n/<locale>.json`,
339
+ one folder per area (status page, sign-in, files, background jobs), in the same
340
+ nine languages. Add new text to all nine files rather than writing it into a
341
+ `.vue` file.
342
+
326
343
  ## Package an existing binary
327
344
 
328
345
  Keep the Go backend and call your tool from a handler (recommended: auth
@@ -343,6 +360,22 @@ It then owns everything `backend/internal/api` does for you: bounded reads,
343
360
  POST-only JSON, same-origin checks, authentication before any work, and a
344
361
  refusal for unknown methods.
345
362
 
363
+ ## DSM Application Portal link
364
+
365
+ `synopkgland add portal` adds `portal: {}` to dsm-package.yaml so
366
+ `https://<nas>/<alias>/` opens this app right after DSM sign-in. The install
367
+ wizard proposes the alias (the package name in lowercase by default); an
368
+ administrator turns it on from the app's portal panel or Control Panel >
369
+ Login Portal > Applications. Ordinary users then see the link; until then
370
+ they see "ask an administrator". DSM owns the setting: the backend's
371
+ `portal.status` only reads it, and nothing in the package may write it. See
372
+ `synopkgland skill show portal`.
373
+
374
+ A portal needs DSM 7.3.2-86009 or later, so `add portal` raises a lower
375
+ `os_min_ver` and build refuses one below it. DSM 7.1.1 rejects an unsigned
376
+ package that registers a portal (Package Center error 320); 7.3.2 and 7.4
377
+ install it; 7.2 is untested. To keep supporting older DSM, remove `portal:`.
378
+
346
379
  ## Data, upgrades, uninstall
347
380
 
348
381
  The backend stores data in `/var/packages/__PACKAGE__/var` (the package's
@@ -384,9 +417,9 @@ install reuses the old data and how to start clean.
384
417
  The generated SPK ships
385
418
  an uninstall wizard (English, plus eight other languages) with one box, **Also
386
419
  delete the app data listed above** (`pkgwizard_remove_additional`), unchecked by
387
- default. Ticked, `postuninst` empties `@appdata/<package>` and `@apphome/<package>`
388
- and nothing else: not `@appconf`, Shared Folders, the package account or other
389
- packages. An upgrade never deletes anything. Do not write your own `postuninst`;
420
+ default. Ticked, `postuninst` empties `@appdata/<package>`, `@apphome/<package>`
421
+ and `@appconf/<package>` and nothing else: not Shared Folders, the package
422
+ account or other packages. An upgrade never deletes anything. Do not write your own `postuninst`;
390
423
  `synopkgland inspect` flags a deleting script that lacks the upgrade guard
391
424
  or deletes outside the package's own folders.
392
425
 
@@ -421,6 +454,6 @@ DSM testing.
421
454
  | | Status |
422
455
  | --- | --- |
423
456
  | Build hosts | macOS, Linux (any OS with Go and Node) |
424
- | Target CPUs | x86_64 and aarch64 DSM models (one SPK each) |
425
- | DSM | 7.1 or later declared (`os_min_ver`, change it with `init --min-dsm` or `build --min-dsm`). Installed and tested on DSM 7.4 (x86_64). aarch64 SPKs are built the same way but have not been run on a NAS. |
426
- | Not supported | 32-bit ARM, DSM 6, running anything as root without an administrator's approval |
457
+ | Target CPUs | x86_64 and aarch64 DSM models (one SPK each). armv7 (DSM 7.2+ platforms `alpine`, `alpine4k`, `armada38x`, `monaco`) is opt-in: add it to `arches`; it covers the Go CGI (plain or Vue UI), jobs, daemon, root-ops and delegate. armv7 jobs, daemon and executor (root-ops, delegate) are built and checked locally but have not been verified on a NAS |
458
+ | DSM | 7.1 or later declared (`os_min_ver`, change it with `init --min-dsm` or `build --min-dsm`). Installed and tested on DSM 7.4 and 7.3.2 (x86_64). armv7 was installed and tested on DSM 7.1.1 (`alpine4k`, Linux 3.10, where the bridge runs from the package tmp fallback) with administrator, AppPriv and unauthenticated requests; `armada38x` and `monaco` have not been run on a NAS. No x86_64 Linux 3.10 model has been tested. aarch64 SPKs are built the same way but have not been run on a NAS. |
459
+ | Not supported | armv7 platforms only DSM 7.0/7.1 ship (`armada370`, `armada375`, `armadaxp`, `comcerto2k`); DSM 6, running anything as root without an administrator's approval |