@synopackageland/cli 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/README.md +7 -3
  2. package/dist/build-spk/delete-app-data.d.ts +27 -7
  3. package/dist/build-spk/delete-app-data.js +35 -34
  4. package/dist/build-spk/dsm-arch.d.ts +6 -1
  5. package/dist/build-spk/dsm-arch.js +25 -1
  6. package/dist/build-spk/dsm-version.d.ts +14 -0
  7. package/dist/build-spk/dsm-version.js +47 -0
  8. package/dist/build-spk/gateway.d.ts +31 -0
  9. package/dist/build-spk/gateway.js +55 -0
  10. package/dist/build-spk/generator.d.ts +5 -0
  11. package/dist/build-spk/generator.js +103 -107
  12. package/dist/build-spk/install-wizard.d.ts +20 -0
  13. package/dist/build-spk/install-wizard.js +76 -0
  14. package/dist/build-spk/native-lifecycle.d.ts +5 -0
  15. package/dist/build-spk/native-lifecycle.js +12 -2
  16. package/dist/build-spk/resource-worker.d.ts +9 -4
  17. package/dist/build-spk/resource-worker.js +15 -6
  18. package/dist/build-spk/share-combobox.d.ts +3 -0
  19. package/dist/build-spk/share-combobox.js +27 -0
  20. package/dist/build-spk/uninstall-wizard.d.ts +14 -0
  21. package/dist/build-spk/uninstall-wizard.js +33 -0
  22. package/dist/build-spk/wizard-i18n.d.ts +18 -0
  23. package/dist/build-spk/wizard-i18n.js +38 -0
  24. package/dist/build-spk/wizard-messages.d.ts +388 -0
  25. package/dist/build-spk/wizard-messages.js +387 -0
  26. package/dist/cli.js +130 -30
  27. package/dist/compose/analyze.d.ts +20 -0
  28. package/dist/compose/analyze.js +75 -11
  29. package/dist/contract/validate.js +33 -1
  30. package/dist/contract/web-launch.d.ts +22 -0
  31. package/dist/contract/web-launch.js +37 -0
  32. package/dist/deploy/deploy.d.ts +3 -0
  33. package/dist/deploy/deploy.js +11 -2
  34. package/dist/error-registry.js +60 -1
  35. package/dist/host/open-url.d.ts +2 -0
  36. package/dist/host/open-url.js +4 -1
  37. package/dist/images/pin.d.ts +52 -0
  38. package/dist/images/pin.js +249 -0
  39. package/dist/init.d.ts +27 -3
  40. package/dist/init.js +104 -15
  41. package/dist/inspect.d.ts +3 -0
  42. package/dist/inspect.js +15 -3
  43. package/dist/standalone/background.d.ts +21 -0
  44. package/dist/standalone/background.js +52 -0
  45. package/dist/standalone/binary.d.ts +1 -0
  46. package/dist/standalone/binary.js +1 -1
  47. package/dist/standalone/build.d.ts +2 -0
  48. package/dist/standalone/build.js +38 -6
  49. package/dist/standalone/dsm-window.js +2 -2
  50. package/dist/standalone/helper-inventory.d.ts +15 -0
  51. package/dist/standalone/helper-inventory.js +9 -0
  52. package/dist/standalone/helper.d.ts +1 -0
  53. package/dist/standalone/helper.js +28 -10
  54. package/dist/standalone/host-adapter.d.ts +1 -1
  55. package/dist/standalone/host-adapter.js +33 -15
  56. package/dist/standalone/host-file-navigation.d.ts +7 -0
  57. package/dist/standalone/host-file-navigation.js +172 -0
  58. package/dist/standalone/inspect-helper.js +9 -4
  59. package/dist/standalone/inspect-spk.d.ts +1 -1
  60. package/dist/standalone/inspect-spk.js +200 -7
  61. package/dist/standalone/job-diagnostics.d.ts +1 -0
  62. package/dist/standalone/job-diagnostics.js +49 -0
  63. package/dist/standalone/lifecycle.js +12 -2
  64. package/dist/standalone/manifest.d.ts +15 -2
  65. package/dist/standalone/manifest.js +37 -6
  66. package/dist/standalone/native-layout.d.ts +74 -0
  67. package/dist/standalone/native-layout.js +318 -0
  68. package/dist/standalone/resource.d.ts +11 -0
  69. package/dist/standalone/resource.js +13 -0
  70. package/dist/standalone/root-window.d.ts +3 -1
  71. package/dist/standalone/root-window.js +156 -38
  72. package/dist/standalone/shared-folder.d.ts +39 -0
  73. package/dist/standalone/shared-folder.js +141 -0
  74. package/dist/standalone/spk.d.ts +2 -0
  75. package/dist/standalone/spk.js +33 -3
  76. package/dist/standalone/worker-contract-json.d.ts +8 -0
  77. package/dist/standalone/worker-contract-json.js +141 -0
  78. package/dist/standalone/worker-contract.d.ts +189 -0
  79. package/dist/standalone/worker-contract.js +175 -0
  80. package/dist/standalone/worker-registry.d.ts +40 -0
  81. package/dist/standalone/worker-registry.js +167 -0
  82. package/dist/templates/_daemon/go.mod +2 -0
  83. package/dist/templates/_gateway/auth.go +101 -0
  84. package/dist/templates/_gateway/auth_test.go +216 -0
  85. package/dist/templates/_gateway/cgi.go +133 -0
  86. package/dist/templates/_gateway/cgi_test.go +156 -0
  87. package/dist/templates/_gateway/csrf.go +73 -0
  88. package/dist/templates/_gateway/csrf_test.go +155 -0
  89. package/dist/templates/_gateway/directory.go +108 -0
  90. package/dist/templates/_gateway/directory_test.go +202 -0
  91. package/dist/templates/_gateway/gateway.go +412 -0
  92. package/dist/templates/_gateway/gateway_test.go +676 -0
  93. package/dist/templates/_gateway/go.mod +3 -0
  94. package/dist/templates/_gateway/groups.go +66 -0
  95. package/dist/templates/_gateway/main.go +45 -0
  96. package/dist/templates/binary/synology-app.yaml +1 -1
  97. package/dist/templates/compose-import/compose.yaml +1 -1
  98. package/dist/templates/compose-import/synology-app.yaml +1 -1
  99. package/dist/templates/hello-files/compose.yaml +1 -1
  100. package/dist/templates/hello-files/synology-app.yaml +1 -1
  101. package/dist/templates/hello-web/compose.yaml +5 -2
  102. package/dist/templates/hello-web/synology-app.yaml +4 -1
  103. package/dist/templates/hello-web-page/compose.yaml +5 -2
  104. package/dist/templates/hello-web-page/synology-app.yaml +4 -1
  105. package/dist/templates/native-go/README.md +93 -4
  106. package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
  107. package/dist/templates/native-go/backend/cmd/app/main.go +17 -0
  108. package/dist/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
  109. package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  110. package/dist/templates/native-go/backend/cmd/helper/main.go +10 -1
  111. package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  112. package/dist/templates/native-go/backend/go.mod +5 -3
  113. package/dist/templates/native-go/backend/go.sum +4 -4
  114. package/dist/templates/native-go/backend/internal/api/registry.go +17 -6
  115. package/dist/templates/native-go/backend/internal/api/server.go +7 -1
  116. package/dist/templates/native-go/backend/internal/app/background.go +270 -0
  117. package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
  118. package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
  119. package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  120. package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  121. package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  122. package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
  123. package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
  124. package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
  125. package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  126. package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
  127. package/dist/templates/native-go/backend/internal/app/routes.go +17 -3
  128. package/dist/templates/native-go/backend/internal/app/routes_test.go +20 -3
  129. package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  130. package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  131. package/dist/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
  132. package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
  133. package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  134. package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  135. package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  136. package/dist/templates/native-go/backend/internal/background/access.go +57 -0
  137. package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
  138. package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
  139. package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
  140. package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
  141. package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  142. package/dist/templates/native-go/backend/internal/background/store.go +807 -0
  143. package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
  144. package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  145. package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  146. package/dist/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  147. package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
  148. package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  149. package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
  150. package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  151. package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
  152. package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  153. package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  154. package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  155. package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
  156. package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  157. package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  158. package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
  159. package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  160. package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  161. package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  162. package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  163. package/dist/templates/native-go/backend/internal/helper/data_contract.go +3 -0
  164. package/dist/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
  165. package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
  166. package/dist/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
  167. package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
  168. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
  169. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
  170. package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
  171. package/dist/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  172. package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  173. package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  174. package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  175. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  176. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  177. package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  178. package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  179. package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  180. package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  181. package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  182. package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  183. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  184. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  185. package/dist/templates/native-go/backend/internal/helper/management.go +79 -0
  186. package/dist/templates/native-go/backend/internal/helper/observation.go +42 -2
  187. package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
  188. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
  189. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
  190. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  191. package/dist/templates/native-go/backend/internal/helper/process_linux.go +3 -0
  192. package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  193. package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  194. package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
  195. package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
  196. package/dist/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  197. package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  198. package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  199. package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  200. package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  201. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  202. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  203. package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  204. package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  205. package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  206. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  207. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  208. package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  209. package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  210. package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  211. package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  212. package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  213. package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  214. package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  215. package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  216. package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  217. package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  218. package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  219. package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  220. package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  221. package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  222. package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  223. package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  224. package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  225. package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  226. package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  227. package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  228. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  229. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  230. package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  231. package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  232. package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  233. package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  234. package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  235. package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  236. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  237. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  238. package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
  239. package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  240. package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  241. package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  242. package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  243. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  244. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  245. package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  246. package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  247. package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  248. package/dist/templates/native-go/backend/internal/helper/server_linux.go +3 -0
  249. package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  250. package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  251. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  252. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  253. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  254. package/dist/templates/native-go/backend/internal/helper/status.go +22 -13
  255. package/dist/templates/native-go/backend/internal/helper/status_test.go +45 -0
  256. package/dist/templates/native-go/backend/internal/helper/supervision.go +1 -1
  257. package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
  258. package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
  259. package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
  260. package/dist/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
  261. package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
  262. package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
  263. package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
  264. package/dist/templates/native-go/dsm-package.yaml +1 -1
  265. package/dist/templates/native-go-background/BACKGROUND.md +111 -0
  266. package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  267. package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  268. package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  269. package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  270. package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  271. package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  272. package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  273. package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  274. package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  275. package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  276. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  277. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  278. package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  279. package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  280. package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
  281. package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  282. package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  283. package/dist/templates/native-go-vue/README.md +38 -7
  284. package/dist/templates/native-go-vue/frontend/DESIGN.md +15 -3
  285. package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  286. package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
  287. package/dist/templates/native-go-vue/frontend/package-lock.json +5 -4
  288. package/dist/templates/native-go-vue/frontend/package.json +1 -1
  289. package/dist/templates/native-go-vue/frontend/src/App.vue +39 -11
  290. package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  291. package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  292. package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  293. package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  294. package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  295. package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  296. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  297. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  298. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  299. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  300. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  301. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  302. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  303. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  304. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  305. package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  306. package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  307. package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  308. package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  309. package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  310. package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  311. package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  312. package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  313. package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  314. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  315. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  316. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  317. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  318. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  319. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  320. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  321. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  322. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  323. package/dist/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  324. package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  325. package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  326. package/dist/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  327. package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  328. package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  329. package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  330. package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  331. package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  332. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  333. package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  334. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  335. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  336. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  337. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  338. package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  339. package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  340. package/dist/templates/native-go-vue/frontend/src/style.css +2 -6
  341. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
  342. package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  343. package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  344. package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  345. package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  346. package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  347. package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  348. package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  349. package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  350. package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  351. package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  352. package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  353. package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  354. package/dist/templates/native-go-vue/frontend/vite.config.ts +2 -2
  355. package/dist/validate.js +6 -3
  356. package/package.json +1 -1
  357. package/schema/synology-app.schema.json +19 -0
  358. package/skills/reference/create.md +4 -0
  359. package/templates/_daemon/go.mod +2 -0
  360. package/templates/_gateway/auth.go +101 -0
  361. package/templates/_gateway/auth_test.go +216 -0
  362. package/templates/_gateway/cgi.go +133 -0
  363. package/templates/_gateway/cgi_test.go +156 -0
  364. package/templates/_gateway/csrf.go +73 -0
  365. package/templates/_gateway/csrf_test.go +155 -0
  366. package/templates/_gateway/directory.go +108 -0
  367. package/templates/_gateway/directory_test.go +202 -0
  368. package/templates/_gateway/gateway.go +412 -0
  369. package/templates/_gateway/gateway_test.go +676 -0
  370. package/templates/_gateway/go.mod +3 -0
  371. package/templates/_gateway/groups.go +66 -0
  372. package/templates/_gateway/main.go +45 -0
  373. package/templates/binary/synology-app.yaml +1 -1
  374. package/templates/compose-import/compose.yaml +1 -1
  375. package/templates/compose-import/synology-app.yaml +1 -1
  376. package/templates/hello-files/compose.yaml +1 -1
  377. package/templates/hello-files/synology-app.yaml +1 -1
  378. package/templates/hello-web/compose.yaml +5 -2
  379. package/templates/hello-web/synology-app.yaml +4 -1
  380. package/templates/hello-web-page/compose.yaml +5 -2
  381. package/templates/hello-web-page/synology-app.yaml +4 -1
  382. package/templates/native-go/README.md +93 -4
  383. package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +3 -1
  384. package/templates/native-go/backend/cmd/app/main.go +17 -0
  385. package/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
  386. package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  387. package/templates/native-go/backend/cmd/helper/main.go +10 -1
  388. package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  389. package/templates/native-go/backend/go.mod +5 -3
  390. package/templates/native-go/backend/go.sum +4 -4
  391. package/templates/native-go/backend/internal/api/registry.go +17 -6
  392. package/templates/native-go/backend/internal/api/server.go +7 -1
  393. package/templates/native-go/backend/internal/app/background.go +270 -0
  394. package/templates/native-go/backend/internal/app/background_none.go +8 -0
  395. package/templates/native-go/backend/internal/app/background_owner.go +59 -0
  396. package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  397. package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  398. package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  399. package/templates/native-go/backend/internal/app/background_test.go +346 -0
  400. package/templates/native-go/backend/internal/app/integration_state.go +16 -0
  401. package/templates/native-go/backend/internal/app/migrations.go +41 -0
  402. package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  403. package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +8 -0
  404. package/templates/native-go/backend/internal/app/routes.go +17 -3
  405. package/templates/native-go/backend/internal/app/routes_test.go +20 -3
  406. package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  407. package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  408. package/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
  409. package/templates/native-go/backend/internal/app/session_files.go +15 -0
  410. package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  411. package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  412. package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  413. package/templates/native-go/backend/internal/background/access.go +57 -0
  414. package/templates/native-go/backend/internal/background/owner_test.go +126 -0
  415. package/templates/native-go/backend/internal/background/runner.go +185 -0
  416. package/templates/native-go/backend/internal/background/runner_test.go +209 -0
  417. package/templates/native-go/backend/internal/background/schedule.go +300 -0
  418. package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  419. package/templates/native-go/backend/internal/background/store.go +807 -0
  420. package/templates/native-go/backend/internal/background/store_test.go +407 -0
  421. package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  422. package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  423. package/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  424. package/templates/native-go/backend/internal/filestation/client.go +251 -0
  425. package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  426. package/templates/native-go/backend/internal/filestation/doc.go +4 -0
  427. package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  428. package/templates/native-go/backend/internal/filestation/repository.go +207 -0
  429. package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  430. package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  431. package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  432. package/templates/native-go/backend/internal/filestation/service.go +254 -0
  433. package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  434. package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  435. package/templates/native-go/backend/internal/filestation/write.go +72 -0
  436. package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  437. package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  438. package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  439. package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  440. package/templates/native-go/backend/internal/helper/data_contract.go +3 -0
  441. package/templates/native-go/backend/internal/helper/data_protocol.go +3 -0
  442. package/templates/native-go/backend/internal/helper/data_protocol_test.go +1 -1
  443. package/templates/native-go/backend/internal/helper/grant_authority.go +3 -0
  444. package/templates/native-go/backend/internal/helper/grant_authority_test.go +1 -1
  445. package/templates/native-go/backend/internal/helper/grant_repository_linux.go +2 -1
  446. package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +4 -3
  447. package/templates/native-go/backend/internal/helper/grant_snapshot.go +3 -0
  448. package/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  449. package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  450. package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  451. package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  452. package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  453. package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  454. package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  455. package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  456. package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  457. package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  458. package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  459. package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  460. package/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  461. package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  462. package/templates/native-go/backend/internal/helper/management.go +79 -0
  463. package/templates/native-go/backend/internal/helper/observation.go +42 -2
  464. package/templates/native-go/backend/internal/helper/observation_health_test.go +13 -1
  465. package/templates/native-go/backend/internal/helper/observer_diagnostic.go +56 -10
  466. package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +6 -0
  467. package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  468. package/templates/native-go/backend/internal/helper/process_linux.go +3 -0
  469. package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  470. package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  471. package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +3 -0
  472. package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +23 -4
  473. package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  474. package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  475. package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  476. package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  477. package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  478. package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  479. package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  480. package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  481. package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  482. package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  483. package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  484. package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  485. package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  486. package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  487. package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  488. package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  489. package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  490. package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  491. package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  492. package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  493. package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  494. package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  495. package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  496. package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  497. package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  498. package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  499. package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  500. package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  501. package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  502. package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  503. package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  504. package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  505. package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  506. package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  507. package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  508. package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  509. package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  510. package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  511. package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  512. package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  513. package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  514. package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  515. package/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
  516. package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  517. package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  518. package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  519. package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  520. package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  521. package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  522. package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  523. package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  524. package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  525. package/templates/native-go/backend/internal/helper/server_linux.go +3 -0
  526. package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  527. package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  528. package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  529. package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  530. package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  531. package/templates/native-go/backend/internal/helper/status.go +22 -13
  532. package/templates/native-go/backend/internal/helper/status_test.go +45 -0
  533. package/templates/native-go/backend/internal/helper/supervision.go +1 -1
  534. package/templates/native-go/backend/internal/helper/supervisor_frame.go +3 -0
  535. package/templates/native-go/backend/internal/helper/supervisor_linux.go +6 -2
  536. package/templates/native-go/backend/internal/helper/unit_connection_test.go +22 -4
  537. package/templates/native-go/backend/internal/helper/unit_linux.go +7 -3
  538. package/templates/native-go/backend/internal/helper/unit_query_linux.go +5 -1
  539. package/templates/native-go/backend/internal/helper/write_files_linux.go +7 -4
  540. package/templates/native-go/backend/internal/helper/write_files_linux_test.go +26 -0
  541. package/templates/native-go/dsm-package.yaml +1 -1
  542. package/templates/native-go-background/BACKGROUND.md +111 -0
  543. package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  544. package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  545. package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  546. package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  547. package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  548. package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  549. package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  550. package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  551. package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  552. package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  553. package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  554. package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  555. package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  556. package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  557. package/templates/native-go-background/frontend/test/background.test.ts +179 -0
  558. package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  559. package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  560. package/templates/native-go-vue/README.md +38 -7
  561. package/templates/native-go-vue/frontend/DESIGN.md +15 -3
  562. package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  563. package/templates/native-go-vue/frontend/README-M2.md +64 -0
  564. package/templates/native-go-vue/frontend/package-lock.json +5 -4
  565. package/templates/native-go-vue/frontend/package.json +1 -1
  566. package/templates/native-go-vue/frontend/src/App.vue +39 -11
  567. package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  568. package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  569. package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  570. package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  571. package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  572. package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  573. package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  574. package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  575. package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  576. package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  577. package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  578. package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  579. package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  580. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  581. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  582. package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  583. package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  584. package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  585. package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  586. package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  587. package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  588. package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  589. package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  590. package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  591. package/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  592. package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  593. package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  594. package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  595. package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  596. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  597. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  598. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  599. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  600. package/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  601. package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  602. package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  603. package/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  604. package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  605. package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  606. package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  607. package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  608. package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  609. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  610. package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  611. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  612. package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  613. package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  614. package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  615. package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  616. package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  617. package/templates/native-go-vue/frontend/src/style.css +2 -6
  618. package/templates/native-go-vue/frontend/test/apps.test.ts +21 -0
  619. package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  620. package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  621. package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  622. package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  623. package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  624. package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  625. package/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  626. package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  627. package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  628. package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  629. package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  630. package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  631. package/templates/native-go-vue/frontend/vite.config.ts +2 -2
