@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
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "NAS 폴더 — File Station",
3
+ "ownPermissions": "자신의 DSM 세션과 현재 File Station 권한으로 작업합니다.",
4
+ "consent": "저장된 선택은 동의 기록이며 추가 DSM 권한을 부여하지 않습니다.",
5
+ "writable": "폴더 생성 및 파일 업로드 허용 (DSM 권한 필요)",
6
+ "readOnly": "읽기 전용",
7
+ "unsupported": "백그라운드 작업, 오프라인 접근, 스트리밍 및 원자적 게시를 지원하지 않습니다.",
8
+ "localOnly": "실험 기능: 로컬 테스트만 완료했으며 DSM 호환성은 검증되지 않았습니다.",
9
+ "identityRisk": "같은 사용자 이름과 UID로 계정을 다시 만들면 기존 선택이 유지될 수 있습니다.",
10
+ "pathRisk": "선택은 경로를 사용하며 inode 고정이나 심볼릭 링크 및 이름 변경 제한을 제공하지 않습니다.",
11
+ "choose": "폴더 선택",
12
+ "confirm": "선택 확인",
13
+ "emptySelections": "저장된 폴더가 없습니다. 폴더를 선택하세요.",
14
+ "refresh": "폴더 새로 고침",
15
+ "openFiles": "파일 탐색",
16
+ "revoke": "철회",
17
+ "confirmRevoke": "철회 확인",
18
+ "revokeWarning": "선택 철회는 새 작업을 거부합니다. 이미 기록된 데이터는 남으며 요청 취소가 작업 중단을 보장하지 않습니다.",
19
+ "loading": "불러오는 중…",
20
+ "emptyFolder": "빈 폴더입니다.",
21
+ "roots": "폴더",
22
+ "back": "뒤로",
23
+ "select": "{name} 선택",
24
+ "open": "{name} 열기",
25
+ "selected": "선택됨: {name}",
26
+ "cancel": "취소",
27
+ "close": "닫기",
28
+ "loadMore": "더 불러오기",
29
+ "inspect": "정보 보기",
30
+ "read": "파일 읽기",
31
+ "readComplete": "파일 읽기가 완료되었습니다. 아래에서 다운로드하세요.",
32
+ "create": "폴더 생성",
33
+ "folderName": "새 폴더 이름",
34
+ "upload": "업로드",
35
+ "uploadFile": "로컬 파일 선택",
36
+ "limit": "파일당 읽기 및 업로드 제한: 512 KiB. 새 파일을 생성하며 덮어쓰지 않습니다.",
37
+ "selectionAdded": "폴더 선택을 저장했습니다.",
38
+ "revokedNotice": "선택을 철회했습니다.",
39
+ "created": "폴더를 생성했습니다.",
40
+ "uploaded": "파일을 업로드했습니다.",
41
+ "accountChanged": "계정 또는 패키지가 변경되었습니다. 창을 닫고 다시 여세요.",
42
+ "errorSession": "DSM 세션이 만료되었습니다. DSM에 다시 로그인한 후 폴더를 새로 고치세요.",
43
+ "errorDenied": "현재 DSM 권한 또는 선택으로 접근이 거부되었습니다. 다른 폴더를 선택하세요.",
44
+ "errorNotFound": "파일 또는 폴더가 없습니다. 목록을 새로 고치세요.",
45
+ "errorConflict": "같은 이름의 파일 또는 폴더가 있습니다. 다른 이름을 사용하세요.",
46
+ "errorUncertain": "작업이 완료되었을 수 있습니다. 다시 제출하기 전에 선택 또는 대상 폴더를 새로 고쳐 결과를 확인하세요.",
47
+ "errorInvalid": "폴더, 파일 이름 또는 요청이 잘못되었습니다. 입력을 확인하세요.",
48
+ "errorUnavailable": "File Station을 사용할 수 없거나 패키지에 세션 adapter가 없습니다. 나중에 새로 고치세요.",
49
+ "errorLimit": "512 KiB 파일 제한 또는 서비스 제한을 초과했습니다. 더 작은 파일을 선택하세요.",
50
+ "errorCanceled": "요청이 취소되었습니다. 새로 고친 후 계속하세요.",
51
+ "errorTimeout": "요청 시간이 초과되었습니다. 목록을 새로 고치세요.",
52
+ "metadata": "정보",
53
+ "fileKind": "파일",
54
+ "directoryKind": "폴더",
55
+ "download": "파일 다운로드"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "NAS 文件夹 — File Station",
3
+ "ownPermissions": "操作使用你自己的 DSM 会话与 File Station 实时权限。",
4
+ "consent": "保存选择仅记录你的同意,不会授予额外 DSM 权限。",
5
+ "writable": "允许创建文件夹和上传文件(仍须符合 DSM 权限)",
6
+ "readOnly": "只读",
7
+ "unsupported": "不支持后台任务、离线访问、流式传输和原子发布。",
8
+ "localOnly": "实验功能:仅通过本地测试,DSM 兼容性尚未验证。",
9
+ "identityRisk": "使用相同用户名和 UID 重建账号,可能保留已有选择。",
10
+ "pathRisk": "选择按路径操作,不固定 inode,也不限制符号链接和重命名。",
11
+ "choose": "选择文件夹",
12
+ "confirm": "确认选择",
13
+ "emptySelections": "尚未保存文件夹。请选择文件夹开始。",
14
+ "refresh": "刷新文件夹",
15
+ "openFiles": "浏览文件",
16
+ "revoke": "撤销",
17
+ "confirmRevoke": "确认撤销",
18
+ "revokeWarning": "撤销选择会拒绝新操作。已写入的数据仍会保留;取消请求不代表操作已停止。",
19
+ "loading": "正在加载…",
20
+ "emptyFolder": "此文件夹为空。",
21
+ "roots": "文件夹",
22
+ "back": "返回",
23
+ "select": "选择 {name}",
24
+ "open": "打开 {name}",
25
+ "selected": "已选择:{name}",
26
+ "cancel": "取消",
27
+ "close": "关闭",
28
+ "loadMore": "加载更多",
29
+ "inspect": "查看信息",
30
+ "read": "读取文件",
31
+ "readComplete": "文件读取完成。可在下方下载内容。",
32
+ "create": "创建文件夹",
33
+ "folderName": "新文件夹名称",
34
+ "upload": "上传",
35
+ "uploadFile": "选择本地文件",
36
+ "limit": "单文件读取和上传上限:512 KiB。上传会创建新文件,不会覆盖。",
37
+ "selectionAdded": "已保存文件夹选择。",
38
+ "revokedNotice": "已撤销选择。",
39
+ "created": "已创建文件夹。",
40
+ "uploaded": "已上传文件。",
41
+ "accountChanged": "账号或套件已变更。请关闭并重新打开窗口后继续。",
42
+ "errorSession": "DSM 会话已失效。请重新登录 DSM,再刷新文件夹。",
43
+ "errorDenied": "当前 DSM 权限或选择拒绝访问。请选择其他文件夹。",
44
+ "errorNotFound": "文件或文件夹已不存在。请刷新列表。",
45
+ "errorConflict": "已有同名文件或文件夹。请使用其他名称。",
46
+ "errorUncertain": "操作可能已完成。请刷新选择或目标文件夹并确认结果,再决定是否重新提交。",
47
+ "errorInvalid": "文件夹、文件名或请求无效。请检查输入后重试。",
48
+ "errorUnavailable": "File Station 不可用,或此套件未提供会话 adapter。请稍后刷新。",
49
+ "errorLimit": "请求超过单文件 512 KiB 或其他服务限制。请选择较小的文件。",
50
+ "errorCanceled": "请求已取消。请刷新后继续。",
51
+ "errorTimeout": "请求超时。请刷新列表后继续。",
52
+ "metadata": "信息",
53
+ "fileKind": "文件",
54
+ "directoryKind": "文件夹",
55
+ "download": "下载文件"
56
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "title": "NAS 資料夾 — File Station",
3
+ "ownPermissions": "操作使用你自己的 DSM 工作階段與 File Station 即時權限。",
4
+ "consent": "儲存選取僅記錄你的同意,不會授予額外 DSM 權限。",
5
+ "writable": "允許建立資料夾與上傳檔案(仍須符合 DSM 權限)",
6
+ "readOnly": "唯讀",
7
+ "unsupported": "不支援背景工作、離線存取、串流與原子發布。",
8
+ "localOnly": "實驗功能:僅通過本機測試,DSM 相容性尚未驗證。",
9
+ "identityRisk": "以相同使用者名稱與 UID 重建帳號,可能保留既有選取。",
10
+ "pathRisk": "選取依路徑操作,不固定 inode,也不限制符號連結與重新命名。",
11
+ "choose": "選擇資料夾",
12
+ "confirm": "確認選取",
13
+ "emptySelections": "尚未儲存資料夾。請選擇資料夾開始。",
14
+ "refresh": "重新整理資料夾",
15
+ "openFiles": "瀏覽檔案",
16
+ "revoke": "撤銷",
17
+ "confirmRevoke": "確認撤銷",
18
+ "revokeWarning": "撤銷選取會拒絕新操作。已寫入資料仍會保留;取消請求不代表操作已停止。",
19
+ "loading": "載入中…",
20
+ "emptyFolder": "此資料夾是空的。",
21
+ "roots": "資料夾",
22
+ "back": "返回",
23
+ "select": "選取 {name}",
24
+ "open": "開啟 {name}",
25
+ "selected": "已選取:{name}",
26
+ "cancel": "取消",
27
+ "close": "關閉",
28
+ "loadMore": "載入更多",
29
+ "inspect": "檢視資訊",
30
+ "read": "讀取檔案",
31
+ "readComplete": "檔案讀取完成。可在下方下載內容。",
32
+ "create": "建立資料夾",
33
+ "folderName": "新資料夾名稱",
34
+ "upload": "上傳",
35
+ "uploadFile": "選擇本機檔案",
36
+ "limit": "單檔讀取與上傳上限:512 KiB。上傳會建立新檔案,不會覆寫。",
37
+ "selectionAdded": "已儲存資料夾選取。",
38
+ "revokedNotice": "已撤銷選取。",
39
+ "created": "已建立資料夾。",
40
+ "uploaded": "已上傳檔案。",
41
+ "accountChanged": "帳號或套件已變更。請關閉並重新開啟視窗後繼續。",
42
+ "errorSession": "DSM 工作階段已失效。請重新登入 DSM,再重新整理資料夾。",
43
+ "errorDenied": "目前的 DSM 權限或選取拒絕存取。請選擇其他資料夾。",
44
+ "errorNotFound": "檔案或資料夾已不存在。請重新整理清單。",
45
+ "errorConflict": "已有同名檔案或資料夾。請使用其他名稱。",
46
+ "errorUncertain": "操作可能已完成。請重新整理選取或目的資料夾並確認結果,再決定是否重新送出。",
47
+ "errorInvalid": "資料夾、檔名或請求無效。請檢查輸入後重試。",
48
+ "errorUnavailable": "File Station 無法使用,或此套件未提供工作階段 adapter。請稍後重新整理。",
49
+ "errorLimit": "請求超過單檔 512 KiB 或其他服務限制。請選擇較小的檔案。",
50
+ "errorCanceled": "請求已取消。請重新整理後繼續。",
51
+ "errorTimeout": "請求逾時。請重新整理清單後繼續。",
52
+ "metadata": "資訊",
53
+ "fileKind": "檔案",
54
+ "directoryKind": "資料夾",
55
+ "download": "下載檔案"
56
+ }
@@ -0,0 +1,33 @@
1
+ import type {InjectionKey} from 'vue'
2
+
3
+ // File Station session selections are consent, not native helper grants.
4
+ // Paths are display/routing data. Only the backend's authenticated DSM session
5
+ // and current File Station ACL authorize an operation; writable is consent only.
6
+ export const M2_MAX_BYTES = 512 * 1024
7
+ export const M2_PAGE_SIZE = 100
8
+ export type M2Code = 'session_required' | 'auth_unavailable' | 'denied' | 'not_found' |
9
+ 'conflict' | 'invalid-request' | 'unavailable' | 'unknown_method' | 'unsupported' |
10
+ 'commit-uncertain' | 'limit-exceeded' | 'canceled' | 'timeout'
11
+ export interface M2Selection {grantId:string; folder:string; writable:boolean}
12
+ export interface M2Entry {name:string; path:string; isDir:boolean; bytes?:number}
13
+ // File picks consent to their containing folder, with one relative filename.
14
+ export interface M2JobSource {selection:M2Selection;entry:M2Entry;segments:readonly string[]}
15
+ export interface M2Page {entries:M2Entry[]; total:number; offset:number; nextOffset?:number}
16
+ export interface M2Session {
17
+ mode:'filestation-session'; interactive:'session-required'; background:'unavailable'; validation:'local-only'
18
+ }
19
+ export interface M2Provider {
20
+ readonly mode:'filestation-session'
21
+ status(signal:AbortSignal):Promise<M2Session>
22
+ discovery(folder:string|undefined,offset:number,signal:AbortSignal):Promise<M2Page>
23
+ confirm(folder:string,writable:boolean,signal:AbortSignal):Promise<M2Selection>
24
+ selections(signal:AbortSignal):Promise<M2Selection[]>
25
+ revoke(grantId:string,signal:AbortSignal):Promise<void>
26
+ list(grantId:string,relative:string,offset:number,signal:AbortSignal):Promise<M2Page>
27
+ stat(grantId:string,relative:string,signal:AbortSignal):Promise<M2Entry>
28
+ read(grantId:string,relative:string,signal:AbortSignal):Promise<Uint8Array>
29
+ create(grantId:string,relative:string,name:string,signal:AbortSignal):Promise<void>
30
+ upload(grantId:string,relative:string,name:string,data:Uint8Array,signal:AbortSignal):Promise<void>
31
+ dispose():void
32
+ }
33
+ export const M2ProviderKey:InjectionKey<M2Provider> = Symbol('m2-filestation-session')
@@ -0,0 +1,24 @@
1
+ import type {UiLocale} from '@synopackageland/ui'
2
+ import en from './i18n/m2/en.json'
3
+ import zhTW from './i18n/m2/zh-TW.json'
4
+ import zhCN from './i18n/m2/zh-CN.json'
5
+ import ja from './i18n/m2/ja.json'
6
+ import ko from './i18n/m2/ko.json'
7
+ import de from './i18n/m2/de.json'
8
+ import fr from './i18n/m2/fr.json'
9
+ import es from './i18n/m2/es.json'
10
+ import it from './i18n/m2/it.json'
11
+ export type M2Copy=typeof en
12
+ export const m2Catalogs:Record<string,M2Copy>={en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
13
+ const aliases:Record<string,string>={enu:'en',cht:'zh-TW',chs:'zh-CN',jpn:'ja',krn:'ko',ger:'de',fre:'fr',spn:'es',ita:'it'}
14
+ /** The built-in UI locale (shared by these catalogs and the UI's own text) for a DSM or BCP-47 language tag. */
15
+ export function uiLocale(locale:string):UiLocale{
16
+ const normalized=locale.replaceAll('_','-')
17
+ return ([aliases[normalized]??normalized,normalized.split('-')[0]!].find(key=>key in m2Catalogs)??'en') as UiLocale
18
+ }
19
+ export function m2Copy(locale:string):M2Copy{return m2Catalogs[uiLocale(locale)]!}
20
+ export function m2ErrorCopy(error:unknown,copy:M2Copy):string{
21
+ const code=(error as {code?:string})?.code
22
+ const keys:Record<string,keyof M2Copy>={session_required:'errorSession',denied:'errorDenied',not_found:'errorNotFound',conflict:'errorConflict','commit-uncertain':'errorUncertain','invalid-request':'errorInvalid','limit-exceeded':'errorLimit',canceled:'errorCanceled',timeout:'errorTimeout',unsupported:'unsupported'}
23
+ return copy[keys[code??'']??'errorUnavailable']
24
+ }
@@ -0,0 +1,104 @@
1
+ import type {Context} from '../context'
2
+ import {M2_MAX_BYTES,M2_PAGE_SIZE,type M2Code,type M2Entry,type M2Page,type M2Provider,type M2Selection,type M2Session} from './m2-contract'
3
+
4
+ const codes=new Set<M2Code>(['session_required','auth_unavailable','denied','not_found','conflict','invalid-request','unavailable','unknown_method','unsupported','commit-uncertain','limit-exceeded','canceled','timeout'])
5
+ function refuse(code:M2Code='invalid-request'):never{throw {code}}
6
+ const record=(value:unknown):Record<string,unknown>=>{
7
+ if(!value||typeof value!=='object'||Array.isArray(value))return refuse('unavailable')
8
+ return value as Record<string,unknown>
9
+ }
10
+ const length=(s:string)=>new TextEncoder().encode(s).length
11
+ const name=(s:unknown):s is string=>typeof s==='string'&&length(s)<=255&&s!==''&&s!=='.'&&s!=='..'&&!/[/\\\x00\r\n,"]/.test(s)
12
+ const path=(s:unknown):s is string=>typeof s==='string'&&s.startsWith('/')&&length(s)<=4096&&s.slice(1).split('/').every(name)
13
+ const relative=(s:string)=>s===''||(!s.startsWith('/')&&s.split('/').every(name))
14
+ const id=(s:unknown):s is string=>typeof s==='string'&&/^[a-fA-F0-9]{64}$/.test(s)
15
+ const integer=(v:unknown):v is number=>typeof v==='number'&&Number.isSafeInteger(v)&&v>=0
16
+ function selection(value:unknown):M2Selection{
17
+ const v=record(value)
18
+ if(!id(v.grantId)||!path(v.folder)||typeof v.writable!=='boolean')refuse('unavailable')
19
+ return {grantId:v.grantId,folder:v.folder,writable:v.writable}
20
+ }
21
+ function entry(value:unknown):M2Entry{
22
+ const v=record(value),additional=record(v.additional??{})
23
+ if(!name(v.name)||!path(v.path)||typeof v.isdir!=='boolean'||(additional.size!==undefined&&!integer(additional.size)))refuse('unavailable')
24
+ return {name:v.name,path:v.path,isDir:v.isdir,...(additional.size===undefined?{}:{bytes:additional.size as number})}
25
+ }
26
+ function page(value:unknown,offset:number):M2Page{
27
+ const v=record(value)
28
+ if(!('files' in v)&&!('shares' in v))refuse('unavailable')
29
+ const raw=v.shares??v.files??[]
30
+ if(!Array.isArray(raw)||raw.length>M2_PAGE_SIZE||!integer(v.total)||v.offset!==offset||offset+raw.length>v.total)refuse('unavailable')
31
+ const entries=raw.map(entry),next=offset+entries.length
32
+ return {entries,total:v.total,offset,...(entries.length&&next<v.total&&next<=1000000?{nextOffset:next}:{})}
33
+ }
34
+ function encode(data:Uint8Array):string{
35
+ let raw=''
36
+ for(const byte of data)raw+=String.fromCharCode(byte)
37
+ return btoa(raw)
38
+ }
39
+ function bytes(value:unknown):Uint8Array{
40
+ const v=record(value)
41
+ if(!integer(v.bytes)||v.bytes>M2_MAX_BYTES||typeof v.data!=='string'||v.data.length>4*Math.ceil(M2_MAX_BYTES/3)||! /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(v.data))refuse('unavailable')
42
+ const raw=atob(v.data)
43
+ if(raw.length!==v.bytes||btoa(raw)!==v.data)refuse('unavailable')
44
+ return Uint8Array.from(raw,c=>c.charCodeAt(0))
45
+ }
46
+ export function createM2Provider(ctx:Pick<Context,'call'>):M2Provider{
47
+ let disposed=false
48
+ const life=new AbortController()
49
+ async function request(method:string,args:Record<string,unknown>,signal:AbortSignal,mutates=false):Promise<unknown>{
50
+ if(disposed||signal.aborted)refuse('canceled')
51
+ let cleanup=()=>{}
52
+ const stop=new Promise<never>((_,reject)=>{
53
+ const abort=()=>reject({code:mutates?'commit-uncertain':'canceled'})
54
+ const timer=setTimeout(()=>reject({code:mutates?'commit-uncertain':'timeout'}),22000)
55
+ signal.addEventListener('abort',abort,{once:true});life.signal.addEventListener('abort',abort,{once:true})
56
+ cleanup=()=>{clearTimeout(timer);signal.removeEventListener('abort',abort);life.signal.removeEventListener('abort',abort)}
57
+ })
58
+ try{
59
+ // ctx.call retains DSM's existing same-origin session and CSRF transport.
60
+ // It has no abort API: canceling local observation cannot prove rollback.
61
+ const value=await Promise.race([ctx.call(method,args),stop])
62
+ if(disposed||signal.aborted)refuse(mutates?'commit-uncertain':'canceled')
63
+ return value
64
+ }catch(e){
65
+ const code=(e as {code?:M2Code})?.code
66
+ if(mutates&&(!code||!codes.has(code)||['timeout','canceled'].includes(code)))refuse('commit-uncertain')
67
+ throw {code:code&&codes.has(code)?code:'unavailable'}
68
+ }finally{cleanup()}
69
+ }
70
+ function fileArgs(grantId:string,rel:string){if(!id(grantId)||!relative(rel))refuse();return {grantId,relative:rel}}
71
+ function offsetArgs(offset:number){if(!integer(offset)||offset>1000000)refuse();return {offset}}
72
+ function dispose(){if(disposed)return;disposed=true;life.abort();if(typeof window!=='undefined')window.removeEventListener('pagehide',dispose)}
73
+ if(typeof window!=='undefined')window.addEventListener('pagehide',dispose)
74
+ return {
75
+ mode:'filestation-session',
76
+ async status(signal){
77
+ const v=record(await request('nas.session.status',{},signal))
78
+ if(v.mode!=='filestation-session'||v.interactive!=='session-required'||v.background!=='unavailable'||v.validation!=='local-only')refuse('unavailable')
79
+ return {mode:v.mode,interactive:v.interactive,background:v.background,validation:v.validation} as M2Session
80
+ },
81
+ async discovery(folder,offset,signal){if(folder!==undefined&&!path(folder))refuse();return page(await request('nas.discovery',{...(folder?{folder}:{}),...offsetArgs(offset)},signal),offset)},
82
+ async confirm(folder,writable,signal){
83
+ if(!path(folder)||typeof writable!=='boolean')refuse()
84
+ const value=await request('nas.grants.confirm',{folder,writable},signal,true)
85
+ try{const s=selection(value);if(s.folder!==folder||s.writable!==writable)refuse();return s}catch{refuse('commit-uncertain')}
86
+ },
87
+ async selections(signal){const values=await request('nas.grants.list',{},signal);if(!Array.isArray(values)||values.length>256)refuse('unavailable');return values.map(selection)},
88
+ async revoke(grantId,signal){if(!id(grantId))refuse();const result=await request('nas.grants.revoke',{grantId},signal,true);if(!result||typeof result!=='object'||(result as {revoked?:unknown}).revoked!==true)refuse('commit-uncertain')},
89
+ async list(grantId,rel,offset,signal){return page(await request('nas.files.list',{...fileArgs(grantId,rel),...offsetArgs(offset)},signal),offset)},
90
+ async stat(grantId,rel,signal){return entry(await request('nas.files.stat',fileArgs(grantId,rel),signal))},
91
+ async read(grantId,rel,signal){if(!rel)refuse();return bytes(await request('nas.files.read',fileArgs(grantId,rel),signal))},
92
+ async create(grantId,rel,n,signal){
93
+ if(!name(n))refuse()
94
+ const v=await request('nas.files.create',{...fileArgs(grantId,rel),name:n},signal,true)
95
+ if(!v||typeof v!=='object'||(v as {created?:unknown}).created!==true)refuse('commit-uncertain')
96
+ },
97
+ async upload(grantId,rel,n,data,signal){
98
+ if(!name(n)||!(data instanceof Uint8Array))refuse()
99
+ if(data.byteLength>M2_MAX_BYTES)refuse('limit-exceeded')
100
+ const v=await request('nas.files.write',{...fileArgs(grantId,rel),name:n,data:encode(data)},signal,true)
101
+ if(!v||typeof v!=='object'||(v as {written?:unknown}).written!==true)refuse('commit-uncertain')
102
+ },dispose,
103
+ }
104
+ }
@@ -0,0 +1,18 @@
1
+ import {onBeforeUnmount,ref} from 'vue'
2
+
3
+ // The provider owns the 22 s bound (backend handlers are bounded to 20 s).
4
+ // Local cancellation suppresses late display updates, never promises rollback.
5
+ export function useM2Request(){
6
+ const busy=ref(false),error=ref<unknown>()
7
+ let disposed=false,generation=0,active:AbortController|undefined
8
+ function cancel(){generation++;active?.abort();active=undefined;busy.value=false;error.value=undefined}
9
+ async function run<T>(fn:(signal:AbortSignal)=>Promise<T>):Promise<T|undefined>{
10
+ if(disposed||busy.value)return
11
+ const version=++generation,controller=new AbortController();active=controller;busy.value=true;error.value=undefined
12
+ try{const value=await fn(controller.signal);return !disposed&&version===generation?value:undefined}
13
+ catch(e){if(!disposed&&version===generation)error.value=e;return undefined}
14
+ finally{if(!disposed&&version===generation){busy.value=false;active=undefined}}
15
+ }
16
+ onBeforeUnmount(()=>{disposed=true;cancel()})
17
+ return {busy,error,run,cancel}
18
+ }
@@ -0,0 +1,39 @@
1
+ import {createApp} from 'vue'
2
+ import App from './SDKApp.vue'
3
+ import {JobsProviderKey,JobsAdminProviderKey} from './jobs/provider'
4
+ import {createConnectedJobsProvider,createConnectedJobsAdminProvider} from './jobs/connected-provider'
5
+ import type {Context} from './context'
6
+ import {NasProviderKey, type NasProvider} from './nas/provider'
7
+ import {M2ProviderKey} from './nas/m2-contract'
8
+ import {createM2Provider} from './nas/m2-provider'
9
+ import '@synopackageland/ui/themes/dsm7-embedded.css'
10
+ import './style.css'
11
+ import './m2-style.css'
12
+
13
+ let mountSequence = 0
14
+ export function mount(root: HTMLElement, ctx: Context, options: {nasProvider?: NasProvider} = {}) {
15
+ const app = createApp(App, {ctx})
16
+ const jobs=createConnectedJobsProvider(ctx)
17
+ const selections=createM2Provider(ctx)
18
+ app.provide(M2ProviderKey,selections)
19
+ app.provide(JobsProviderKey,jobs)
20
+ app.provide(JobsAdminProviderKey,createConnectedJobsAdminProvider(ctx))
21
+ // The shipped strict-S1 build never installs a NAS provider. Preview is dev/mock only.
22
+ if(import.meta.env.DEV && options.nasProvider?.mode === 'mock') app.provide(NasProviderKey, options.nasProvider)
23
+ // Include the generated package ID, an instance counter and randomness even
24
+ // across separately loaded bundles. getRandomValues also works on DSM HTTP.
25
+ app.config.idPrefix = `__PACKAGE__-${++mountSequence}-${crypto.getRandomValues(new Uint32Array(4)).join('-')}`
26
+ const hadRootClass = root.classList.contains('dsmapp-vue-root')
27
+ root.classList.add('dsmapp-vue-root')
28
+ app.mount(root)
29
+ return {unmount() {app.unmount(); jobs.disconnect(); selections.dispose(); if(!hadRootClass) root.classList.remove('dsmapp-vue-root')}}
30
+ }
31
+ // Register with the existing per-package DSM window loader. Never share a
32
+ // singleton app or user/session state between different mount calls.
33
+ const script = document.currentScript as HTMLScriptElement | null
34
+ const packageID = script?.getAttribute('data-package')
35
+ const host = window as unknown as {DsmPackageApps: Record<string, {mount: typeof mount}>}
36
+ if (packageID) {
37
+ host.DsmPackageApps = host.DsmPackageApps || {}
38
+ host.DsmPackageApps[packageID] = {mount}
39
+ }
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ // DSM-style shell: a fixed left navigation and one right-hand page with a
3
+ // header. Pages stay mounted (v-show) so provider leases and job polling keep
4
+ // running while the user moves between them.
5
+ import {computed, type Component} from 'vue'
6
+ import {AppLayout, AppSidebar, PageContent, PageHeader, type AppSidebarGroup} from '@synopackageland/ui'
7
+ import {FolderOpen, Info, KeyRound, ListChecks, MousePointerClick, NotebookPen, Shield, Timer} from '@lucide/vue'
8
+ import {shellCopy} from './i18n'
9
+ import type {ShellPage} from './pages'
10
+
11
+ const props = defineProps<{
12
+ locale: string
13
+ modelValue: ShellPage
14
+ pages: readonly ShellPage[]
15
+ description?: string
16
+ }>()
17
+ const emit = defineEmits<{'update:modelValue': [value: ShellPage]}>()
18
+ const copy = computed(() => shellCopy(props.locale))
19
+ const icons: Record<ShellPage, Component> = {status:Info,sample:NotebookPen,nas:FolderOpen,interactive:MousePointerClick,background:Timer,admin:ListChecks,identity:KeyRound,folders:Shield}
20
+ const groups = computed<AppSidebarGroup[]>(() => [{
21
+ items: props.pages.map(page => ({key:page,label:copy.value[page],icon:icons[page]})),
22
+ }])
23
+ const title = computed(() => copy.value[props.modelValue] ?? copy.value.status)
24
+ </script>
25
+
26
+ <template>
27
+ <AppLayout class="app-shell" min-height="0">
28
+ <template #sidebar>
29
+ <AppSidebar :model-value="modelValue" :groups="groups" @update:model-value="emit('update:modelValue', $event as ShellPage)" />
30
+ </template>
31
+ <PageContent class="app-page">
32
+ <PageHeader :title="title" :description="description">
33
+ <template #actions><slot name="actions" /></template>
34
+ </PageHeader>
35
+ <div class="app-page-content"><slot /></div>
36
+ </PageContent>
37
+ </AppLayout>
38
+ </template>
39
+
40
+ <style scoped>
41
+ /* The library clips AppLayout at window height; the page body scrolls while
42
+ the sidebar keeps its own height. Modeled on syno-reclaim's AppShell. */
43
+ .app-shell { height: 100%; min-width: 0; grid-template-rows: minmax(0, 1fr); }
44
+ .app-shell :deep(> div) { min-height: 0; }
45
+ .app-shell :deep(main) { display: flex; flex-direction: column; overflow: hidden; }
46
+ .app-page { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
47
+ .app-page-content { padding-bottom: var(--ui-space-6, 24px); }
48
+ </style>
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "Status",
3
+ "sample": "Meine Beispieldaten",
4
+ "nas": "NAS-Ordnerzugriff",
5
+ "interactive": "Interaktive Aufträge",
6
+ "background": "Hintergrundaufträge",
7
+ "admin": "Auftragsverwaltung",
8
+ "identity": "Optionale App-Identität",
9
+ "folders": "Ordnerauswahl"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "Status",
3
+ "sample": "My sample data",
4
+ "nas": "NAS folder access",
5
+ "interactive": "Interactive jobs",
6
+ "background": "Background jobs",
7
+ "admin": "Job management",
8
+ "identity": "Optional app identity",
9
+ "folders": "Folder selections"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "Estado",
3
+ "sample": "Mis datos de ejemplo",
4
+ "nas": "Acceso a carpetas NAS",
5
+ "interactive": "Tareas interactivas",
6
+ "background": "Tareas en segundo plano",
7
+ "admin": "Gestión de tareas",
8
+ "identity": "Identidad de aplicación opcional",
9
+ "folders": "Selección de carpetas"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "État",
3
+ "sample": "Mes données d'exemple",
4
+ "nas": "Accès aux dossiers NAS",
5
+ "interactive": "Tâches interactives",
6
+ "background": "Tâches en arrière-plan",
7
+ "admin": "Gestion des tâches",
8
+ "identity": "Identité d'application facultative",
9
+ "folders": "Sélection de dossiers"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "Stato",
3
+ "sample": "I miei dati di esempio",
4
+ "nas": "Accesso alle cartelle NAS",
5
+ "interactive": "Attività interattive",
6
+ "background": "Attività in background",
7
+ "admin": "Gestione attività",
8
+ "identity": "Identità app opzionale",
9
+ "folders": "Selezione cartelle"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "ステータス",
3
+ "sample": "サンプルデータ",
4
+ "nas": "NAS フォルダーアクセス",
5
+ "interactive": "インタラクティブジョブ",
6
+ "background": "バックグラウンドジョブ",
7
+ "admin": "ジョブ管理",
8
+ "identity": "任意のアプリ ID",
9
+ "folders": "フォルダーの選択"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "상태",
3
+ "sample": "내 샘플 데이터",
4
+ "nas": "NAS 폴더 액세스",
5
+ "interactive": "대화형 작업",
6
+ "background": "백그라운드 작업",
7
+ "admin": "작업 관리",
8
+ "identity": "선택적 앱 ID",
9
+ "folders": "폴더 선택"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "状态",
3
+ "sample": "我的示例数据",
4
+ "nas": "NAS 文件夹访问",
5
+ "interactive": "交互工作",
6
+ "background": "后台工作",
7
+ "admin": "工作管理",
8
+ "identity": "可选应用身份",
9
+ "folders": "文件夹选择"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "狀態",
3
+ "sample": "我的範例資料",
4
+ "nas": "NAS 資料夾存取",
5
+ "interactive": "互動工作",
6
+ "background": "背景工作",
7
+ "admin": "工作管理",
8
+ "identity": "選用應用程式身分",
9
+ "folders": "資料夾選取"
10
+ }
@@ -0,0 +1,17 @@
1
+ import en from './i18n/en.json'
2
+ import zhTW from './i18n/zh-TW.json'
3
+ import zhCN from './i18n/zh-CN.json'
4
+ import ja from './i18n/ja.json'
5
+ import ko from './i18n/ko.json'
6
+ import de from './i18n/de.json'
7
+ import fr from './i18n/fr.json'
8
+ import es from './i18n/es.json'
9
+ import it from './i18n/it.json'
10
+
11
+ export type ShellCopy = typeof en
12
+ export const shellCatalogs: Record<string, ShellCopy> = {en,'zh-TW':zhTW,'zh-CN':zhCN,ja,ko,de,fr,es,it}
13
+ const aliases: Record<string,string> = {enu:'en',cht:'zh-TW',chs:'zh-CN',jpn:'ja',krn:'ko',ger:'de',fre:'fr',spn:'es',ita:'it'}
14
+ export function shellCopy(locale: string): ShellCopy {
15
+ const normalized = locale.replaceAll('_','-')
16
+ return shellCatalogs[aliases[normalized] ?? normalized] ?? shellCatalogs[normalized.split('-')[0]!] ?? en
17
+ }
@@ -0,0 +1,34 @@
1
+ // The DSM-style shell shows one sidebar entry per feature that this build
2
+ // actually provides. The manifest is resolved at build time, so the entries
3
+ // here are driven by runtime feature flags rather than by the YAML itself.
4
+ export type ShellPage =
5
+ | 'status'
6
+ | 'sample'
7
+ | 'nas'
8
+ | 'interactive'
9
+ | 'background'
10
+ | 'admin'
11
+ | 'identity'
12
+ | 'folders'
13
+
14
+ export interface ShellFeatureFlags {
15
+ sample?: boolean
16
+ nas?: boolean
17
+ interactive?: boolean
18
+ background?: boolean
19
+ admin?: boolean
20
+ identity?: boolean
21
+ folders?: boolean
22
+ }
23
+
24
+ /** 'status' is the integration/account page every Vue build has. */
25
+ const ORDER: readonly ShellPage[] = ['status','sample','nas','interactive','background','admin','identity','folders']
26
+
27
+ export function shellPages(features: ShellFeatureFlags): ShellPage[] {
28
+ return ORDER.filter(page => page === 'status' || features[page] === true)
29
+ }
30
+
31
+ /** Keeps a selection that still exists; otherwise the first page wins. */
32
+ export function activePage(current: ShellPage | undefined, pages: readonly ShellPage[]): ShellPage {
33
+ return current !== undefined && pages.includes(current) ? current : (pages[0] ?? 'status')
34
+ }
@@ -1,16 +1,12 @@
1
1
  .dsmapp-vue-root {height: 100%; min-height: 0; width: 100%; overflow: hidden;}
2
- [data-ui-app] .integration-app {padding: var(--ui-space-5, 20px); max-width: 72ch; color: var(--ui-text); font-family: var(--ui-font-sans); font-size: 13px; line-height: 1.5;}
3
- [data-ui-app] .integration-heading {display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 20px;}
4
- [data-ui-app] .integration-heading h1 {font-size: 20px; font-weight: 600; margin: 0;}
5
- [data-ui-app] .integration-heading p {color: var(--ui-text); margin: 4px 0 0;}
6
- [data-ui-app] .integration-app section {margin-top: 24px;}
2
+ [data-ui-app] .integration-app {padding: 0 var(--ui-page-padding-x, 16px); color: var(--ui-text); font-family: var(--ui-font-sans); font-size: 13px; line-height: 1.5;}
3
+ [data-ui-app] .integration-app section {margin-top: var(--ui-space-4, 16px);}
7
4
  [data-ui-app] .integration-status h2 {font-size: 15px; font-weight: 600; margin: 0;}
8
5
  [data-ui-app] .integration-status p {margin: 6px 0;}
9
6
  [data-ui-app] .integration-status dl {display: grid; grid-template-columns: max-content 1fr; gap: 4px 16px; margin: 12px 0;}
10
7
  [data-ui-app] .integration-status dt, [data-ui-app] .integration-help {color: var(--ui-text);}
11
8
  [data-ui-app] .integration-status dd {margin: 0;}
12
9
  [data-ui-app] .integration-actions {display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px;}
13
- [data-ui-app] .integration-field {display: grid; gap: 6px; margin: 12px 0;}
14
10
  [data-ui-app] .integration-notice {color: var(--ui-text);}
15
11
  [data-ui-app] .nas-summary {display: grid; grid-template-columns: minmax(6ch, max-content) minmax(0, 1fr); gap: var(--ui-space-2, 8px) var(--ui-space-4, 16px);}
16
12
  [data-ui-app] .nas-summary dd {margin: 0; overflow-wrap: anywhere;}