@synopackageland/cli 0.4.0 → 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 (956) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -1
  3. package/dist/build-spk/delete-app-data.d.ts +27 -7
  4. package/dist/build-spk/delete-app-data.js +35 -34
  5. package/dist/build-spk/dsm-arch.d.ts +6 -1
  6. package/dist/build-spk/dsm-arch.js +25 -1
  7. package/dist/build-spk/dsm-version.d.ts +14 -0
  8. package/dist/build-spk/dsm-version.js +47 -0
  9. package/dist/build-spk/gateway.d.ts +31 -0
  10. package/dist/build-spk/gateway.js +55 -0
  11. package/dist/build-spk/generator.d.ts +5 -0
  12. package/dist/build-spk/generator.js +106 -107
  13. package/dist/build-spk/install-wizard.d.ts +20 -0
  14. package/dist/build-spk/install-wizard.js +76 -0
  15. package/dist/build-spk/native-lifecycle.d.ts +5 -0
  16. package/dist/build-spk/native-lifecycle.js +12 -2
  17. package/dist/build-spk/notices.d.ts +5 -0
  18. package/dist/build-spk/notices.js +60 -0
  19. package/dist/build-spk/resource-worker.d.ts +9 -4
  20. package/dist/build-spk/resource-worker.js +15 -6
  21. package/dist/build-spk/share-combobox.d.ts +3 -0
  22. package/dist/build-spk/share-combobox.js +27 -0
  23. package/dist/build-spk/uninstall-wizard.d.ts +14 -0
  24. package/dist/build-spk/uninstall-wizard.js +33 -0
  25. package/dist/build-spk/wizard-i18n.d.ts +18 -0
  26. package/dist/build-spk/wizard-i18n.js +38 -0
  27. package/dist/build-spk/wizard-messages.d.ts +388 -0
  28. package/dist/build-spk/wizard-messages.js +387 -0
  29. package/dist/cli.js +136 -29
  30. package/dist/compose/analyze.d.ts +20 -0
  31. package/dist/compose/analyze.js +75 -11
  32. package/dist/contract/validate.js +33 -1
  33. package/dist/contract/web-launch.d.ts +22 -0
  34. package/dist/contract/web-launch.js +37 -0
  35. package/dist/deploy/deploy.d.ts +3 -0
  36. package/dist/deploy/deploy.js +11 -2
  37. package/dist/error-registry.js +80 -1
  38. package/dist/host/open-url.d.ts +2 -0
  39. package/dist/host/open-url.js +4 -1
  40. package/dist/images/pin.d.ts +52 -0
  41. package/dist/images/pin.js +249 -0
  42. package/dist/init.d.ts +29 -1
  43. package/dist/init.js +122 -25
  44. package/dist/inspect.d.ts +3 -0
  45. package/dist/inspect.js +15 -3
  46. package/dist/standalone/background.d.ts +21 -0
  47. package/dist/standalone/background.js +52 -0
  48. package/dist/standalone/binary.d.ts +1 -0
  49. package/dist/standalone/binary.js +1 -1
  50. package/dist/standalone/build.d.ts +2 -0
  51. package/dist/standalone/build.js +40 -6
  52. package/dist/standalone/daemon.d.ts +23 -0
  53. package/dist/standalone/daemon.js +114 -0
  54. package/dist/standalone/dsm-window.d.ts +1 -1
  55. package/dist/standalone/dsm-window.js +52 -12
  56. package/dist/standalone/helper-inventory.d.ts +31 -0
  57. package/dist/standalone/helper-inventory.js +11 -0
  58. package/dist/standalone/helper.d.ts +3 -12
  59. package/dist/standalone/helper.js +31 -12
  60. package/dist/standalone/host-adapter.d.ts +5 -0
  61. package/dist/standalone/host-adapter.js +166 -0
  62. package/dist/standalone/host-file-navigation.d.ts +7 -0
  63. package/dist/standalone/host-file-navigation.js +172 -0
  64. package/dist/standalone/host-platform.d.ts +13 -0
  65. package/dist/standalone/host-platform.js +42 -0
  66. package/dist/standalone/host-types.d.ts +49 -0
  67. package/dist/standalone/host-types.js +1 -0
  68. package/dist/standalone/inspect-helper.d.ts +6 -0
  69. package/dist/standalone/inspect-helper.js +93 -0
  70. package/dist/standalone/inspect-spk.d.ts +3 -1
  71. package/dist/standalone/inspect-spk.js +247 -5
  72. package/dist/standalone/job-diagnostics.d.ts +1 -0
  73. package/dist/standalone/job-diagnostics.js +49 -0
  74. package/dist/standalone/lifecycle-helper.d.ts +2 -0
  75. package/dist/standalone/lifecycle-helper.js +12 -0
  76. package/dist/standalone/lifecycle.d.ts +3 -0
  77. package/dist/standalone/lifecycle.js +63 -0
  78. package/dist/standalone/manifest.d.ts +17 -2
  79. package/dist/standalone/manifest.js +40 -6
  80. package/dist/standalone/native-layout.d.ts +74 -0
  81. package/dist/standalone/native-layout.js +318 -0
  82. package/dist/standalone/reopen-events.d.ts +2 -0
  83. package/dist/standalone/reopen-events.js +28 -0
  84. package/dist/standalone/resource.d.ts +11 -0
  85. package/dist/standalone/resource.js +13 -0
  86. package/dist/standalone/root-messages.js +9 -0
  87. package/dist/standalone/root-window.d.ts +6 -3
  88. package/dist/standalone/root-window.js +160 -30
  89. package/dist/standalone/shared-folder.d.ts +39 -0
  90. package/dist/standalone/shared-folder.js +141 -0
  91. package/dist/standalone/spk.d.ts +6 -3
  92. package/dist/standalone/spk.js +52 -35
  93. package/dist/standalone/worker-contract-json.d.ts +8 -0
  94. package/dist/standalone/worker-contract-json.js +141 -0
  95. package/dist/standalone/worker-contract.d.ts +189 -0
  96. package/dist/standalone/worker-contract.js +175 -0
  97. package/dist/standalone/worker-registry.d.ts +40 -0
  98. package/dist/standalone/worker-registry.js +167 -0
  99. package/dist/template-paths.d.ts +2 -0
  100. package/dist/template-paths.js +9 -0
  101. package/dist/templates/_daemon/fixture_linux_test.go +15 -0
  102. package/dist/templates/_daemon/fixture_other_test.go +7 -0
  103. package/dist/templates/_daemon/go.mod +5 -0
  104. package/dist/templates/_daemon/main.go +608 -0
  105. package/dist/templates/_daemon/main_test.go +242 -0
  106. package/dist/templates/_daemon/process_linux.go +55 -0
  107. package/dist/templates/_daemon/process_linux_test.go +161 -0
  108. package/dist/templates/_daemon/process_other.go +14 -0
  109. package/dist/templates/_daemon/testdata/child.go +41 -0
  110. package/dist/templates/_gateway/auth.go +101 -0
  111. package/dist/templates/_gateway/auth_test.go +216 -0
  112. package/dist/templates/_gateway/cgi.go +133 -0
  113. package/dist/templates/_gateway/cgi_test.go +156 -0
  114. package/dist/templates/_gateway/csrf.go +73 -0
  115. package/dist/templates/_gateway/csrf_test.go +155 -0
  116. package/dist/templates/_gateway/directory.go +108 -0
  117. package/dist/templates/_gateway/directory_test.go +202 -0
  118. package/dist/templates/_gateway/gateway.go +412 -0
  119. package/dist/templates/_gateway/gateway_test.go +676 -0
  120. package/dist/templates/_gateway/go.mod +3 -0
  121. package/dist/templates/_gateway/groups.go +66 -0
  122. package/dist/templates/_gateway/main.go +45 -0
  123. package/dist/templates/_shared/GO-LICENSE +27 -0
  124. package/dist/templates/_shared/GO-PATENTS +22 -0
  125. package/dist/templates/_shared/LICENSES/TEMPLATE.txt +21 -0
  126. package/dist/templates/_shared/notice-overrides/index.json +14 -0
  127. package/dist/templates/_shared/notice-overrides/utils-0.4.2-LICENSE +21 -0
  128. package/dist/templates/_shared/notice-overrides/utils-0.5.0-LICENSE +21 -0
  129. package/dist/templates/_shared/third-party-notices.mjs +51 -0
  130. package/dist/templates/binary/synology-app.yaml +1 -1
  131. package/dist/templates/compose-import/compose.yaml +1 -1
  132. package/dist/templates/compose-import/synology-app.yaml +1 -1
  133. package/dist/templates/hello-files/compose.yaml +1 -1
  134. package/dist/templates/hello-files/synology-app.yaml +1 -1
  135. package/dist/templates/hello-web/compose.yaml +5 -2
  136. package/dist/templates/hello-web/synology-app.yaml +4 -1
  137. package/dist/templates/hello-web-page/compose.yaml +5 -2
  138. package/dist/templates/hello-web-page/synology-app.yaml +4 -1
  139. package/dist/templates/native-go/README.md +149 -4
  140. package/dist/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +61 -0
  141. package/dist/templates/native-go/backend/cmd/app/main.go +17 -0
  142. package/dist/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
  143. package/dist/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  144. package/dist/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
  145. package/dist/templates/native-go/backend/cmd/helper/main.go +10 -1
  146. package/dist/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  147. package/dist/templates/native-go/backend/go.mod +7 -1
  148. package/dist/templates/native-go/backend/go.sum +4 -0
  149. package/dist/templates/native-go/backend/internal/api/binary.go +154 -0
  150. package/dist/templates/native-go/backend/internal/api/binary_test.go +165 -0
  151. package/dist/templates/native-go/backend/internal/api/registry.go +28 -7
  152. package/dist/templates/native-go/backend/internal/api/server.go +11 -1
  153. package/dist/templates/native-go/backend/internal/app/background.go +270 -0
  154. package/dist/templates/native-go/backend/internal/app/background_none.go +8 -0
  155. package/dist/templates/native-go/backend/internal/app/background_owner.go +59 -0
  156. package/dist/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  157. package/dist/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  158. package/dist/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  159. package/dist/templates/native-go/backend/internal/app/background_test.go +346 -0
  160. package/dist/templates/native-go/backend/internal/app/integration_state.go +16 -0
  161. package/dist/templates/native-go/backend/internal/app/migrations.go +41 -0
  162. package/dist/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  163. package/dist/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +129 -0
  164. package/dist/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
  165. package/dist/templates/native-go/backend/internal/app/routes.go +28 -3
  166. package/dist/templates/native-go/backend/internal/app/routes_test.go +27 -5
  167. package/dist/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  168. package/dist/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  169. package/dist/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
  170. package/dist/templates/native-go/backend/internal/app/session_files.go +15 -0
  171. package/dist/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  172. package/dist/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  173. package/dist/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  174. package/dist/templates/native-go/backend/internal/background/access.go +57 -0
  175. package/dist/templates/native-go/backend/internal/background/owner_test.go +126 -0
  176. package/dist/templates/native-go/backend/internal/background/runner.go +185 -0
  177. package/dist/templates/native-go/backend/internal/background/runner_test.go +209 -0
  178. package/dist/templates/native-go/backend/internal/background/schedule.go +300 -0
  179. package/dist/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  180. package/dist/templates/native-go/backend/internal/background/store.go +807 -0
  181. package/dist/templates/native-go/backend/internal/background/store_test.go +407 -0
  182. package/dist/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  183. package/dist/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  184. package/dist/templates/native-go/backend/internal/dsmprobe/collector_linux.go +335 -0
  185. package/dist/templates/native-go/backend/internal/dsmprobe/collector_linux_test.go +41 -0
  186. package/dist/templates/native-go/backend/internal/dsmprobe/protocol.go +179 -0
  187. package/dist/templates/native-go/backend/internal/dsmprobe/protocol_test.go +29 -0
  188. package/dist/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  189. package/dist/templates/native-go/backend/internal/filestation/client.go +251 -0
  190. package/dist/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  191. package/dist/templates/native-go/backend/internal/filestation/doc.go +4 -0
  192. package/dist/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  193. package/dist/templates/native-go/backend/internal/filestation/repository.go +207 -0
  194. package/dist/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  195. package/dist/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  196. package/dist/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  197. package/dist/templates/native-go/backend/internal/filestation/service.go +254 -0
  198. package/dist/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  199. package/dist/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  200. package/dist/templates/native-go/backend/internal/filestation/write.go +72 -0
  201. package/dist/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  202. package/dist/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  203. package/dist/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  204. package/dist/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  205. package/dist/templates/native-go/backend/internal/helper/cohort.go +393 -0
  206. package/dist/templates/native-go/backend/internal/helper/cohort_publication.go +18 -0
  207. package/dist/templates/native-go/backend/internal/helper/cohort_publication_test.go +105 -0
  208. package/dist/templates/native-go/backend/internal/helper/cohort_test.go +372 -0
  209. package/dist/templates/native-go/backend/internal/helper/control.go +226 -21
  210. package/dist/templates/native-go/backend/internal/helper/control_test.go +10 -2
  211. package/dist/templates/native-go/backend/internal/helper/data_contract.go +245 -0
  212. package/dist/templates/native-go/backend/internal/helper/data_contract_test.go +51 -0
  213. package/dist/templates/native-go/backend/internal/helper/data_decode.go +184 -0
  214. package/dist/templates/native-go/backend/internal/helper/data_decode_pointer_test.go +30 -0
  215. package/dist/templates/native-go/backend/internal/helper/data_protocol.go +419 -0
  216. package/dist/templates/native-go/backend/internal/helper/data_protocol_test.go +449 -0
  217. package/dist/templates/native-go/backend/internal/helper/dsm_acl_linux.go +139 -0
  218. package/dist/templates/native-go/backend/internal/helper/dsm_acl_linux_test.go +121 -0
  219. package/dist/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux.go +95 -0
  220. package/dist/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux_test.go +56 -0
  221. package/dist/templates/native-go/backend/internal/helper/dsm_bridge_linux.go +144 -0
  222. package/dist/templates/native-go/backend/internal/helper/dsm_bridge_linux_test.go +89 -0
  223. package/dist/templates/native-go/backend/internal/helper/dsm_home_linux.go +107 -0
  224. package/dist/templates/native-go/backend/internal/helper/dsm_home_linux_test.go +82 -0
  225. package/dist/templates/native-go/backend/internal/helper/dsm_probe_transport_linux.go +151 -0
  226. package/dist/templates/native-go/backend/internal/helper/dsm_probe_transport_linux_test.go +66 -0
  227. package/dist/templates/native-go/backend/internal/helper/grant_authority.go +519 -0
  228. package/dist/templates/native-go/backend/internal/helper/grant_authority_contract.go +88 -0
  229. package/dist/templates/native-go/backend/internal/helper/grant_authority_test.go +510 -0
  230. package/dist/templates/native-go/backend/internal/helper/grant_cohort.go +389 -0
  231. package/dist/templates/native-go/backend/internal/helper/grant_cohort_test.go +239 -0
  232. package/dist/templates/native-go/backend/internal/helper/grant_delivery.go +49 -0
  233. package/dist/templates/native-go/backend/internal/helper/grant_delivery_methods.go +273 -0
  234. package/dist/templates/native-go/backend/internal/helper/grant_delivery_test.go +322 -0
  235. package/dist/templates/native-go/backend/internal/helper/grant_operation_contract.go +47 -0
  236. package/dist/templates/native-go/backend/internal/helper/grant_readonly_test.go +180 -0
  237. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux.go +416 -0
  238. package/dist/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +469 -0
  239. package/dist/templates/native-go/backend/internal/helper/grant_rpc.go +147 -0
  240. package/dist/templates/native-go/backend/internal/helper/grant_rpc_test.go +51 -0
  241. package/dist/templates/native-go/backend/internal/helper/grant_snapshot.go +78 -0
  242. package/dist/templates/native-go/backend/internal/helper/grant_supervisor_linux.go +134 -0
  243. package/dist/templates/native-go/backend/internal/helper/grant_supervisor_linux_test.go +254 -0
  244. package/dist/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  245. package/dist/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  246. package/dist/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  247. package/dist/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  248. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  249. package/dist/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  250. package/dist/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  251. package/dist/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  252. package/dist/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  253. package/dist/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  254. package/dist/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  255. package/dist/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  256. package/dist/templates/native-go/backend/internal/helper/lease.go +112 -0
  257. package/dist/templates/native-go/backend/internal/helper/lease_linux.go +44 -0
  258. package/dist/templates/native-go/backend/internal/helper/lease_other.go +8 -0
  259. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  260. package/dist/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  261. package/dist/templates/native-go/backend/internal/helper/lifecycle.go +234 -0
  262. package/dist/templates/native-go/backend/internal/helper/lifecycle_test.go +473 -0
  263. package/dist/templates/native-go/backend/internal/helper/managed_pilot.go +284 -0
  264. package/dist/templates/native-go/backend/internal/helper/managed_pilot_repository_linux.go +74 -0
  265. package/dist/templates/native-go/backend/internal/helper/managed_pilot_repository_linux_test.go +40 -0
  266. package/dist/templates/native-go/backend/internal/helper/managed_pilot_test.go +210 -0
  267. package/dist/templates/native-go/backend/internal/helper/management.go +79 -0
  268. package/dist/templates/native-go/backend/internal/helper/nas_shipped_refusal_linux_test.go +97 -0
  269. package/dist/templates/native-go/backend/internal/helper/native_discovery.go +79 -0
  270. package/dist/templates/native-go/backend/internal/helper/native_identity.go +89 -0
  271. package/dist/templates/native-go/backend/internal/helper/native_provider.go +159 -0
  272. package/dist/templates/native-go/backend/internal/helper/native_provider_test.go +421 -0
  273. package/dist/templates/native-go/backend/internal/helper/observation.go +244 -0
  274. package/dist/templates/native-go/backend/internal/helper/observation_health_test.go +127 -0
  275. package/dist/templates/native-go/backend/internal/helper/observation_reload_budget_test.go +117 -0
  276. package/dist/templates/native-go/backend/internal/helper/observation_test.go +196 -0
  277. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic.go +155 -0
  278. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux.go +76 -0
  279. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +130 -0
  280. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
  281. package/dist/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  282. package/dist/templates/native-go/backend/internal/helper/operation_bootstrap_linux.go +193 -0
  283. package/dist/templates/native-go/backend/internal/helper/operation_credentials_linux.go +56 -0
  284. package/dist/templates/native-go/backend/internal/helper/operation_linux.go +480 -0
  285. package/dist/templates/native-go/backend/internal/helper/operation_linux_test.go +528 -0
  286. package/dist/templates/native-go/backend/internal/helper/process_linux.go +14 -1
  287. package/dist/templates/native-go/backend/internal/helper/publication_test.go +178 -0
  288. package/dist/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  289. package/dist/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  290. package/dist/templates/native-go/backend/internal/helper/read_stream_cohort_linux_test.go +156 -0
  291. package/dist/templates/native-go/backend/internal/helper/read_transfer.go +40 -0
  292. package/dist/templates/native-go/backend/internal/helper/read_transfer_linux.go +109 -0
  293. package/dist/templates/native-go/backend/internal/helper/read_transfer_linux_test.go +118 -0
  294. package/dist/templates/native-go/backend/internal/helper/read_transfer_test.go +177 -0
  295. package/dist/templates/native-go/backend/internal/helper/readonly.go +105 -0
  296. package/dist/templates/native-go/backend/internal/helper/readonly_admission.go +85 -0
  297. package/dist/templates/native-go/backend/internal/helper/readonly_cohort_linux_test.go +253 -0
  298. package/dist/templates/native-go/backend/internal/helper/readonly_linux_test.go +378 -0
  299. package/dist/templates/native-go/backend/internal/helper/readonly_mount_linux.go +65 -0
  300. package/dist/templates/native-go/backend/internal/helper/readonly_mount_proxy_linux.go +113 -0
  301. package/dist/templates/native-go/backend/internal/helper/readonly_operations_linux.go +168 -0
  302. package/dist/templates/native-go/backend/internal/helper/readonly_resolver_linux.go +241 -0
  303. package/dist/templates/native-go/backend/internal/helper/readonly_test.go +40 -0
  304. package/dist/templates/native-go/backend/internal/helper/relaxed_identity.go +252 -0
  305. package/dist/templates/native-go/backend/internal/helper/relaxed_identity_contract.go +105 -0
  306. package/dist/templates/native-go/backend/internal/helper/relaxed_identity_test.go +406 -0
  307. package/dist/templates/native-go/backend/internal/helper/relaxed_invalidation.go +203 -0
  308. package/dist/templates/native-go/backend/internal/helper/repair.go +132 -0
  309. package/dist/templates/native-go/backend/internal/helper/repair_test.go +271 -0
  310. package/dist/templates/native-go/backend/internal/helper/s1r_actor_acl_linux_test.go +303 -0
  311. package/dist/templates/native-go/backend/internal/helper/s1r_actor_fixture_linux_test.go +184 -0
  312. package/dist/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +250 -0
  313. package/dist/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
  314. package/dist/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  315. package/dist/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  316. package/dist/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  317. package/dist/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  318. package/dist/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  319. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  320. package/dist/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  321. package/dist/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  322. package/dist/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  323. package/dist/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  324. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  325. package/dist/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  326. package/dist/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  327. package/dist/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  328. package/dist/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  329. package/dist/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  330. package/dist/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  331. package/dist/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  332. package/dist/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  333. package/dist/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  334. package/dist/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  335. package/dist/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  336. package/dist/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  337. package/dist/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  338. package/dist/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  339. package/dist/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  340. package/dist/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  341. package/dist/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  342. package/dist/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  343. package/dist/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  344. package/dist/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  345. package/dist/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  346. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  347. package/dist/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  348. package/dist/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  349. package/dist/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  350. package/dist/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  351. package/dist/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  352. package/dist/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  353. package/dist/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  354. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  355. package/dist/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  356. package/dist/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
  357. package/dist/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  358. package/dist/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  359. package/dist/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  360. package/dist/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  361. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  362. package/dist/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  363. package/dist/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  364. package/dist/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  365. package/dist/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  366. package/dist/templates/native-go/backend/internal/helper/server_linux.go +47 -3
  367. package/dist/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  368. package/dist/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  369. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  370. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  371. package/dist/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  372. package/dist/templates/native-go/backend/internal/helper/status.go +83 -11
  373. package/dist/templates/native-go/backend/internal/helper/status_test.go +128 -0
  374. package/dist/templates/native-go/backend/internal/helper/supervision.go +28 -5
  375. package/dist/templates/native-go/backend/internal/helper/supervisor_frame.go +79 -0
  376. package/dist/templates/native-go/backend/internal/helper/supervisor_frame_linux_test.go +69 -0
  377. package/dist/templates/native-go/backend/internal/helper/supervisor_frame_test.go +107 -0
  378. package/dist/templates/native-go/backend/internal/helper/supervisor_linux.go +191 -16
  379. package/dist/templates/native-go/backend/internal/helper/supervisor_linux_test.go +618 -7
  380. package/dist/templates/native-go/backend/internal/helper/supervisor_socket_eof_test.go +74 -0
  381. package/dist/templates/native-go/backend/internal/helper/supervisor_socket_test.go +45 -0
  382. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/create.json +23 -0
  383. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/frames.json +67 -0
  384. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/grant-store.json +52 -0
  385. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/intent.json +20 -0
  386. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/list.json +20 -0
  387. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/publish.json +20 -0
  388. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/read.json +22 -0
  389. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/stat.json +22 -0
  390. package/dist/templates/native-go/backend/internal/helper/testdata/protocol2/write-stream.json +22 -0
  391. package/dist/templates/native-go/backend/internal/helper/unit_connection.go +75 -0
  392. package/dist/templates/native-go/backend/internal/helper/unit_connection_linux_test.go +135 -0
  393. package/dist/templates/native-go/backend/internal/helper/unit_connection_test.go +151 -0
  394. package/dist/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
  395. package/dist/templates/native-go/backend/internal/helper/unit_linux.go +368 -0
  396. package/dist/templates/native-go/backend/internal/helper/unit_linux_test.go +46 -0
  397. package/dist/templates/native-go/backend/internal/helper/unit_mechanisms_linux_test.go +217 -0
  398. package/dist/templates/native-go/backend/internal/helper/unit_padding_linux_test.go +178 -0
  399. package/dist/templates/native-go/backend/internal/helper/unit_query_linux.go +115 -0
  400. package/dist/templates/native-go/backend/internal/helper/unit_reload_linux_test.go +372 -0
  401. package/dist/templates/native-go/backend/internal/helper/unit_reload_sequence_linux_test.go +232 -0
  402. package/dist/templates/native-go/backend/internal/helper/write.go +77 -0
  403. package/dist/templates/native-go/backend/internal/helper/write_admission.go +260 -0
  404. package/dist/templates/native-go/backend/internal/helper/write_admission_test.go +135 -0
  405. package/dist/templates/native-go/backend/internal/helper/write_cohort_linux_test.go +218 -0
  406. package/dist/templates/native-go/backend/internal/helper/write_files_linux.go +205 -0
  407. package/dist/templates/native-go/backend/internal/helper/write_files_linux_test.go +225 -0
  408. package/dist/templates/native-go/backend/internal/helper/write_intent_linux.go +116 -0
  409. package/dist/templates/native-go/backend/internal/helper/write_intent_linux_test.go +74 -0
  410. package/dist/templates/native-go/backend/internal/helper/write_operation_linux.go +245 -0
  411. package/dist/templates/native-go/backend/internal/helper/write_test.go +53 -0
  412. package/dist/templates/native-go/dsm-package.yaml +1 -1
  413. package/dist/templates/native-go/ui/app.js +8 -1
  414. package/dist/templates/native-go-background/BACKGROUND.md +111 -0
  415. package/dist/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  416. package/dist/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  417. package/dist/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  418. package/dist/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  419. package/dist/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  420. package/dist/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  421. package/dist/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  422. package/dist/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  423. package/dist/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  424. package/dist/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  425. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  426. package/dist/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  427. package/dist/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  428. package/dist/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  429. package/dist/templates/native-go-background/frontend/test/background.test.ts +179 -0
  430. package/dist/templates/native-go-better-auth/node/build.mjs +2 -0
  431. package/dist/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  432. package/dist/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  433. package/dist/templates/native-go-vue/README.md +151 -6
  434. package/dist/templates/native-go-vue/frontend/DESIGN.md +16 -4
  435. package/dist/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  436. package/dist/templates/native-go-vue/frontend/README-M2.md +64 -0
  437. package/dist/templates/native-go-vue/frontend/package-lock.json +137 -233
  438. package/dist/templates/native-go-vue/frontend/package.json +2 -2
  439. package/dist/templates/native-go-vue/frontend/src/App.vue +71 -16
  440. package/dist/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  441. package/dist/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  442. package/dist/templates/native-go-vue/frontend/src/context.ts +41 -2
  443. package/dist/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  444. package/dist/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  445. package/dist/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  446. package/dist/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  447. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  448. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  449. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  450. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  451. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  452. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  453. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  454. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  455. package/dist/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  456. package/dist/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  457. package/dist/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  458. package/dist/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  459. package/dist/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  460. package/dist/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  461. package/dist/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  462. package/dist/templates/native-go-vue/frontend/src/main.ts +4 -1
  463. package/dist/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  464. package/dist/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  465. package/dist/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  466. package/dist/templates/native-go-vue/frontend/src/nas/NasGrantSettings.vue +74 -0
  467. package/dist/templates/native-go-vue/frontend/src/nas/NasPathPicker.vue +106 -0
  468. package/dist/templates/native-go-vue/frontend/src/nas/NasUnavailable.vue +20 -0
  469. package/dist/templates/native-go-vue/frontend/src/nas/i18n/de.json +74 -0
  470. package/dist/templates/native-go-vue/frontend/src/nas/i18n/en.json +74 -0
  471. package/dist/templates/native-go-vue/frontend/src/nas/i18n/es.json +74 -0
  472. package/dist/templates/native-go-vue/frontend/src/nas/i18n/fr.json +74 -0
  473. package/dist/templates/native-go-vue/frontend/src/nas/i18n/it.json +74 -0
  474. package/dist/templates/native-go-vue/frontend/src/nas/i18n/ja.json +74 -0
  475. package/dist/templates/native-go-vue/frontend/src/nas/i18n/ko.json +74 -0
  476. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  477. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  478. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  479. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  480. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  481. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  482. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  483. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  484. package/dist/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  485. package/dist/templates/native-go-vue/frontend/src/nas/i18n/zh-CN.json +74 -0
  486. package/dist/templates/native-go-vue/frontend/src/nas/i18n/zh-TW.json +74 -0
  487. package/dist/templates/native-go-vue/frontend/src/nas/i18n.ts +38 -0
  488. package/dist/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  489. package/dist/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  490. package/dist/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  491. package/dist/templates/native-go-vue/frontend/src/nas/mock-provider.ts +119 -0
  492. package/dist/templates/native-go-vue/frontend/src/nas/provider.ts +59 -0
  493. package/dist/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  494. package/dist/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
  495. package/dist/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  496. package/dist/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  497. package/dist/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  498. package/dist/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  499. package/dist/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  500. package/dist/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  501. package/dist/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  502. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  503. package/dist/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  504. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  505. package/dist/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  506. package/dist/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  507. package/dist/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  508. package/dist/templates/native-go-vue/frontend/src/style.css +19 -6
  509. package/dist/templates/native-go-vue/frontend/test/apps.test.ts +65 -2
  510. package/dist/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  511. package/dist/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  512. package/dist/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  513. package/dist/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  514. package/dist/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  515. package/dist/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  516. package/dist/templates/native-go-vue/frontend/test/nas-provider.test.ts +81 -0
  517. package/dist/templates/native-go-vue/frontend/test/nas-request.test.ts +21 -0
  518. package/dist/templates/native-go-vue/frontend/test/nas-ui.test.ts +261 -0
  519. package/dist/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  520. package/dist/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  521. package/dist/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  522. package/dist/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  523. package/dist/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  524. package/dist/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  525. package/dist/templates/native-go-vue/frontend/tsconfig.json +1 -1
  526. package/dist/templates/native-go-vue/frontend/vite.config.ts +8 -6
  527. package/dist/validate.js +6 -3
  528. package/package.json +3 -2
  529. package/schema/synology-app.schema.json +19 -0
  530. package/skills/reference/create.md +4 -0
  531. package/templates/_daemon/fixture_linux_test.go +15 -0
  532. package/templates/_daemon/fixture_other_test.go +7 -0
  533. package/templates/_daemon/go.mod +5 -0
  534. package/templates/_daemon/main.go +608 -0
  535. package/templates/_daemon/main_test.go +242 -0
  536. package/templates/_daemon/process_linux.go +55 -0
  537. package/templates/_daemon/process_linux_test.go +161 -0
  538. package/templates/_daemon/process_other.go +14 -0
  539. package/templates/_daemon/testdata/child.go +41 -0
  540. package/templates/_gateway/auth.go +101 -0
  541. package/templates/_gateway/auth_test.go +216 -0
  542. package/templates/_gateway/cgi.go +133 -0
  543. package/templates/_gateway/cgi_test.go +156 -0
  544. package/templates/_gateway/csrf.go +73 -0
  545. package/templates/_gateway/csrf_test.go +155 -0
  546. package/templates/_gateway/directory.go +108 -0
  547. package/templates/_gateway/directory_test.go +202 -0
  548. package/templates/_gateway/gateway.go +412 -0
  549. package/templates/_gateway/gateway_test.go +676 -0
  550. package/templates/_gateway/go.mod +3 -0
  551. package/templates/_gateway/groups.go +66 -0
  552. package/templates/_gateway/main.go +45 -0
  553. package/templates/_shared/GO-LICENSE +27 -0
  554. package/templates/_shared/GO-PATENTS +22 -0
  555. package/templates/_shared/LICENSES/TEMPLATE.txt +21 -0
  556. package/templates/_shared/notice-overrides/index.json +14 -0
  557. package/templates/_shared/notice-overrides/utils-0.4.2-LICENSE +21 -0
  558. package/templates/_shared/notice-overrides/utils-0.5.0-LICENSE +21 -0
  559. package/templates/_shared/third-party-notices.mjs +51 -0
  560. package/templates/binary/synology-app.yaml +1 -1
  561. package/templates/compose-import/compose.yaml +1 -1
  562. package/templates/compose-import/synology-app.yaml +1 -1
  563. package/templates/hello-files/compose.yaml +1 -1
  564. package/templates/hello-files/synology-app.yaml +1 -1
  565. package/templates/hello-web/compose.yaml +5 -2
  566. package/templates/hello-web/synology-app.yaml +4 -1
  567. package/templates/hello-web-page/compose.yaml +5 -2
  568. package/templates/hello-web-page/synology-app.yaml +4 -1
  569. package/templates/native-go/README.md +149 -4
  570. package/templates/native-go/backend/THIRD_PARTY_NOTICES.txt +61 -0
  571. package/templates/native-go/backend/cmd/app/main.go +17 -0
  572. package/templates/native-go/backend/cmd/app/sdk_main.go +60 -0
  573. package/templates/native-go/backend/cmd/background-worker/main.go +38 -0
  574. package/templates/native-go/backend/cmd/dsm-readonly-probe/main_linux.go +46 -0
  575. package/templates/native-go/backend/cmd/helper/main.go +10 -1
  576. package/templates/native-go/backend/cmd/helper/sdk_registry.go +19 -0
  577. package/templates/native-go/backend/go.mod +7 -1
  578. package/templates/native-go/backend/go.sum +4 -0
  579. package/templates/native-go/backend/internal/api/binary.go +154 -0
  580. package/templates/native-go/backend/internal/api/binary_test.go +165 -0
  581. package/templates/native-go/backend/internal/api/registry.go +28 -7
  582. package/templates/native-go/backend/internal/api/server.go +11 -1
  583. package/templates/native-go/backend/internal/app/background.go +270 -0
  584. package/templates/native-go/backend/internal/app/background_none.go +8 -0
  585. package/templates/native-go/backend/internal/app/background_owner.go +59 -0
  586. package/templates/native-go/backend/internal/app/background_owner_test.go +145 -0
  587. package/templates/native-go/backend/internal/app/background_schedule.go +74 -0
  588. package/templates/native-go/backend/internal/app/background_schedule_test.go +62 -0
  589. package/templates/native-go/backend/internal/app/background_test.go +346 -0
  590. package/templates/native-go/backend/internal/app/integration_state.go +16 -0
  591. package/templates/native-go/backend/internal/app/migrations.go +41 -0
  592. package/templates/native-go/backend/internal/app/migrations_test.go +41 -0
  593. package/templates/native-go/backend/internal/app/nas_cgi_artifact_test.go +129 -0
  594. package/templates/native-go/backend/internal/app/nas_refusal_test.go +46 -0
  595. package/templates/native-go/backend/internal/app/routes.go +28 -3
  596. package/templates/native-go/backend/internal/app/routes_test.go +27 -5
  597. package/templates/native-go/backend/internal/app/sdk_jobs.go +70 -0
  598. package/templates/native-go/backend/internal/app/sdk_jobs_test.go +116 -0
  599. package/templates/native-go/backend/internal/app/sdk_routes.go +174 -0
  600. package/templates/native-go/backend/internal/app/session_files.go +15 -0
  601. package/templates/native-go/backend/internal/app/session_files_test.go +26 -0
  602. package/templates/native-go/backend/internal/app/shared_folder.go +144 -0
  603. package/templates/native-go/backend/internal/app/shared_folder_test.go +158 -0
  604. package/templates/native-go/backend/internal/background/access.go +57 -0
  605. package/templates/native-go/backend/internal/background/owner_test.go +126 -0
  606. package/templates/native-go/backend/internal/background/runner.go +185 -0
  607. package/templates/native-go/backend/internal/background/runner_test.go +209 -0
  608. package/templates/native-go/backend/internal/background/schedule.go +300 -0
  609. package/templates/native-go/backend/internal/background/schedule_test.go +335 -0
  610. package/templates/native-go/backend/internal/background/store.go +807 -0
  611. package/templates/native-go/backend/internal/background/store_test.go +407 -0
  612. package/templates/native-go/backend/internal/datamigrate/migrate.go +191 -0
  613. package/templates/native-go/backend/internal/datamigrate/migrate_test.go +177 -0
  614. package/templates/native-go/backend/internal/dsmprobe/collector_linux.go +335 -0
  615. package/templates/native-go/backend/internal/dsmprobe/collector_linux_test.go +41 -0
  616. package/templates/native-go/backend/internal/dsmprobe/protocol.go +179 -0
  617. package/templates/native-go/backend/internal/dsmprobe/protocol_test.go +29 -0
  618. package/templates/native-go/backend/internal/filestation/browse_test.go +67 -0
  619. package/templates/native-go/backend/internal/filestation/client.go +251 -0
  620. package/templates/native-go/backend/internal/filestation/client_test.go +155 -0
  621. package/templates/native-go/backend/internal/filestation/doc.go +4 -0
  622. package/templates/native-go/backend/internal/filestation/read_file_test.go +90 -0
  623. package/templates/native-go/backend/internal/filestation/repository.go +207 -0
  624. package/templates/native-go/backend/internal/filestation/repository_test.go +104 -0
  625. package/templates/native-go/backend/internal/filestation/sdk_session.go +241 -0
  626. package/templates/native-go/backend/internal/filestation/sdk_session_test.go +183 -0
  627. package/templates/native-go/backend/internal/filestation/service.go +254 -0
  628. package/templates/native-go/backend/internal/filestation/service_test.go +94 -0
  629. package/templates/native-go/backend/internal/filestation/session_semantics_test.go +383 -0
  630. package/templates/native-go/backend/internal/filestation/write.go +72 -0
  631. package/templates/native-go/backend/internal/filestation/write_test.go +123 -0
  632. package/templates/native-go/backend/internal/helper/background_proof.go +163 -0
  633. package/templates/native-go/backend/internal/helper/background_proof_contract.go +46 -0
  634. package/templates/native-go/backend/internal/helper/background_proof_test.go +161 -0
  635. package/templates/native-go/backend/internal/helper/cohort.go +393 -0
  636. package/templates/native-go/backend/internal/helper/cohort_publication.go +18 -0
  637. package/templates/native-go/backend/internal/helper/cohort_publication_test.go +105 -0
  638. package/templates/native-go/backend/internal/helper/cohort_test.go +372 -0
  639. package/templates/native-go/backend/internal/helper/control.go +226 -21
  640. package/templates/native-go/backend/internal/helper/control_test.go +10 -2
  641. package/templates/native-go/backend/internal/helper/data_contract.go +245 -0
  642. package/templates/native-go/backend/internal/helper/data_contract_test.go +51 -0
  643. package/templates/native-go/backend/internal/helper/data_decode.go +184 -0
  644. package/templates/native-go/backend/internal/helper/data_decode_pointer_test.go +30 -0
  645. package/templates/native-go/backend/internal/helper/data_protocol.go +419 -0
  646. package/templates/native-go/backend/internal/helper/data_protocol_test.go +449 -0
  647. package/templates/native-go/backend/internal/helper/dsm_acl_linux.go +139 -0
  648. package/templates/native-go/backend/internal/helper/dsm_acl_linux_test.go +121 -0
  649. package/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux.go +95 -0
  650. package/templates/native-go/backend/internal/helper/dsm_acl_syscall_linux_test.go +56 -0
  651. package/templates/native-go/backend/internal/helper/dsm_bridge_linux.go +144 -0
  652. package/templates/native-go/backend/internal/helper/dsm_bridge_linux_test.go +89 -0
  653. package/templates/native-go/backend/internal/helper/dsm_home_linux.go +107 -0
  654. package/templates/native-go/backend/internal/helper/dsm_home_linux_test.go +82 -0
  655. package/templates/native-go/backend/internal/helper/dsm_probe_transport_linux.go +151 -0
  656. package/templates/native-go/backend/internal/helper/dsm_probe_transport_linux_test.go +66 -0
  657. package/templates/native-go/backend/internal/helper/grant_authority.go +519 -0
  658. package/templates/native-go/backend/internal/helper/grant_authority_contract.go +88 -0
  659. package/templates/native-go/backend/internal/helper/grant_authority_test.go +510 -0
  660. package/templates/native-go/backend/internal/helper/grant_cohort.go +389 -0
  661. package/templates/native-go/backend/internal/helper/grant_cohort_test.go +239 -0
  662. package/templates/native-go/backend/internal/helper/grant_delivery.go +49 -0
  663. package/templates/native-go/backend/internal/helper/grant_delivery_methods.go +273 -0
  664. package/templates/native-go/backend/internal/helper/grant_delivery_test.go +322 -0
  665. package/templates/native-go/backend/internal/helper/grant_operation_contract.go +47 -0
  666. package/templates/native-go/backend/internal/helper/grant_readonly_test.go +180 -0
  667. package/templates/native-go/backend/internal/helper/grant_repository_linux.go +416 -0
  668. package/templates/native-go/backend/internal/helper/grant_repository_linux_test.go +469 -0
  669. package/templates/native-go/backend/internal/helper/grant_rpc.go +147 -0
  670. package/templates/native-go/backend/internal/helper/grant_rpc_test.go +51 -0
  671. package/templates/native-go/backend/internal/helper/grant_snapshot.go +78 -0
  672. package/templates/native-go/backend/internal/helper/grant_supervisor_linux.go +134 -0
  673. package/templates/native-go/backend/internal/helper/grant_supervisor_linux_test.go +254 -0
  674. package/templates/native-go/backend/internal/helper/jobcontract/bindings.go +48 -0
  675. package/templates/native-go/backend/internal/helper/jobcontract/contract_test.go +436 -0
  676. package/templates/native-go/backend/internal/helper/jobcontract/decode.go +185 -0
  677. package/templates/native-go/backend/internal/helper/jobcontract/digest.go +55 -0
  678. package/templates/native-go/backend/internal/helper/jobcontract/registry.go +85 -0
  679. package/templates/native-go/backend/internal/helper/jobcontract/registry_test.go +73 -0
  680. package/templates/native-go/backend/internal/helper/jobcontract/result.go +53 -0
  681. package/templates/native-go/backend/internal/helper/jobcontract/stub.go +8 -0
  682. package/templates/native-go/backend/internal/helper/jobcontract/testdata/input-digests.json +127 -0
  683. package/templates/native-go/backend/internal/helper/jobcontract/types.go +234 -0
  684. package/templates/native-go/backend/internal/helper/jobcontract/types_test.go +29 -0
  685. package/templates/native-go/backend/internal/helper/jobcontract/validate.go +462 -0
  686. package/templates/native-go/backend/internal/helper/lease.go +112 -0
  687. package/templates/native-go/backend/internal/helper/lease_linux.go +44 -0
  688. package/templates/native-go/backend/internal/helper/lease_other.go +8 -0
  689. package/templates/native-go/backend/internal/helper/legacy_authority_schema_linux_test.go +34 -0
  690. package/templates/native-go/backend/internal/helper/legacy_authority_schema_test.go +6 -0
  691. package/templates/native-go/backend/internal/helper/lifecycle.go +234 -0
  692. package/templates/native-go/backend/internal/helper/lifecycle_test.go +473 -0
  693. package/templates/native-go/backend/internal/helper/managed_pilot.go +284 -0
  694. package/templates/native-go/backend/internal/helper/managed_pilot_repository_linux.go +74 -0
  695. package/templates/native-go/backend/internal/helper/managed_pilot_repository_linux_test.go +40 -0
  696. package/templates/native-go/backend/internal/helper/managed_pilot_test.go +210 -0
  697. package/templates/native-go/backend/internal/helper/management.go +79 -0
  698. package/templates/native-go/backend/internal/helper/nas_shipped_refusal_linux_test.go +97 -0
  699. package/templates/native-go/backend/internal/helper/native_discovery.go +79 -0
  700. package/templates/native-go/backend/internal/helper/native_identity.go +89 -0
  701. package/templates/native-go/backend/internal/helper/native_provider.go +159 -0
  702. package/templates/native-go/backend/internal/helper/native_provider_test.go +421 -0
  703. package/templates/native-go/backend/internal/helper/observation.go +244 -0
  704. package/templates/native-go/backend/internal/helper/observation_health_test.go +127 -0
  705. package/templates/native-go/backend/internal/helper/observation_reload_budget_test.go +117 -0
  706. package/templates/native-go/backend/internal/helper/observation_test.go +196 -0
  707. package/templates/native-go/backend/internal/helper/observer_diagnostic.go +155 -0
  708. package/templates/native-go/backend/internal/helper/observer_diagnostic_linux.go +76 -0
  709. package/templates/native-go/backend/internal/helper/observer_diagnostic_linux_test.go +130 -0
  710. package/templates/native-go/backend/internal/helper/observer_diagnostic_test.go +98 -0
  711. package/templates/native-go/backend/internal/helper/observer_diagnostic_writer.go +40 -0
  712. package/templates/native-go/backend/internal/helper/operation_bootstrap_linux.go +193 -0
  713. package/templates/native-go/backend/internal/helper/operation_credentials_linux.go +56 -0
  714. package/templates/native-go/backend/internal/helper/operation_linux.go +480 -0
  715. package/templates/native-go/backend/internal/helper/operation_linux_test.go +528 -0
  716. package/templates/native-go/backend/internal/helper/process_linux.go +14 -1
  717. package/templates/native-go/backend/internal/helper/publication_test.go +178 -0
  718. package/templates/native-go/backend/internal/helper/query_deadline_linux_test.go +115 -0
  719. package/templates/native-go/backend/internal/helper/query_pending_diagnostic_test.go +254 -0
  720. package/templates/native-go/backend/internal/helper/read_stream_cohort_linux_test.go +156 -0
  721. package/templates/native-go/backend/internal/helper/read_transfer.go +40 -0
  722. package/templates/native-go/backend/internal/helper/read_transfer_linux.go +109 -0
  723. package/templates/native-go/backend/internal/helper/read_transfer_linux_test.go +118 -0
  724. package/templates/native-go/backend/internal/helper/read_transfer_test.go +177 -0
  725. package/templates/native-go/backend/internal/helper/readonly.go +105 -0
  726. package/templates/native-go/backend/internal/helper/readonly_admission.go +85 -0
  727. package/templates/native-go/backend/internal/helper/readonly_cohort_linux_test.go +253 -0
  728. package/templates/native-go/backend/internal/helper/readonly_linux_test.go +378 -0
  729. package/templates/native-go/backend/internal/helper/readonly_mount_linux.go +65 -0
  730. package/templates/native-go/backend/internal/helper/readonly_mount_proxy_linux.go +113 -0
  731. package/templates/native-go/backend/internal/helper/readonly_operations_linux.go +168 -0
  732. package/templates/native-go/backend/internal/helper/readonly_resolver_linux.go +241 -0
  733. package/templates/native-go/backend/internal/helper/readonly_test.go +40 -0
  734. package/templates/native-go/backend/internal/helper/relaxed_identity.go +252 -0
  735. package/templates/native-go/backend/internal/helper/relaxed_identity_contract.go +105 -0
  736. package/templates/native-go/backend/internal/helper/relaxed_identity_test.go +406 -0
  737. package/templates/native-go/backend/internal/helper/relaxed_invalidation.go +203 -0
  738. package/templates/native-go/backend/internal/helper/repair.go +132 -0
  739. package/templates/native-go/backend/internal/helper/repair_test.go +271 -0
  740. package/templates/native-go/backend/internal/helper/s1r_actor_acl_linux_test.go +303 -0
  741. package/templates/native-go/backend/internal/helper/s1r_actor_fixture_linux_test.go +184 -0
  742. package/templates/native-go/backend/internal/helper/s1r_actor_races_linux_test.go +250 -0
  743. package/templates/native-go/backend/internal/helper/s1r_fixture_contract_linux_test.go +18 -0
  744. package/templates/native-go/backend/internal/helper/sdk_assembly_linux.go +51 -0
  745. package/templates/native-go/backend/internal/helper/sdk_attach.go +83 -0
  746. package/templates/native-go/backend/internal/helper/sdk_attach_contract.go +32 -0
  747. package/templates/native-go/backend/internal/helper/sdk_attach_test.go +184 -0
  748. package/templates/native-go/backend/internal/helper/sdk_authority_schema_test.go +6 -0
  749. package/templates/native-go/backend/internal/helper/sdk_background_authority.go +832 -0
  750. package/templates/native-go/backend/internal/helper/sdk_background_authority_test.go +714 -0
  751. package/templates/native-go/backend/internal/helper/sdk_background_invalidation.go +218 -0
  752. package/templates/native-go/backend/internal/helper/sdk_background_lease.go +218 -0
  753. package/templates/native-go/backend/internal/helper/sdk_background_snapshot.go +110 -0
  754. package/templates/native-go/backend/internal/helper/sdk_background_store_linux_test.go +261 -0
  755. package/templates/native-go/backend/internal/helper/sdk_background_store_test.go +58 -0
  756. package/templates/native-go/backend/internal/helper/sdk_bindings.go +60 -0
  757. package/templates/native-go/backend/internal/helper/sdk_data_contract.go +251 -0
  758. package/templates/native-go/backend/internal/helper/sdk_data_protocol.go +424 -0
  759. package/templates/native-go/backend/internal/helper/sdk_dispatch_absence_test.go +51 -0
  760. package/templates/native-go/backend/internal/helper/sdk_display.go +488 -0
  761. package/templates/native-go/backend/internal/helper/sdk_display_contract.go +121 -0
  762. package/templates/native-go/backend/internal/helper/sdk_display_test.go +459 -0
  763. package/templates/native-go/backend/internal/helper/sdk_grant_authority.go +559 -0
  764. package/templates/native-go/backend/internal/helper/sdk_grant_repository_linux.go +417 -0
  765. package/templates/native-go/backend/internal/helper/sdk_grant_snapshot.go +94 -0
  766. package/templates/native-go/backend/internal/helper/sdk_history.go +80 -0
  767. package/templates/native-go/backend/internal/helper/sdk_history_test.go +76 -0
  768. package/templates/native-go/backend/internal/helper/sdk_job.go +697 -0
  769. package/templates/native-go/backend/internal/helper/sdk_job_child_linux.go +309 -0
  770. package/templates/native-go/backend/internal/helper/sdk_job_contract.go +122 -0
  771. package/templates/native-go/backend/internal/helper/sdk_job_linux_test.go +159 -0
  772. package/templates/native-go/backend/internal/helper/sdk_job_process_linux.go +327 -0
  773. package/templates/native-go/backend/internal/helper/sdk_job_test.go +501 -0
  774. package/templates/native-go/backend/internal/helper/sdk_job_vm_linux_test.go +343 -0
  775. package/templates/native-go/backend/internal/helper/sdk_journal.go +77 -0
  776. package/templates/native-go/backend/internal/helper/sdk_journal_linux.go +244 -0
  777. package/templates/native-go/backend/internal/helper/sdk_journal_linux_test.go +295 -0
  778. package/templates/native-go/backend/internal/helper/sdk_journal_test.go +71 -0
  779. package/templates/native-go/backend/internal/helper/sdk_picker_test.go +50 -0
  780. package/templates/native-go/backend/internal/helper/sdk_process_linux.go +184 -0
  781. package/templates/native-go/backend/internal/helper/sdk_public_vm_linux_test.go +129 -0
  782. package/templates/native-go/backend/internal/helper/sdk_relaxed_invalidation.go +242 -0
  783. package/templates/native-go/backend/internal/helper/sdk_rpc.go +299 -0
  784. package/templates/native-go/backend/internal/helper/sdk_rpc_contract.go +70 -0
  785. package/templates/native-go/backend/internal/helper/sdk_rpc_test.go +135 -0
  786. package/templates/native-go/backend/internal/helper/sdk_server_linux.go +152 -0
  787. package/templates/native-go/backend/internal/helper/sdk_session.go +677 -0
  788. package/templates/native-go/backend/internal/helper/sdk_session_contract.go +72 -0
  789. package/templates/native-go/backend/internal/helper/sdk_session_fence_test.go +215 -0
  790. package/templates/native-go/backend/internal/helper/sdk_session_test.go +475 -0
  791. package/templates/native-go/backend/internal/helper/sdk_supervisor_frame.go +78 -0
  792. package/templates/native-go/backend/internal/helper/sdk_supervisor_linux.go +414 -0
  793. package/templates/native-go/backend/internal/helper/sdk_transport.go +79 -0
  794. package/templates/native-go/backend/internal/helper/sdk_transport_linux.go +82 -0
  795. package/templates/native-go/backend/internal/helper/sdk_transport_test.go +64 -0
  796. package/templates/native-go/backend/internal/helper/server_linux.go +47 -3
  797. package/templates/native-go/backend/internal/helper/stale_management_linux_test.go +126 -0
  798. package/templates/native-go/backend/internal/helper/stale_management_test.go +122 -0
  799. package/templates/native-go/backend/internal/helper/startup_diagnostic.go +68 -0
  800. package/templates/native-go/backend/internal/helper/startup_diagnostic_linux_test.go +126 -0
  801. package/templates/native-go/backend/internal/helper/startup_diagnostic_test.go +117 -0
  802. package/templates/native-go/backend/internal/helper/status.go +83 -11
  803. package/templates/native-go/backend/internal/helper/status_test.go +128 -0
  804. package/templates/native-go/backend/internal/helper/supervision.go +28 -5
  805. package/templates/native-go/backend/internal/helper/supervisor_frame.go +79 -0
  806. package/templates/native-go/backend/internal/helper/supervisor_frame_linux_test.go +69 -0
  807. package/templates/native-go/backend/internal/helper/supervisor_frame_test.go +107 -0
  808. package/templates/native-go/backend/internal/helper/supervisor_linux.go +191 -16
  809. package/templates/native-go/backend/internal/helper/supervisor_linux_test.go +618 -7
  810. package/templates/native-go/backend/internal/helper/supervisor_socket_eof_test.go +74 -0
  811. package/templates/native-go/backend/internal/helper/supervisor_socket_test.go +45 -0
  812. package/templates/native-go/backend/internal/helper/testdata/protocol2/create.json +23 -0
  813. package/templates/native-go/backend/internal/helper/testdata/protocol2/frames.json +67 -0
  814. package/templates/native-go/backend/internal/helper/testdata/protocol2/grant-store.json +52 -0
  815. package/templates/native-go/backend/internal/helper/testdata/protocol2/intent.json +20 -0
  816. package/templates/native-go/backend/internal/helper/testdata/protocol2/list.json +20 -0
  817. package/templates/native-go/backend/internal/helper/testdata/protocol2/publish.json +20 -0
  818. package/templates/native-go/backend/internal/helper/testdata/protocol2/read.json +22 -0
  819. package/templates/native-go/backend/internal/helper/testdata/protocol2/stat.json +22 -0
  820. package/templates/native-go/backend/internal/helper/testdata/protocol2/write-stream.json +22 -0
  821. package/templates/native-go/backend/internal/helper/unit_connection.go +75 -0
  822. package/templates/native-go/backend/internal/helper/unit_connection_linux_test.go +135 -0
  823. package/templates/native-go/backend/internal/helper/unit_connection_test.go +151 -0
  824. package/templates/native-go/backend/internal/helper/unit_frame_test.go +32 -0
  825. package/templates/native-go/backend/internal/helper/unit_linux.go +368 -0
  826. package/templates/native-go/backend/internal/helper/unit_linux_test.go +46 -0
  827. package/templates/native-go/backend/internal/helper/unit_mechanisms_linux_test.go +217 -0
  828. package/templates/native-go/backend/internal/helper/unit_padding_linux_test.go +178 -0
  829. package/templates/native-go/backend/internal/helper/unit_query_linux.go +115 -0
  830. package/templates/native-go/backend/internal/helper/unit_reload_linux_test.go +372 -0
  831. package/templates/native-go/backend/internal/helper/unit_reload_sequence_linux_test.go +232 -0
  832. package/templates/native-go/backend/internal/helper/write.go +77 -0
  833. package/templates/native-go/backend/internal/helper/write_admission.go +260 -0
  834. package/templates/native-go/backend/internal/helper/write_admission_test.go +135 -0
  835. package/templates/native-go/backend/internal/helper/write_cohort_linux_test.go +218 -0
  836. package/templates/native-go/backend/internal/helper/write_files_linux.go +205 -0
  837. package/templates/native-go/backend/internal/helper/write_files_linux_test.go +225 -0
  838. package/templates/native-go/backend/internal/helper/write_intent_linux.go +116 -0
  839. package/templates/native-go/backend/internal/helper/write_intent_linux_test.go +74 -0
  840. package/templates/native-go/backend/internal/helper/write_operation_linux.go +245 -0
  841. package/templates/native-go/backend/internal/helper/write_test.go +53 -0
  842. package/templates/native-go/dsm-package.yaml +1 -1
  843. package/templates/native-go/ui/app.js +8 -1
  844. package/templates/native-go-background/BACKGROUND.md +111 -0
  845. package/templates/native-go-background/backend/internal/app/background_on.go +7 -0
  846. package/templates/native-go-background/backend/internal/app/background_routes_test.go +32 -0
  847. package/templates/native-go-background/frontend/src/background/BackgroundPanel.vue +178 -0
  848. package/templates/native-go-background/frontend/src/background/i18n/de.json +83 -0
  849. package/templates/native-go-background/frontend/src/background/i18n/en.json +83 -0
  850. package/templates/native-go-background/frontend/src/background/i18n/es.json +83 -0
  851. package/templates/native-go-background/frontend/src/background/i18n/fr.json +83 -0
  852. package/templates/native-go-background/frontend/src/background/i18n/it.json +83 -0
  853. package/templates/native-go-background/frontend/src/background/i18n/ja.json +83 -0
  854. package/templates/native-go-background/frontend/src/background/i18n/ko.json +83 -0
  855. package/templates/native-go-background/frontend/src/background/i18n/zh-CN.json +83 -0
  856. package/templates/native-go-background/frontend/src/background/i18n/zh-TW.json +83 -0
  857. package/templates/native-go-background/frontend/src/background/i18n.ts +19 -0
  858. package/templates/native-go-background/frontend/src/background/picker-provider.ts +13 -0
  859. package/templates/native-go-background/frontend/test/background.test.ts +179 -0
  860. package/templates/native-go-better-auth/node/build.mjs +2 -0
  861. package/templates/native-go-integration/backend/internal/app/personal.go +2 -2
  862. package/templates/native-go-integration/backend/internal/app/personal_test.go +37 -0
  863. package/templates/native-go-vue/README.md +151 -6
  864. package/templates/native-go-vue/frontend/DESIGN.md +16 -4
  865. package/templates/native-go-vue/frontend/README-JOBS.md +75 -0
  866. package/templates/native-go-vue/frontend/README-M2.md +64 -0
  867. package/templates/native-go-vue/frontend/package-lock.json +137 -233
  868. package/templates/native-go-vue/frontend/package.json +2 -2
  869. package/templates/native-go-vue/frontend/src/App.vue +71 -16
  870. package/templates/native-go-vue/frontend/src/M2App.vue +57 -0
  871. package/templates/native-go-vue/frontend/src/SDKApp.vue +203 -0
  872. package/templates/native-go-vue/frontend/src/context.ts +41 -2
  873. package/templates/native-go-vue/frontend/src/jobs/InteractiveJobForm.vue +70 -0
  874. package/templates/native-go-vue/frontend/src/jobs/JobsAdminPanel.vue +33 -0
  875. package/templates/native-go-vue/frontend/src/jobs/JobsPanel.vue +135 -0
  876. package/templates/native-go-vue/frontend/src/jobs/connected-provider.ts +179 -0
  877. package/templates/native-go-vue/frontend/src/jobs/i18n/de.json +62 -0
  878. package/templates/native-go-vue/frontend/src/jobs/i18n/en.json +62 -0
  879. package/templates/native-go-vue/frontend/src/jobs/i18n/es.json +62 -0
  880. package/templates/native-go-vue/frontend/src/jobs/i18n/fr.json +62 -0
  881. package/templates/native-go-vue/frontend/src/jobs/i18n/it.json +62 -0
  882. package/templates/native-go-vue/frontend/src/jobs/i18n/ja.json +62 -0
  883. package/templates/native-go-vue/frontend/src/jobs/i18n/ko.json +62 -0
  884. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-CN.json +62 -0
  885. package/templates/native-go-vue/frontend/src/jobs/i18n/zh-TW.json +62 -0
  886. package/templates/native-go-vue/frontend/src/jobs/i18n.ts +15 -0
  887. package/templates/native-go-vue/frontend/src/jobs/mock-provider.ts +67 -0
  888. package/templates/native-go-vue/frontend/src/jobs/provider.ts +60 -0
  889. package/templates/native-go-vue/frontend/src/jobs/validate.ts +44 -0
  890. package/templates/native-go-vue/frontend/src/m2-main.ts +21 -0
  891. package/templates/native-go-vue/frontend/src/m2-style.css +7 -0
  892. package/templates/native-go-vue/frontend/src/main.ts +4 -1
  893. package/templates/native-go-vue/frontend/src/nas/M2Files.vue +94 -0
  894. package/templates/native-go-vue/frontend/src/nas/M2PathPicker.vue +70 -0
  895. package/templates/native-go-vue/frontend/src/nas/M2Settings.vue +69 -0
  896. package/templates/native-go-vue/frontend/src/nas/NasGrantSettings.vue +74 -0
  897. package/templates/native-go-vue/frontend/src/nas/NasPathPicker.vue +106 -0
  898. package/templates/native-go-vue/frontend/src/nas/NasUnavailable.vue +20 -0
  899. package/templates/native-go-vue/frontend/src/nas/i18n/de.json +74 -0
  900. package/templates/native-go-vue/frontend/src/nas/i18n/en.json +74 -0
  901. package/templates/native-go-vue/frontend/src/nas/i18n/es.json +74 -0
  902. package/templates/native-go-vue/frontend/src/nas/i18n/fr.json +74 -0
  903. package/templates/native-go-vue/frontend/src/nas/i18n/it.json +74 -0
  904. package/templates/native-go-vue/frontend/src/nas/i18n/ja.json +74 -0
  905. package/templates/native-go-vue/frontend/src/nas/i18n/ko.json +74 -0
  906. package/templates/native-go-vue/frontend/src/nas/i18n/m2/de.json +56 -0
  907. package/templates/native-go-vue/frontend/src/nas/i18n/m2/en.json +56 -0
  908. package/templates/native-go-vue/frontend/src/nas/i18n/m2/es.json +56 -0
  909. package/templates/native-go-vue/frontend/src/nas/i18n/m2/fr.json +56 -0
  910. package/templates/native-go-vue/frontend/src/nas/i18n/m2/it.json +56 -0
  911. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ja.json +56 -0
  912. package/templates/native-go-vue/frontend/src/nas/i18n/m2/ko.json +56 -0
  913. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-CN.json +56 -0
  914. package/templates/native-go-vue/frontend/src/nas/i18n/m2/zh-TW.json +56 -0
  915. package/templates/native-go-vue/frontend/src/nas/i18n/zh-CN.json +74 -0
  916. package/templates/native-go-vue/frontend/src/nas/i18n/zh-TW.json +74 -0
  917. package/templates/native-go-vue/frontend/src/nas/i18n.ts +38 -0
  918. package/templates/native-go-vue/frontend/src/nas/m2-contract.ts +33 -0
  919. package/templates/native-go-vue/frontend/src/nas/m2-i18n.ts +24 -0
  920. package/templates/native-go-vue/frontend/src/nas/m2-provider.ts +104 -0
  921. package/templates/native-go-vue/frontend/src/nas/mock-provider.ts +119 -0
  922. package/templates/native-go-vue/frontend/src/nas/provider.ts +59 -0
  923. package/templates/native-go-vue/frontend/src/nas/use-m2-request.ts +18 -0
  924. package/templates/native-go-vue/frontend/src/nas/use-request.ts +27 -0
  925. package/templates/native-go-vue/frontend/src/sdk-main.ts +39 -0
  926. package/templates/native-go-vue/frontend/src/shell/AppShell.vue +48 -0
  927. package/templates/native-go-vue/frontend/src/shell/i18n/de.json +10 -0
  928. package/templates/native-go-vue/frontend/src/shell/i18n/en.json +10 -0
  929. package/templates/native-go-vue/frontend/src/shell/i18n/es.json +10 -0
  930. package/templates/native-go-vue/frontend/src/shell/i18n/fr.json +10 -0
  931. package/templates/native-go-vue/frontend/src/shell/i18n/it.json +10 -0
  932. package/templates/native-go-vue/frontend/src/shell/i18n/ja.json +10 -0
  933. package/templates/native-go-vue/frontend/src/shell/i18n/ko.json +10 -0
  934. package/templates/native-go-vue/frontend/src/shell/i18n/zh-CN.json +10 -0
  935. package/templates/native-go-vue/frontend/src/shell/i18n/zh-TW.json +10 -0
  936. package/templates/native-go-vue/frontend/src/shell/i18n.ts +17 -0
  937. package/templates/native-go-vue/frontend/src/shell/pages.ts +34 -0
  938. package/templates/native-go-vue/frontend/src/style.css +19 -6
  939. package/templates/native-go-vue/frontend/test/apps.test.ts +65 -2
  940. package/templates/native-go-vue/frontend/test/jobs-connected.test.ts +163 -0
  941. package/templates/native-go-vue/frontend/test/jobs-preview.html +22 -0
  942. package/templates/native-go-vue/frontend/test/jobs.test.ts +176 -0
  943. package/templates/native-go-vue/frontend/test/m2-preview.html +27 -0
  944. package/templates/native-go-vue/frontend/test/m2-provider.test.ts +87 -0
  945. package/templates/native-go-vue/frontend/test/m2-ui.test.ts +209 -0
  946. package/templates/native-go-vue/frontend/test/nas-provider.test.ts +81 -0
  947. package/templates/native-go-vue/frontend/test/nas-request.test.ts +21 -0
  948. package/templates/native-go-vue/frontend/test/nas-ui.test.ts +261 -0
  949. package/templates/native-go-vue/frontend/test/native-controls.test.ts +27 -0
  950. package/templates/native-go-vue/frontend/test/picker-wire.test.ts +110 -0
  951. package/templates/native-go-vue/frontend/test/shell-preview.html +19 -0
  952. package/templates/native-go-vue/frontend/test/shell-sdk.test.ts +73 -0
  953. package/templates/native-go-vue/frontend/test/shell-ui.test.ts +114 -0
  954. package/templates/native-go-vue/frontend/test/shell.test.ts +45 -0
  955. package/templates/native-go-vue/frontend/tsconfig.json +1 -1
  956. package/templates/native-go-vue/frontend/vite.config.ts +8 -6