@@ -0,0 +1,66 @@
1
+ package main
2
+
3
+ import (
4
+ "bufio"
5
+ "context"
6
+ "fmt"
7
+ "os"
8
+ "slices"
9
+ "strings"
10
+ )
11
+
12
+ // groupsOf reads local group files fresh on each request. Directory accounts
13
+ // use NSS afresh; DSM provider caching may delay directory membership changes.
14
+ // DSM keeps no member list for the group
15
+ // that is an account's primary group (users), so membership is the member
16
+ // list or the primary gid from the passwd file. Accounts absent from passwd use
17
+ // DSM NSS; no local member-list fallback is permitted on lookup failure.
18
+ func (a *dsmAuthenticator) groupsOf(ctx context.Context, user string) ([]string, error) {
19
+ primary, err := a.primaryGID(user)
20
+ if err != nil {
21
+ return nil, err
22
+ }
23
+ if primary == "" {
24
+ if a.directoryGroups == nil {
25
+ return nil, fmt.Errorf("directory group lookup unavailable")
26
+ }
27
+ return a.directoryGroups(ctx, user)
28
+ }
29
+ f, err := os.Open(a.groupFile)
30
+ if err != nil {
31
+ return nil, fmt.Errorf("read groups: %w", err)
32
+ }
33
+ defer f.Close()
34
+ var groups []string
35
+ scanner := bufio.NewScanner(f)
36
+ for scanner.Scan() {
37
+ fields := strings.Split(scanner.Text(), ":")
38
+ if len(fields) == 4 && (fields[2] == primary || slices.Contains(strings.Split(fields[3], ","), user)) {
39
+ groups = append(groups, fields[0])
40
+ }
41
+ }
42
+ if err := scanner.Err(); err != nil {
43
+ return nil, fmt.Errorf("read groups: %w", err)
44
+ }
45
+ return groups, nil
46
+ }
47
+
48
+ // primaryGID is the account's gid in the passwd file; "" when the account has
49
+ // no local entry, which requires a fresh directory lookup.
50
+ func (a *dsmAuthenticator) primaryGID(user string) (string, error) {
51
+ f, err := os.Open(a.passwdFile)
52
+ if err != nil {
53
+ return "", fmt.Errorf("read accounts: %w", err)
54
+ }
55
+ defer f.Close()
56
+ scanner := bufio.NewScanner(f)
57
+ for scanner.Scan() {
58
+ if fields := strings.Split(scanner.Text(), ":"); len(fields) >= 4 && fields[0] == user {
59
+ return fields[3], nil
60
+ }
61
+ }
62
+ if err := scanner.Err(); err != nil {
63
+ return "", fmt.Errorf("read accounts: %w", err)
64
+ }
65
+ return "", nil
66
+ }
@@ -0,0 +1,45 @@
1
+ // Command gateway is the DSM-authenticated front door of a container package.
2
+ // DSM runs it as a CGI (ui/cgi/gateway.cgi in the package) under the package
3
+ // account, once per request.
4
+ package main
5
+
6
+ import (
7
+ "bytes"
8
+ "encoding/json"
9
+ "fmt"
10
+ "log"
11
+ "net/http/cgi"
12
+ "os"
13
+ )
14
+
15
+ // Set by `synopkgland build-spk` through -ldflags -X; never read from a request.
16
+ var (
17
+ packageID = "dev"
18
+ configJSON = ""
19
+ )
20
+
21
+ func main() {
22
+ log.SetFlags(0)
23
+ log.SetPrefix(packageID + ": ")
24
+ if os.Getenv("GATEWAY_INTERFACE") == "" {
25
+ fmt.Fprintf(os.Stderr, "%s: this program runs as the package's DSM CGI; open the app from the DSM main menu.\n", packageID)
26
+ os.Exit(2)
27
+ }
28
+ var cfg config
29
+ decoder := json.NewDecoder(bytes.NewReader([]byte(configJSON)))
30
+ decoder.DisallowUnknownFields()
31
+ if err := decoder.Decode(&cfg); err != nil {
32
+ log.Fatalf("invalid gateway configuration: %v", err)
33
+ }
34
+ g, err := newGateway(cfg, newDSMAuthenticator())
35
+ if err != nil {
36
+ log.Fatal(err)
37
+ }
38
+ req, err := cgi.Request()
39
+ if err != nil {
40
+ log.Fatal(err)
41
+ }
42
+ if err := serveCGI(g, req, os.Stdin, os.Stdout); err != nil {
43
+ log.Fatal(err)
44
+ }
45
+ }
@@ -4,4 +4,4 @@ version: 0.1.0
4
4
  displayname: Binary App
