@synopackageland/cli 0.4.1 → 0.5.3

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 (699) hide show
  1. package/README.md +7 -3
  2. package/dist/authorization-sdk.d.ts +5 -0
  3. package/dist/authorization-sdk.js +5 -0
  4. package/dist/build-spk/delete-app-data.d.ts +27 -7
  5. package/dist/build-spk/delete-app-data.js +35 -34
  6. package/dist/build-spk/dsm-arch.d.ts +6 -1
  7. package/dist/build-spk/dsm-arch.js +25 -1
  8. package/dist/build-spk/dsm-version.d.ts +14 -0
  9. package/dist/build-spk/dsm-version.js +47 -0
  10. package/dist/build-spk/gateway.d.ts +31 -0
  11. package/dist/build-spk/gateway.js +55 -0
  12. package/dist/build-spk/generator.d.ts +5 -0
  13. package/dist/build-spk/generator.js +103 -107
  14. package/dist/build-spk/install-wizard.d.ts +20 -0
  15. package/dist/build-spk/install-wizard.js +76 -0
  16. package/dist/build-spk/native-lifecycle.d.ts +5 -0
  17. package/dist/build-spk/native-lifecycle.js +12 -2
  18. package/dist/build-spk/resource-worker.d.ts +9 -4
  19. package/dist/build-spk/resource-worker.js +15 -6
  20. package/dist/build-spk/share-combobox.d.ts +3 -0
  21. package/dist/build-spk/share-combobox.js +27 -0
  22. package/dist/build-spk/uninstall-wizard.d.ts +14 -0
  23. package/dist/build-spk/uninstall-wizard.js +33 -0
  24. package/dist/build-spk/wizard-i18n.d.ts +18 -0
  25. package/dist/build-spk/wizard-i18n.js +38 -0
  26. package/dist/build-spk/wizard-messages.d.ts +388 -0
  27. package/dist/build-spk/wizard-messages.js +387 -0
  28. package/dist/cli.js +132 -32
  29. package/dist/compose/analyze.d.ts +20 -0
  30. package/dist/compose/analyze.js +75 -11
  31. package/dist/contract/validate.js +33 -1
  32. package/dist/contract/web-launch.d.ts +22 -0
  33. package/dist/contract/web-launch.js +37 -0
  34. package/dist/deploy/deploy.d.ts +3 -0
  35. package/dist/deploy/deploy.js +11 -2
  36. package/dist/error-registry.js +62 -3
  37. package/dist/host/dsm-port-profile.d.ts +1 -1
  38. package/dist/host/dsm-port-profile.js +1 -1
  39. package/dist/host/open-url.d.ts +2 -0
  40. package/dist/host/open-url.js +4 -1
  41. package/dist/images/pin.d.ts +52 -0
  42. package/dist/images/pin.js +249 -0
  43. package/dist/init.d.ts +27 -3
  44. package/dist/init.js +126 -16
  45. package/dist/inspect.d.ts +3 -0
  46. package/dist/inspect.js +15 -3
  47. package/dist/standalone/authorization-window.d.ts +2 -0
  48. package/dist/standalone/authorization-window.js +28 -0
  49. package/dist/standalone/authorization.d.ts +48 -0
  50. package/dist/standalone/authorization.js +116 -0
  51. package/dist/standalone/background.d.ts +21 -0
  52. package/dist/standalone/background.js +52 -0
  53. package/dist/standalone/binary.d.ts +1 -0
  54. package/dist/standalone/binary.js +1 -1
  55. package/dist/standalone/build.d.ts +2 -0
  56. package/dist/standalone/build.js +54 -10
  57. package/dist/standalone/dsm-window.js +10 -3
  58. package/dist/standalone/helper-inventory.d.ts +15 -0
  59. package/dist/standalone/helper-inventory.js +9 -0
  60. package/dist/standalone/helper.d.ts +1 -0
  61. package/dist/standalone/helper.js +29 -11
  62. package/dist/standalone/host-adapter.d.ts +1 -1
  63. package/dist/standalone/host-adapter.js +33 -15
  64. package/dist/standalone/host-file-navigation.d.ts +7 -0
  65. package/dist/standalone/host-file-navigation.js +172 -0
  66. package/dist/standalone/inspect-helper.js +21 -6
  67. package/dist/standalone/inspect-spk.d.ts +1 -1
  68. package/dist/standalone/inspect-spk.js +211 -7
  69. package/dist/standalone/job-diagnostics.d.ts +1 -0
  70. package/dist/standalone/job-diagnostics.js +49 -0
  71. package/dist/standalone/lifecycle-helper.d.ts +1 -1
  72. package/dist/standalone/lifecycle-helper.js +2 -2
  73. package/dist/standalone/lifecycle.d.ts +1 -1
  74. package/dist/standalone/lifecycle.js +14 -4
  75. package/dist/standalone/manifest.d.ts +15 -2
  76. package/dist/standalone/manifest.js +37 -6
  77. package/dist/standalone/native-layout.d.ts +74 -0
  78. package/dist/standalone/native-layout.js +318 -0
  79. package/dist/standalone/resource.d.ts +11 -0
  80. package/dist/standalone/resource.js +13 -0
  81. package/dist/standalone/root-ops.d.ts +2 -0
  82. package/dist/standalone/root-ops.js +10 -0
  83. package/dist/standalone/root-window.d.ts +3 -1
  84. package/dist/standalone/root-window.js +156 -38
  85. package/dist/standalone/shared-folder.d.ts +39 -0
  86. package/dist/standalone/shared-folder.js +141 -0
  87. package/dist/standalone/spk.d.ts +4 -0
  88. package/dist/standalone/spk.js +47 -3
  89. package/dist/standalone/worker-contract-json.d.ts +8 -0
  90. package/dist/standalone/worker-contract-json.js +141 -0
  91. package/dist/standalone/worker-contract.d.ts +189 -0
  92. package/dist/standalone/worker-contract.js +175 -0
  93. package/dist/standalone/worker-registry.d.ts +40 -0
  94. package/dist/standalone/worker-registry.js +167 -0
  95. package/dist/templates/_authorization/main.go +104 -0
  96. package/dist/templates/_authorization/main_test.go +35 -0
  97. package/dist/templates/_daemon/go.mod +2 -0
  98. package/dist/templates/_gateway/auth.go +101 -0
  99. package/dist/templates/_gateway/auth_test.go +216 -0
  100. package/dist/templates/_gateway/cgi.go +133 -0
  101. package/dist/templates/_gateway/cgi_test.go +156 -0
  102. package/dist/templates/_gateway/csrf.go +73 -0
  103. package/dist/templates/_gateway/csrf_test.go +155 -0
  104. package/dist/templates/_gateway/directory.go +108 -0
  105. package/dist/templates/_gateway/directory_test.go +202 -0
  106. package/dist/templates/_gateway/gateway.go +412 -0
  107. package/dist/templates/_gateway/gateway_test.go +676 -0
  108. package/dist/templates/_gateway/go.mod +3 -0
  109. package/dist/templates/_gateway/groups.go +66 -0
  110. package/dist/templates/_gateway/main.go +45 -0
  111. package/dist/templates/binary/synology-app.yaml +1 -1
  112. package/dist/templates/compose-import/compose.yaml +1 -1
  113. package/dist/templates/compose-import/synology-app.yaml +1 -1
  114. package/dist/templates/hello-files/compose.yaml +1 -1
  115. package/dist/templates/hello-files/synology-app.yaml +1 -1
  116. package/dist/templates/native-go/README.md +118 -5
  117. package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
  118. package/dist/templates/native-go/backend/cmd/app/main.go +25 -6
  119. package/dist/templates/native-go/backend/cmd/app/sdk_main.go +62 -0
  120. package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  121. package/dist/templates/native-go/backend/cmd/helper/main.go +27 -1
  122. package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  123. package/dist/templates/native-go/backend/go.mod +5 -3
  124. package/dist/templates/native-go/backend/go.sum +4 -4
  125. package/dist/templates/native-go/backend/internal/api/registry.go +17 -6
  126. package/dist/templates/native-go/backend/internal/api/server.go +7 -1
  127. package/dist/templates/native-go/backend/internal/app/authorization_none.go +5 -0
  128. package/dist/templates/native-go/backend/internal/app/background.go +270 -0
  129. package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
  130. package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
  131. package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  132. package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  133. package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  134. package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
  135. package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
  136. package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
  137. package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  138. package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
  139. package/dist/templates/native-go/backend/internal/app/routes.go +22 -5
  140. package/dist/templates/native-go/backend/internal/app/routes_test.go +20 -3
  141. package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  142. package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  143. package/dist/templates/native-go/backend/internal/app/sdk_routes.go +177 -0
  144. package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
  145. package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  146. package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  147. package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  148. package/dist/templates/native-go/backend/internal/background/access.go +57 -0
  149. package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
  150. package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
  151. package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
  152. package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
  153. package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  154. package/dist/templates/native-go/backend/internal/background/store.go +807 -0
  155. package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
  156. package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  157. package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  158. package/dist/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  159. package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
  160. package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  161. package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
  162. package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  163. package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
  164. package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  165. package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  166. package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  167. package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
  168. package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  169. package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  170. package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
  171. package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  172. package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  173. package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  174. package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  175. package/dist/templates/native-go/backend/internal/helper/data_contract.go +3 -0
  176. package/dist/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
  177. package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
  178. package/dist/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
  179. package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
  180. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
  181. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
  182. package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
  183. package/dist/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  184. package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  185. package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  186. package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  187. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  188. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  189. package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  190. package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  191. package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  192. package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  193. package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  194. package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  195. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  196. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  197. package/dist/templates/native-go/backend/internal/helper/management.go +86 -0
  198. package/dist/templates/native-go/backend/internal/helper/observation.go +42 -2
  199. package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
  200. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
  201. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
  202. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  203. package/dist/templates/native-go/backend/internal/helper/process_linux.go +3 -0
  204. package/dist/templates/native-go/backend/internal/helper/purge.go +115 -0
  205. package/dist/templates/native-go/backend/internal/helper/purge_test.go +59 -0
  206. package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  207. package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  208. package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
  209. package/dist/templates/native-go/backend/internal/helper/revoke.go +109 -0
  210. package/dist/templates/native-go/backend/internal/helper/revoke_test.go +121 -0
  211. package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
  212. package/dist/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  213. package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  214. package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  215. package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  216. package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  217. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  218. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  219. package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  220. package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  221. package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  222. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  223. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  224. package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  225. package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  226. package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  227. package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  228. package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  229. package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  230. package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  231. package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  232. package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  233. package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  234. package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  235. package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  236. package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  237. package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  238. package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  239. package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  240. package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  241. package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  242. package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  243. package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  244. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  245. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  246. package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  247. package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  248. package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  249. package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  250. package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  251. package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  252. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  253. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  254. package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +161 -0
  255. package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  256. package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  257. package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  258. package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  259. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  260. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  261. package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  262. package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  263. package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  264. package/dist/templates/native-go/backend/internal/helper/server_linux.go +14 -2
  265. package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  266. package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  267. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  268. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  269. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  270. package/dist/templates/native-go/backend/internal/helper/status.go +22 -13
  271. package/dist/templates/native-go/backend/internal/helper/status_test.go +45 -0
  272. package/dist/templates/native-go/backend/internal/helper/supervision.go +1 -1
  273. package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
  274. package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
  275. package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
  276. package/dist/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
  277. package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
  278. package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
  279. package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
  280. package/dist/templates/native-go/dsm-package.yaml +2 -2
  281. package/dist/templates/native-go-authorization/backend/internal/app/authorization.go +298 -0
  282. package/dist/templates/native-go-authorization/backend/internal/app/authorization_test.go +96 -0
  283. package/dist/templates/native-go-authorization/frontend/src/authorization/AuthorizationGate.vue +89 -0
  284. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/de.json +36 -0
  285. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/en.json +36 -0
  286. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/es.json +36 -0
  287. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/fr.json +36 -0
  288. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/index.ts +15 -0
  289. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/it.json +36 -0
  290. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/ja.json +36 -0
  291. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/ko.json +36 -0
  292. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/zh-CN.json +36 -0
  293. package/dist/templates/native-go-authorization/frontend/src/authorization/i18n/zh-TW.json +36 -0
  294. package/dist/templates/native-go-authorization/frontend/test/authorization-preview.html +14 -0
  295. package/dist/templates/native-go-authorization/frontend/test/authorization.test.ts +59 -0
  296. package/dist/templates/native-go-background/BACKGROUND.md +111 -0
  297. package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  298. package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  299. package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  300. package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  301. package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  302. package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  303. package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  304. package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  305. package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  306. package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  307. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  308. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  309. package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  310. package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  311. package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
  312. package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  313. package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  314. package/dist/templates/native-go-vue/README.md +38 -7
  315. package/dist/templates/native-go-vue/frontend/DESIGN.md +15 -3
  316. package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  317. package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
  318. package/dist/templates/native-go-vue/frontend/package-lock.json +5 -4
  319. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  320. package/dist/templates/native-go-vue/frontend/src/App.vue +39 -11
  321. package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  322. package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  323. package/dist/templates/native-go-vue/frontend/src/context.ts +3 -0
  324. package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  325. package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  326. package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  327. package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  328. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  329. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  330. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  331. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  332. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  333. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  334. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  335. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  336. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  337. package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  338. package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  339. package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  340. package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  341. package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  342. package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  343. package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  344. package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  345. package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  346. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  347. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  348. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  349. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  350. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  351. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  352. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  353. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  354. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  355. package/dist/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  356. package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  357. package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  358. package/dist/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  359. package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  360. package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  361. package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  362. package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  363. package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  364. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  365. package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  366. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  367. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  368. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  369. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  370. package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  371. package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  372. package/dist/templates/native-go-vue/frontend/src/style.css +2 -6
  373. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
  374. package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  375. package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  376. package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  377. package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  378. package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  379. package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  380. package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  381. package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  382. package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  383. package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  384. package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  385. package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  386. package/dist/templates/native-go-vue/frontend/vite.config.ts +2 -2
  387. package/dist/types.d.ts +1 -1
  388. package/dist/validate.js +6 -3
  389. package/package.json +5 -2
  390. package/schema/synology-app.schema.json +19 -0
  391. package/skills/reference/create.md +6 -2
  392. package/templates/_authorization/main.go +104 -0
  393. package/templates/_authorization/main_test.go +35 -0
  394. package/templates/_daemon/go.mod +2 -0
  395. package/templates/_gateway/auth.go +101 -0
  396. package/templates/_gateway/auth_test.go +216 -0
  397. package/templates/_gateway/cgi.go +133 -0
  398. package/templates/_gateway/cgi_test.go +156 -0
  399. package/templates/_gateway/csrf.go +73 -0
  400. package/templates/_gateway/csrf_test.go +155 -0
  401. package/templates/_gateway/directory.go +108 -0
  402. package/templates/_gateway/directory_test.go +202 -0
  403. package/templates/_gateway/gateway.go +412 -0
  404. package/templates/_gateway/gateway_test.go +676 -0
  405. package/templates/_gateway/go.mod +3 -0
  406. package/templates/_gateway/groups.go +66 -0
  407. package/templates/_gateway/main.go +45 -0
  408. package/templates/binary/synology-app.yaml +1 -1
  409. package/templates/compose-import/compose.yaml +1 -1
  410. package/templates/compose-import/synology-app.yaml +1 -1
  411. package/templates/hello-files/compose.yaml +1 -1
  412. package/templates/hello-files/synology-app.yaml +1 -1
  413. package/templates/native-go/README.md +118 -5
  414. package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
  415. package/templates/native-go/backend/cmd/app/main.go +25 -6
  416. package/templates/native-go/backend/cmd/app/sdk_main.go +62 -0
  417. package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  418. package/templates/native-go/backend/cmd/helper/main.go +27 -1
  419. package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  420. package/templates/native-go/backend/go.mod +5 -3
  421. package/templates/native-go/backend/go.sum +4 -4
  422. package/templates/native-go/backend/internal/api/registry.go +17 -6
  423. package/templates/native-go/backend/internal/api/server.go +7 -1
  424. package/templates/native-go/backend/internal/app/authorization_none.go +5 -0
  425. package/templates/native-go/backend/internal/app/background.go +270 -0
  426. package/templates/native-go/backend/internal/app/background_none.go +8 -0
  427. package/templates/native-go/backend/internal/app/background_owner.go +59 -0
  428. package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  429. package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  430. package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  431. package/templates/native-go/backend/internal/app/background_test.go +346 -0
  432. package/templates/native-go/backend/internal/app/integration_state.go +16 -0
  433. package/templates/native-go/backend/internal/app/migrations.go +41 -0
  434. package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  435. package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
  436. package/templates/native-go/backend/internal/app/routes.go +22 -5
  437. package/templates/native-go/backend/internal/app/routes_test.go +20 -3
  438. package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  439. package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  440. package/templates/native-go/backend/internal/app/sdk_routes.go +177 -0
  441. package/templates/native-go/backend/internal/app/session_files.go +15 -0
  442. package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  443. package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  444. package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  445. package/templates/native-go/backend/internal/background/access.go +57 -0
  446. package/templates/native-go/backend/internal/background/owner_test.go +126 -0
  447. package/templates/native-go/backend/internal/background/runner.go +185 -0
  448. package/templates/native-go/backend/internal/background/runner_test.go +209 -0
  449. package/templates/native-go/backend/internal/background/schedule.go +300 -0
  450. package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  451. package/templates/native-go/backend/internal/background/store.go +807 -0
  452. package/templates/native-go/backend/internal/background/store_test.go +407 -0
  453. package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  454. package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  455. package/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  456. package/templates/native-go/backend/internal/filestation/client.go +251 -0
  457. package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  458. package/templates/native-go/backend/internal/filestation/doc.go +4 -0
  459. package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  460. package/templates/native-go/backend/internal/filestation/repository.go +207 -0
  461. package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  462. package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  463. package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  464. package/templates/native-go/backend/internal/filestation/service.go +254 -0
  465. package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  466. package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  467. package/templates/native-go/backend/internal/filestation/write.go +72 -0
  468. package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  469. package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  470. package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  471. package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  472. package/templates/native-go/backend/internal/helper/data_contract.go +3 -0
  473. package/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
  474. package/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
  475. package/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
  476. package/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
  477. package/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
  478. package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
  479. package/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
  480. package/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  481. package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  482. package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  483. package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  484. package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  485. package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  486. package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  487. package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  488. package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  489. package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  490. package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  491. package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  492. package/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  493. package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  494. package/templates/native-go/backend/internal/helper/management.go +86 -0
  495. package/templates/native-go/backend/internal/helper/observation.go +42 -2
  496. package/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
  497. package/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
  498. package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
  499. package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  500. package/templates/native-go/backend/internal/helper/process_linux.go +3 -0
  501. package/templates/native-go/backend/internal/helper/purge.go +115 -0
  502. package/templates/native-go/backend/internal/helper/purge_test.go +59 -0
  503. package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  504. package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  505. package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
  506. package/templates/native-go/backend/internal/helper/revoke.go +109 -0
  507. package/templates/native-go/backend/internal/helper/revoke_test.go +121 -0
  508. package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
  509. package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  510. package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  511. package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  512. package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  513. package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  514. package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  515. package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  516. package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  517. package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  518. package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  519. package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  520. package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  521. package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  522. package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  523. package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  524. package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  525. package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  526. package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  527. package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  528. package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  529. package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  530. package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  531. package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  532. package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  533. package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  534. package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  535. package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  536. package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  537. package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  538. package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  539. package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  540. package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  541. package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  542. package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  543. package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  544. package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  545. package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  546. package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  547. package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  548. package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  549. package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  550. package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  551. package/templates/native-go/backend/internal/helper/sdk_server_linux.go +161 -0
  552. package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  553. package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  554. package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  555. package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  556. package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  557. package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  558. package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  559. package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  560. package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  561. package/templates/native-go/backend/internal/helper/server_linux.go +14 -2
  562. package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  563. package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  564. package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  565. package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  566. package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  567. package/templates/native-go/backend/internal/helper/status.go +22 -13
  568. package/templates/native-go/backend/internal/helper/status_test.go +45 -0
  569. package/templates/native-go/backend/internal/helper/supervision.go +1 -1
  570. package/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
  571. package/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
  572. package/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
  573. package/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
  574. package/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
  575. package/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
  576. package/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
  577. package/templates/native-go/dsm-package.yaml +2 -2
  578. package/templates/native-go-authorization/backend/internal/app/authorization.go +298 -0
  579. package/templates/native-go-authorization/backend/internal/app/authorization_test.go +96 -0
  580. package/templates/native-go-authorization/frontend/src/authorization/AuthorizationGate.vue +89 -0
  581. package/templates/native-go-authorization/frontend/src/authorization/i18n/de.json +36 -0
  582. package/templates/native-go-authorization/frontend/src/authorization/i18n/en.json +36 -0
  583. package/templates/native-go-authorization/frontend/src/authorization/i18n/es.json +36 -0
  584. package/templates/native-go-authorization/frontend/src/authorization/i18n/fr.json +36 -0
  585. package/templates/native-go-authorization/frontend/src/authorization/i18n/index.ts +15 -0
  586. package/templates/native-go-authorization/frontend/src/authorization/i18n/it.json +36 -0
  587. package/templates/native-go-authorization/frontend/src/authorization/i18n/ja.json +36 -0
  588. package/templates/native-go-authorization/frontend/src/authorization/i18n/ko.json +36 -0
  589. package/templates/native-go-authorization/frontend/src/authorization/i18n/zh-CN.json +36 -0
  590. package/templates/native-go-authorization/frontend/src/authorization/i18n/zh-TW.json +36 -0
  591. package/templates/native-go-authorization/frontend/test/authorization-preview.html +14 -0
  592. package/templates/native-go-authorization/frontend/test/authorization.test.ts +59 -0
  593. package/templates/native-go-background/BACKGROUND.md +111 -0
  594. package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  595. package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  596. package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  597. package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  598. package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  599. package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  600. package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  601. package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  602. package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  603. package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  604. package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  605. package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  606. package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  607. package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  608. package/templates/native-go-background/frontend/test/background.test.ts +179 -0
  609. package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  610. package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  611. package/templates/native-go-vue/README.md +38 -7
  612. package/templates/native-go-vue/frontend/DESIGN.md +15 -3
  613. package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  614. package/templates/native-go-vue/frontend/README-M2.md +64 -0
  615. package/templates/native-go-vue/frontend/package-lock.json +5 -4
  616. package/templates/native-go-vue/frontend/package.json +1 -1
  617. package/templates/native-go-vue/frontend/src/App.vue +39 -11
  618. package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  619. package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  620. package/templates/native-go-vue/frontend/src/context.ts +3 -0
  621. package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  622. package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  623. package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  624. package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  625. package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  626. package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  627. package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  628. package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  629. package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  630. package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  631. package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  632. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  633. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  634. package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  635. package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  636. package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  637. package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  638. package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  639. package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  640. package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  641. package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  642. package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  643. package/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  644. package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  645. package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  646. package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  647. package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  648. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  649. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  650. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  651. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  652. package/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  653. package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  654. package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  655. package/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  656. package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  657. package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  658. package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  659. package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  660. package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  661. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  662. package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  663. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  664. package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  665. package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  666. package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  667. package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  668. package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  669. package/templates/native-go-vue/frontend/src/style.css +2 -6
  670. package/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
  671. package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  672. package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  673. package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  674. package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  675. package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  676. package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  677. package/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  678. package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  679. package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  680. package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  681. package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  682. package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  683. package/templates/native-go-vue/frontend/vite.config.ts +2 -2
  684. package/dist/templates/hello-web/compose.yaml +0 -21
  685. package/dist/templates/hello-web/html/app.js +0 -1
  686. package/dist/templates/hello-web/html/index.html +0 -13
  687. package/dist/templates/hello-web/synology-app.yaml +0 -13
  688. package/dist/templates/hello-web-page/compose.yaml +0 -21
  689. package/dist/templates/hello-web-page/html/app.js +0 -1
  690. package/dist/templates/hello-web-page/html/index.html +0 -13
  691. package/dist/templates/hello-web-page/synology-app.yaml +0 -13
  692. package/templates/hello-web/compose.yaml +0 -21
  693. package/templates/hello-web/html/app.js +0 -1
  694. package/templates/hello-web/html/index.html +0 -13
  695. package/templates/hello-web/synology-app.yaml +0 -13
  696. package/templates/hello-web-page/compose.yaml +0 -21
  697. package/templates/hello-web-page/html/app.js +0 -1
  698. package/templates/hello-web-page/html/index.html +0 -13
  699. package/templates/hello-web-page/synology-app.yaml +0 -13
