@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/skills/SKILL.md CHANGED
@@ -5,15 +5,15 @@ description: Initialize, extend, check, build, inspect, and deploy Synology appl
5
5
 
6
6
  # Independent Synology SPKs
7
7
 
8
- Use this guide to initialize, build and inspect own applications or upstream OSS as independent packages. 依已實作能力區分 DSM session 檔案、私有 jobs 與 App 登入;delegate 已實作並隨 CLI 提供固定操作的離線委託;支援邊界與真機驗收依 delegate guide/驗收矩陣,禁止發明新的身分平台。
8
+ Use this guide to initialize, build and inspect own applications or upstream OSS as independent packages. 依已實作能力區分 DSM session 檔案、私有 jobs 與 App 登入;delegate 已實作並隨 CLI 提供固定操作的離線委託(預設 `files.moveFromStaging`);共用 delegate/rootOps executor 的完整裝置生命週期驗收仍待完成,不得宣稱已通過;支援邊界依 delegate guide/support matrix,禁止發明新的身分平台。
9
9
 
10
10
  Start with `synopkgland init -t native-go`, `synopkgland init -t binary`, or `synopkgland init -t compose`. Read reference/create.md or reference/wrap.md, then reference/deploy.md. Native CGI session checks belong to the package. Container authentication belongs to upstream; fixed service credentials govern mounted data access.
11
11
 
12
12
  Never install, uninstall, publish or modify NAS data without task authorization. Prefer check, inspect and deploy --dry-run for reviewable artifacts.
13
13
 
14
- Native projects use schema 2 capabilities and `--with files,jobs,login,root-ops`; use `add` for existing projects. Prefer `check --json`, `build --json`, `inspect <spk> --json`, `deploy --dry-run --json`, and `status --host <profile> --json` for structured results. Read the conflict policy in reference/create.md before adding overlays.
14
+ Native projects use schema 2 capabilities and `--with files,jobs,login,root-ops,delegate`; use `add` for existing projects. Prefer `check --json`, `build --json`, `inspect <spk> --json`, `deploy --dry-run --json`, and `status --host <profile> --json` for structured results. Read the conflict policy in reference/create.md before adding overlays.
15
15
 
16
- Read reference/files.md and reference/identity.md for capability boundaries. RootOps and delegate share one-time protected executor boot/control setup with digest approval. Existing native products can explicitly use the separate authorization-sdk build-time adapter; do not mix its tasks with generated executor capabilities. App sessions alone do not grant NAS file authority.
16
+ Read reference/portal.md before declaring or changing a DSM Application Portal alias (`add portal`); DSM owns the saved setting. Read reference/files.md and reference/identity.md for capability boundaries. RootOps and delegate share one-time protected executor boot/control setup with digest approval. Existing native products can explicitly use the separate authorization-sdk build-time adapter; do not mix its tasks with generated executor capabilities. App sessions alone do not grant NAS file authority.
17
17
 
18
18
  Read [reference/ui-vue.md](reference/ui-vue.md) when editing Vue components in the native-go Vue template; use the installed SDK contracts, keep DSM embedding boundaries, and verify the actual app.
19
19
 
@@ -26,4 +26,106 @@ Use `syno-pkg-land-ui` directly in npm scripts; keep AI guidance version-indepen
26
26
 
27
27
  For existing native products, schema 2 `backend: {kind: native}` preserves project-owned payload/metadata, prepare/compile argv hooks and pinned toolkits. See the native-layout guide; run `check`, `build`, then `inspect <spk>` locally. Keep lifecycle/systemd as the package account and preserve product-owned digest approval/revocation. Native layouts do not opt into generated Go capabilities.
28
28
 