5
5
  description: A minimal Syno Package Land app that runs one prebuilt binary.
6
6
  maintainer: Syno Package Land
7
- os_min_ver: "7.2-60000"
7
+ os_min_ver: "7.1-42661"
@@ -1,6 +1,6 @@
1
1
  services:
2
2
  app:
3
- image: hello-world:latest
3
+ image: hello-world:latest@sha256:5e23090353324d887c48ad5e5c56d294eab81588df9605b07d1afe895f9cc8f8
4
4
  volumes:
5
5
  - "${MEDIA_SHARE}:/media"
6
6
  - "${BACKUP_SHARE}:/backup"
@@ -4,7 +4,7 @@ version: 0.1.0
4
4
  displayname: Compose Import
5
5
  description: Start from an existing Compose file and select two Shared Folders at install time.
6
6
  maintainer: Syno Package Land
7
- os_min_ver: "7.2-69057"
7
+ os_min_ver: "7.2.1-69057"
8
8
 
9
9
  install:
10
10
  MEDIA_SHARE:
@@ -1,6 +1,6 @@
1
1
  services:
2
2
  worker:
3
- image: alpine:3.20
3
+ image: alpine:3.20@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc
4
4
  command: ["sleep", "infinity"]
5
5
  volumes:
6
6
  # intentionally outside the zero-config docker-project resource-worker path.
