@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,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;}