@@ -5,15 +5,21 @@ import { createHash } from "node:crypto";
5
5
  import * as tar from "tar";
6
6
  import { parseDocument, Scalar } from "yaml";
7
7
  import { loadContract, collectInstallParameters } from "../contract/load.js";
8
- import { renderDsmWindowConfig, resolvedWebLaunch, trustedAppEntryPath, } from "../contract/web-launch.js";
8
+ import { renderDsmWindowConfig, resolvedWebLaunch, trustedAppEntryPath, usesAuthGateway, } from "../contract/web-launch.js";
9
+ import { buildGatewayBinary, gatewayConfig, writeGatewayPayload } from "./gateway.js";
9
10
  import { classifyComposeRoute, loadCompose } from "../compose/analyze.js";
10
11
  import { scanComposePrivilege } from "../compose/privilege.js";
11
12
  import { validateProject } from "../validate.js";
12
13
  import { writeDsmWindowIcons, writePackageCenterIcons } from "./dsm-icons.js";
13
14
  import { infoArchValue } from "./dsm-arch.js";
15
+ import { assertContainerMinDsm, resolveMinDsm } from "./dsm-version.js";
14
16
  import { createReproducibleTar } from "./reproducible-archive.js";
15
17
  import { copyProjectNotices } from "./notices.js";