@@ -4,7 +4,7 @@ version: 0.1.0
4
4
  displayname: Hello Files
5
5
  description: A minimal headless app with a Shared Folder mount.
6
6
  maintainer: Syno Package Land
7
- os_min_ver: "7.2-69057"
7
+ os_min_ver: "7.2.1-69057"
8
8
 
9
9
  install:
10
10
  MEDIA_SHARE:
@@ -1,6 +1,6 @@
1
1
  services:
2
2
  web:
3
- image: busybox:1.36
3
+ image: busybox:1.36@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662
4
4
  # DSM worker constraints to preserve when changing this service:
5
5
  # 1) command/entrypoint arrays must not contain bare numeric elements
6
6
  # (such as "18333"). DSM's docker-project worker drops the quotes on a
@@ -15,7 +15,10 @@ services:
15
15
  # injects an arbitrary package UID/GID, and the nginx entrypoint needs
16
16
  # root during startup, so it exits immediately under that identity.
17
17
  command: ["sh","-c","httpd -f -p 18333 -h /usr/share/nginx/html"]
18
+ # Bound to loopback on purpose: the DSM-authenticated gateway generated by
19
+ # `synopkgland build-spk` is the only way in. A port on every interface would
20
+ # bypass DSM sign-in, and `synopkgland validate` rejects it.
18
21
  ports:
19
- - "18333:18333"
22
+ - "127.0.0.1:18333:18333"
20
23
  volumes:
21
24
  - "./html:/usr/share/nginx/html:ro"
@@ -4,10 +4,13 @@ version: 0.1.0
4
4
  displayname: Hello Web
5
5
  description: A minimal Syno Package Land web app template.
6
6
  maintainer: Syno Package Land
7
- os_min_ver: "7.2-69057"
7
+ os_min_ver: "7.2.1-69057"
8
8
  adminprotocol: http
9
9
  adminport: 18333
10
10
  adminurl: /
11
11
  integration:
12
12
  web:
13
13
  launch: dsm-window
14
+ # Who may open the app: dsm-users (any signed-in DSM user), dsm-admins,
15
+ # dsm-groups (with groups: [...]) or public (no DSM sign-in).
16
+ access: dsm-users
@@ -1,6 +1,6 @@
1
1
  services:
2
2
  web:
3
- image: busybox:1.36
3
+ image: busybox:1.36@sha256:73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662
4
4
  # DSM worker constraints to preserve when changing this service:
5
5
  # 1) command/entrypoint arrays must not contain bare numeric elements
6
6
  # (such as "18333"). DSM's docker-project worker drops the quotes on a
@@ -15,7 +15,10 @@ services:
15
15
  # injects an arbitrary package UID/GID, and the nginx entrypoint needs
16
16
  # root during startup, so it exits immediately under that identity.
17
17
  command: ["sh","-c","httpd -f -p 18333 -h /usr/share/nginx/html"]
18
+ # Bound to loopback on purpose: the DSM-authenticated gateway generated by
19
+ # `synopkgland build-spk` is the only way in. A port on every interface would
20
+ # bypass DSM sign-in, and `synopkgland validate` rejects it.
18
21
  ports:
19
- - "18333:18333"
22
+ - "127.0.0.1:18333:18333"
20
23
  volumes:
21
24
  - "./html:/usr/share/nginx/html:ro"
@@ -4,10 +4,13 @@ version: 0.1.0
4
4
  displayname: Hello Web Page
5
5
  description: A Syno Package Land web app template that opens in a new browser page.
6
6
  maintainer: Syno Package Land
7
- os_min_ver: "7.2-69057"
7
+ os_min_ver: "7.2.1-69057"
8
8
  adminprotocol: http
9
9
  adminport: 18333
10
10
  adminurl: /
11
11
  integration:
12
12
  web:
13
13
  launch: new-page
14
+ # Who may open the app: dsm-users (any signed-in DSM user), dsm-admins,
15
+ # dsm-groups (with groups: [...]) or public (no DSM sign-in).
16
+ access: dsm-users
@@ -171,7 +171,17 @@ not location completion or ACL success. Use canonical virtual share paths only;
171
171
  OS `/volumeN/...`, traversal, repeated/trailing slash, controls and backslash are
172
172
  invalid. No path conversion or grant is performed. `openFile`, `showFileDetails`
173
173
  and `openAppSetting` return unsupported; private preview/details/settings flows
174
- have no proven generic contract. DSM runtime remains unknown.
174
+ have no proven generic contract.
175
+
176
+ File reveal adds a best-effort correction using File Station 1.4.x private
177
+ structures. Required APIs are feature-detected; absent/throwing APIs silently
178
+ cancel and release timers/listeners. One AppLaunch callback binds one receiver;
179
+ only its model may be selected once. Interaction, navigation away from the reached
180
+ parent, close/destroy, disposal and new requests cancel the correction. The named
181
+ 5000 ms total budget, 100 ms checks and 300 ms quiet interval have no device latency
182
+ proof. `requested` still does not mean `selected`; actual effectiveness on DSM 7.4 /
183
+ File Station 1.4.4 awaits a rebuilt-SPK device matrix. No second launch or broadcast
184
+ setter is used, and later reloads may still clear selection.
175
185
 
176
186
  For an independent browser shell, use the SPK's generated `ui/host-0001.js`
177
187
  (the number follows the manifest build). It has no Ext or npm runtime dependency:
@@ -206,7 +216,7 @@ ui:
206
216
  ```
207
217
 
208
218
  The build must emit `app.js` (one script that registers `mount`) and
209
- `app.css`. The public `@synopackageland/ui@0.4.0` package on
219
+ `app.css`. The public `@synopackageland/ui@0.5.7` package on
210
220
  `https://registry.npmjs.org` gives Vue components with DSM 7 styling;
211
221
  import its `themes/dsm7-embedded.css` for use inside a DSM window.
212
222
 
@@ -269,6 +279,51 @@ own folder, kept across upgrades). Bump `build` for every SPK you hand out;
269
279
  bump `version` for feature releases. There are no lifecycle scripts to write:
270
280
  the CGI starts per request, so start/stop do nothing.
271
281
 
282
+ ### What an upgrade keeps
283
+
284
+ An upgrade replaces the program files and keeps the data. DSM preserves `var`
285
+ (`@appdata`), `home` (`@apphome`) and `etc` (`@appconf`) across an upgrade and
286
+ removes `tmp` (`@apptemp`) and `target` (`@appstore`). Keep everything you need
287
+ to keep under `var`, `home` or `etc`.
288
+
289
+ ### Schema migrations
290
+
291
+ `backend/internal/datamigrate` applies ordered, idempotent schema migrations and
292
+ records the result in `<var>/data-version`. `backend/cmd/app` runs `app.Migrate`
293
+ on every start; the recorded version makes that a cheap no-op.
294
+
295
+ - Versions start at 1 and never change meaning. The template ships one empty
296
+ example in `backend/internal/app/migrations.go`; replace it with your steps.
297
+ - Every step must be idempotent: a crash between `Apply` and the version record,
298
+ or two CGI requests racing on the first start after an upgrade, can run one step
299
+ twice.
300
+ - A step that fails stops the run with the previous version still recorded, and
301
+ the next start resumes from there. The helper never deletes or rewrites data
302
+ itself, so a failed migration leaves your old data in place.
303
+ - `datamigrate.Context.OldPkgVer` is the version being upgraded from:
304
+ `SYNOPKG_OLD_PKGVER` when your environment sets it, otherwise the version the last
305
+ successful run recorded. `NewPkgVer` is the version running now.
306
+
307
+ Uninstalling keeps your data: DSM leaves `@appdata` and `@apphome` on the volume,
308
+ and reinstalling the same package ID picks them up again. The install wizard is a
309
+ dynamic `WIZARD_UIFILES/install_uifile.sh` that checks — read-only — whether
310
+ `@appdata/<package>` already exists and, if it does, tells the administrator the
311
+ install reuses the old data and how to start clean.
312
+
313
+ The generated SPK ships
314
+ an uninstall wizard (English, plus eight other languages) with one box, **Also
315
+ delete the app data listed above** (`pkgwizard_remove_additional`), unchecked by
316
+ default. Ticked, `postuninst` empties `@appdata/<package>` and `@apphome/<package>`
317
+ and nothing else: not `@appconf`, Shared Folders, the package account or other
318
+ packages. An upgrade never deletes anything. Do not write your own `postuninst`;
319
+ `synopkgland inspect --spk` flags a deleting script that lacks the upgrade guard
320
+ or deletes outside the package's own folders.
321
+
322
+ A package with a root integration (the helper) also warns in its uninstall
323
+ wizard: disable the integration in the App first. While it stays enabled,
324
+ `preuninst` refuses the uninstall and writes the reason to
325
+ `SYNOPKG_TEMP_LOGFILE`, which Package Center shows.
326
+
272
327
  ## Root access
273
328
 
274
329
  By default (`privilege: none`) nothing in this package ever runs as root, and
@@ -295,7 +350,8 @@ How it works, with no keys or signing involved:
295
350
  DSM language. A DSM administrator clicks **Authorize** and confirms with
296
351
  their DSM password in DSM's own dialog. DSM then creates one **disabled**
297
352
  root task in Task Scheduler, named `<package> root: <name>`. The
298
- confirmation is used for that one task and never stored.
353
+ DSM 7.2+ uses its one-use password token for that task and never stores it.
354
+ DSM 7.1 uses the client-side confirmation described below.
299
355
  3. **Run** checks that the task is still exactly the approved text, runs it
300
356
  with the administrator's session and shows its result. The task writes
301
357
  only to `/run/synopkgland-<package>/<name>.out`, which root owns and your
@@ -308,6 +364,39 @@ How it works, with no keys or signing involved:
308
364
  password. Remove it before uninstalling the package, because DSM keeps
309
365
  Task Scheduler tasks after an uninstall.
310
366
 
367
+ Root templates keep a minimum of **DSM 7.1-42661**. Init, validation and build
368
+ reject a root-package minimum below that version. DSM 7.0 has not been verified.
369
+ The window probes TaskScheduler `list v3` once per access instance; only DSM
370
+ error 103 selects the legacy API matrix. Permission, session and network errors
371
+ do not trigger a fallback, and create/run requests are never automatically
372
+ resent with another API version.
373
+
374
+ | Operation | DSM 7.1 | DSM 7.2+ |
375
+ | --- | --- | --- |
376
+ | List / detail | `list v2` (offset/limit) / `get v3` | `list v3` (start/limit) / `get v4` |
377
+ | Create | `TaskScheduler.create v3` | `TaskScheduler.Root.create v4` + `SynoConfirmPWToken` |
378
+ | Run / delete | `run v2` / `delete v2` | `run v2` / `delete v2` |
379
+ | Completion | `view v1` | `get_history_status_list v1` |
380
+
381
+ **DSM 7.1 security difference:** DSM's PasswordConfirmDialog is still required
382
+ in the window, but root-task creation has **no server-side password token**.
383
+ Any authenticated administrator session can call `create v3` to create root
384
+ tasks without this client dialog. The client confirmation records the user's
385
+ intent; it does not provide the server-enforced fresh password proof of the
386
+ 7.2+ Root API. Both paths verify task name, root owner/real owner, disabled
387
+ script type and the exact approved action text before run or removal.
388
+
389
+ The legacy path saves the existing history before run and requires one new,
390
+ completed record with a valid `stop_time`, integer `exit_code: 0` and
391
+ `exit_type: normal`. It checks task identity again before returning output.
392
+ An accepted run request or old output never proves completion. Calls and polls
393
+ share a 30-second deadline (at most 60 polls, 500 ms apart); a timeout does not
394
+ cancel a task that DSM already started. Concurrent calls in one window share
395
+ one run. Existing running tasks, malformed or ambiguous history, and incomplete
396
+ scheduler lists are refused. List/history snapshots are limited to 500 entries.
397
+ Second-resolution history cannot identify same-second reruns reliably; those
398
+ runs may time out rather than reuse an old success record.
399
+
311
400
  Non-administrators see DSM's "Only administrator accounts can perform this
312
401
  operation." and nothing else. HTTP requests can never choose what runs as
313
402
  root: the only root code is the fixed text an administrator approved. Your app
@@ -320,5 +409,5 @@ drive the same flow from its own UI.
320
409
  | --- | --- |
321
410
  | Build hosts | macOS, Linux (any OS with Go and Node) |
