@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,846 @@
1
+ # Changelog
2
+
3
+ ## 0.7.1 (2026-10-10)
4
+
5
+ Rebuild packages to pick up template, hook and executor changes. The executor
6
+ digest changed. A package built with CLI 0.7.0 needs one administrator approval
7
+ after upgrading to a 0.7.1 build: the 0.7.0 executor opened the package
8
+ `target` link without following it, so it cannot install the anchored executor
9
+ itself. Executor-only upgrades between 0.7.1 or later builds need no approval.
10
+
11
+ ### Executor upgrade and daemon timeouts
12
+
13
+ - During an INFO-anchored executor-only upgrade the executor log said
14
+ `executor paused: package pins require administrator approval` about two
15
+ seconds before the new executor was ready. That line now appears only when
16
+ the pins differ; an anchored handover logs only `executor upgrade:
17
+ INFO-anchored executor installed under the approved policy`. The executor
18
+ digest changes.
19
+
20
+ - `executor_status_mismatch` in the app window and the app's settings names
21
+ its cause: `the approved executor is not answering (<reason>)`, `the running
22
+ executor reports other digests than this package pins`, or `the executor
23
+ status request failed` with the request's own code, instead of `scheduler
24
+ readback or operation failed` for all three. The Data and removal
25
+ troubleshooting table explains each.
26
+
27
+ - After approval or control start the window asked `executor.status` every
28
+ 500 ms for up to 10 s. The wait now doubles from 500 ms to 2 s within the
29
+ same 10 s budget: at most 7 requests instead of 20.
30
+
31
+ - For live upgrade tests, the repository's `scripts/test/executor-bump.py`
32
+ makes an executor-only build+1 SPK and now rewrites the window script's
33
+ embedded pins with the INFO anchor and `executor/setup.json`. The earlier
34
+ out-of-tree copy left the window pins behind, so the panel reported
35
+ `executor_status_mismatch` after every such upgrade while CGI and CLI
36
+ status were ready.
37
+
38
+ - On kernel 3.10 (DSM 7.1, for example DS416 armv7) an executor-only
39
+ upgrade, and approving again while the executor runs, no longer fail
40
+ with "pid executable mismatch". That kernel names a running executor
41
+ replaced by a rename after the rename source (`runtime/.executor
42
+ (deleted)`), and root control accepted only `runtime/executor`. Root
43
+ control now identifies the monitor by inode: the current
44
+ `runtime/executor`, or an unlinked root-owned inode on the runtime's
45
+ device whose last name was `executor` or `.executor*` in the runtime.
46
+ The fix runs in the new executor, which the installed one starts: an
47
+ upgrade from a package built with the target-link fix below needs no
48
+ approval; from 0.7.0 it still needs the one approval described there.
49
+ The executor digest changes.
50
+
51
+ - When the approved tasks are ready but the executor does not answer
52
+ (`executor_status_mismatch`), the app window offers Approve background
53
+ access again. With the tasks approved, it restarts the executor without
54
+ a password.
55
+
56
+ - `executor.status` (root-ops) names approval, not "Start the package", as
57
+ the next step when the package's last lifecycle request was start.
58
+ Regenerate or copy `backend/internal/app/executor.go`.
59
+
60
+ - An executor-only upgrade (same policy, new executor matching the INFO
61
+ `synopkgland_executor_sha256` anchor) no longer fails with "executor
62
+ upgrade refused: INFO-anchored executor could not be installed". The
63
+ installer opened `/var/packages/<pkg>/target/executor` without following
64
+ the DSM `target` link, which the executor refuses, so every such upgrade
65
+ stayed paused. The fix runs in the executor that is already installed:
66
+ an upgrade from a package built with an earlier SDK still needs one
67
+ administrator approval. The executor digest changes.
68
+
69
+ - `executor.status` (root-ops and delegate projects) no longer answers
70
+ `internal` while the executor is paused (package stopped, or pins waiting
71
+ for approval). It answers `{ready: false, state: "paused", reason:
72
+ "executor_not_listening", next}`, and `synopkgland status` shows the
73
+ reason and next step. Regenerate or copy
74
+ `backend/internal/app/executor.go` into existing projects.
75
+
76
+ - `daemon.timeouts` defaults are now `{start: 30, stop: 30, status: 5,
77
+ uninstall: 60}` (were `start: 5, stop: 10, status: 2`). On vt-nas under
78
+ IO load a boot start took more than 5 s and a Connect revoke more than
79
+ 9 s. The new `timeouts.uninstall` (2–120) bounds `uninstall_args`
80
+ separately; it used to get `stop - 1`, so an app had to raise the SIGKILL
81
+ wait to give its revoke time. DSM's package unit allows 3600 s for start
82
+ and stop. `inspect` still accepts SPKs built before `timeouts.uninstall`.
83
+ The manifest reference explains how to pick values from a loaded NAS.
84
+
85
+ ### Approval, identity and uninstall fixes
86
+
87
+ - `identity: standalone`: "Continue with DSM" and every live revalidation
88
+ failed with `session_required` after a DSM web login, because DSM web
89
+ sessions enable SynoToken and DSM answers the `id` cookie alone with 119.
90
+ The backend now forwards the request's single `X-SYNO-TOKEN` header, which
91
+ the DSM window's `ctx.call` already sends, when it checks the DSM session.
92
+ Sessions without SynoToken still verify with the cookie alone. The token is
93
+ never put in a URL, logged or stored. This also unblocks root-ops approval
94
+ in an `identity: standalone` package, which stopped at `executor.control`.
95
+ Existing projects need the updated `internal/identity` files.
96
+ - When approval created and read back both tasks but the executor then did
97
+ not start or report healthy, the window left the tasks behind, and with no
98
+ running executor there was no task inventory for uninstall to delete them.
99
+ The window now withdraws the tasks that approval created; tasks from an
100
+ earlier approval stay.
101
+ - After a wrong password or a withdrawn approval, the window panel showed
102
+ only "Check status". It and the app's settings now keep the approve action.
103
+ - Uninstall no longer logs `task cleanup unconfirmed` for every successful
104
+ delete: EventScheduler `delete` v1 and TaskScheduler `delete` v2 answer
105
+ `{"success":true}` without data, which now counts as confirmed. The task
106
+ definitions are unchanged, so no new approval is needed; the executor
107
+ digest changes.
108
+ - The native root window (`@synopackageland/cli/authorization-sdk`) gave up
109
+ after about 30 s with `root_timeout`, while a loaded NAS ran the bootstrap
110
+ task for up to 4.5 minutes. It now keeps waiting while the task is queued or
111
+ running, up to 10 minutes, reports `{op, state, elapsedMs}` through
112
+ `options.progress`, and the authorization flow accepts the backend's ready
113
+ grant after `root_timeout` or `root_task_failed`.
114
+ - A DSM certificate that Node does not trust failed with only
115
+ `fetch failed`. The CLI now reports `DSM_TLS_UNTRUSTED` with the origin and
116
+ certificate error and points to `NODE_EXTRA_CA_CERTS`; certificate checks
117
+ stay on.
118
+ - Docs: on DSM 7.1 the purge timing lines are only in the journal
119
+ (`journalctl -t synopkgland-executor`); `init -t native-go` does not include
120
+ `armv7` in `arches`, so add it for an armv7 NAS.
121
+
122
+ ### Deploy and status fixes
123
+
124
+ - `status` no longer reports `blocked` for every `identity: standalone`
125
+ project. It opens a short-lived App session from the administrator's DSM
126
+ session, reads `executor.status`, then logs out. That needs an `https://`
127
+ host; over `http://` the capability stays `blocked` and the reason says so.
128
+ - `deploy` accepts the install wizard values of an `install-selected`
129
+ delegate: `--param delegate_share=<Shared Folder>` or
130
+ `--param delegate_home=true`. A first install without one now fails with
131
+ `DEPLOY_PARAM_REQUIRED` and a usage line before anything is built, instead
132
+ of failing inside DSM. Invalid values fail with `DEPLOY_PARAM_TYPE_INVALID`.
133
+ - `deploy` and `status` work on a native layout (existing native product).
134
+ `deploy` builds the NAS architecture only; an `aarch64` NAS uses a declared
135
+ `armv8`.
136
+ - The deploy note no longer says every upgrade needs approval: an
137
+ executor-only upgrade stays ready; a policy digest change needs approval.
138
+ - Uninstall logs per-phase purge timing with the package name to the system
139
+ log (`synopkgland-executor`): `task cleanup timing` per task and
140
+ `purge timing` for the task and file phases. The executor digest changes.
141
+ - `add root-ops` and `add portal` print a notice on stderr when they raise
142
+ `os_min_ver`.
143
+ - `inspect` on an executor SPK describes the root boot and control tasks
144
+ instead of saying the package needs no root privileges.
145
+
146
+ ### DSM 7.1: root-ops and delegate approval work
147
+
148
+ - DSM 7.1.1 has no `SYNO.Core.TaskScheduler.Root` or
149
+ `SYNO.Core.EventScheduler.Root`, TaskScheduler stops at v3 and
150
+ PasswordConfirm at v1, so approval failed with "Background file access is
151
+ unavailable" and `status`/`deploy` showed `rootOps: unsupported — DSM 103`
152
+ or `DSM 104`. DSM 7.1.1 answers a version above the API's maximum with 104
153
+ (PasswordConfirm v2, TaskScheduler `get` v4) and a method missing at an
154
+ existing version with 103 (TaskScheduler `list` v3). When DSM answers a
155
+ scheduler read or the password check with 103 or 104, the app now uses
156
+ PasswordConfirm v1, TaskScheduler `list` v2/`get` v3 and creates
157
+ the tasks with EventScheduler `create` v1 and TaskScheduler `create` v3.
158
+ The password is still confirmed first and both tasks are still read back
159
+ exactly before anything runs. Other errors (such as 105, 119, 102 or a
160
+ wrong password, 3121) never fall back, and a create is never retried. DSM
161
+ 7.1 does not bind task creation to the password check; see the root-ops
162
+ guide.
163
+ - `status` and `deploy` read the control task the same way.
164
+ - Uninstall on DSM 7.1 now removes the boot and control tasks. The executor
165
+ looked the control task up with TaskScheduler `get` v4, which DSM 7.1.1
166
+ refuses with 104, so it wrote no task inventory and left both tasks behind.
167
+ - If approval stops after it created a task (for example, the boot task was
168
+ created and the control task was not), the app deletes the tasks it created
169
+ in that attempt instead of leaving an enabled root boot task that nothing
170
+ owns. Tasks from an earlier approval stay.
171
+ - A failed approval shows its reason and DSM error code in the app's settings
172
+ instead of only "Background file access is unavailable", and a refused
173
+ password reads as a password failure, not a scheduler failure.
174
+ - After the app's settings approve, the window's status line no longer shows
175
+ "needs-admin-approval: Task is missing" until a reload; the window panel and
176
+ the settings now follow each other's results.
177
+
178
+ ### DSM 7.1: jobs import and file downloads
179
+
180
+ - DSM 7.1.1 sends `SYNO.FileStation.Download` v2 replies without
181
+ `Content-Disposition`, so `bg.jobs.submit` and downloads failed with
182
+ `unavailable`. With no such header, a body of at most 4 KiB that decodes
183
+ as a DSM reply is still refused as that reply; any other body is the file.
184
+
185
+ ### Docs: build your own armv7 Go code with Go 1.26.9
186
+
187
+ - On armv7 DSM 7.1.1 (kernel 3.10), a program built with Go 1.26.0 crashed
188
+ at start (`futexwakeup returned -22`, SIGSEGV) and Go 1.26.9 ran. Other
189
+ 1.26 releases were not tested.
190
+
191
+ ### init: next steps install frontend dependencies
192
+
193
+ - `init -t native-go` with a Vue frontend now lists `(cd frontend && npm ci)`
194
+ before `synopkgland build`; without it the build fails with
195
+ `STANDALONE_UI_BUILD_FAILED`. `build` still does not install dependencies.
196
+
197
+ ### Executor, daemon and gateway build with exactly Go 1.26.9
198
+
199
+ - The CLI builds the executor, lifecycle helper, daemon controller and gateway
200
+ with `GOTOOLCHAIN=go1.26.9`, ignoring your `GOTOOLCHAIN`, `GOFLAGS`,
201
+ `GOEXPERIMENT`, `GOWORK` and `GOAMD64`/`GOARM64`, so every builder produces
202
+ the same executor digest. Go 1.21 or later downloads go1.26.9 when needed;
203
+ offline without it the build fails and names go1.26.9. A binary whose Go
204
+ build info names another release is refused.
205
+ - Template go.mod files now say `toolchain go1.26.9`. The executor digest
206
+ changes; it is anchored in INFO, so an upgrade with an unchanged policy needs
207
+ no new approval.
208
+
209
+ ### INFO arch: four more DSM platforms
210
+
211
+ - x86_64 SPKs now also list `broadwellntb`, `coffeelake` and `skylaked`, and
212
+ aarch64 SPKs list `rtd1619` (DSM Developer Guide Appendix A family members).
213
+ INFO `arch` now matches the platforms the package source maps to each family.
214
+
215
+ ### 繁體中文摘要
216
+
217
+ - 升級後重新建置套件;executor digest 改變。**從 0.7.0 建的套件升級需管理員再核准一次**(0.7.0 的
218
+ executor 開啟套件 `target` symlink 時未跟隨連結,無法自行安裝錨定的 executor);之後 0.7.1 起的
219
+ executor-only 升級不需核准。
220
+ - executor:kernel 3.10(DSM 7.1,如 DS416 armv7)上 executor-only 升級與執行中再核准不再出現
221
+ `pid executable mismatch`;INFO 錨定升級不再誤報 `executor upgrade refused`,也不再先印
222
+ 「paused: 需管理員核准」;`executor.status` 暫停時回 `paused`/`executor_not_listening` 與下一步。
223
+ - 面板:executor 不回應時可再按一次「Approve background access」免密碼重啟;
224
+ `executor_status_mismatch` 會寫出原因(不回應/digest 不同/status 請求失敗);
225
+ 啟動後的 `executor.status` 等待改為 500 ms→2 s 退避,10 s 預算不變。
226
+ - `daemon.timeouts` 預設改為 `{start: 30, stop: 30, status: 5, uninstall: 60}`,新增 `timeouts.uninstall`。
227
+ - `identity: standalone`:DSM 網頁 session(SynoToken)下「Continue with DSM」與 root-ops 核准修正;
228
+ 核准建立 task 後 executor 未啟動時自動撤回本次建立的 task;卸載不再誤記 `task cleanup unconfirmed`。
229
+ - 原生 root window 等待上限改為 10 分鐘並回報進度;`DSM_TLS_UNTRUSTED` 指向 `NODE_EXTRA_CA_CERTS`。
230
+ - `status`/`deploy`:standalone 專案的 status 改用短期 App session;`deploy` 接受
231
+ install-selected delegate 的精靈參數;支援 native layout;卸載記錄 purge timing。
232
+ - DSM 7.1:無 Root API 時改走 PasswordConfirm v1/TaskScheduler v2–v3/EventScheduler create v1,
233
+ 卸載會移除 boot/control task;`SYNO.FileStation.Download` v2 無 `Content-Disposition` 的下載修正。
234
+ - 建置:executor、lifecycle、daemon、gateway 一律以 Go 1.26.9 建置(armv7 kernel 3.10 上 1.26.0 會當機);
235
+ INFO `arch` 新增 `broadwellntb`、`coffeelake`、`skylaked`、`rtd1619`。
236
+ - 測試工具:`scripts/test/executor-bump.py` 收進 repo,會一併改寫視窗腳本內嵌的 executor pin。
237
+
238
+ ## 0.7.0 (2026-10-10)
239
+
240
+ Rebuild packages to pick up template, hook and executor changes. The executor
241
+ digest changed: apps approved under an earlier CLI need one administrator
242
+ approval after upgrading.
243
+
244
+ ### Delegate: save destinations that last until revoked
245
+
246
+ - `init --with delegate` / `add delegate` now declare `operations:
247
+ [files.moveFromStaging]`, `destinations: [save]`, `lifetime: until-revoked`,
248
+ `scope: install-selected`. Existing TTL declarations (`files.list` …
249
+ `files.write`, `scope: home`) keep their API and limits.
250
+ - The install wizard pre-selects home or a local share and an administrator
251
+ confirms it once. Choosing a destination in the SDK NasPicker grants it until
252
+ revoked, after fresh DSM session, UID and write checks; administrators run as
253
+ their own UID, never root. Read the choice from `delegate.status`
254
+ `selection`, `sdk.destination(key)` or Go `Service.Destination`.
255
+ - Daemon and export producers save through Go `Service.MoveFromStaging`. The
256
+ generated Background saves page (`createBackgroundSaveFacade`) lists, cancels
257
+ and revokes them and includes a working example (`ExportExample`). Daemon can
258
+ combine with an until-revoked delegate worker.
259
+ - Retrying `MoveFromStaging` with the same params never copies twice. Journal
260
+ errors `canceled`, `jobs_busy` and `jobs_unavailable` are retryable;
261
+ `spool_unsafe` and `journal_corrupt` are terminal.
262
+ - Cancel is idempotent per reference and survives executor crash, package
263
+ restart and logout. Revoke, scope change and disable settle copies in flight
264
+ as `canceled` with that reason (for example `scope-changed`); a scope change
265
+ no longer restarts the executor. Poll `ctx.executor.status()` while a change
266
+ answers `blocked`.
267
+ - Full device lifecycle acceptance (install → setup → reboot → upgrade → revoke
268
+ → uninstall) is still pending.
269
+
270
+ ### Executor
271
+
272
+ - Upgrades keep approval: each SPK writes its executor SHA-256 into INFO
273
+ (`synopkgland_executor_sha256`), and a new executor that matches it installs
274
+ without PasswordConfirm as long as the policy is unchanged. Policy changes
275
+ (operations, scope, destinations, root scripts) still need approval. `inspect`
276
+ refuses a missing, duplicated or different anchor.
277
+ - A root supervisor restarts the monitor after a crash or kill (1–60 s
278
+ backoff), so delegate and rootOps recover without a reboot.
279
+ - Every write publishes only through the executor handshake. A copy whose
280
+ executor died stops within 1 MiB and removes its `.part`; a lost publish
281
+ receipt settles `committed` without copying again.
282
+ - A package without an executor can add one in place on upgrade. Upgrade does
283
+ not approve an install-selected scope; confirm it in Settings.
284
+ - Uninstalling a stopped package no longer leaves root tasks and the monitor
285
+ running for ten minutes; the hook waits at most 50 s for the executor to clean
286
+ up.
287
+
288
+ ### Native layout: per-architecture INFO trust anchors
289
+
290
+ - `layout.anchors` maps `<key>_sha256` to a payload file. `build` writes that
291
+ architecture's SHA-256 of the file into INFO, so a product root helper can
292
+ trust a new build through the root-owned INFO instead of reapproval. Keys
293
+ match `^[a-z][a-z0-9_]{0,48}_sha256$`, the `synopkgland_` prefix is reserved,
294
+ and at most 16 are allowed. `inspect` refuses a changed, duplicated, missing
295
+ or undeclared anchor.
296
+
297
+ ### App entry and Application Privileges
298
+
299
+ - `entry: admin-only` admits administrators only, on every route including the
300
+ SDK routes; ordinary users get `admin_required`. `entry: app-privilege`
301
+ registers the app in Control Panel > Application Privileges and gates every
302
+ route on DSM's decision (`app_privilege_denied`). Omitting `entry` keeps the
303
+ previous behaviour and byte-identical SPKs.
304
+ - With an `entry`, an app route marked `authenticated` or `public` fails with
305
+ `STANDALONE_ENTRY_WIDENED`. `inspect` prints the entry mode and flags
306
+ `ENTRY_LAUNCHER_MISMATCH`.
307
+ - The executor applies the same rule: moves for a user DSM no longer allows are
308
+ refused (`APP_DENIED`).
309
+ - `ctx.user = {name, isAdmin}` lets UIs hide administrator settings; guard them
310
+ on the server with Go `api.RequireAdmin(caller)`.
311
+ - On Linux 3.10 kernels without `memfd_create` (DSM 7 on x86_64 avoton,
312
+ braswell, bromolow, grantley) the administrator and App Privileges bridges run
313
+ from an unlinked file in the package's own tmp instead of failing. That path
314
+ has no memfd seal. Verified on DSM 7.1.1 with an armv7 build only; no x86_64
315
+ Linux 3.10 model has been tested.
316
+
317
+ ### Application Portal
318
+
319
+ - `portal: {}` or `portal: {alias}` (native) and `integration.web.portal`
320
+ (Compose DSM-window apps); `synopkgland add portal` adds it. The install
321
+ wizard prefills the alias, upgrades keep it and an administrator activates it.
322
+ - `ctx.portal.mountPanel(element)` shows the link, or the alias form to
323
+ administrators; the Vue and plain starters mount it.
324
+ - A portal needs `os_min_ver` 7.3.2-86009 or later (DSM 7.1.1 rejects it with
325
+ error 320; 7.2 is untested). validate/build fail with
326
+ `STANDALONE_PORTAL_MIN_DSM` / `CONTRACT_PORTAL_MIN_DSM`, and `add portal`
327
+ raises a lower `os_min_ver`.
328
+
329
+ ### Catalog metadata
330
+
331
+ - An optional `metadata:` block (contact/support email, homepage, source and
332
+ issues URLs, license, localized long description, changelog, screenshots) is
333
+ validated and written to INFO for the package catalog.
334
+ - `metadata.changelog` may be a per-language map. Package Center shows one line
335
+ in the NAS language, so put the most important change first.
336
+
337
+ ### Native authorization
338
+
339
+ - `authorization_required` gains `reason: upgrade_reapproval` when an upgrade
340
+ revoked the old grant; the Gate template explains the next step in nine
341
+ languages. Products that sync the Gate need their helper to write and clear
342
+ the reason-only tombstone, which grants nothing.
343
+
344
+ ### Lifecycle
345
+
346
+ - Background packages restart a package user systemd manager that lost its
347
+ runtime socket; a failed worker start names the unit, exit code and socket
348
+ state.
349
+ - Stopping the worker is idempotent, fixing uninstall failure 314 for
350
+ delegate+daemon+jobs.
351
+
352
+ ### Templates in nine languages
353
+
354
+ - All template UI text and install, upgrade and uninstall wizard messages come
355
+ from catalogs in the nine DSM languages and follow DSM glossary wording. Sizes
356
+ use DSM's 1024-based KB/MB/GB. Rebuilt Vue and binary SPKs change bytes;
357
+ plain-UI SPKs are unchanged.
358
+ - Vue templates pin public `@synopackageland/ui@0.8.1`; the upload FilePicker
359
+ states `max 16 GB`.
360
+
361
+ ### armv7 (32-bit ARM) for native-go and binary packages
362
+
363
+ - `arches` accepts `armv7` (INFO `alpine alpine4k armada38x monaco`, DSM 7.2+);
364
+ the default stays `[x86_64, aarch64]`. It covers the Go CGI (plain or Vue UI),
365
+ `backend.kind: binary`, jobs, daemon, root-ops and delegate. Container
366
+ projects refuse it with `CONTAINER_ARCH_UNSUPPORTED`.
367
+ - The plain native-go CGI was verified on a DS416 (DSM 7.1.1, `alpine4k`).
368
+ armv7 jobs, daemon, executor and lifecycle helper are built and checked but
369
+ not yet verified on a NAS; `armada38x` and `monaco` are untested.
370
+ - `deploy` detects armv7 from an Annapurna Labs CPU and asks for `--arch` on a
371
+ Marvell CPU. x86_64 and aarch64 bridge, executor and lifecycle bytes are
372
+ unchanged by the armv7 work.
373
+
374
+ ### Packaging
375
+
376
+ - The npm tarball includes this CHANGELOG.md.
377
+
378
+ ### 繁體中文摘要
379
+
380
+ - 升級後重新建置套件;executor digest 改變,舊版 CLI 核准過的 app 需要管理員再核准一次。
381
+ - delegate:預設改為長期存檔目的地(`files.moveFromStaging`、安裝時選 scope、管理員確認一次、
382
+ 在 NasPicker 選目的地即授權至撤銷);Background saves 頁、`MoveFromStaging` 重送不重複複製、
383
+ 取消跨重啟保留。完整裝置生命週期驗收仍待完成。
384
+ - executor:INFO 錨定 executor SHA-256,policy 不變的升級免再核准;root supervisor 異常後自動重啟;
385
+ 卸載已停止的套件不再殘留 root task。
386
+ - 原生 layout:`layout.anchors` 依架構把 payload 檔 SHA-256 寫進 INFO,作為產品 root helper 的信任錨點。
387
+ - `entry: admin-only | app-privilege`(DSM 應用程式權限)、`ctx.user.isAdmin`、`api.RequireAdmin`;
388
+ 未宣告 entry 的 SPK 不變。Linux 3.10 無 memfd_create 時 bridge 改由套件 tmp 執行(無 memfd seal)。
389
+ - Application Portal(`portal:`、`add portal`、`ctx.portal`),需 os_min_ver 7.3.2-86009 以上;
390
+ 目錄 `metadata:` 寫入 INFO,`metadata.changelog` 可依語言分開。
391
+ - 授權契約新增 `reason: upgrade_reapproval`;背景套件 user manager 恢復、卸載 314 修正。
392
+ - 範本與安裝精靈全部九語系並依 DSM 用語;Vue 範本固定 UI 0.8.1。
393
+ - armv7(DSM 7.2+)支援 native-go 與 binary;plain CGI 已在 DS416 實機驗證,jobs/daemon/executor 尚未實機驗證。
394
+ - npm 套件附 CHANGELOG.md。
395
+
396
+ ## 0.6.1
397
+
398
+ - Restore native product packaging as a formal schema 2 `backend: {kind: native}`
399
+ route. Keep project-owned multi-binary payload/metadata layout, prepare/compile
400
+ argv hooks, HTTPS/SHA-256 toolkit acquisition and x86_64/aarch64/armv8/armv7.
401
+ `check`, `build` and `inspect --json` preserve package-only lifecycle/systemd
402
+ registration and reject root service accounts, privileged execution prefixes,
403
+ symlinks, setuid files and corrupt toolkit/payload inventories.
404
+ - Restore `@synopackageland/cli/authorization-sdk` as an explicit native-product
405
+ adapter with exact pinned-task identity, fresh administrator approval and
406
+ withdrawal-before-task-removal; do not change generated Go executor semantics.
407
+ Export `./native-layout` and retain direct `./dist/*` imports.
408
+ - Document field migration from schema 1 without changing product bootstrap pins,
409
+ per-build revocation/reapproval or dynamic DSM ABI declarations. Schema 1 remains
410
+ rejected; no compatibility aliases for retired CLI commands. Generated schema 2
411
+ check/build/status/logs and Connect/Gopeed APIs remain unchanged.
412
+ - Align SKILL.md with the shipped delegate/rootOps executor implementation and
413
+ its documented device acceptance boundaries.
414
+ - 正式補回 schema 2 原生產品 layout/hooks/toolkit/三架構及 authorization SDK。
415
+ lifecycle/systemd 維持 package account;root 僅由產品明確核准 digest,
416
+ 不自動授權、不取消逐 build 撤權再授權。新增 Reclaim 欄位 migration 指引。
417
+
418
+ ## 0.6.0
419
+
420
+ - Adopt UI 0.8.0 and its renamed `syno-pkg-land-ui` executable (no old alias).
421
+ Pin generated Vue apps and all overlays to the public npm artifact and integrity.
422
+ Skills discover the installed prompt/catalog/describe contract with
423
+ `npx --no syno-pkg-land-ui`; one-off use explicitly selects the npm package.
424
+ Render defaults to `syno-pkg-land-ui-render`. CSS/data selectors use the
425
+ `syno-pkg-land-ui` namespace without old aliases (including select attributes).
426
+ Add a regression audit for executable names and retired CSS/data selectors in
427
+ skills, templates, source, tests, docs and scripts; only released history is exempt.
428
+ 跟進 UI 0.8.0 的 CLI 改名及公開 npm integrity;AI 指引維持版本無關,
429
+ 使用已安裝契約,並防止指令名與 selector 回退。預設截圖目錄改為
430
+ `syno-pkg-land-ui-render`;CSS/data selector 全面使用新 namespace,不保留 alias。
431
+
432
+ - Add version-independent Vue UI guidance alongside JSON UI guidance. All
433
+ generated projects include AGENTS.md and a CLAUDE.md pointer to discover the
434
+ bundled skills and run local check/build/inspect before authorized NAS work.
435
+ Template design notes use installed UI contracts while dependency pins remain.
436
+ 新增 Vue UI skill;所有 scaffold 提供 AI 入口與本機驗證流程,設計文件依已安裝
437
+ SDK 契約,依賴鎖定不變。
438
+
439
+ - **Breaking: remove `./authorization-sdk` and the legacy root authorization
440
+ templates and adapters.** Use delegate/root-ops capabilities and the protected
441
+ executor with one-time administrator approval; no compatibility exports remain.
442
+ **不保留相容**:移除 `./authorization-sdk` 與舊 root authorization 模板/adapter,
443
+ 改用 delegate/root-ops 能力及受保護 executor 的一次管理員核准。
444
+
445
+ - Pin generated Vue apps to public `@synopackageland/ui@0.8.0` with its npm
446
+ integrity; keep bounded app-local modal roots, embedded CSS and unique mount
447
+ ID prefixes, and explicitly retain DSM window layout at wide sizes.
448
+ Add `skill show ui-json` with installed prompt/catalog/schema discovery,
449
+ strict validation and screenshot/layout checks through the published `syno-pkg-land-ui`
450
+ package bin. Update the template
451
+ DOM test dependency and website configuration to remove gate warnings.
452
+ Vue 模板固定公開 UI 0.8.0 與 integrity,維持 DSM 的 app scope、embedded CSS、
453
+ 唯一 mount ID 與 window layout;新增不固定版本的 JSON UI skill,依已安裝
454
+ catalog/schema 產生、嚴格驗證並 render,直接使用套件的 `syno-pkg-land-ui` bin。
455
+
456
+ - **Delegate (C), P2/v10 (through 26030e74):** `init --with delegate` / `add delegate` imply jobs;
457
+ manifest operations use the five fixed files.* IDs with home/shared scope.
458
+ The worker stages downloads and writes as the consenting user after browser
459
+ close, without overwriting existing files or retaining DSM credentials.
460
+ C/R share one-password boot/control task setup and digest approval; stop pauses,
461
+ start resumes identical pins, changed policy requires reapproval, and uninstall
462
+ requests asynchronous own-task/protected-state purge (normally seconds with a
463
+ healthy monitor), with manual cleanup guidance. Task deletion requires byte-for-byte
464
+ equality with canonical scripts regenerated from package identity and approved pins.
465
+ Purge reapproval recreates tasks and writes `start` before boot; mailbox failure
466
+ blocks boot. Local fake-DSM/real-executor lifecycle tests cover this recovery.
467
+ Package-directory/INFO identity absence immediately pauses the socket/requests,
468
+ retaining the monitor, approved runtime, delegations and tasks. Polling every
469
+ 500 ms must confirm 10 continuous minutes of absence before fallback purge;
470
+ reappearance or unverifiable absence resets the timer, with uncertainty staying paused.
471
+ Recovery rereads even an unchanged mailbox: matching-pin `start` resumes,
472
+ changed pins stay paused/needs-admin-approval, `stop` stays paused, and `purge`
473
+ immediately clears state. Temporary DSM-upgrade gaps preserve protected state;
474
+ preuninst purge remains immediate, with asynchronous cleanup. Boot's absent-package
475
+ retained-pin purge remains immediate. Local tests cover upgrade gaps, recovery,
476
+ timer/reset rules and immediate preuninst purge; device acceptance remains separate.
477
+ Malformed AppPriv responses fail closed, including duplicate keys/target entries,
478
+ null/missing data and nested error keys. Matching token header aliases are allowed;
479
+ conflicting/repeated headers, duplicate id cookies and controls are refused.
480
+ Empty/partial caller auth never falls back to worker revoke. Job admission reserves
481
+ before creating grants outside the journal lock; retry `jobs_busy` with the same key.
482
+ Writes fsync an exclusive hidden temporary then publish a hard link without overwrite;
483
+ cancellation cleans the temporary and leaves no partial final file.
484
+ Add bilingual developer and administrator guides covering typed Files, stable
485
+ errors, AppPriv defaults/denies and DSM-retained directories/accounts.
486
+ Full device lifecycle acceptance remains separate from source/local tests.
487
+ Delegate 隱含 jobs;以本人身分離線寫檔、不覆寫、不保存 DSM 憑證。
488
+ C/R 共用一次密碼設定與 digest 核准;中英文文件說明委託/撤銷、
489
+ typed Files、穩定錯誤碼、paused/purge、手動清理與 DSM 保留界線。
490
+ AppPriv 異常回應 fail-closed;token alias 同值允許、衝突/重複及控制字元拒絕,
491
+ 空/不完整 caller auth 不降級為 worker。`jobs_busy` 沿用相同 key 重試。
492
+ 隱藏暫存檔 fsync 後以 hard link 發布,不覆寫、取消不留半個正式檔。
493
+ 特權清理非同步,monitor 正常時通常數秒完成;刪 task 前完整 script 須逐字相符。
494
+ Purge 後重新確認密碼、重建 task,boot 前 mailbox 重設 `start`;寫入失敗不執行 boot。
495
+ 套件目錄/INFO identity 消失立即關 socket、取消/drain 請求並暫停,保留 monitor、
496
+ 核准 runtime、委託與 task;每 500 ms 輪詢確認連續消失達 10 分鐘才後備 purge。
497
+ 重新出現或無法確認消失皆重設計時;無法確認時維持 paused。
498
+ 恢復時重讀未變 mailbox:`start` 且 pins 相同才恢復,pins 改變維持 paused/
499
+ needs-admin-approval,`stop` 維持暫停,`purge` 立即清理。DSM 升級短暫空窗不誤清;
500
+ preuninst purge 仍立即處理、非同步清理;boot 套件不存在時驗 retained pins 立即 purge 不變。
501
+ 本機測試涵蓋升級空窗、恢復、計時/重設及 preuninst 立即 purge,不代表裝置驗收。
502
+
503
+ - **Breaking: schema 2 and task-based CLI, with no compatibility layer.**
504
+ Native-go and binary now use dsm-package.yaml schema 2 with backend.kind and
505
+ declared capabilities. Use init → check → build → deploy → status, positional
506
+ inspect <spk> and logs. The former build-spk/validate/info/log commands, native
507
+ layout/native.yaml, native privilege/background/fileStation fields and old
508
+ capability flags are removed; there are no aliases or migration shims.
509
+ Schema 2 uses --with files,jobs,delegate,login,root-ops or add to extend native-go:
510
+ private owner-bound data/jobs (A), live caller-session files/tree/transfers (B),
511
+ standalone identity (I), offline delegation (C), and fixed administrator
512
+ operations (R). C/R share one-time protected executor approval.
513
+ Manifest delegate.operations uses
514
+ files.list/files.info/files.createFolder/files.checkPermission/files.write
515
+ directly. Check/build/inspect/deploy/status support structured JSON results.
516
+ Compose retains its separate contract and uses init -t compose, optionally
517
+ importing with --from. No publish or signing command is added.
518
+ **不保留相容**:native-go/binary 改用 schema 2;CLI 依工作流程改名,
519
+ 移除舊欄位、旗標、指令與 native layout,不提供 alias 或 shim。
520
+ A/B/I/C/R 以能力宣告選用;C/R 共用 executor 一次核准。
521
+
522
+ - Generate background submit/schedule keys with cryptographic getRandomValues,
523
+ which works on DSM HTTP; do not require secure-context randomUUID.
524
+ 背景工作及排程以 getRandomValues 產生請求鍵,可在 DSM HTTP 使用;
525
+ 不再依賴僅限安全環境的 randomUUID。
526
+
527
+ - Give interactive File Station uploads their own bounded twenty-minute
528
+ response-header deadline without changing the shared metadata transport.
529
+ 互動 File Station 上傳使用獨立的二十分鐘回應標頭期限,不修改共用查詢 transport;
530
+ 保留目前 session、不覆寫、不重試及寫入結果不確定契約。
531
+
532
+ - Frame native-Go CGI JSON with exact byte lengths, including Unicode and
533
+ refusal/serialization failures; retain DSM's HTTP-200 JSON error convention.
534
+ native-Go CGI JSON(含 Unicode、拒絕及序列化失敗)提供精確位元組長度,
535
+ 並保留 DSM 的 HTTP 200 JSON 錯誤契約。
536
+
537
+ - Replace R2 publication with a private GitHub catalog and streamed Release SPKs.
538
+ - Serve live bilingual catalog pages and architecture-specific manual downloads.
539
+ - Remove the two web demo templates; retain native-go, binary and the single compose template.
540
+
541
+ ## 0.5.3
542
+
543
+ - Ship the native-go root authorization template with build-pinned plans,
544
+ the canonical Vue gate and nine language catalogs, explicit native approval,
545
+ exact disabled tasks, bounded legacy terminal proof and lifecycle withdrawal.
546
+ - Export `@synopackageland/cli/authorization-sdk` for reviewed native-layout
547
+ adapters to consume the same host runtimes and canonical template resources.
548
+ - Let an explicitly supplied native-layout withdrawal callback finish before
549
+ removing tasks; failed or missing callbacks abort withdrawal.
550
+ - Legacy DSM authorization has no server-enforced one-use create token;
551
+ modern DSM keeps its native one-use PasswordConfirm token contract.
552
+ - Isolate packed Docker runtime smoke in temporary share directories and its
553
+ own Compose project, including owned-volume cleanup. The 0.5.1 release tag
554
+ did not publish because the existing smoke omitted installer share values.
555
+ - Use a pinned long-running imported runtime fixture for readiness smoke;
556
+ the default hello-world demo exits immediately. The 0.5.2 workflow was
557
+ cancelled before publication when CI exposed that fixture race.
558
+ - Retain bounded artifact-test diagnostics up to eight MiB and propagate
559
+ real frontend test failures rather than hitting Node's default buffer limit.
560
+
561
+ ## 0.5.0
562
+
563
+ - Add opt-in native layout packaging for existing products: argv-only build hooks,
564
+ checksum-pinned HTTPS toolkit caching, custom package-user metadata/payload
565
+ layouts, explicit ELF linkage assertions, DSM armv8/armv7 and build overrides.
566
+ - Inspect native layouts with complete payload hash/mode and INFO checksum checks;
567
+ generated templates retain their existing privilege and architecture contracts.
568
+
569
+ - **GitHub CI and tag-based npm releases** (CI-LAND). Add shared full gates, Docker
570
+ runtime/tarball smoke and credential-free release dry runs for both npm packages.
571
+ Version tags require matching metadata, default-branch ancestry, an unpublished
572
+ version and versioned CHANGELOG notes. Push scripts now use the existing GitHub
573
+ origin; `push:all` preserves the separate Community Apps synchronization.
574
+
575
+ - **Vue templates pin UI 0.5.7 and let the UI text follow the app locale**
576
+ (TEMPLATE-UI-057). Every `native-go --ui vue` project pins
577
+ `@synopackageland/ui@0.5.7` (integrity `sha512-egHKoU4J...`). Each app root now wraps
578
+ its content in `ConfigProvider locale`, set from the DSM language by the template's
579
+ existing `uiLocale()` mapping, so the UI's built-in text follows it in the nine
580
+ built-in locales. The template drops the per-control `FilePicker` locale and the
581
+ `Link` `download-label` that only repeated those defaults; a template test requires
582
+ the provider and rejects those overrides. 0.5.7 also resolves `FormItem`
583
+ `direction="auto"` by the item's own width, stacks `SettingsRow` below 520px and
584
+ keeps `KeyValueRow` values wrapping; the template needed no mitigation for any of
585
+ these. Existing 0.5.6 projects upgrade by regenerating, or by changing the pin and
586
+ re-running `npm ci`.
587
+ - **Vue templates use the UI controls instead of native form elements**
588
+ (TEMPLATE-SELECT). The job form's worker and operation pickers and the
589
+ background schedule interval are now `Select`; the schedule consent is a
590
+ `Checkbox`; the job, schedule, sample-note and folder forms are `Form` +
591
+ `FormItem` + `FormActions` (vertical, controls capped at `md`), and the
592
+ hand-written `.integration-field` label CSS is gone. Labels are wired to
593
+ `Input` and `Textarea` through the FormItem control id. A template test now
594
+ fails when any `.vue` file renders a native `<select>`, `<option>`,
595
+ `<textarea>` or `<label>`, or a `FormItem` outside a vertical `Form`. Three UI
596
+ gaps remain and are not worked around with custom components: `Select` does
597
+ not take the FormItem control id (each Select carries a labelled
598
+ `role="group"` so it keeps an accessible name), the upload stays a native
599
+ `<input type="file">` because `FilePicker` hard-codes English "Choose files" and
600
+ "max" text, and the file download keeps a native `<a>` (no link component).
601
+ Existing projects pick this up only by regenerating; nothing changes in the
602
+ manifest, routes or backend.
603
+ - **Tarball smoke covers the default Vue UI and explicit plain UI**
604
+ (SMOKE-PACK-VUE). Install each generated Vue frontend with its lockfile before
605
+ building; keep both architectures and explicit root fixtures, then binary and
606
+ container packaging. The container smoke now selects `--arch x86_64` for
607
+ `-o app.spk` and its deployment plan, as explicit output requires one arch.
608
+ Docker runtime QA is opt-in with `smoke-pack.sh --docker`
609
+ and is explicitly skipped otherwise. Failed npm UI builds without installed
610
+ dependencies now name the UI directory and suggest `npm ci` (or `npm install`
611
+ without a lockfile) before retrying `build`; builds never install implicitly.
612
+
613
+ - **Vue templates pin UI 0.5.5 and use PageContent** (TEMPLATE-UI-055). Every
614
+ `native-go --ui vue` project pins `@synopackageland/ui@0.5.5` (integrity
615
+ `sha512-pLQmZqNH...`). The sidebar shell now wraps the page header and the page
616
+ content in the library `PageContent`, so a maximised window keeps both on the
617
+ same left and right edges; the page area scrolls inside it. 0.5.5 also adds
618
+ `CardGrid`, `FormActions`, `RepeatRows` and `fieldWidth`; the template has no
619
+ card lists or custom width CSS, so it needs none of them. Default change to
620
+ know when upgrading: form controls are capped at `md` (320px) unless you pass
621
+ `field-width="full"`. Existing 0.5.4 projects upgrade by re-running `npm ci`
622
+ after the pin change.
623
+
624
+ - **Vue templates pin UI 0.5.4** (TEMPLATE-UI-054). Every `native-go --ui vue`
625
+ project now pins `@synopackageland/ui@0.5.4` (integrity `sha512-mzuGUO+8...`).
626
+ 0.5.4 is visual only and changes nothing in the template source: under the
627
+ embedded theme, Card, EmptyState, PageHeader and WizardStep titles no longer
628
+ carry a default margin, the expand buttons of SettingsSection, Card and
629
+ ExpandableItem lose their grey box, and dashed separators draw only the bottom
630
+ edge. Existing 0.5.3 projects upgrade by re-running `npm ci` after the pin change.
631
+
632
+ - **Root tasks retain DSM 7.1 support.** Probe `list v3` and use the legacy
633
+ `create v3`, `list v2`, `get v3`, `run/delete v2`, and `view v1` only on code
634
+ 103. Preserve native password confirmation while distinguishing tokenless
635
+ success from cancellation; DSM 7.1 has no server-side root-creation password
636
+ token. Require a new successful completion record within a bounded deadline,
637
+ exact task identity, and no mutation retries. Root init, validation, and build
638
+ keep a consistent minimum of DSM 7.1-42661.
639
+ - **Vue templates pin UI 0.5.3** (TEMPLATE-UI-053). Every `native-go --ui vue`
640
+ project pins `@synopackageland/ui@0.5.3` in `frontend/package.json` and its
641
+ npmjs lockfile (integrity `sha512-ieKdf0nB...`). 0.4.2 to 0.5.3 is additive for
642
+ the template: new components (Select search and groups, Combobox,
643
+ MultipleSelect, SuperboxSelect, Grid/Row/Col, Space, Affix, Breadcrumb,
644
+ Pagination, SegmentControl, Card, Panel, Fieldset, Form, Notification, and more),
645
+ DataGrid grouping/expansion/reorder, checkable and draggable TreeView, DropdownMenu
646
+ submenus, and `Input`/`Dialog`/`SettingsSection`/`Callout` options with unchanged
647
+ defaults. Visual changes: Tabs and SectionTabs share a sliding marker with a
648
+ 160ms panel fade, the Spinner is a full rotating ring (both honour
649
+ `prefers-reduced-motion`), selected tab labels are blue, and the DataGrid footer
650
+ draws both borders and fills its flex container. The template needed no API
651
+ change; it now uses the library `Checkbox` and `Input` for the consent and limit
652
+ fields instead of native inputs. Existing 0.4.2 projects upgrade by re-running
653
+ `npm ci` after the pin change.
654
+
655
+ - **Templates never copy a local `node_modules`/`dist`** (TEMPLATE-COPY). A
656
+ template checkout used for development could leak its own install directory or
657
+ build output into a generated project, shadowing the project's `npm ci`.
658
+
659
+ - **Vue templates pin UI 0.4.2** (TEMPLATE-UI-042). Every `native-go --ui vue`
660
+ project pins `@synopackageland/ui@0.4.2` in `frontend/package.json` and its
661
+ npmjs lockfile. 0.4.1/0.4.2 are visual, backward-compatible control changes with
662
+ no API change: controls share the `--ui-control-*` tokens and
663
+ `--ui-radius-control`, so overriding `--ui-radius-sm`/`--ui-radius-md` no longer
664
+ reshapes them; a disabled grey button keeps its surface, a loading button keeps
665
+ full strength, and the Switch track padding is reset. Existing 0.4.0 projects
666
+ upgrade by re-running `npm ci` after the pin change.
667
+
668
+ - **Private-copy background schedules (S1-a)**: hourly/daily/weekly owner-scoped
669
+ creation, disable/delete, 8-definition limit, durable atomic trigger checkpoints,
670
+ missed-without-catch-up recovery, revision mismatch disable and explicit admin
671
+ re-enable. The Vue panel covers nine locales. Imported/pinned copies count toward
672
+ quotas; completed results never replay and owner purge also removes schedules.
673
+ Package account only, no stored credentials or offline personal ACL access.
674
+ Evidence: local gates and vt-nas DSM 7.4 x86_64 controlled-due-time tests
675
+ (two runs per owner, stop/start, +1 upgrade, disable and fresh normal1 browser
676
+ readback). This is not an hour-long cadence or reboot guarantee.
677
+
678
+ - **Minimum DSM 7.1 and multiple architectures** (DSM-COMPAT). Every template now declares
679
+ `os_min_ver: "7.1-42661"` (DSM 7.1; before: `7.2-64570`, `7.2-69057` or `7.2-60000`).
680
+ `init --min-dsm` and `build --min-dsm` take `7.0`, `7.1`, `7.2` or a full
681
+ `7.x-build` to override it. `build --arch` accepts a comma-separated list
682
+ - **Per-runtime minimum DSM and multiple architectures** (DSM-COMPAT, DSM-COMPAT-2).
683
+ `native-go` and `binary` declare `os_min_ver: "7.1-42661"` (DSM 7.1; before:
684
+ `7.2-64570`, `7.2-69057` or `7.2-60000`). The container templates declare
685
+ `7.2.1-69057` (DSM 7.2.1), and `init --min-dsm`/`build --min-dsm` refuse a
686
+ container value below it (`MIN_DSM_CONTAINER_FLOOR`) because Container Manager's
687
+ docker-project worker only exists from DSM 7.2.1; `inspect` reports the same
688
+ gap on an already-built container SPK. `--min-dsm` takes `7.0`, `7.1`, `7.2`,
689
+ `7.2.1` or a full `7.x-build`. `build --arch` accepts a comma-separated list
690
+ (`x86_64,aarch64`); without it every family is built, one SPK per family (binary and
691
+ gateway container Apps used to require `--arch`). `inspect` flags an INFO `arch`
692
+ that mixes families or names an unknown platform, a CGI built for another family than
693
+ INFO declares, and an `os_min_ver` that is not a DSM 7 `<version>-<build>`. The
694
+ x86_64 INFO platform list now includes `kvmcloud`, `epyc7003` and `epyc7003ntb`.
695
+ Only DSM 7.4 x86_64 has been run.
696
+ - **Ordinary-user background jobs (U1)**: administrators may independently enable
697
+ `allowOrdinaryUsers`. Fresh DSM username/UID ownership isolates list/get/cancel/result,
698
+ counts and idempotency keys; unknown UIDs fail closed. Per-owner admission is bounded
699
+ to 2 pending jobs and 1 MiB including reserved results, under the same spool lock.
700
+ Administrators can cancel all jobs and explicitly purge an exact owner with durable
701
+ audit and running-job drain. The Vue panel and all nine locales cover both roles.
702
+ No root or stored user credentials; S1-a adds private-copy schedules below.
703
+
704
+ - **Container gateway directory groups** (GW-DIRECTORY-GROUPS). Accounts absent
705
+ from `/etc/passwd` now resolve groups through DSM NSS using the fixed `/usr/bin/id`
706
+ as the package account. Qualified `DOMAIN\group` and `group@domain` names retain
707
+ their exact domain and case, including internal spaces; lookup failure denies.
708
+ The SDK caches nothing (TTL 0); DSM NSS caches and already-open streams remain
709
+ limitations. AD resolver allow/deny checks passed in a non-root DSM 7.4 package
710
+ CGI; LDAP, AD-user browser login and group-removal propagation remain unverified.
711
+ Rebuild container SPKs to obtain the change.
712
+
713
+ - **`synopkgland images pin` resolves and writes container image digests**
714
+ (IMAGE-DIGEST-CLI). It reads every service image in `compose.yaml`, asks the
715
+ registry for the current multi-arch manifest digest over the OCI Distribution
716
+ API (anonymous Bearer token flow for Docker Hub and ghcr; no Docker daemon or
717
+ `buildx`), and rewrites the reference to `tag@sha256:…` in place, keeping
718
+ comments and file layout. `--check` reports unpinned and stale pins without
719
+ writing and exits non-zero. `inspect`'s unpinned-image finding now points at
720
+ the command. Evidence: local unit tests against a fake registry plus one manual
721
+ Docker Hub resolution of `busybox:1.36`; not verified on a real DSM.
722
+ - **Container upgrade wizard no longer breaks on an untouched Run-as control; numeric
723
+ command arguments are rejected for every Compose route** (WIZARD-LIVE-CHECK).
724
+ Measured on vt-nas (DSM 7.4-90069) with the `compose-import` template: an untouched
725
+ upgrade submitted `RUN_AS` pre-filled with the name of the first Shared Folder, `preinst`
726
+ failed, and DSM, which removes the old version before it runs the new `preinst`, left the
727
+ package not installed (data kept). A `dsm_user` now has the same "Change Container Run-as"
728
+ box as a Shared Folder: on an upgrade the submitted user only counts when that box (or
729
+ `deploy --run-as`) is set; otherwise the installed user is kept. Also on vt-nas: the
730
+ Docker Project worker drops YAML quotes, so `command: ["sleep", "3600"]` ended the
731
+ install as broken (`failed to acquire postinst worker`). `synopkgland check` and
732
+ `build` already rejected that on the static route; the dynamic route (install
733
+ parameters, which includes `compose-import`) now rejects it too
734
+ (`COMPOSE_NUMERIC_COMMAND_ARG_FORBIDDEN`).
735
+ - **`install.sharedFolder`** (T-0120): native-go packages can declare a Shared Folder (`select` wizard or `create`
736
+ via DSM `data-share`), stored by name in `var/config.json`; `init --shared-folder select|create` and an `inspect`
737
+ check are included. In `select` mode the administrator grants the package account access afterwards.
738
+ - **Container gateway accepts a query SynoToken; known limit with DSM CSRF protection on**
739
+ (GW-QUERY-TOKEN). On `GET`, `HEAD` and `OPTIONS` with an empty `X-SYNO-TOKEN`, the
740
+ gateway hands a `?SynoToken=` value to `authenticate.cgi` (header wins; still stripped
741
+ upstream); state-changing methods are unchanged. Measured on DSM 7.4 with "Improve
742
+ protection against cross-site request forgery attacks" on: opening a container App
743
+ from the DSM desktop sends no token at all, so the gateway answers `401`
744
+ `session_required`. Known limitation: turn the setting off or use the `native-go`
745
+ template.
746
+ - **Container gateway: readable errors, SSE and WebSocket** (GW-ERRORS-WS). DSM's web
747
+ server replaces the body and headers of any CGI reply with status `403`, `404`,
748
+ `500`, `502`, `503` or `504` by its generic error page (measured on DSM 7.4-90069;
749
+ every other status passes whole). The gateway therefore no longer sends those
750
+ statuses itself: `forbidden` and `token_required` arrive as `401`, a stopped
751
+ container as `521` with `Retry-After`, a timeout as `524`, an invalid reply as
752
+ `520`; every gateway error carries `X-Synopkgland-Error` (the code) and, for a
753
+ stand-in, `X-Synopkgland-Status` (the status it replaces). **Behaviour change:**
754
+ those statuses were `403`/`503`/`504`/`502`/`500` before. A request header
755
+ `X-Synopkgland-Keep-Error-Body: 1` makes the same swap for the container's own
756
+ error replies so an App can read its JSON error bodies. Server-Sent Events pass
757
+ through unbuffered and **WebSocket now works** (it answered `501`): DSM hands both
758
+ directions of an upgraded connection to the CGI, which the gateway uses; the
759
+ handshake must pass the same same-origin check as a state-changing request
760
+ (`cross_site_blocked`), because a browser cannot add `X-SYNO-TOKEN` to a handshake. Other protocol upgrades stay
761
+ `501`. See [Container access control](/docs/guides/container-access/).
762
+ - Fix: **`dsm-groups` with `groups: [users]` let nobody in.** DSM keeps no member
763
+ list for `users` (every local account has it as its primary group), so the gateway,
764
+ which only read member lists from `/etc/group`, answered `403` to everyone, including
765
+ administrators (reproduced on vt-nas). The gateway now also counts the primary gid
766
+ from `/etc/passwd` as membership and fails closed if it cannot read that file.
767
+ Rebuild the SPK to pick it up. Real-account `dsm-groups`/`dsm-admins` checks passed on
768
+ vt-nas (x86_64); the aarch64 gateway is verified in an arm64 Linux VM only, not on an
769
+ aarch64 DSM NAS.
770
+ - **Gateway CSRF check no longer relies on the SynoToken value** (GW-TOKEN). On a NAS
771
+ where DSM's "Improve protection against cross-site request forgery attacks" is off (vt-nas: `enable_syno_token="no"`), DSM
772
+ issues one fixed placeholder token to every session and validates nothing. The container
773
+ gateway now also requires `Sec-Fetch-Site: same-origin` and/or an `Origin` equal to the
774
+ request `Host` for `POST`/`PUT`/`PATCH`/`DELETE` (answer `cross_site_blocked`, sent as `401` because DSM replaces `403` bodies) and a
775
+ well-formed `X-SYNO-TOKEN`; safe methods are unchanged. Browsers that send neither
776
+ header on a state-changing request are refused. Verified on a real DSM 7.4 as an
777
+ administrator and an ordinary user (foreign `Origin`, `null`, `Sec-Fetch-Site`
778
+ cross-site/same-site, missing evidence refused; same-origin passes). The token path with
779
+ the DSM setting on is untested. Rebuild container SPKs to pick it up. See
780
+ [Container access](/docs/guides/container-access/).
781
+ - **Container templates pin their image by digest** (CONTAINER-PULL): `hello-files` and `compose-import` now use
782
+ `image: <tag>@sha256:…`. `build` writes `force_pull: false` into the
783
+ `docker-project` resource when every service image is digest-pinned and keeps
784
+ `force_pull: true` while any image is a bare tag, so an install no longer
785
+ re-resolves a moving tag that other containers share. `inspect` reports each
786
+ service whose image is not digest-pinned. Behaviour for projects with unpinned
787
+ images is unchanged. Not verified on a real DSM.
788
+ - **Breaking: container Apps are DSM-authenticated by default.** A container App
789
+ with an `adminport` is now served through a gateway CGI
790
+ (`/webman/3rdparty/<package>/cgi/gateway.cgi/…`) that runs as the package
791
+ account, checks the DSM session and forwards to the container. Without a valid
792
+ session it answers `401`; unsafe methods need `X-SYNO-TOKEN`; a stopped container
793
+ gives `521` with `Retry-After` (not `503`: DSM would replace its body). New `integration.web.access`: `dsm-users`
794
+ (default), `dsm-admins`, `dsm-groups` (+ `groups`), `public`. No Web Station
795
+ portal is registered unless `public`. The container port must be bound to
796
+ loopback (`127.0.0.1:<adminport>:<port>`): `check` fails with
797
+ `COMPOSE_GATEWAY_PORT_EXPOSED`, and `inspect`/`inspect` report
798
+ `CONTAINER_PORT_EXPOSED` and `CONTAINER_ANONYMOUS_PORTAL`. The gateway is
799
+ compiled Go, so building such an App needs Go and `--arch`, and the SPK is no
800
+ longer `noarch`. Privilege stays `run-as: package` with no root task.
801
+ **Migration:** bind the Compose port to `127.0.0.1`, rebuild with a higher
802
+ `build` and an `--arch`, then upgrade (the old `/<alias>/` portal and bookmarks
803
+ go away); or set `integration.web.access: public` to keep the anonymous
804
+ behaviour. See `website` guide “Container access control”.
805
+ - Add best-effort `revealFile` selection recovery using File Station 1.4.x
806
+ private structures, with feature detection and silent cancellation on absent or
807
+ throwing APIs. One AppLaunch binds its callback receiver; only that receiver's
808
+ model may be selected once. Interaction, navigation away, close, disposal and
809
+ replacement requests cancel observers. Named bounds are 5000 ms total, 100 ms
810
+ checks and 300 ms quiet time, without device latency proof. `requested` still
811
+ does not mean `selected`. Actual effectiveness on DSM 7.4 / File Station 1.4.4
812
+ awaits a rebuilt-SPK device matrix; no device fix is claimed.
813
+
814
+ - Fix `ctx.host.activateWindow()` to prefer DSM `toFront()`, calling `show()`
815
+ first for hidden/minimized windows; `activate()` remains a compatibility
816
+ fallback. `requestClose()` follows DSM standalone truthiness: falsy values
817
+ (including desktop `undefined`) permit the normal close path, while a truthy
818
+ standalone-main check refuses it. `canClose === false` and host listeners still
819
+ veto. Both methods return `requested`, not completion proof; rebuilt-SPK DSM
820
+ validation remains pending. Source: `7553c24`, `2842634`.
821
+ - Add opt-in package-owned foreground `daemon` to native manifests, with
822
+ generated supervision and lifecycle hooks. Daemon-free packages keep their
823
+ existing lifecycle; no machine-wide service is required.
824
+ - Add per-mount `ctx.host` platform/title adapters, guarded window activation
825
+ and close requests, app/external-URL navigation, resize/reopen subscription
826
+ cleanup, and File Station folder navigation/file reveal. Standalone web uses
827
+ explicit fallbacks; file reveal is not preview. File preview/details/settings
828
+ and host theme/language subscriptions remain unsupported. Final DSM runtime
829
+ behavior and ordinary-user navigation permissions still need NAS validation.
830
+ - Fix SPK inspection to read the build-specific unique window bundle.
831
+
832
+ ### Known limitations
833
+
834
+ - **File reveal remains a request:** on DSM 7.4-90069 with File Station
835
+ 1.4.4-2221, one `ctx.host.revealFile()` call was observed opening the correct
836
+ folder without selecting/highlighting the file. A new synthetic fixture retest
837
+ selected the file with both `/home` and `/homes/admin` inputs, once each
838
+ (confidence **high**). The earlier non-selection was not reproduced; its cause
839
+ remains **unknown**. `requested` only means a selection request was issued;
840
+ it does not guarantee selection, preview, existence or ACL access. No runtime
841
+ fix is claimed. Source: V1 device validation and fixture retest, 2026-10-04.
842
+ - Vue templates pin public `@synopackageland/ui@0.4.0`, including app-scoped
843
+ modals and unique mount IDs, with npmjs-only lockfiles and imports. External
844
+ developers do not need an internal registry account.
845
+ - CLI 0.4.0 targets npmjs `latest`; versions 0.1.0–0.3.10 remain available without
846
+ deprecation or unpublishing.