@@ -0,0 +1,94 @@
1
+ <script setup lang="ts">
2
+ import {computed,inject,onBeforeUnmount,onMounted,ref,watch} from 'vue'
3
+ import {Button,Callout,DataGrid,FilePicker,Form,FormActions,FormItem,Input,Link,type FileRejection} from '@synopackageland/ui'
4
+ import {M2_MAX_BYTES,M2ProviderKey,type M2Entry,type M2Selection} from './m2-contract'
5
+ import {m2Copy,m2ErrorCopy} from './m2-i18n'
6
+ import {format} from './i18n'
7
+ import {useM2Request} from './use-m2-request'
8
+ const props=defineProps<{selection:M2Selection;locale:string}>()
9
+ const emit=defineEmits<{busy:[value:boolean]}>()
10
+ const copy=computed(()=>m2Copy(props.locale)),provider=inject(M2ProviderKey)!
11
+ const request=useM2Request(),{busy,error}=request
12
+ watch(busy,value=>emit('busy',value),{flush:'sync'})
13
+ const entries=ref<M2Entry[]>([]),trail=ref<string[]>([]),next=ref<number>(),metadata=ref<M2Entry>(),folderName=ref(''),files=ref<File[]>([]),notice=ref(''),download=ref(''),downloadName=ref('')
14
+ const columns=computed(()=>[{key:'name',label:copy.value.fileKind},{key:'actions',label:copy.value.inspect}])
15
+ const relative=computed(()=>trail.value.join('/'))
16
+ function release(){if(download.value)URL.revokeObjectURL(download.value);download.value='';downloadName.value='';metadata.value=undefined;notice.value=''}
17
+ async function browse(target:string[],more=false){
18
+ if(busy.value)return
19
+ release()
20
+ const page=await request.run(signal=>provider.list(props.selection.grantId,target.join('/'),more?next.value??0:0,signal))
21
+ if(page){trail.value=target;entries.value=(more?[...entries.value,...page.entries]:page.entries).slice(-200);next.value=page.nextOffset}
22
+ else {entries.value=[];next.value=undefined}
23
+ }
24
+ function child(name:string){return [...trail.value,name].join('/')}
25
+ async function inspect(entry:M2Entry){release();const value=await request.run(signal=>provider.stat(props.selection.grantId,child(entry.name),signal));if(value)metadata.value=value}
26
+ async function read(entry:M2Entry){
27
+ release()
28
+ const value=await request.run(signal=>provider.read(props.selection.grantId,child(entry.name),signal))
29
+ if(value){download.value=URL.createObjectURL(new Blob([new Uint8Array(value).buffer],{type:'application/octet-stream'}));downloadName.value=entry.name;notice.value=copy.value.readComplete}
30
+ }
31
+ async function create(){
32
+ if(busy.value||!props.selection.writable)return
33
+ release()
34
+ const done=await request.run(async signal=>{await provider.create(props.selection.grantId,relative.value,folderName.value,signal);return true})
35
+ if(done){folderName.value='';await browse(trail.value);notice.value=copy.value.created}
36
+ }
37
+ // The compact FilePicker enforces the size limit and reports the first refused file.
38
+ function pick(selected:File[]){
39
+ if(busy.value)return
40
+ error.value=undefined;files.value=selected.slice(0,1)
41
+ }
42
+ function refuse(items:FileRejection[]){
43
+ if(busy.value)return
44
+ files.value=[];error.value=items.some(item=>item.reason==='size')?{code:'limit-exceeded'}:{code:'invalid-request'}
45
+ }
46
+ async function upload(){
47
+ if(busy.value||!props.selection.writable||!files.value[0])return
48
+ release()
49
+ const selected=files.value[0]!,rel=relative.value
50
+ const done=await request.run(async signal=>{
51
+ if(selected.size>M2_MAX_BYTES)throw {code:'limit-exceeded'}
52
+ const data=new Uint8Array(await selected.arrayBuffer())
53
+ if(signal.aborted)throw {code:'canceled'}
54
+ await provider.upload(props.selection.grantId,rel,selected.name,data,signal);return true
55
+ })
56
+ // Never retain a retryable upload after an uncertain outcome.
57
+ files.value=[]
58
+ if(done){await browse(trail.value);notice.value=copy.value.uploaded}
59
+ }
60
+ onMounted(()=>void browse([]))
61
+ onBeforeUnmount(()=>{emit('busy',false);release();files.value=[];entries.value=[];trail.value=[];folderName.value=''})
62
+ </script>
63
+ <template>
64
+ <div class="m2-files" :aria-busy="busy">
65
+ <h3 class="nas-folder-name">{{ selection.folder }}<span v-if="relative"> / {{ relative }}</span></h3>
66
+ <p>{{ selection.writable ? copy.writable : copy.readOnly }}</p>
67
+ <p>{{ copy.limit }}</p>
68
+ <Callout v-if="error" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
69
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
70
+ <nav class="nas-breadcrumb" :aria-label="copy.directoryKind">
71
+ <Button v-if="trail.length" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,-1))">{{ copy.back }}</Button>
72
+ <Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
73
+ <Button variant="secondary" :disabled="busy" @click="browse(trail)">{{ copy.refresh }}</Button>
74
+ </nav>
75
+ <DataGrid :columns="columns" :rows="entries.map(e=>({...e}))" row-key="path" :footer="false" :resizable="false" :labels="{empty:copy.emptyFolder}" :loading="busy" :loading-text="copy.loading">
76
+ <template #cell-name="{row}"><Button v-if="row.isDir" variant="secondary" class="nas-folder-name" :disabled="busy" @click="browse([...trail,String(row.name)])">{{ format(copy.open,String(row.name)) }}</Button><span v-else class="nas-folder-name">{{ row.name }}</span></template>
77
+ <template #cell-actions="{row}"><div class="integration-actions">
78
+ <Button variant="secondary" :disabled="busy" @click="inspect(entries.find(e=>e.path===row.path)!)">{{ copy.inspect }}</Button>
79
+ <Button v-if="!row.isDir" variant="secondary" :disabled="busy || (typeof row.bytes==='number' && row.bytes>M2_MAX_BYTES)" @click="read(entries.find(e=>e.path===row.path)!)">{{ copy.read }}</Button>
80
+ </div></template>
81
+ </DataGrid>
82
+ <Button v-if="next!==undefined" variant="secondary" :disabled="busy" @click="browse(trail,true)">{{ copy.loadMore }}</Button>
83
+ <dl v-if="metadata" class="nas-summary" :aria-label="copy.metadata"><dt>{{ copy.metadata }}</dt><dd>{{ metadata.name }}</dd><dt>{{ copy.directoryKind }}</dt><dd>{{ metadata.isDir ? copy.directoryKind : copy.fileKind }}</dd><dt>Bytes</dt><dd>{{ metadata.bytes ?? '—' }}</dd></dl>
84
+ <p v-if="notice" role="status">{{ notice }}</p>
85
+ <Link v-if="download" :href="download" :download="downloadName">{{ copy.download }}</Link>
86
+ <Form v-if="selection.writable" @submit.prevent>
87
+ <FormItem :label="copy.folderName"><Input v-model="folderName" data-folder-name :disabled="busy" :maxlength="255" /></FormItem>
88
+ <FormActions><Button variant="secondary" :disabled="busy||!folderName" @click="create">{{ copy.create }}</Button></FormActions>
89
+ <FormItem :label="copy.uploadFile"><FilePicker :model-value="files" variant="compact" :max-size="M2_MAX_BYTES" :show-list="false" :disabled="busy" @update:model-value="pick" @rejected="refuse" /></FormItem>
90
+ <p v-if="files[0]" class="nas-folder-name">{{ files[0].name }}</p>
91
+ <FormActions><Button variant="primary" :disabled="busy||!files[0]" @click="upload">{{ copy.upload }}</Button></FormActions>
92
+ </Form>
93
+ </div>
94
+ </template>
@@ -0,0 +1,70 @@
1
+ <script setup lang="ts">
2
+ import {computed,inject,onBeforeUnmount,ref,watch} from 'vue'
3
+ import {Button,Callout,Checkbox,DataGrid,Dialog,TreeView,type TreeNode} from '@synopackageland/ui'
4
+ import {M2ProviderKey,type M2Entry,type M2Selection,type M2JobSource} from './m2-contract'
5
+ import {m2Copy,m2ErrorCopy} from './m2-i18n'
6
+ import {format} from './i18n'
7
+ import {useM2Request} from './use-m2-request'
8
+ const props=defineProps<{open:boolean;locale:string;selectFiles?:boolean;readOnly?:boolean;title?:string;consent?:string}>()
9
+ const emit=defineEmits<{'update:open':[open:boolean];selected:[value:M2Selection];source:[value:M2JobSource];busy:[value:boolean]}>()
10
+ const provider=inject(M2ProviderKey)!,copy=computed(()=>m2Copy(props.locale))
11
+ const request=useM2Request(),{busy,error}=request
12
+ watch(busy,value=>emit('busy',value),{flush:'sync'})
13
+ const entries=ref<M2Entry[]>([]),roots=ref<TreeNode[]>([]),trail=ref<M2Entry[]>([]),chosen=ref<M2Entry>(),next=ref<number>(),writable=ref(false)
14
+ const columns=computed(()=>[{key:'name',label:props.selectFiles?copy.value.metadata:copy.value.directoryKind},{key:'selection',label:props.selectFiles?copy.value.confirm:copy.value.choose}])
15
+ function discard(){request.cancel();entries.value=[];roots.value=[];trail.value=[];chosen.value=undefined;next.value=undefined;writable.value=false}
16
+ function close(){discard();emit('update:open',false)}
17
+ async function browse(target:M2Entry[],more=false){
18
+ if(busy.value)return
19
+ const page=await request.run(signal=>provider.discovery(target.at(-1)?.path,more?next.value??0:0,signal))
20
+ if(page){
21
+ trail.value=target;chosen.value=undefined;next.value=page.nextOffset
22
+ // Cursor progression uses the full page, even when files are filtered out.
23
+ const folders=page.entries.filter(e=>e.isDir||props.selectFiles)
24
+ entries.value=(more?[...entries.value,...folders]:folders).slice(-200)
25
+ if(!target.length)roots.value=entries.value.filter(e=>e.isDir).map(e=>({id:e.path,label:e.name}))
26
+ }
27
+ }
28
+ async function confirm(){
29
+ if(!chosen.value)return
30
+ const entry={...chosen.value},segments=entry.isDir?[]:[entry.name]
31
+ const folder=entry.isDir?entry.path:trail.value.at(-1)?.path,write=props.readOnly?false:writable.value
32
+ if(!folder||(!entry.isDir&&entry.path!==`${folder}/${entry.name}`)){error.value={code:'invalid-request'};return}
33
+ const result=await request.run(signal=>provider.confirm(folder,write,signal))
34
+ if(result){emit('selected',result);emit('source',{selection:result,entry,segments});close()}
35
+ }
36
+ watch(()=>props.open,open=>{discard();if(open)void browse([])},{immediate:true})
37
+ onBeforeUnmount(discard)
38
+ </script>
39
+ <template>
40
+ <Dialog :open="open" :title="title??copy.choose" :description="copy.ownPermissions" :close-label="copy.close" width="720px" @update:open="value=>{if(!value)close()}">
41
+ <div class="nas-picker" :aria-busy="busy">
42
+ <p>{{ consent??copy.consent }}</p>
43
+ <Callout v-if="error" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
44
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
45
+ <nav class="nas-breadcrumb" :aria-label="copy.directoryKind">
46
+ <Button v-if="trail.length" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,-1))">{{ copy.back }}</Button>
47
+ <Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
48
+ <Button v-for="(part,index) in trail" :key="part.path" variant="secondary" :disabled="busy" @click="browse(trail.slice(0,index+1))">{{ part.name }}</Button>
49
+ </nav>
50
+ <div class="nas-browser">
51
+ <aside class="nas-tree" :inert="busy||undefined" :aria-label="copy.roots"><TreeView :nodes="roots" :show-icons="false" @select="node=>browse([{path:node.id,name:node.label,isDir:true}])" /></aside>
52
+ <div class="nas-folder-list">
53
+ <DataGrid :columns="columns" :rows="entries.map(e=>({...e}))" row-key="path" :footer="false" :labels="{empty:copy.emptyFolder}" :resizable="false" :loading="busy" :loading-text="copy.loading">
54
+ <template #cell-name="{row}"><Button v-if="row.isDir" variant="secondary" class="nas-folder-name" :disabled="busy" @click="browse([...trail,{path:String(row.path),name:String(row.name),isDir:true}])">{{ format(copy.open,String(row.name)) }}</Button><span v-else>{{ row.name }} · {{ copy.fileKind }}</span></template>
55
+ <template #cell-selection="{row}"><Button variant="secondary" :disabled="busy" :aria-label="format(copy.select,String(row.name))" :aria-pressed="chosen?.path===row.path" @click="chosen=entries.find(e=>e.path===row.path)">{{ selectFiles?format(copy.select,String(row.name)):copy.choose }}</Button></template>
56
+ </DataGrid>
57
+ <Button v-if="next!==undefined" variant="secondary" :disabled="busy" @click="browse(trail,true)">{{ copy.loadMore }}</Button>
58
+ <Button v-if="trail.length" variant="secondary" :disabled="busy" @click="chosen=trail.at(-1)">{{ format(copy.select,trail.at(-1)!.name) }}</Button>
59
+ </div>
60
+ </div>
61
+ <p v-if="chosen" role="status">{{ format(copy.selected,chosen.path) }}</p>
62
+ <Checkbox v-if="!readOnly" v-model="writable" class="m2-checkbox" :disabled="busy" :label="copy.writable" />
63
+ </div>
64
+ <template #footer>
65
+ <Button variant="secondary" @click="close">{{ copy.cancel }}</Button>
66
+ <Button variant="secondary" :disabled="busy" @click="browse(trail)">{{ copy.refresh }}</Button>
67
+ <Button variant="primary" :disabled="busy||!chosen" @click="confirm">{{ copy.confirm }}</Button>
68
+ </template>
69
+ </Dialog>
70
+ </template>
@@ -0,0 +1,69 @@
1
+ <script setup lang="ts">
2
+ import {computed,inject,onMounted,ref,watch} from 'vue'
3
+ import {Button,Callout,Dialog,SettingsSection} from '@synopackageland/ui'
4
+ import {M2ProviderKey,type M2Selection} from './m2-contract'
5
+ import {m2Copy,m2ErrorCopy} from './m2-i18n'
6
+ import {useM2Request} from './use-m2-request'
7
+ import M2PathPicker from './M2PathPicker.vue'
8
+ import M2Files from './M2Files.vue'
9
+ const emit=defineEmits<{busy:[value:boolean]}>()
10
+ const filesBusy=ref(false),pickerBusy=ref(false)
11
+ const props=defineProps<{locale:string}>(),copy=computed(()=>m2Copy(props.locale)),provider=inject(M2ProviderKey)!
12
+ const request=useM2Request(),{busy,error}=request
13
+ const occupied=computed(()=>busy.value||filesBusy.value||pickerBusy.value)
14
+ watch(occupied,value=>emit('busy',value),{flush:'sync'})
15
+ const selections=ref<M2Selection[]>([]),pickerOpen=ref(false),revoking=ref<M2Selection>(),active=ref<M2Selection>(),notice=ref(''),loaded=ref(false)
16
+ async function refresh(){
17
+ if(occupied.value)return
18
+ active.value=undefined;notice.value='';loaded.value=false;selections.value=[]
19
+ const result=await request.run(async signal=>{await provider.status(signal);return provider.selections(signal)})
20
+ if(result){selections.value=result;loaded.value=true}
21
+ }
22
+ function selected(selection:M2Selection){selections.value=[...selections.value,selection];notice.value=copy.value.selectionAdded;loaded.value=true}
23
+ async function revoke(){
24
+ if(!revoking.value)return
25
+ const selection=revoking.value
26
+ const done=await request.run(async signal=>{await provider.revoke(selection.grantId,signal);return true})
27
+ if(done){selections.value=selections.value.filter(s=>s.grantId!==selection.grantId);revoking.value=undefined;notice.value=copy.value.revokedNotice}
28
+ }
29
+ function askRevoke(selection:M2Selection){active.value=undefined;notice.value='';error.value=undefined;revoking.value=selection}
30
+ onMounted(()=>void refresh())
31
+ </script>
32
+ <template>
33
+ <SettingsSection :title="copy.title" :collapsible="false">
34
+ <div :aria-busy="occupied">
35
+ <p>{{ copy.ownPermissions }}</p><p>{{ copy.consent }}</p>
36
+ <p class="integration-help">{{ copy.localOnly }}</p>
37
+ <p class="integration-help">{{ copy.identityRisk }}</p><p class="integration-help">{{ copy.pathRisk }}</p>
38
+ <p>{{ copy.unsupported }}</p>
39
+ <Callout v-if="error && !revoking" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
40
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
41
+ <p v-if="notice" role="status">{{ notice }}</p>
42
+ <div class="integration-actions">
43
+ <Button variant="primary" :disabled="occupied||!loaded" @click="pickerOpen=true">{{ copy.choose }}</Button>
44
+ <Button variant="secondary" :disabled="occupied" @click="refresh">{{ copy.refresh }}</Button>
45
+ </div>
46
+ <p v-if="loaded&&!selections.length">{{ copy.emptySelections }}</p>
47
+ <ul class="nas-grants">
48
+ <li v-for="selection in selections" :key="selection.grantId">
49
+ <div class="nas-grant-heading"><strong>{{ selection.folder }}</strong></div>
50
+ <p>{{ selection.writable ? copy.writable : copy.readOnly }}</p>
51
+ <div class="integration-actions">
52
+ <Button variant="secondary" :disabled="occupied" @click="active=selection">{{ copy.openFiles }}</Button>
53
+ <Button variant="secondary" :disabled="occupied" @click="askRevoke(selection)">{{ copy.revoke }}</Button>
54
+ </div>
55
+ </li>
56
+ </ul>
57
+ <M2Files v-if="active" :key="active.grantId" :selection="active" :locale="locale" @busy="value=>filesBusy=value" />
58
+ </div>
59
+ <M2PathPicker v-model:open="pickerOpen" :locale="locale" @selected="selected" @busy="value=>pickerBusy=value" />
60
+ <Dialog :open="!!revoking" :title="copy.confirmRevoke" :description="copy.revokeWarning" :close-label="copy.close" @update:open="value=>{if(!value){request.cancel();revoking=undefined}}">
61
+ <p class="nas-folder-name">{{ revoking?.folder }}</p>
62
+ <Callout v-if="error" tone="danger" role="alert">{{ m2ErrorCopy(error,copy) }}</Callout>
63
+ <template #footer>
64
+ <Button variant="secondary" @click="request.cancel();revoking=undefined">{{ copy.cancel }}</Button>
65
+ <Button variant="danger" :disabled="busy" @click="revoke">{{ copy.confirmRevoke }}</Button>
66
+ </template>
67
+ </Dialog>
68
+ </SettingsSection>
69
+ </template>
@@ -0,0 +1,74 @@
1
+ <script setup lang="ts">
2
+ import {computed, inject, onMounted, ref} from 'vue'
3
+ import {Button, Callout, Dialog, SettingsSection} from '@synopackageland/ui'
4
+ import {NasProviderKey, type GrantView, type ScopeKind} from './provider'
5
+ import {actionCopy, errorCopy, nasCopy} from './i18n'
6
+ import {useNasRequest} from './use-request'
7
+ import NasPathPicker from './NasPathPicker.vue'
8
+
9
+ const props=defineProps<{locale:string}>()
10
+ const provider=inject(NasProviderKey)!
11
+ const copy=computed(()=>nasCopy(props.locale))
12
+ const request=useNasRequest(), {busy,error}=request
13
+ const items=ref<GrantView[]>([]), canManageShared=ref(false), pickerOpen=ref(false), kind=ref<ScopeKind>('user-personal'), revokeTarget=ref<GrantView>(), notice=ref('')
14
+ const revokeOpen=computed({get:()=>!!revokeTarget.value,set:value=>{if(!value){request.cancel();revokeTarget.value=undefined}}})
15
+ async function refresh() {
16
+ const result=await request.run(signal=>provider.settings(signal))
17
+ if(result) {items.value=result.items;canManageShared.value=result.canManageShared}
18
+ }
19
+ function choose(scope:ScopeKind) {kind.value=scope;notice.value='';pickerOpen.value=true}
20
+ async function granted() {notice.value=copy.value.noticeCreated;await refresh()}
21
+ function state(item:GrantView) {
22
+ if(item.effectiveState==='active') return copy.value.active
23
+ if(item.effectiveState==='suspended') return copy.value.suspended
24
+ if(item.cleanupRequired) return copy.value.cleanup
25
+ return item.drained===true?copy.value.revoked:copy.value.draining
26
+ }
27
+ function created(time:number) {
28
+ try {return new Intl.DateTimeFormat(props.locale.replace('_','-'),{dateStyle:'medium',timeStyle:'short'}).format(time)}
29
+ catch {return new Intl.DateTimeFormat('en',{dateStyle:'medium',timeStyle:'short'}).format(time)}
30
+ }
31
+ async function revoke() {
32
+ const target=revokeTarget.value;if(!target) return
33
+ const result=await request.run(signal=>provider.revoke(target.grantId,target.revision,signal))
34
+ if(result) {
35
+ // Only an R receipt sets revoked; only Q sets drained. Timeout is neither.
36
+ if(result.revoked) {const item=items.value.find(i=>i.grantId===result.grantId);if(item){item.effectiveState='revoked';item.revision=result.grantRevision;item.drained=result.drained}}
37
+ revokeTarget.value=undefined
38
+ }
39
+ }
40
+ onMounted(refresh)
41
+ </script>
42
+
43
+ <template>
44
+ <SettingsSection :title="copy.title" :collapsible="false" class="nas-settings" :aria-busy="busy">
45
+ <Callout tone="info" :title="copy.pilotOff">{{ copy.pilotRestrictions }}</Callout>
46
+ <p v-if="provider.mode === 'mock'" class="integration-help">{{ copy.mock }}</p>
47
+ <Callout v-if="error" tone="danger" :title="copy.errorTitle" role="alert">{{ errorCopy(error,copy) }}</Callout>
48
+ <div class="integration-actions">
49
+ <Button variant="primary" :disabled="busy || pickerOpen" @click="choose('user-personal')">{{ copy.choosePersonal }}</Button>
50
+ <Button v-if="canManageShared" variant="secondary" :disabled="busy || pickerOpen" @click="choose('app-shared')">{{ copy.chooseShared }}</Button>
51
+ <Button variant="secondary" :disabled="busy || pickerOpen" @click="refresh">{{ copy.refresh }}</Button>
52
+ </div>
53
+ <p v-if="notice" role="status">{{ notice }}</p>
54
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
55
+ <p v-else-if="!items.length">{{ copy.emptyGrant }}</p>
56
+ <ul v-else class="nas-grants">
57
+ <li v-for="item in items" :key="item.grantId">
58
+ <div class="nas-grant-heading"><strong>{{ item.displayName }}</strong><Button v-if="item.canRevoke && item.effectiveState !== 'revoked'" variant="secondary" :disabled="busy || pickerOpen" @click="revokeTarget=item">{{ copy.revoke }}</Button></div>
59
+ <dl class="nas-summary">
60
+ <dt>{{ copy.scope }}</dt><dd>{{ item.scopeKind === 'user-personal' ? copy.personal : copy.shared }}</dd>
61
+ <dt>{{ copy.actions }}</dt><dd>{{ actionCopy(item.actions,copy) }}</dd>
62
+ <dt>{{ copy.state }}</dt><dd role="status">{{ state(item) }}</dd>
63
+ <dt>{{ copy.createdAt }}</dt><dd>{{ created(item.createdAt) }}</dd>
64
+ </dl>
65
+ </li>
66
+ </ul>
67
+ <NasPathPicker v-model:open="pickerOpen" :scope-kind="kind" :locale="locale" @granted="granted" />
68
+ <Dialog v-model:open="revokeOpen" :title="copy.revokeTitle" :description="copy.revokeWarning" :close-label="copy.close">
69
+ <p>{{ revokeTarget?.displayName }}</p>
70
+ <Callout v-if="error" tone="danger" :title="copy.errorTitle" role="alert">{{ errorCopy(error,copy) }}</Callout>
71
+ <template #footer><Button variant="secondary" @click="revokeOpen=false">{{ copy.cancel }}</Button><Button variant="danger" :disabled="busy" @click="revoke">{{ copy.confirmRevoke }}</Button></template>
72
+ </Dialog>
73
+ </SettingsSection>
74
+ </template>
@@ -0,0 +1,106 @@
1
+ <script setup lang="ts">
2
+ import {computed, inject, onBeforeUnmount, ref, watch} from 'vue'
3
+ import {Button, Callout, DataGrid, Dialog, TreeView, type TreeNode} from '@synopackageland/ui'
4
+ import {NasProviderKey, type FolderEntry, type PickerContext, type PreparedIntent, type GrantHandle, type ScopeKind} from './provider'
5
+ import {actionCopy, errorCopy, format, nasCopy} from './i18n'
6
+ import {useNasRequest} from './use-request'
7
+
8
+ const props=defineProps<{open:boolean; scopeKind:ScopeKind; locale:string}>()
9
+ const emit=defineEmits<{'update:open':[value:boolean]; granted:[grant:GrantHandle]}>()
10
+ const provider=inject(NasProviderKey)!
11
+ const copy=computed(()=>nasCopy(props.locale))
12
+ const request=useNasRequest(), {busy,error}=request
13
+ const context=ref<PickerContext>(), entries=ref<FolderEntry[]>([]), roots=ref<TreeNode[]>([])
14
+ const path=ref<Array<{id:string;name:string}>>([]), selected=ref<FolderEntry>(), intent=ref<PreparedIntent>(), nextCursor=ref<string>()
15
+ const columns=computed(()=>[{key:'displayName',label:copy.value.folder,width:'65%'},{key:'selection',label:copy.value.selection,width:'35%'}])
16
+ const rows=computed(()=>entries.value.map(e=>({...e})))
17
+
18
+ function discard() {
19
+ request.cancel()
20
+ const id=context.value?.contextId;context.value=undefined
21
+ entries.value=[];roots.value=[];path.value=[];selected.value=undefined;intent.value=undefined;nextCursor.value=undefined
22
+ if(id) void provider.cancel(id).catch(()=>{})
23
+ }
24
+ function close() {discard();emit('update:open',false)}
25
+ async function start() {
26
+ discard()
27
+ const result=await request.run(async(signal,current)=> {
28
+ const ctx=await provider.begin(props.scopeKind,signal)
29
+ // A provider which ignores abort must still have its late context canceled.
30
+ if(!current() || signal.aborted) {await provider.cancel(ctx.contextId);throw {code:'canceled'}}
31
+ context.value=ctx
32
+ return provider.list(ctx.contextId,undefined,undefined,signal)
33
+ })
34
+ if(result) {entries.value=result.entries;roots.value=result.entries.map(e=>({id:e.nodeId,label:e.displayName}));nextCursor.value=result.nextCursor}
35
+ }
36
+ async function browse(target:Array<{id:string;name:string}>, more=false) {
37
+ if(!context.value) return
38
+ const ctx=context.value, node=target.at(-1)?.id
39
+ const result=await request.run(signal=>provider.list(ctx.contextId,node,more?nextCursor.value:undefined,signal))
40
+ if(result) {
41
+ path.value=target;entries.value=more?[...entries.value,...result.entries]:result.entries
42
+ // Bound the rendered list too; pages do not grow an unbounded DOM.
43
+ if(entries.value.length>200) entries.value=entries.value.slice(-200)
44
+ if(target.length===0) roots.value=entries.value.map(e=>({id:e.nodeId,label:e.displayName}))
45
+ nextCursor.value=result.nextCursor;selected.value=undefined;intent.value=undefined
46
+ }
47
+ }
48
+ function openFolder(id:string,name:string) {void browse([...path.value,{id,name}])}
49
+ async function review() {
50
+ if(!selected.value) return
51
+ const result=await request.run(signal=>provider.prepare(selected.value!.nodeId,signal))
52
+ if(result) intent.value=result
53
+ }
54
+ async function confirm() {
55
+ if(!intent.value) return
56
+ const prepared=intent.value
57
+ const result=await request.run(signal=>provider.confirm(prepared.intentId,prepared.summaryDigest,signal))
58
+ if(result) {emit('granted',result);close()}
59
+ }
60
+ watch(()=>props.open,open=>{if(open) void start();else discard()},{immediate:true})
61
+ watch(()=>props.scopeKind,()=>{if(props.open) void start()})
62
+ onBeforeUnmount(discard)
63
+ </script>
64
+
65
+ <template>
66
+ <Dialog :open="open" :title="intent ? copy.summaryTitle : copy.pickerTitle" :description="copy.pickerHelp" :close-label="copy.close" width="720px" @update:open="value => {if(!value) close()}">
67
+ <div class="nas-picker" :aria-busy="busy">
68
+ <p v-if="provider.mode === 'mock'" class="integration-help">{{ copy.mock }}</p>
69
+ <Callout v-if="error" tone="danger" :title="copy.errorTitle" role="alert">{{ errorCopy(error,copy) }}</Callout>
70
+ <p v-if="busy" role="status">{{ copy.loading }}</p>
71
+ <template v-if="intent">
72
+ <dl class="nas-summary">
73
+ <dt>{{ copy.app }}</dt><dd>{{ intent.summary.appName }}</dd>
74
+ <dt>{{ copy.scope }}</dt><dd>{{ intent.summary.scopeKind === 'user-personal' ? copy.personal : copy.shared }}</dd>
75
+ <dt>{{ copy.folder }}</dt><dd>{{ intent.summary.displayName }}</dd>
76
+ <dt>{{ copy.actions }}</dt><dd>{{ actionCopy(intent.summary.actions,copy) }}</dd>
77
+ </dl>
78
+ <p>{{ copy.persistent }}</p><p>{{ copy.revokeHow }}</p><p>{{ copy.expires }}</p>
79
+ </template>
80
+ <template v-else-if="context">
81
+ <nav class="nas-breadcrumb" :aria-label="copy.folder">
82
+ <Button v-if="path.length" variant="secondary" :disabled="busy" @click="browse(path.slice(0,-1))">{{ copy.back }}</Button>
83
+ <Button variant="secondary" :disabled="busy" @click="browse([])">{{ copy.roots }}</Button>
84
+ <Button v-for="(part,index) in path" :key="part.id" variant="secondary" :disabled="busy" @click="browse(path.slice(0,index+1))">{{ part.name }}</Button>
85
+ </nav>
86
+ <div class="nas-browser">
87
+ <aside class="nas-tree" :aria-label="copy.roots" :inert="busy || undefined"><TreeView :nodes="roots" :show-icons="false" @select="node => browse([{id:node.id,name:node.label}])" /></aside>
88
+ <div class="nas-folder-list">
89
+ <DataGrid :columns="columns" :rows="rows" row-key="nodeId" :footer="false" :labels="{empty:copy.emptyFolder}" :resizable="false" :loading="busy" :loading-text="copy.loading">
90
+ <template #cell-displayName="{row}"><Button variant="secondary" class="nas-folder-name" :disabled="busy" @click="openFolder(String(row.nodeId),String(row.displayName))">{{ format(copy.open,String(row.displayName)) }}</Button></template>
91
+ <template #cell-selection="{row}"><Button variant="secondary" class="nas-folder-action" :disabled="busy || !row.selectable" :aria-label="format(copy.select,String(row.displayName))" :aria-pressed="selected?.nodeId === row.nodeId" @click="selected=entries.find(e=>e.nodeId===row.nodeId)">{{ copy.selection }}</Button></template>
92
+ </DataGrid>
93
+ <Button v-if="nextCursor" variant="secondary" :disabled="busy" @click="browse(path,true)">{{ copy.loadMore }}</Button>
94
+ </div>
95
+ </div>
96
+ <p v-if="selected" role="status">{{ format(copy.selected,selected.displayName) }}</p>
97
+ </template>
98
+ </div>
99
+ <template #footer>
100
+ <Button variant="secondary" @click="close">{{ copy.cancel }}</Button>
101
+ <Button v-if="!context && !busy" variant="secondary" @click="start">{{ copy.retry }}</Button>
102
+ <Button v-if="intent" variant="primary" :disabled="busy" @click="confirm">{{ copy.confirm }}</Button>
103
+ <Button v-else variant="primary" :disabled="busy || !selected" @click="review">{{ copy.review }}</Button>
104
+ </template>
105
+ </Dialog>
106
+ </template>
@@ -0,0 +1,20 @@
1
+ <script setup lang="ts">
2
+ import {computed} from 'vue'
3
+ import {Callout, SettingsSection} from '@synopackageland/ui'
4
+ import {nasCopy} from './i18n'
5
+ const props=defineProps<{locale:string}>()
6
+ const copy=computed(()=>nasCopy(props.locale))
7
+ </script>
8
+
9
+ <template>
10
+ <SettingsSection :title="copy.title" :collapsible="false" data-nas-state="unavailable">
11
+ <Callout :title="copy.unavailableTitle">
12
+ <p>{{ copy.unavailableMessage }}</p>
13
+ <p>{{ copy.pilotUnavailable }}</p>
14
+ <p>{{ copy.noUnlock }}</p>
15
+ <p>{{ copy.relaxedRisk }}</p>
16
+ <p>{{ copy.relaxedReauthorize }}</p>
17
+ <p>{{ copy.relaxedPermissions }}</p>
18
+ </Callout>
19
+ </SettingsSection>
20
+ </template>
@@ -0,0 +1,74 @@
1
+ {
2
+ "title": "NAS-Ordnerzugriff",
3
+ "mock": "Mock-Vorschau — NAS-Dateien und Berechtigungen bleiben unverändert.",
4
+ "personal": "Meine Ordner",
5
+ "shared": "Gemeinsame App-Ordner",
6
+ "choosePersonal": "Eigenen Ordner wählen",
7
+ "chooseShared": "Gemeinsamen Ordner wählen",
8
+ "refresh": "Zugriff aktualisieren",
9
+ "emptyGrant": "Keine Ordner freigegeben. Wählen Sie einen Ordner für die Vorschau des Lesezugriffs.",
10
+ "pickerTitle": "NAS-Ordner wählen",
11
+ "pickerHelp": "Ordner durchsuchen, auswählen und den Lesezugriff prüfen.",
12
+ "roots": "Ordner",
13
+ "back": "Zurück",
14
+ "open": "{name} öffnen",
15
+ "select": "{name} auswählen",
16
+ "selected": "Ausgewählt: {name}",
17
+ "review": "Zugriff prüfen",
18
+ "cancel": "Abbrechen",
19
+ "confirm": "Zugriff bestätigen",
20
+ "summaryTitle": "Ordnerzugriff prüfen",
21
+ "app": "App",
22
+ "scope": "Bereich",
23
+ "folder": "Ordner",
24
+ "actions": "Erlaubte Aktionen",
25
+ "readOnly": "Ordner auflisten, Metadaten prüfen und Dateien lesen",
26
+ "persistent": "Dauerhafter Zugriff bis zum Widerruf oder bis die Bindung ungültig wird.",
27
+ "revokeHow": "Widerrufen Sie einzelne Ordner hier. Eine neue Freigabe erzeugt einen neuen Grant.",
28
+ "expires": "Innerhalb von 30 Sekunden bestätigen.",
29
+ "loading": "Ordner werden geladen…",
30
+ "emptyFolder": "Dieser Ordner ist leer",
31
+ "loadMore": "Mehr laden",
32
+ "state": "Zugriffsstatus",
33
+ "active": "Aktiv",
34
+ "suspended": "Ausgesetzt — erneut auswählen und freigeben",
35
+ "revoked": "Widerrufen",
36
+ "draining": "Widerrufen; Übertragungen werden gestoppt",
37
+ "cleanup": "Widerrufen; Bereinigung muss geprüft werden",
38
+ "createdAt": "Erstellt",
39
+ "revoke": "Widerrufen",
40
+ "revokeTitle": "Ordnerzugriff widerrufen?",
41
+ "revokeWarning": "Neuen Zugriff und laufende Übertragungen stoppen. Bereits gesendete oder geschriebene Daten werden nicht zurückgesetzt.",
42
+ "confirmRevoke": "Widerruf bestätigen",
43
+ "noticeCreated": "Ordnerzugriff hinzugefügt.",
44
+ "errorTitle": "Ordnerzugriff konnte nicht aktualisiert werden",
45
+ "errorDenied": "Zugriff verweigert. Wählen Sie einen für Ihr aktuelles Konto sichtbaren Ordner.",
46
+ "errorExpired": "Auswahl oder Bestätigung abgelaufen. Abbrechen und den Ordner erneut wählen.",
47
+ "errorStale": "Sitzung oder Auswahl geändert. Abbrechen und den Ordner erneut wählen.",
48
+ "errorUnavailable": "Ordnerdienst nicht verfügbar. Bitten Sie einen Administrator, Integration und Home-Dienste zu prüfen.",
49
+ "errorBusy": "Anfragelimit erreicht. Warten Sie und versuchen Sie es erneut.",
50
+ "errorCanceled": "Anfrage abgebrochen. Wählen Sie den Ordner erneut, wenn Sie bereit sind.",
51
+ "errorInternal": "Anfrage fehlgeschlagen. Aktualisieren Sie den Zugriff vor einem neuen Versuch.",
52
+ "retry": "Erneut versuchen",
53
+ "close": "Schließen",
54
+ "selection": "Ordner auswählen",
55
+ "actionList": "Ordner auflisten",
56
+ "actionStat": "Metadaten prüfen",
57
+ "actionRead": "Dateien lesen",
58
+ "pilotOff": "Pilot für verwaltete Konten: aus",
59
+ "pilotRestrictions": "Die Freigabe durch einen Administrator und ein geprüfter Ablauf zur Kontenpflege sind erforderlich. Kontoänderungen oder eine ungeprüfte Identität entziehen den Zugriff und erfordern eine neue Anmeldung und Freigabe. Diese Version kann den Pilotbetrieb nicht aktivieren.",
60
+ "unavailableTitle": "Noch nicht verfügbar",
61
+ "unavailableMessage": "NAS-Ordnerfreigaben und Dateioperationen sind noch nicht verfügbar. Die erforderlichen nativen Identitäts- und Berechtigungsnachweise können derzeit nicht geprüft werden.",
62
+ "pilotUnavailable": "Der Pilot B für verwaltete Konten ist experimental und kann nicht aktiviert werden.",
63
+ "noUnlock": "Das Aktivieren der Integration oder erneutes Anmelden schaltet den NAS-Dateizugriff nicht frei.",
64
+ "errorUnknownMethod": "Diese Paketversion stellt diese Methode nicht bereit.",
65
+ "errorNativeProof": "Der erforderliche native Identitäts- oder Berechtigungsnachweis fehlt. Der NAS-Zugriff bleibt gesperrt.",
66
+ "errorSession": "Ihre DSM-Sitzung ist abgelaufen. Melden Sie sich erneut für die App-Sitzung an; der NAS-Dateizugriff bleibt nicht verfügbar.",
67
+ "errorAuthentication": "Die DSM-Authentifizierung ist nicht verfügbar. Aktualisieren Sie den App-Status später.",
68
+ "errorUnsupported": "NAS-Dateioperationen sind in diesem Build nicht verfügbar.",
69
+ "healthPending": "Vorübergehende erneute Prüfung",
70
+ "healthPendingHelp": "Die Integration wird vorübergehend erneut geprüft. Warten Sie und aktualisieren Sie anschließend. Neuer Zugriff ist erst nach Abschluss der Prüfung möglich.",
71
+ "relaxedRisk": "Bei gelockerter Identität können mit derselben UID und demselben username neu erstellte Konten bestehende Freigaben übernehmen.",
72
+ "relaxedReauthorize": "Ändert sich die UID oder der username, werden alle Ihre Freigaben ungültig und müssen erneut genehmigt werden.",
73
+ "relaxedPermissions": "Dateioperationen verwenden Ihre UID und Gruppen und bleiben auf NAS-Berechtigungen und genehmigte Ordner beschränkt. Deaktivierte Konten oder entzogene App-Berechtigungen führen zur Zugriffsverweigerung."
74
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "title": "NAS folder access",
3
+ "mock": "Mock preview — no NAS files or permissions are changed.",
4
+ "personal": "My folders",
5
+ "shared": "App shared folders",
6
+ "choosePersonal": "Choose my folder",
7
+ "chooseShared": "Choose shared folder",
8
+ "refresh": "Refresh access",
9
+ "emptyGrant": "No folders authorized. Choose a folder to preview read-only access.",
10
+ "pickerTitle": "Choose a NAS folder",
11
+ "pickerHelp": "Browse folders, select one, then review read-only access.",
12
+ "roots": "Folders",
13
+ "back": "Back",
14
+ "open": "Open {name}",
15
+ "select": "Select {name}",
16
+ "selected": "Selected: {name}",
17
+ "review": "Review access",
18
+ "cancel": "Cancel",
19
+ "confirm": "Confirm access",
20
+ "summaryTitle": "Review folder access",
21
+ "app": "App",
22
+ "scope": "Scope",
23
+ "folder": "Folder",
24
+ "actions": "Allowed actions",
25
+ "readOnly": "List folders, inspect metadata and read files",
26
+ "persistent": "Persistent access — until you revoke it or its binding becomes invalid.",
27
+ "revokeHow": "Revoke individual folders here. Reauthorization creates a new grant.",
28
+ "expires": "Confirm within 30 seconds.",
29
+ "loading": "Loading folders…",
30
+ "emptyFolder": "This folder is empty",
31
+ "loadMore": "Load more",
32
+ "state": "Access state",
33
+ "active": "Active",
34
+ "suspended": "Suspended — select again to authorize",
35
+ "revoked": "Revoked",
36
+ "draining": "Revoked; stopping transfers",
37
+ "cleanup": "Revoked; cleanup needs verification",
38
+ "createdAt": "Created",
39
+ "revoke": "Revoke",
40
+ "revokeTitle": "Revoke folder access?",
41
+ "revokeWarning": "Stop new access and in-progress transfers. Data already sent or written will not be restored.",
42
+ "confirmRevoke": "Confirm revoke",
43
+ "noticeCreated": "Folder access added.",
44
+ "errorTitle": "Folder access could not be updated",
45
+ "errorDenied": "Access denied. Choose a folder visible to your current account.",
46
+ "errorExpired": "The selection or confirmation expired. Cancel and choose the folder again.",
47
+ "errorStale": "Your session or selection changed. Cancel and choose the folder again.",
48
+ "errorUnavailable": "Folder service is unavailable. Ask an administrator to check integration and home services.",
49
+ "errorBusy": "The request limit was reached. Wait, then retry.",
50
+ "errorCanceled": "The request was canceled. Choose the folder again when ready.",
51
+ "errorInternal": "The request failed. Refresh access before trying again.",
52
+ "retry": "Retry",
53
+ "close": "Close",
54
+ "selection": "Select folder",
55
+ "actionList": "List folders",
56
+ "actionStat": "Inspect metadata",
57
+ "actionRead": "Read files",
58
+ "pilotOff": "Managed account pilot: off",
59
+ "pilotRestrictions": "Administrator approval and a verified account-maintenance process are required. Account changes or unverified identity revoke access and require a new sign-in and approval. Enabling this pilot is unavailable in this build.",
60
+ "unavailableTitle": "Not available yet",
61
+ "unavailableMessage": "NAS folder grants and file operations are not available yet. Required native identity and permission proof cannot currently be verified.",
62
+ "pilotUnavailable": "Managed account pilot B is experimental and cannot be enabled.",
63
+ "noUnlock": "Enabling integration or signing in again does not unlock NAS file access.",
64
+ "errorUnknownMethod": "This method is not provided by this package version.",
65
+ "errorNativeProof": "Required native identity or permission proof is unavailable. NAS access remains closed.",
66
+ "errorSession": "Your DSM session expired. Sign in to restore the app session; NAS file access remains unavailable.",
67
+ "errorAuthentication": "DSM authentication is unavailable. Refresh the app status later.",
68
+ "errorUnsupported": "NAS file operations are not available in this build.",
69
+ "healthPending": "Temporarily revalidating",
70
+ "healthPendingHelp": "Integration is temporarily revalidating. Wait, then refresh. New access is unavailable until verification completes.",
71
+ "relaxedRisk": "When relaxed identity is selected, accounts recreated with the same UID and username may retain grants.",
72
+ "relaxedReauthorize": "A UID or username change invalidates all your grants and requires new authorization.",
73
+ "relaxedPermissions": "File operations use your UID and groups, within NAS permissions and authorized folders. Disabled accounts or revoked app access are denied."
74
+ }