322
411
  | Target CPUs | x86_64 and aarch64 DSM models (one SPK each) |
323
- | DSM | 7.2 or later declared (`os_min_ver`). Installed and tested on DSM 7.4 (x86_64). aarch64 SPKs are built the same way but have not been run on a NAS. |
412
+ | DSM | 7.1 or later declared (`os_min_ver`, change it with `init --min-dsm` or `build-spk --min-dsm`). Installed and tested on DSM 7.4 (x86_64). aarch64 SPKs are built the same way but have not been run on a NAS. |
324
413
  | Not supported | 32-bit ARM, DSM 6, running anything as root without an administrator's approval |
@@ -1,6 +1,8 @@
1
1
  DSM integration helper build dependencies
2
2
 
3
- github.com/godbus/dbus/v5 v5.2.2 (BSD-2-Clause)
3
+ github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82 (BSD-2-Clause)
4
+ Pinned upstream commit: 0ea052abeb820894f944095b3c2dc125cef0df85
5
+ Fix panic in DecodeMessageWithFDs on read error (not yet in a tagged release).
4
6
 
5
7
  Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google
6
8
  All rights reserved.
@@ -1,5 +1,9 @@
1
+ //go:build !synopkgland_sdk_workers
2
+
1
3
  // Command app is the package backend. DSM runs it as a CGI (ui/cgi/api.cgi in
2
4
  // the package) under the package account, once per request.
5
+ //
6
+ //line dsmapp/cmd/app/main.go:1
3
7
  package main
4
8
 