16
18
  import { renderDeleteAppDataBlock } from "./delete-app-data.js";
19
+ import { renderUninstallWizardFiles } from "./uninstall-wizard.js";
20
+ import { renderInstallWizardFiles } from "./install-wizard.js";
21
+ import { renderWizardFiles, writeWizardUiFiles } from "./wizard-i18n.js";
22
+ import { sharedFolderCombobox } from "./share-combobox.js";
17
23
  import { loadNative } from "../native/load.js";
18
24
  import { materializeNativePayload } from "./native-payload.js";
19
25
  import { renderNativePostinst, renderNativePrivilege, renderNativeStartStopStatus, renderNativePostuninst, renderNativePreuninst, } from "./native-lifecycle.js";
@@ -53,8 +59,14 @@ export async function buildSpk(options) {
53
59
  if (options.spkVersion) {
54
60
  contract.version = options.spkVersion;
55
61
  }
62
+ if (options.minDsm !== undefined) {
63
+ contract.os_min_ver = resolveMinDsm(options.minDsm);
64
+ }
56
65
  const nativePath = options.project.nativePath ?? join(options.project.root, "native.yaml");
57
66
  const isNative = existsSync(nativePath);
67
+ if (!isNative && options.minDsm !== undefined) {
68
+ assertContainerMinDsm(String(contract.os_min_ver));
69
+ }
58
70
  if (isNative) {
59
71
  if (!options.archFamily) {
60
72
  return { ok: false, errors: ["NATIVE_ARCH_FAMILY_REQUIRED"] };
@@ -74,10 +86,7 @@ export async function buildSpk(options) {
74
86
  mkdirSync(join(staging, "conf"), { recursive: true });
75
87
  writeFileSync(join(staging, "conf", "privilege"), renderNativePrivilege(), "utf8");
76
88
  writeFileSync(join(staging, "privilege"), renderNativePrivilege(), "utf8");
77
- mkdirSync(join(staging, "WIZARD_UIFILES"), { recursive: true });
78
- writeFileSync(join(staging, "WIZARD_UIFILES", INSTALL_UIFILE), JSON.stringify(renderInstallWizard(contract, undefined), null, 2), "utf8");
79
- writeFileSync(join(staging, "WIZARD_UIFILES", UPGRADE_UIFILE), JSON.stringify(renderUpgradeWizard(contract, undefined), null, 2), "utf8");
80
- writeFileSync(join(staging, "WIZARD_UIFILES", UNINSTALL_UIFILE), JSON.stringify(renderUninstallWizard(), null, 2), "utf8");
89
+ writeWizards(staging, contract, undefined, "native");
81
90
  mkdirSync(join(staging, "scripts"), { recursive: true });
82
91
  for (const name of SCRIPT_NAMES) {
83
92
  const scriptPath = join(staging, "scripts", name);
@@ -109,9 +118,6 @@ export async function buildSpk(options) {
109
118
  copyFileSync(nativePath, join(packageDir, "native.yaml"));
110
119
  chmodSync(join(staging, "INFO"), FILE_MODE);
111
120
  chmodSync(join(staging, "privilege"), FILE_MODE);
112
- chmodSync(join(staging, "WIZARD_UIFILES", INSTALL_UIFILE), FILE_MODE);
113
- chmodSync(join(staging, "WIZARD_UIFILES", UPGRADE_UIFILE), FILE_MODE);
114
- chmodSync(join(staging, "WIZARD_UIFILES", UNINSTALL_UIFILE), FILE_MODE);
115
121
  chmodSync(join(packageDir, "synology-app.yaml"), FILE_MODE);
116
122
  chmodSync(join(packageDir, "native.yaml"), FILE_MODE);
117
123
  const outputPath = options.outputPath ??
@@ -135,25 +141,44 @@ export async function buildSpk(options) {
135
141
  return { ok: false, errors: ["COMPOSE_ROUTE_UNSUPPORTED"] };
136
142
  }
137
143
  const rwEligibility = route.eligibility;
144
+ const gateway = rwEligibility?.adminport !== undefined && usesAuthGateway(contract)
145
+ ? gatewayConfig(contract, rwEligibility.adminport)
146
+ : undefined;
147
+ if (gateway && !options.archFamily) {
148
+ return { ok: false, errors: ["GATEWAY_ARCH_FAMILY_REQUIRED"] };
149
+ }
138
150
  const isDynamicRoute = route?.route === "dynamic";
139
151
  const isResourceWorkerRoute = route?.route === "static-zero-config" ||
140
152
  isDynamicRoute;
141
153
  const staging = mkdtempSync(join(tmpdir(), "syno-spk-"));
154
+ const gatewayWork = mkdtempSync(join(tmpdir(), "syno-gateway-"));
142
155
  try {
156
+ let gatewayBinary;
157
+ if (gateway) {
158
+ const built = buildGatewayBinary({
159
+ packageId: String(contract.package),
160
+ arch: options.archFamily,
161
+ config: gateway,
162
+ work: gatewayWork,
163
+ run: options.gatewayRun,
164
+ });
165
+ if ("error" in built) {
166
+ console.error(built.detail);
167
+ return { ok: false, errors: [built.error] };
168
+ }
169
+ gatewayBinary = built.binary;
170
+ }
143
171
  writeFileSync(join(staging, "INFO"), renderInfo(contract, options.archFamily, isResourceWorkerRoute), "utf8");
144
172
  writePackageCenterIcons(staging);
145
173
  mkdirSync(join(staging, "conf"), { recursive: true });
146
174
  writeFileSync(join(staging, "conf", "privilege"), renderPrivilege(), "utf8");
147
175
  writeFileSync(join(staging, "privilege"), renderPrivilege(), "utf8");
148
176
  if (isResourceWorkerRoute) {
149
- const resourceConfig = renderResourceConfig(contract, rwEligibility);
177
+ const resourceConfig = renderResourceConfig(contract, rwEligibility, parsedCompose.compose);
150
178
  writeFileSync(join(staging, "conf", "resource"), resourceConfig, "utf8");
151
179
  chmodSync(join(staging, "conf", "resource"), FILE_MODE);
152
180
  }
153
- mkdirSync(join(staging, "WIZARD_UIFILES"), { recursive: true });
154
- writeFileSync(join(staging, "WIZARD_UIFILES", INSTALL_UIFILE), JSON.stringify(renderInstallWizard(contract, parsedCompose?.compose), null, 2), "utf8");
155
- writeFileSync(join(staging, "WIZARD_UIFILES", UPGRADE_UIFILE), JSON.stringify(renderUpgradeWizard(contract, parsedCompose?.compose), null, 2), "utf8");
156
- writeFileSync(join(staging, "WIZARD_UIFILES", UNINSTALL_UIFILE), JSON.stringify(renderUninstallWizard(), null, 2), "utf8");
181
+ writeWizards(staging, contract, parsedCompose?.compose, "container");
157
182
  mkdirSync(join(staging, "scripts"), { recursive: true });
158
183
  for (const name of SCRIPT_NAMES) {
159
184
  const scriptPath = join(staging, "scripts", name);
@@ -215,11 +240,11 @@ export async function buildSpk(options) {
215
240
  writeFileSync(join(uiDir, "config"), renderDsmWindowConfig(contract), "utf8");
216
241
  writeDsmWindowIcons(uiDir);
217
242
  }
243
+ if (gateway && gatewayBinary) {
244
+ writeGatewayPayload(join(staging, "package"), gatewayBinary, gateway);
245
+ }
218
246
  chmodSync(join(staging, "INFO"), FILE_MODE);
219
247
  chmodSync(join(staging, "privilege"), FILE_MODE);
220
- chmodSync(join(staging, "WIZARD_UIFILES", INSTALL_UIFILE), FILE_MODE);
221
- chmodSync(join(staging, "WIZARD_UIFILES", UPGRADE_UIFILE), FILE_MODE);
222
- chmodSync(join(staging, "WIZARD_UIFILES", UNINSTALL_UIFILE), FILE_MODE);
223
248
  chmodSync(join(staging, "package", "compose.yaml"), FILE_MODE);
224
249
  chmodSync(join(staging, "package", "synology-app.yaml"), FILE_MODE);
225
250
  if (contract.adminport !== undefined && resolvedWebLaunch(contract) === "dsm-window") {
@@ -232,6 +257,7 @@ export async function buildSpk(options) {
232
257
  }
233
258
  finally {
234
259
  rmSync(staging, { recursive: true, force: true });
260
+ rmSync(gatewayWork, { recursive: true, force: true });
235
261
  }
236
262
  }
237
263
  function quoteInfo(value) {
@@ -252,19 +278,21 @@ function renderInfo(contract, archFamily, isResourceWorker = false) {
252
278
  add("maintainer", String(contract.maintainer));
253
279
  add("arch", archFamily === undefined ? "noarch" : infoArchValue(archFamily));
254
280
  add("os_min_ver", String(contract.os_min_ver));
281
+ const viaGateway = isResourceWorker && usesAuthGateway(contract);
255
282
  if (isResourceWorker) {
256
283
  // DSM reports Container Manager as "not ready" through the package
257
284
  // dependency gate even while pkgctl-ContainerManager is running. The
258
285
  // docker-project worker itself remains the authoritative live prerequisite
259
286
  // (ContainerManager >= 1432); keep only the reliable Web Station package
260
287
  // dependency here so a valid resource-worker SPK can reach acquisition.
261
- if (contract.adminport !== undefined) {
288
+ // A gateway package has no Web Station portal, so it does not depend on it.
289
+ if (contract.adminport !== undefined && !viaGateway) {
262
290
  add("install_dep_packages", "WebStation");
263
291
  }
264
292
  }
265
293
  add("startable", "yes");
266
294
  const launch = resolvedWebLaunch(contract);
267
- if (contract.adminprotocol) {
295
+ if (contract.adminprotocol && !viaGateway) {
268
296
  add("adminprotocol", String(contract.adminprotocol));
269
297
  }
270
298
  if (launch === "new-page" || launch === "dsm-window") {
@@ -289,6 +317,10 @@ function renderInfo(contract, archFamily, isResourceWorker = false) {
289
317
  add("dsmuidir", "ui");
290
318
  add("dsmappname", String(contract.package));
291
319
  }
320
+ else if (viaGateway) {
321
+ // The gateway CGI is served from ui/ even when the App opens in a new page.
322
+ add("dsmuidir", "ui");
323
+ }
292
324
  return `${lines.join("\n")}\n`;
293
325
  }
294
326
  function renderPrivilege() {
@@ -298,15 +330,6 @@ function renderPrivilege() {
298
330
  },
299
331
  }, null, 2)}\n`;
300
332
  }
301
- const SHARED_FOLDER_MOUNT_CONSENT = "此 App 會用你在這台 NAS 選的資料夾;整顆應用都看得到。Shared Folder Mount 是整個 App Instance 的 container access:能打開這個 App 的使用者,容器裡的程式都看得到該 Share,即使該使用者在 File Station 看不到。這不是逐使用者 DSM ACL。檔案權限取決於容器服務帳號;App 必須自行實作使用者授權。";
302
- const HOMES_MOUNT_CONSENT = "此 App 會使用這台 NAS 已啟用的 User Home;整顆應用的容器都看得到,容器路徑由 Compose 決定。這不是逐使用者 DSM ACL;檔案權限取決於容器服務帳號;App 必須自行實作使用者授權。";
303
- const POSIX_ALL_SHARES_MAX_WARNING = "此 App 會使用安裝當下這台 NAS 的全部 Shared Folder(App-wide,不依個別 DSM ACL);容器內可讀(或讀寫,依 Compose 模式)所有這些資料夾的檔案。安裝後新建的共用資料夾不會自動加入。Package Center 無法提供安裝當下的 Shared Folder 清單快照;要以全部 Share 安裝,請用 CLI `synopkgland deploy`,由 CLI 以管理員權限列舉全部 Share 並寫入快照。由管理員決定是否安裝。";
304
- const POSIX_ALL_SHARES_UPGRADE_NOTICE = "升級會保留既有快照(安裝當下由 CLI 列舉的全部 Shared Folder);變更掛載範圍只能由 CLI 明確提供(`synopkgland deploy`)。Package Center 升級不會改動現有快照。";
305
- const DSM_USER_RUN_AS_CONSENT = "寫進 Share 的新檔在 File Station 顯示為你選的那位 DSM 使用者。點開此 App 的人共用這個磁碟身分,不是逐登入 ACL。";
306
- const DSM_USER_UPGRADE_CONSENT = "升級時更換 Container Run-as 不會 chown Share 上的舊檔;只有升級後寫入的新檔才會使用新的磁碟身分。";
307
- const UPGRADE_VALUE_REUSE_DESC = "留空=沿用目前設定";
308
- const SHARED_FOLDER_RW_UPGRADE_CONSENT = "此版本把 Share 掛載改為讀寫;容器可讀取並寫入你選的 Share,不再是唯讀。";
309
- const APP_OWN_SPACE_CONSENT = "此 App 只用 App 自己的空間。";
310
333
  function volumeSources(compose) {
311
334
  return volumeMounts(compose).map((mount) => mount.source);
312
335
  }
@@ -389,8 +412,7 @@ function injectPosixAllSharesMarkers(composeContent, contract) {
389
412
  }
390
413
  return output.join("\n");
391
414
  }
392
- const PRIVILEGE_MAX_WARNING = "此 App 的容器有高權限,接近這台 NAS 的 root、幾乎整台機器。是否安裝由你這位管理員決定。";
393
- function renderInstallWizard(contract, compose) {
415
+ function renderInstallWizard(t, contract, compose) {
394
416
  const items = [];
395
417
  const params = collectInstallParameters(contract);
396
418
  const hasSharedFolder = params.some((item) => item.param.type === "shared_folder");
@@ -398,27 +420,27 @@ function renderInstallWizard(contract, compose) {
398
420
  const hasDsmUser = params.some((item) => item.param.type === "dsm_user");
399
421
  if (compose && scanComposePrivilege(compose).length > 0) {
400
422
  items.push({
401
- desc: PRIVILEGE_MAX_WARNING,
423
+ desc: t("consent.privilege"),
402
424
  });
403
425
  }
404
426
  if (hasSharedFolder) {
405
427
  items.push({
406
- desc: SHARED_FOLDER_MOUNT_CONSENT,
428
+ desc: t("consent.sharedFolder"),
407
429
  });
408
430
  }
409
431
  if (hasHomes) {
410
432
  items.push({
411
- desc: HOMES_MOUNT_CONSENT,
433
+ desc: t("consent.homes"),
412
434
  });
413
435
  }
414
436
  if (hasDsmUser) {
415
437
  items.push({
416
- desc: DSM_USER_RUN_AS_CONSENT,
438
+ desc: t("consent.dsmUser"),
417
439
  });
418
440
  }
419
441
  if (!hasSharedFolder && (!compose || composeUsesOnlyAppSpace(compose))) {
420
442
  items.push({
421
- desc: APP_OWN_SPACE_CONSENT,
443
+ desc: t("consent.appOwnSpace"),
422
444
  });
423
445
  }
424
446
  for (const { name, param } of params) {
@@ -428,7 +450,7 @@ function renderInstallWizard(contract, compose) {
428
450
  if (param.type === "string") {
429
451
  items.push({
430
452
  type: "textfield",
431
- desc: `Install Parameter: ${name}`,
453
+ desc: t("param.install", { name }),
432
454
  subitems: [{
433
455
  key: name,
434
456
  desc: name,
@@ -441,7 +463,7 @@ function renderInstallWizard(contract, compose) {
441
463
  if (param.type === "boolean") {
442
464
  items.push({
443
465
  type: "multiselect",
444
- desc: `Install Parameter: ${name}`,
466
+ desc: t("param.install", { name }),
445
467
  subitems: [{ key: name, desc: name, defaultValue: param.default ?? false }],
446
468
  });
447
469
  continue;
@@ -449,36 +471,13 @@ function renderInstallWizard(contract, compose) {
449
471
  if (param.type === "secret") {
450
472
  items.push({
451
473
  type: "password",
452
- desc: `Install Parameter: ${name}`,
474
+ desc: t("param.install", { name }),
453
475
  subitems: [{ key: name, desc: name, validator: { allowBlank: false } }],
454
476
  });
455
477
  continue;
456
478
  }
457
479
  if (param.type === "shared_folder") {
458
- items.push({
459
- type: "combobox",
460
- desc: `Shared Folder: ${name}`,
461
- subitems: [{
462
- key: name,
463
- desc: name,
464
- displayField: "name",
465
- valueField: "name",
466
- editable: false,
467
- forceSelection: true,
468
- autoSelect: false,
469
- mode: "remote",
470
- api_store: {
471
- api: "SYNO.Core.Share",
472
- method: "list",
473
- version: 1,
474
- baseParams: { limit: -1, offset: 0 },
475
- root: "shares",
476
- idProperty: "name",
477
- fields: ["name"],
478
- },
479
- validator: { allowBlank: false },
480
- }],
481
- });
480
+ items.push(sharedFolderCombobox(t, name));
482
481
  continue;
483
482
  }
484
483
  if (param.type === "posix_all_shares") {
@@ -493,14 +492,14 @@ function renderInstallWizard(contract, compose) {
493
492
  // ALL_SHARES and no CHANGE_ALL_SHARES.
494
493
  items.push({
495
494
  type: "textblock",
496
- desc: POSIX_ALL_SHARES_MAX_WARNING,
495
+ desc: t("consent.posixAllShares"),
497
496
  });
498
497
  continue;
499
498
  }
500
499
  if (param.type === "dsm_user") {
501
500
  items.push({
502
501
  type: "combobox",
503
- desc: `Container Run-as: ${name}`,
502
+ desc: t("param.runAs", { name }),
504
503
  subitems: [{
505
504
  key: name,
506
505
  desc: name,
@@ -525,18 +524,20 @@ function renderInstallWizard(contract, compose) {
525
524
  }
526
525
  }
527
526
  return [{
528
- step_title: "安裝設定",
527
+ step_title: t("install.step"),
529
528
  items,
530
529
  }];
531
530
  }
532
- function renderUpgradeWizard(contract, compose) {
533
- const installWizard = renderInstallWizard(contract, compose);
531
+ function renderUpgradeWizard(t, contract, compose) {
532
+ const installWizard = renderInstallWizard(t, contract, compose);
534
533
  const params = collectInstallParameters(contract);
535
534
  // Every type whose value must survive an upgrade the administrator did not
536
535
  // deliberately change. Two mechanisms are needed because DSM renders them
537
536
  // differently: a control that can be left blank just allows blank, while one
538
537
  // that always carries a value needs an explicit "change this" gate.
539
- // - dsm_user : measurably comes up blank, so allowBlank is enough
538
+ // - dsm_user : blank in some layouts, but measured on DSM 7.4-90069 with
539
+ // Shared Folder controls beside it to come up pre-filled with a
540
+ // Shared Folder name, so it needs the same explicit gate
540
541
  // - string : blank once the new version's default is withheld (A44)
541
542
  // - shared_folder : DSM prefills the first store row
542
543
  // - boolean : a checkbox has no blank state at all
@@ -551,7 +552,7 @@ function renderUpgradeWizard(contract, compose) {
551
552
  param.type === "string" ||
552
553
  param.type === "boolean")
553
554
  .map(({ name, param }) => [name, param.type]));
554
- const needsChangeGate = (type) => type === "shared_folder" || type === "boolean";
555
+ const needsChangeGate = (type) => type === "shared_folder" || type === "dsm_user" || type === "boolean";
555
556
  const upgradeItems = installWizard[0].items.flatMap((item) => {
556
557
  if (!Array.isArray(item.subitems)) {
557
558
  return [item];
@@ -581,20 +582,24 @@ function renderUpgradeWizard(contract, compose) {
581
582
  }
582
583
  const control = {
583
584
  ...item,
584
- desc: `${String(item.desc ?? "")}(${UPGRADE_VALUE_REUSE_DESC})`,
585
+ desc: t("upgrade.reuseDesc", { desc: String(item.desc ?? "") }),
585
586
  subitems,
586
587
  };
587
588
  const changeControls = reuseKeys
588
589
  .filter((key) => needsChangeGate(upgradeReuseTypes.get(key)))
589
590
  .map((key) => {
590
591
  const type = upgradeReuseTypes.get(key);
591
- const label = type === "shared_folder" ? "Shared Folder" : key;
592
+ const label = type === "shared_folder"
593
+ ? t("label.sharedFolder")
594
+ : type === "dsm_user"
595
+ ? t("label.runAs")
596
+ : key;
592
597
  return {
593
598
  type: "multiselect",
594
- desc: `變更 ${label}(不勾=沿用目前設定)`,
599
+ desc: t("upgrade.changeDesc", { label }),
595
600
  subitems: [{
596
601
  key: `CHANGE_${key}`,
597
- desc: `變更 ${label}`,
602
+ desc: t("upgrade.changeSub", { label }),
598
603
  defaultValue: false,
599
604
  }],
600
605
  };
@@ -616,23 +621,23 @@ function renderUpgradeWizard(contract, compose) {
616
621
  .map((item) => item.name);
617
622
  if (posixAllSharesNames.length > 0) {
618
623
  upgradeConsent.push({
619
- desc: POSIX_ALL_SHARES_UPGRADE_NOTICE,
624
+ desc: t("upgrade.posixNotice"),
620
625
  });
621
626
  }
622
627
  if (hasReadWriteSharedFolder) {
623
628
  upgradeConsent.push({
624
- desc: SHARED_FOLDER_RW_UPGRADE_CONSENT,
629
+ desc: t("upgrade.sharedFolderRw"),
625
630
  });
626
631
  }
627
632
  if (hasDsmUser && hasSharedFolder) {
628
633
  upgradeConsent.push({
629
- desc: DSM_USER_UPGRADE_CONSENT,
634
+ desc: t("upgrade.dsmUser"),
630
635
  });
631
636
  }
632
637
  if (upgradeConsent.length === 0) {
633
638
  return [{
634
639
  ...installWizard[0],
635
- step_title: "升級設定",
640
+ step_title: t("upgrade.step"),
636
641
  items: upgradeItems,
637
642
  }];
638
643
  }
@@ -642,30 +647,18 @@ function renderUpgradeWizard(contract, compose) {
642
647
  items.splice(insertAt, 0, ...upgradeConsent);
643
648
  return [{
644
649
  ...installWizard[0],
645
- step_title: "升級設定",
650
+ step_title: t("upgrade.step"),
646
651
  items,
647
652
  }];
648
653
  }
649
- function renderUninstallWizard() {
650
- return [{
651
- step_title: "解除安裝",
652
- items: [
653
- {
654
- desc: "勾選 Delete App Data 會永久刪除 App data 與 secrets,但不刪 Shared Folder 或 named volume。平台沒有檢查 Hyper Backup,也未驗證可復原備份。",
655
- },
656
- {
657
- type: "multiselect",
658
- desc: "Delete App Data",
659
- subitems: [
660
- {
661
- key: "delete_app_data",
662
- desc: "Delete App Data",
663
- defaultValue: false,
664
- },
665
- ],
666
- },
667
- ],
668
- }];
654
+ function writeWizards(staging, contract, compose, kind) {
655
+ const install = renderInstallWizardFiles(String(contract.package), (t) => renderInstallWizard(t, contract, compose));
656
+ writeWizardUiFiles(staging, {
657
+ ...install.static,
658
+ ...install.dynamic,
659
+ ...renderWizardFiles(UPGRADE_UIFILE, (t) => renderUpgradeWizard(t, contract, compose)),
660
+ ...renderUninstallWizardFiles(String(contract.package), kind),
661
+ });
669
662
  }
670
663
  function renderDynamicPreinstMaterializer(contract) {
671
664
  const allParams = collectInstallParameters(contract);
@@ -728,7 +721,7 @@ function renderDynamicPreinstMaterializer(contract) {
728
721
  // which is true, so the gate silently always reused the canonical value.
729
722
  const usesUpgradeChangeGate = sharedFolderParams.length > 0 ||
730
723
  posixAllSharesParams.length > 0 ||
731
- collectInstallParameters(contract).some(({ param }) => param.type === "boolean");
724
+ collectInstallParameters(contract).some(({ param }) => param.type === "boolean" || param.type === "dsm_user");
732
725
  if (usesUpgradeChangeGate) {
733
726
  lines.push("upgrade_change_enabled() {", " normalized=\"$(printf '%s' \"$1\" | LC_ALL=C tr '[:upper:]' '[:lower:]')\"", " case \"$normalized\" in", " true|1|yes|on) return 0 ;;", " *) return 1 ;;", " esac", "}");
734
727
  }
@@ -788,7 +781,9 @@ function renderDynamicPreinstMaterializer(contract) {
788
781
  if (dsmUserParam) {
789
782
  const name = dsmUserParam.name;
790
783
  const rawUserVar = "D54_RAW_USER_" + name;
791
- lines.push(` if [ "\${${name}+x}" = x ] && [ -n "\${${name}}" ]; then`, ` ${rawUserVar}="\${${name}}"`, ' elif [ "$STATUS" = "UPGRADE" ] && [ -f "$CANONICAL_ENV" ] && [ ! -L "$CANONICAL_ENV" ] && ' +
784
+ // Like the Shared Folder gate: on UPGRADE the submitted user only counts when
785
+ // CHANGE_<name> is ticked, because the control is not reliably blank.
786
+ lines.push(` if [ "$STATUS" = "UPGRADE" ] && upgrade_change_enabled "\${CHANGE_${name}:-}"; then`, ` if [ "\${${name}+x}" = x ] && [ -n "\${${name}}" ]; then`, ` ${rawUserVar}="\${${name}}"`, " else", ` die "missing required dsm user parameter ${name}"`, " fi", ' elif [ "$STATUS" = "UPGRADE" ] && [ -f "$CANONICAL_ENV" ] && [ ! -L "$CANONICAL_ENV" ] && ' +
792
787
  `${rawUserVar}="$(read_env_value "$CANONICAL_ENV" "${name}")"; then`, " :", ` elif [ "\${${name}+x}" = x ]; then`, ` ${rawUserVar}="\${${name}}"`, " else", ` die "missing required dsm user parameter ${name}"`, " fi", ` resolved_user_info="$(resolve_dsm_user "$${rawUserVar}")"`, " set -- $resolved_user_info", ` ${name}_UID="$1"`, ` ${name}_GID="$2"`, " shift 2 || true", ` ${name}_GROUPS="$*"`, ` rewrite_group_add "${name}" "$${name}_GROUPS" "$PROJECT/docker-compose.yml"`);
793
788
  }
794
789
  lines.push(' append_env "SYNOPKG_PKGVAR" "$PLATFORM_PKGVAR"', ' append_env "SYNO_APP_SECRETS_DIR" "$PLATFORM_SECRETS"');
@@ -890,16 +885,17 @@ function renderManagedScript(name, contract, nativeContext, isResourceWorker = f
890
885
  return renderHeadlessResourceMarker();
891
886
  }
892
887
  if (name === "postuninst") {
893
- const projectRoot = isDynamicRoute ? 'PROJECT="${SYNOPKG_PKGDEST}/compose"\n' : "";
894
- const deleteRoots = isDynamicRoute
895
- ? ["PKGVAR", "PROJECT", "SECRETS"]
896
- : ["PKGVAR", "SECRETS"];
888
+ const projectRoot = isDynamicRoute ? 'PROJECT="${SYNOPKG_PKGDEST:-}/compose"\n' : "";
889
+ const deleteRoots = [
890
+ { variable: "PKGVAR", area: "appdata" },
891
+ { variable: "PKGHOME", area: "apphome" },
892
+ ...(isDynamicRoute ? [{ variable: "PROJECT", area: "appstore" }] : []),
893
+ ];
897
894
  return `#!/bin/sh
898
895
  set -eu
899
- PKGVAR="\${SYNOPKG_PKGVAR}"
900
- PKGHOME="\${SYNOPKG_PKGHOME}"
901
- SECRETS="\${PKGHOME}/secrets"
902
- ${projectRoot}${renderDeleteAppDataBlock(deleteRoots)}exit 0
896
+ PKGVAR="\${SYNOPKG_PKGVAR:-}"
897
+ PKGHOME="\${SYNOPKG_PKGHOME:-}"
898
+ ${projectRoot}${renderDeleteAppDataBlock(String(contract.package), deleteRoots)}exit 0
903
899
  `;
904
900
  }
905
901
  return `#!/bin/sh\nexit 0\n`;
@@ -0,0 +1,20 @@
1
+ import { type Translate } from "./wizard-i18n.js";
2
+ /** One step of a DSM install wizard; `items` are rendered verbatim as JSON. */
3
+ export interface InstallWizardStep {
4
+ step_title: string;
5
+ items: Array<Record<string, unknown>>;
6
+ }
7
+ /** The static JSON wizard per locale, and the dynamic script per locale. */
8
+ export interface InstallWizardFiles {
9
+ static: Record<string, string>;
10
+ dynamic: Record<string, string>;
11
+ }
12
+ /**
13
+ * Builds the static `<base>` wizard files and one dynamic `<base>.sh` script
14
+ * per locale from the same render function. The static files stay for DSM
15
+ * versions and flows that do not run the dynamic script; both carry the same
16
+ * items, and only the dynamic one adds the reuse notice when data exists.
17
+ */
18
+ export declare function renderInstallWizardFiles(packageName: string, render: (t: Translate) => InstallWizardStep[]): InstallWizardFiles;
19
+ /** The native-go install step: no parameters, only the app-space consent. */
20
+ export declare function renderNativeInstallWizard(t: Translate): InstallWizardStep[];
@@ -0,0 +1,76 @@
1
+ import { DSM_LANGS, LOCALES } from "../standalone/i18n.js";
2
+ import { renderWizardFiles, translator } from "./wizard-i18n.js";
3
+ const BASE = "install_uifile";
4
+ function shellQuote(value) {
5
+ return `'${value.replaceAll("'", "'\\''")}'`;
6
+ }
7
+ function localeName(locale, suffix) {
8
+ return locale === "en" ? `${BASE}${suffix}` : `${BASE}_${DSM_LANGS[locale]}${suffix}`;
9
+ }
10
+ /**
11
+ * The install wizard the administrator would otherwise never see: DSM keeps
12
+ * `@appdata` after an uninstall, so a reinstall silently inherits the old
13
+ * settings and generated secrets. This notice says so and how to start clean.
14
+ */
15
+ function withReuseNotice(steps, packageName, t) {
16
+ const notice = { desc: t("install.reuseData", { package: packageName }) };
17
+ const [first, ...rest] = steps;
18
+ if (!first) {
19
+ return [{ step_title: t("install.step"), items: [notice] }];
20
+ }
21
+ return [{ ...first, items: [notice, ...first.items] }, ...rest];
22
+ }
23
+ /**
24
+ * A dynamic install wizard script. It only reads: `SYNOPKG_PKGDEST_VOL` when
25
+ * DSM already knows the target volume, otherwise every `/volume*` (the volume
26
+ * is chosen after the wizard on some flows). The wizard JSON is written to
27
+ * `SYNOPKG_TEMP_LOGFILE`, DSM's documented channel, or stdout without it.
28
+ */
29
+ function renderDynamicScript(packageName, withData, withoutData) {
30
+ return `#!/bin/sh
31
+ # Generated by synopkgland. Read-only: it checks whether this package already
32
+ # has App Data on a volume, then prints the install wizard for this language.
33
+ pkg=${shellQuote(packageName)}
34
+ existing=
35
+ for root in \${SYNOPKG_PKGDEST_VOL:-} /volume*; do
36
+ if [ -n "$root" ] && [ -d "$root/@appdata/$pkg" ]; then
37
+ existing=1
38
+ break
39
+ fi
40
+ done
41
+ if [ -n "\${SYNOPKG_TEMP_LOGFILE:-}" ]; then
42
+ exec > "$SYNOPKG_TEMP_LOGFILE"
43
+ fi
44
+ if [ -n "$existing" ]; then
45
+ cat <<'SYNOPKGLAND_WIZARD'
46
+ ${withData}
47
+ SYNOPKGLAND_WIZARD
48
+ else
49
+ cat <<'SYNOPKGLAND_WIZARD'
50
+ ${withoutData}
51
+ SYNOPKGLAND_WIZARD
52
+ fi
53
+ `;
54
+ }
55
+ /**
56
+ * Builds the static `<base>` wizard files and one dynamic `<base>.sh` script
57
+ * per locale from the same render function. The static files stay for DSM
58
+ * versions and flows that do not run the dynamic script; both carry the same
59
+ * items, and only the dynamic one adds the reuse notice when data exists.
60
+ */
61
+ export function renderInstallWizardFiles(packageName, render) {
62
+ const staticFiles = renderWizardFiles(BASE, render);
63
+ const dynamic = {};
64
+ for (const locale of LOCALES) {
65
+ const t = translator(locale);
66
+ const steps = render(t);
67
+ const withData = JSON.stringify(withReuseNotice(steps, packageName, t), null, 2);
68
+ const withoutData = JSON.stringify(steps, null, 2);
69
+ dynamic[localeName(locale, ".sh")] = renderDynamicScript(packageName, withData, withoutData);
70
+ }
71
+ return { static: staticFiles, dynamic };
72
+ }
73
+ /** The native-go install step: no parameters, only the app-space consent. */
74
+ export function renderNativeInstallWizard(t) {
75
+ return [{ step_title: t("install.step"), items: [{ desc: t("consent.appOwnSpace") }] }];
76
+ }
@@ -1,4 +1,7 @@
1
1
  import type { NativeConfig } from "../native/types.js";
2
+ import { type DeleteRoot } from "./delete-app-data.js";
3
+ /** `@appdata` and `@apphome`; `@appconf` stays because no template writes there. */
4
+ export declare const NATIVE_DELETE_ROOTS: readonly DeleteRoot[];
2
5
  export interface NativeLifecycleInput {
3
6
  packageIdentity: string;
4
7
  config: NativeConfig;
@@ -49,3 +52,5 @@ export declare function renderNativePreuninst(input: NativeLifecycleInput): stri
49
52
  * package user on uninstall; deleting a system account is not this script's job.
50
53
  */
51
54
  export declare function renderNativePostuninst(input: NativeLifecycleInput): string;
55
+ /** The postuninst every native runtime shares: only the package name differs. */
56
+ export declare function renderPackagePostuninst(pkg: string): string;
@@ -1,4 +1,9 @@
1
1
  import { renderDeleteAppDataBlock } from "./delete-app-data.js";
2
+ /** `@appdata` and `@apphome`; `@appconf` stays because no template writes there. */
3
+ export const NATIVE_DELETE_ROOTS = [
4
+ { variable: "PKGVAR", area: "appdata" },
5
+ { variable: "PKGHOME", area: "apphome" },
6
+ ];
2
7
  /**
3
8
  * Escapes a literal string for safe inclusion in POSIX `/bin/sh` single quotes.
4
9
  * A single quote is represented as `'\''` (close single quote, literal escaped single quote, reopen single quote).
@@ -192,11 +197,16 @@ exit 0
192
197
  * package user on uninstall; deleting a system account is not this script's job.
193
198
  */
194
199
  export function renderNativePostuninst(input) {
195
- const pkg = input.packageIdentity;
200
+ return renderPackagePostuninst(input.packageIdentity);
201
+ }
202
+ /** The postuninst every native runtime shares: only the package name differs. */
203
+ export function renderPackagePostuninst(pkg) {
196
204
  const pkgVarFallback = `\${SYNOPKG_PKGVAR:-/var/packages/${pkg}/var}`;
205
+ const pkgHomeFallback = `\${SYNOPKG_PKGHOME:-/var/packages/${pkg}/home}`;
197
206
  return `#!/bin/sh
198
207
  set -eu
199
208
  PKGVAR="${pkgVarFallback}"
200
- ${renderDeleteAppDataBlock(["PKGVAR"])}exit 0
209
+ PKGHOME="${pkgHomeFallback}"
210
+ ${renderDeleteAppDataBlock(pkg, NATIVE_DELETE_ROOTS)}exit 0
201
211
  `;
202
212
  }
@@ -1,10 +1,15 @@
1
- import type { AppContract } from "../types.js";
2
- import type { ResourceWorkerEligibility } from "../compose/analyze.js";
1
+ import type { AppContract, ComposeDocument } from "../types.js";
2
+ import { type ResourceWorkerEligibility } from "../compose/analyze.js";
3
3
  export { classifyComposeRoute, resourceWorkerEligibility, type ComposeRoute, type ComposeRouteClassification, type ResourceWorkerEligibility, type ResourceWorkerIneligibleReason, } from "../compose/analyze.js";
4
4
  export declare function composeProjectName(packageId: string): string;
5
- export declare function renderDockerProjectResource(packageId: string, projectPath?: string): Record<string, unknown>;
5
+ /**
6
+ * `forcePull` re-resolves every image tag on install, which can move an image
7
+ * shared with other containers. Digest-pinned images cannot move, so it is only
8
+ * needed (and kept, to preserve upgrade behaviour) while a tag is unpinned.
9
+ */
10
+ export declare function renderDockerProjectResource(packageId: string, projectPath?: string, forcePull?: boolean): Record<string, unknown>;
6
11
  export declare function renderWebserviceResource(contract: AppContract, adminport: number): Record<string, unknown>;
7
- export declare function renderResourceConfig(contract: AppContract, eligibility: ResourceWorkerEligibility): string;
12
+ export declare function renderResourceConfig(contract: AppContract, eligibility: ResourceWorkerEligibility, compose: ComposeDocument): string;
8
13
  /**
9
14
  * Renders the lifecycle control script for the Docker Project resource-worker
10
15
  * route. ContainerManager owns the actual project start/stop operation through