29
- Delegate is for non-administrator subjects only and currently cannot combine with daemon. Gopeed-style completed-download integration needs an App-owned fixed worker and durable job/delegation binding; the shipped URL example is limited to 64 MiB / 60 seconds and grants to one hour. Scope is a usage restriction, not hard subtree isolation against user-controlled directory moves. Do not claim a daemon-based administrator-only app can simply enable delegate.
29
+
30
+ ## Permanent destination integration
31
+
32
+ `init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
33
+ `destinations: [save]`, `lifetime: until-revoked`, `scope: install-selected`. Existing legacy
34
+ TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
35
+ 64 MiB / 60-second URL example. Do not apply those limits to the new move API.
36
+ Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
37
+ App business route floors. Binary/compose remain unsupported.
38
+
39
+ Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
40
+ selection itself grants access after fresh DSM session/UID/write verification,
41
+ without a second consent dialog. Ordinary and administrator subjects use their
42
+ own nonzero UID/current groups, never root. An online App can create an in-scope
43
+ grant using a valid session; there is no trusted external consent or notification.
44
+
45
+ Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
46
+ page. `delegate.status` exposes verified `disabled` and manifest mode; missing
47
+ protected evidence must not imply enabled. `delegate.operations.list` accepts
48
+ only `{}`, uses the backend move mirrors, and returns the caller's username+UID
49
+ operations only, including for admins. Mirrors are not completion receipts:
50
+ query original `delegate.operations.get` and show Saved only for committed with
51
+ a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
52
+ uncertain/interrupted work. Admin disable is protected and revokes grants;
53
+ enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
54
+
55
+ App-owned daemon completion and scheduled CSV export call configured Go
56
+ `Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
57
+ `staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
58
+ active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
59
+ 50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
60
+ Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
61
+ NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
62
+ Gopeed product wiring remains a separate task.
63
+
64
+ Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
65
+ `EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
66
+ `STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
67
+ package journal was busy or failed transiently; a caller deadline or cancel
68
+ spent waiting for it is `canceled`), call `MoveFromStaging` again later with
69
+ the same exact params. It queries the original reference first and re-sends
70
+ admission only when the executor does not know it and the pinned source is
71
+ unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
72
+ racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
73
+ backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
74
+ retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
75
+ `SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
76
+ `ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
77
+ spool first), and `operation-not-found` for an accepted operation.
78
+ Never change job/grant IDs, delete mirrors or call the socket directly to retry.
79
+
80
+ Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
81
+ original ref is idempotent; repeat it with the same ref after any retryable
82
+ error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
83
+ flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
84
+ durable, not finished; poll `OperationStatus` on the same ref until terminal
85
+ (repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
86
+ stopped, its part file is removed, nothing was published and staging is kept; it
87
+ stays canceled across executor crash, package stop/start and logout. Revoke, scope change and disable store their reason (`grant-revoked`,
88
+ `scope-changed`, `integration-disabled`) the same way: a copy in flight answers
89
+ `CANCEL_REQUESTED` with it and settles `canceled` with it across a restart. A
90
+ copy the executor stops without a cancel ends `interrupted`/`EXECUTOR_PAUSED`
91
+ (`interrupted`/`interrupted` after a crash), never `WRITE_FAILED`. `committed`
92
+ means publication won the race: the file stays (cancel never removes it) and only
93
+ the app record may be dropped. `uncertain` means a publish attempt failed before
94
+ the cancel; keep querying. A cancel of a ref the executor has not admitted yet
95
+ (reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
96
+ recovered admission of that ref returns `canceled` and never copies; a producer
97
+ cancel is also written to the mirror first, so `MoveFromStaging` and the worker
98
+ sweep forward the cancel instead of admitting it.
99
+
100
+
101
+ ### Install-selected scope and the destination API
102
+
103
+ - The DSM install wizard dynamically lists local shares (`SYNO.Core.Share list`
104
+ via `api_store`) and offers home. It saves only a package-owned pre-selection
105
+ in `var/delegate-install.json`; never trust that file for authority.
106
+ - The existing administrator PasswordConfirm form displays this pre-selection
107
+ at first enable. `ctx.executor.authorize(password, selectedScope)` confirms it
108
+ through a pinned, exact-readback one-time root task. Settings changes use the
109
+ same form/password path; no App CGI route may set protected scope directly.
110
+ - The executor trusts `/usr/local/etc/synopkgland/<pkg>/delegations/selected-scope.record`
111
+ only. Its scope/generation are runtime protected state; shipped policy pins
112
+ lock the selection mode and operations. Changes revoke old grants and cancel
113
+ pending writes. Change-away-and-back never revives an old grant.
114
+ - Follow `selection` from verified `delegate.status` / `sdk.destination(key)`.
115
+ If the draft differs, display the difference and follow the protected value.
116
+ Home and fixed `shared:<name>` manifests stay compatible.
117
+ - Frontend: `const sdk = createBackgroundSaveFacade(ctx); const current = await
118
+ sdk.destination('save')` returns typed `{key, selection, destination, status}`.
119
+ `selection` contains `{scope, root, generation}`; `destination` is this caller's
120
+ grant or null. Handle active/missing/reselection-required/needs-scope-confirmation/disabled.
121
+ - Go: `Service.Destination(ctx, caller, request, key)` verifies the fresh DSM
122
+ session and username+UID. Capture its active grant ID into the App job. The
123
+ offline producer uses existing `Service.MoveFromStaging`; no user/UID selector,
124
+ cookie, token, or browser path cache. Executor revalidates at use/publication.
125
+ - The generated Background saves page includes a working **Save example file**
126
+ (`sdk.exportExample({key, job_id})`, `delegate.example.export`). Go
127
+ `ExportExample` creates a private JSON file, calls `MoveFromStaging` once, and
128
+ repeats the original request on repeated IDs. Review `example.go` to
129
+ adapt a real producer; show Saved only from a protected committed receipt.
130
+ - Wizard support is measured on vt-nas DSM 7.4 via a session-only SSH local
131
+ forward. This is not proof of other DSM releases or full writer/reboot behavior.
@@ -27,8 +27,107 @@ synopkgland init -t compose --from ./compose.yaml upstream-app
27
27
  ## Schema 2 能力
28
28
 
29
29
  native-go 與 binary 使用 `dsm-package.yaml` 的 `schema: 2`,backend 寫 `kind: go, dir: backend` 或 `kind: binary, files: {x86_64: prebuilt/api-x86_64}`。
30
- `--with files,jobs,login,root-ops` 分別宣告 `capabilities.files: session`、`jobs: true`、`identity: standalone`、`rootOps: true`。jobs 可寫 `{worker: sha256-v1}`,與 daemon 互斥;delegate 尚未實作(P2)。binary/compose 不支援 files/jobs/login/delegate。
30
+ `--with files,jobs,login,root-ops,delegate` 分別宣告 `capabilities.files: session`、`jobs: true`、`identity: standalone`、`rootOps: true`、`delegate: {operations: [files.moveFromStaging], destinations: [save], lifetime: until-revoked, scope: install-selected}`。jobs 可寫 `{worker: sha256-v1}`,與 daemon 互斥;delegate 隱含 worker 並可與 daemon 共存;admin/normal 都以本人 UID 執行。binary/compose 不支援 files/jobs/login/delegate。
31
31
  既有 native-go 專案用 `synopkgland add files jobs login`;已存在能力回報 no-op。overlay 檔案已有不同內容或 stub 被改動時,add 拒絕並列出衝突;不修改業務 routes 或 App.vue。
32
32
  check、inspect、build、deploy、status 支援 `--json`,stdout 只有單一 JSON 物件,錯誤包含 code、message、hint;進度在 stderr。
33
33
 
34
- 目前 rootOps 仍需 native-Go 管理員核准 adapter;P2 改為與 delegate 共用一次密碼 executor 設定,仍待整合。SDK off stub 與 routes_test.go 的預設 policy scaffold 只有內容仍等於 bundled base 時才會替換;App 自訂版本拒絕。
34
+ rootOps 與 delegate 已共用管理員 PasswordConfirm 核准的 protected executor、boot/control tasks;精確 task readback 與 digest health 一致才 ready,pins 變更須重核准。native 產品另可明確 opt-in authorization-sdk adapter,不與 generated executor tasks 混用。SDK off stub 與 routes_test.go 的預設 policy scaffold 只有內容仍等於 bundled base 時才會替換;App 自訂版本拒絕。
35
+
36
+ ## Permanent destination integration
37
+
38
+ `init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
39
+ `destinations: [save]`, `lifetime: until-revoked`, `scope: install-selected`. Existing legacy
40
+ TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
41
+ 64 MiB / 60-second URL example. Do not apply those limits to the new move API.
42
+ Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
43
+ App business route floors. Binary/compose remain unsupported.
44
+
45
+ Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
46
+ selection itself grants access after fresh DSM session/UID/write verification,
47
+ without a second consent dialog. Ordinary and administrator subjects use their
48
+ own nonzero UID/current groups, never root. An online App can create an in-scope
49
+ grant using a valid session; there is no trusted external consent or notification.
50
+
51
+ Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
52
+ page. `delegate.status` exposes verified `disabled` and manifest mode; missing
53
+ protected evidence must not imply enabled. `delegate.operations.list` accepts
54
+ only `{}`, uses the backend move mirrors, and returns the caller's username+UID
55
+ operations only, including for admins. Mirrors are not completion receipts:
56
+ query original `delegate.operations.get` and show Saved only for committed with
57
+ a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
58
+ uncertain/interrupted work. Admin disable is protected and revokes grants;
59
+ enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
60
+
61
+ App-owned daemon completion and scheduled CSV export call configured Go
62
+ `Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
63
+ `staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
64
+ active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
65
+ 50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
66
+ Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
67
+ NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
68
+ Gopeed product wiring remains a separate task.
69
+
70
+ Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
71
+ `EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
72
+ `STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
73
+ package journal was busy or failed transiently; a caller deadline or cancel
74
+ spent waiting for it is `canceled`), call `MoveFromStaging` again later with
75
+ the same exact params. It queries the original reference first and re-sends
76
+ admission only when the executor does not know it and the pinned source is
77
+ unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
78
+ racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
79
+ backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
80
+ retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
81
+ `SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
82
+ `ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
83
+ spool first), and `operation-not-found` for an accepted operation.
84
+ Never change job/grant IDs, delete mirrors or call the socket directly to retry.
85
+
86
+ Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
87
+ original ref is idempotent; repeat it with the same ref after any retryable
88
+ error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
89
+ flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
90
+ durable, not finished; poll `OperationStatus` on the same ref until terminal
91
+ (repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
92
+ stopped, its part file is removed, nothing was published and staging is kept; it
93
+ stays canceled across executor crash, package stop/start and logout. `committed`
94
+ means publication won the race: the file stays (cancel never removes it) and only
95
+ the app record may be dropped. `uncertain` means a publish attempt failed before
96
+ the cancel; keep querying. A cancel of a ref the executor has not admitted yet
97
+ (reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
98
+ recovered admission of that ref returns `canceled` and never copies; a producer
99
+ cancel is also written to the mirror first, so `MoveFromStaging` and the worker
100
+ sweep forward the cancel instead of admitting it.
101
+
102
+
103
+ ### Install-selected scope and the destination API
104
+
105
+ - The DSM install wizard dynamically lists local shares (`SYNO.Core.Share list`
106
+ via `api_store`) and offers home. It saves only a package-owned pre-selection
107
+ in `var/delegate-install.json`; never trust that file for authority.
108
+ - The existing administrator PasswordConfirm form displays this pre-selection
109
+ at first enable. `ctx.executor.authorize(password, selectedScope)` confirms it
110
+ through a pinned, exact-readback one-time root task. Settings changes use the
111
+ same form/password path; no App CGI route may set protected scope directly.
112
+ - The executor trusts `/usr/local/etc/synopkgland/<pkg>/delegations/selected-scope.record`
113
+ only. Its scope/generation are runtime protected state; shipped policy pins
114
+ lock the selection mode and operations. Changes revoke old grants and cancel
115
+ pending writes. Change-away-and-back never revives an old grant.
116
+ - Follow `selection` from verified `delegate.status` / `sdk.destination(key)`.
117
+ If the draft differs, display the difference and follow the protected value.
118
+ Home and fixed `shared:<name>` manifests stay compatible.
119
+ - Frontend: `const sdk = createBackgroundSaveFacade(ctx); const current = await
120
+ sdk.destination('save')` returns typed `{key, selection, destination, status}`.
121
+ `selection` contains `{scope, root, generation}`; `destination` is this caller's
122
+ grant or null. Handle active/missing/reselection-required/needs-scope-confirmation/disabled.
123
+ - Go: `Service.Destination(ctx, caller, request, key)` verifies the fresh DSM
124
+ session and username+UID. Capture its active grant ID into the App job. The
125
+ offline producer uses existing `Service.MoveFromStaging`; no user/UID selector,
126
+ cookie, token, or browser path cache. Executor revalidates at use/publication.
127
+ - The generated Background saves page includes a working **Save example file**
128
+ (`sdk.exportExample({key, job_id})`, `delegate.example.export`). Go
129
+ `ExportExample` creates a private JSON file, calls `MoveFromStaging` once, and
130
+ repeats the original request on repeated IDs. Review `example.go` to
131
+ adapt a real producer; show Saved only from a protected committed receipt.
132
+ - Wizard support is measured on vt-nas DSM 7.4 via a session-only SSH local
133
+ forward. This is not proof of other DSM releases or full writer/reboot behavior.
@@ -1,6 +1,6 @@
1
1
  # Build and deploy
2
2
 
3
- 1. Run `synopkgland check` and `synopkgland build --arch x86_64` (use aarch64 for that target).
3
+ 1. Run `synopkgland check` and `synopkgland build --arch x86_64` (use aarch64 or armv7 for those targets; armv7 must be listed in `arches`; its jobs, daemon and executor are built but not NAS-verified). deploy detects the NAS arch, except on Marvell CPUs, where it asks for `--arch`.
4
4
  2. Inspect the resulting file with `synopkgland inspect <file>`.
5
5
  3. Review `synopkgland deploy --dry-run --arch x86_64`, which does not connect to a NAS.
6
6
  4. Only when installation is authorized, run `synopkgland deploy --host <profile>`.
@@ -9,4 +9,4 @@ Deployment uploads directly to DSM. It does not publish artifacts. Container ins
9
9
 
10
10
  For native-go root-ops, approve fixed operations in DSM after installation. Updates that change the task text require fresh approval. Remove tasks before uninstall. Never delete installed packages or data as part of a code cleanup.
11
11
 
12
- 5. After installation run `synopkgland status --host <profile> --json`; inspect every capability state and Open URL. Installation is not readiness. P2 shared executor setup, integrated reboot/upgrade and cleanup still need acceptance. Delete App Data is not evidence of complete cleanup; verify retained directories/account artifacts.
12
+ 5. After installation run `synopkgland status --host <profile> --json`; inspect every capability state and Open URL. Installation is not readiness. Delegate is implemented and shipped (default `files.moveFromStaging`); full device lifecycle acceptance is still pending for the shared delegate/rootOps executor: install → setup → reboot → upgrade → revoke → uninstall. Delete App Data is not evidence of complete cleanup; verify retained directories/account artifacts.
@@ -1,13 +1,124 @@
1
1
  # 檔案與背景工作
2
2
 
3
- Native-go 的 B 能力使用 `init --with files` 或 `add files`,對應 schema 2 `capabilities.files: session`。File tree 與共用 NasPicker 以 TreeView/DataGrid 顯示本人可見內容;選取路徑不建立授權。FilePicker 選瀏覽器本機檔案。上傳/下載使用 streaming transport,不把內容放進 JSON。每次以呼叫者有效 DSM session 由 File Station 判權,不需管理員進行能力設定。
3
+ Native-go 的 B 能力使用 `init --with files` 或 `add files`,對應 schema 2 `capabilities.files: session`。File tree 與共用 NasPicker 以 TreeView/DataGrid 顯示本人可見內容;一般選取不建立授權;delegate destination 選取例外,確認即授權。FilePicker 選瀏覽器本機檔案。上傳/下載使用 streaming transport,不把內容放進 JSON。每次以呼叫者有效 DSM session 由 File Station 判權,不需管理員進行能力設定。
4
4
 
5
5
  只有 App session 沒有有效 DSM cookie 時回 `dsm_session_required`,須在同 hostname 登入 DSM。不能以套件帳號或 root 作後備存取。
6
6
 
7
7
  A 能力 `--with jobs` 使用套件帳號處理已匯入的私有副本,依可信 username/UID 綁定;一般使用者不需 admin 設定即可提交、查詢與取消自己的工作。關閉瀏覽器後繼續,不保存 cookie/SID/密碼。匯入需要本人在線 session;私有副本不是離線讀取原檔案的權限。Jobs 與 daemon 互斥。
8
8
 
9
- C 能力 delegate 為 P2 整合中,目前 CLI 拒絕。規劃 admin 確認一次密碼設定 executor;使用者委託/撤銷,綁定 job/operations/scope/期限。DSM runner 與降權寫檔依本人權限執行;scope 限制使用範圍,不是權限邊界。每次重驗帳號與 AppPriv,停用或拒絕即阻擋。不宣稱完整生命週期已驗證。
9
+
10
+ ## Permanent destination integration
11
+
12
+ `init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
13
+ `destinations: [save]`, `lifetime: until-revoked`, `scope: install-selected`. Existing legacy
14
+ TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
15
+ 64 MiB / 60-second URL example. Do not apply those limits to the new move API.
16
+ Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
17
+ App business route floors. Binary/compose remain unsupported.
18
+
19
+ Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
20
+ selection itself grants access after fresh DSM session/UID/write verification,
21
+ without a second consent dialog. Ordinary and administrator subjects use their
22
+ own nonzero UID/current groups, never root. An online App can create an in-scope
23
+ grant using a valid session; there is no trusted external consent or notification.
24
+
25
+ Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
26
+ page. `delegate.status` exposes verified `disabled` and manifest mode; missing
27
+ protected evidence must not imply enabled. `delegate.operations.list` accepts
28
+ only `{}`, uses the backend move mirrors, and returns the caller's username+UID
29
+ operations only, including for admins. Mirrors are not completion receipts:
30
+ query original `delegate.operations.get` and show Saved only for committed with
31
+ a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
32
+ uncertain/interrupted work. Revoke, scope change and disable store their reason (`grant-revoked`,
33
+ `scope-changed`, `integration-disabled`) the same way: a copy in flight answers
34
+ `CANCEL_REQUESTED` with it and settles `canceled` with it across a restart. A
35
+ copy the executor stops without a cancel ends `interrupted`/`EXECUTOR_PAUSED`
36
+ (`interrupted`/`interrupted` after a crash), never `WRITE_FAILED`. A lost publish receipt (or a restart after publish
37
+ intent) settles to committed only when the recorded part inode is the final name;
38
+ otherwise it stays uncertain. Nothing is copied twice. Admin disable is protected and revokes grants;
39
+ enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
40
+
41
+ App-owned daemon completion and scheduled CSV export call configured Go
42
+ `Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
43
+ `staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
44
+ active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
45
+ 50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
46
+ Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
47
+ NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
48
+ Gopeed product wiring remains a separate task.
49
+
50
+ Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
51
+ `EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
52
+ `STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
53
+ package journal was busy or failed transiently; a caller deadline or cancel
54
+ spent waiting for it is `canceled`), call `MoveFromStaging` again later with
55
+ the same exact params. It queries the original reference first and re-sends
56
+ admission only when the executor does not know it and the pinned source is
57
+ unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
58
+ racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
59
+ backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
60
+ retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
61
+ `SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
62
+ `ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
63
+ spool first), and `operation-not-found` for an accepted operation.
64
+ Never change job/grant IDs, delete mirrors or call the socket directly to retry.
65
+
66
+ Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
67
+ original ref is idempotent; repeat it with the same ref after any retryable
68
+ error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
69
+ flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
70
+ durable, not finished; poll `OperationStatus` on the same ref until terminal
71
+ (repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
72
+ stopped, its part file is removed, nothing was published and staging is kept; it
73
+ stays canceled across executor crash, package stop/start and logout. `committed`
74
+ means publication won the race: the file stays (cancel never removes it) and only
75
+ the app record may be dropped. `uncertain` means a publish attempt failed before
76
+ the cancel; keep querying. A cancel of a ref the executor has not admitted yet
77
+ (reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
78
+ recovered admission of that ref returns `canceled` and never copies; a producer
79
+ cancel is also written to the mirror first, so `MoveFromStaging` and the worker
80
+ sweep forward the cancel instead of admitting it.
81
+
10
82
 
11
83
  容器使用固定 DSM run-as 使用者與掛載,不代表瀏覽器本人 ACL。容器路徑依 Compose/映像的 upstream target,保留 target、ro/rw,只替換 host source;管理員在安裝時選擇 Share(共用資料夾)。不要對既有資料 chown。App Data 使用 package var;共用資料夾與 named volume 分別備份。`posix_all_shares` 僅為部署時快照,不會自動加入新資料夾。
12
84
 
13
85
  `install.sharedFolder` 使用套件帳號:select 模式安裝後可能須管理員手動授予權限,create 由 DSM data-share 建立;都不是逐使用者 session access。移除不刪共用資料夾。Delete App Data 不是完整清理證明,須讀回殘留。
86
+
87
+
88
+ ### Install-selected scope and the destination API
89
+
90
+ - The DSM install wizard dynamically lists local shares (`SYNO.Core.Share list`
91
+ via `api_store`) and offers home. It saves only a package-owned pre-selection
92
+ in `var/delegate-install.json`; never trust that file for authority.
93
+ - The existing administrator PasswordConfirm form displays this pre-selection
94
+ at first enable. `ctx.executor.authorize(password, selectedScope)` confirms it
95
+ through a pinned, exact-readback one-time root task. Settings changes use the
96
+ same form/password path; no App CGI route may set protected scope directly.
97
+ A change on a running, pin-verified executor never restarts it; copies in
98
+ flight end `canceled`/`scope-changed`. A `blocked` reply with `requested:
99
+ {scope, generation}` may still land: poll `ctx.executor.status()` until
100
+ `selection` shows that scope above that generation; resubmitting is safe.
101
+ - The executor trusts `/usr/local/etc/synopkgland/<pkg>/delegations/selected-scope.record`
102
+ only. Its scope/generation are runtime protected state; shipped policy pins
103
+ lock the selection mode and operations. Changes revoke old grants and cancel
104
+ pending writes. Change-away-and-back never revives an old grant.
105
+ - Follow `selection` from verified `delegate.status` / `sdk.destination(key)`.
106
+ If the draft differs, display the difference and follow the protected value.
107
+ Home and fixed `shared:<name>` manifests stay compatible.
108
+ - Frontend: `const sdk = createBackgroundSaveFacade(ctx); const current = await
109
+ sdk.destination('save')` returns typed `{key, selection, destination, status}`.
110
+ `selection` contains `{scope, root, generation}`; `destination` is this caller's
111
+ grant or null. Handle active/missing/reselection-required/needs-scope-confirmation/disabled.
112
+ - Go: `Service.Destination(ctx, caller, request, key)` verifies the fresh DSM
113
+ session and username+UID. Capture its active grant ID into the App job. The
114
+ offline producer uses existing `Service.MoveFromStaging`; no user/UID selector,
115
+ cookie, token, or browser path cache. Executor revalidates at use/publication.
116
+ - The generated Background saves page includes a working **Save example file**
117
+ (`sdk.exportExample({key, job_id})`, `delegate.example.export`). Go
118
+ `ExportExample` creates a private JSON file, calls `MoveFromStaging` once, and
119
+ repeats the original request on repeated IDs. Review `example.go` to
120
+ adapt a real producer; show Saved only from a protected committed receipt.
121
+ - Wizard support is measured on vt-nas DSM 7.4 via a session-only SSH local
122
+ forward. This is not proof of other DSM releases or full writer/reboot behavior.
123
+
124
+ The pinned scope-selection task also binds the protected generation observed before confirmation. The executor compares it under the publish lock and refuses stale tasks, so a retained task cannot replay an older selection after another confirmation.
@@ -2,10 +2,79 @@
2
2
 
3
3
  Native-go validates the caller's DSM session per package. Business route permissions come from backend/internal/api/permissions.json; SDK-owned route policy is protected separately. Capabilities describe execution/resources and do not grant business route access. Never trust a request username as owner.
4
4
 
5
+ Entry: omit `entry` for legacy access; `entry: admin-only` admits administrators only and is the floor of every route: SDK routes a capability adds (files, jobs, portal, delegate, rootOps) refuse ordinary users with `admin_required`, the launcher is hidden, and an app route marked `authenticated` or `public` in permissions.json fails validate/build with `STANDALONE_ENTRY_WIDENED` (only the public `identity: standalone` login routes stay public; they admit no one by themselves). The SPK records the mode in `sdk-package.json`; `inspect` prints it and flags `ENTRY_LAUNCHER_MISMATCH`; `entry: app-privilege` also admits accounts DSM Application Privileges allows for `SYNO.SDS.<package>.Instance` (native-go only, needs an `authenticated` route). DSM evaluates user/group/everyone rules, allow/deny precedence and IP ranges; one CGI check covers every route, failures refuse with `app_privilege_denied`, and decisions are cached at most 30 seconds. DSM's install default allows administrators only, so declaring or upgrading never opens the app to everyone. The delegate executor applies the same entry rule to every protected and producer move: once DSM no longer allows a user, new moves under that user's still-valid grant are refused (`APP_DENIED`, grant invalidated); files already saved stay. Guard global settings in shared routes with Go `api.RequireAdmin(caller)` (`admin_required`); the frontend `ctx.user?.isAdmin` only hides controls.
6
+
5
7
  I capability: init --with login or add login enables Go-native standalone identity and Vue login. Same-host DSM cookies can be reused across ports after backend verification. Missing cookies use an HTTPS DSM account/password/OTP fallback; passwords and DSM credentials are not persisted. Plain UI is unsupported. App sessions last at most 15 minutes; sensitive operations revalidate live DSM cookies and local UID. Password-only sessions permit only basic app.status/greeting.get reads. Missing revalidation returns session_revalidation_required; files return dsm_session_required. Sign in to DSM on the same hostname. Web Station portal/proxy acceptance remains pending.
6
8
 
7
9
  B files needs the current user's DSM session. A jobs processes owner-bound private copies as the package account without administrator setup. Neither App identity nor login alone grants offline File Station access.
8
10
 
9
- C delegate is P2 integration in progress and rejected by the current CLI. Planned grants bind verified subject/uid, job, operations, scope and expiry. The executor rechecks account enablement and AppPriv and dispatches with the user's own permissions. User/admin revocation is required. R exposes only fixed admin operations; current approval is per operation. P2 shares one-time password-confirmed, digest-locked executor setup and reboot boot task between C/R. Do not invent final API names or claim complete cleanup before integration acceptance.
11
+
12
+ ## Permanent destination integration
13
+
14
+ `init --with delegate` / `add delegate` default to `operations: [files.moveFromStaging]`,
15
+ `destinations: [save]`, `lifetime: until-revoked`, `scope: home`. Existing legacy
16
+ TTL declarations retain their 1–3600 second service / 30-day wire ceiling and
17
+ 64 MiB / 60-second URL example. Do not apply those limits to the new move API.
18
+ Delegate can coexist with daemon; ordinary standalone jobs cannot. Preserve
19
+ App business route floors. Binary/compose remain unsupported.
20
+
21
+ Use File Station `/home[/...]`, never `/homes/<user>`. The SDK destination picker
22
+ selection itself grants access after fresh DSM session/UID/write verification,
23
+ without a second consent dialog. Ordinary and administrator subjects use their
24
+ own nonzero UID/current groups, never root. An online App can create an in-scope
25
+ grant using a valid session; there is no trusted external consent or notification.
26
+
27
+ Use the default `createBackgroundSaveFacade(ctx)` / CapabilityPanels management
28
+ page. `delegate.status` exposes verified `disabled` and manifest mode; missing
29
+ protected evidence must not imply enabled. `delegate.operations.list` accepts
30
+ only `{}`, uses the backend move mirrors, and returns the caller's username+UID
31
+ operations only, including for admins. Mirrors are not completion receipts:
32
+ query original `delegate.operations.get` and show Saved only for committed with
33
+ a receipt. Cancel by the same reference; revoke by grant ID. Never resubmit
34
+ uncertain/interrupted work. Admin disable is protected and revokes grants;
35
+ enable/mailbox start does not resurrect them. Keep IDs, never session credentials.
36
+
37
+ App-owned daemon completion and scheduled CSV export call configured Go
38
+ `Service.MoveFromStaging` with `delegation_id`, stable `job_id`, private relative
39
+ `staging`, `name`, `size`. No owner/UID selector. Bounds: 16 GiB/file, queued16,
40
+ active1/package, 24-hour attempt, 5-second revalidation ticks (one check at a time, 30-second complete-check deadline; proven timeouts retain private copying, publication still revalidates), 10 MiB operation records,
41
+ 50 MiB audit. Scope is a usage restriction, not hard subtree confinement.
42
+ Local production-executor fixtures use fake DSM/peer/bulk writer; do not claim
43
+ NAS ACL, actual writer UID, logout/reboot or full lifecycle acceptance from them.
44
+ Gopeed product wiring remains a separate task.
45
+
46
+ Admission recovery (per job): on `EXECUTOR_UNAVAILABLE`, `EXECUTOR_TIMEOUT`,
47
+ `EXECUTOR_PROTOCOL`, `canceled`, `EXECUTOR_PAUSED`, `queue-full`,
48
+ `STORAGE_ERROR`, `ADMISSION_PENDING`, `jobs_busy` or `jobs_unavailable` (the
49
+ package journal was busy or failed transiently; a caller deadline or cancel
50
+ spent waiting for it is `canceled`), call `MoveFromStaging` again later with
51
+ the same exact params. It queries the original reference first and re-sends
52
+ admission only when the executor does not know it and the pinned source is
53
+ unchanged; executor tuple deduplication keeps one operation, so a lost reply or a
54
+ racing caller never copies twice. At most 10 possibly-delivered sends, 2 s
55
+ backoff doubling to 5 min; the worker sweep does the same. Terminal, do not
56
+ retry: `APP_DENIED`, `DELEGATION_DENIED`, `operation-conflict`, `disabled`,
57
+ `SCOPE_DENIED` and other executor refusals, `STAGING_CHANGED`,
58
+ `ADMISSION_EXHAUSTED`, `spool_unsafe` and `journal_corrupt` (repair the package
59
+ spool first), and `operation-not-found` for an accepted operation.
60
+ Never change job/grant IDs, delete mirrors or call the socket directly to retry.
61
+
62
+ Cancellation (per job): `CancelOperation` / `delegate.operations.cancel` with the
63
+ original ref is idempotent; repeat it with the same ref after any retryable
64
+ error or a lost reply. A reply `queued`→`canceled` is final at once. A copy in
65
+ flight answers `copying` with code `CANCEL_REQUESTED`: the cancel is accepted and
66
+ durable, not finished; poll `OperationStatus` on the same ref until terminal
67
+ (repeating the cancel is harmless). `canceled` (`OPERATION_CANCELED`) guarantees the writer
68
+ stopped, its part file is removed, nothing was published and staging is kept; it
69
+ stays canceled across executor crash, package stop/start and logout. `committed`
70
+ means publication won the race: the file stays (cancel never removes it) and only
71
+ the app record may be dropped. `uncertain` means a publish attempt failed before
72
+ the cancel; keep querying. A cancel of a ref the executor has not admitted yet
73
+ (reserved/sent mirror) returns `canceled` and leaves a tombstone, so a late or
74
+ recovered admission of that ref returns `canceled` and never copies; a producer
75
+ cancel is also written to the mirror first, so `MoveFromStaging` and the worker
76
+ sweep forward the cancel instead of admitting it.
77
+
78
+ RootOps/delegate share PasswordConfirm-approved digest-pinned setup with exact task readback and health. Pins changes require reapproval. The separate native authorization-sdk adapter must not mix its tasks with generated executor tasks.
10
79
 
11
80
  Compose uses its DSM gateway plus upstream authentication. A fixed service UID/GID identifies the service, not the browser user. Do not infer general SSO or per-user file authority from a service mount.
@@ -0,0 +1,17 @@
1
+ # DSM Application Portal
2
+
3
+ Declare: native-go/binary `portal: {}` or `portal: {alias: my-app}` in dsm-package.yaml (`synopkgland add portal`); Compose `integration.web.portal: {}` only for a DSM-window app behind the DSM auth gateway. The alias defaults to the package name in lowercase. Aliases are 1–64 lowercase letters, digits or `-`, not starting or ending with `-`, and not a DSM path or Synology App alias (`webman`, `file`, …). The native-layout `backend: {kind: native}` owns its conf/scripts: the SDK does not register a portal for it.
4
+
5
+ Build: the SPK carries `etc/portal.json` (every field DSM's app-portal worker needs) and `etc/portal.mustache`, `conf/resource` registers them, and the install wizard adds a prefilled alias step. preinst validates the answer; postinst stores it as the package's own draft and default alias. Nothing is active until an administrator applies it. `inspect <spk> --json` reports `portal: {appId, alias}` and refuses any other portal content.
6
+
7
+ Activate: DSM owns the saved setting. Administrators use the app's portal panel (`ctx.portal.apply(alias)` / `disable()`, DSM `SYNO.Core.AppPortal set` with their own session; DSM refuses non-administrators with 105) or Control Panel > Login Portal > Applications (`ctx.portal.openControlPanel()`). DSM errors map to `portal_alias_invalid`, `portal_alias_reserved`, `portal_alias_in_use`, `admin_required`, `portal_unavailable`.
8
+
9
+ Read: ordinary users call the Go backend's `portal.status` (`authenticated`), which reads `/var/packages/<package>/etc/AppPortal.json` read-only, bounded (64 KiB, no symlinks, one JSON object, matching app id). Anything else is `unavailable` and the UI shows "ask an administrator". A binary CGI must implement the same `{state, alias}` answer itself or ordinary users never see the link.
10
+
11
+ DSM floor: os_min_ver must be 7.3.2-86009 or later. DSM 7.1.1-42962 refuses an unsigned SPK whose conf/resource carries web-config app-portal (Package Center error 320, "non-synology-signed package should not use internal worker"); 7.3.2-86009 and 7.4 install it; 7.2 and 7.3.0/7.3.1 are untested (unknown). validate/build fail with `STANDALONE_PORTAL_MIN_DSM` / `CONTRACT_PORTAL_MIN_DSM`, `--min-dsm` cannot go below it, `add portal` raises a lower os_min_ver, and inspect flags a lower INFO os_min_ver. Fix: raise os_min_ver or remove the portal.
12
+
13
+ Capability: beyond that floor, no version gate. The panel needs SYNO.API.Info to list `SYNO.Core.AppPortal` (v2) and the app's registration to exist; otherwise administrators get only the Control Panel shortcut.
14
+
15
+ UI: plain JS calls `ctx.portal && ctx.portal.mountPanel(element)` and disposes it on unmount; Vue renders `portal/PortalSettings.vue`. `ctx.portal.messages` carries the SDK text in all nine languages.
16
+
17
+ Never: write `AppPortal.json`, `@appconf/<package>` or `/usr/syno/etc/www/app.d`; add a backend route that changes the alias; relay QuickConnect responses or build QuickConnect links; reboot or change other packages' portal entries while testing. DSM keeps the alias across upgrades and removes the entry on uninstall.
@@ -69,3 +69,15 @@ handlers; it does not replace the Vue build, tests or actual-app screenshots.
69
69
  Finally run the project's `check --json`, `build --json` and
70
70
  `inspect <spk> --json` workflow from AGENTS.md. Fix errors, warnings and layout
71
71
  issues before handing over the app.
72
+
73
+
74
+ ## Delegate scope Settings
75
+
76
+ Default delegate uses `install-selected`. Keep ExecutorSettings and BackgroundSavePanel
77
+ in the existing Settings surface. Show the installer draft only as a pre-selection;
78
+ follow protected `selection` from `delegate.status` / `sdk.destination(key)`. Use
79
+ `ctx.executor.authorize(password, scope)` for both first enable and scope changes,
80
+ with the same PasswordConfirm form and no extra dialog. Mismatch must be explicit.
81
+ Restrict the existing NasPicker to `selection.root`; do not grant via cached paths.
82
+ The default facade includes typed `destination(key)` and `exportExample({key,job_id})`;
83
+ use original operation references and display Saved only for protected receipts.
@@ -2,4 +2,4 @@ module synopkgland-daemon
2
2
 
3
3
  go 1.24
4
4
 
5
- toolchain go1.26.8
5
+ toolchain go1.26.9
@@ -28,6 +28,9 @@ type deadlines struct {
28
28
  Start int `json:"start"`
29
29
  Stop int `json:"stop"`
30
30
  Status int `json:"status"`
31
+ // Uninstall bounds uninstall_args separately from Stop: a revoke on a
32
+ // loaded NAS can take longer than stopping the daemon.
33
+ Uninstall int `json:"uninstall"`
31
34
  }
32
35
  type config struct {
33
36
  Package string `json:"package"`
@@ -88,7 +91,7 @@ func load(dest, data string) (*controller, error) {
88
91
  if cfg.Exec == "" || filepath.IsAbs(cfg.Exec) || filepath.Clean(cfg.Exec) != cfg.Exec || strings.HasPrefix(cfg.Exec, "../") {
89
92
  return nil, errors.New("invalid fixed executable")
90
93
  }
91
- if cfg.Timeouts.Start < 2 || cfg.Timeouts.Start > 120 || cfg.Timeouts.Stop < 2 || cfg.Timeouts.Stop > 120 || cfg.Timeouts.Status < 1 || cfg.Timeouts.Status > 10 {
94
+ if cfg.Timeouts.Start < 2 || cfg.Timeouts.Start > 120 || cfg.Timeouts.Stop < 2 || cfg.Timeouts.Stop > 120 || cfg.Timeouts.Status < 1 || cfg.Timeouts.Status > 10 || cfg.Timeouts.Uninstall < 2 || cfg.Timeouts.Uninstall > 120 {
92
95
  return nil, errors.New("invalid daemon deadlines")
93
96
  }
94
97
  hash := sha256.Sum256(raw)
@@ -162,7 +165,7 @@ func (c *controller) run(action string) (int, error) {
162
165
  budget += c.Timeouts.Start
163
166
  }
164
167
  if action == "uninstall" {
165
- budget += c.Timeouts.Stop + 1
168
+ budget += c.Timeouts.Uninstall + 2
166
169
  }
167
170
  if action != "start" && action != "stop" && action != "status" && action != "restart" && action != "uninstall" {
168
171
  return 1, errors.New("unsupported daemon action")
@@ -414,7 +417,7 @@ func (c *controller) uninstall() error {
414
417
  select {
415
418
  case err := <-done:
416
419
  return err
417
- case <-time.After(time.Duration(c.Timeouts.Stop-1) * time.Second):
420
+ case <-time.After(time.Duration(c.Timeouts.Uninstall) * time.Second):
418
421
  cmd.Process.Signal(syscall.SIGTERM)
419
422
  }
420
423
  select {