5
9
  import (
@@ -12,6 +16,7 @@ import (
12
16
  "dsmapp/internal/api"
13
17
  "dsmapp/internal/app"
14
18
  "dsmapp/internal/dsm"
19
+ "dsmapp/internal/filestation"
15
20
  "dsmapp/internal/helper"
16
21
  )
17
22
 
@@ -20,6 +25,10 @@ var (
20
25
  packageID = "dev"
21
26
  version = "0.0.0"
22
27
  helperInventory = ""
28
+ // "package" when the project has an integration but no privileged helper.
29
+ integrationMode = ""
30
+ // "session" when the project opted into the interactive File Station adapter.
31
+ fileStation = ""
23
32
  )
24
33
 
25
34
  func main() {
@@ -33,12 +42,20 @@ func main() {
33
42
  PackageID: packageID,
34
43
  Version: version,
35
44
  DataDir: "/var/packages/" + packageID + "/var",
45
+
46
+ PackageIntegration: integrationMode == "package",
36
47
  }
37
48
  if helperInventory != "" {
38
49
  if json.Unmarshal([]byte(helperInventory), &cfg.HelperInventory) != nil || cfg.HelperInventory.Package != packageID || cfg.HelperInventory.Version != version {
39
50
  cfg.HelperInventory = helper.Inventory{Package: packageID}
40
51
  }
41
52
  }
53
+ if err := app.Migrate(cfg); err != nil {
54
+ log.Fatalf("schema migration failed: %v", err)
55
+ }
56
+ if app.SessionFilesEnabled(cfg.HelperInventory, fileStation) {
57
+ cfg.SessionFiles = filestation.Local(cfg.DataDir)
58
+ }
42
59
  srv, err := api.NewServer(dsm.NewAuthenticator(), app.Routes(cfg)...)
43
60
  if err != nil {
44
61
  log.Fatal(err)
@@ -0,0 +1,60 @@
1
+ //go:build synopkgland_sdk_workers
2
+
3
+ // Command app is the package backend. DSM runs it as a CGI (ui/cgi/api.cgi in
4
+ // the package) under the package account, once per request.
5
+ package main
6
+
7
+ import (
8
+ "encoding/json"
9
+ "fmt"
10
+ "log"
11
+ "net/http/cgi"
12
+ "os"
13
+
14
+ "dsmapp/internal/api"
15
+ "dsmapp/internal/app"
16
+ "dsmapp/internal/dsm"
17
+ "dsmapp/internal/filestation"
18
+ "dsmapp/internal/helper"
19
+ )
20
+
21
+ // Set by `synopkgland build-spk` through -ldflags -X; never read from a request.
22
+ var (
23
+ packageID = "dev"
24
+ version = "0.0.0"
25
+ helperInventory = ""
26
+ // "session" when the project opted into the interactive File Station adapter.
27
+ fileStation = ""
28
+ )
29
+
30
+ func main() {
31
+ log.SetFlags(0)
32
+ log.SetPrefix(packageID + ": ")
33
+ if os.Getenv("GATEWAY_INTERFACE") == "" {
34
+ fmt.Fprintf(os.Stderr, "%s %s: this program runs as the package's DSM CGI; open the app from the DSM main menu.\n", packageID, version)
35
+ os.Exit(2)
36
+ }
37
+ cfg := app.Config{
38
+ PackageID: packageID,
39
+ Version: version,
40
+ DataDir: "/var/packages/" + packageID + "/var",
41
+ }
42
+ if helperInventory != "" {
43
+ if json.Unmarshal([]byte(helperInventory), &cfg.HelperInventory) != nil || cfg.HelperInventory.Package != packageID || cfg.HelperInventory.Version != version {
44
+ cfg.HelperInventory = helper.Inventory{Package: packageID}
45
+ }
46
+ }
47
+ if err := app.Migrate(cfg); err != nil {
48
+ log.Fatalf("schema migration failed: %v", err)
49
+ }
50
+ if app.SessionFilesEnabled(cfg.HelperInventory, fileStation) {
51
+ cfg.SessionFiles = filestation.Local(cfg.DataDir)
52
+ }
53
+ srv, err := api.NewServer(dsm.NewAuthenticator(), app.Routes(cfg)...)
54
+ if err != nil {
55
+ log.Fatal(err)
56
+ }
57
+ if err := cgi.Serve(app.SDKHandler(srv)); err != nil {
58
+ log.Fatal(err)
59
+ }
60
+ }
@@ -0,0 +1,38 @@
1
+ // Command background-worker is the package's fixed background worker. DSM runs
2
+ // it as the package's systemd user unit under the package account; it never
3
+ // runs as root and takes no input except the jobs in its private spool.
4
+ package main
5
+
6
+ import (
7
+ "context"
8
+ "log"
9
+ "os"
10
+ "os/signal"
11
+ "os/user"
12
+ "strconv"
13
+ "syscall"
14
+
15
+ "dsmapp/internal/background"
16
+ )
17
+
18
+ // Set by `synopkgland build-spk` through -ldflags -X.
19
+ var packageID = "dev"
20
+
21
+ func main() {
22
+ log.SetFlags(0)
23
+ log.SetPrefix(packageID + " background: ")
24
+ if err := background.RefuseRoot(os.Geteuid()); err != nil {
25
+ log.Fatal(err)
26
+ }
27
+ name := ""
28
+ if u, err := user.Current(); err == nil {
29
+ name = u.Username
30
+ }
31
+ info := background.WorkerInfo{PID: os.Getpid(), UID: os.Getuid(), Username: name}
32
+ ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
33
+ defer stop()
34
+ log.Printf("started as uid %s", strconv.Itoa(info.UID))
35
+ if err := background.NewRunner("/var/packages/"+packageID+"/var/background", info).Run(ctx); err != nil {
36
+ log.Fatal(err)
37
+ }
38
+ }
@@ -16,11 +16,20 @@ func main() {
16
16
  if len(os.Args) != 2 || json.Unmarshal([]byte(helperInventory), &i) != nil {
17
17
  os.Exit(2)
18
18
  }
19
- if os.Args[1] == "check-stopped" || os.Args[1] == "diagnose" {
19
+ if os.Args[1] == "check-stopped" || os.Args[1] == "diagnose" || os.Args[1] == "diagnose-startup" {
20
20
  c, err := helper.LocalClient(i)
21
21
  if err != nil {
22
22
  os.Exit(1)
23
23
  }
24
+ if os.Args[1] == "diagnose-startup" {
25
+ diagnostic, err := c.StartupDiagnostic()
26
+ if err != nil {
27
+ fmt.Fprintln(os.Stderr, "startup diagnostic unavailable")
28
+ os.Exit(1)
29
+ }
30
+ json.NewEncoder(os.Stdout).Encode(diagnostic)
31
+ return
32
+ }
24
33
  if os.Args[1] == "diagnose" {
25
34
  json.NewEncoder(os.Stdout).Encode(c.Status(context.Background()))
26
35
  return
@@ -0,0 +1,19 @@
1
+ //go:build synopkgland_sdk_workers
2
+
3
+ package main
4
+
5
+ import (
6
+ "dsmapp/internal/helper"
7
+ "encoding/json"
8
+ "os"
9
+ )
10
+
11
+ // Linker-bound source-validated registry, never package-writable JSON.
12
+ var sdkWorkerRegistry string
13
+
14
+ func init() {
15
+ var inventory helper.Inventory
16
+ if json.Unmarshal([]byte(helperInventory), &inventory) != nil || helper.InstallSDKRegistry(inventory, sdkWorkerRegistry) != "" {
17
+ os.Exit(2)
18
+ }
19
+ }
@@ -1,7 +1,9 @@
1
1
  module dsmapp
2
2
 
3
- go 1.24
3
+ go 1.25.0
4
4
 
5
- require github.com/godbus/dbus/v5 v5.2.2
5
+ toolchain go1.26.8
6
6
 
7
- require golang.org/x/sys v0.27.0 // indirect
7
+ require github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82
8
+
9
+ require golang.org/x/sys v0.44.0
@@ -1,4 +1,4 @@
1
- github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
2
- github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
3
- golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
4
- golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1
+ github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82 h1:QN/vQc8LI8KFWH6uZZ4R4jermkdwzvKzGy0Taimhbm0=
2
+ github.com/godbus/dbus/v5 v5.2.3-0.20260924123156-0ea052abeb82/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
3
+ golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
4
+ golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
@@ -10,6 +10,7 @@ import (
10
10
  "encoding/json"
11
11
  "errors"
12
12
  "fmt"
13
+ "net/http"
13
14
  "regexp"
14
15
  )
15
16
 
@@ -29,10 +30,11 @@ type Handler func(ctx context.Context, caller Caller, params json.RawMessage) (a
29
30
  // Route binds a method name to its handler and access policy. Its fields are
30
31
  // private: build routes with User, Admin or Public.
31
32
  type Route struct {
32
- method string
33
- policy policy
34
- handler Handler
35
- binary BinaryReadHandler
33
+ method string
34
+ policy policy
35
+ handler Handler
36
+ binary BinaryReadHandler
37
+ requestHandler RequestHandler
36
38
  }
37
39
 
38
40
  // User declares an operation any signed-in DSM user may call.
@@ -40,6 +42,15 @@ func User(method string, h Handler) Route {
40
42
  return Route{method: method, policy: policyUser, handler: h}
41
43
  }
42
44
 
45
+ // RequestHandler receives the original request after the normal transport and
46
+ // authentication guards. Credentials must remain request-scoped.
47
+ type RequestHandler func(context.Context, Caller, *http.Request, json.RawMessage) (any, error)
48
+
49
+ // UserRequest declares a session-aware operation for a signed-in DSM user.
50
+ func UserRequest(method string, h RequestHandler) Route {
51
+ return Route{method: method, policy: policyUser, requestHandler: h}
52
+ }
53
+
43
54
  // Admin declares an operation only members of DSM's administrators group may call.
44
55
  func Admin(method string, h Handler) Route {
45
56
  return Route{method: method, policy: policyAdmin, handler: h}
@@ -80,10 +91,10 @@ func buildRegistry(routes []Route) (map[string]Route, error) {
80
91
  if !methodName.MatchString(r.method) {
81
92
  return nil, fmt.Errorf("route %q: method must look like \"area.action\" (lowercase)", r.method)
82
93
  }
83
- if r.binary != nil && (r.method != "nas.files.read.binary" || r.policy != policyUser || r.handler != nil) {
94
+ if r.binary != nil && (r.method != "nas.files.read.binary" || r.policy != policyUser || r.handler != nil || r.requestHandler != nil) {
84
95
  return nil, errors.New("binary read must use the fixed authenticated route")
85
96
  }
86
- if r.handler == nil && r.binary == nil {
97
+ if r.handler == nil && r.binary == nil && r.requestHandler == nil {
87
98
  return nil, fmt.Errorf("route %q has no handler", r.method)
88
99
  }
89
100
  if _, dup := registry[r.method]; dup {
@@ -71,7 +71,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
71
71
  serveBoundedRead(w, r, caller, req.Params, route.binary)
72
72
  return
73
73
  }
74
- data, err := route.handler(r.Context(), caller, req.Params)
74
+ var data any
75
+ var err error
76
+ if route.requestHandler != nil {
77
+ data, err = route.requestHandler(r.Context(), caller, r, req.Params)
78
+ } else {
79
+ data, err = route.handler(r.Context(), caller, req.Params)
80
+ }
75
81
  if err != nil {
76
82
  writeError(w, asError(err))
77
83
  return